From 376c482da16ba6fae3a468d3bfc118c6ca8a2f7b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 10 Sep 2025 00:24:06 -0400 Subject: [PATCH 01/93] Move APC content into a power subfolder --- code/modules/power/{apc.dm => apc/_apc.dm} | 110 +++++------------- .../items => modules/power/apc}/apc_frame.dm | 6 +- code/modules/power/apc/apc_presets.dm | 47 ++++++++ .../apc.dm => modules/power/apc/apc_wires.dm} | 39 +++---- nebula.dme | 7 +- 5 files changed, 97 insertions(+), 112 deletions(-) rename code/modules/power/{apc.dm => apc/_apc.dm} (92%) rename code/{game/objects/items => modules/power/apc}/apc_frame.dm (74%) create mode 100644 code/modules/power/apc/apc_presets.dm rename code/{datums/wires/apc.dm => modules/power/apc/apc_wires.dm} (84%) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc/_apc.dm similarity index 92% rename from code/modules/power/apc.dm rename to code/modules/power/apc/_apc.dm index 0df866c15b71..4d59d0f23f74 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc/_apc.dm @@ -7,82 +7,8 @@ var/global/list/all_apcs = list() // Generates a terminal based on the direction of the APC on spawn // There are three different power channels, lighting, equipment, and environment -// Each may have one of the following states - // Power channels set to Auto change when power levels rise or drop below a threshold -// Power channel defines have been shifted to power.dm in __defines. 2/25/2021 - -#define AUTO_THRESHOLD_LIGHTING 50 -#define AUTO_THRESHOLD_EQUIPMENT 25 -// The ENVIRON channel stays on as long as possible, and doesn't have a threshold - -#define CRITICAL_APC_EMP_PROTECTION 10 // EMP effect duration is divided by this number if the APC has "critical" flag -#define APC_UPDATE_ICON_COOLDOWN 100 // Time between automatically updating the icon (10 seconds) - -// Used to check whether or not to update the icon_state -#define UPDATE_CELL_IN 1 -#define UPDATE_OPENED1 2 -#define UPDATE_OPENED2 4 -#define UPDATE_MAINT 8 -#define UPDATE_BROKE 16 -#define UPDATE_BLUESCREEN 32 -#define UPDATE_WIREEXP 64 -#define UPDATE_ALLGOOD 128 - -// Used to check whether or not to update the overlay -#define APC_UPOVERLAY_CHARGEING0 1 -#define APC_UPOVERLAY_CHARGEING1 2 -#define APC_UPOVERLAY_CHARGEING2 4 -#define APC_UPOVERLAY_LOCKED 8 -#define APC_UPOVERLAY_OPERATING 16 - -// Various APC types -/obj/machinery/power/apc/inactive - lighting = 0 - equipment = 0 - environ = 0 - locked = FALSE - -/obj/machinery/power/apc/critical - is_critical = 1 - -/obj/machinery/power/apc/high - uncreated_component_parts = list( - /obj/item/cell/high - ) - -/obj/machinery/power/apc/high/inactive - lighting = 0 - equipment = 0 - environ = 0 - locked = FALSE - -/obj/machinery/power/apc/super - uncreated_component_parts = list( - /obj/item/cell/super - ) - -/obj/machinery/power/apc/super/critical - is_critical = 1 -/obj/machinery/power/apc/hyper - uncreated_component_parts = list( - /obj/item/cell/hyper - ) - -/obj/machinery/power/apc/derelict - lighting = 0 - equipment = 0 - environ = 0 - locked = 0 - uncreated_component_parts = list( - /obj/item/cell/crap/empty - ) - -/obj/machinery/power/apc/derelict/full - uncreated_component_parts = list( - /obj/item/cell/crap - ) // Main APC code /obj/machinery/power/apc @@ -112,7 +38,7 @@ var/global/list/all_apcs = list() var/operating = 1 // Bool for main toggle. var/charging = 0 // Whether or not it's charging. 0 - not charging but not full, 1 - charging, 2 - full var/chargemode = 1 // Whether charging is toggled on or off. - var/aidisabled = 0 + var/aidisabled = FALSE var/lastused_light = 0 // Internal stuff for UI and bookkeeping; can read off values but don't modify. var/lastused_equip = 0 var/lastused_environ = 0 @@ -125,7 +51,22 @@ var/global/list/all_apcs = list() var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment var/longtermpower = 10 // Counter to smooth out power state changes; do not modify. wires = /datum/wires/apc + // Values used for update_state. + var/const/UPDATE_CELL_IN = BITFLAG(0) + var/const/UPDATE_OPENED1 = BITFLAG(1) + var/const/UPDATE_OPENED2 = BITFLAG(2) + var/const/UPDATE_MAINT = BITFLAG(3) + var/const/UPDATE_BROKE = BITFLAG(4) + var/const/UPDATE_BLUESCREEN = BITFLAG(5) + var/const/UPDATE_WIREEXP = BITFLAG(6) + var/const/UPDATE_ALLGOOD = BITFLAG(7) var/update_state = -1 + // Used to check whether or not to update the overlay + var/const/UPOVERLAY_CHARGEING0 = BITFLAG(0) + var/const/UPOVERLAY_CHARGEING1 = BITFLAG(1) + var/const/UPOVERLAY_CHARGEING2 = BITFLAG(2) + var/const/UPOVERLAY_LOCKED = BITFLAG(3) + var/const/UPOVERLAY_OPERATING = BITFLAG(4) var/update_overlay = -1 var/list/update_overlay_chan // Used to determine if there is a change in channels var/is_critical = 0 @@ -142,6 +83,12 @@ var/global/list/all_apcs = list() var/autoname = 1 var/cover_removed = FALSE // Cover is gone; can't close it anymore. var/locked = TRUE // This is the interface, not the hardware. + /// EMP effect duration is divided by this number if the APC has "critical" flag + var/const/CRITICAL_EMP_PROTECTION = 10 + // Thresholds for lights/equipment turning off based on cell charge level + var/const/AUTO_THRESHOLD_LIGHTING = 50 + var/const/AUTO_THRESHOLD_EQUIPMENT = 25 + // The ENVIRON channel stays on as long as possible, and doesn't have a threshold base_type = /obj/machinery/power/apc/buildable stat_immune = 0 @@ -382,18 +329,18 @@ var/global/list/all_apcs = list() update_state |= UPDATE_ALLGOOD if(operating) - update_overlay |= APC_UPOVERLAY_OPERATING + update_overlay |= UPOVERLAY_OPERATING if(update_state & UPDATE_ALLGOOD) if(locked) - update_overlay |= APC_UPOVERLAY_LOCKED + update_overlay |= UPOVERLAY_LOCKED if(!charging) - update_overlay |= APC_UPOVERLAY_CHARGEING0 + update_overlay |= UPOVERLAY_CHARGEING0 else if(charging == 1) - update_overlay |= APC_UPOVERLAY_CHARGEING1 + update_overlay |= UPOVERLAY_CHARGEING1 else if(charging == 2) - update_overlay |= APC_UPOVERLAY_CHARGEING2 + update_overlay |= UPOVERLAY_CHARGEING2 update_overlay_chan["Equipment"] = equipment @@ -862,7 +809,7 @@ var/global/list/all_apcs = list() if(is_critical) // Critical APCs are considered EMP shielded and will be offline only for about half minute. Prevents AIs being one-shot disabled by EMP strike. // Critical APCs are also more resilient to cell corruption/power drain. - energy_fail(rand(240, 360) / severity / CRITICAL_APC_EMP_PROTECTION) + energy_fail(rand(240, 360) / severity / CRITICAL_EMP_PROTECTION) else // Regular APCs fail for normal time. energy_fail(rand(240, 360) / severity) @@ -935,4 +882,3 @@ var/global/list/all_apcs = list() if(area && !(processing_flags & MACHINERY_PROCESS_SELF)) START_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF) -#undef APC_UPDATE_ICON_COOLDOWN diff --git a/code/game/objects/items/apc_frame.dm b/code/modules/power/apc/apc_frame.dm similarity index 74% rename from code/game/objects/items/apc_frame.dm rename to code/modules/power/apc/apc_frame.dm index 7275277cb13c..708f3dbadf3e 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/modules/power/apc/apc_frame.dm @@ -12,14 +12,14 @@ /obj/item/frame/apc/try_build(turf/on_wall) var/area/A = get_area(src) if (A.requires_power == 0 || istype(A, /area/space)) - to_chat(usr, "APC cannot be placed in this area.") + to_chat(usr, SPAN_WARNING("An APC cannot be placed in this area.")) return if (A.get_apc()) - to_chat(usr, "This area already has an APC.") + to_chat(usr, SPAN_WARNING("This area already has an APC.")) return //only one APC per area for(var/obj/machinery/power/terminal/T in loc) if (T.master) - to_chat(usr, "There is another network terminal here.") + to_chat(usr, SPAN_WARNING("There is another network terminal here.")) return return ..() diff --git a/code/modules/power/apc/apc_presets.dm b/code/modules/power/apc/apc_presets.dm new file mode 100644 index 000000000000..a9ef717b7bca --- /dev/null +++ b/code/modules/power/apc/apc_presets.dm @@ -0,0 +1,47 @@ +// Various APC types +/obj/machinery/power/apc/inactive + lighting = 0 + equipment = 0 + environ = 0 + locked = FALSE + +/obj/machinery/power/apc/critical + is_critical = 1 + +/obj/machinery/power/apc/high + uncreated_component_parts = list( + /obj/item/cell/high + ) + +/obj/machinery/power/apc/high/inactive + lighting = 0 + equipment = 0 + environ = 0 + locked = FALSE + +/obj/machinery/power/apc/super + uncreated_component_parts = list( + /obj/item/cell/super + ) + +/obj/machinery/power/apc/super/critical + is_critical = 1 + +/obj/machinery/power/apc/hyper + uncreated_component_parts = list( + /obj/item/cell/hyper + ) + +/obj/machinery/power/apc/derelict + lighting = 0 + equipment = 0 + environ = 0 + locked = 0 + uncreated_component_parts = list( + /obj/item/cell/crap/empty + ) + +/obj/machinery/power/apc/derelict/full + uncreated_component_parts = list( + /obj/item/cell/crap + ) \ No newline at end of file diff --git a/code/datums/wires/apc.dm b/code/modules/power/apc/apc_wires.dm similarity index 84% rename from code/datums/wires/apc.dm rename to code/modules/power/apc/apc_wires.dm index b7d1221c081d..25d655eb5300 100644 --- a/code/datums/wires/apc.dm +++ b/code/modules/power/apc/apc_wires.dm @@ -1,8 +1,3 @@ -#define APC_WIRE_IDSCAN 1 -#define APC_WIRE_MAIN_POWER1 2 -#define APC_WIRE_MAIN_POWER2 4 -#define APC_WIRE_AI_CONTROL 8 - /datum/wires/apc holder_type = /obj/machinery/power/apc wire_count = 4 @@ -12,18 +7,21 @@ new /datum/wire_description(APC_WIRE_MAIN_POWER2, "This wire seems to be carrying a heavy current."), new /datum/wire_description(APC_WIRE_AI_CONTROL, "This wire connects to automated control systems.") ) + var/const/APC_WIRE_IDSCAN = BITFLAG(0) + var/const/APC_WIRE_MAIN_POWER1 = BITFLAG(1) + var/const/APC_WIRE_MAIN_POWER2 = BITFLAG(2) + var/const/APC_WIRE_AI_CONTROL = BITFLAG(3) /datum/wires/apc/GetInteractWindow(mob/user) var/obj/machinery/power/apc/A = holder . += ..() . += text("
\n[(A.locked ? "The APC is locked." : "The APC is unlocked.")]
\n[(A.shorted ? "The APCs power has been shorted." : "The APC is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - /datum/wires/apc/CanUse(var/mob/living/L) var/obj/machinery/power/apc/A = holder if(istype(A.construct_state, /decl/machine_construction/wall_frame/panel_closed/hackable/hacking) && !(A.stat & BROKEN)) - return 1 - return 0 + return TRUE + return FALSE /datum/wires/apc/proc/reset_locked() var/obj/machinery/power/apc/A = holder @@ -38,7 +36,7 @@ /datum/wires/apc/proc/reset_ai_disabled() var/obj/machinery/power/apc/A = holder if(A && !IsIndexCut(APC_WIRE_AI_CONTROL)) - A.aidisabled = 0 + A.aidisabled = FALSE /datum/wires/apc/UpdatePulsed(var/index) @@ -47,17 +45,17 @@ switch(index) if(APC_WIRE_IDSCAN) - A.locked = 0 + A.locked = FALSE addtimer(CALLBACK(src, PROC_REF(reset_locked)), 30 SECONDS) if (APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2) - if(A.shorted == 0) - A.shorted = 1 + if(!A.shorted) + A.shorted = TRUE addtimer(CALLBACK(src, PROC_REF(reset_shorted)), 2 MINUTES) if (APC_WIRE_AI_CONTROL) - if (A.aidisabled == 0) - A.aidisabled = 1 + if (!A.aidisabled) + A.aidisabled = TRUE addtimer(CALLBACK(src, PROC_REF(reset_ai_disabled)), 1 SECOND) /datum/wires/apc/UpdateCut(var/index, var/mended) @@ -65,20 +63,13 @@ switch(index) if(APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2) - if(!mended) A.shock(usr, 50) - A.shorted = 1 + A.shorted = TRUE else if(!IsIndexCut(APC_WIRE_MAIN_POWER1) && !IsIndexCut(APC_WIRE_MAIN_POWER2)) - A.shorted = 0 + A.shorted = FALSE A.shock(usr, 50) if(APC_WIRE_AI_CONTROL) - - if(!mended) - if (A.aidisabled == 0) - A.aidisabled = 1 - else - if (A.aidisabled == 1) - A.aidisabled = 0 \ No newline at end of file + A.aidisabled = !mended \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index cfc424bd5655..2583aa940a34 100644 --- a/nebula.dme +++ b/nebula.dme @@ -729,7 +729,6 @@ #include "code\datums\vote\vote.dm" #include "code\datums\wires\airlock.dm" #include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" #include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\fabricator.dm" @@ -1070,7 +1069,6 @@ #include "code\game\objects\items\_item_melting.dm" #include "code\game\objects\items\_item_reagents.dm" #include "code\game\objects\items\_item_sharpness.dm" -#include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blackout.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" @@ -3403,7 +3401,6 @@ #include "code\modules\posture\posture_mob.dm" #include "code\modules\posture\posture_subtypes.dm" #include "code\modules\power\admin_setup_engine.dm" -#include "code\modules\power\apc.dm" #include "code\modules\power\batteryrack.dm" #include "code\modules\power\breaker_box.dm" #include "code\modules\power\cable.dm" @@ -3425,6 +3422,10 @@ #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" #include "code\modules\power\turbine.dm" +#include "code\modules\power\apc\_apc.dm" +#include "code\modules\power\apc\apc_frame.dm" +#include "code\modules\power\apc\apc_presets.dm" +#include "code\modules\power\apc\apc_wires.dm" #include "code\modules\power\fission\core.dm" #include "code\modules\power\fission\core_control.dm" #include "code\modules\power\fission\fission_circuits.dm" From 1756c5e3127b1cc21bc570a3adae88fad7234ac0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 9 Oct 2025 20:16:06 -0400 Subject: [PATCH 02/93] Make APCs not a subtype of /obj/machinery/power --- code/_helpers/unsorted.dm | 2 +- code/_onclick/ai.dm | 2 +- code/_onclick/cyborg.dm | 2 +- .../subsystems/initialization/codex_dump.dm | 2 +- code/game/area/areas.dm | 6 +- code/game/gamemodes/events/power_failure.dm | 4 +- .../machinery/_machines_base/machinery.dm | 2 +- code/game/objects/alien_props.dm | 4 +- code/game/objects/items/blackout.dm | 4 +- code/game/objects/items/circuitboards/wall.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../secrets/fun_secrets/break_all_lights.dm | 2 +- .../secrets/fun_secrets/break_some_lights.dm | 2 +- code/modules/admin/verbs/debug.dm | 2 +- code/modules/codex/entries/engineering.dm | 2 +- code/modules/events/apc_damage.dm | 8 +- code/modules/events/electrical_storm.dm | 4 +- code/modules/events/meteors.dm | 2 +- code/modules/events/prison_break.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 2 +- code/modules/mob/living/silicon/ai/power.dm | 4 +- .../living/silicon/robot/drone/drone_items.dm | 4 +- .../programs/engineering/power_monitor.dm | 4 +- code/modules/overmap/ftl_shunt/core.dm | 6 +- code/modules/power/apc/_apc.dm | 88 +++-- code/modules/power/apc/apc_frame.dm | 4 +- code/modules/power/apc/apc_presets.dm | 18 +- code/modules/power/apc/apc_wires.dm | 16 +- code/modules/power/cable.dm | 4 +- code/modules/power/power.dm | 4 +- code/modules/power/powernet.dm | 2 +- code/modules/power/sensors/powernet_sensor.dm | 4 +- code/modules/power/smes_construction.dm | 6 +- .../artifacts/effects/cellcharge.dm | 2 +- .../artifacts/effects/celldrain.dm | 2 +- code/unit_tests/del_the_world.dm | 2 +- code/unit_tests/power_tests.dm | 4 +- maps/away/bearcat/bearcat-1.dmm | 26 +- maps/away/bearcat/bearcat-2.dmm | 48 +-- maps/away/casino/casino.dmm | 36 +- maps/away/derelict/derelict-station.dmm | 8 +- maps/away/errant_pisces/errant_pisces.dmm | 50 +-- maps/away/liberia/liberia.dmm | 46 +-- maps/away/liberia/liberia_machinery.dm | 2 +- .../lost_supply_base/lost_supply_base.dmm | 10 +- maps/away/magshield/magshield.dmm | 12 +- maps/away/mining/mining-signal.dmm | 2 +- maps/away/smugglers/smugglers.dmm | 6 +- maps/away/unishi/unishi-1.dmm | 4 +- maps/away/unishi/unishi-2.dmm | 20 +- maps/away/unishi/unishi-3.dmm | 10 +- maps/away/yacht/yacht.dmm | 6 +- maps/example/example-1.dmm | 2 +- maps/example/example-2.dmm | 2 +- maps/example/example-3.dmm | 2 +- maps/exodus/exodus-1.dmm | 20 +- maps/exodus/exodus-2.dmm | 328 +++++++++--------- maps/ministation/ministation-0.dmm | 38 +- maps/ministation/ministation-1.dmm | 26 +- maps/ministation/ministation-2.dmm | 30 +- maps/ministation/ministation-3.dmm | 2 +- .../crashed_pod/crashed_pod.dmm | 2 +- .../exoplanet_ruins/hydrobase/hydrobase.dmm | 24 +- .../exoplanet_ruins/playablecolony/colony.dmm | 32 +- maps/tradeship/tradeship-0.dmm | 14 +- maps/tradeship/tradeship-1.dmm | 26 +- maps/tradeship/tradeship-2.dmm | 56 +-- maps/tradeship/tradeship-3.dmm | 8 +- .../away_sites/lar_maria/lar_maria-1.dmm | 16 +- .../away_sites/lar_maria/lar_maria-2.dmm | 18 +- .../generic_shuttles/tanker/tanker.dmm | 2 +- .../ruins/ec_old_crash/ec_old_crash.dmm | 8 +- .../supermatter/endgame_cascade/universe.dm | 2 +- .../supermatter/machinery/supermatter.dm | 2 +- .../mercenary/maps/mercenary_base.dmm | 6 +- mods/species/ascent/machines/ship_machines.dm | 2 +- tools/map_migrations/5151_power_apc.txt | 2 + 77 files changed, 591 insertions(+), 597 deletions(-) create mode 100644 tools/map_migrations/5151_power_apc.txt diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 1c81acd2e27f..6b3c62d1249e 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -715,7 +715,7 @@ Turf and target are seperate in case you want to teleport some distance from a t Checks if that loc and dir has a item on the wall */ var/global/list/WALLITEMS = list( - /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/radio/intercom, + /obj/machinery/apc, /obj/machinery/alarm, /obj/item/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, /obj/machinery/status_display, /obj/machinery/network/requests_console, /obj/machinery/light_switch, /obj/structure/sign, /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 36fc54d2f3fc..b0ab2d79e09a 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -158,7 +158,7 @@ Topic(src, list("command"="bolts", "activate" = "1")) return TRUE -/obj/machinery/power/apc/AICtrlClick(mob/living/silicon/user) // turns off/on APCs. +/obj/machinery/apc/AICtrlClick(mob/living/silicon/user) // turns off/on APCs. if(user.incapacitated()) return FALSE Topic(src, list("breaker"="1")) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index ee1eba20b7cf..b9100b54ba30 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -121,7 +121,7 @@ /obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. return AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. +/obj/machinery/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. return AICtrlClick(user) /obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. diff --git a/code/controllers/subsystems/initialization/codex_dump.dm b/code/controllers/subsystems/initialization/codex_dump.dm index b12dd686d78b..ee93934ea510 100644 --- a/code/controllers/subsystems/initialization/codex_dump.dm +++ b/code/controllers/subsystems/initialization/codex_dump.dm @@ -129,7 +129,7 @@ TODO: work out how to implement an external search function. // Copied from del_the_world UT exceptions list. var/static/list/skip_types = typesof( /obj/item/organ/external/chest, - /obj/machinery/power/apc, + /obj/machinery/apc, /obj/machinery/alarm, /obj/structure/stairs ) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index dcc3343b8874..838532499857 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -46,7 +46,7 @@ var/global/list/areas = list() var/has_gravity = TRUE var/air_doors_activated = FALSE - var/obj/machinery/power/apc/apc + var/obj/machinery/apc/apc var/list/all_doors //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area var/list/ambience = list( 'sound/ambience/ambigen1.ogg', @@ -459,9 +459,9 @@ var/global/list/mob/living/forced_ambiance_list = new M.throw_at(T, maxrange, speed) /area/proc/prison_break() - var/obj/machinery/power/apc/theAPC = get_apc() + var/obj/machinery/apc/theAPC = get_apc() if(theAPC && theAPC.operating) - for(var/obj/machinery/power/apc/temp_apc in src) + for(var/obj/machinery/apc/temp_apc in src) temp_apc.overload_lighting(70) for(var/obj/machinery/door/airlock/temp_airlock in src) temp_airlock.prison_open() diff --git a/code/game/gamemodes/events/power_failure.dm b/code/game/gamemodes/events/power_failure.dm index 49789e11e9af..0d9165d972fa 100644 --- a/code/game/gamemodes/events/power_failure.dm +++ b/code/game/gamemodes/events/power_failure.dm @@ -7,14 +7,14 @@ S.energy_fail(rand(15 * severity,30 * severity)) - for(var/obj/machinery/power/apc/C in SSmachines.machinery) + for(var/obj/machinery/apc/C in SSmachines.machinery) if(!C.is_critical && (!affected_z_levels || (C.z in affected_z_levels))) C.energy_fail(rand(30 * severity,60 * severity)) /proc/power_restore(var/announce = 1) if(announce) global.using_map.grid_restored_announcement() - for(var/obj/machinery/power/apc/C in SSmachines.machinery) + for(var/obj/machinery/apc/C in SSmachines.machinery) C.failure_timer = 0 var/obj/item/cell/cell = C.get_cell() if(cell) diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 5f03a9d4ba72..0a6de242520c 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -379,7 +379,7 @@ Class Procs: if(electrocute_mob(user, get_area(src), src, 0.7)) var/area/temp_area = get_area(src) if(temp_area) - var/obj/machinery/power/apc/temp_apc = temp_area.get_apc() + var/obj/machinery/apc/temp_apc = temp_area.get_apc() var/obj/machinery/power/terminal/terminal = temp_apc && temp_apc.terminal() if(terminal && terminal.powernet) diff --git a/code/game/objects/alien_props.dm b/code/game/objects/alien_props.dm index 6297ef140f0b..5268d3e3a383 100644 --- a/code/game/objects/alien_props.dm +++ b/code/game/objects/alien_props.dm @@ -19,7 +19,7 @@ // APC #define APC_UPDATE_ALLGOOD 128 -/obj/machinery/power/apc/alien +/obj/machinery/apc/alien name = "alien device" desc = "It's affixed to the floor, with a thick wire going into it." icon = 'icons/obj/xenoarchaeology.dmi' @@ -30,7 +30,7 @@ /obj/item/cell/alien ) -/obj/machinery/power/apc/alien/on_update_icon() +/obj/machinery/apc/alien/on_update_icon() check_updates() if(update_state & APC_UPDATE_ALLGOOD) icon_state = "ano11" diff --git a/code/game/objects/items/blackout.dm b/code/game/objects/items/blackout.dm index 4bc3d51b6f41..68df55bfa2a9 100644 --- a/code/game/objects/items/blackout.dm +++ b/code/game/objects/items/blackout.dm @@ -74,8 +74,8 @@ var/datum/powernet/powernet = terminal_in.powernet for(var/obj/machinery/power/terminal/terminal_out in powernet.nodes) - if(istype(terminal_out.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = terminal_out.master + if(istype(terminal_out.master, /obj/machinery/apc)) + var/obj/machinery/apc/A = terminal_out.master A.energy_fail(rand(30 * severity, 60 * severity)) if(istype(terminal_out.master, /obj/machinery/power/smes/buildable)) var/obj/machinery/power/smes/buildable/S = terminal_out.master diff --git a/code/game/objects/items/circuitboards/wall.dm b/code/game/objects/items/circuitboards/wall.dm index fe150c173d20..fe1e20a8cfcd 100644 --- a/code/game/objects/items/circuitboards/wall.dm +++ b/code/game/objects/items/circuitboards/wall.dm @@ -29,7 +29,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) w_class = ITEM_SIZE_SMALL obj_flags = OBJ_FLAG_CONDUCTIBLE - build_path = /obj/machinery/power/apc/buildable + build_path = /obj/machinery/apc/buildable board_type = "wall" origin_tech = @'{"programming":1,"engineering":1}' req_components = list() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 104617710a6e..9af027725ba4 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -139,7 +139,7 @@ // Enough power drained this tick, no need to torture more APCs if(drained >= drain_rate) break - var/obj/machinery/power/apc/A = T.master_machine() + var/obj/machinery/apc/A = T.master_machine() if(istype(A)) drained += A.drain_power(amount = drain_rate) power_drained += drained diff --git a/code/modules/admin/secrets/fun_secrets/break_all_lights.dm b/code/modules/admin/secrets/fun_secrets/break_all_lights.dm index 114a6ae96dff..51a5131e92d7 100644 --- a/code/modules/admin/secrets/fun_secrets/break_all_lights.dm +++ b/code/modules/admin/secrets/fun_secrets/break_all_lights.dm @@ -4,6 +4,6 @@ /datum/admin_secret_item/fun_secret/break_all_lights/execute(var/mob/user) . = ..() if(.) - for(var/obj/machinery/power/apc/apc in SSmachines.machinery) + for(var/obj/machinery/apc/apc in SSmachines.machinery) apc.overload_lighting() CHECK_TICK diff --git a/code/modules/admin/secrets/fun_secrets/break_some_lights.dm b/code/modules/admin/secrets/fun_secrets/break_some_lights.dm index f3784b1c16d2..bfa45de4cb5d 100644 --- a/code/modules/admin/secrets/fun_secrets/break_some_lights.dm +++ b/code/modules/admin/secrets/fun_secrets/break_some_lights.dm @@ -23,6 +23,6 @@ return for(var/obj/abstract/landmark/epicentre in epicentreList) - for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange)) + for(var/obj/machinery/apc/apc in range(epicentre,lightsoutRange)) apc.overload_lighting() CHECK_TICK diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c22ef2c4ab04..22e04658b19a 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -188,7 +188,7 @@ if(!(A.type in areas_all)) areas_all.Add(A.type) - for(var/obj/machinery/power/apc/APC in SSmachines.machinery) + for(var/obj/machinery/apc/APC in SSmachines.machinery) var/area/A = get_area(APC) if(!(A.type in areas_with_APC)) areas_with_APC.Add(A.type) diff --git a/code/modules/codex/entries/engineering.dm b/code/modules/codex/entries/engineering.dm index f5e9ac99fa3d..c635697b7af4 100644 --- a/code/modules/codex/entries/engineering.dm +++ b/code/modules/codex/entries/engineering.dm @@ -1,5 +1,5 @@ /datum/codex_entry/apc - associated_paths = list(/obj/machinery/power/apc) + associated_paths = list(/obj/machinery/apc) mechanics_text = "An APC (Area Power Controller) regulates and supplies backup power for the area they are in. Their power channels are divided \ out into 'environmental' (items that manipulate airflow and temperature), 'lighting' (the lights), and 'equipment' (everything else that consumes power). \ Power consumption and backup power cell charge can be seen from the interface, further controls (turning a specific channel on, off or automatic, \ diff --git a/code/modules/events/apc_damage.dm b/code/modules/events/apc_damage.dm index 4855cc37b22d..137847f0313c 100644 --- a/code/modules/events/apc_damage.dm +++ b/code/modules/events/apc_damage.dm @@ -2,7 +2,7 @@ var/apcSelectionRange = 25 /datum/event/apc_damage/start() - var/obj/machinery/power/apc/A = acquire_random_apc() + var/obj/machinery/apc/A = acquire_random_apc() var/severity_range = 0 switch(severity) @@ -13,7 +13,7 @@ if(EVENT_LEVEL_MAJOR) severity_range = 15 - for(var/obj/machinery/power/apc/apc in range(severity_range,A)) + for(var/obj/machinery/apc/apc in range(severity_range,A)) if(is_valid_apc(apc)) apc.emagged = 1 apc.update_icon() @@ -30,7 +30,7 @@ return var/epicentre = pick(possibleEpicentres) - for(var/obj/machinery/power/apc/apc in range(epicentre,apcSelectionRange)) + for(var/obj/machinery/apc/apc in range(epicentre,apcSelectionRange)) if(is_valid_apc(apc)) apcs += apc // Greatly increase the chance for APCs in maintenance areas to be selected @@ -44,6 +44,6 @@ return pick(apcs) -/datum/event/apc_damage/proc/is_valid_apc(var/obj/machinery/power/apc/apc) +/datum/event/apc_damage/proc/is_valid_apc(var/obj/machinery/apc/apc) var/turf/T = get_turf(apc) return !apc.is_critical && !apc.emagged && T && isPlayerLevel(T.z) diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index ebeef2b276ac..5400a5e174cf 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -83,7 +83,7 @@ shielded = TRUE valid_apcs = list() - for(var/obj/machinery/power/apc/A as anything in global.all_apcs) + for(var/obj/machinery/apc/A as anything in global.all_apcs) if(!A.is_critical && (A.z in affecting_z)) valid_apcs.Add(A) @@ -94,7 +94,7 @@ for(var/i=0, i< severity*2, i++) // up to 2/4/6 APCs per tick depending on severity picked_apcs |= pick(valid_apcs) - for(var/obj/machinery/power/apc/T as anything in picked_apcs) + for(var/obj/machinery/apc/T as anything in picked_apcs) // Main breaker is turned off. Consider this APC protected. if(!T.operating || T.failure_timer) continue diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 5a4d60f7f628..03616164955f 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -422,7 +422,7 @@ var/global/list/meteors_major = list( /obj/effect/meteor/destroyer/meteor_effect() ..() explosion(src.loc, 1, 2, 3, 4, 0) - for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) + for(var/obj/machinery/apc/A in range(rand(12, 20), src)) A.energy_fail(round(10 * rand(8, 12))) /obj/effect/meteor/destroyer/get_shield_damage() diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index da7666b68cee..2d7d84aa6b7f 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -58,7 +58,7 @@ /datum/event/prison_break/tick() if(activeFor == releaseWhen && length(areas)) - var/obj/machinery/power/apc/theAPC = null + var/obj/machinery/apc/theAPC = null for(var/area/A in areas) theAPC = A.get_apc() if(theAPC && theAPC.operating) //If the apc's off, it's a little hard to overload the lights. diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b487dfc897c4..e72e3798f8cc 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -82,7 +82,7 @@ var/global/list/ai_verbs_default = list( //NEWMALF VARIABLES var/malfunctioning = 0 // Master var that determines if AI is malfunctioning. - var/obj/machinery/power/apc/hack = null // APC that is currently being hacked. + var/obj/machinery/apc/hack = null // APC that is currently being hacked. var/list/hacked_apcs = null // List of all hacked APCs var/uncardable = 0 // Whether the AI can be carded when malfunctioning. var/hacked_apcs_hidden = 0 // Whether the hacked APCs belonging to this AI are hidden, reduces CPU generation from APCs. diff --git a/code/modules/mob/living/silicon/ai/power.dm b/code/modules/mob/living/silicon/ai/power.dm index 1785b37ecb5c..72c7e11cdff6 100644 --- a/code/modules/mob/living/silicon/ai/power.dm +++ b/code/modules/mob/living/silicon/ai/power.dm @@ -8,7 +8,7 @@ return to_chat(src, "Main power lost. System switched to internal capacitor. Beginning diagnostics.") - var/obj/machinery/power/apc/theAPC = null + var/obj/machinery/apc/theAPC = null var/connection_failures = 0 while(aiRestorePowerRoutine) // If the routine is running, proceed to another step. @@ -98,7 +98,7 @@ return 0 // Resets passed APC so the AI may function again. -/mob/living/silicon/ai/proc/reset_apc(var/obj/machinery/power/apc/A) +/mob/living/silicon/ai/proc/reset_apc(var/obj/machinery/apc/A) if(!istype(A)) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index b56da846f44a..969dd3dac640 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -223,8 +223,8 @@ else to_chat(user, "Your gripper cannot hold \the [target].") - else if(istype(target,/obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = target + else if(istype(target,/obj/machinery/apc)) + var/obj/machinery/apc/A = target if(A.components_are_accessible(/obj/item/stock_parts/power/battery)) var/obj/item/stock_parts/power/battery/bat = A.get_component_of_type(/obj/item/stock_parts/power/battery) var/obj/item/cell/cell = bat.extract_cell(src) diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 3b5321fdf4ba..15cddd991fc8 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -121,7 +121,7 @@ . = 1 if(href_list["toggle_breaker"]) - var/obj/machinery/power/apc/A = locate(href_list["toggle_breaker"]) + var/obj/machinery/apc/A = locate(href_list["toggle_breaker"]) if(!CanInteract(user, state) || QDELETED(A)) return 0 @@ -129,7 +129,7 @@ A.toggle_breaker() if(href_list["toggle_powerchannel_equip"] || href_list["toggle_powerchannel_light"] || href_list["toggle_powerchannel_enviro"]) //I'm sure there's a better way to do this. - var/obj/machinery/power/apc/A + var/obj/machinery/apc/A var/powerchannel = 0 var/power_setting diff --git a/code/modules/overmap/ftl_shunt/core.dm b/code/modules/overmap/ftl_shunt/core.dm index ca95cf968b9b..a74d6a20a280 100644 --- a/code/modules/overmap/ftl_shunt/core.dm +++ b/code/modules/overmap/ftl_shunt/core.dm @@ -356,7 +356,7 @@ if(prob(35)) L.flicker() - for(var/obj/machinery/power/apc/A in SSmachines.machinery) + for(var/obj/machinery/apc/A in SSmachines.machinery) if(!(A.z in ftl_computer.linked.map_z)) continue switch(shunt_sev) @@ -402,7 +402,7 @@ explosion(get_turf(src),-1,-1,8,10) //Effect Two: blow the windows out. - for(var/obj/machinery/power/apc/A in SSmachines.machinery) //Effect Three: shut down power across the ship. + for(var/obj/machinery/apc/A in SSmachines.machinery) //Effect Three: shut down power across the ship. if(!(A.z in ftl_computer.linked.map_z)) continue A.energy_fail(rand(60,80)) @@ -410,7 +410,7 @@ if(SHUNT_SABOTAGE_CRITICAL) announcetxt = shunt_sabotage_text_critical - for(var/obj/machinery/power/apc/A in SSmachines.machinery) //Effect One: shut down power across the ship. + for(var/obj/machinery/apc/A in SSmachines.machinery) //Effect One: shut down power across the ship. if(!(A.z in ftl_computer.linked.map_z)) continue A.energy_fail(rand(100,120)) diff --git a/code/modules/power/apc/_apc.dm b/code/modules/power/apc/_apc.dm index 4d59d0f23f74..0339f9ce702d 100644 --- a/code/modules/power/apc/_apc.dm +++ b/code/modules/power/apc/_apc.dm @@ -11,7 +11,7 @@ var/global/list/all_apcs = list() // Main APC code -/obj/machinery/power/apc +/obj/machinery/apc name = "area power controller" desc = "A control terminal for the area electrical systems." @@ -46,7 +46,6 @@ var/global/list/all_apcs = list() var/lastused_total = 0 var/main_status = 0 // UI var for whether we are getting external power. 0 = no external power at all, 1 = some, but not enough, 2 = getting enough. var/mob/living/silicon/ai/hacker = null // Malfunction var. If set AI hacked the APC and has full control. - powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( var/autoflag= 0 // 0 = off, 1= eqp and lights off, 2 = eqp off, 3 = all on. var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment var/longtermpower = 10 // Counter to smooth out power state changes; do not modify. @@ -90,7 +89,7 @@ var/global/list/all_apcs = list() var/const/AUTO_THRESHOLD_EQUIPMENT = 25 // The ENVIRON channel stays on as long as possible, and doesn't have a threshold - base_type = /obj/machinery/power/apc/buildable + base_type = /obj/machinery/apc/buildable stat_immune = 0 frame_type = /obj/item/frame/apc construct_state = /decl/machine_construction/wall_frame/panel_closed/hackable @@ -99,17 +98,10 @@ var/global/list/all_apcs = list() ) stock_part_presets = list(/decl/stock_part_preset/terminal_setup) -/obj/machinery/power/apc/buildable +/obj/machinery/apc/buildable uncreated_component_parts = null -/obj/machinery/power/apc/connect_to_network() - //Override because the APC does not directly connect to the network; it goes through a terminal. - //The terminal is what the power computer looks for anyway. - var/obj/machinery/power/terminal/terminal = terminal() - if(terminal) - terminal.connect_to_network() - -/obj/machinery/power/apc/drain_power(var/drain_check, var/surge, var/amount = 0) +/obj/machinery/apc/drain_power(var/drain_check, var/surge, var/amount = 0) if(drain_check) return 1 @@ -123,7 +115,7 @@ var/global/list/all_apcs = list() return amount - use_power_oneoff(amount, LOCAL) -/obj/machinery/power/apc/Initialize(mapload, var/ndir, var/populate_parts = TRUE) +/obj/machinery/apc/Initialize(mapload, var/ndir, var/populate_parts = TRUE) global.all_apcs += src if(areastring) reset_area(null, get_area_by_name(strip_improper(areastring))) @@ -144,7 +136,7 @@ var/global/list/all_apcs = list() force_update_channels() power_change() -/obj/machinery/power/apc/Destroy() +/obj/machinery/apc/Destroy() if(area) reset_area(area, null) global.all_apcs -= src @@ -156,7 +148,7 @@ var/global/list/all_apcs = list() return ..() // Attempts to set the area and update all refs. Calling this outside of Initialize is experimental at best. -/obj/machinery/power/apc/proc/reset_area(area/old_area, area/new_area) +/obj/machinery/apc/proc/reset_area(area/old_area, area/new_area) if(new_area == old_area) return if(old_area && old_area == area) @@ -176,24 +168,24 @@ var/global/list/all_apcs = list() change_area_name(new_area, null, new_area.name) events_repository.register(/decl/observ/name_set, new_area, src, PROC_REF(change_area_name)) -/obj/machinery/power/apc/get_req_access() +/obj/machinery/apc/get_req_access() if(!locked) return list() return ..() -/obj/machinery/power/apc/proc/energy_fail(var/duration) +/obj/machinery/apc/proc/energy_fail(var/duration) if(emp_hardened) return if(!failure_timer && duration) playsound(src, 'sound/machines/apc_nopower.ogg', 75, 0) failure_timer = max(failure_timer, round(duration)) -/obj/machinery/power/apc/proc/terminal(var/functional_only) +/obj/machinery/apc/proc/terminal(var/functional_only) var/obj/item/stock_parts/power/terminal/term = get_component_of_type(/obj/item/stock_parts/power/terminal) if(term && (!functional_only || term.is_functional())) return term.terminal -/obj/machinery/power/apc/get_examine_strings(mob/user, distance, infix, suffix) +/obj/machinery/apc/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(stat & BROKEN) @@ -209,7 +201,7 @@ var/global/list/all_apcs = list() // update the APC icon to show the three base states // also add overlays for indicator lights -/obj/machinery/power/apc/on_update_icon() +/obj/machinery/apc/on_update_icon() if (!status_overlays) status_overlays = 1 status_overlays_lock = new @@ -302,7 +294,7 @@ var/global/list/all_apcs = list() else set_light(0) -/obj/machinery/power/apc/proc/check_updates() +/obj/machinery/apc/proc/check_updates() if(!update_overlay_chan) update_overlay_chan = new/list() var/last_update_state = update_state @@ -357,13 +349,13 @@ var/global/list/all_apcs = list() results += 2 return results -/obj/machinery/power/apc/set_broken(new_state, cause) +/obj/machinery/apc/set_broken(new_state, cause) . = ..() if(. && (stat & BROKEN)) operating = 0 update() -/obj/machinery/power/apc/cannot_transition_to(state_path, mob/user) +/obj/machinery/apc/cannot_transition_to(state_path, mob/user) if(ispath(state_path, /decl/machine_construction/wall_frame/panel_open)) for(var/obj/item/stock_parts/access_lock/lock in get_all_components_of_type(/obj/item/stock_parts/access_lock)) if(lock.locked) @@ -372,7 +364,7 @@ var/global/list/all_apcs = list() return SPAN_WARNING("You cannot close the cover: it was completely removed!") . = ..() -/obj/machinery/power/apc/proc/force_open_panel(mob/user) +/obj/machinery/apc/proc/force_open_panel(mob/user) var/decl/machine_construction/wall_frame/panel_closed/closed_state = construct_state if(!istype(closed_state)) return MCS_CONTINUE @@ -385,13 +377,13 @@ var/global/list/all_apcs = list() panel_open = TRUE queue_icon_update() -/obj/machinery/power/apc/attackby(obj/item/used_item, mob/user) +/obj/machinery/apc/attackby(obj/item/used_item, mob/user) if (istype(construct_state, /decl/machine_construction/wall_frame/panel_closed/hackable/hacking) && (IS_MULTITOOL(used_item) || IS_WIRECUTTER(used_item) || istype(used_item, /obj/item/assembly/signaler))) wires.Interact(user) return TRUE return ..() -/obj/machinery/power/apc/bash(obj/item/used_item, mob/user) +/obj/machinery/apc/bash(obj/item/used_item, mob/user) if (!(user.check_intent(I_FLAG_HARM)) || (used_item.item_flags & ITEM_FLAG_NO_BLUDGEON)) return FALSE @@ -412,7 +404,7 @@ var/global/list/all_apcs = list() // attack with hand - remove cell (if cover open) or interact with the APC -/obj/machinery/power/apc/emag_act(var/remaining_charges, var/mob/user) +/obj/machinery/apc/emag_act(var/remaining_charges, var/mob/user) if (!(emagged || (hacker && !hacker.hacked_apcs_hidden))) // trying to unlock with an emag card if(panel_open) to_chat(user, "You must close the cover to swipe an ID card.") @@ -433,10 +425,10 @@ var/global/list/all_apcs = list() to_chat(user, "You fail to [ locked ? "unlock" : "lock"] the APC interface.") return 1 -/obj/machinery/power/apc/CanUseTopicPhysical(var/mob/user) +/obj/machinery/apc/CanUseTopicPhysical(var/mob/user) return global.physical_topic_state.can_use_topic(nano_host(), user) -/obj/machinery/power/apc/physical_attack_hand(mob/user) +/obj/machinery/apc/physical_attack_hand(mob/user) //Human mob special interaction goes here. if(user.can_shred()) user.visible_message( @@ -454,11 +446,11 @@ var/global/list/all_apcs = list() return TRUE return FALSE -/obj/machinery/power/apc/interface_interact(mob/user) +/obj/machinery/apc/interface_interact(mob/user) ui_interact(user) return TRUE -/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!user) return var/obj/item/cell/cell = get_cell() @@ -533,7 +525,7 @@ var/global/list/all_apcs = list() // auto update every Master Controller tick ui.set_auto_update(1) -/obj/machinery/power/apc/proc/update() +/obj/machinery/apc/proc/update() var/old_power_light = area.power_light var/old_power_environ = area.power_environ var/old_power_equip = area.power_equip @@ -563,7 +555,7 @@ var/global/list/all_apcs = list() else if(cell?.charge > 0) powered_down = FALSE -/obj/machinery/power/apc/CanUseTopic(mob/user, datum/topic_state/state) +/obj/machinery/apc/CanUseTopic(mob/user, datum/topic_state/state) if(user.current_posture.prone) to_chat(user, "You must stand to use [src]!") return STATUS_CLOSE @@ -584,7 +576,7 @@ var/global/list/all_apcs = list() to_chat(user, "You must have free hands to use [src].") . = min(., STATUS_UPDATE) -/obj/machinery/power/apc/OnTopic(mob/user, list/href_list, state) +/obj/machinery/apc/OnTopic(mob/user, list/href_list, state) if(href_list["reboot"] ) failure_timer = 0 update_icon() @@ -651,17 +643,17 @@ var/global/list/all_apcs = list() remote_control = !remote_control return TOPIC_REFRESH -/obj/machinery/power/apc/proc/force_update_channels() +/obj/machinery/apc/proc/force_update_channels() autoflag = -1 // This clears state, forcing a full recalculation update_channels(TRUE) update() queue_icon_update() -/obj/machinery/power/apc/proc/toggle_breaker() +/obj/machinery/apc/proc/toggle_breaker() operating = !operating force_update_channels() -/obj/machinery/power/apc/get_power_usage() +/obj/machinery/apc/get_power_usage() if(autoflag) return lastused_total // If not, we need to do something more sophisticated: compute how much power we would need in order to come back online. . = 0 @@ -674,7 +666,7 @@ var/global/list/all_apcs = list() if(autoset(environ, 1) >= POWERCHAN_ON) . += area.usage(ENVIRON) -/obj/machinery/power/apc/Process() +/obj/machinery/apc/Process() if(!area?.requires_power) return PROCESS_KILL @@ -737,7 +729,7 @@ var/global/list/all_apcs = list() else if (last_ch != charging) queue_icon_update() -/obj/machinery/power/apc/proc/update_channels(suppress_alarms = FALSE) +/obj/machinery/apc/proc/update_channels(suppress_alarms = FALSE) // Allow the APC to operate as normal if the cell can charge if(charging && longtermpower < 10) longtermpower += 1 @@ -781,7 +773,7 @@ var/global/list/all_apcs = list() // val 0=off, 1=off(auto) 2=on 3=on(auto) // on 0=off, 1=on, 2=autooff // defines a state machine, returns the new state -/obj/machinery/power/apc/proc/autoset(var/cur_state, var/on) +/obj/machinery/apc/proc/autoset(var/cur_state, var/on) //autoset will never turn on a channel set to off switch(cur_state) if(POWERCHAN_OFF_TEMP) @@ -801,7 +793,7 @@ var/global/list/all_apcs = list() // damage and destruction acts -/obj/machinery/power/apc/emp_act(severity) +/obj/machinery/apc/emp_act(severity) if(emp_hardened) return // Fail for 8-12 minutes (divided by severity) @@ -816,7 +808,7 @@ var/global/list/all_apcs = list() queue_icon_update() ..() -/obj/machinery/power/apc/on_component_failure(obj/item/stock_parts/component) +/obj/machinery/apc/on_component_failure(obj/item/stock_parts/component) var/was_broken = stat & BROKEN . = ..() if(!was_broken && (stat & BROKEN)) @@ -826,20 +818,20 @@ var/global/list/all_apcs = list() operating = 0 update() -/obj/machinery/power/apc/proc/set_chargemode(new_mode) +/obj/machinery/apc/proc/set_chargemode(new_mode) chargemode = new_mode var/obj/item/stock_parts/power/battery/power = get_component_of_type(/obj/item/stock_parts/power/battery) if(power) power.can_charge = chargemode power.charge_wait_counter = initial(power.charge_wait_counter) -/obj/machinery/power/apc/proc/change_area_name(var/area/A, var/old_area_name, var/new_area_name) +/obj/machinery/apc/proc/change_area_name(var/area/A, var/old_area_name, var/new_area_name) if(A != area || !autoname) return SetName("[A.proper_name] APC") // overload the lights in this APC area -/obj/machinery/power/apc/proc/overload_lighting(var/chance = 100) +/obj/machinery/apc/proc/overload_lighting(var/chance = 100) if(/* !get_connection() || */ !operating || shorted) return var/amount = use_power_oneoff(20, LOCAL) @@ -851,7 +843,7 @@ var/global/list/all_apcs = list() L.broken() sleep(1) -/obj/machinery/power/apc/proc/setsubsystem(val) +/obj/machinery/apc/proc/setsubsystem(val) switch(val) if(2) return POWERCHAN_OFF_AUTO @@ -859,7 +851,7 @@ var/global/list/all_apcs = list() return POWERCHAN_OFF_TEMP else return POWERCHAN_OFF -/obj/machinery/power/apc/proc/set_channel_state_manual(var/channel, var/state) +/obj/machinery/apc/proc/set_channel_state_manual(var/channel, var/state) switch(channel) if(APC_POWERCHAN_EQUIPMENT) equipment = state @@ -869,7 +861,7 @@ var/global/list/all_apcs = list() environ = state force_update_channels() -/obj/machinery/power/apc/area_changed(area/old_area, area/new_area) +/obj/machinery/apc/area_changed(area/old_area, area/new_area) . = ..() if(QDELETED(src)) return diff --git a/code/modules/power/apc/apc_frame.dm b/code/modules/power/apc/apc_frame.dm index 708f3dbadf3e..897401051961 100644 --- a/code/modules/power/apc/apc_frame.dm +++ b/code/modules/power/apc/apc_frame.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/apc_repair.dmi' icon_state = "apc_frame" obj_flags = OBJ_FLAG_CONDUCTIBLE - build_machine_type = /obj/machinery/power/apc/buildable + build_machine_type = /obj/machinery/apc/buildable reverse = TRUE /obj/item/frame/apc/try_build(turf/on_wall) @@ -27,4 +27,4 @@ fully_construct = TRUE name = "APC kit" desc = "An all-in-one APC kit, comes preassembled." - build_machine_type = /obj/machinery/power/apc \ No newline at end of file + build_machine_type = /obj/machinery/apc \ No newline at end of file diff --git a/code/modules/power/apc/apc_presets.dm b/code/modules/power/apc/apc_presets.dm index a9ef717b7bca..62648417633b 100644 --- a/code/modules/power/apc/apc_presets.dm +++ b/code/modules/power/apc/apc_presets.dm @@ -1,38 +1,38 @@ // Various APC types -/obj/machinery/power/apc/inactive +/obj/machinery/apc/inactive lighting = 0 equipment = 0 environ = 0 locked = FALSE -/obj/machinery/power/apc/critical +/obj/machinery/apc/critical is_critical = 1 -/obj/machinery/power/apc/high +/obj/machinery/apc/high uncreated_component_parts = list( /obj/item/cell/high ) -/obj/machinery/power/apc/high/inactive +/obj/machinery/apc/high/inactive lighting = 0 equipment = 0 environ = 0 locked = FALSE -/obj/machinery/power/apc/super +/obj/machinery/apc/super uncreated_component_parts = list( /obj/item/cell/super ) -/obj/machinery/power/apc/super/critical +/obj/machinery/apc/super/critical is_critical = 1 -/obj/machinery/power/apc/hyper +/obj/machinery/apc/hyper uncreated_component_parts = list( /obj/item/cell/hyper ) -/obj/machinery/power/apc/derelict +/obj/machinery/apc/derelict lighting = 0 equipment = 0 environ = 0 @@ -41,7 +41,7 @@ /obj/item/cell/crap/empty ) -/obj/machinery/power/apc/derelict/full +/obj/machinery/apc/derelict/full uncreated_component_parts = list( /obj/item/cell/crap ) \ No newline at end of file diff --git a/code/modules/power/apc/apc_wires.dm b/code/modules/power/apc/apc_wires.dm index 25d655eb5300..6f6cb10deb75 100644 --- a/code/modules/power/apc/apc_wires.dm +++ b/code/modules/power/apc/apc_wires.dm @@ -1,5 +1,5 @@ /datum/wires/apc - holder_type = /obj/machinery/power/apc + holder_type = /obj/machinery/apc wire_count = 4 descriptions = list( new /datum/wire_description(APC_WIRE_IDSCAN, "This wire is connected to the ID scanning panel.", SKILL_EXPERT), @@ -13,34 +13,34 @@ var/const/APC_WIRE_AI_CONTROL = BITFLAG(3) /datum/wires/apc/GetInteractWindow(mob/user) - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder . += ..() . += text("
\n[(A.locked ? "The APC is locked." : "The APC is unlocked.")]
\n[(A.shorted ? "The APCs power has been shorted." : "The APC is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") /datum/wires/apc/CanUse(var/mob/living/L) - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder if(istype(A.construct_state, /decl/machine_construction/wall_frame/panel_closed/hackable/hacking) && !(A.stat & BROKEN)) return TRUE return FALSE /datum/wires/apc/proc/reset_locked() - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder if(A) A.locked = TRUE /datum/wires/apc/proc/reset_shorted() - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder if(A && !IsIndexCut(APC_WIRE_MAIN_POWER1) && !IsIndexCut(APC_WIRE_MAIN_POWER2)) A.shorted = FALSE /datum/wires/apc/proc/reset_ai_disabled() - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder if(A && !IsIndexCut(APC_WIRE_AI_CONTROL)) A.aidisabled = FALSE /datum/wires/apc/UpdatePulsed(var/index) - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder switch(index) @@ -59,7 +59,7 @@ addtimer(CALLBACK(src, PROC_REF(reset_ai_disabled)), 1 SECOND) /datum/wires/apc/UpdateCut(var/index, var/mended) - var/obj/machinery/power/apc/A = holder + var/obj/machinery/apc/A = holder switch(index) if(APC_WIRE_MAIN_POWER1, APC_WIRE_MAIN_POWER2) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 56ef6ac56bf9..587bbe766db4 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -375,8 +375,8 @@ var/global/list/obj/structure/cable/all_cables = list() else powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet - else if(istype(AM,/obj/machinery/power/apc)) - var/obj/machinery/power/apc/N = AM + else if(istype(AM,/obj/machinery/apc)) + var/obj/machinery/apc/N = AM var/obj/machinery/power/terminal/terminal = N.terminal() if(!terminal) continue // APC are connected through their terminal diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index a3560b8c8db9..4449a9dd44a6 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -202,8 +202,8 @@ PN = power_source else if(istype(power_source,/obj/item/cell)) cell = power_source - else if(istype(power_source,/obj/machinery/power/apc)) - var/obj/machinery/power/apc/apc = power_source + else if(istype(power_source,/obj/machinery/apc)) + var/obj/machinery/apc/apc = power_source cell = apc.get_cell() var/obj/machinery/power/terminal/term = apc.terminal() if (term) diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 74669d031c19..10a8d5488a99 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -103,7 +103,7 @@ if(nodes && nodes.len) // Added to fix a bad list bug -- TLE for(var/obj/machinery/power/terminal/term in nodes) - if( istype( term.master_machine(), /obj/machinery/power/apc ) ) + if( istype( term.master_machine(), /obj/machinery/apc ) ) numapc++ netexcess = avail - load diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm index 66e5cee66f83..19352222a15a 100644 --- a/code/modules/power/sensors/powernet_sensor.dm +++ b/code/modules/power/sensors/powernet_sensor.dm @@ -82,7 +82,7 @@ var/list/L = list() for(var/obj/machinery/power/terminal/term in powernet.nodes) - var/obj/machinery/power/apc/A = term.master_machine() + var/obj/machinery/apc/A = term.master_machine() if(istype(A)) L += A @@ -110,7 +110,7 @@ var/list/S = list("M-OFF", "DC-OFF","A-OFF","M-ON", "A-ON") var/list/chg = list("N","C","F") - for(var/obj/machinery/power/apc/A in L) + for(var/obj/machinery/apc/A in L) var/list/APC_entry = list() APC_entry["breaker"] = A.operating APC_entry["failure"] = A.failure_timer diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 4d8d462e7a95..cb78bef66777 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -257,9 +257,9 @@ /obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance, var/reboot_chance) if (!src.powernet) return - var/list/obj/machinery/power/apc/apcs = list() + var/list/obj/machinery/apc/apcs = list() for(var/obj/machinery/power/terminal/T in powernet.nodes) - var/obj/machinery/power/apc/A = T.master_machine() + var/obj/machinery/apc/A = T.master_machine() if(istype(A)) if (prob(overload_chance)) A.overload_lighting() @@ -270,7 +270,7 @@ if (apcs.len) var/overload_damage = charge/100/apcs.len - for (var/obj/machinery/power/apc/A in apcs) + for (var/obj/machinery/apc/A in apcs) A.take_damage(overload_damage, ELECTROCUTE) // Proc: update_icon() diff --git a/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm b/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm index 1ccf80abd710..c4bcfcd61a8f 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm @@ -26,7 +26,7 @@ /datum/artifact_effect/cellcharge/proc/charge_cells_in_range(amount) var/turf/T = get_turf(holder) - for (var/obj/machinery/power/apc/A in range(effect_range, T)) + for (var/obj/machinery/apc/A in range(effect_range, T)) var/obj/item/cell/cell = A.get_cell() if(cell) cell.give(amount) diff --git a/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm b/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm index 9d5a6b626ac0..899f3983cb3c 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm @@ -26,7 +26,7 @@ /datum/artifact_effect/celldrain/proc/drain_cells_in_range(amount) var/turf/T = get_turf(holder) - for (var/obj/machinery/power/apc/A in range(effect_range, T)) + for (var/obj/machinery/apc/A in range(effect_range, T)) var/obj/item/cell/cell = A.get_cell() if(cell) cell.use(amount) diff --git a/code/unit_tests/del_the_world.dm b/code/unit_tests/del_the_world.dm index 411ef21b8d33..58a54cc64f0c 100644 --- a/code/unit_tests/del_the_world.dm +++ b/code/unit_tests/del_the_world.dm @@ -9,7 +9,7 @@ var/list/ignore = typesof( // will error if the area already has one - /obj/machinery/power/apc, + /obj/machinery/apc, // throw assert failures around non-null alarm area on spawn /obj/machinery/alarm, // Needs a level above. diff --git a/code/unit_tests/power_tests.dm b/code/unit_tests/power_tests.dm index 16df5f3e9d90..9d3aa0a558ad 100644 --- a/code/unit_tests/power_tests.dm +++ b/code/unit_tests/power_tests.dm @@ -54,8 +54,8 @@ /datum/unit_test/areas_apc_uniqueness/start_test() var/failure = "" for(var/area/A in global.areas) - var/obj/machinery/power/apc/found_apc = null - for(var/obj/machinery/power/apc/APC in A) + var/obj/machinery/apc/found_apc = null + for(var/obj/machinery/apc/APC in A) if(!found_apc) found_apc = APC continue diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index a4c908ce3778..cf784259590e 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -210,7 +210,7 @@ /obj/effect/floor_decal/industrial/loading{ dir = 1 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4 }, /obj/structure/cable{ @@ -272,7 +272,7 @@ /obj/effect/floor_decal/industrial/loading{ dir = 1 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 8 }, /obj/structure/cable{ @@ -395,7 +395,7 @@ pixel_x = 24; dir = 8 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /turf/floor/usedup, @@ -414,7 +414,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 8 }, /obj/effect/floor_decal/industrial/outline/yellow, @@ -472,7 +472,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/lower) "bf" = ( -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/structure/cable{ @@ -906,7 +906,7 @@ pixel_x = 24; dir = 8 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/structure/closet/crate/uranium, @@ -1012,7 +1012,7 @@ /obj/random/clothing, /obj/random/clothing, /obj/effect/decal/cleanable/cobweb, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /turf/floor/tiled/dark/airless, @@ -1353,7 +1353,7 @@ pixel_x = 24; dir = 8 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/item/radio/intercom{ @@ -1463,7 +1463,7 @@ /obj/random/gloves, /obj/random/clothing, /obj/random/clothing, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /turf/floor/tiled/dark/airless, @@ -1752,7 +1752,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc/derelict, +/obj/machinery/apc/derelict, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1998,7 +1998,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "el" = ( -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/effect/floor_decal/corner/yellow{ @@ -2255,7 +2255,7 @@ /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/micro_laser/ultra, /obj/structure/rack, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ name = "south bump"; pixel_y = -24 }, @@ -2364,7 +2364,7 @@ /obj/item/box/lights/bulbs, /obj/item/box/lights/mixed, /obj/structure/cable, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ name = "Tools Storage APC" }, /obj/effect/floor_decal/corner/yellow{ diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 13fbb9c4b12c..30150ba50d4e 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -129,7 +129,7 @@ /obj/structure/chair{ dir = 1 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 8 }, /obj/structure/cable{ @@ -242,7 +242,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1; name = "Communications APC" }, @@ -261,7 +261,7 @@ dir = 4; icon_state = "tube1" }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4; name = "Bridge APC" }, @@ -484,7 +484,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc/derelict/full{ +/obj/machinery/apc/derelict/full{ dir = 4; name = "Captain's Quarters APC" }, @@ -562,7 +562,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1; name = "Docking Area APC" }, @@ -1082,7 +1082,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/saloon) "cm" = ( -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1; name = "Crew Areas APC" }, @@ -1535,7 +1535,7 @@ }, /obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4; name = "Bathrooms APC" }, @@ -1637,7 +1637,7 @@ /area/ship/scrap/crew/hallway/starboard) "dt" = ( /obj/structure/cable, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ name = "Dorms APC" }, /obj/machinery/light_switch{ @@ -1741,7 +1741,7 @@ /area/ship/scrap/crew/kitchen) "dH" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4; name = "Crew Deck APC" }, @@ -1874,7 +1874,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4; name = "Galley APC" }, @@ -2248,7 +2248,7 @@ /area/ship/scrap/crew/medbay) "eA" = ( /obj/item/pill_bottle/happy, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/structure/cable{ @@ -2382,7 +2382,7 @@ "eM" = ( /obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4; name = "Cargo Hold APC" }, @@ -2393,7 +2393,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eN" = ( -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4; name = "Crew Deck APC" }, @@ -2407,7 +2407,7 @@ "eO" = ( /obj/structure/table, /obj/structure/cable, -/obj/machinery/power/apc/derelict/full{ +/obj/machinery/apc/derelict/full{ name = "Medical Bay APC" }, /obj/machinery/light_switch{ @@ -2480,7 +2480,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/engine/starboard) "eU" = ( -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/structure/cable{ @@ -2676,7 +2676,7 @@ dir = 4; icon_state = "conpipe-c" }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1; name = "Washroom APC" }, @@ -3067,7 +3067,7 @@ /turf/floor/usedup, /area/ship/scrap/unused) "gc" = ( -/obj/machinery/power/apc/derelict/full{ +/obj/machinery/apc/derelict/full{ name = "Medical Bay APC" }, /obj/structure/cable, @@ -3396,7 +3396,7 @@ /area/ship/scrap/fire) "gL" = ( /obj/structure/cable, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ name = "south bump"; pixel_y = -24 }, @@ -3510,7 +3510,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ dir = 4 }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/structure/cable{ @@ -3666,7 +3666,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /mob/living/simple_animal/hostile/carp, @@ -3691,7 +3691,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /obj/structure/sign/warning/compressed_gas{ @@ -4437,7 +4437,7 @@ /area/ship/scrap/maintenance/atmos) "iF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/fuel, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 8 }, /obj/structure/cable, @@ -5125,7 +5125,7 @@ /obj/structure/closet/secure_closet/engineering_electrical/bearcat, /obj/item/cell/device/standard, /obj/item/cell/device/standard, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 8 }, /obj/structure/cable{ @@ -5262,7 +5262,7 @@ /turf/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "PP" = ( -/obj/machinery/power/apc/derelict/full{ +/obj/machinery/apc/derelict/full{ name = "Medical Bay APC" }, /obj/structure/cable{ diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index 9351a57a678b..dc523a800a1c 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -293,7 +293,7 @@ dir = 1 }, /obj/structure/flora/pottedplant/unusual, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -747,7 +747,7 @@ icon_state = "0-8" }, /obj/structure/flora/pottedplant/unusual, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -882,7 +882,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -943,7 +943,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -1243,7 +1243,7 @@ /obj/structure/cable/green{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -1686,7 +1686,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1723,7 +1723,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1757,7 +1757,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2031,7 +2031,7 @@ "fR" = ( /obj/effect/decal/cleanable/blood/splatter, /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -2644,7 +2644,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -3924,7 +3924,7 @@ dir = 8; level = 2 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -3971,7 +3971,7 @@ dir = 8; level = 2 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -4018,7 +4018,7 @@ dir = 8; level = 2 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -4273,7 +4273,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -4449,7 +4449,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -4967,7 +4967,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -5199,7 +5199,7 @@ "Oc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -5449,7 +5449,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 diff --git a/maps/away/derelict/derelict-station.dmm b/maps/away/derelict/derelict-station.dmm index dae85f046cff..efcdd0536054 100644 --- a/maps/away/derelict/derelict-station.dmm +++ b/maps/away/derelict/derelict-station.dmm @@ -607,7 +607,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc/high/inactive{ +/obj/machinery/apc/high/inactive{ dir = 8; name = "west bump"; pixel_x = -24 @@ -1633,7 +1633,7 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/power/apc/high/inactive{ +/obj/machinery/apc/high/inactive{ name = "south bump"; pixel_y = -24 }, @@ -1870,7 +1870,7 @@ /obj/structure/cable/blue{ icon_state = "0-2" }, -/obj/machinery/power/apc/high/inactive{ +/obj/machinery/apc/high/inactive{ dir = 1; name = "north bump"; pixel_y = 24 @@ -2661,7 +2661,7 @@ /area/constructionsite/medical) "jp" = ( /obj/structure/cable/blue, -/obj/machinery/power/apc/high/inactive{ +/obj/machinery/apc/high/inactive{ name = "south bump"; pixel_y = -24 }, diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 79a6b2c6d3a1..77c6de05aef4 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -218,7 +218,7 @@ /turf/floor/plating, /area/errant_pisces/bow_starboard) "aF" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -321,7 +321,7 @@ /turf/floor/plating, /area/errant_pisces/bow_port) "aR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -960,7 +960,7 @@ /turf/floor/plating, /area/errant_pisces/storage_port) "cV" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -1032,7 +1032,7 @@ /turf/floor/plating, /area/errant_pisces/atmos) "dd" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1070,7 +1070,7 @@ /turf/floor/plating, /area/errant_pisces/enginering) "dg" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1113,7 +1113,7 @@ /turf/floor/plating, /area/errant_pisces/storage_port) "dm" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1365,7 +1365,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -2115,7 +2115,7 @@ /turf/floor/plating, /area/errant_pisces/bow_maint) "ft" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2247,7 +2247,7 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -2289,7 +2289,7 @@ /turf/floor/plating, /area/errant_pisces/smes_room) "fM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -2327,7 +2327,7 @@ dir = 4; pixel_x = -32 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -2505,7 +2505,7 @@ /turf/floor/tiled, /area/errant_pisces/hallway) "gm" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2716,7 +2716,7 @@ /turf/floor/tiled, /area/errant_pisces/dorms) "gV" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2937,7 +2937,7 @@ /turf/floor/laminate, /area/errant_pisces/rooms) "hA" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -3643,7 +3643,7 @@ /turf/floor/tiled, /area/errant_pisces/infirmary) "jJ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -3864,7 +3864,7 @@ /turf/floor/tiled, /area/errant_pisces/cryo) "kq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -4623,7 +4623,7 @@ /turf/floor/tiled, /area/errant_pisces/science_wing) "mD" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -4685,7 +4685,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -4719,7 +4719,7 @@ /turf/floor/tiled/freezer, /area/errant_pisces/prod_storage) "mQ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -4767,7 +4767,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -5297,7 +5297,7 @@ /turf/floor/tiled, /area/errant_pisces/aft_hallway) "nU" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -5356,7 +5356,7 @@ "oe" = ( /obj/structure/closet/crate/radiation, /obj/item/stack/material/aerogel/mapped/tritium/ten, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -5610,7 +5610,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -5812,7 +5812,7 @@ /area/errant_pisces/fishing_wing) "ps" = ( /obj/structure/cable/green, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -6431,7 +6431,7 @@ /obj/structure/mirror{ pixel_x = 30 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 4668690ed070..8d9c0495340a 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -146,7 +146,7 @@ }, /obj/effect/floor_decal/corner_techfloor_grid, /obj/effect/floor_decal/techfloor/corner, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -703,7 +703,7 @@ /area/liberia/mule) "bt" = ( /obj/effect/floor_decal/corner/brown/half, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "merchant north bump"; pixel_y = 24 @@ -1448,7 +1448,7 @@ /obj/effect/floor_decal/techfloor{ dir = 1 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -1921,7 +1921,7 @@ icon_state = "0-2" }, /obj/random/powercell, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "merchant north bump"; pixel_y = 24 @@ -2788,7 +2788,7 @@ /area/liberia/medbay) "eS" = ( /obj/machinery/body_scanconsole, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 4; name = "east bump"; pixel_x = 24 @@ -3123,7 +3123,7 @@ "fx" = ( /obj/effect/floor_decal/techfloor, /obj/structure/table, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ name = "south bump"; pixel_y = -24 }, @@ -3348,7 +3348,7 @@ /obj/structure/chair/wood/walnut{ dir = 8 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -3567,7 +3567,7 @@ /obj/effect/floor_decal/borderfloor/corner2{ dir = 8 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 8; name = "west bump"; pixel_x = -24 @@ -3762,7 +3762,7 @@ "gE" = ( /obj/structure/table, /obj/item/towel/random, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 8; name = "west bump"; pixel_x = -24 @@ -3891,7 +3891,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -4186,7 +4186,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -5204,7 +5204,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 8; name = "west bump"; pixel_x = -24 @@ -5218,7 +5218,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 4; name = "east bump"; pixel_x = 24 @@ -5538,7 +5538,7 @@ "ky" = ( /obj/structure/table/laminate, /obj/effect/floor_decal/spline/fancy/wood, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ name = "south bump"; pixel_y = -24 }, @@ -6062,7 +6062,7 @@ dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 4; name = "east bump"; pixel_x = 24 @@ -6627,7 +6627,7 @@ /turf/floor/plating, /area/liberia/hallway) "rx" = ( -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 8; name = "west bump"; pixel_x = -24 @@ -6736,7 +6736,7 @@ /obj/effect/floor_decal/techfloor{ dir = 4 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -7399,7 +7399,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 8; name = "west bump"; pixel_x = -24 @@ -7533,7 +7533,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/disposalpipe/segment, /obj/effect/catwalk_plated, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 4; name = "east bump"; pixel_x = 24 @@ -7561,7 +7561,7 @@ /obj/structure/janitorialcart, /obj/item/mop, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 1; name = "north bump"; pixel_y = 24 @@ -7589,7 +7589,7 @@ /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/light/small, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ name = "south bump"; pixel_y = -24 }, @@ -7784,7 +7784,7 @@ /turf/floor/tiled, /area/liberia/hallway) "JS" = ( -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ dir = 8; name = "west bump"; pixel_x = -24 @@ -8121,7 +8121,7 @@ /area/liberia/engineeringstorage) "QA" = ( /obj/effect/floor_decal/techfloor, -/obj/machinery/power/apc/liberia{ +/obj/machinery/apc/liberia{ name = "south bump"; pixel_y = -24 }, diff --git a/maps/away/liberia/liberia_machinery.dm b/maps/away/liberia/liberia_machinery.dm index d47a001a09d5..cca1b41781d4 100644 --- a/maps/away/liberia/liberia_machinery.dm +++ b/maps/away/liberia/liberia_machinery.dm @@ -1,4 +1,4 @@ -/obj/machinery/power/apc/liberia +/obj/machinery/apc/liberia req_access = list(access_merchant) /obj/machinery/alarm/liberia diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 4981010ff903..646d3271d4f2 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -241,7 +241,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -345,7 +345,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -561,7 +561,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -885,7 +885,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -1580,7 +1580,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index ff34e540ae8f..b8848b94ee56 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -915,7 +915,7 @@ /turf/floor/plating/airless, /area/magshield/smes_storage) "cH" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1108,7 +1108,7 @@ dir = 8; level = 2 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1300,7 +1300,7 @@ /turf/floor/plating/airless, /area/magshield/north) "dN" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2340,7 +2340,7 @@ /turf/wall, /area/magshield/west) "gQ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -2582,7 +2582,7 @@ /turf/floor/tiled, /area/magshield/west) "hG" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -3257,7 +3257,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 211bb4aa8333..c5c5cac0f940 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -1700,7 +1700,7 @@ dir = 4; icon_state = "0-2" }, -/obj/machinery/power/apc/high/inactive{ +/obj/machinery/apc/high/inactive{ name = "south bump"; pixel_y = -24 }, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index ab98bd7f708f..76d0671080af 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -148,7 +148,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -618,7 +618,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -831,7 +831,7 @@ /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 diff --git a/maps/away/unishi/unishi-1.dmm b/maps/away/unishi/unishi-1.dmm index 0261df5f22a4..69dafd229b14 100644 --- a/maps/away/unishi/unishi-1.dmm +++ b/maps/away/unishi/unishi-1.dmm @@ -26,7 +26,7 @@ /turf/floor, /area/unishi/engineering) "af" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -262,7 +262,7 @@ /turf/floor, /area/unishi/engineroom) "aQ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index d80c7b18d961..5f96d95191cc 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -44,7 +44,7 @@ /turf/wall, /area/unishi/library) "al" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24; @@ -153,7 +153,7 @@ /turf/floor/tiled/white, /area/unishi/chem) "aC" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -434,7 +434,7 @@ /turf/floor/tiled/dark, /area/unishi/classroom) "bu" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -848,7 +848,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cB" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -908,7 +908,7 @@ /obj/machinery/atmospherics/portables_connector{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -1225,7 +1225,7 @@ /turf/floor/tiled, /area/unishi/rnd) "dB" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -1370,7 +1370,7 @@ "dS" = ( /obj/machinery/atmospherics/valve, /obj/machinery/vending/hydroseeds, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -1571,7 +1571,7 @@ /obj/item/chems/spray/extinguisher, /obj/item/chems/spray/extinguisher, /obj/item/box/animal_cubes/monkeys, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -1888,7 +1888,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fl" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; @@ -2108,7 +2108,7 @@ /turf/floor/tiled/dark, /area/unishi/smresearch) "fR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24; diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index 81afee9709b0..f5ed1e294bf9 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -652,7 +652,7 @@ /turf/floor/plating/airless, /area/unishi/living) "cg" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -28; req_access = newlist() @@ -743,7 +743,7 @@ /turf/floor/tiled/white, /area/unishi/med) "cq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 20; req_access = newlist() @@ -821,7 +821,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -28; req_access = newlist() @@ -1096,7 +1096,7 @@ /turf/floor/tiled, /area/unishi/living) "dh" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 20; req_access = newlist() @@ -1897,7 +1897,7 @@ /area/unishi/living) "fg" = ( /obj/machinery/door/firedoor, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = -30; req_access = newlist() diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 9cc85f9666d9..43c5ed43367e 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -118,7 +118,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "Yacht bridge"; pixel_y = -24 }, @@ -640,7 +640,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Yacht engine"; pixel_y = 24 @@ -851,7 +851,7 @@ /area/yacht/engine) "cC" = ( /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "Yacht living"; pixel_x = -24 diff --git a/maps/example/example-1.dmm b/maps/example/example-1.dmm index 2aeb3f12d29a..129c5b08e972 100644 --- a/maps/example/example-1.dmm +++ b/maps/example/example-1.dmm @@ -728,7 +728,7 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "west bump"; pixel_x = 24 diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm index aea14459d2eb..f1bf69ddda70 100644 --- a/maps/example/example-2.dmm +++ b/maps/example/example-2.dmm @@ -700,7 +700,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 21 }, diff --git a/maps/example/example-3.dmm b/maps/example/example-3.dmm index f08650be723a..7dda2d9ff4ca 100644 --- a/maps/example/example-3.dmm +++ b/maps/example/example-3.dmm @@ -260,7 +260,7 @@ /turf/floor, /area/example/third) "QH" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 21 }, diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index a25c16112a44..2a76b49434c6 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -228,7 +228,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/fore) "aJ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -1425,7 +1425,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -1565,7 +1565,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/port) "eN" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -1596,7 +1596,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/central) "eQ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2051,7 +2051,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/maintenance/sub/starboard) "fS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2727,7 +2727,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -3605,7 +3605,7 @@ /obj/structure/cable/cyan{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -3655,7 +3655,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/maintenance/sub/aft) "jD" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -4159,7 +4159,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/atmos) "kX" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -6005,7 +6005,7 @@ "Nw" = ( /obj/structure/table/steel, /obj/item/box/cups, -/obj/machinery/power/apc/hyper{ +/obj/machinery/apc/hyper{ dir = 4; name = "east bump"; pixel_x = 24 diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 83affb57b561..ee4834d3cee5 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -287,7 +287,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/range) "aaP" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1122,7 +1122,7 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1416,7 +1416,7 @@ /turf/floor/plating, /area/exodus/crew_quarters/heads/hos) "adc" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1616,7 +1616,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_starboard) "adC" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -2072,7 +2072,7 @@ /area/exodus/security/main) "aeA" = ( /obj/effect/floor_decal/corner/red, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2102,7 +2102,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "aeE" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2579,7 +2579,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/warden) "afF" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -3367,7 +3367,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -3800,7 +3800,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "ais" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -3914,7 +3914,7 @@ /obj/structure/chair{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -4455,7 +4455,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -5177,7 +5177,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -5642,7 +5642,7 @@ /turf/floor/lino, /area/exodus/security/detectives_office) "alU" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -5999,7 +5999,7 @@ /obj/structure/cable/green{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -6154,7 +6154,7 @@ id_tag = "permentryflash"; name = "Floor mounted flash" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -6379,7 +6379,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -7055,7 +7055,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/lobby) "aoR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -8340,7 +8340,7 @@ /turf/floor/tiled/dark, /area/exodus/lawoffice) "arr" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -8797,7 +8797,7 @@ /turf/floor/plating, /area/exodus/maintenance/dormitory) "asq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -8838,7 +8838,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -9426,7 +9426,7 @@ /turf/floor/tiled/white/monotile, /area/exodus/crew_quarters/sleep/cryo) "atM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -9712,7 +9712,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/fore) "auy" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -10069,7 +10069,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -10146,7 +10146,7 @@ /area/exodus/hallway/primary/port) "avv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -10248,7 +10248,7 @@ /area/exodus/hallway/primary/fore) "avJ" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -10959,7 +10959,7 @@ /area/exodus/maintenance/evahallway) "axd" = ( /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -11195,7 +11195,7 @@ /turf/floor/plating, /area/exodus/maintenance/arrivals) "axK" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -11435,7 +11435,7 @@ /turf/floor/plating, /area/exodus/maintenance/arrivals) "aym" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 8; name = "west bump"; pixel_x = -24 @@ -12132,7 +12132,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -12766,7 +12766,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "aAV" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -13379,7 +13379,7 @@ "aCw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 4; name = "east bump"; pixel_x = 24 @@ -13725,7 +13725,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) "aDr" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -13957,7 +13957,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/ai_monitored/storage/eva) "aDS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -13999,7 +13999,7 @@ name = "xeno_spawn"; pixel_x = -1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -14060,7 +14060,7 @@ /turf/floor/tiled/dark, /area/exodus/security/nuke_storage) "aEc" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -14515,7 +14515,7 @@ /turf/floor/plating, /area/exodus/maintenance/library) "aEX" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -14763,7 +14763,7 @@ /turf/floor/plating, /area/exodus/maintenance/library) "aFx" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -14847,7 +14847,7 @@ /area/exodus/hallway/primary/central_two) "aFG" = ( /obj/structure/closet/secure_closet/bar, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -15055,7 +15055,7 @@ /turf/floor/plating, /area/exodus/maintenance/evahallway) "aFX" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -15441,7 +15441,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -15613,7 +15613,7 @@ /obj/structure/cable/green{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -16122,7 +16122,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -17010,7 +17010,7 @@ /turf/floor/laminate/walnut, /area/exodus/library) "aKc" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -17596,7 +17596,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/starboard) "aLv" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -18115,7 +18115,7 @@ /turf/floor/tiled/dark, /area/exodus/hydroponics) "aMG" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -18376,7 +18376,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/port) "aNi" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -19141,7 +19141,7 @@ /turf/floor/tiled/dark, /area/exodus/chapel/office) "aOF" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -20536,7 +20536,7 @@ /turf/floor/carpet, /area/exodus/library) "aRO" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -20557,7 +20557,7 @@ /area/exodus/hallway/secondary/entry/starboard) "aRQ" = ( /obj/structure/cable/green, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 4; name = "east bump"; pixel_x = 24 @@ -22081,7 +22081,7 @@ /obj/structure/cable/green{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -22176,7 +22176,7 @@ /turf/floor/plating, /area/exodus/maintenance/locker) "aVB" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -22207,7 +22207,7 @@ dir = 8; pixel_x = -24 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -22545,7 +22545,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hydroponics/garden) "aWs" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -23999,7 +23999,7 @@ /turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZB" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -24175,7 +24175,7 @@ /turf/floor/lino, /area/exodus/security/vacantoffice) "baa" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -24515,7 +24515,7 @@ /obj/effect/floor_decal/corner/brown/diagonal{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -25064,7 +25064,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -25138,7 +25138,7 @@ /area/exodus/hallway/primary/central_one) "bcb" = ( /obj/structure/table/reinforced, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -25151,7 +25151,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/bridge) "bcc" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -25326,7 +25326,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_two) "bcu" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -25810,7 +25810,7 @@ /turf/floor/tiled/freezer, /area/exodus/crew_quarters/locker/locker_toilet) "bdt" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -25887,7 +25887,7 @@ /turf/floor/plating, /area/exodus/maintenance/locker) "bdB" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -26214,7 +26214,7 @@ /turf/floor/lino, /area/exodus/security/vacantoffice) "beu" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -26663,7 +26663,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/starboard) "bfr" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -26804,7 +26804,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/captain) "bfI" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -29129,7 +29129,7 @@ /area/exodus/research/docking) "bks" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 4; name = "east bump"; pixel_x = 24 @@ -30079,7 +30079,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -30195,7 +30195,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bmC" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -30250,7 +30250,7 @@ /obj/structure/cable/cyan{ icon_state = "0-4" }, -/obj/machinery/power/apc/super/critical{ +/obj/machinery/apc/super/critical{ dir = 1; name = "north bump"; pixel_y = 24 @@ -30411,7 +30411,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/medical/chemistry) "bmZ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -30962,7 +30962,7 @@ /obj/item/clothing/head/hardhat/red, /obj/item/flashlight, /obj/item/clothing/mask/gas, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -31140,7 +31140,7 @@ /turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "boD" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -31310,7 +31310,7 @@ /turf/floor/tiled/white, /area/exodus/research/lab) "boU" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -31767,7 +31767,7 @@ /obj/machinery/porta_turret{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -33872,7 +33872,7 @@ /turf/floor/tiled/dark, /area/exodus/research/chargebay) "buf" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -34380,7 +34380,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/hop) "buZ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -34585,7 +34585,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/medical/reception) "bvr" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -34743,7 +34743,7 @@ /turf/floor/plating, /area/exodus/maintenance/cargo) "bvG" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -34813,7 +34813,7 @@ /turf/floor/plating, /area/exodus/maintenance/cargo) "bvT" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; name = "north bump"; pixel_y = 24 @@ -35123,7 +35123,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -35174,7 +35174,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/hop) "bwI" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -35369,7 +35369,7 @@ /turf/floor/tiled/white, /area/exodus/medical/chemistry) "bxb" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -35474,7 +35474,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai_upload) "bxp" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -36036,7 +36036,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay) "byy" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -36281,7 +36281,7 @@ /obj/machinery/light/small, /obj/structure/mopbucket, /obj/item/mop, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -36312,7 +36312,7 @@ pixel_x = -2; pixel_y = -1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -36648,7 +36648,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/miningdock) "bzM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -36663,7 +36663,7 @@ /turf/floor/tiled/dark, /area/exodus/turret_protected/ai_server_room) "bzN" = ( -/obj/machinery/power/apc/critical{ +/obj/machinery/apc/critical{ dir = 1; name = "north bump"; pixel_y = 24 @@ -36705,7 +36705,7 @@ /turf/floor/tiled/dark/monotile, /area/exodus/teleporter) "bzR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -36720,7 +36720,7 @@ /turf/floor/tiled/dark, /area/exodus/turret_protected/ai_upload_foyer) "bzS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -36768,7 +36768,7 @@ /turf/floor/plating, /area/exodus/maintenance/engineering) "bzY" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -37141,7 +37141,7 @@ /obj/structure/cable/green{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -37382,7 +37382,7 @@ }, /obj/item/clothing/head/soft/orange, /obj/item/clothing/shoes/sandal, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -38965,7 +38965,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/storage) "bEl" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -39007,7 +39007,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "bEq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -39057,7 +39057,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_three) "bEv" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -39304,7 +39304,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bEZ" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 4; name = "east bump"; pixel_x = 24 @@ -39731,7 +39731,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/xenobiology) "bFR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -40676,7 +40676,7 @@ /obj/structure/cable/green{ icon_state = "0-4" }, -/obj/machinery/power/apc/critical{ +/obj/machinery/apc/critical{ dir = 1; name = "north bump"; pixel_y = 24 @@ -41066,7 +41066,7 @@ pixel_x = -22; pixel_y = 11 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -41254,7 +41254,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc/critical{ +/obj/machinery/apc/critical{ name = "south bump"; pixel_y = -24 }, @@ -41418,7 +41418,7 @@ /turf/floor/plating, /area/exodus/storage/tech) "bIX" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -42128,7 +42128,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -43096,7 +43096,7 @@ dir = 8; icon_state = "pipe-c" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -43282,7 +43282,7 @@ /turf/wall/prepainted, /area/exodus/medical/medbay2) "bMF" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -43348,7 +43348,7 @@ /area/exodus/crew_quarters/medbreak) "bML" = ( /obj/machinery/washing_machine, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -43801,7 +43801,7 @@ /obj/structure/cable/green{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -44233,7 +44233,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -44320,7 +44320,7 @@ /turf/floor/plating, /area/exodus/storage/tech) "bOM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -44639,7 +44639,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/janitor) "bPs" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -45079,7 +45079,7 @@ pixel_x = -25; pixel_y = -5 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -45849,7 +45849,7 @@ /obj/structure/cable/green{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -46751,7 +46751,7 @@ /area/exodus/medical/patient_a) "bTI" = ( /obj/structure/iv_drip, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -46794,7 +46794,7 @@ /area/exodus/medical/patient_b) "bTM" = ( /obj/structure/iv_drip, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -46842,7 +46842,7 @@ /turf/floor/tiled/white, /area/exodus/research/misc_lab) "bTQ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -46964,7 +46964,7 @@ pixel_y = -23; dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -47441,7 +47441,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/medical/patient_wing) "bVe" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -47592,7 +47592,7 @@ /obj/machinery/alarm{ pixel_y = 22 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -48602,7 +48602,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -48783,7 +48783,7 @@ /turf/floor/tiled/white, /area/exodus/medical/patient_wing) "bXR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -49141,7 +49141,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -49310,7 +49310,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/chief) "bYP" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -49454,7 +49454,7 @@ /obj/machinery/light_switch{ pixel_y = 27 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -50120,7 +50120,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/medical/medbay4) "caz" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ name = "south bump"; pixel_y = -24 }, @@ -50175,7 +50175,7 @@ /turf/wall/prepainted, /area/exodus/medical/ward) "caF" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -50242,7 +50242,7 @@ pixel_x = 22; dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -50354,7 +50354,7 @@ /area/exodus/maintenance/research_starboard) "cbb" = ( /obj/structure/iv_drip, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -51388,7 +51388,7 @@ /obj/structure/cable/green{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -51745,7 +51745,7 @@ /area/exodus/maintenance/substation/research) "cdH" = ( /obj/structure/cable/green, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -52092,7 +52092,7 @@ /turf/floor/plating/airless, /area/exodus/research/test_area) "cet" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -52116,7 +52116,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/fore) "cew" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -52301,7 +52301,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/medical/surgeryobs) "ceS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -52774,7 +52774,7 @@ /area/exodus/engineering/break_room) "cfW" = ( /obj/machinery/light, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -53167,7 +53167,7 @@ /obj/random/tech_supply, /obj/random/tech_supply, /obj/random/tech_supply, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -53534,7 +53534,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/foyer) "chy" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -53698,7 +53698,7 @@ "chM" = ( /obj/structure/bedsheetbin/mapped, /obj/structure/table, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -53832,7 +53832,7 @@ /turf/floor/tiled/white, /area/exodus/research/xenobiology/xenoflora) "chZ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -53898,7 +53898,7 @@ /turf/floor/tiled/freezer, /area/exodus/research/xenobiology/xenoflora_storage) "cig" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -54026,7 +54026,7 @@ pixel_y = 3 }, /obj/item/briefcase/inflatable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -54185,7 +54185,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/locker_room) "ciQ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -54406,7 +54406,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -54769,7 +54769,7 @@ /obj/structure/cable/green{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -56643,7 +56643,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -56787,7 +56787,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/research/xenobiology) "cot" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -57167,7 +57167,7 @@ /turf/floor/plating, /area/exodus/engineering/sublevel_access) "cpp" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -57824,7 +57824,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering) "crj" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -58213,7 +58213,7 @@ /obj/structure/table/reinforced, /obj/machinery/light, /obj/item/flashlight, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -58256,7 +58256,7 @@ /obj/structure/cable/green{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -58294,7 +58294,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/workshop) "csx" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -58352,7 +58352,7 @@ dir = 8; pixel_x = -24 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -58412,7 +58412,7 @@ dir = 4; pixel_x = 24 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -58437,7 +58437,7 @@ /area/space) "csN" = ( /obj/structure/closet/wardrobe/virology_white, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -58633,7 +58633,7 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/heads/hor) "ctA" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; name = "north bump"; pixel_y = 24 @@ -59723,7 +59723,7 @@ /turf/floor/plating, /area/exodus/engineering/storage) "cwy" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -60422,7 +60422,7 @@ /obj/structure/chair{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -61235,7 +61235,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_monitoring) "cEM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -61535,7 +61535,7 @@ /turf/floor/plating, /area/exodus/engineering/engine_waste) "cGI" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -61654,7 +61654,7 @@ /area/space) "cHf" = ( /obj/machinery/light, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -62156,7 +62156,7 @@ /turf/floor/plating, /area/exodus/maintenance/engi_engine) "cJf" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "north bump"; pixel_y = 24 @@ -62725,7 +62725,7 @@ id_tag = "Engine Power"; name = "Powernet Sensor - Engine Power" }, -/obj/machinery/power/apc/super/critical{ +/obj/machinery/apc/super/critical{ dir = 1; name = "north bump"; pixel_y = 24 @@ -62917,7 +62917,7 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -63842,7 +63842,7 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/arrival/station) "lFM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -64447,7 +64447,7 @@ /turf/floor/tiled/white, /area/exodus/research) "tGf" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -64831,7 +64831,7 @@ /area/exodus/teleporter) "yjb" = ( /obj/structure/cable/green, -/obj/machinery/power/apc/super/critical{ +/obj/machinery/apc/super/critical{ dir = 8; name = "west bump"; pixel_x = -24 diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 1ee33475b72d..0d703c96b6de 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -130,7 +130,7 @@ /turf/floor/tiled/steel_grid, /area/ministation/engine) "aL" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "_South APC"; pixel_y = -24 }, @@ -258,7 +258,7 @@ /turf/floor/tiled, /area/ministation/engine) "bp" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -2651,7 +2651,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -3588,7 +3588,7 @@ /turf/floor/tiled, /area/ministation/hall/n) "pz" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -4445,7 +4445,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -4773,7 +4773,7 @@ /turf/floor/tiled/steel_grid, /area/ministation/engine) "ve" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "_East APC"; pixel_x = 27; @@ -6706,7 +6706,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -6979,7 +6979,7 @@ /turf/floor/tiled/steel_grid, /area/ministation/engine) "Eb" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -8972,7 +8972,7 @@ /turf/floor/plating, /area/ministation/ai_upload) "IM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "_South APC"; pixel_y = -24 }, @@ -9582,7 +9582,7 @@ /area/ministation/ai_upload) "Ks" = ( /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "_South APC"; pixel_y = -24 }, @@ -9620,7 +9620,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -9867,7 +9867,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "Lf" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "MiniSat Maint APC"; pixel_x = -24 @@ -10584,7 +10584,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -10611,7 +10611,7 @@ /obj/machinery/camera/network/engineering{ name = "SM North" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "SM APC"; pixel_y = 20; dir = 1 @@ -10872,7 +10872,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -10993,7 +10993,7 @@ /turf/floor/tiled, /area/ministation/engine) "OG" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "_South APC"; pixel_y = -24 }, @@ -11672,7 +11672,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, @@ -12089,7 +12089,7 @@ /area/ministation/dorms) "Sw" = ( /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "SM APC"; pixel_x = -27; pixel_y = null; @@ -13987,7 +13987,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 272d29948511..1ff78b8cade6 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -196,7 +196,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "aU" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -453,7 +453,7 @@ /obj/effect/floor_decal/floordetail/edgedrain{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "_West APC"; pixel_x = -25 @@ -1945,7 +1945,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "_South APC"; pixel_y = -24 }, @@ -2300,7 +2300,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "_West APC"; pixel_x = -25 @@ -2901,7 +2901,7 @@ /turf/floor/plating, /area/ministation/maint/secmaint) "oD" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -4392,7 +4392,7 @@ /turf/floor/lino, /area/ministation/cafe) "tT" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "_East APC"; pixel_x = 27; @@ -4438,7 +4438,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -4652,7 +4652,7 @@ /obj/structure/railing/mapped{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "_South APC"; pixel_y = -24 }, @@ -4839,7 +4839,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "vn" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -6805,7 +6805,7 @@ /turf/floor/carpet/blue3, /area/ministation/security) "CP" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -7853,7 +7853,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "Jm" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "_East APC"; pixel_x = 27; @@ -8786,7 +8786,7 @@ /turf/floor/carpet/blue3, /area/ministation/security) "OF" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -9911,7 +9911,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "UY" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "_East APC"; pixel_x = 27; diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 3b9ba99954de..c503f8dbd579 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -296,7 +296,7 @@ /turf/wall/r_wall, /area/ministation/telecomms) "bn" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Vault APC"; pixel_y = 25 @@ -719,7 +719,7 @@ /turf/floor/tiled, /area/ministation/bridge) "cu" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -1934,7 +1934,7 @@ /area/ministation/science) "iq" = ( /obj/effect/decal/cleanable/filth, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -2085,7 +2085,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "jd" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -2219,7 +2219,7 @@ /turf/floor/tiled/white, /area/ministation/science) "jy" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -3046,7 +3046,7 @@ /turf/wall/titanium, /area/ministation/shuttle/outgoing) "nI" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "_East APC"; pixel_x = 27; @@ -3303,7 +3303,7 @@ /turf/floor/laminate/walnut, /area/ministation/library) "pz" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -4003,7 +4003,7 @@ /area/ministation/science) "vJ" = ( /obj/effect/decal/cleanable/dirt/visible, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -4584,7 +4584,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "_West APC"; pixel_x = -25 @@ -5781,7 +5781,7 @@ /turf/floor/tiled/steel_grid, /area/ministation/science) "Il" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -6913,7 +6913,7 @@ /turf/floor/laminate/yew, /area/ministation/court) "Qk" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -6927,7 +6927,7 @@ /turf/floor/plating, /area/ministation/maint/l3se) "Qq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -7031,7 +7031,7 @@ /turf/floor/laminate/mahogany, /area/ministation/library) "Re" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -7858,7 +7858,7 @@ pixel_y = 30; pixel_x = -33 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 @@ -8362,7 +8362,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -27 }, diff --git a/maps/ministation/ministation-3.dmm b/maps/ministation/ministation-3.dmm index e5b68a7fe209..0ffc162ec9aa 100644 --- a/maps/ministation/ministation-3.dmm +++ b/maps/ministation/ministation-3.dmm @@ -150,7 +150,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 20 }, diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 45318e7f6b90..8b1dd94704b9 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -527,7 +527,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "_North APC"; pixel_y = 24 diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index b5ae8b072cda..102a1b78168d 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -102,7 +102,7 @@ /area/map_template/hydrobase/station/growX) "as" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -342,7 +342,7 @@ /turf/floor/fixed/alium, /area/map_template/hydrobase/station/growD) "bc" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -718,7 +718,7 @@ /area/map_template/hydrobase/station/growD) "cc" = ( /obj/structure/cable/yellow, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 25 }, @@ -1006,7 +1006,7 @@ /turf/floor/tiled/white, /area/map_template/hydrobase/station/growC) "cS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 25 }, @@ -1082,7 +1082,7 @@ /turf/floor/fixed/alium, /area/map_template/hydrobase/station/growF) "dc" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ pixel_y = -25 }, /obj/structure/cable/yellow{ @@ -1560,7 +1560,7 @@ /turf/floor/fixed/alium, /area/map_template/hydrobase/station/processing) "eq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1706,7 +1706,7 @@ tag_interior_door = "solars_inner"; dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 25 }, @@ -1822,7 +1822,7 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 25 }, @@ -1831,7 +1831,7 @@ /turf/floor/bluegrid, /area/map_template/hydrobase/station/growB) "eS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -25 }, @@ -2204,7 +2204,7 @@ /turf/floor/fixed/alium, /area/map_template/hydrobase/station/growA) "fM" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -2233,7 +2233,7 @@ /area/map_template/hydrobase/station/shipaccess) "fP" = ( /obj/machinery/washing_machine, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 25 }, @@ -2494,7 +2494,7 @@ id_tag = "hydrodock_sensor"; pixel_y = 25 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index f98b8e3b8950..8f79725b6aac 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -662,7 +662,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -686,7 +686,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -1862,7 +1862,7 @@ /area/map_template/colony/engineering) "ej" = ( /obj/structure/table/steel_reinforced, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -2183,7 +2183,7 @@ /turf/floor/lino, /area/map_template/colony/messhall) "eO" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -2220,7 +2220,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -3034,7 +3034,7 @@ /obj/effect/floor_decal/techfloor{ dir = 10 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -3478,7 +3478,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "gY" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -3700,7 +3700,7 @@ /obj/effect/floor_decal/techfloor{ dir = 6 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -3940,7 +3940,7 @@ /turf/floor/laminate/walnut, /area/map_template/colony/commons) "hT" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -4176,7 +4176,7 @@ /area/map_template/colony/bathroom) "ip" = ( /obj/effect/floor_decal/borderfloorwhite, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -4423,7 +4423,7 @@ dir = 1 }, /obj/effect/floor_decal/techfloor, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -4676,7 +4676,7 @@ /area/map_template/colony/jail) "ji" = ( /obj/effect/floor_decal/techfloor, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -5362,7 +5362,7 @@ dir = 10; icon_state = "warning" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -5871,7 +5871,7 @@ /turf/floor/plating, /area/map_template/colony/jail) "lt" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -6868,7 +6868,7 @@ /turf/floor/plating, /area/map_template/colony/hydroponics) "nh" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 @@ -8002,7 +8002,7 @@ /area/map_template/colony/airlock) "Hy" = ( /obj/machinery/portable_atmospherics/hydroponics, -/obj/machinery/power/apc{ +/obj/machinery/apc{ locked = 0; name = "south bump"; pixel_y = -28 diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 05ce95d98f90..5230d809f5ad 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -712,7 +712,7 @@ /turf/floor, /area/ship/trade/fore_port_underside_maint) "bD" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, @@ -932,7 +932,7 @@ /turf/floor, /area/ship/trade/aft_port_underside_maint) "bZ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, @@ -1499,7 +1499,7 @@ /turf/floor/tiled/white, /area/ship/trade/livestock) "xZ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, @@ -1724,7 +1724,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, @@ -1770,7 +1770,7 @@ /obj/structure/chair/comfy/green{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, @@ -1850,7 +1850,7 @@ /turf/wall/r_wall/hull, /area/ship/trade/undercomms) "Lx" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 22 }, @@ -2201,7 +2201,7 @@ /turf/floor, /area/ship/trade/aft_starboard_underside_maint) "Zz" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index c5b77f4f34ce..ef113b8ed76d 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -167,7 +167,7 @@ /turf/floor/plating, /area/ship/trade/cargo/lower) "aw" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -468,7 +468,7 @@ pixel_x = 24; dir = 8 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -493,7 +493,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -22 }, @@ -575,7 +575,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/lower) "bj" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -888,7 +888,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 22 }, @@ -958,7 +958,7 @@ /obj/random/clothing, /obj/random/clothing, /obj/effect/decal/cleanable/cobweb, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -1502,7 +1502,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -1842,7 +1842,7 @@ level = 2 }, /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "Engineering Supply Storage APC"; pixel_x = 22 @@ -1876,7 +1876,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -2120,7 +2120,7 @@ /turf/wall/r_wall, /area/ship/trade/crew/dorms1) "lb" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -2396,7 +2396,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -2507,7 +2507,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ pixel_y = -22 }, /obj/machinery/alarm{ @@ -3117,7 +3117,7 @@ /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/micro_laser/ultra, /obj/structure/rack, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index bdad0e37088e..03f9624c6d0b 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -135,7 +135,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "Crew Deck APC"; pixel_x = -22 @@ -1194,7 +1194,7 @@ /turf/wall, /area/ship/trade/crew/saloon) "cO" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Crew Areas APC"; pixel_y = 22 @@ -1387,7 +1387,7 @@ "ds" = ( /obj/structure/table, /obj/machinery/reagent_temperature, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -1666,7 +1666,7 @@ /obj/structure/window/reinforced/tinted, /obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "Bathrooms APC"; pixel_x = 22 @@ -1806,7 +1806,7 @@ /area/space) "el" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "Crew Deck APC"; pixel_x = 22 @@ -1886,7 +1886,7 @@ icon_state = "0-2"; pixel_y = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "Galley APC"; pixel_x = 22 @@ -2177,7 +2177,7 @@ /area/ship/trade/crew/medbay) "fg" = ( /obj/item/pill_bottle/happy, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -2322,7 +2322,7 @@ /turf/floor/plating/airless, /area/ship/trade/maintenance/engine/starboard) "fA" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -2981,7 +2981,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -3055,7 +3055,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/hallway) "hA" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "Medical Bay APC"; pixel_y = -22 }, @@ -3131,7 +3131,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 1; pixel_y = 22 }, @@ -4463,7 +4463,7 @@ /area/ship/trade/shuttle/outgoing/general) "ld" = ( /obj/machinery/atmospherics/pipe/simple/hidden/fuel, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 8; pixel_x = -22 }, @@ -4658,7 +4658,7 @@ /turf/wall/r_wall, /area/ship/trade/crew/medbay/chemistry) "nm" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 22 }, @@ -5057,7 +5057,7 @@ dir = 1; pixel_y = -24 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; pixel_x = 22 }, @@ -5248,7 +5248,7 @@ /obj/structure/handrail{ dir = 4 }, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 8; pixel_x = -22 }, @@ -5261,7 +5261,7 @@ /obj/structure/handrail{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -22 }, @@ -6061,7 +6061,7 @@ /turf/floor/tiled, /area/ship/trade/shuttle/rescue) "Dl" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "Medical Bay APC"; pixel_y = -22 }, @@ -6163,7 +6163,7 @@ dir = 4; icon_state = "tube1" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Communications APC"; pixel_y = 22 @@ -6202,7 +6202,7 @@ /obj/random/hat, /obj/random/hat, /obj/random/masks, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -22 }, @@ -6682,7 +6682,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Docking Area APC"; pixel_y = 22 @@ -6995,7 +6995,7 @@ dir = 4; icon_state = "conpipe-c" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Washroom APC"; pixel_y = 22 @@ -7187,7 +7187,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -22 }, @@ -7329,7 +7329,7 @@ "QH" = ( /obj/structure/table, /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "Medical Bay APC"; pixel_y = -22 }, @@ -7374,7 +7374,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "Captain's Quarters APC"; pixel_x = 22 @@ -7557,7 +7557,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Docking Area APC"; pixel_y = 22 @@ -7739,7 +7739,7 @@ /area/ship/trade/shuttle/outgoing/general) "Vc" = ( /obj/structure/cable, -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -22 }, @@ -7968,7 +7968,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, @@ -8086,7 +8086,7 @@ /obj/structure/closet/secure_closet/engineering_electrical, /obj/item/cell/device/standard, /obj/item/cell/device/standard, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -22 }, diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index 3ff3588e2d8f..bdbac519b57e 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -495,7 +495,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ pixel_y = -22 }, /obj/structure/cable{ @@ -714,7 +714,7 @@ /area/ship/trade/command/bridge_upper) "oq" = ( /obj/random/trash, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; pixel_x = -22 }, @@ -789,7 +789,7 @@ dir = 4; icon_state = "tube1" }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; name = "Communications APC"; pixel_y = 22 @@ -822,7 +822,7 @@ /area/space) "wc" = ( /obj/effect/floor_decal/steeldecal/steel_decals6, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 1; pixel_y = 22 }, diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm index ac4c19eb0c57..cc40f4f674a5 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm @@ -638,7 +638,7 @@ /turf/floor/plating, /area/lar_maria/morgue) "bZ" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -851,7 +851,7 @@ /turf/floor/plating, /area/lar_maria/morgue) "cA" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1711,7 +1711,7 @@ /turf/floor/tiled, /area/lar_maria/sec_wing) "eO" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -1742,7 +1742,7 @@ /turf/floor/tiled/white, /area/lar_maria/vir_ward) "eR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1933,7 +1933,7 @@ /turf/floor/tiled, /area/lar_maria/vir_hallway) "fq" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -1969,7 +1969,7 @@ /area/lar_maria/vir_aux) "fu" = ( /obj/structure/closet/crate/plastic/rations, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2515,7 +2515,7 @@ /turf/floor/plating, /area/lar_maria/sec_wing) "gv" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -2862,7 +2862,7 @@ /turf/floor/tiled, /area/lar_maria/vir_access) "hu" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm index e6ba0c32dd3b..3fa27c6e3b3a 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm @@ -573,7 +573,7 @@ /turf/floor/plating, /area/lar_maria/solar_control) "bB" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1314,7 +1314,7 @@ /turf/floor/plating, /area/lar_maria/atmos) "dS" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ name = "south bump"; pixel_y = -24 }, @@ -1399,7 +1399,7 @@ /turf/floor/tiled, /area/lar_maria/library) "eh" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1688,7 +1688,7 @@ /turf/floor/tiled/white, /area/lar_maria/head_m) "fl" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -1906,7 +1906,7 @@ /turf/floor/tiled, /area/lar_maria/office) "fR" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2042,7 +2042,7 @@ /turf/floor/laminate, /area/lar_maria/dorms) "gn" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 @@ -2328,7 +2328,7 @@ /turf/open, /area/lar_maria/hallway) "hi" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -2411,7 +2411,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 8; name = "west bump"; pixel_x = -24 @@ -2687,7 +2687,7 @@ /turf/floor/tiled/white, /area/lar_maria/head_f) "in" = ( -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4; name = "east bump"; pixel_x = 24 diff --git a/mods/content/generic_shuttles/tanker/tanker.dmm b/mods/content/generic_shuttles/tanker/tanker.dmm index c189bc9b389f..f109b52426b9 100644 --- a/mods/content/generic_shuttles/tanker/tanker.dmm +++ b/mods/content/generic_shuttles/tanker/tanker.dmm @@ -223,7 +223,7 @@ "vC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ dir = 4; pixel_x = 24 }, diff --git a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm index 42df960f6273..470059b9b2b6 100644 --- a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm +++ b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm @@ -426,7 +426,7 @@ dir = 4; pixel_x = -24 }, -/obj/machinery/power/apc/derelict, +/obj/machinery/apc/derelict, /turf/floor/tiled/airless, /area/map_template/ecship/cryo) "bh" = ( @@ -627,7 +627,7 @@ /obj/effect/floor_decal/corner/paleblue/diagonal{ dir = 4 }, -/obj/machinery/power/apc{ +/obj/machinery/apc{ dir = 4 }, /obj/structure/cable{ @@ -1095,7 +1095,7 @@ }, /obj/structure/closet/l3closet, /obj/structure/cable, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 4 }, /turf/floor/tiled/white/lowpressure, @@ -1256,7 +1256,7 @@ dir = 1; icon_state = "0-4" }, -/obj/machinery/power/apc/derelict{ +/obj/machinery/apc/derelict{ dir = 1 }, /turf/floor, diff --git a/mods/content/supermatter/endgame_cascade/universe.dm b/mods/content/supermatter/endgame_cascade/universe.dm index 46eb1efd5bf4..157dce06268c 100644 --- a/mods/content/supermatter/endgame_cascade/universe.dm +++ b/mods/content/supermatter/endgame_cascade/universe.dm @@ -89,7 +89,7 @@ alm.explosion_act(2) /datum/universal_state/supermatter_cascade/proc/APCSet() - for (var/obj/machinery/power/apc/APC in SSmachines.machinery) + for (var/obj/machinery/apc/APC in SSmachines.machinery) if (!(APC.stat & BROKEN) && !APC.is_critical) APC.chargemode = 0 var/obj/item/cell/cell = APC.get_cell() diff --git a/mods/content/supermatter/machinery/supermatter.dm b/mods/content/supermatter/machinery/supermatter.dm index 2fb27aadac35..cdf92f1538df 100644 --- a/mods/content/supermatter/machinery/supermatter.dm +++ b/mods/content/supermatter/machinery/supermatter.dm @@ -318,7 +318,7 @@ var/global/list/supermatter_delam_accent_sounds = list( to_chat(mob, "An invisible force slams you against the ground!") // Effect 2: Z-level wide electrical pulse - for(var/obj/machinery/power/apc/A in SSmachines.machinery) + for(var/obj/machinery/apc/A in SSmachines.machinery) if(!(A.z in affected_z)) continue diff --git a/mods/gamemodes/mercenary/maps/mercenary_base.dmm b/mods/gamemodes/mercenary/maps/mercenary_base.dmm index 152355b9aab0..7386a3cd58a0 100644 --- a/mods/gamemodes/mercenary/maps/mercenary_base.dmm +++ b/mods/gamemodes/mercenary/maps/mercenary_base.dmm @@ -378,7 +378,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/power/apc/hyper{ +/obj/machinery/apc/hyper{ dir = 8; pixel_x = -21; req_access = list("ACCESS_MERCENARY") @@ -1143,7 +1143,7 @@ /turf/wall/titanium, /area/map_template/merc_shuttle/rear) "ch" = ( -/obj/machinery/power/apc/hyper{ +/obj/machinery/apc/hyper{ dir = 8; pixel_x = -21; req_access = list("ACCESS_MERCENARY") @@ -2360,7 +2360,7 @@ /turf/floor/plating, /area/map_template/merc_spawn) "HV" = ( -/obj/machinery/power/apc/high{ +/obj/machinery/apc/high{ pixel_y = -26 }, /obj/structure/cable, diff --git a/mods/species/ascent/machines/ship_machines.dm b/mods/species/ascent/machines/ship_machines.dm index 9db2e97943ca..9b9da51a4acf 100644 --- a/mods/species/ascent/machines/ship_machines.dm +++ b/mods/species/ascent/machines/ship_machines.dm @@ -1,4 +1,4 @@ -MANTIDIFY(/obj/machinery/power/apc/hyper, "mantid power node", "power controller") +MANTIDIFY(/obj/machinery/apc/hyper, "mantid power node", "power controller") MANTIDIFY(/obj/machinery/atmospherics/unary/vent_pump/on, "mantid atmosphere outlet", "vent") MANTIDIFY(/obj/machinery/atmospherics/unary/vent_scrubber/on, "mantid atmosphere intake", "scrubber") MANTIDIFY(/obj/machinery/hologram/holopad/longrange, "mantid holopad", "holopad") diff --git a/tools/map_migrations/5151_power_apc.txt b/tools/map_migrations/5151_power_apc.txt new file mode 100644 index 000000000000..3725ae8b5d13 --- /dev/null +++ b/tools/map_migrations/5151_power_apc.txt @@ -0,0 +1,2 @@ +# APCs are no longer a subtype of /obj/machinery/power +/obj/machinery/power/apc/@SUBTYPES : /obj/machinery/apc/@SUBTYPES{@OLD} \ No newline at end of file From ac2e3f5f74236a7bf0ea634d530cdeba58b5dbf8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 9 Oct 2025 19:11:27 -0400 Subject: [PATCH 03/93] Clean up breaker box code --- .../programs/engineering/rcon_console.dm | 2 +- code/modules/power/breaker_box.dm | 112 ++++++++---------- 2 files changed, 52 insertions(+), 62 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm index 10e61aa1ff08..224d0cdccc59 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/rcon_console.dm @@ -95,7 +95,7 @@ if(breaker.RCon_tag == href_list["toggle_breaker"]) toggle = breaker if(toggle) - if(toggle.update_locked) + if(toggle.lock_time > world.time) to_chat(usr, "The breaker box was recently toggled. Please wait before toggling it again.") else toggle.auto_toggle() diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 9674fb2e47e8..2cd7d48af023 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -1,7 +1,6 @@ // Updated version of old powerswitch by Atlantis // Has better texture, and is now considered electronic device -// AI has ability to toggle it in 5 seconds -// Humans need 30 seconds (AI is faster when it comes to complex electronics) +// Requires 5 seconds to toggle and can be toggled once a minute // Used for advanced grid control (read: Substations) /obj/machinery/power/breakerbox @@ -9,24 +8,23 @@ icon = 'icons/obj/power.dmi' icon_state = "bbox_off" desc = "A large machine with heavy-duty switching circuits used for advanced grid control." - //directwired = 0 - var/icon_state_on = "bbox_on" - var/icon_state_off = "bbox_off" density = TRUE anchored = TRUE - var/on = 0 - var/busy = 0 - var/directions = list(1,2,4,8,5,6,9,10) - var/RCon_tag = "NO_TAG" - var/update_locked = 0 - construct_state = /decl/machine_construction/default/panel_closed stat_immune = 0 uncreated_component_parts = null base_type = /obj/machinery/power/breakerbox + var/icon_state_on = "bbox_on" + var/icon_state_off = "bbox_off" + var/on = FALSE + var/busy = FALSE + var/RCon_tag = "NO_TAG" + /// If world.time < lock_time, system is locked for interactions. + var/lock_time = 0 + /obj/machinery/power/breakerbox/activated - icon_state = "bbox_on" + icon_state = parent_type::icon_state_on // Enabled on server startup. Used in substations to keep them in bypass mode. /obj/machinery/power/breakerbox/activated/Initialize() @@ -34,75 +32,69 @@ return INITIALIZE_HINT_LATELOAD /obj/machinery/power/breakerbox/activated/LateInitialize() - set_state(1) + set_state(TRUE) . = ..() /obj/machinery/power/breakerbox/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(on) - . += "It seems to be online." + . += SPAN_GOOD("It seems to be online.") else - . += "It seems to be offline." + . += SPAN_WARNING("It seems to be offline.") -/obj/machinery/power/breakerbox/attack_ai(mob/living/silicon/ai/user) - if(update_locked) +/obj/machinery/power/breakerbox/proc/try_toggle_state(mob/living/user, digital = FALSE) + if(lock_time < world.time) to_chat(user, SPAN_WARNING("System locked. Please try again later.")) - return - - if(busy) - to_chat(user, SPAN_WARNING("System is busy. Please wait until current operation is finished before changing power settings.")) - return - - busy = 1 - to_chat(user, SPAN_GOOD("Updating power settings...")) - if(do_after(user, 50, src)) - set_state(!on) - to_chat(user, SPAN_GOOD("Update completed. New setting:[on ? "on": "off"]")) - update_locked = 1 - spawn(600) - update_locked = 0 - busy = 0 - -/obj/machinery/power/breakerbox/physical_attack_hand(mob/user) - if(update_locked) - to_chat(user, "System locked. Please try again later.") return TRUE if(busy) - to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.") + to_chat(user, SPAN_WARNING("System is busy. Please wait until current operation is finished before changing power settings.")) return TRUE - busy = 1 - user.visible_message(SPAN_NOTICE("\The [user] starts reprogramming \the [src]!")) - if(do_after(user, 50,src)) + busy = TRUE + if(digital) + to_chat(user, SPAN_GOOD("Updating power settings...")) + else + user.visible_message(SPAN_NOTICE("\The [user] starts reprogramming \the [src]!")) + if(do_after(user, 5 SECONDS, src)) set_state(!on) - user.visible_message( - SPAN_NOTICE("\The [user] [on ? "enabled" : "disabled"] \the [src]!"),\ - SPAN_NOTICE("You [on ? "enabled" : "disabled"] \the [src]!")) - update_locked = 1 - spawn(600) - update_locked = 0 - busy = 0 + if(digital) + to_chat(user, SPAN_GOOD("Update completed. New setting:[on ? "on": "off"]")) + else + user.visible_message( + SPAN_NOTICE("\The [user] [on ? "enabled" : "disabled"] \the [src]!"),\ + SPAN_NOTICE("You [on ? "enabled" : "disabled"] \the [src]!")) + lock_time = world.time + 1 MINUTE + busy = FALSE return TRUE -/obj/machinery/power/breakerbox/attackby(var/obj/item/used_item, var/mob/user) +/obj/machinery/power/breakerbox/attack_ai(mob/living/silicon/ai/user) + return try_toggle_state(user, digital = TRUE) + +/obj/machinery/power/breakerbox/physical_attack_hand(mob/user) + return try_toggle_state(user, digital = FALSE) + +/obj/machinery/power/breakerbox/attackby(obj/item/used_item, mob/user) if(IS_MULTITOOL(used_item)) var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text if(!CanPhysicallyInteract(user)) return TRUE if(newtag) RCon_tag = newtag - to_chat(user, "You changed the RCON tag to: [newtag]") + to_chat(user, SPAN_NOTICE("You changed the RCON tag to: [newtag]")) return TRUE - return ..() -/obj/machinery/power/breakerbox/proc/set_state(var/state) +/obj/machinery/power/breakerbox/on_update_icon() + . = ..() + icon_state = on ? icon_state_on : icon_state_off + +/obj/machinery/power/breakerbox/proc/set_state(state) on = state + update_icon() if(on) - icon_state = icon_state_on var/list/connection_dirs = list() - for(var/direction in directions) + for(var/direction in global.alldirs) for(var/obj/structure/cable/C in get_step(src,direction)) if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180)) connection_dirs += direction @@ -112,7 +104,7 @@ var/obj/structure/cable/C = new/obj/structure/cable(src.loc) C.d1 = 0 C.d2 = direction - C.icon_state = "[C.d1]-[C.d2]" + C.update_icon() C.breaker_box = src var/datum/powernet/PN = new() @@ -121,18 +113,16 @@ C.mergeConnectedNetworks(C.d2) C.mergeConnectedNetworksOnTurf() - if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + if(!IS_POWER_OF_TWO(C.d2))// if the cable is layed diagonally, check the others 2 possible directions C.mergeDiagonalsNetworks(C.d2) else - icon_state = icon_state_off for(var/obj/structure/cable/C in src.loc) qdel(C) // Used by RCON to toggle the breaker box. /obj/machinery/power/breakerbox/proc/auto_toggle() - if(!update_locked) - set_state(!on) - update_locked = 1 - spawn(600) - update_locked = 0 \ No newline at end of file + if(lock_time > world.time) + return FALSE // still on cooldown + set_state(!on) + lock_time = world.time + 1 MINUTE From b04c84ecb5d44b02e17b3a5317e1f531f74227e6 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 10 Oct 2025 12:19:58 +1100 Subject: [PATCH 04/93] Various supporting changes for modular map generator. --- code/_helpers/logging.dm | 6 ++++-- code/controllers/subsystems/mapping.dm | 7 ++++++- code/game/turfs/turf.dm | 2 +- code/modules/admin/verbs/map_template_loadverb.dm | 4 ++-- code/modules/maps/_map_template.dm | 2 ++ 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 7e476912b248..942d9d9807f7 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -212,6 +212,8 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" return json_encode(d) return d.get_log_info_line() +var/global/_gag_report_progress = 0 /proc/report_progress(var/progress_message) - admin_notice("[progress_message]", R_DEBUG) - log_world(progress_message) + if(global._gag_report_progress <= 0) + admin_notice("[progress_message]", R_DEBUG) + to_world_log(progress_message) diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index cdba384cdf85..bcf8a6922368 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -10,6 +10,7 @@ SUBSYSTEM_DEF(mapping) var/list/submaps = list() var/list/map_templates_by_category = list() var/list/map_templates_by_type = list() + var/list/spawnable_map_templates = list() var/list/banned_maps = list() var/list/banned_template_names = list() @@ -169,11 +170,15 @@ SUBSYSTEM_DEF(mapping) map_templates = SSmapping.map_templates map_templates_by_category = SSmapping.map_templates_by_category map_templates_by_type = SSmapping.map_templates_by_type + spawnable_map_templates = SSmapping.spawnable_map_templates /datum/controller/subsystem/mapping/proc/register_map_template(var/datum/map_template/map_template) if(!validate_map_template(map_template) || !map_template.preload()) return FALSE - map_templates[map_template.name] = map_template + map_templates[map_template.name] = map_template + map_templates_by_type[map_template.type] = map_template + if(map_template.is_spawnable) + spawnable_map_templates += map_template for(var/temple_cat in map_template.template_categories) // :3 LAZYINITLIST(map_templates_by_category[temple_cat]) LAZYSET(map_templates_by_category[temple_cat], map_template.name, map_template) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 285f4fc05c5c..a9a61db02d40 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -644,7 +644,7 @@ return zone.air?.graphic if(external_atmosphere_participation && is_outside()) var/datum/level_data/level = SSmapping.levels_by_z[z] - return level.exterior_atmosphere.graphic + return level.exterior_atmosphere?.graphic var/datum/gas_mixture/environment = return_air() return environment?.graphic diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index 6d5b6f65e481..d588df659e21 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -5,7 +5,7 @@ if (!check_rights(R_FUN)) return - var/map = input(usr, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template") as null|anything in SSmapping.map_templates + var/map = input(usr, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template") as null|anything in SSmapping.spawnable_map_templates if(!map) return @@ -37,7 +37,7 @@ to_chat(usr, "Please wait for the master controller to initialize before loading maps!") return - var/map = input(usr, "Choose a Map Template to place on a new zlevel","Place Map Template") as null|anything in SSmapping.map_templates + var/map = input(usr, "Choose a Map Template to place on a new zlevel","Place Map Template") as null|anything in SSmapping.spawnable_map_templates if(!map) return diff --git a/code/modules/maps/_map_template.dm b/code/modules/maps/_map_template.dm index f7a22eaf01fe..7f485c209677 100644 --- a/code/modules/maps/_map_template.dm +++ b/code/modules/maps/_map_template.dm @@ -26,6 +26,8 @@ var/list/template_categories ///The initial type of level_data to instantiate new z-level with initially. (Is replaced by whatever is in the map file.) If null, will use default. var/level_data_type + /// Whether or not this should show up for admin map spawning. + var/is_spawnable = TRUE /// Various tags used for selecting templates for placement on a map. var/template_tags = 0 From 4b3144a3cfbb0a02164a8a9a08d6172244937e70 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 23 Jan 2025 17:35:02 +1100 Subject: [PATCH 05/93] Added nails. --- code/modules/materials/material_stack_nail.dm | 16 ++++++++++ icons/obj/items/stacks/nails.dmi | Bin 0 -> 533 bytes .../blacksmithy/forging_step_billets.dm | 29 +++++++++--------- .../content/blacksmithy/forging_step_tools.dm | 4 +++ nebula.dme | 1 + 5 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 code/modules/materials/material_stack_nail.dm create mode 100644 icons/obj/items/stacks/nails.dmi diff --git a/code/modules/materials/material_stack_nail.dm b/code/modules/materials/material_stack_nail.dm new file mode 100644 index 000000000000..fb0efb778825 --- /dev/null +++ b/code/modules/materials/material_stack_nail.dm @@ -0,0 +1,16 @@ +/obj/item/stack/material/nail + name = "nails" + singular_name = "nail" + plural_name = "nails" + icon_state = "nail" + plural_icon_state = "nail-mult" + max_icon_state = "nail-max" + stack_merge_type = /obj/item/stack/material/nail + crafting_stack_type = /obj/item/stack/material/nail + icon = 'icons/obj/items/stacks/nails.dmi' + is_spawnable_type = TRUE + matter_multiplier = 0.05 // 20 per standard sheet + material = /decl/material/solid/metal/iron + +/obj/item/stack/material/nail/twelve + amount = 12 diff --git a/icons/obj/items/stacks/nails.dmi b/icons/obj/items/stacks/nails.dmi new file mode 100644 index 0000000000000000000000000000000000000000..10ba6ebcc9891aa17743b06b2a3a0c8298f685bd GIT binary patch literal 533 zcmV+w0_y#VP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+FEKMmiHkEOv#1!zHRR$E@Q^ln|*hu>zMuWd&D17qCMC!!j|I zF4~Y)0003nNklrJd$BNN!l5b?CRF`WS|P6G80e~k3H=SL*JvEcOL*Q@U&bn+i~VPlfkq$V zU%#Y3N}|82nB)ic!>Dr-S^KV$oJ0hq&M1#0g1Fdw2S^f`c|yvc`Am|;d4Uuc*SQW! zBF@1F<{QrMXBGDc4@4=hr-wXw5Sf|`e+kzm^WZ=m-O09$nFzu`iMOqHz$Xuu&Q)aK zJa}L`uOVYHlNXcv%!10mS Date: Thu, 9 Oct 2025 20:35:53 -0400 Subject: [PATCH 06/93] Make the supermatter crystal not a machine --- maps/away/unishi/unishi-2.dmm | 2 +- maps/away/unishi/unishi.dm | 8 +- maps/exodus/exodus-2.dmm | 2 +- maps/ministation/ministation-0.dmm | 2 +- mods/content/supermatter/_supermatter.dme | 3 +- .../supermatter/admin_setup_supermatter.dm | 2 +- mods/content/supermatter/datums/sm_codex.dm | 2 +- mods/content/supermatter/datums/sm_follow.dm | 2 +- .../supermatter/datums/sm_grief_fix.dm | 2 +- .../supermatter/datums/sm_subsystem.dm | 7 ++ .../supermatter/datums/sm_supply_drop.dm | 2 +- .../supermatter/datums/sm_supply_pack.dm | 2 +- .../supermatter/datums/supermatter_monitor.dm | 12 +-- .../overrides/sm_fuel_compressor.dm | 2 +- .../supermatter/overrides/sm_trader.dm | 2 +- .../overrides/sm_xenoarchaeology.dm | 4 +- .../supermatter_crystal.dm} | 79 ++++++++++--------- 17 files changed, 74 insertions(+), 61 deletions(-) create mode 100644 mods/content/supermatter/datums/sm_subsystem.dm rename mods/content/supermatter/{machinery/supermatter.dm => structures/supermatter_crystal.dm} (92%) diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 5f96d95191cc..d6e536822aa5 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -2727,7 +2727,7 @@ /area/unishi/smresearch) "ho" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, -/obj/machinery/power/supermatter/inert{ +/obj/structure/supermatter/inert{ color = "" }, /obj/machinery/mass_driver{ diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index 9876826f1ff6..665b85cc7ecf 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -49,12 +49,12 @@ landmark_tag = "nav_unishi_3" -/obj/machinery/power/supermatter/randomsample +/obj/structure/supermatter/randomsample name = "experimental supermatter sample" icon = 'icons/obj/supermatter_32.dmi' icon_state = "supermatter_shard" -/obj/machinery/power/supermatter/randomsample/Initialize() +/obj/structure/supermatter/randomsample/Initialize() . = ..() nitrogen_retardation_factor = rand(0.01, 1) //Higher == N2 slows reaction more thermal_release_modifier = rand(100, 1000000) //Higher == more heat released during reaction @@ -69,7 +69,7 @@ charging_factor = rand(0, 1) damage_rate_limit = rand( 1, 10) //damage rate cap at power = 300, scales linearly with power -/obj/machinery/power/supermatter/inert +/obj/structure/supermatter/inert name = "experimental supermatter sample" icon = 'icons/obj/supermatter_32.dmi' icon_state = "supermatter_shard" @@ -87,7 +87,7 @@ desc = "Are you sure you want to open this?" /obj/structure/closet/crate/secure/large/supermatter/experimentalsm/WillContain() - return list(/obj/machinery/power/supermatter/randomsample) + return list(/obj/structure/supermatter/randomsample) /obj/item/paper/prof1 name = "error log" info = " COMPUTER ID: 15231
Attempting recovery of document directory.
Three files recovered
Printing file (1/2)
... about your concerns. I told you that the shielding is strong enough to avoid ANY leaks of radiation or hazardous materials. The entire lab is 100% isolated from the ship in terms of even the air supply. Leave me and my students the fuck alone. Your job is to maintain the fucking reactor an !#@!dqma211.
File (2/3) Tested SM This thing has a lot of potential. It doesn't produce any measurable levels of gas, or even significant thermal signature. The potential is nearly limitless. We've had to fine tune our activation procedures as even a short beam of the emitter seems to activate this thing. CTI Engineering dept still won't fucking answer where they got this thing, but it's simply amazing. I've sent an ema #@^%da12k" diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index ee4834d3cee5..42b521da4439 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -56232,7 +56232,7 @@ /turf/floor/plating, /area/exodus/maintenance/portsolar) "cnh" = ( -/obj/machinery/power/supermatter, +/obj/structure/supermatter, /obj/machinery/mass_driver{ id_tag = "enginecore" }, diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 0d703c96b6de..d54f9cdb73f0 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -11507,7 +11507,7 @@ /turf/floor/tiled, /area/ministation/hall/n) "Qv" = ( -/obj/machinery/power/supermatter, +/obj/structure/supermatter, /obj/machinery/mass_driver{ id_tag = "eject" }, diff --git a/mods/content/supermatter/_supermatter.dme b/mods/content/supermatter/_supermatter.dme index fb6723cce50b..93f116effd95 100644 --- a/mods/content/supermatter/_supermatter.dme +++ b/mods/content/supermatter/_supermatter.dme @@ -7,6 +7,7 @@ #include "datums\sm_follow.dm" #include "datums\sm_grief_fix.dm" #include "datums\sm_looping_sound.dm" +#include "datums\sm_subsystem.dm" #include "datums\sm_supply_drop.dm" #include "datums\sm_supply_pack.dm" #include "datums\supermatter_monitor.dm" @@ -16,7 +17,6 @@ #include "items\sm_book.dm" #include "items\sm_grenade.dm" #include "machinery\sm_supply_beacon.dm" -#include "machinery\supermatter.dm" #include "machinery\supermatter_core_console.dm" #include "overrides\sm_fuel_compressor.dm" #include "overrides\sm_meteor.dm" @@ -26,5 +26,6 @@ #include "overrides\sm_unit_tests.dm" #include "overrides\sm_xenoarchaeology.dm" #include "structures\sm_closets.dm" +#include "structures\supermatter_crystal.dm" // END_INCLUDE #endif diff --git a/mods/content/supermatter/admin_setup_supermatter.dm b/mods/content/supermatter/admin_setup_supermatter.dm index 9664671e8361..e9de8a41e924 100644 --- a/mods/content/supermatter/admin_setup_supermatter.dm +++ b/mods/content/supermatter/admin_setup_supermatter.dm @@ -101,7 +101,7 @@ if(!last) return ENGINE_SETUP_DELAYED ..() - var/obj/machinery/power/supermatter/SM = locate() in get_turf(src) + var/obj/structure/supermatter/SM = locate() in get_turf(src) if(!SM) log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!") return ENGINE_SETUP_ERROR diff --git a/mods/content/supermatter/datums/sm_codex.dm b/mods/content/supermatter/datums/sm_codex.dm index 72810edb7a41..8dbf88ea7522 100644 --- a/mods/content/supermatter/datums/sm_codex.dm +++ b/mods/content/supermatter/datums/sm_codex.dm @@ -4,7 +4,7 @@ available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /datum/codex_entry/supermatter - associated_paths = list(/obj/machinery/power/supermatter) + associated_paths = list(/obj/structure/supermatter) mechanics_text = "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage. \ After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations. \ Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum.
\ diff --git a/mods/content/supermatter/datums/sm_follow.dm b/mods/content/supermatter/datums/sm_follow.dm index 5b221ad03d61..4f03605d61d7 100644 --- a/mods/content/supermatter/datums/sm_follow.dm +++ b/mods/content/supermatter/datums/sm_follow.dm @@ -1,3 +1,3 @@ /datum/follow_holder/supermatter sort_order = 10 - followed_type = /obj/machinery/power/supermatter \ No newline at end of file + followed_type = /obj/structure/supermatter \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_grief_fix.dm b/mods/content/supermatter/datums/sm_grief_fix.dm index 70dd9469abc1..12f2db8dbf2f 100644 --- a/mods/content/supermatter/datums/sm_grief_fix.dm +++ b/mods/content/supermatter/datums/sm_grief_fix.dm @@ -4,5 +4,5 @@ /decl/atmos_grief_fix_step/supermatter/act() // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. - for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) + for(var/obj/structure/supermatter/S in SSsupermatter.processing) S.power = 0 \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_subsystem.dm b/mods/content/supermatter/datums/sm_subsystem.dm new file mode 100644 index 000000000000..01b2c19da591 --- /dev/null +++ b/mods/content/supermatter/datums/sm_subsystem.dm @@ -0,0 +1,7 @@ +// A replacement for having the supermatter tick on SSmachinery, since it's no longer a machine. +PROCESSING_SUBSYSTEM_DEF(supermatter) + name = "Supermatter" + priority = SS_PRIORITY_MACHINERY + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + wait = 2 SECONDS \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_supply_drop.dm b/mods/content/supermatter/datums/sm_supply_drop.dm index 1560d1118d2c..fdff0e1d2fe2 100644 --- a/mods/content/supermatter/datums/sm_supply_drop.dm +++ b/mods/content/supermatter/datums/sm_supply_drop.dm @@ -2,4 +2,4 @@ name = "Supermatter" /datum/supply_drop_loot/supermatter/New() ..() - contents = list(/obj/machinery/power/supermatter) + contents = list(/obj/structure/supermatter) diff --git a/mods/content/supermatter/datums/sm_supply_pack.dm b/mods/content/supermatter/datums/sm_supply_pack.dm index 5261f06a0693..aa34afe44995 100644 --- a/mods/content/supermatter/datums/sm_supply_pack.dm +++ b/mods/content/supermatter/datums/sm_supply_pack.dm @@ -1,6 +1,6 @@ /decl/hierarchy/supply_pack/engineering/smbig name = "Power - Supermatter core" - contains = list(/obj/machinery/power/supermatter) + contains = list(/obj/structure/supermatter) containertype = /obj/structure/closet/crate/secure/large/supermatter containername = "\improper Supermatter crate (CAUTION)" access = access_ce \ No newline at end of file diff --git a/mods/content/supermatter/datums/supermatter_monitor.dm b/mods/content/supermatter/datums/supermatter_monitor.dm index 2c20605a6b16..73805c939678 100644 --- a/mods/content/supermatter/datums/supermatter_monitor.dm +++ b/mods/content/supermatter/datums/supermatter_monitor.dm @@ -32,7 +32,7 @@ /datum/nano_module/program/supermatter_monitor name = "Supermatter monitor" var/list/supermatters - var/obj/machinery/power/supermatter/active = null // Currently selected supermatter crystal. + var/obj/structure/supermatter/active = null // Currently selected supermatter crystal. var/screen = SM_MONITOR_SCREEN_MAIN // Which screen the monitor is currently on /datum/nano_module/program/supermatter_monitor/Destroy() @@ -44,7 +44,7 @@ ..() refresh() -/datum/nano_module/program/supermatter_monitor/proc/can_read(obj/machinery/power/supermatter/S) +/datum/nano_module/program/supermatter_monitor/proc/can_read(obj/structure/supermatter/S) if(!istype(S.loc, /turf/)) return FALSE if(S.exploded || S.grav_pulling) @@ -57,7 +57,7 @@ // Refreshes list of active supermatter crystals /datum/nano_module/program/supermatter_monitor/proc/refresh() supermatters = list() - for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) + for(var/obj/structure/supermatter/S in SSsupermatter.processing) // Delaminating, not within coverage, not on a tile. if(!can_read(S)) continue @@ -70,7 +70,7 @@ /datum/nano_module/program/supermatter_monitor/proc/get_status() . = SUPERMATTER_INACTIVE var/needs_refresh - for(var/obj/machinery/power/supermatter/S in supermatters) + for(var/obj/structure/supermatter/S in supermatters) if(!can_read(S)) needs_refresh = TRUE continue @@ -161,7 +161,7 @@ else var/list/SMS = list() var/needs_refresh //need to refresh because some of crystals are not readable. For finding new crystals user can just refresh manually like a scrub - for(var/obj/machinery/power/supermatter/S in supermatters) + for(var/obj/structure/supermatter/S in supermatters) var/area/A = get_area(S) if(!A) continue @@ -211,7 +211,7 @@ return 1 if( href_list["set"] ) var/newuid = text2num(href_list["set"]) - for(var/obj/machinery/power/supermatter/S in supermatters) + for(var/obj/structure/supermatter/S in supermatters) if(S.uid == newuid) active = S return 1 diff --git a/mods/content/supermatter/overrides/sm_fuel_compressor.dm b/mods/content/supermatter/overrides/sm_fuel_compressor.dm index e259fa266258..0207c648c6ef 100644 --- a/mods/content/supermatter/overrides/sm_fuel_compressor.dm +++ b/mods/content/supermatter/overrides/sm_fuel_compressor.dm @@ -2,7 +2,7 @@ . = ..() if(.) return TRUE - if(istype(thing, /obj/machinery/power/supermatter/shard)) + if(istype(thing, /obj/structure/supermatter/shard)) var/exotic_matter_amount = thing?.matter?[/decl/material/solid/exotic_matter] if(exotic_matter_amount <= 0) return FALSE diff --git a/mods/content/supermatter/overrides/sm_trader.dm b/mods/content/supermatter/overrides/sm_trader.dm index ded45374bd98..dbadf5961a79 100644 --- a/mods/content/supermatter/overrides/sm_trader.dm +++ b/mods/content/supermatter/overrides/sm_trader.dm @@ -1,3 +1,3 @@ /datum/trader/ship/unique/rock/New() ..() - possible_trading_items[/obj/machinery/power/supermatter] = TRADER_ALL \ No newline at end of file + possible_trading_items[/obj/structure/supermatter] = TRADER_ALL \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_xenoarchaeology.dm b/mods/content/supermatter/overrides/sm_xenoarchaeology.dm index 537de7a311cf..13861abcc41e 100644 --- a/mods/content/supermatter/overrides/sm_xenoarchaeology.dm +++ b/mods/content/supermatter/overrides/sm_xenoarchaeology.dm @@ -1,7 +1,7 @@ /datum/artifact_find/New() var/static/supermatter_injected = FALSE if(!supermatter_injected) - potential_finds[/obj/machinery/power/supermatter] = 5 - potential_finds[/obj/machinery/power/supermatter/shard] = 25 + potential_finds[/obj/structure/supermatter] = 5 + potential_finds[/obj/structure/supermatter/shard] = 25 supermatter_injected = TRUE ..() diff --git a/mods/content/supermatter/machinery/supermatter.dm b/mods/content/supermatter/structures/supermatter_crystal.dm similarity index 92% rename from mods/content/supermatter/machinery/supermatter.dm rename to mods/content/supermatter/structures/supermatter_crystal.dm index cdf92f1538df..cbd3e878fa57 100644 --- a/mods/content/supermatter/machinery/supermatter.dm +++ b/mods/content/supermatter/structures/supermatter_crystal.dm @@ -103,7 +103,7 @@ var/global/list/supermatter_delam_accent_sounds = list( var/rads = 500 SSradiation.radiate(source, rads) -/obj/machinery/power/supermatter +/obj/structure/supermatter name = "supermatter crystal" desc = "A strangely translucent and iridescent crystal. You get headaches just from looking at it." icon = 'icons/obj/supermatter_48.dmi' @@ -189,6 +189,9 @@ var/global/list/supermatter_delam_accent_sounds = list( var/datum/composite_sound/supermatter/soundloop + // A uniquely-identifying number assigned to this supermatter crystal. Mostly used by the supermatter monitoring console. + var/uid = 0 + var/damage_animation = FALSE //are we doing our damage animation? var/list/threshholds = list( // List of lists defining the amber/red labeling threshholds in readouts. Numbers are minminum red and amber and maximum amber and red, in that order @@ -198,26 +201,28 @@ var/global/list/supermatter_delam_accent_sounds = list( list("name" = SUPERMATTER_DATA_EPR, "min_h" = -1, "min_l" = 1.0, "max_l" = 2.5, "max_h" = 4.0) ) -/obj/machinery/power/supermatter/Initialize() +/obj/structure/supermatter/Initialize() . = ..() - uid = gl_uid++ + uid = sequential_id(/obj/structure/supermatter) soundloop = new(list(src), TRUE) update_icon() add_filter("outline", 1, list(type = "drop_shadow", size = 0, color = COLOR_WHITE, x = 0, y = 0)) + START_PROCESSING(SSsupermatter, src) -/obj/machinery/power/supermatter/Destroy() - . = ..() +/obj/structure/supermatter/Destroy() QDEL_NULL(soundloop) + STOP_PROCESSING(SSsupermatter, src) + . = ..() -/obj/machinery/power/supermatter/on_update_icon() +/obj/structure/supermatter/on_update_icon() . = ..() underlays.Cut() underlays += mutable_appearance(icon, "[icon_state]_underplate", flags = RESET_COLOR, plane = plane, layer = OBJ_LAYER) -/obj/machinery/power/supermatter/get_matter_amount_modifier() +/obj/structure/supermatter/get_matter_amount_modifier() . = ..() * (1/HOLLOW_OBJECT_MATTER_MULTIPLIER) * 10 // Big solid chunk of matter. -/obj/machinery/power/supermatter/proc/handle_admin_warnings() +/obj/structure/supermatter/proc/handle_admin_warnings() if(disable_adminwarn) return @@ -238,7 +243,7 @@ var/global/list/supermatter_delam_accent_sounds = list( else aw_EPR = FALSE -/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_webhook = FALSE) +/obj/structure/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_webhook = FALSE) var/status = get_status() if(status >= min_status) if(!current_state) @@ -249,7 +254,7 @@ var/global/list/supermatter_delam_accent_sounds = list( else return FALSE -/obj/machinery/power/supermatter/proc/get_epr() +/obj/structure/supermatter/proc/get_epr() var/turf/T = get_turf(src) if(!istype(T)) return @@ -258,7 +263,7 @@ var/global/list/supermatter_delam_accent_sounds = list( return 0 return round((air.total_moles / air.group_multiplier) / 23.1, 0.01) -/obj/machinery/power/supermatter/proc/get_status() +/obj/structure/supermatter/proc/get_status() var/turf/T = get_turf(src) if(!T) return SUPERMATTER_ERROR @@ -286,7 +291,7 @@ var/global/list/supermatter_delam_accent_sounds = list( return SUPERMATTER_INACTIVE -/obj/machinery/power/supermatter/proc/explode() +/obj/structure/supermatter/proc/explode() set waitfor = 0 if(exploded) @@ -354,7 +359,7 @@ var/global/list/supermatter_delam_accent_sounds = list( explosion(TS, explosion_power/2, explosion_power, explosion_power * 2, explosion_power * 4, 1) qdel(src) -/obj/machinery/power/supermatter/get_examine_strings(mob/user, distance, infix, suffix) +/obj/structure/supermatter/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user.skill_check(SKILL_ENGINES, SKILL_EXPERT)) var/integrity_message @@ -373,19 +378,19 @@ var/global/list/supermatter_delam_accent_sounds = list( . += "Eyeballing it, you place the relative EER at around [display_power] MeV/cm3." //Changes color and luminosity of the light to these values if they were not already set -/obj/machinery/power/supermatter/proc/shift_light(var/lum, var/clr) +/obj/structure/supermatter/proc/shift_light(var/lum, var/clr) if(lum != light_range || abs(power - last_power) > 10 || clr != light_color) set_light(lum, LIGHT_POWER_CALC, clr) last_power = power -/obj/machinery/power/supermatter/proc/get_integrity() +/obj/structure/supermatter/proc/get_integrity() var/integrity = damage / explosion_point integrity = round(100 - integrity * 100) integrity = integrity < 0 ? 0 : integrity return integrity -/obj/machinery/power/supermatter/proc/announce_warning() +/obj/structure/supermatter/proc/announce_warning() var/integrity = get_integrity() var/alert_msg = " Integrity at [integrity]%" @@ -418,7 +423,7 @@ var/global/list/supermatter_delam_accent_sounds = list( public_alert = 0 -/obj/machinery/power/supermatter/Process() +/obj/structure/supermatter/Process() var/turf/L = loc if(isnull(L)) // We have a null turf...something is wrong, stop processing this entity. @@ -553,7 +558,7 @@ var/global/list/supermatter_delam_accent_sounds = list( return 1 -/obj/machinery/power/supermatter/proc/start_damage_animation() +/obj/structure/supermatter/proc/start_damage_animation() if(damage_animation) return if(!get_filter("rays")) @@ -565,10 +570,10 @@ var/global/list/supermatter_delam_accent_sounds = list( animate(time = 2 SECONDS, size = 10, loop=-1, flags = ANIMATION_PARALLEL) addtimer(CALLBACK(src, PROC_REF(finish_damage_animation)), 12 SECONDS) -/obj/machinery/power/supermatter/proc/finish_damage_animation() +/obj/structure/supermatter/proc/finish_damage_animation() damage_animation = FALSE -/obj/machinery/power/supermatter/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/supermatter/bullet_act(var/obj/item/projectile/Proj) var/turf/L = loc if(!istype(L)) // We don't run process() when we are in space return 0 // This stops people from being able to really power up the supermatter @@ -582,23 +587,23 @@ var/global/list/supermatter_delam_accent_sounds = list( damage += proj_damage * config_bullet_energy return 0 -/obj/machinery/power/supermatter/attack_robot(mob/user) +/obj/structure/supermatter/attack_robot(mob/user) ui_interact(user) return TRUE -/obj/machinery/power/supermatter/attack_ai(mob/living/silicon/ai/user) +/obj/structure/supermatter/attack_ai(mob/living/silicon/ai/user) ui_interact(user) return TRUE -/obj/machinery/power/supermatter/attack_ghost(mob/user) +/obj/structure/supermatter/attack_ghost(mob/user) ui_interact(user) return TRUE -/obj/machinery/power/supermatter/attack_hand(mob/user) +/obj/structure/supermatter/attack_hand(mob/user) return Consume(null, user, TRUE) || ..() // This is purely informational UI that may be accessed by AIs or robots -/obj/machinery/power/supermatter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/structure/supermatter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] data["integrity_percentage"] = round(get_integrity()) @@ -624,7 +629,7 @@ var/global/list/supermatter_delam_accent_sounds = list( ui.open() ui.set_auto_update(1) -/obj/machinery/power/supermatter/attackby(obj/item/used_item, mob/user) +/obj/structure/supermatter/attackby(obj/item/used_item, mob/user) if(istype(used_item, /obj/item/stack/tape_roll/duct_tape)) var/obj/item/stack/tape_roll/duct_tape/T = used_item @@ -648,11 +653,11 @@ var/global/list/supermatter_delam_accent_sounds = list( user.apply_damage(150, IRRADIATE, damage_flags = DAM_DISPERSED) return TRUE -/obj/machinery/power/supermatter/Bumped(atom/AM) +/obj/structure/supermatter/Bumped(atom/AM) if(!Consume(null, AM)) return ..() -/obj/machinery/power/supermatter/proc/Consume(var/mob/living/user, var/obj/item/thing, var/touched) +/obj/structure/supermatter/proc/Consume(var/mob/living/user, var/obj/item/thing, var/touched) . = try_supermatter_consume(user, thing, src, touched) if(. <= 0) return @@ -663,19 +668,19 @@ var/global/list/supermatter_delam_accent_sounds = list( for(var/atom/A in range(pull_range, target)) A.singularity_pull(target, pull_power) -/obj/machinery/power/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow +/obj/structure/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow return -/obj/machinery/power/supermatter/RepelAirflowDest(n) +/obj/structure/supermatter/RepelAirflowDest(n) return -/obj/machinery/power/supermatter/explosion_act(var/severity) +/obj/structure/supermatter/explosion_act(var/severity) . = ..() if(.) power *= max(1, 5 - severity) log_and_message_admins("WARN: Explosion near the Supermatter! New EER: [power].") -/obj/machinery/power/supermatter/singularity_act() +/obj/structure/supermatter/singularity_act() if(!src.loc) return @@ -689,10 +694,10 @@ var/global/list/supermatter_delam_accent_sounds = list( qdel(src) return 50000 -/obj/machinery/power/supermatter/get_artifact_scan_data() +/obj/structure/supermatter/get_artifact_scan_data() return "Superdense crystalline structure - appears to have been shaped or hewn, lattice is approximately 20 times denser than should be possible." -/obj/machinery/power/supermatter/shard //Small subtype, less efficient and more sensitive, but less boom. +/obj/structure/supermatter/shard //Small subtype, less efficient and more sensitive, but less boom. name = "supermatter shard" desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it." icon = 'icons/obj/supermatter_32.dmi' @@ -708,14 +713,14 @@ var/global/list/supermatter_delam_accent_sounds = list( pull_time = 150 explosion_power = 3 -/obj/machinery/power/supermatter/medium +/obj/structure/supermatter/medium icon = 'icons/obj/supermatter_32.dmi' w_class = (ITEM_SIZE_STRUCTURE + ITEM_SIZE_LARGE_STRUCTURE) / 2 // halfway between a shard and a normal SM -/obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements +/obj/structure/supermatter/shard/announce_warning() //Shards don't get announcements return -/obj/machinery/power/supermatter/shard/singularity_act() +/obj/structure/supermatter/shard/singularity_act() src.forceMove(null) qdel(src) return 5000 From 1b1f08d6bddb2713875ac9a5edc606d9f7dac287 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 11 Oct 2025 11:45:24 -0400 Subject: [PATCH 07/93] Fix the supermatter crystal melting --- mods/content/supermatter/_supermatter.dme | 1 + mods/content/supermatter/datums/sm_material.dm | 12 ++++++++++++ mods/content/supermatter/overrides/sm_strings.dm | 3 --- .../supermatter/structures/supermatter_crystal.dm | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 mods/content/supermatter/datums/sm_material.dm diff --git a/mods/content/supermatter/_supermatter.dme b/mods/content/supermatter/_supermatter.dme index 93f116effd95..abc090e244de 100644 --- a/mods/content/supermatter/_supermatter.dme +++ b/mods/content/supermatter/_supermatter.dme @@ -7,6 +7,7 @@ #include "datums\sm_follow.dm" #include "datums\sm_grief_fix.dm" #include "datums\sm_looping_sound.dm" +#include "datums\sm_material.dm" #include "datums\sm_subsystem.dm" #include "datums\sm_supply_drop.dm" #include "datums\sm_supply_pack.dm" diff --git a/mods/content/supermatter/datums/sm_material.dm b/mods/content/supermatter/datums/sm_material.dm new file mode 100644 index 000000000000..92d8b1c3d51e --- /dev/null +++ b/mods/content/supermatter/datums/sm_material.dm @@ -0,0 +1,12 @@ +/decl/material/solid/exotic_matter/supermatter + name = "supermatter" + uid = "solid_supermatter" + lore_text = "Hypercrystalline supermatter is a subset of non-baryonic 'exotic' matter with unusual properties that make it desirable for energy generation, and also very dangerous." + accelerant_value = FUEL_VALUE_NONE + vapor_products = null + melting_point = null + gas_flags = null + ignition_point = null + gas_symbol_html = "Sp*" + gas_symbol = "Sp*" + default_solid_form = /obj/item/stack/material/gemstone \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_strings.dm b/mods/content/supermatter/overrides/sm_strings.dm index 2d7427f03d3d..72413b05d274 100644 --- a/mods/content/supermatter/overrides/sm_strings.dm +++ b/mods/content/supermatter/overrides/sm_strings.dm @@ -14,6 +14,3 @@ . = ..() . += "a supermatter engine" return . - -/decl/material/solid/exotic_matter - lore_text = "Hypercrystalline supermatter is a subset of non-baryonic 'exotic' matter. It is found mostly in the heart of large stars, and features heavily in all kinds of fringe physics-defying technology." \ No newline at end of file diff --git a/mods/content/supermatter/structures/supermatter_crystal.dm b/mods/content/supermatter/structures/supermatter_crystal.dm index cbd3e878fa57..415212605f44 100644 --- a/mods/content/supermatter/structures/supermatter_crystal.dm +++ b/mods/content/supermatter/structures/supermatter_crystal.dm @@ -112,8 +112,8 @@ var/global/list/supermatter_delam_accent_sounds = list( anchored = FALSE light_range = 4 layer = ABOVE_HUMAN_LAYER + material = /decl/material/solid/exotic_matter/supermatter matter = list( - /decl/material/solid/exotic_matter = MATTER_AMOUNT_PRIMARY, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) w_class = ITEM_SIZE_LARGE_STRUCTURE From 9151a170e59ef4a31fa8f9bd0788cc92f5a3a1e2 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 11 Oct 2025 11:58:49 -0400 Subject: [PATCH 08/93] Remove the last vestiges of struts --- .../crafting/stack_recipes/recipes_rods.dm | 1 - .../designs/general/designs_general.dm | 36 ++++-------------- .../materials/material_sheets_mapping.dm | 5 --- code/modules/materials/material_stack_misc.dm | 10 ----- icons/obj/items/stacks/materials.dmi | Bin 15853 -> 13892 bytes 5 files changed, 8 insertions(+), 44 deletions(-) diff --git a/code/modules/crafting/stack_recipes/recipes_rods.dm b/code/modules/crafting/stack_recipes/recipes_rods.dm index 8483c2346746..4b506210b577 100644 --- a/code/modules/crafting/stack_recipes/recipes_rods.dm +++ b/code/modules/crafting/stack_recipes/recipes_rods.dm @@ -2,7 +2,6 @@ abstract_type = /decl/stack_recipe/rods craft_stack_types = list( /obj/item/stack/material/rods, - /obj/item/stack/material/strut, /obj/item/stack/material/bone ) one_per_turf = TRUE diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 4e09933a75e8..55d33d3e2941 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -116,44 +116,24 @@ /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) ) -/datum/fabricator_recipe/struts - name = "strut, steel" +/datum/fabricator_recipe/rods + name = "rod, steel" path = /obj/item/stack/material/rods/mapped/steel -/datum/fabricator_recipe/struts/get_resources() - resources = list( - /decl/material/solid/metal/steel = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)), - ) - -/datum/fabricator_recipe/struts/plastic - name = "strut, plastic" +/datum/fabricator_recipe/rods/plastic + name = "rod, plastic" path = /obj/item/stack/material/rods/mapped/plastic -/datum/fabricator_recipe/struts/plastic/get_resources() - resources = list( - /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)), - ) - -/datum/fabricator_recipe/struts/aluminium - name = "strut, aluminium" +/datum/fabricator_recipe/rods/aluminium + name = "rod, aluminium" path = /obj/item/stack/material/rods/mapped/aluminium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) -/datum/fabricator_recipe/struts/aluminium/get_resources() - resources = list( - /decl/material/solid/metal/aluminium = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)), - ) - -/datum/fabricator_recipe/struts/titanium - name = "strut, titanium" +/datum/fabricator_recipe/rods/titanium + name = "rod, titanium" path = /obj/item/stack/material/rods/mapped/titanium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) -/datum/fabricator_recipe/struts/titanium/get_resources() - resources = list( - /decl/material/solid/metal/titanium = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)), - ) - /datum/fabricator_recipe/umbrella path = /obj/item/umbrella diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 49be21fa79f4..710db635acf5 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -109,11 +109,6 @@ STACK_SUBTYPES(beige, "beige cloth", solid/organic/cl STACK_SUBTYPES(lime, "lime cloth", solid/organic/cloth, bolt/lime, null) STACK_SUBTYPES(red, "red cloth", solid/organic/cloth, bolt/red, null) -STACK_SUBTYPES(steel, "steel", solid/metal/steel, strut, null) -STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, strut, null) -STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, strut, null) -STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, strut, null) - STACK_SUBTYPES(steel, "steel", solid/metal/steel, rods, null) STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, rods, null) STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, rods, null) diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index a9d5c479118b..afd7fbfe51ab 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -154,13 +154,3 @@ material = /decl/material/solid/organic/plantmatter/grass/dry drying_wetness = null dried_type = null - -/obj/item/stack/material/strut - name = "struts" - singular_name = "strut" - plural_name = "struts" - icon_state = "sheet-strut" - plural_icon_state = "sheet-strut-mult" - max_icon_state = "sheet-strut-max" - stack_merge_type = /obj/item/stack/material/strut - crafting_stack_type = /obj/item/stack/material/strut diff --git a/icons/obj/items/stacks/materials.dmi b/icons/obj/items/stacks/materials.dmi index cd2d910889527712fba723711f3ea8f23854da06..c6127f7fbf61f4620914d2914f4f56fed876c980 100644 GIT binary patch literal 13892 zcmb7rXH*kT^kqVTPy|9(BoG2fktQJ0455c29YN_L0!laZ0HOCP3MxpiQbds6yV60W zcciyS3w`77zkAMp*f0Ab=SaW4C)ta4wwf_1;xBDK7i{8Is|5z@ zk6!wF)e2K`yBA)m!Xi4qh5EmFBzp`x-H+(ly1L1Q_r22H9P2Fxq$I zJh*%=YXnCiyC&=21-kVsvAK-C9Fh50lPKBWK@z5a@8&(9*?l`L1tGebB)65}%_xyR z9X)`5)sCtEB+`nSj-nu&HiT(2$ZZtj-KzGeUdoDrNiGX%M>Lf@e8u(Uo}$n2NJpyP ze%70x$Guik5=nq^Bqxch@nb3#pu>y0>|l;BtYT__)LVBlIhe>O+0`V;XJvI%A19jf zNs^y(D{iNYyGV)=e<0%$%}jd>A&x6R61jdX8tgHH2{>^D*1p&TleI6Y(0vyZA$y4i z{Ip!YJiaO?CJ8r$z5UIBX9s&P`Tk}sL|FNry|{i* zSLPA!h`)V6qF2|R{b5S>7yuBrR#TEU@JicBryPbFzTG=X@gySWB8~__(lPwKnLwrx zAtGAXp`pTh^FkJq&9BAOabc7OQ|o*AZZB4#hszcsW}Uaz%0mh+fj>WYrd z=8Ym&%)On-tG*|ySr3dFxM-$)n`NWG-`Hdo`Se&% z6|^Y2x_BvZ45|5{V25mK&U~&4pQQ`bVRML*Yhf{IjHv1)^Rv_22VrfrvgMOskTzj zN}p6Jg+3xzNSe-?QZ>X$LO@X&Tw%(yPv+X)=I}GnU*zS=>-J--jo}-2UwxXY+Wo_$ zqEhL)`06hLJpL7sFHXKhPkV+))rtgC?q8qQw+-G);9A^cY2>qs#4T2%*)K9a z>+9FOzFs5I@|*pr?|u0z@AI6ORsqXS^)TE_Jsi+&oX z+BQp{eq2wN{?m8dT51e*nZNF`TYNjt<1s2VIXEmf`i*Ep&}BS2ACh(1+@5@WXW)bT zexd8~om9U9Hp_gibQ_O3?{PSXbW#C5`nDl?YvmAPdhT7o;9@wt6aH=yRPEnnu7za= zP|_MJZ)ET1mne9RurNy9w!r!Q#KMFiY40mvyw4kYX#2_QS)>$xK?*1RbX9$qVLLH= z*Ze+uVp!K&C4SPqyC0+)dsAvOX5O87Z2Upzja$;4H`o!fbRW(76F3z6BWQDSW+?l@ zKaAvfioQX7(cTWiN2iO%Er<^!faIY;m8 zBZevzwoeb%J}O5ub!7yf;+A`Qw&pMg1HkDev5J`LKhp<}C-VW<@&P8K>i23vWKUvN zalCIA<2tm!MP`Sd%C$>TeUv=~KHBf`5-q;_ZN?awq$vg_n;C(}#t{)OwxNG-g9@}# zMdo6lHJ@+Yilm7gNN8R^XKfOZdvRzi=78^A-#MSh?M&Awm+!pjE}{8oG~Qxb7%0Jo zz$+|Af2y%QjT)G@?OK_BCet`HreY72TuD&uKNyl@51?+9y<*dmA;a96f9E_@6MH2W z+&T7u;}!CW4z%0WmWGx++n|b?7fJ38!jY+}Ib-IlpNK z%$D|x>FQF_hmf(nA%vBL^DYe>K^&PNoC_s$6y^h%9{weRm99;PqmjwaCTx8a+Lp8E zr}^Tk+^<9nn(HiUy96!a$X0G zOn-?n?%B$V>i4vq;i`k(N@cdTm9ER(UX#amZNuyL9q=v(zo(r)c+Pvv(0zFHqAR*@ zsp{4Gu$Aj0yLo%|7^SWEOTJCP;y7}7C~HJ6K=um1jJx6@hatj)hcxMt&4TYH15B9w zX$%UeH)PmWzuP2CS9IlLrNsND?$~(!q6(S4=V40ORYfiH4ztx=jaO5jD{lLo6>%r_#)vCsCp(Pe z8s0xVnGsVT3R5{~=+Rnlp1&CXeIju}6WdvEc%<@byzIX3UX$mh4|@Neb+=`86`5KA zEQtu~h@b!KeZKc*O0f@Ljpzbra>DZ#9$3FCa;@#uh_)He`oWZUYI_q zeRDjh7pTkcF$DGO90U`ENGIM6CNBKe^zBb+&77#rj`)wpi@zE;X4~`Qci#I~;G7Mn zgQ=|+@kHgQlvq}&cFhUz?DtZuX39DYshE~z{P*doIjo6Y!G9} z;uCxn;Z#=nJ{Qv20-~#Wvg+x-BU7BH5LJA!))K2BC$`M>hRF@7mY&mcp8M2U|li< zKG0eT`Q15wrI{h|OEdM0iKz?QeIHFs?9k@hp%Yd6$&bF8AHErFJlsJhk;$X+KJ53h zsmBnXyJRviPcbsSzRiNwebdzmLg(D0jHVvHmecY_Vz&J^?>o&% zR<3<|vlLAku3R*}dNL>W@$A7-%l^ezs*&ugrjtvTJZ)Jx?b4oNC(QNx8RltED6hS5 zii84JcHERY9l!+nWi}3vnap&oFq^AStpa!iy}WJewH_J4fr?4o*nB`m~pi2 zGqyOy#+X91dZw53J5M1XVzMR01NQ6BEw}vUmwX@ZeBG)w##B2_zvx!tW4ja&n0t(tS3hRMpYHu zNLp6t>6R#*9InPRWEau+sU+er4rRJd5`*OJ1|KfR-~%3Yt%@#z4zmu`;YmcPB;}#| zQ>eo8FWX+;i;903Ht;i#P9ygEpzj!2Z!^O3baiZVE&PM#AF_$EwT!V^R*_$o*pw8| zN{d)jkqwO9l|eAm`}@%d7M#fXPi|oqvf{N28HN(@$sFZ58uXGf{?IP);l{*%l%DWH zA?BxpbOQ`YU&0q62Y-Q-6`Wk+NYV$c6mWQOzCoem#L zmChcszNs6?xWdn`hQ8H!>0WG9B<#ba`MvAU^$EC?-PGeznd4B?I;L`geaMiOZedVn zFQ)tlVljlC#r5L$7B(pid*qi9C7LQrjY&XYM%8!>f8%;$ZjGJwsv_uy2*GpF4&SGp ztA_c@GWSke)t`?;SPVh!kcta62XRfZRh+?a9G_kk6WN1@w{S8Xh9Q1u8wJ+)kOgvQ>p71OI}p#8yJJf$tb2T%!Q?bp zyvu^mFe%Z-&HarKHlOt@c|X6oM(;oD-_>iQBGZ|y_RoT8{I4TRWmI$p-m)wnBtDz8 zrW?^ey=V7f%LS&KxNF(OCP!HW-~M9N@$~g-N~(?sYARC*t*9!rx^YX>I80hwu|l+Y_q4LiSS7J(4D4@sXn z{IAdFd-Q+$5khp9p%(m7^y(+yxoh2HK3P@^c(T`B(li=rq1clf9N9MOhs2!`$byW3 zv$d&do%$6DDG`hZ=EdC)OQAMiv=BDB41U&|Kybnl#iR0`wbsRjKs@{9y6Q4Ds)%&8 z2tp~3C3_ni%0d%jd%Qg zw%yq=3&cZEd3F{s*_Mkx!pqF96}21rANzm2y*qHYF$Rv%A_FV!g2%pU@gBV}Kwl}# z)$t()V!dOogS{hwR3j9)3K=QlsLlHm)e&SX?v{2mi+zFa3RA$tmzbZ5y*L<2n=qmi zP>_Lx58o<65P8)nrTp_Qu1;`!aLUdLuLA$=ik_wM5OVtdtZ+6KVUvny$^vW<_T8|* zL>!A{p&?|}WqyC(WW=o9>x%9KPahnIdLT``en@8Zvq17hUBq12Ab~c0Dc@>xw6w-* zC8{{h+UG4z_@6bvc3QtCcmSFh=51+z|Ea=o-MLIYUXYgh>6)ZO90bAvQQrYeL{rU$ z^c*Hbe1<=r1;9;3ejb_5mIFTkRkt zg+XGWl>*&)ELk>{o%ItSOf{I#Ow$fjVB_rEbAwN*nx4NM25g^%r@br)5>B^QSPRdQ zFSr8^nuduuTVyEil1#Vf)xrset#gCnjPpY6?Le+Py~5B0z{odY-qs+|b`Zy60z}@c zkn_!5c_7OYXe7(Mv9yZ4tmcIaSSdr%iSoc;YcX5@E$AyW-V;o$qYqqpG5r1B&?}Kz zrtnSqm3Os}OZ$$GxX_?7X7b-{fq5g8)Lc|E&vY4AL?arNjV+9juYs^NF^7pSK-b+T1(ErxR{CzEkfM$akDZEG*c}Xbs z19_v{ZweF0+D?(iC@hQ^6@Wi>L6rrMkGBQd{2MR!jrP^K>GZ6}bU<>Hn00pyqWBtM z9+Eex+-3Yz35LLbTsPzw3irfFW^(bgr6=uRf0$qPlMH)^RZEW4bAb&`)`;??VJs0> z<#96AJ1R*|-dM`)IBmGnv?6PiIe>SAu!1&VgU80E*i5B2Owxu0@a;Iqrle$|#h=mx z`laFH1uzuCsUh>G4XcisGveF###?XGbe@9qk9bL^mzFm%NeH8M!a;}X*kZ^TBXu6r zN`&BHj_v6?Plzm;J7{G0TbtMalu{`}b?g?U_8Je)n1oCv*W0xOg#UU&_rivzz3b@z zj%?&XQ>oa5U3Zn&*6On*e&+BNm$Y%|=7Hd~^k1XDaCC;lXtTYrlmIzSFb;R?wmrR5 ziMuPZS$|j{D(VrP`6ux6`G!AZuIPHPj5Ink&Xtb9U$nCEJzaqzUTg`^G5!TIg~iov z=@4+ALIh3EoUIV{LckcsK^>d21`OR^*P||pLrEsocc$>?yYW1i$xK)RIq)Q}U_S^T zGF{`Jf6FqUI!ONHo`c60zY=ke7AA>=Fk^?86cfm-=E{Kg%`nIuw(nD0FsdJwW)Um~ za}ylX!+of{%q;sx&?a}TjC;9sru492kTpTyS|M8E*=SAPRU$!skEMuS`uKAV$QP9z zq5@4w`slk`SCAe=(2;&;Upt|5($%-Mwd1v{Uw%kM4sPSTeHiu3< zy*rXBTZsDk-<9t#X6xOH^p(FyQzU@gAppr6E`(dYGkx|`5CLd}mDVNr5mCY{d`Lui zn0p>I5o`yUyL@+6ahbUHWcZ76!Y+0+-9ox~^dSQsObtwgp{6n+-k|0c#E#;86A4uH zPc!4{PR)E-*Dcg&q=2IfQ>L^e1jeT@3Kc;+m~Zj3$Zd$}@En{9yf<&#eVxum6!7P* z(c>xRH^`6iGP{zmPyeLYBJS2FfRffPX58~)f269q`oS)@EJ6W#rFW^KthL*EnI^s@Arl0Q zQWH<>>OR~#km=HXTF$_uZMzDyd4uYz#argaXwBEm5OM7wy##y>x|0H#I?Z$KR3 zi4sEMj&BTdkAd-jtPQ#a){D*0mCV#@^ybM=mWRHg|k^A z6IKAMkYV`T&m0Vgw!~$Uz9GKewL%#5sP^0$;aCKw7P!kkQY<2>m8{8TU}Rq~0IAbw zL5PwcpHxh@&7T*837j_lrHC>VHAl&nw>(Z;#B$@TjnT-|ilD=muU_5GePx*U%%&5( z!j#FCMV?L&82!G6h2^#IMWeyVOvnwq+Myd2=`JOlI7t&Q0J<>F5nM@9$bV+jMd$)E z0xwaXV{I4vV%0p6_Q2#gXZ`RkOD`%?9dM7aX(K6p_Hsjgd9FeK14JiSQYMq1H3BLo z+)S)f4^pShL|<^_mItfR0~_ur;y3ZiGt92T^5AcBoLkS3Mwmz%mtvsdA7ljAxcjX8 z_ujw7-QCQv*By~xoiv{Uu(_Zt z9@#sB;B?}N6UHHYyRd1k$ceqzyypzTmJD3p3^T1B2I)w`8^86n=47Lriv&4E2<^2M z{@!DIgto}szDFsDfTaNPE{SXePevs9MnA1-K1lW0#Af#2OYne=;xCnR;-dM2 zBWZefu%j%)=n6iC0%~I>dtgZpC@GhD_J0P^{{k=j%>Uq>DnNlw+GFY-C$N7R>w^pb z{$O;M(tUjRx@U?4;^J;*=(oY$1xAs>LPBR~H%-;X^6S&;;oK{=Z}XzWCZ$DR0>2Vx zQsk0|IBJSBvUk0GDw9d52DrPz?3Z%jxwY9uD@Ze9Wc`6gk5N6C5eDAWGk*JTs&9AY zNebnEDgz8L3>Jj|zPh4l0RL?8ClY-I<(M)wQk*4hsE3v}YAK_P9)`H{ZHf7OvR`c> z5i+`*k3qKHz^*b$~jJnH|ATK5|c#$-i4!KPnJ5S>D;z`l#7U1 zvhM$@B-eRImdQph_$u^EXnH44si5)d6x#+%1R7(X`-)%%FpZi@H(8vD{J3T8pa_RI zPPsgRBlV~|4Kam+UV9(ldeooRGGZM4qDu)~?5TFgEfz*`Kr|WHtxSRd}bf9J8k8wrp-sKq- zle)Rki0A*R;%I1DxR3}|)TCDYy&`4-V@QBUL3JVCKo#mA_zUSk4cBGLI9pEmsWOkl+$3bQ6 zOdejTv$3QEow9v=>dN^D^Tkxx)IJ6T-yh~_q?X-B9vqHo_viy?+kNv`9B_fWlUgV~ zu-;tmAA7#Ctz-9AHSDGV2!>mPhuHUmJ=FGE&=@4#I+})94cBpYv}MiFmgC&|_fOwI zvEk>XQ~R;}Z=qpVLuJ#<+?^-FHGp4vq?H~!Q^12B_JGE^t+IwCd(?kECRL5!w^5gZ z-Qmf=xXE63-*!&@$LIy`ls6qel?^Rqb!i3SD;%xnY|gXcoh<AtrYp=NM1iS%<0_-!Xo-$8z+|c6AI(Mov#3NTxoy6OHw!#w}iE z%rSf4sjdX5ja&XMHF;n+`EA_%)u7Z`n%7gt(fg1Mya8Iv&2m2 zwQ6v4cNZuq$XGl+rSI70`{wmqG6;umFwkB>5gx)S&h=lv3i}ilD><;6_c~+*b(@9Xpq#fVsviJ!Ifa+P><+1nX zE#|ML!^_g8bkN8(Hpyxizn*ri>2i!z>Z=o6AI6(v?&Nbh0M0L#*{^GV9@{J|XL3t% z7^!E3mDiIhY87lI-z6s?n8AhkNX{RQ!XJS;0-7A?^;T50sXix>LRAl&uVf@#itz&4 z>Ob22_ei-$IQSv;(L;KDoO71wP{s(?vgkw0aw< z22{D!xHlAYhMj_XX@WuNFReZai7jSmz*F9BE;xJ57Dn*?#)->j*3*1>rBEhG36VZRb-3a&qAM?HI$G|bUNWIU*RM{RvrWs0pf>e;Mz2Z1sv^_G#>>GcBD zqJ}>@H%r+)S=ZlFL;Xf_EfcQ#FG-RT$BL7c1RVR^`X+=rGp=2xLXf|Diw_>D-@r!N5wg?K8Ic{NZMQqU${k&q_+JI3yk zSB8sl7KC!*Xrt`6I{?+yuYOOG%0Nq6|1Jn0!sfXNQp*3s(3ddx2#fIL`JLg4%J}=* zBz5Zv6DzaL0<{;dJX%Ctmt9FQ7U79}zNh#Tx|PQ;7IZ01%O$bxj~@;eAv*H`JV3&j z$#KG$Y1SK;DRJ|Z3{ulZzb4xt^8o}Bqu_I$w|qiT7P`YfNF7Gtlfeo9kg_S{v*k}i zOX)-tY!xXynk^vjwyPU*lz)1wrPb%+ty7LOZmDb3v6q0O>+Xm6yUq5=0KTYEGjXTq z2Fe61Wc*L!1?n*<-}tY{>-PZj_NSEtT3PpE zJXfM*32NPuiXukk#11}^&x%ytClf!TvU>@$*whPt^7XlzY~H<1?(TdehAx^xK7wNU zVlYh#ly3*_>{$!0VN@<6U8}Ubu*Vm+4ZD;m_k?-;S(Cf=mNlz!n#J1x%E>tv9k&SZ zJJ0`l|JCo*XyIn#AxZvF7be&S%MJ2@0=df#;~2Xr4@<57 zk4eh>=6iZM*|7rc2X~FiVhR8`6Xre}d4h~tyTnUk&pIRY;47w}q_Q?0RdJ+P2Ik8ua;B}MiqGZZD?3T$vmT9{yTBg<7W0(LVl{pRf-EC&H}0i z+JQVB9<7Y1vO6vsj!U4b;yZ0;YF)#W3VYZ7c@Yc|3Q}Ns+_hflBE8~2eCsnBsRz~7 z1MJs8B!lApsGS;dDhC$_Lp``*(hqw~!xh@n8(hJC+PO-+pQ*g!{}^j4Fx00jhEqF6 z)4*tbcI(#CmZb|Ulik{Y@)$dHE#5;|XyYnqr1F(QR%RT^T7cVK360#uG)re2m`WD# z>F3`hV~_6(-6IHWFDco8fy5XA{@k#M_}+9zt*%0SsKTfQXZOEs(JG}EQ;Gx0UH5XAQBX}n!9mERBy;oNdrU3c`` zWFU;{cA8wlaFZqG=8I|C&~6V|NM?d^by1gHoQ%{eiNaaG~Z+GVN zwfZLqvbM(D5_3u7I57IXi_Ih2i|`{Poq96JfeVgb2ZC#sMF$1H7~PG}B68!m9&7GnY0JM=N<%ZF)t4 zlaY5^ZLw3s=FZ=&hTYg5dx@45;Yv#fKkk+@oRzfOw!x5UTD;=o65k#kJ&K4+U2{mN z0wfrZthvxujmgQ(=A@>!M=F=yjT?}wA)5hairD}Y+pE`WoBeS+gCFmNnR5N8;#PA} zv*YAZbQIy3P9QP62GhcElkVeY1I_{G(?Gc-Z-RfAAE>!0a1^=KGS5Tr?G@SC1Cbvj z03+S_Hl)9nbM^m1y#9`RySckC#c=kzZl^U*srW|*jn zl`6yc%7@V zx&lq@EYw#Oc;n{6Z15OhIxU}}tn3n{;kanKxX_7b9L7e&*57{4158=+4rLWP9KNUt|6yc9@h6GugHgoggmCNvhh>8{?(<{H>#IvNSTga@^dP%FE(7GE`0HhL%mo zUl+^`Eei$+!eMV4JAL~Siyuyq=Tb`2nF`d3F#2U5L5#^5l3b3d#%BsIb#?VVaFMBA z=c>z=WpG0#@j*g_qB5jKb3$%!aewkVp8S2fmNCyp#3Fk?)IG*O%`rsByA z#PSJk8VO32WT}i&u|>xrf<`Ec$gu978f|N`9_%TTbaT4TL&A%f{9=QWvUWvWdE;O8 zH&t`C{HV)lgji8`M=01mt5|PDRFXX5IYshnJ><60v&S3VcQjKW@zDb^77TK=WGHEf z%uz8v7^O}@ZHR_Fn+wE&`Hn=-xCoO8#<>LnS^hz z#=GNSXGb)&{M}3sw`~pK6Y}`&ley`Iv#q`5afAkbG^D41a~bzWS^`QbBujS$BZyZ? zL29{3Z_{yIRj6Un?el|->lx4M%aa-iv(iC+R3*~%aQh@n>C2mac`ulPA(>TyMZmm$ zm>{OHTVI(Ug@Y;GB&Hi~y)oLZXyC!52`BlnRnJ8+3So_a44hwVb0sO!7;pqVX%F}I zr+UojG|Ut-d_>h5NSUZk@+M?G>TX$~fIl6C%{+wqQ;_r$*N_ z3{O=hn1GmWS5>SCxcn?sqMjS%fnf!qJvxh|5zgQKCNMH&?rvEYMzR{ku-$i4qeu}^vwlio}lngxC-q! z<7n)WXnIIF1xJaG@f{PqgF*qJ`4|?|K*$|WwWH$Kc@_RW8BM6U4?w})r<%`%E zQ`Iz0Q|?9y=eFo4;p*@u7A**K6}Ul&iY)EOFZWOv>!@rl3x@Z$W-NpE2~nia?Vo}B zB0lxhWLjj(8*n+iv_O0|uNKk{-e!-hv{bI7`WIlPEe7eY`n0J0B+%{+t^dfk;(t7x z#RT+~{kOq5PcvUslGcA||LVdWYaT{rwR~41rKMosW|tnBGWphJKw0zI%aX^mddZ{& z7=2=|ZOBJE>-|cO8q4|)A#M0T zV4!%#!A@(k4{-6ltap<4VIt2!Y0cGC|3i$&)}rdC`{7Utv(6*)fXgFCTG_3V%AekA zxd|Y3I--;#n?+8s`Ut%TV;Wl6Xd0!pjH?Z_nD^d84u#bbRino~H(;_}X8xytR?}V& z-b;16r}y>y4mOE2mnTJWHzJ;K<=kq2CXoAESKQiIppAU`BH<}1)9J6zAL+>+CE-g< zPKuw@9LKMI>5yY}rWbTJthk1J_?M5y)tXW=35fKtzSeAH?Q7l-6|VY8?w&s!8euq& zH6`C^MM9KE2)>J67DrpX!HzNOhH_>)@3ym!$nR|es(#K(iQ@XEa{PHM6O zm`ZOoH?P(o#^ql|kCoa<%@f{@o@8{k2fO3tQ)O+QeQ#pDv2*g_{;U3M<>+VQAQ&R! z`eJRlvaPCwV)Tl}Fao0O-iPT?&$INPm3~g~jx>@Zo_RD-Egv8&A^jnQ9;G3Jj6jF% ziOHWw`f1Uz_X{_l1Sa`PLy8X|6RMJ#(DXUY41{0nF@*2p5%0YO&1)EqI zux*)Rnsblk*azKC;5~vQGvyU^*(I9~VcS0EPBEqHO#I1l*>Ufa?CGH~X8*eF9EGLu zdz{74ujN~a>>m%;Y~xkYlTUNryNxD`WN6)uc+8}s2W`bC&OT^}8viw#P5IXFA=A3h0X zO-MhUSc24(^)KiB%2B{lYmXJ{W4Xq=WUR?}65e?%jL+SNx^h3-uDG5sLTV+%c?%4V zFr3F}Eslj|2j>hDeF>NtU&nX$iKL6#s0-ZSU{y;z6y}ob#>)ZD%t<|wtdW(L9uzO4 z)675=i9yQz^AB>J(Vu@Xz)CswY#SEOOqO?&(g0I`>%_Eqe*$Ilph6qHUCb8SGhyNt z@zIxD5_igKzQs#Hnp?$r7mAyt9qnvxLVTfoi^eMbzRpq~ z?`ZR+Ji33?ylyL%PSU6DyYB#NrY?pq3EX66m-QsG{M3*&OnoEs^+E>L;zgjXR z_8?H>bSQb_$zxyWKO=EP&}^1poJn;$jrvWMQN-NgvWy9OKs#bt7Yv@*S)t3+vezz1?gdwa zG}OV0GGC;JDWAPzwye353%7?fynSj6W@{A8@|qig*43cpErP)CppJFedo6vO zSt{1nfY6Q0JQnL|~& zbQqLzffNbZyw3=knkabK|3^{9x;spJi2&@??9q`uZ`G@nbs0P<$RT@p1bFeaV+UUW ztF_R1%_}>R`gc(Y+2WM8K$aQYe1N26m^#of5)k72cV%o@Li3X>pT7m#MO<0;xl0+a zX&%QzwT@5iu_K1u*^N`c4uvmRF@#VKUDwy`HwN4f@Etu3Bi7MPUR~J64v&oB$jN{q z>&2lKG`mW@er8^CAXnK48mg8CYg67w9SnK$1eJo+zr$+=(6Kbmd;^1h#IXi9g z@uJ!doa~V}!EtAXIfSe)f$1enKJP%=6RaJ|6kAb;yDENl)dE}e_k|0&bS zyP_PKw5y@Za4qg+%vMiIhTJdQRovBBDt1uTjT))-Z5y3oHs1dxM#!|~$%|`Y9SqP6 sd3Ec{l7#%g|AZ+2SG4l~E?%*Js>Dm7$XOBy{|*DFDQhW}DOd*mFHuB{W&i*H literal 15853 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 E01(itb^rhX From 0bb59f73f8699fcf66f0e6f0d80914de850db52d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 11 Oct 2025 12:03:45 -0400 Subject: [PATCH 09/93] Remove unnecessary powernet == 0 check --- code/modules/power/cable.dm | 1 - code/modules/power/power.dm | 2 -- 2 files changed, 3 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 587bbe766db4..b18e5bd16812 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -440,7 +440,6 @@ var/global/list/obj/structure/cable/all_cables = list() . = list() // this will be a list of all connected power objects if(d1 == 0) for(var/obj/machinery/power/P in loc) - if(P.powernet == 0) continue // exclude APCs with powernet=0 if(!skip_assigned_powernets || !P.powernet) . += P diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4449a9dd44a6..b88f26c3fe64 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -112,8 +112,6 @@ if(!cable_only && istype(AM,/obj/machinery/power)) var/obj/machinery/power/P = AM - if(P.powernet == 0) continue // exclude APCs which have powernet=0 - if(!unmarked || !P.powernet) //if unmarked=1 we only return things with no powernet if(d == 0) . += P From 56a1a612610060a77e5d499b6311ed635fc4fb48 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 12 Oct 2025 13:02:43 -0400 Subject: [PATCH 10/93] Move keybinding definitions into their own folder --- code/modules/keybindings/{ => binds}/admin.dm | 0 code/modules/keybindings/{ => binds}/client.dm | 0 .../keybindings/{ => binds}/communication.dm | 0 code/modules/keybindings/{ => binds}/human.dm | 0 code/modules/keybindings/{ => binds}/living.dm | 0 code/modules/keybindings/{ => binds}/mob.dm | 0 code/modules/keybindings/{ => binds}/movement.dm | 0 nebula.dme | 14 +++++++------- 8 files changed, 7 insertions(+), 7 deletions(-) rename code/modules/keybindings/{ => binds}/admin.dm (100%) rename code/modules/keybindings/{ => binds}/client.dm (100%) rename code/modules/keybindings/{ => binds}/communication.dm (100%) rename code/modules/keybindings/{ => binds}/human.dm (100%) rename code/modules/keybindings/{ => binds}/living.dm (100%) rename code/modules/keybindings/{ => binds}/mob.dm (100%) rename code/modules/keybindings/{ => binds}/movement.dm (100%) diff --git a/code/modules/keybindings/admin.dm b/code/modules/keybindings/binds/admin.dm similarity index 100% rename from code/modules/keybindings/admin.dm rename to code/modules/keybindings/binds/admin.dm diff --git a/code/modules/keybindings/client.dm b/code/modules/keybindings/binds/client.dm similarity index 100% rename from code/modules/keybindings/client.dm rename to code/modules/keybindings/binds/client.dm diff --git a/code/modules/keybindings/communication.dm b/code/modules/keybindings/binds/communication.dm similarity index 100% rename from code/modules/keybindings/communication.dm rename to code/modules/keybindings/binds/communication.dm diff --git a/code/modules/keybindings/human.dm b/code/modules/keybindings/binds/human.dm similarity index 100% rename from code/modules/keybindings/human.dm rename to code/modules/keybindings/binds/human.dm diff --git a/code/modules/keybindings/living.dm b/code/modules/keybindings/binds/living.dm similarity index 100% rename from code/modules/keybindings/living.dm rename to code/modules/keybindings/binds/living.dm diff --git a/code/modules/keybindings/mob.dm b/code/modules/keybindings/binds/mob.dm similarity index 100% rename from code/modules/keybindings/mob.dm rename to code/modules/keybindings/binds/mob.dm diff --git a/code/modules/keybindings/movement.dm b/code/modules/keybindings/binds/movement.dm similarity index 100% rename from code/modules/keybindings/movement.dm rename to code/modules/keybindings/binds/movement.dm diff --git a/nebula.dme b/nebula.dme index 7c527182f6f6..b49e271fc03c 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2613,16 +2613,16 @@ #include "code\modules\item_effects\item_effect_modifier.dm" #include "code\modules\keybindings\_defines.dm" #include "code\modules\keybindings\_keybindings.dm" -#include "code\modules\keybindings\admin.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_client.dm" -#include "code\modules\keybindings\client.dm" -#include "code\modules\keybindings\communication.dm" -#include "code\modules\keybindings\human.dm" -#include "code\modules\keybindings\living.dm" -#include "code\modules\keybindings\mob.dm" -#include "code\modules\keybindings\movement.dm" #include "code\modules\keybindings\setup.dm" +#include "code\modules\keybindings\binds\admin.dm" +#include "code\modules\keybindings\binds\client.dm" +#include "code\modules\keybindings\binds\communication.dm" +#include "code\modules\keybindings\binds\human.dm" +#include "code\modules\keybindings\binds\living.dm" +#include "code\modules\keybindings\binds\mob.dm" +#include "code\modules\keybindings\binds\movement.dm" #include "code\modules\lighting\_lighting_defs.dm" #include "code\modules\lighting\ambient_group.dm" #include "code\modules\lighting\ambient_turf.dm" From 7c23c3a83282455f4a358c398730b53a74758eda Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 12 Oct 2025 13:51:11 -0400 Subject: [PATCH 11/93] Move pies to empty pies file --- .../food/baking/baked_goods.dm | 110 --------------- .../reagent_containers/food/baking/pies.dm | 133 ++++++++++++++++++ .../food/sliceable/cakes.dm | 24 ---- 3 files changed, 133 insertions(+), 134 deletions(-) diff --git a/code/modules/reagents/reagent_containers/food/baking/baked_goods.dm b/code/modules/reagents/reagent_containers/food/baking/baked_goods.dm index a03d9f836f06..035296bd59a6 100644 --- a/code/modules/reagents/reagent_containers/food/baking/baked_goods.dm +++ b/code/modules/reagents/reagent_containers/food/baking/baked_goods.dm @@ -12,27 +12,6 @@ nutriment_amt = 6 bitesize = 2 -/obj/item/food/bananapie - name = "banana cream pie" - desc = "Just like back home, on clown planet! HONK!" - icon = 'icons/obj/food/baked/pies/pie.dmi' - plate = /obj/item/plate - filling_color = "#fbffb8" - center_of_mass = @'{"x":16,"y":13}' - nutriment_desc = list("pie" = 3, "cream" = 2) - nutriment_amt = 4 - bitesize = 3 - -/obj/item/food/bananapie/populate_reagents() - . = ..() - add_to_reagents(/decl/material/liquid/nutriment/banana_cream, 5) - -/obj/item/food/bananapie/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/pie_smudge(src.loc) - src.visible_message("\The [src.name] splats.","You hear a splat.") - qdel(src) - /obj/item/food/berryclafoutis name = "berry clafoutis" desc = "No black birds, this is a good sign." @@ -128,75 +107,6 @@ nutriment_amt = 10 bitesize = 2 -/obj/item/food/meatpie - name = "meat-pie" - icon = 'icons/obj/food/baked/pies/meat.dmi' - desc = "An old barber recipe, very delicious!" - plate = /obj/item/plate - filling_color = "#948051" - center_of_mass = @'{"x":16,"y":13}' - bitesize = 2 - -/obj/item/food/meatpie/populate_reagents() - . = ..() - add_to_reagents(/decl/material/solid/organic/meat, 10) - -/obj/item/food/tofupie - name = "tofu-pie" - icon = 'icons/obj/food/baked/pies/meat.dmi' - desc = "A delicious tofu pie." - plate = /obj/item/plate - filling_color = "#fffee0" - center_of_mass = @'{"x":16,"y":13}' - nutriment_desc = list("tofu" = 2, "pie" = 8) - nutriment_amt = 10 - bitesize = 2 - -/obj/item/food/amanita_pie - name = "amanita pie" - desc = "Sweet and tasty poison pie." - icon = 'icons/obj/food/baked/pies/amanita.dmi' - filling_color = "#ffcccc" - center_of_mass = @'{"x":17,"y":9}' - nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) - nutriment_amt = 5 - bitesize = 3 - -/obj/item/food/amanita_pie/populate_reagents() - . = ..() - add_to_reagents(/decl/material/liquid/amatoxin, 3) - add_to_reagents(/decl/material/liquid/psychotropics, 1) - -/obj/item/food/plump_pie - name = "plump pie" - desc = "I bet you love stuff made out of plump helmets!" - icon = 'icons/obj/food/baked/pies/plumphelmet.dmi' - filling_color = "#b8279b" - center_of_mass = @'{"x":17,"y":9}' - nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) - nutriment_amt = 8 - bitesize = 2 - -/obj/item/food/plump_pie/populate_reagents() - . = ..() - if(prob(10)) //#TODO: have this depend on cook's skill within the recipe handling instead maybe? - name = "exceptional plump pie" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - add_to_reagents(/decl/material/liquid/regenerator, 5) - -/obj/item/food/xemeatpie - name = "xeno-pie" - icon = 'icons/obj/food/baked/pies/xeno.dmi' - desc = "A delicious meatpie. Probably heretical." - plate = /obj/item/plate - filling_color = "#43de18" - center_of_mass = @'{"x":16,"y":13}' - bitesize = 2 - -/obj/item/food/xemeatpie/populate_reagents() - . = ..() - add_to_reagents(/decl/material/solid/organic/meat/xeno, 10) - /obj/item/food/poppypretzel name = "poppy pretzel" desc = "It's all twisted up!" @@ -207,26 +117,6 @@ nutriment_amt = 5 bitesize = 2 -/obj/item/food/applepie - name = "apple pie" - desc = "A pie containing sweet sweet love... or apple." - icon = 'icons/obj/food/baked/pies/apple.dmi' - filling_color = "#e0edc5" - center_of_mass = @'{"x":16,"y":13}' - nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) - nutriment_amt = 4 - bitesize = 3 - -/obj/item/food/cherrypie - name = "cherry pie" - desc = "Taste so good, make a grown man cry." - icon = 'icons/obj/food/baked/pies/cherry.dmi' - filling_color = "#ff525a" - center_of_mass = @'{"x":16,"y":11}' - nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) - nutriment_amt = 4 - bitesize = 3 - /obj/item/food/fortunecookie name = "fortune cookie" desc = "A true prophecy in each cookie!" diff --git a/code/modules/reagents/reagent_containers/food/baking/pies.dm b/code/modules/reagents/reagent_containers/food/baking/pies.dm index e69de29bb2d1..36c945ed89e8 100644 --- a/code/modules/reagents/reagent_containers/food/baking/pies.dm +++ b/code/modules/reagents/reagent_containers/food/baking/pies.dm @@ -0,0 +1,133 @@ +/obj/item/food/bananapie + name = "banana cream pie" + desc = "Just like back home, on clown planet! HONK!" + icon = 'icons/obj/food/baked/pies/pie.dmi' + plate = /obj/item/plate + filling_color = "#fbffb8" + center_of_mass = @'{"x":16,"y":13}' + nutriment_desc = list("pie" = 3, "cream" = 2) + nutriment_amt = 4 + bitesize = 3 + +/obj/item/food/bananapie/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/nutriment/banana_cream, 5) + +/obj/item/food/bananapie/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/pie_smudge(src.loc) + visible_message(SPAN_DANGER("\The [src] splats."), SPAN_DANGER("You hear a splat.")) + qdel(src) + +/obj/item/food/meatpie + name = "meat-pie" + icon = 'icons/obj/food/baked/pies/meat.dmi' + desc = "An old barber recipe, very delicious!" + plate = /obj/item/plate + filling_color = "#948051" + center_of_mass = @'{"x":16,"y":13}' + bitesize = 2 + +/obj/item/food/meatpie/populate_reagents() + . = ..() + add_to_reagents(/decl/material/solid/organic/meat, 10) + +/obj/item/food/tofupie + name = "tofu-pie" + icon = 'icons/obj/food/baked/pies/meat.dmi' + desc = "A delicious tofu pie." + plate = /obj/item/plate + filling_color = "#fffee0" + center_of_mass = @'{"x":16,"y":13}' + nutriment_desc = list("tofu" = 2, "pie" = 8) + nutriment_amt = 10 + bitesize = 2 + +/obj/item/food/amanita_pie + name = "amanita pie" + desc = "Sweet and tasty poison pie." + icon = 'icons/obj/food/baked/pies/amanita.dmi' + filling_color = "#ffcccc" + center_of_mass = @'{"x":17,"y":9}' + nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) + nutriment_amt = 5 + bitesize = 3 + +/obj/item/food/amanita_pie/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/amatoxin, 3) + add_to_reagents(/decl/material/liquid/psychotropics, 1) + +/obj/item/food/plump_pie + name = "plump pie" + desc = "I bet you love stuff made out of plump helmets!" + icon = 'icons/obj/food/baked/pies/plumphelmet.dmi' + filling_color = "#b8279b" + center_of_mass = @'{"x":17,"y":9}' + nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) + nutriment_amt = 8 + bitesize = 2 + +/obj/item/food/plump_pie/populate_reagents() + . = ..() + if(prob(10)) //#TODO: have this depend on cook's skill within the recipe handling instead maybe? + name = "exceptional plump pie" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" + add_to_reagents(/decl/material/liquid/regenerator, 5) + +/obj/item/food/xemeatpie + name = "xeno-pie" + icon = 'icons/obj/food/baked/pies/xeno.dmi' + desc = "A delicious meatpie. Probably heretical." + plate = /obj/item/plate + filling_color = "#43de18" + center_of_mass = @'{"x":16,"y":13}' + bitesize = 2 + +/obj/item/food/xemeatpie/populate_reagents() + . = ..() + add_to_reagents(/decl/material/solid/organic/meat/xeno, 10) + +/obj/item/food/applepie + name = "apple pie" + desc = "A pie containing sweet sweet love... or apple." + icon = 'icons/obj/food/baked/pies/apple.dmi' + filling_color = "#e0edc5" + center_of_mass = @'{"x":16,"y":13}' + nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) + nutriment_amt = 4 + bitesize = 3 + +/obj/item/food/cherrypie + name = "cherry pie" + desc = "Taste so good, make a grown man cry." + icon = 'icons/obj/food/baked/pies/cherry.dmi' + filling_color = "#ff525a" + center_of_mass = @'{"x":16,"y":11}' + nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) + nutriment_amt = 4 + bitesize = 3 + +/obj/item/food/sliceable/pumpkinpie + name = "pumpkin pie" + desc = "A delicious treat for the autumn months." + icon = 'icons/obj/food/baked/cakes/pumpkin.dmi' + slice_path = /obj/item/food/slice/pumpkinpie + slice_num = 5 + filling_color = "#f5b951" + center_of_mass = @'{"x":16,"y":10}' + nutriment_desc = list("pie" = 5, "cream" = 5, "pumpkin" = 5) + nutriment_amt = 15 + +/obj/item/food/slice/pumpkinpie + name = "pumpkin pie slice" + desc = "A slice of pumpkin pie, with whipped cream on top. Perfection." + icon = 'icons/obj/food/baked/cakes/slices/pumpkin.dmi' + plate = /obj/item/plate + filling_color = "#f5b951" + bitesize = 2 + center_of_mass = @'{"x":16,"y":12}' + whole_path = /obj/item/food/sliceable/pumpkinpie + +/obj/item/food/slice/pumpkinpie/filled + filled = TRUE \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm b/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm index 2d7f45c72ee7..a59b23872aee 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/cakes.dm @@ -267,27 +267,3 @@ /obj/item/food/slice/applecake/filled filled = TRUE - -/obj/item/food/sliceable/pumpkinpie - name = "pumpkin pie" - desc = "A delicious treat for the autumn months." - icon = 'icons/obj/food/baked/cakes/pumpkin.dmi' - slice_path = /obj/item/food/slice/pumpkinpie - slice_num = 5 - filling_color = "#f5b951" - center_of_mass = @'{"x":16,"y":10}' - nutriment_desc = list("pie" = 5, "cream" = 5, "pumpkin" = 5) - nutriment_amt = 15 - -/obj/item/food/slice/pumpkinpie - name = "pumpkin pie slice" - desc = "A slice of pumpkin pie, with whipped cream on top. Perfection." - icon = 'icons/obj/food/baked/cakes/slices/pumpkin.dmi' - plate = /obj/item/plate - filling_color = "#f5b951" - bitesize = 2 - center_of_mass = @'{"x":16,"y":12}' - whole_path = /obj/item/food/sliceable/pumpkinpie - -/obj/item/food/slice/pumpkinpie/filled - filled = TRUE From 4f1126b73ef5af77aad975e4d5accffbdb2fc7c5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 12 Oct 2025 13:54:56 -0400 Subject: [PATCH 12/93] Remove two blank files --- code/game/machinery/kitchen/drying_oven.dm | 0 code/modules/mob/living/silicon/ai/ai_camera_proc.dm | 1 - nebula.dme | 2 -- 3 files changed, 3 deletions(-) delete mode 100644 code/game/machinery/kitchen/drying_oven.dm delete mode 100644 code/modules/mob/living/silicon/ai/ai_camera_proc.dm diff --git a/code/game/machinery/kitchen/drying_oven.dm b/code/game/machinery/kitchen/drying_oven.dm deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/code/modules/mob/living/silicon/ai/ai_camera_proc.dm b/code/modules/mob/living/silicon/ai/ai_camera_proc.dm deleted file mode 100644 index 8b137891791f..000000000000 --- a/code/modules/mob/living/silicon/ai/ai_camera_proc.dm +++ /dev/null @@ -1 +0,0 @@ - diff --git a/nebula.dme b/nebula.dme index 7c527182f6f6..5f7fb8572abe 100644 --- a/nebula.dme +++ b/nebula.dme @@ -966,7 +966,6 @@ #include "code\game\machinery\embedded_controller\embedded_program_base.dm" #include "code\game\machinery\embedded_controller\simple_docking_controller.dm" #include "code\game\machinery\embedded_controller\tin_can.dm" -#include "code\game\machinery\kitchen\drying_oven.dm" #include "code\game\machinery\kitchen\gibber.dm" #include "code\game\machinery\kitchen\icecream.dm" #include "code\game\machinery\kitchen\microwave.dm" @@ -2912,7 +2911,6 @@ #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\subsystems.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_camera_proc.dm" #include "code\modules\mob\living\silicon\ai\ai_damage.dm" #include "code\modules\mob\living\silicon\ai\ai_movement.dm" #include "code\modules\mob\living\silicon\ai\ai_radio.dm" From 26ee7dcdbca1315131d10a6115311deda9628d4a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 12 Oct 2025 13:55:18 -0400 Subject: [PATCH 13/93] Fix readme files not being detected by validation on Unix --- nebula.dme | 2 -- tools/validate_dme.py | 8 +++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nebula.dme b/nebula.dme index 5f7fb8572abe..76e981eed758 100644 --- a/nebula.dme +++ b/nebula.dme @@ -443,7 +443,6 @@ #include "code\datums\extensions\abilities\ability_item.dm" #include "code\datums\extensions\abilities\ability_projectile.dm" #include "code\datums\extensions\abilities\ability_targeting.dm" -#include "code\datums\extensions\abilities\readme.dm" #include "code\datums\extensions\appearance\appearance.dm" #include "code\datums\extensions\appearance\base_icon_state.dm" #include "code\datums\extensions\appearance\cardborg.dm" @@ -2798,7 +2797,6 @@ #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\grab\grab_datum.dm" #include "code\modules\mob\grab\grab_object.dm" -#include "code\modules\mob\grab\grab_readme.dm" #include "code\modules\mob\grab\normal\grab_normal.dm" #include "code\modules\mob\grab\normal\norm_aggressive.dm" #include "code\modules\mob\grab\normal\norm_kill.dm" diff --git a/tools/validate_dme.py b/tools/validate_dme.py index 4966ef550fea..cca8764cec9c 100644 --- a/tools/validate_dme.py +++ b/tools/validate_dme.py @@ -2,12 +2,14 @@ import functools import glob import sys +from os.path import normpath reading = False FORBID_INCLUDE = [ r'code/**/*_docs.dm', - r'code/**/README.dm', + r'code/**/*readme.dm', + r'code/**/*README.dm', ] IGNORE_INCLUDE = [ @@ -45,7 +47,7 @@ ignored = False for ignore in IGNORE_INCLUDE: - if not fnmatch.fnmatch(code_file, ignore): + if not fnmatch.fnmatchcase(code_file, normpath(ignore)): continue ignored = True @@ -55,7 +57,7 @@ continue for forbid in FORBID_INCLUDE: - if not fnmatch.fnmatch(code_file, forbid): + if not fnmatch.fnmatchcase(code_file, normpath(forbid)): continue forbid_include = True From 1f77779e11232f8d186306bf5e24c8176894ca6b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 24 Mar 2025 05:32:27 -0400 Subject: [PATCH 14/93] Use mend_fracture helper proc where possible --- code/modules/surgery/bones.dm | 2 +- mods/content/psionics/system/psionics/faculties/redaction.dm | 2 +- mods/gamemodes/cult/runes.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index cc0a53a81473..6b070b63a7cd 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -140,7 +140,7 @@ var/bone = affected.encased ? "\the [target]'s damaged [affected.encased]" : "damaged bones in [target]'s [affected.name]" user.visible_message("[user] has mended [bone] with \the [tool]." , \ "You have mended [bone] with \the [tool]." ) - affected.status &= ~ORGAN_BROKEN + affected.mend_fracture() affected.stage = 0 affected.update_wounds() ..() diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index bc5ece1b7598..7b8b9c1b9fd1 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -91,7 +91,7 @@ return TRUE if(E.status & ORGAN_BROKEN) to_chat(user, SPAN_NOTICE("You coax shattered bones to come together and fuse, mending the break.")) - E.status &= ~ORGAN_BROKEN + E.mend_fracture() E.stage = 0 return TRUE if(E.is_dislocated() && !E.is_parent_dislocated()) diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index 4ed65a929f5f..32cc1f3024f6 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -568,7 +568,7 @@ if(charges >= 15) for(var/obj/item/organ/external/e in user.get_external_organs()) if(e && e.status & ORGAN_BROKEN) - e.status &= ~ORGAN_BROKEN + e.mend_fracture() statuses += "bones in your [e.name] snap into place" charges -= 15 if(charges < 15) From de7a00cc555fe663e5559f173a792952f970bd34 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 12 Oct 2025 19:14:26 -0400 Subject: [PATCH 15/93] Add feedback for when a bone is too damaged to mend --- code/modules/surgery/bones.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 6b070b63a7cd..e6bc246c0f13 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -138,10 +138,14 @@ /decl/surgery_step/bone/finish/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) var/bone = affected.encased ? "\the [target]'s damaged [affected.encased]" : "damaged bones in [target]'s [affected.name]" - user.visible_message("[user] has mended [bone] with \the [tool]." , \ - "You have mended [bone] with \the [tool]." ) - affected.mend_fracture() - affected.stage = 0 + // if it's too damaged to mend/will just re-break, warn them and don't lower our stage + if(affected.mend_fracture()) + user.visible_message(SPAN_NOTICE("[user] has mended [bone] with \the [tool].") , \ + SPAN_NOTICE("You have mended [bone] with \the [tool].")) + affected.stage = 0 + else + user.visible_message(SPAN_WARNING("[user] attempted to mend [bone] with \the [tool], but it was too damaged!"), + SPAN_WARNING("You failed to mend [bone] with \the [tool], as it is too damaged.")) affected.update_wounds() ..() From 20eb63186fddffec3ad07ab795c4dddf24775c89 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 10 Sep 2025 00:40:23 -0400 Subject: [PATCH 16/93] Move powernet sensor into main power module --- code/modules/power/{sensors => }/powernet_sensor.dm | 0 nebula.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename code/modules/power/{sensors => }/powernet_sensor.dm (100%) diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/powernet_sensor.dm similarity index 100% rename from code/modules/power/sensors/powernet_sensor.dm rename to code/modules/power/powernet_sensor.dm diff --git a/nebula.dme b/nebula.dme index 7c527182f6f6..fac8e40fce33 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3413,6 +3413,7 @@ #include "code\modules\power\port_gen.dm" #include "code\modules\power\power.dm" #include "code\modules\power\powernet.dm" +#include "code\modules\power\powernet_sensor.dm" #include "code\modules\power\smes.dm" #include "code\modules\power\smes_construction.dm" #include "code\modules\power\smes_presets.dm" @@ -3446,7 +3447,6 @@ #include "code\modules\power\geothermal\_geothermal.dm" #include "code\modules\power\geothermal\geothermal_circuit.dm" #include "code\modules\power\geothermal\geothermal_extension.dm" -#include "code\modules\power\sensors\powernet_sensor.dm" #include "code\modules\power\singularity\collector.dm" #include "code\modules\power\singularity\containment_field.dm" #include "code\modules\power\singularity\emitter.dm" From 00a9824b6a0aa2b7b733609abcfeb3ffb76f65bf Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 9 Oct 2025 20:08:56 -0400 Subject: [PATCH 17/93] Make powernet sensors not a subtype of /obj/machinery/power --- code/game/machinery/pipe/construction.dm | 2 +- .../programs/engineering/power_monitor.dm | 16 +++---- code/modules/power/powernet_sensor.dm | 48 +++++++++---------- maps/away/bearcat/bearcat-2.dmm | 2 +- maps/exodus/exodus-1.dmm | 4 +- maps/exodus/exodus-2.dmm | 22 ++++----- maps/ministation/ministation-0.dmm | 4 +- maps/tradeship/tradeship-2.dmm | 2 +- tools/map_migrations/5120_powersensor.txt | 2 + 9 files changed, 50 insertions(+), 52 deletions(-) create mode 100644 tools/map_migrations/5120_powersensor.txt diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 005f27ca3465..34843e14fd26 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -168,4 +168,4 @@ Buildable meters icon = 'icons/obj/objects.dmi' icon_state = "floor_beacon" // If anyone wants to make better sprite, feel free to do so without asking me. w_class = ITEM_SIZE_NORMAL - build_type = /obj/machinery/power/sensor \ No newline at end of file + build_type = /obj/machinery/power_sensor \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 15cddd991fc8..7c3a7e7faea0 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -48,10 +48,10 @@ // Checks whether there is an active alarm, if yes, returns 1, otherwise returns 0. /datum/nano_module/program/power_monitor/proc/has_alarm() - for(var/obj/machinery/power/sensor/S in grid_sensors) - if(S.check_grid_warning()) - return 1 - return 0 + for(var/obj/machinery/power_sensor/S in grid_sensors) + if(S.has_grid_warning()) + return TRUE + return FALSE // If PC is not null header template is loaded. Use PC.get_header_data() to get relevant nanoui data from it. All data entries begin with "PC_...." // In future it may be expanded to other modular computer devices. @@ -60,13 +60,13 @@ var/list/sensors = list() // Focus: If it remains null if no sensor is selected and UI will display sensor list, otherwise it will display sensor reading. - var/obj/machinery/power/sensor/focus = null + var/obj/machinery/power_sensor/focus = null // Build list of data from sensor readings. - for(var/obj/machinery/power/sensor/S in grid_sensors) + for(var/obj/machinery/power_sensor/S in grid_sensors) sensors.Add(list(list( "name" = html_encode(S.id_tag), - "alarm" = S.check_grid_warning() + "alarm" = S.has_grid_warning() ))) if(S.id_tag == active_sensor) focus = S @@ -88,7 +88,7 @@ /datum/nano_module/program/power_monitor/proc/refresh_sensors() grid_sensors = list() var/connected_z_levels = SSmapping.get_connected_levels(get_host_z()) - for(var/obj/machinery/power/sensor/S in SSmachines.machinery) + for(var/obj/machinery/power_sensor/S in SSmachines.machinery) if(get_z(S) in connected_z_levels) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels. grid_sensors += S events_repository.register(/decl/observ/destroyed, S, src, TYPE_PROC_REF(/datum/nano_module/program/power_monitor, remove_sensor)) diff --git a/code/modules/power/powernet_sensor.dm b/code/modules/power/powernet_sensor.dm index 19352222a15a..0f52a584883a 100644 --- a/code/modules/power/powernet_sensor.dm +++ b/code/modules/power/powernet_sensor.dm @@ -7,7 +7,7 @@ // may be used in PDAs or similar applications. Second proc, return_reading_data will return list containing needed data. // This is used in NanoUI, for example. -/obj/machinery/power/sensor +/obj/machinery/power_sensor name = "powernet sensor" desc = "A sensor that records and transmits data about its connected power network." anchored = TRUE @@ -24,14 +24,14 @@ // Proc: New() // Parameters: None // Description: Automatically assigns name according to ID tag. -/obj/machinery/power/sensor/Initialize() +/obj/machinery/power_sensor/Initialize() . = ..() auto_set_name() // Proc: auto_set_name() // Parameters: None // Description: Sets name of this sensor according to the ID tag. -/obj/machinery/power/sensor/proc/auto_set_name() +/obj/machinery/power_sensor/proc/auto_set_name() if(!id_tag) var/area/A = get_area(src) if(!A) @@ -42,20 +42,17 @@ id_tag = "[A.proper_name][suffix ? " #[suffix]" : null]" name = "[id_tag] - powernet sensor" -// Proc: check_grid_warning() +// Proc: has_grid_warning() // Parameters: None -// Description: Checks connected powernet for warnings. If warning is found returns 1 -/obj/machinery/power/sensor/proc/check_grid_warning() - connect_to_network() - if(powernet) - if(powernet.problem) - return 1 - return 0 +// Description: Checks connected powernet for warnings. If warning is found returns TRUE +/obj/machinery/power_sensor/proc/has_grid_warning() + var/datum/powernet/net_to_check = get_powernet() + return net_to_check?.problem ? TRUE : FALSE // Proc: reading_to_text() // Parameters: 1 (amount - Power in Watts to be converted to W, kW or MW) // Description: Helper proc that converts reading in Watts to kW or MW (returns string version of amount parameter) -/obj/machinery/power/sensor/proc/reading_to_text(var/amount = 0) +/obj/machinery/power_sensor/proc/reading_to_text(var/amount = 0) var/units = "" // 10kW and less - Watts if(amount < 10000) @@ -76,12 +73,13 @@ // Proc: find_apcs() // Parameters: None // Description: Searches powernet for APCs and returns them in a list. -/obj/machinery/power/sensor/proc/find_apcs() - if(!powernet) +/obj/machinery/power_sensor/proc/find_apcs() + var/datum/powernet/net_to_check = get_powernet() + if(!net_to_check) return var/list/L = list() - for(var/obj/machinery/power/terminal/term in powernet.nodes) + for(var/obj/machinery/power/terminal/term in net_to_check.nodes) var/obj/machinery/apc/A = term.master_machine() if(istype(A)) L += A @@ -91,13 +89,11 @@ // Proc: return_reading_data() // Parameters: None // Description: Generates list containing all powernet data. Optimised for usage with NanoUI -/obj/machinery/power/sensor/proc/return_reading_data() - // No powernet. Try to connect to one first. - if(!powernet) - connect_to_network() +/obj/machinery/power_sensor/proc/return_reading_data() + var/datum/powernet/net_to_check = get_powernet() var/list/data = list() data["name"] = id_tag - if(!powernet) + if(!net_to_check) data["error"] = "# SYSTEM ERROR - NO POWERNET #" data["alarm"] = 0 // Runtime Prevention return data @@ -137,16 +133,16 @@ // Add load of this APC to total APC load calculation total_apc_load += A.lastused_total data["apc_data"] = APC_data - data["total_avail"] = reading_to_text(max(powernet.avail, 0)) + data["total_avail"] = reading_to_text(max(net_to_check.avail, 0)) data["total_used_apc"] = reading_to_text(max(total_apc_load, 0)) - data["total_used_other"] = reading_to_text(max(powernet.viewload - total_apc_load, 0)) - data["total_used_all"] = reading_to_text(max(powernet.viewload, 0)) + data["total_used_other"] = reading_to_text(max(net_to_check.viewload - total_apc_load, 0)) + data["total_used_all"] = reading_to_text(max(net_to_check.viewload, 0)) // Prevents runtimes when avail is 0 (division by zero) - if(powernet.avail) - data["load_percentage"] = round((powernet.viewload / powernet.avail) * 100) + if(net_to_check.avail) + data["load_percentage"] = round((net_to_check.viewload / net_to_check.avail) * 100) else data["load_percentage"] = 100 - data["alarm"] = powernet.problem ? 1 : 0 + data["alarm"] = net_to_check.problem ? 1 : 0 return data diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 30150ba50d4e..14b782b9dba0 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -3993,7 +3993,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/power) "hK" = ( -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Main Grid" }, /obj/structure/cable{ diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index 2a76b49434c6..2fa3d828f5ed 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -1570,7 +1570,7 @@ name = "north bump"; pixel_y = 24 }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Command Sublevel Subgrid"; name = "Powernet Sensor - Command Sublevel Subgrid" }, @@ -3588,7 +3588,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/atmos) "jx" = ( -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Atmospherics Subgrid"; name = "Powernet Sensor - Atmospherics Subgrid" }, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index ee4834d3cee5..39076a2ae103 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -5981,7 +5981,7 @@ dir = 4; pixel_x = -22 }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Security Subgrid"; name = "Powernet Sensor - Security Subgrid" }, @@ -14969,7 +14969,7 @@ /obj/structure/cable/green{ icon_state = "0-8" }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Civilian East Subgrid"; name = "Powernet Sensor - Civilian East Subgrid" }, @@ -16978,7 +16978,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Civilian West Subgrid"; name = "Powernet Sensor - Civilian West" }, @@ -27810,7 +27810,7 @@ /turf/floor/plating, /area/exodus/engineering/engine_room) "bhS" = ( -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "AI Subgrid"; name = "Powernet Sensor - AI Subgrid" }, @@ -31646,7 +31646,7 @@ icon_state = "0-4" }, /obj/structure/cable/green, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Command Subgrid"; name = "Powernet Sensor - Command Subgrid" }, @@ -37164,7 +37164,7 @@ icon_state = "0-4" }, /obj/structure/cable/green, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Medbay Subgrid"; name = "Powernet Sensor - Medbay Subgrid" }, @@ -50870,7 +50870,7 @@ icon_state = "0-2" }, /obj/structure/cable/green, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Research Subgrid"; name = "Powernet Sensor - Research Subgrid" }, @@ -54796,7 +54796,7 @@ /obj/structure/cable/green{ icon_state = "0-8" }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Engineering Subgrid"; name = "Powernet Sensor - Engineering Subgrid" }, @@ -61661,7 +61661,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Master"; name = "Powernet Sensor - Master Grid" }, @@ -61872,7 +61872,7 @@ dir = 4 }, /obj/structure/cable/yellow, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Engine Output"; name = "Powernet Sensor - Engine Output" }, @@ -62721,7 +62721,7 @@ /obj/structure/cable/cyan{ icon_state = "0-8" }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Engine Power"; name = "Powernet Sensor - Engine Power" }, diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 0d703c96b6de..2932af289c5b 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -6993,7 +6993,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Station Power"; name = "Powernet Sensor - Station Power" }, @@ -7583,7 +7583,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Engine Power"; name = "Powernet Sensor - Engine Power" }, diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index 03f9624c6d0b..f476416e5731 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -3434,7 +3434,7 @@ /turf/floor/tiled/techfloor/grid, /area/ship/trade/maintenance/power) "ip" = ( -/obj/machinery/power/sensor{ +/obj/machinery/power_sensor{ id_tag = "Main Grid" }, /obj/structure/cable{ diff --git a/tools/map_migrations/5120_powersensor.txt b/tools/map_migrations/5120_powersensor.txt new file mode 100644 index 000000000000..076dbeb33356 --- /dev/null +++ b/tools/map_migrations/5120_powersensor.txt @@ -0,0 +1,2 @@ +# Powernet sensors are no longer a subtype of /obj/machinery/power +/obj/machinery/power/sensor/@SUBTYPES : /obj/machinery/power_sensor/@SUBTYPES{@OLD} \ No newline at end of file From c7ad5cc51ed5c4d3fdd6d57c29deb90b82a3d1bb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 10 Sep 2025 00:26:46 -0400 Subject: [PATCH 18/93] Move light fixtures and bulbs/tubes into their own module --- code/modules/lights/_light_defines.dm | 11 + code/modules/{power => lights}/floorlamp.dm | 0 .../lighting.dm => lights/light_fixture.dm} | 191 ------------------ code/modules/lights/light_items.dm | 172 ++++++++++++++++ nebula.dme | 6 +- 5 files changed, 187 insertions(+), 193 deletions(-) create mode 100644 code/modules/lights/_light_defines.dm rename code/modules/{power => lights}/floorlamp.dm (100%) rename code/modules/{power/lighting.dm => lights/light_fixture.dm} (72%) create mode 100644 code/modules/lights/light_items.dm diff --git a/code/modules/lights/_light_defines.dm b/code/modules/lights/_light_defines.dm new file mode 100644 index 000000000000..33a9fe364e30 --- /dev/null +++ b/code/modules/lights/_light_defines.dm @@ -0,0 +1,11 @@ +// status values shared between lighting fixtures and items +#define LIGHT_OK 0 +#define LIGHT_EMPTY 1 +#define LIGHT_BROKEN 2 +#define LIGHT_BURNED 3 + +#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb +#define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range + +#define LIGHTMODE_EMERGENCY "emergency_lighting" +#define LIGHTMODE_READY "ready" \ No newline at end of file diff --git a/code/modules/power/floorlamp.dm b/code/modules/lights/floorlamp.dm similarity index 100% rename from code/modules/power/floorlamp.dm rename to code/modules/lights/floorlamp.dm diff --git a/code/modules/power/lighting.dm b/code/modules/lights/light_fixture.dm similarity index 72% rename from code/modules/power/lighting.dm rename to code/modules/lights/light_fixture.dm index 39184fecc631..a9c5f84cc99b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/lights/light_fixture.dm @@ -1,21 +1,3 @@ -// The lighting system -// -// consists of light fixtures (/obj/machinery/light) and light tube/bulb items (/obj/item/light) - - -// status values shared between lighting fixtures and items -#define LIGHT_OK 0 -#define LIGHT_EMPTY 1 -#define LIGHT_BROKEN 2 -#define LIGHT_BURNED 3 - -#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb -#define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range - - -#define LIGHTMODE_EMERGENCY "emergency_lighting" -#define LIGHTMODE_READY "ready" - // the standard tube light fixture /obj/machinery/light name = "light fixture" @@ -478,179 +460,6 @@ /obj/machinery/light/navigation/delay5 delay = 5 -// the light item -// can be tube or bulb subtypes -// will fit into empty /obj/machinery/light of the corresponding type - -/obj/item/light - icon = 'icons/obj/lighting.dmi' - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/metal/steel - atom_flags = ATOM_FLAG_CAN_BE_PAINTED - obj_flags = OBJ_FLAG_HOLLOW - var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN - var/base_state - var/switchcount = 0 // number of times switched - var/rigged = 0 // true if rigged to explode - var/broken_chance = 2 - - var/b_power = 0.7 - var/b_range = 5 - var/b_color = LIGHT_COLOR_HALOGEN - var/list/lighting_modes = list() - var/sound_on - -/obj/item/light/get_color() - return b_color - -/obj/item/light/set_color(color) - b_color = isnull(color) ? COLOR_WHITE : color - queue_icon_update() // avoid running update_icon before Initialize - -/obj/item/light/tube - name = "light tube" - desc = "A replacement light tube." - icon_state = "ltube" - base_state = "ltube" - item_state = "c_tube" - material = /decl/material/solid/glass - matter = list(/decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT) - - b_range = 8 - b_power = 0.8 - b_color = LIGHT_COLOR_HALOGEN - lighting_modes = list( - LIGHTMODE_EMERGENCY = list(l_range = 4, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), - ) - sound_on = 'sound/machines/lightson.ogg' - -/obj/item/light/tube/party/Initialize() //Randomly colored light tubes. Mostly for testing, but maybe someone will find a use for them. - . = ..() - b_color = rgb(pick(0,255), pick(0,255), pick(0,255)) - -/obj/item/light/tube/large - w_class = ITEM_SIZE_SMALL - name = "large light tube" - b_power = 4 - b_range = 12 - -/obj/item/light/tube/large/party/Initialize() //Randomly colored light tubes. Mostly for testing, but maybe someone will find a use for them. - . = ..() - b_color = rgb(pick(0,255), pick(0,255), pick(0,255)) - -/obj/item/light/bulb - name = "light bulb" - desc = "A replacement light bulb." - icon_state = "lbulb" - base_state = "lbulb" - item_state = "contvapour" - broken_chance = 3 - material = /decl/material/solid/glass - b_color = LIGHT_COLOR_TUNGSTEN - lighting_modes = list( - LIGHTMODE_EMERGENCY = list(l_range = 3, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), - ) - -/obj/item/light/bulb/red - color = LIGHT_COLOR_RED - b_color = LIGHT_COLOR_RED - -/obj/item/light/bulb/red/readylight - lighting_modes = list( - LIGHTMODE_READY = list(l_range = 5, l_power = 1, l_color = LIGHT_COLOR_GREEN), - ) - -/obj/item/light/throw_impact(atom/hit_atom) - ..() - shatter() - -/obj/item/light/bulb/fire - name = "fire bulb" - desc = "A replacement fire bulb." - icon_state = "fbulb" - base_state = "fbulb" - item_state = "egg4" - material = /decl/material/solid/glass - -// update the icon state and description of the light -/obj/item/light/on_update_icon() - . = ..() - var/broken - switch(status) - if(LIGHT_OK) - icon_state = base_state - desc = "A replacement [name]." - if(LIGHT_BURNED) - icon_state = "[base_state]_burned" - desc = "A burnt-out [name]." - if(LIGHT_BROKEN) - icon_state = "[base_state]_broken" - desc = "A broken [name]." - broken = TRUE - add_overlay(overlay_image(icon, "[base_state]_attachment[broken ? "_broken" : ""]", flags = RESET_COLOR|RESET_ALPHA)) - -/obj/item/light/Initialize(mapload) - . = ..() - update_icon() - -// attack bulb/tube with object -// if a syringe, can inject flammable liquids to make it explode -/obj/item/light/attackby(var/obj/item/used_item, var/mob/user) - ..() - if(istype(used_item, /obj/item/chems/syringe) && used_item.reagents?.total_volume) - var/obj/item/chems/syringe/S = used_item - to_chat(user, "You inject the solution into \the [src].") - for(var/decl/material/reagent as anything in S.reagents?.reagent_volumes) - if(reagent.accelerant_value > FUEL_VALUE_ACCELERANT) - rigged = TRUE - log_and_message_admins("injected a light with flammable reagents, rigging it to explode.", user) - break - S.reagents.clear_reagents() - return TRUE - . = ..() - -// called after an attack with a light item -// shatter light, unless it was an attempt to put it in a light socket -// now only shatter if the intent was harm - -/obj/item/light/afterattack(atom/target, mob/user, proximity) - if(!proximity) return - if(istype(target, /obj/machinery/light)) - return - if(!user.check_intent(I_FLAG_HARM)) - return - - shatter() - -/obj/item/light/shatter() - if(status == LIGHT_OK || status == LIGHT_BURNED) - src.visible_message("[name] shatters.","You hear a small glass object shatter.") - status = LIGHT_BROKEN - set_sharp(TRUE) - set_base_attack_force(5) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - update_icon() - -/obj/item/light/proc/switch_on() - switchcount++ - if(rigged) - addtimer(CALLBACK(src, PROC_REF(do_rigged_explosion)), 0.2 SECONDS) - status = LIGHT_BROKEN - else if(prob(min(60, switchcount*switchcount*0.01))) - status = LIGHT_BURNED - else if(sound_on) - playsound(src, sound_on, 75) - return status - -/obj/item/light/proc/do_rigged_explosion() - if(!rigged) - return - log_and_message_admins("Rigged light explosion, last touched by [fingerprintslast]") - var/turf/T = get_turf(src) - explosion(T, 0, 0, 3, 5) - if(!QDELETED(src)) - QDEL_IN(src, 1) - /obj/machinery/light/do_simple_ranged_interaction(var/mob/user) if(lightbulb) remove_bulb() diff --git a/code/modules/lights/light_items.dm b/code/modules/lights/light_items.dm new file mode 100644 index 000000000000..8c596a523756 --- /dev/null +++ b/code/modules/lights/light_items.dm @@ -0,0 +1,172 @@ +// the light item +// can be tube or bulb subtypes +// will fit into empty /obj/machinery/light of the corresponding type + +/obj/item/light + icon = 'icons/obj/lighting.dmi' + w_class = ITEM_SIZE_SMALL + material = /decl/material/solid/metal/steel + atom_flags = ATOM_FLAG_CAN_BE_PAINTED + obj_flags = OBJ_FLAG_HOLLOW + var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN + var/base_state + var/switchcount = 0 // number of times switched + var/rigged = 0 // true if rigged to explode + var/broken_chance = 2 + + var/b_power = 0.7 + var/b_range = 5 + var/b_color = LIGHT_COLOR_HALOGEN + var/list/lighting_modes = list() + var/sound_on + +/obj/item/light/get_color() + return b_color + +/obj/item/light/set_color(color) + b_color = isnull(color) ? COLOR_WHITE : color + queue_icon_update() // avoid running update_icon before Initialize + +/obj/item/light/tube + name = "light tube" + desc = "A replacement light tube." + icon_state = "ltube" + base_state = "ltube" + item_state = "c_tube" + material = /decl/material/solid/glass + matter = list(/decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT) + + b_range = 8 + b_power = 0.8 + b_color = LIGHT_COLOR_HALOGEN + lighting_modes = list( + LIGHTMODE_EMERGENCY = list(l_range = 4, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), + ) + sound_on = 'sound/machines/lightson.ogg' + +/obj/item/light/tube/party/Initialize() //Randomly colored light tubes. Mostly for testing, but maybe someone will find a use for them. + . = ..() + b_color = rgb(pick(0,255), pick(0,255), pick(0,255)) + +/obj/item/light/tube/large + w_class = ITEM_SIZE_SMALL + name = "large light tube" + b_power = 4 + b_range = 12 + +/obj/item/light/tube/large/party/Initialize() //Randomly colored light tubes. Mostly for testing, but maybe someone will find a use for them. + . = ..() + b_color = rgb(pick(0,255), pick(0,255), pick(0,255)) + +/obj/item/light/bulb + name = "light bulb" + desc = "A replacement light bulb." + icon_state = "lbulb" + base_state = "lbulb" + item_state = "contvapour" + broken_chance = 3 + material = /decl/material/solid/glass + b_color = LIGHT_COLOR_TUNGSTEN + lighting_modes = list( + LIGHTMODE_EMERGENCY = list(l_range = 3, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), + ) + +/obj/item/light/bulb/red + color = LIGHT_COLOR_RED + b_color = LIGHT_COLOR_RED + +/obj/item/light/bulb/red/readylight + lighting_modes = list( + LIGHTMODE_READY = list(l_range = 5, l_power = 1, l_color = LIGHT_COLOR_GREEN), + ) + +/obj/item/light/throw_impact(atom/hit_atom) + ..() + shatter() + +/obj/item/light/bulb/fire + name = "fire bulb" + desc = "A replacement fire bulb." + icon_state = "fbulb" + base_state = "fbulb" + item_state = "egg4" + material = /decl/material/solid/glass + +// update the icon state and description of the light +/obj/item/light/on_update_icon() + . = ..() + var/broken + switch(status) + if(LIGHT_OK) + icon_state = base_state + desc = "A replacement [name]." + if(LIGHT_BURNED) + icon_state = "[base_state]_burned" + desc = "A burnt-out [name]." + if(LIGHT_BROKEN) + icon_state = "[base_state]_broken" + desc = "A broken [name]." + broken = TRUE + add_overlay(overlay_image(icon, "[base_state]_attachment[broken ? "_broken" : ""]", flags = RESET_COLOR|RESET_ALPHA)) + +/obj/item/light/Initialize(mapload) + . = ..() + update_icon() + +// attack bulb/tube with object +// if a syringe, can inject flammable liquids to make it explode +/obj/item/light/attackby(var/obj/item/used_item, var/mob/user) + ..() + if(istype(used_item, /obj/item/chems/syringe) && used_item.reagents?.total_volume) + var/obj/item/chems/syringe/S = used_item + to_chat(user, "You inject the solution into \the [src].") + for(var/decl/material/reagent as anything in S.reagents?.reagent_volumes) + if(reagent.accelerant_value > FUEL_VALUE_ACCELERANT) + rigged = TRUE + log_and_message_admins("injected a light with flammable reagents, rigging it to explode.", user) + break + S.reagents.clear_reagents() + return TRUE + . = ..() + +// called after an attack with a light item +// shatter light, unless it was an attempt to put it in a light socket +// now only shatter if the intent was harm + +/obj/item/light/afterattack(atom/target, mob/user, proximity) + if(!proximity) return + if(istype(target, /obj/machinery/light)) + return + if(!user.check_intent(I_FLAG_HARM)) + return + + shatter() + +/obj/item/light/shatter() + if(status == LIGHT_OK || status == LIGHT_BURNED) + src.visible_message("[name] shatters.","You hear a small glass object shatter.") + status = LIGHT_BROKEN + set_sharp(TRUE) + set_base_attack_force(5) + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + update_icon() + +/obj/item/light/proc/switch_on() + switchcount++ + if(rigged) + addtimer(CALLBACK(src, PROC_REF(do_rigged_explosion)), 0.2 SECONDS) + status = LIGHT_BROKEN + else if(prob(min(60, switchcount*switchcount*0.01))) + status = LIGHT_BURNED + else if(sound_on) + playsound(src, sound_on, 75) + return status + +/obj/item/light/proc/do_rigged_explosion() + if(!rigged) + return + log_and_message_admins("Rigged light explosion, last touched by [fingerprintslast]") + var/turf/T = get_turf(src) + explosion(T, 0, 0, 3, 5) + if(!QDELETED(src)) + QDEL_IN(src, 1) diff --git a/nebula.dme b/nebula.dme index 7c527182f6f6..e22351f46394 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2633,6 +2633,10 @@ #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\lighting\~lighting_undefs.dm" +#include "code\modules\lights\_light_defines.dm" +#include "code\modules\lights\floorlamp.dm" +#include "code\modules\lights\light_fixture.dm" +#include "code\modules\lights\light_items.dm" #include "code\modules\locks\key.dm" #include "code\modules\locks\keyring.dm" #include "code\modules\locks\lock.dm" @@ -3405,11 +3409,9 @@ #include "code\modules\power\cable.dm" #include "code\modules\power\cell.dm" #include "code\modules\power\debug_items.dm" -#include "code\modules\power\floorlamp.dm" #include "code\modules\power\generator.dm" #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\heavycable.dm" -#include "code\modules\power\lighting.dm" #include "code\modules\power\port_gen.dm" #include "code\modules\power\power.dm" #include "code\modules\power\powernet.dm" From f40272e36f5df8271e0527b4f8798961e16452d0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 13 Oct 2025 14:21:19 -0400 Subject: [PATCH 19/93] Reorganize lights module --- code/game/machinery/wall_frames.dm | 26 --- .../designs/general/designs_engineering.dm | 12 -- .../designs/general/designs_general.dm | 9 - code/modules/lights/_light_defines.dm | 11 -- .../{light_items.dm => light_bulbs_tubes.dm} | 32 ++-- code/modules/lights/light_fabrication.dm | 26 +++ ...light_fixture.dm => light_fixture_base.dm} | 155 ++++-------------- .../lights/light_fixture_construction.dm | 56 +++++++ ...loorlamp.dm => light_fixture_floorlamp.dm} | 20 +-- .../lights/light_fixture_navigation.dm | 36 ++++ code/modules/lights/light_fixture_small.dm | 26 +++ code/modules/lights/light_fixture_spot.dm | 7 + .../lights/light_replacer.dm} | 26 +-- .../lights/light_switch.dm} | 0 .../lights/light_switch_frames.dm} | 2 - nebula.dme | 18 +- 16 files changed, 224 insertions(+), 238 deletions(-) delete mode 100644 code/modules/lights/_light_defines.dm rename code/modules/lights/{light_items.dm => light_bulbs_tubes.dm} (84%) create mode 100644 code/modules/lights/light_fabrication.dm rename code/modules/lights/{light_fixture.dm => light_fixture_base.dm} (75%) create mode 100644 code/modules/lights/light_fixture_construction.dm rename code/modules/lights/{floorlamp.dm => light_fixture_floorlamp.dm} (75%) create mode 100644 code/modules/lights/light_fixture_navigation.dm create mode 100644 code/modules/lights/light_fixture_small.dm create mode 100644 code/modules/lights/light_fixture_spot.dm rename code/{game/objects/items/devices/lightreplacer.dm => modules/lights/light_replacer.dm} (89%) rename code/{game/machinery/lightswitch.dm => modules/lights/light_switch.dm} (100%) rename code/{game/objects/items/buttons.dm => modules/lights/light_switch_frames.dm} (97%) diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 56e7c788416d..13bf81ae5e2d 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -104,32 +104,6 @@ name = "wall-mounted relay kit" desc = "An all-in-one wall-mounted relay kit, comes preassembled." -/obj/item/frame/light - name = "light fixture frame" - desc = "Used for building lights." - icon = 'icons/obj/lighting.dmi' - icon_state = "tube-construct-item" - build_machine_type = /obj/machinery/light - reverse = 1 - -/obj/item/frame/light/small - name = "small light fixture frame" - icon_state = "bulb-construct-item" - material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/light/small - -/obj/item/frame/light/spot - name = "spotlight fixture frame" - icon_state = "tube-construct-item" - material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/light/spot - -/obj/item/frame/light/nav - name = "navigation light fixture frame" - icon_state = "tube-construct-item" - material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/light/navigation - /obj/item/frame/button name = "button frame" icon = 'icons/obj/objects.dmi' diff --git a/code/modules/fabrication/designs/general/designs_engineering.dm b/code/modules/fabrication/designs/general/designs_engineering.dm index c877965c4ccf..bb76b11ed1f0 100644 --- a/code/modules/fabrication/designs/general/designs_engineering.dm +++ b/code/modules/fabrication/designs/general/designs_engineering.dm @@ -29,18 +29,6 @@ /datum/fabricator_recipe/engineering/wallcharger path = /obj/item/frame/button/wall_charger/kit -/datum/fabricator_recipe/engineering/light_switch - path = /obj/item/frame/button/light_switch/kit - -/datum/fabricator_recipe/engineering/window_tint - path = /obj/item/frame/button/light_switch/windowtint/kit - -/datum/fabricator_recipe/engineering/spotlight - path = /obj/item/frame/light/spot - -/datum/fabricator_recipe/engineering/navlight - path = /obj/item/frame/light/nav - /datum/fabricator_recipe/engineering/button_frame path = /obj/item/frame/button /datum/fabricator_recipe/engineering/button_kit diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 55d33d3e2941..aef3b2e9a27a 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -46,15 +46,6 @@ /datum/fabricator_recipe/taperecorder_tape path = /obj/item/magnetic_tape -/datum/fabricator_recipe/tube/large - path = /obj/item/light/tube/large - -/datum/fabricator_recipe/tube - path = /obj/item/light/tube - -/datum/fabricator_recipe/bulb - path = /obj/item/light/bulb - /datum/fabricator_recipe/ashtray_glass path = /obj/item/ashtray/glass diff --git a/code/modules/lights/_light_defines.dm b/code/modules/lights/_light_defines.dm deleted file mode 100644 index 33a9fe364e30..000000000000 --- a/code/modules/lights/_light_defines.dm +++ /dev/null @@ -1,11 +0,0 @@ -// status values shared between lighting fixtures and items -#define LIGHT_OK 0 -#define LIGHT_EMPTY 1 -#define LIGHT_BROKEN 2 -#define LIGHT_BURNED 3 - -#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb -#define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range - -#define LIGHTMODE_EMERGENCY "emergency_lighting" -#define LIGHTMODE_READY "ready" \ No newline at end of file diff --git a/code/modules/lights/light_items.dm b/code/modules/lights/light_bulbs_tubes.dm similarity index 84% rename from code/modules/lights/light_items.dm rename to code/modules/lights/light_bulbs_tubes.dm index 8c596a523756..6923213ab2b8 100644 --- a/code/modules/lights/light_items.dm +++ b/code/modules/lights/light_bulbs_tubes.dm @@ -8,7 +8,15 @@ material = /decl/material/solid/metal/steel atom_flags = ATOM_FLAG_CAN_BE_PAINTED obj_flags = OBJ_FLAG_HOLLOW - var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN + var/const/MODE_EMERGENCY = "emergency_lighting" + var/const/MODE_READY = "ready" + + var/const/STATUS_OK = 0 + var/const/STATUS_EMPTY = 1 + var/const/STATUS_BROKEN = 2 + var/const/STATUS_BURNED = 3 + + var/status = STATUS_OK // STATUS_OK, STATUS_BURNED or STATUS_BROKEN var/base_state var/switchcount = 0 // number of times switched var/rigged = 0 // true if rigged to explode @@ -40,7 +48,7 @@ b_power = 0.8 b_color = LIGHT_COLOR_HALOGEN lighting_modes = list( - LIGHTMODE_EMERGENCY = list(l_range = 4, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), + MODE_EMERGENCY = list(l_range = 4, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), ) sound_on = 'sound/machines/lightson.ogg' @@ -68,7 +76,7 @@ material = /decl/material/solid/glass b_color = LIGHT_COLOR_TUNGSTEN lighting_modes = list( - LIGHTMODE_EMERGENCY = list(l_range = 3, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), + MODE_EMERGENCY = list(l_range = 3, l_power = 1, l_color = LIGHT_COLOR_EMERGENCY), ) /obj/item/light/bulb/red @@ -77,7 +85,7 @@ /obj/item/light/bulb/red/readylight lighting_modes = list( - LIGHTMODE_READY = list(l_range = 5, l_power = 1, l_color = LIGHT_COLOR_GREEN), + MODE_READY = list(l_range = 5, l_power = 1, l_color = LIGHT_COLOR_GREEN), ) /obj/item/light/throw_impact(atom/hit_atom) @@ -97,13 +105,13 @@ . = ..() var/broken switch(status) - if(LIGHT_OK) + if(STATUS_OK) icon_state = base_state desc = "A replacement [name]." - if(LIGHT_BURNED) + if(STATUS_BURNED) icon_state = "[base_state]_burned" desc = "A burnt-out [name]." - if(LIGHT_BROKEN) + if(STATUS_BROKEN) icon_state = "[base_state]_broken" desc = "A broken [name]." broken = TRUE @@ -143,9 +151,9 @@ shatter() /obj/item/light/shatter() - if(status == LIGHT_OK || status == LIGHT_BURNED) - src.visible_message("[name] shatters.","You hear a small glass object shatter.") - status = LIGHT_BROKEN + if(status == STATUS_OK || status == STATUS_BURNED) + src.visible_message(SPAN_WARNING("[name] shatters."), SPAN_WARNING("You hear a small glass object shatter.")) + status = STATUS_BROKEN set_sharp(TRUE) set_base_attack_force(5) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) @@ -155,9 +163,9 @@ switchcount++ if(rigged) addtimer(CALLBACK(src, PROC_REF(do_rigged_explosion)), 0.2 SECONDS) - status = LIGHT_BROKEN + status = STATUS_BROKEN else if(prob(min(60, switchcount*switchcount*0.01))) - status = LIGHT_BURNED + status = STATUS_BURNED else if(sound_on) playsound(src, sound_on, 75) return status diff --git a/code/modules/lights/light_fabrication.dm b/code/modules/lights/light_fabrication.dm new file mode 100644 index 000000000000..dde35d626cfa --- /dev/null +++ b/code/modules/lights/light_fabrication.dm @@ -0,0 +1,26 @@ +// Bulbs and tubes +/datum/fabricator_recipe/tube/large + path = /obj/item/light/tube/large + +/datum/fabricator_recipe/tube + path = /obj/item/light/tube + +/datum/fabricator_recipe/bulb + path = /obj/item/light/bulb + +// Switches +/datum/fabricator_recipe/engineering/light_switch + path = /obj/item/frame/button/light_switch/kit + +/datum/fabricator_recipe/engineering/window_tint + path = /obj/item/frame/button/light_switch/windowtint/kit + +// Frames +/datum/fabricator_recipe/engineering/spotlight + path = /obj/item/frame/light/spot + +/datum/fabricator_recipe/engineering/navlight + path = /obj/item/frame/light/nav + +/datum/fabricator_recipe/engineering/floorlamp + path = /obj/item/machine_chassis/flamp \ No newline at end of file diff --git a/code/modules/lights/light_fixture.dm b/code/modules/lights/light_fixture_base.dm similarity index 75% rename from code/modules/lights/light_fixture.dm rename to code/modules/lights/light_fixture_base.dm index a9c5f84cc99b..0f2f5741a626 100644 --- a/code/modules/lights/light_fixture.dm +++ b/code/modules/lights/light_fixture_base.dm @@ -21,6 +21,10 @@ frame_type = /obj/item/frame/light directional_offset = @'{"NORTH":{"y":21}, "EAST":{"x":10}, "WEST":{"x":-10}}' + var/const/LIGHT_BULB_TEMPERATURE = 400 //K - used value for a 60W bulb + + var/const/WATTS_PER_LUM_RANGE = 5 // watts per luminosity-range + var/on = 0 // 1 if on, 0 if off var/flickering = 0 var/light_type = /obj/item/light/tube // the type of light item @@ -41,30 +45,6 @@ update_light_status(TRUE) update_icon() -// the smaller bulb light fixture -/obj/machinery/light/small - icon_state = "bulb_map" - base_state = "bulb" - desc = "A small lighting fixture." - light_type = /obj/item/light/bulb - accepts_light_type = /obj/item/light/bulb - base_type = /obj/machinery/light/small - frame_type = /obj/item/frame/light/small - -/obj/machinery/light/small/emergency - light_type = /obj/item/light/bulb/red - -/obj/machinery/light/small/red - light_type = /obj/item/light/bulb/red - -/obj/machinery/light/spot - name = "spotlight" - desc = "A more robust socket for light tubes that demand more power." - light_type = /obj/item/light/tube/large - accepts_light_type = /obj/item/light/tube/large - base_type = /obj/machinery/light/spot - frame_type = /obj/item/frame/light/spot - // create a new lighting fixture /obj/machinery/light/Initialize(mapload, d=0, populate_parts = TRUE) . = ..() @@ -98,7 +78,7 @@ if(currently_updating) // avoid infinite loops during power usage updates return currently_updating = TRUE - if(get_status() == LIGHT_OK) // we can't reuse this value later because update_use_power might change our status + if(get_bulb_status() == lightbulb::STATUS_OK) // we can't reuse this value later because update_use_power might change our status atom_flags |= ATOM_FLAG_CAN_BE_PAINTED else atom_flags &= ~ATOM_FLAG_CAN_BE_PAINTED @@ -109,12 +89,12 @@ set_light(arglist(lightbulb.lighting_modes[current_mode])) else set_light(lightbulb.b_range, lightbulb.b_power, lightbulb.b_color) - if(trigger && get_status() == LIGHT_OK) + if(trigger && get_bulb_status() == lightbulb::STATUS_OK) switch_check() else update_use_power(POWER_USE_OFF) set_light(0) - change_power_consumption((light_range * light_power) * LIGHTING_POWER_FACTOR, POWER_USE_ACTIVE) + change_power_consumption((light_range * light_power) * WATTS_PER_LUM_RANGE, POWER_USE_ACTIVE) currently_updating = FALSE /obj/machinery/light/update_use_power(new_use_power) @@ -137,12 +117,12 @@ // Extra overlays if we're active var/_state - switch(get_status()) // set icon_states - if(LIGHT_OK) + switch(get_bulb_status()) // set icon_states + if(lightbulb::STATUS_OK) _state = "[base_state][on]" - if(LIGHT_BURNED) + if(lightbulb::STATUS_BURNED) _state = "[base_state]_burned" - if(LIGHT_BROKEN) + if(lightbulb::STATUS_BROKEN) _state = "[base_state]_broken" if(istype(lightbulb, /obj/item/light)) @@ -153,15 +133,12 @@ if(on) compile_overlays() // force a compile so that we update prior to the light being set -/obj/machinery/light/proc/get_status() - if(!lightbulb) - return LIGHT_EMPTY - else - return lightbulb.status +/obj/machinery/light/proc/get_bulb_status() + return lightbulb ? lightbulb.status : lightbulb::STATUS_EMPTY /obj/machinery/light/proc/switch_check() lightbulb.switch_on() - if(get_status() != LIGHT_OK) + if(get_bulb_status() != lightbulb::STATUS_OK) set_light(0) /obj/machinery/light/proc/set_mode(var/new_mode) @@ -181,18 +158,18 @@ return if(enable) - if(LIGHTMODE_EMERGENCY in lightbulb.lighting_modes) - set_mode(LIGHTMODE_EMERGENCY) + if(lightbulb::MODE_EMERGENCY in lightbulb.lighting_modes) + set_mode(lightbulb::MODE_EMERGENCY) update_power_channel(ENVIRON) else - if(current_mode == LIGHTMODE_EMERGENCY) + if(current_mode == lightbulb::MODE_EMERGENCY) set_mode(null) update_power_channel(initial(power_channel)) // attempt to set the light's on/off status // will not switch on if broken/burned/empty /obj/machinery/light/proc/seton(var/state) - on = (state && get_status() == LIGHT_OK) + on = (state && get_bulb_status() == lightbulb::STATUS_OK) update_light_status(TRUE) update_icon() @@ -200,19 +177,20 @@ /obj/machinery/light/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/fitting = get_fitting_name() - switch(get_status()) - if(LIGHT_OK) + switch(get_bulb_status()) + if(lightbulb::STATUS_OK) . += "It is turned [on? "on" : "off"]." - if(LIGHT_EMPTY) + if(lightbulb::STATUS_EMPTY) . += "The [fitting] has been removed." - if(LIGHT_BURNED) + if(lightbulb::STATUS_BURNED) . += "The [fitting] is burnt out." - if(LIGHT_BROKEN) + if(lightbulb::STATUS_BROKEN) . += "The [fitting] has been smashed." /obj/machinery/light/proc/get_fitting_name() - var/obj/item/light/L = light_type - return initial(L.name) + // use accepts_light_type so stuff that begins blank is fine + var/obj/item/light/type_used = accepts_light_type + return type_used::name // attack with item - insert light (if right type), otherwise try to break the light @@ -263,7 +241,7 @@ // attempt to break the light //If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N - else if(lightbulb && (lightbulb.status != LIGHT_BROKEN) && !user.check_intent(I_FLAG_HELP)) + else if(lightbulb && (lightbulb.status != lightbulb::STATUS_BROKEN) && !user.check_intent(I_FLAG_HELP)) if(prob(1 + used_item.expend_attack_force(user) * 5)) @@ -295,13 +273,13 @@ if(flickering) return flickering = 1 spawn(0) - if(on && get_status() == LIGHT_OK) + if(on && get_bulb_status() == lightbulb::STATUS_OK) for(var/i = 0; i < amount; i++) - if(get_status() != LIGHT_OK) break + if(get_bulb_status() != lightbulb::STATUS_OK) break on = !on update_light_status(FALSE) sleep(rand(5, 15)) - on = (get_status() == LIGHT_OK) + on = (get_bulb_status() == lightbulb::STATUS_OK) update_light_status(FALSE) update_icon() flickering = 0 @@ -364,18 +342,18 @@ return if(!skip_sound_and_sparks) - if(lightbulb && !(lightbulb.status == LIGHT_BROKEN)) + if(lightbulb && !(lightbulb.status == lightbulb::STATUS_BROKEN)) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) if(on) spark_at(src, cardinal_only = TRUE) - lightbulb.status = LIGHT_BROKEN + lightbulb.status = lightbulb::STATUS_BROKEN update_light_status(TRUE) update_icon() /obj/machinery/light/proc/fix() - if(get_status() == LIGHT_OK || !lightbulb) + if(get_bulb_status() == lightbulb::STATUS_OK || !lightbulb) return - lightbulb.status = LIGHT_OK + lightbulb.status = lightbulb::STATUS_OK on = TRUE update_light_status(TRUE) update_icon() @@ -412,70 +390,7 @@ broken() return ..() -/obj/machinery/light/small/readylight - light_type = /obj/item/light/bulb/red/readylight - var/state = 0 - -/obj/machinery/light/small/readylight/proc/set_state(var/new_state) - state = new_state - if(state) - set_mode(LIGHTMODE_READY) - else - set_mode(null) - -/obj/machinery/light/navigation - name = "navigation light" - desc = "A periodically flashing light." - icon = 'icons/obj/lighting_nav.dmi' - icon_state = "nav10" - base_state = "nav1" - light_type = /obj/item/light/tube/large - accepts_light_type = /obj/item/light/tube/large - on = TRUE - var/delay = 1 - base_type = /obj/machinery/light/navigation - frame_type = /obj/item/frame/light/nav - stat_immune = NOPOWER | NOINPUT | NOSCREEN - -/obj/machinery/light/navigation/on_update_icon() - . = ..() // this will handle pixel offsets - icon_state = "nav[delay][!!(lightbulb && on)]" - -/obj/machinery/light/navigation/attackby(obj/item/used_item, mob/user) - . = ..() - if(!. && IS_MULTITOOL(used_item)) - delay = 5 + ((delay + 1) % 5) - to_chat(user, SPAN_NOTICE("You adjust the delay on \the [src].")) - return TRUE - -/obj/machinery/light/navigation/delay2 - delay = 2 - -/obj/machinery/light/navigation/delay3 - delay = 3 - -/obj/machinery/light/navigation/delay4 - delay = 4 - -/obj/machinery/light/navigation/delay5 - delay = 5 - /obj/machinery/light/do_simple_ranged_interaction(var/mob/user) if(lightbulb) remove_bulb() - return TRUE - -// Partially-constructed presets for mapping -/obj/machinery/light/fixture - icon_state = "tube-construct-stage1" - -/obj/machinery/light/fixture/Initialize(mapload, d, populate_parts) - . = ..(mapload, d, populate_parts = FALSE) - construct_state.post_construct(src) - -/obj/machinery/light/small/fixture - icon_state = "bulb-construct-stage1" - -/obj/machinery/light/small/fixture/Initialize(mapload, d, populate_parts) - . = ..(mapload, d, populate_parts = FALSE) - construct_state.post_construct(src) \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/code/modules/lights/light_fixture_construction.dm b/code/modules/lights/light_fixture_construction.dm new file mode 100644 index 000000000000..eb0b410aab85 --- /dev/null +++ b/code/modules/lights/light_fixture_construction.dm @@ -0,0 +1,56 @@ +// Frames +/obj/item/frame/light + name = "light fixture frame" + desc = "Used for building lights." + icon = 'icons/obj/lighting.dmi' + icon_state = "tube-construct-item" + build_machine_type = /obj/machinery/light + reverse = 1 + +/obj/item/frame/light/small + name = "small light fixture frame" + icon_state = "bulb-construct-item" + material = /decl/material/solid/metal/steel + build_machine_type = /obj/machinery/light/small + +/obj/item/frame/light/spot + name = "spotlight fixture frame" + icon_state = "tube-construct-item" + material = /decl/material/solid/metal/steel + build_machine_type = /obj/machinery/light/spot + +/obj/item/frame/light/nav + name = "navigation light fixture frame" + icon_state = "tube-construct-item" + material = /decl/material/solid/metal/steel + build_machine_type = /obj/machinery/light/navigation + +/obj/item/machine_chassis/flamp + name = "lamp fixture frame" + desc = "A bare frame for a standing lamp fixture. Must be secured to the floor with a wrench." + icon = 'icons/obj/floorlamp.dmi' + icon_state = "flamp-construct-item" + w_class = ITEM_SIZE_STRUCTURE + material = /decl/material/solid/metal/steel + build_type = /obj/machinery/light/flamp/noshade/deconstruct + +// Partially-constructed presets for mapping +/obj/machinery/light/fixture + icon_state = "tube-construct-stage1" + +/obj/machinery/light/fixture/Initialize(mapload, d, populate_parts) + . = ..(mapload, d, populate_parts = FALSE) + construct_state.post_construct(src) + +/obj/machinery/light/small/fixture + icon_state = "bulb-construct-stage1" + +/obj/machinery/light/small/fixture/Initialize(mapload, d, populate_parts) + . = ..(mapload, d, populate_parts = FALSE) + construct_state.post_construct(src) + +// Subtype used for creation via crafting. +/obj/machinery/light/flamp/noshade/deconstruct + light_type = null + panel_open = TRUE + construct_state = /decl/machine_construction/wall_frame/no_wires/simple \ No newline at end of file diff --git a/code/modules/lights/floorlamp.dm b/code/modules/lights/light_fixture_floorlamp.dm similarity index 75% rename from code/modules/lights/floorlamp.dm rename to code/modules/lights/light_fixture_floorlamp.dm index 067ee2b484be..a580651cb975 100644 --- a/code/modules/lights/floorlamp.dm +++ b/code/modules/lights/light_fixture_floorlamp.dm @@ -58,7 +58,7 @@ b_range = 6 b_power = 1 lighting_modes = list( - LIGHTMODE_EMERGENCY = list(l_range = 6, l_power = 0.45, l_color = LIGHT_COLOR_EMERGENCY), + MODE_EMERGENCY = list(l_range = 6, l_power = 0.45, l_color = LIGHT_COLOR_EMERGENCY), ) /obj/item/light/bulb/large/Initialize(mapload, obj/machinery/light/fixture) @@ -77,21 +77,3 @@ material = /decl/material/solid/organic/cloth obj_flags = OBJ_FLAG_HOLLOW w_class = ITEM_SIZE_NORMAL - -// Subtype used for creation via crafting. -/obj/machinery/light/flamp/noshade/deconstruct - light_type = null - panel_open = TRUE - construct_state = /decl/machine_construction/wall_frame/no_wires/simple - -/obj/item/machine_chassis/flamp - name = "lamp fixture frame" - desc = "A bare frame for a standing lamp fixture. Must be secured to the floor with a wrench." - icon = 'icons/obj/floorlamp.dmi' - icon_state = "flamp-construct-item" - w_class = ITEM_SIZE_STRUCTURE - material = /decl/material/solid/metal/steel - build_type = /obj/machinery/light/flamp/noshade/deconstruct - -/datum/fabricator_recipe/engineering/floorlamp - path = /obj/item/machine_chassis/flamp \ No newline at end of file diff --git a/code/modules/lights/light_fixture_navigation.dm b/code/modules/lights/light_fixture_navigation.dm new file mode 100644 index 000000000000..1e0046ef3fbb --- /dev/null +++ b/code/modules/lights/light_fixture_navigation.dm @@ -0,0 +1,36 @@ +/obj/machinery/light/navigation + name = "navigation light" + desc = "A periodically flashing light." + icon = 'icons/obj/lighting_nav.dmi' + icon_state = "nav10" + base_state = "nav1" + light_type = /obj/item/light/tube/large + accepts_light_type = /obj/item/light/tube/large + on = TRUE + var/delay = 1 + base_type = /obj/machinery/light/navigation + frame_type = /obj/item/frame/light/nav + stat_immune = NOPOWER | NOINPUT | NOSCREEN + +/obj/machinery/light/navigation/on_update_icon() + . = ..() // this will handle pixel offsets + icon_state = "nav[delay][!!(lightbulb && on)]" + +/obj/machinery/light/navigation/attackby(obj/item/used_item, mob/user) + . = ..() + if(!. && IS_MULTITOOL(used_item)) + delay = 5 + ((delay + 1) % 5) + to_chat(user, SPAN_NOTICE("You adjust the delay on \the [src].")) + return TRUE + +/obj/machinery/light/navigation/delay2 + delay = 2 + +/obj/machinery/light/navigation/delay3 + delay = 3 + +/obj/machinery/light/navigation/delay4 + delay = 4 + +/obj/machinery/light/navigation/delay5 + delay = 5 \ No newline at end of file diff --git a/code/modules/lights/light_fixture_small.dm b/code/modules/lights/light_fixture_small.dm new file mode 100644 index 000000000000..c3b745ee6602 --- /dev/null +++ b/code/modules/lights/light_fixture_small.dm @@ -0,0 +1,26 @@ +// the smaller bulb light fixture +/obj/machinery/light/small + icon_state = "bulb_map" + base_state = "bulb" + desc = "A small lighting fixture." + light_type = /obj/item/light/bulb + accepts_light_type = /obj/item/light/bulb + base_type = /obj/machinery/light/small + frame_type = /obj/item/frame/light/small + +/obj/machinery/light/small/emergency + light_type = /obj/item/light/bulb/red + +/obj/machinery/light/small/red + light_type = /obj/item/light/bulb/red + +/obj/machinery/light/small/readylight + light_type = /obj/item/light/bulb/red/readylight + var/state = 0 + +/obj/machinery/light/small/readylight/proc/set_state(var/new_state) + state = new_state + if(state) + set_mode(lightbulb::MODE_READY) + else + set_mode(null) diff --git a/code/modules/lights/light_fixture_spot.dm b/code/modules/lights/light_fixture_spot.dm new file mode 100644 index 000000000000..380a9d5a1563 --- /dev/null +++ b/code/modules/lights/light_fixture_spot.dm @@ -0,0 +1,7 @@ +/obj/machinery/light/spot + name = "spotlight" + desc = "A more robust socket for light tubes that demand more power." + light_type = /obj/item/light/tube/large + accepts_light_type = /obj/item/light/tube/large + base_type = /obj/machinery/light/spot + frame_type = /obj/item/frame/light/spot \ No newline at end of file diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/modules/lights/light_replacer.dm similarity index 89% rename from code/game/objects/items/devices/lightreplacer.dm rename to code/modules/lights/light_replacer.dm index df209e9cc0d5..0292a67ce847 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/modules/lights/light_replacer.dm @@ -32,12 +32,6 @@ // // The explosion cannot insta-kill anyone with 30% or more health. -#define LIGHT_OK 0 -#define LIGHT_EMPTY 1 -#define LIGHT_BROKEN 2 -#define LIGHT_BURNED 3 - - /obj/item/lightreplacer name = "light replacer" desc = "A lightweight automated device, capable of interfacing with and rapidly replacing standard light installations." @@ -95,12 +89,12 @@ if(istype(used_item, /obj/item/stack/material) && used_item.get_material_type() == /decl/material/solid/glass) var/obj/item/stack/G = used_item if(uses >= max_uses) - to_chat(user, "\The [src] is full.") + to_chat(user, SPAN_WARNING("\The [src] is full.")) else if(G.use(1)) AddUses(16) //Autolathe converts 1 sheet into 16 lights. // TODO: Make this use matter instead - to_chat(user, "You insert a piece of glass into \the [src]. You have [uses] light\s remaining.") + to_chat(user, SPAN_NOTICE("You insert a piece of glass into \the [src]. You have [uses] light\s remaining.")) else - to_chat(user, "You need one sheet of glass to replace lights.") + to_chat(user, SPAN_WARNING("You need one sheet of glass to replace lights.")) return TRUE if(istype(used_item, /obj/item/light)) @@ -145,12 +139,12 @@ /obj/item/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U) - if(target.get_status() == LIGHT_OK) + if(target.get_bulb_status() == /obj/item/light::STATUS_OK) to_chat(U, "There is a working [target.get_fitting_name()] already inserted.") else if(!CanUse(U)) to_chat(U, "\The [src]'s refill light blinks red.") else if(Use(U)) - to_chat(U, "You replace the [target.get_fitting_name()] with \the [src].") + to_chat(U, SPAN_NOTICE("You replace the [target.get_fitting_name()] with \the [src].")) if(target.lightbulb) target.remove_bulb() @@ -171,12 +165,4 @@ /obj/item/lightreplacer/proc/CanUse(var/mob/living/user) src.add_fingerprint(user) //Not sure what else to check for. Maybe if clumsy? - if(uses > 0) - return 1 - else - return 0 - -#undef LIGHT_OK -#undef LIGHT_EMPTY -#undef LIGHT_BROKEN -#undef LIGHT_BURNED + return uses > 0 diff --git a/code/game/machinery/lightswitch.dm b/code/modules/lights/light_switch.dm similarity index 100% rename from code/game/machinery/lightswitch.dm rename to code/modules/lights/light_switch.dm diff --git a/code/game/objects/items/buttons.dm b/code/modules/lights/light_switch_frames.dm similarity index 97% rename from code/game/objects/items/buttons.dm rename to code/modules/lights/light_switch_frames.dm index 14d4978bf7e5..a415018a29c8 100644 --- a/code/game/objects/items/buttons.dm +++ b/code/modules/lights/light_switch_frames.dm @@ -1,5 +1,3 @@ -// Lightswitch Hull - /obj/item/frame/button/light_switch name = "light switch frame" desc = "Used for building a light switch." diff --git a/nebula.dme b/nebula.dme index e22351f46394..393a9424259b 100644 --- a/nebula.dme +++ b/nebula.dme @@ -841,7 +841,6 @@ #include "code\game\machinery\holosign.dm" #include "code\game\machinery\igniter.dm" #include "code\game\machinery\jukebox.dm" -#include "code\game\machinery\lightswitch.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mech_recharger.dm" #include "code\game\machinery\message_server.dm" @@ -1072,7 +1071,6 @@ #include "code\game\objects\items\blackout.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\buttons.dm" #include "code\game\objects\items\candelabra.dm" #include "code\game\objects\items\chisel.dm" #include "code\game\objects\items\christmas.dm" @@ -1184,7 +1182,6 @@ #include "code\game\objects\items\devices\hailer.dm" #include "code\game\objects\items\devices\holowarrant.dm" #include "code\game\objects\items\devices\inducer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\modkit.dm" #include "code\game\objects\items\devices\multitool.dm" @@ -2633,10 +2630,17 @@ #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\lighting\~lighting_undefs.dm" -#include "code\modules\lights\_light_defines.dm" -#include "code\modules\lights\floorlamp.dm" -#include "code\modules\lights\light_fixture.dm" -#include "code\modules\lights\light_items.dm" +#include "code\modules\lights\light_bulbs_tubes.dm" +#include "code\modules\lights\light_fabrication.dm" +#include "code\modules\lights\light_fixture_base.dm" +#include "code\modules\lights\light_fixture_construction.dm" +#include "code\modules\lights\light_fixture_floorlamp.dm" +#include "code\modules\lights\light_fixture_navigation.dm" +#include "code\modules\lights\light_fixture_small.dm" +#include "code\modules\lights\light_fixture_spot.dm" +#include "code\modules\lights\light_replacer.dm" +#include "code\modules\lights\light_switch.dm" +#include "code\modules\lights\light_switch_frames.dm" #include "code\modules\locks\key.dm" #include "code\modules\locks\keyring.dm" #include "code\modules\locks\lock.dm" From a86982bc2687df13443ad4880e354cee90bfe302 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 17 Oct 2025 19:51:53 -0400 Subject: [PATCH 20/93] Eliminate useless flufftext 'module' --- code/modules/flufftext/TextFilters.dm | 125 -------------------------- code/modules/mob/mob_helpers.dm | 124 +++++++++++++++++++++++++ nebula.dme | 1 - 3 files changed, 124 insertions(+), 126 deletions(-) delete mode 100644 code/modules/flufftext/TextFilters.dm diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm deleted file mode 100644 index e1b85dc1b3f7..000000000000 --- a/code/modules/flufftext/TextFilters.dm +++ /dev/null @@ -1,125 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/proc/NewStutter(phrase,stunned) - phrase = html_decode(phrase) - - var/list/split_phrase = splittext(phrase," ") //Split it up into words. - - var/list/unstuttered_words = split_phrase.Copy() - var/i = rand(1,3) - if(stunned) i = split_phrase.len - for(,i > 0,i--) //Pick a few words to stutter on. - - if (!unstuttered_words.len) - break - var/word = pick(unstuttered_words) - unstuttered_words -= word //Remove from unstuttered words so we don't stutter it again. - var/index = split_phrase.Find(word) //Find the word in the split phrase so we can replace it. - - //Search for dipthongs (two letters that make one sound.) - var/first_sound = copytext_char(word,1,3) - var/first_letter = copytext_char(word,1,2) - if(lowertext(first_sound) in list("ch","th","sh")) - first_letter = first_sound - - //Repeat the first letter to create a stutter. - var/rnum = rand(1,3) - switch(rnum) - if(1) - word = "[first_letter]-[word]" - if(2) - word = "[first_letter]-[first_letter]-[word]" - if(3) - word = "[first_letter]-[word]" - - split_phrase[index] = word - - return sanitize(jointext(split_phrase," ")) - -/* -RadioChat Filter. -args: -message - returns a distorted version of this -distortion_chance - the chance of a filter being applied to each character. -distortion_speed - multiplier for the chance increase. -distortion - starting distortion. -english_only - whether to use traditional english letters only (for use in NanoUI) -*/ -/proc/RadioChat(mob/living/user, message, distortion_chance = 60, distortion_speed = 1, distortion = 1, english_only = 0) - var/decl/language/language = user?.get_default_language() - message = html_decode(message) - var/new_message = "" - var/input_size = length(message) - var/cursor_position = 0 - if(input_size < 20) // Short messages get distorted too. Bit hacksy. - distortion += (20-input_size)/2 - while(cursor_position <= input_size) - var/newletter=copytext_char(message, cursor_position, cursor_position+1) - if(!prob(distortion_chance)) - new_message += newletter - cursor_position += 1 - continue - if(newletter != " ") - if(prob(0.08 * distortion)) // Major cutout - newletter = "*zzzt*" - cursor_position += rand(1, (length(message) - cursor_position)) // Skip some characters - distortion += 1 * distortion_speed - else if(prob(0.8 * distortion)) // Minor cut out - if(prob(25)) - newletter = ".." - else if(prob(25)) - newletter = " " - else - newletter = "" - distortion += 0.25 * distortion_speed - else if(prob(2 * distortion)) // Mishearing - if(language && language.syllables && prob(50)) - newletter = pick(language.syllables) - else - newletter = pick("a","e","i","o","u") - distortion += 0.25 * distortion_speed - else if(prob(1.5 * distortion)) // Mishearing - if(language && prob(50)) - if(language.syllables) - newletter = pick (language.syllables) - else - newletter = "*" - else - if(english_only) - newletter += "*" - else - newletter = pick("ø", "Ð", "%", "æ", "µ") - distortion += 0.5 * distortion_speed - else if(prob(0.75 * distortion)) // Incomprehensible - newletter = pick("<", ">", "!", "$", "%", "^", "&", "*", "~", "#") - distortion += 0.75 * distortion_speed - else if(prob(0.05 * distortion)) // Total cut out - if(!english_only) - newletter = "¦w¡¼b»%> -BZZT-" - else - newletter = "srgt%$hjc< -BZZT-" - new_message += newletter - break - else if(prob(2.5 * distortion)) // Sound distortion. Still recognisable, mostly. - switch(lowertext(newletter)) - if("s") - newletter = "$" - if("e") - newletter = "£" - if("w") - newletter = "ø" - if("y") - newletter = "¡" - if("x") - newletter = "æ" - if("u") - newletter = "µ" - else - if(prob(0.2 * distortion)) - newletter = " *crackle* " - distortion += 0.25 * distortion_speed - if(prob(20)) - capitalize(newletter) - new_message += newletter - cursor_position += 1 - return new_message diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3a0b89f448b1..7a546009a86c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -215,6 +215,130 @@ var/global/list/global/organ_rel_size = list( return returntext +/proc/NewStutter(phrase,stunned) + phrase = html_decode(phrase) + + var/list/split_phrase = splittext(phrase," ") //Split it up into words. + + var/list/unstuttered_words = split_phrase.Copy() + var/i = rand(1,3) + if(stunned) i = split_phrase.len + for(,i > 0,i--) //Pick a few words to stutter on. + + if (!unstuttered_words.len) + break + var/word = pick(unstuttered_words) + unstuttered_words -= word //Remove from unstuttered words so we don't stutter it again. + var/index = split_phrase.Find(word) //Find the word in the split phrase so we can replace it. + + //Search for dipthongs (two letters that make one sound.) + var/first_sound = copytext_char(word,1,3) + var/first_letter = copytext_char(word,1,2) + if(lowertext(first_sound) in list("ch","th","sh")) + first_letter = first_sound + + //Repeat the first letter to create a stutter. + var/rnum = rand(1,3) + switch(rnum) + if(1) + word = "[first_letter]-[word]" + if(2) + word = "[first_letter]-[first_letter]-[word]" + if(3) + word = "[first_letter]-[word]" + + split_phrase[index] = word + + return sanitize(jointext(split_phrase," ")) + +/* +RadioChat Filter. +args: +message - returns a distorted version of this +distortion_chance - the chance of a filter being applied to each character. +distortion_speed - multiplier for the chance increase. +distortion - starting distortion. +english_only - whether to use traditional english letters only (for use in NanoUI) +*/ +/proc/RadioChat(mob/living/user, message, distortion_chance = 60, distortion_speed = 1, distortion = 1, english_only = 0) + var/decl/language/language = user?.get_default_language() + message = html_decode(message) + var/new_message = "" + var/input_size = length(message) + var/cursor_position = 0 + if(input_size < 20) // Short messages get distorted too. Bit hacksy. + distortion += (20-input_size)/2 + while(cursor_position <= input_size) + var/newletter=copytext_char(message, cursor_position, cursor_position+1) + if(!prob(distortion_chance)) + new_message += newletter + cursor_position += 1 + continue + if(newletter != " ") + if(prob(0.08 * distortion)) // Major cutout + newletter = "*zzzt*" + cursor_position += rand(1, (length(message) - cursor_position)) // Skip some characters + distortion += 1 * distortion_speed + else if(prob(0.8 * distortion)) // Minor cut out + if(prob(25)) + newletter = ".." + else if(prob(25)) + newletter = " " + else + newletter = "" + distortion += 0.25 * distortion_speed + else if(prob(2 * distortion)) // Mishearing + if(language && language.syllables && prob(50)) + newletter = pick(language.syllables) + else + newletter = pick("a","e","i","o","u") + distortion += 0.25 * distortion_speed + else if(prob(1.5 * distortion)) // Mishearing + if(language && prob(50)) + if(language.syllables) + newletter = pick (language.syllables) + else + newletter = "*" + else + if(english_only) + newletter += "*" + else + newletter = pick("ø", "Ð", "%", "æ", "µ") + distortion += 0.5 * distortion_speed + else if(prob(0.75 * distortion)) // Incomprehensible + newletter = pick("<", ">", "!", "$", "%", "^", "&", "*", "~", "#") + distortion += 0.75 * distortion_speed + else if(prob(0.05 * distortion)) // Total cut out + if(!english_only) + newletter = "¦w¡¼b»%> -BZZT-" + else + newletter = "srgt%$hjc< -BZZT-" + new_message += newletter + break + else if(prob(2.5 * distortion)) // Sound distortion. Still recognisable, mostly. + switch(lowertext(newletter)) + if("s") + newletter = "$" + if("e") + newletter = "£" + if("w") + newletter = "ø" + if("y") + newletter = "¡" + if("x") + newletter = "æ" + if("u") + newletter = "µ" + else + if(prob(0.2 * distortion)) + newletter = " *crackle* " + distortion += 0.25 * distortion_speed + if(prob(20)) + capitalize(newletter) + new_message += newletter + cursor_position += 1 + return new_message + #define TICKS_PER_RECOIL_ANIM 2 #define PIXELS_PER_STRENGTH_VAL 16 diff --git a/nebula.dme b/nebula.dme index 9589372d005c..3ae62f5f686c 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2417,7 +2417,6 @@ #include "code\modules\fishing\bait.dm" #include "code\modules\fishing\fishing_line.dm" #include "code\modules\fishing\fishing_rod.dm" -#include "code\modules\flufftext\TextFilters.dm" #include "code\modules\fluids\_fluid.dm" #include "code\modules\fluids\fluid_flood.dm" #include "code\modules\fluids\fluid_mapped.dm" From c051af3071fe57e90b6c52c51c755743e90001ef Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 23 Jan 2025 17:37:36 +1100 Subject: [PATCH 21/93] Added barrel rims and basic coopery for crafted barrels. --- .../game/objects/structures/barrels/barrel.dm | 5 +- code/game/objects/structures/barrels/cask.dm | 3 + .../crafting/stack_recipes/recipes_planks.dm | 4 +- icons/obj/items/barrel_rim.dmi | Bin 0 -> 328 bytes mods/content/blacksmithy/_blacksmithy.dm | 1 - mods/content/blacksmithy/_blacksmithy.dme | 1 + mods/content/blacksmithy/barrel_rim.dm | 52 ++++++++++++++++++ .../blacksmithy/forging_step_blades.dm | 18 +++--- .../blacksmithy/forging_step_ornate.dm | 6 +- .../content/blacksmithy/forging_step_tools.dm | 4 ++ .../patches/fantasy/forging_fantasy.dm | 4 ++ 11 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 icons/obj/items/barrel_rim.dmi create mode 100644 mods/content/blacksmithy/barrel_rim.dm diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 73424c453224..0e987ec6aa2b 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -18,9 +18,12 @@ tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT // Should we draw our lid and liquid contents as overlays? var/show_liquid_contents = TRUE - // Rivets, bands, etc. Currently just cosmetic. + // Rivets, bands, etc. Currently just cosmetic unless the forging modpack is ticked. var/decl/material/metal_material = /decl/material/solid/metal/iron +// Stub type for crafting (forging modpack modifies metal_material) +/obj/structure/reagent_dispensers/barrel/crafted + // Overrides due to wonky reagent_dispeners opencontainer flag handling. /obj/structure/reagent_dispensers/barrel/can_be_poured_from(mob/user, atom/target) return (reagents?.maximum_volume > 0) diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm index d3755dfe55e6..603cf2d64335 100644 --- a/code/game/objects/structures/barrels/cask.dm +++ b/code/game/objects/structures/barrels/cask.dm @@ -6,6 +6,9 @@ show_liquid_contents = FALSE storage = null // Intended for storing liquids. +// Stub type for crafting (forging modpack modifies metal_material) +/obj/structure/reagent_dispensers/barrel/cask/crafted + // Horrible workaround for physical interaction checks. /obj/structure/reagent_dispensers/barrel/cask/nano_host() return istype(loc, /obj/structure/cask_rack) ? loc : src diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index 03464a086a4e..feac5e54b587 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -218,11 +218,11 @@ difficulty = MAT_VALUE_HARD_DIY /decl/stack_recipe/planks/furniture/barrel - result_type = /obj/structure/reagent_dispensers/barrel + result_type = /obj/structure/reagent_dispensers/barrel/crafted difficulty = MAT_VALUE_HARD_DIY /decl/stack_recipe/planks/furniture/barrel/cask - result_type = /obj/structure/reagent_dispensers/barrel/cask + result_type = /obj/structure/reagent_dispensers/barrel/cask/crafted /decl/stack_recipe/planks/furniture/barrel/cask_rack result_type = /obj/structure/cask_rack diff --git a/icons/obj/items/barrel_rim.dmi b/icons/obj/items/barrel_rim.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a5567e33c7c57c7276ebe585e14d8e63c61f693d GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*96EUN|NsAFfg z7<$()=}&DsnKU zZE!G{sOEtFk_F<8}6F_c+_@mYXsXo@Tk&$)#M`FK_+W&B}eXPAA6 V>qywtdS{^344$rjF6*2UngD^Eb1nb? literal 0 HcmV?d00001 diff --git a/mods/content/blacksmithy/_blacksmithy.dm b/mods/content/blacksmithy/_blacksmithy.dm index 978dbebe0d6e..0ec35cdf1ac6 100644 --- a/mods/content/blacksmithy/_blacksmithy.dm +++ b/mods/content/blacksmithy/_blacksmithy.dm @@ -1,3 +1,2 @@ /decl/modpack/blacksmithy name = "Blacksmithy" - diff --git a/mods/content/blacksmithy/_blacksmithy.dme b/mods/content/blacksmithy/_blacksmithy.dme index 3421d65d10fe..806ddef8d9a9 100644 --- a/mods/content/blacksmithy/_blacksmithy.dme +++ b/mods/content/blacksmithy/_blacksmithy.dme @@ -3,6 +3,7 @@ // BEGIN_INCLUDE #include "_blacksmithy.dm" #include "anvil.dm" +#include "barrel_rim.dm" #include "billet.dm" #include "boulder.dm" #include "forge_fire.dm" diff --git a/mods/content/blacksmithy/barrel_rim.dm b/mods/content/blacksmithy/barrel_rim.dm new file mode 100644 index 000000000000..4dca740435dc --- /dev/null +++ b/mods/content/blacksmithy/barrel_rim.dm @@ -0,0 +1,52 @@ +/obj/item/barrel_rim + name = "barrel rim" + desc = "A circular brace used to hold a barrel together." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/barrel_rim.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL + +/decl/stack_recipe/rods/stick/barrel_rim + result_type = /obj/item/barrel_rim + one_per_turf = FALSE + on_floor = FALSE + category = "items" + +/obj/structure/reagent_dispensers/barrel + // Skill used for coopery. + var/work_skill = SKILL_CONSTRUCTION + +// Overrides to make barrel rims useful. +/obj/structure/reagent_dispensers/barrel/crafted + metal_material = null +/obj/structure/reagent_dispensers/barrel/cask/crafted + metal_material = null + +/obj/structure/reagent_dispensers/barrel/create_dismantled_products(turf/target) + if(metal_material) + new /obj/item/barrel_rim(target, metal_material) + metal_material = null + return ..() + +// Barrels with no reinforcement break apart when things are put inside. +/obj/structure/reagent_dispensers/barrel/Entered(atom/movable/atom, atom/old_loc) + . = ..() + if(!metal_material) + physically_destroyed() + +/obj/structure/reagent_dispensers/barrel/on_reagent_change() + . = ..() + if(!metal_material && reagents?.total_volume) + physically_destroyed() + +// Adding a rim to a crafted barrel. +/obj/structure/reagent_dispensers/barrel/attackby(obj/item/used_item, mob/user) + if(isnull(metal_material) && istype(used_item.material) && istype(used_item, /obj/item/barrel_rim)) + user.visible_message(SPAN_NOTICE("\The [user] begins securing \the [src] with \the [used_item].")) + if(user.do_skilled(5 SECONDS, work_skill, src, check_holding = TRUE) && user.try_unequip(used_item)) + metal_material = used_item.material + update_icon() + user.visible_message(SPAN_NOTICE("\The [user] secures \the [src] with \the [used_item].")) + qdel(used_item) + return TRUE + . = ..() diff --git a/mods/content/blacksmithy/forging_step_blades.dm b/mods/content/blacksmithy/forging_step_blades.dm index 253a1dd73321..8e9524336b17 100644 --- a/mods/content/blacksmithy/forging_step_blades.dm +++ b/mods/content/blacksmithy/forging_step_blades.dm @@ -3,8 +3,8 @@ billet_icon_state = "blade" billet_desc = "A roughly shaped, dull blade. It will need further refinement before it can be finished." steps = list( - /decl/forging_step/long_blade_blank, - /decl/forging_step/short_sword_blank + /decl/forging_step/long_blade_blank, + /decl/forging_step/short_sword_blank ) /decl/forging_step/long_blade_blank @@ -13,9 +13,9 @@ billet_desc = "A long, dull and unrefined blade, only a step from being a finished product." steps = list( - /decl/forging_step/product/longsword_blade, - /decl/forging_step/product/broadsword_blade, - /decl/forging_step/product/rapier_blade + /decl/forging_step/product/longsword_blade, + /decl/forging_step/product/broadsword_blade, + /decl/forging_step/product/rapier_blade ) /decl/forging_step/short_sword_blank @@ -23,10 +23,10 @@ billet_name_prefix = "short" billet_desc = "A short, dull and unrefined blade, only a step from being a finished product." steps = list( - /decl/forging_step/product/poignard_blade, - /decl/forging_step/product/knife_blade, - /decl/forging_step/product/shortsword_blade, - /decl/forging_step/product/spear_head + /decl/forging_step/product/poignard_blade, + /decl/forging_step/product/knife_blade, + /decl/forging_step/product/shortsword_blade, + /decl/forging_step/product/spear_head ) // TODO: make these blades, add weapon crafting. diff --git a/mods/content/blacksmithy/forging_step_ornate.dm b/mods/content/blacksmithy/forging_step_ornate.dm index 515d9d57d21f..3070d060a9be 100644 --- a/mods/content/blacksmithy/forging_step_ornate.dm +++ b/mods/content/blacksmithy/forging_step_ornate.dm @@ -4,9 +4,9 @@ billet_icon_state = "ornate" billet_desc = "An ornate piece of worked metal. It still needs some last touches to be made into something useful." steps = list( - /decl/forging_step/product/candelabra, - /decl/forging_step/product/decanter, - /decl/forging_step/product/goblet + /decl/forging_step/product/candelabra, + /decl/forging_step/product/decanter, + /decl/forging_step/product/goblet ) /decl/forging_step/product/candelabra diff --git a/mods/content/blacksmithy/forging_step_tools.dm b/mods/content/blacksmithy/forging_step_tools.dm index 4f7a4e24567a..4911ec5cedf3 100644 --- a/mods/content/blacksmithy/forging_step_tools.dm +++ b/mods/content/blacksmithy/forging_step_tools.dm @@ -58,3 +58,7 @@ /decl/forging_step/product/nails billet_name = "nails" product_type = /obj/item/stack/material/nail/twelve + +/decl/forging_step/product/barrel_rim + billet_name = "barrel rim" + product_type = /obj/item/barrel_rim diff --git a/mods/~compatibility/patches/fantasy/forging_fantasy.dm b/mods/~compatibility/patches/fantasy/forging_fantasy.dm index 6de02a927d29..b1817d411395 100644 --- a/mods/~compatibility/patches/fantasy/forging_fantasy.dm +++ b/mods/~compatibility/patches/fantasy/forging_fantasy.dm @@ -1,2 +1,6 @@ /decl/forging_step work_skill = SKILL_METALWORK + +// Changes from SKILL_CONSTRUCTION for coopery. +/obj/structure/reagent_dispensers/barrel + work_skill = SKILL_ARTIFICE From f513e6a6201fbfc8318c1016a5099c5af0af3279 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sun, 19 Oct 2025 22:07:14 +1100 Subject: [PATCH 22/93] Backporting zombies/skellymans from Pyrelight. --- code/modules/organs/external/_external.dm | 6 +- maps/modpack_testing/modpack_testing.dm | 1 + mods/content/undead/_undead.dm | 2 + mods/content/undead/_undead.dme | 12 ++ mods/content/undead/mods/undead.dm | 10 ++ mods/content/undead/mods/undead_skeleton.dm | 43 ++++++ mods/content/undead/mods/undead_zombie.dm | 69 +++++++++ mods/content/undead/overrides.dm | 134 ++++++++++++++++++ mods/content/undead/skillset.dm | 2 + mods/content/undead/traits.dm | 4 + mods/~compatibility/patches/drakes.dm | 9 ++ .../fantasy_drakes.dm} | 0 .../patches/drakes/undead_drakes.dm | 9 ++ mods/~compatibility/patches/fantasy.dm | 9 +- .../patches/fantasy/undead_fantasy.dm | 53 +++++++ mods/~compatibility/~compatibility.dm | 6 +- 16 files changed, 362 insertions(+), 7 deletions(-) create mode 100644 mods/content/undead/_undead.dm create mode 100644 mods/content/undead/_undead.dme create mode 100644 mods/content/undead/mods/undead.dm create mode 100644 mods/content/undead/mods/undead_skeleton.dm create mode 100644 mods/content/undead/mods/undead_zombie.dm create mode 100644 mods/content/undead/overrides.dm create mode 100644 mods/content/undead/skillset.dm create mode 100644 mods/content/undead/traits.dm create mode 100644 mods/~compatibility/patches/drakes.dm rename mods/~compatibility/patches/{fantasy/drake_fantasy.dm => drakes/fantasy_drakes.dm} (100%) create mode 100644 mods/~compatibility/patches/drakes/undead_drakes.dm create mode 100644 mods/~compatibility/patches/fantasy/undead_fantasy.dm diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 4cafbfe2e108..39c8df5d9a62 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -725,13 +725,17 @@ This function completely restores a damaged organ to perfect condition. /obj/item/organ/external/is_broken() return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !splinted)) +// Overridable for modpacks. +/obj/item/organ/external/proc/check_status_flags_for_process() + return (status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_MUTATED|ORGAN_DISLOCATED|ORGAN_DEAD)) + //Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() if(length(ailments)) return TRUE - if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_MUTATED|ORGAN_DISLOCATED|ORGAN_DEAD)) + if(check_status_flags_for_process()) return TRUE if((brute_dam || burn_dam) && !BP_IS_PROSTHETIC(src)) //Robot limbs don't autoheal and thus don't need to process when damaged diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 52d46b1e1396..2ad67edc3e01 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -29,6 +29,7 @@ #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/tabloids/_tabloids.dme" + #include "../../mods/content/undead/_undead.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/gamemodes/cult/_cult.dme" diff --git a/mods/content/undead/_undead.dm b/mods/content/undead/_undead.dm new file mode 100644 index 000000000000..37cb87794289 --- /dev/null +++ b/mods/content/undead/_undead.dm @@ -0,0 +1,2 @@ +/decl/modpack/undead + name = "Undead Content" \ No newline at end of file diff --git a/mods/content/undead/_undead.dme b/mods/content/undead/_undead.dme new file mode 100644 index 000000000000..2068815dbd2f --- /dev/null +++ b/mods/content/undead/_undead.dme @@ -0,0 +1,12 @@ +#ifndef MODPACK_UNDEAD +#define MODPACK_UNDEAD +// BEGIN_INCLUDE +#include "_undead.dm" +#include "overrides.dm" +#include "skillset.dm" +#include "traits.dm" +#include "mods\undead.dm" +#include "mods\undead_skeleton.dm" +#include "mods\undead_zombie.dm" +// END_INCLUDE +#endif diff --git a/mods/content/undead/mods/undead.dm b/mods/content/undead/mods/undead.dm new file mode 100644 index 000000000000..a42625998f73 --- /dev/null +++ b/mods/content/undead/mods/undead.dm @@ -0,0 +1,10 @@ +/mob/living/human/get_movement_delay(var/travel_dir) + . = ..() + if(has_trait(/decl/trait/undead)) + set_moving_slowly() + if(istype(default_walk_intent)) + . = max(., default_walk_intent.move_delay) // no runner zombies yet + +// Overridden by fantasy modpack. +/mob/living/human/proc/grant_basic_undead_equipment() + return diff --git a/mods/content/undead/mods/undead_skeleton.dm b/mods/content/undead/mods/undead_skeleton.dm new file mode 100644 index 000000000000..bc39f27a4e52 --- /dev/null +++ b/mods/content/undead/mods/undead_skeleton.dm @@ -0,0 +1,43 @@ +/datum/mob_controller/aggressive/skeleton + +// SKELETONS +// Immune to blind or deaf, but weak to physical damage. +/mob/living/human/proc/make_skeleton() + set_trait(/decl/trait/metabolically_inert, TRAIT_LEVEL_EXISTS) + set_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE) + + if(istype(ai)) + QDEL_NULL(ai) + ai = new /datum/mob_controller/aggressive/skeleton(src) + faction = "undead" + + if(!istype(skillset, /datum/skillset/undead) && !ispath(skillset, /datum/skillset/undead)) + if(istype(skillset)) + QDEL_NULL(skillset) + skillset = new /datum/skillset/undead(src) + + for(var/obj/item/organ/external/limb in get_external_organs()) + if(!BP_IS_PROSTHETIC(limb)) + limb.skeletonize() + + for(var/obj/item/organ/internal/organ in get_internal_organs()) + remove_organ(organ, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE) + qdel(organ) + + set_max_health(round(species.total_health / 3)) + vessel?.clear_reagents() + SET_HAIR_STYLE(src, /decl/sprite_accessory/hair/bald, FALSE) + update_body() + +/mob/living/human/skeleton + skillset = /datum/skillset/undead + +/mob/living/human/skeleton/post_setup(species_uid, datum/mob_snapshot/supplied_appearance) + . = ..() + make_skeleton() + grant_basic_undead_equipment() + +/mob/living/human/skeleton/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/human::uid + . = ..() diff --git a/mods/content/undead/mods/undead_zombie.dm b/mods/content/undead/mods/undead_zombie.dm new file mode 100644 index 000000000000..8d98b7919d0b --- /dev/null +++ b/mods/content/undead/mods/undead_zombie.dm @@ -0,0 +1,69 @@ +// ZOMBIES +// Dead and rotting, but still mobile and aggressive. + +/datum/mob_controller/aggressive/zombie + +/mob/living/human/proc/make_zombie() + set_trait(/decl/trait/metabolically_inert, TRAIT_LEVEL_EXISTS) + set_trait(/decl/trait/undead, TRAIT_LEVEL_MINOR) + + if(istype(ai)) + QDEL_NULL(ai) + ai = new /datum/mob_controller/aggressive/zombie(src) + faction = "undead" + + if(!istype(skillset, /datum/skillset/undead) && !ispath(skillset, /datum/skillset/undead)) + if(istype(skillset)) + QDEL_NULL(skillset) + skillset = new /datum/skillset/undead(src) + + for(var/obj/item/organ/organ in get_organs()) + organ.die() + organ.germ_level = INFECTION_LEVEL_THREE + + // die() sets to max damage + for(var/obj/item/organ/internal/organ in get_internal_organs()) + organ.set_organ_damage(0) + for(var/obj/item/organ/external/limb in get_internal_organs()) + limb.brute_dam = 0 + limb.burn_dam = 0 + + // Set this so nonhumans look appropriately gross. + reset_hair() + if(get_bodytype()?.appearance_flags & HAS_SKIN_COLOR) + _skin_colour = pick(COLOR_GRAY, COLOR_GRAY15, COLOR_GRAY20, COLOR_GRAY40, COLOR_GRAY80, COLOR_WHITE) + SET_HAIR_COLOR(src, _skin_colour, TRUE) + SET_FACIAL_HAIR_COLOR(src, _skin_colour, TRUE) + + var/obj/item/organ/external/head/head = get_organ(BP_HEAD) + if(istype(head)) + head.glowing_eyes = TRUE + set_eye_colour(COLOR_RED) + + for(var/obj/item/organ/external/limb in get_external_organs()) + if(!BP_IS_PROSTHETIC(limb)) + limb.sync_colour_to_human(src) + if(prob(10)) + limb.skeletonize() + else if(prob(15)) + if(prob(75)) + limb.createwound(CUT, rand(limb.max_damage * 0.25, limb.max_damage * 0.5)) + else + limb.createwound(BURN, rand(limb.max_damage * 0.25, limb.max_damage * 0.5)) + + set_max_health(round(species.total_health / 2)) + vessel.remove_any(vessel.total_volume * rand(0.2, 0.5)) + update_body() + +/mob/living/human/zombie + skillset = /datum/skillset/undead + +/mob/living/human/zombie/post_setup(species_uid, datum/mob_snapshot/supplied_appearance) + . = ..() + make_zombie() + grant_basic_undead_equipment() + +/mob/living/human/zombie/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/human::uid + . = ..() diff --git a/mods/content/undead/overrides.dm b/mods/content/undead/overrides.dm new file mode 100644 index 000000000000..38e0a6f9a9a3 --- /dev/null +++ b/mods/content/undead/overrides.dm @@ -0,0 +1,134 @@ +/mob/living/can_feel_pain(var/check_organ) + return !has_trait(/decl/trait/undead) && ..() + +/mob/living/human/get_gibber_type() // To avoid skeletons causing gibs. + return has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE) ? null : ..() + +/mob/living/human/ssd_check() + if(has_trait(/decl/trait/undead)) + return FALSE + return ..() + +/mob/living/human/get_movement_delay(travel_dir) + . = ..() + if(has_trait(/decl/trait/undead)) + var/static/default_walk_delay = get_config_value(/decl/config/num/movement_walk) + . = max(., default_walk_delay) + +/mob/living/human/get_attack_telegraph_delay() + if(has_trait(/decl/trait/undead)) + return (0.6 SECONDS) + return ..() + +/mob/living/human/get_self_death_message(gibbed) + return has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE) ? "You have crumbled." : ..() + +/mob/living/human/get_death_message(gibbed) + if(has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE)) + return "crumbles and falls apart!" + return ..() + +/mob/living/human/death(gibbed) + . = ..() + if(stat == DEAD && !QDELETED(src) && !gibbed && has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE)) + gib() + +/mob/living/human/get_eye_colour() + // Force an evil red glow for undead mobs. + if(stat == CONSCIOUS && has_trait(/decl/trait/undead)) + return COLOR_RED + return ..() + +/mob/living/human/death(gibbed) + . = ..() + if(!QDELETED(src) && has_trait(/decl/trait/undead)) + var/obj/item/organ/external/head/head = get_organ(BP_HEAD) + head.glowing_eyes = initial(head.glowing_eyes) + update_eyes() + +/mob/living/human/get_life_damage_types() + if(has_trait(/decl/trait/undead)) + // Undead human mobs use brute and burn damage instead of brain damage, a la simplemobs. + var/static/list/life_damage_types = list( + BURN, + BRUTE + ) + return life_damage_types + return ..() + +/mob/living/human/getOxyLoss(var/amount) + return has_trait(/decl/trait/undead) ? 0 : ..() + +/mob/living/human/setOxyLoss(var/amount) + return has_trait(/decl/trait/undead) ? 0 : ..() + +/mob/living/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) + return has_trait(/decl/trait/undead) ? 0 : ..() + +/mob/living/human/getToxLoss() + return has_trait(/decl/trait/undead) ? 0 : ..() + +/mob/living/human/setToxLoss(var/amount) + return has_trait(/decl/trait/undead) ? 0 : ..() + +/mob/living/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) + return has_trait(/decl/trait/undead) ? 0 : ..() + +/mob/living/human/check_vital_organ_missing() + return !has_trait(/decl/trait/undead) && ..() + +/mob/living/human/process_internal_organs() + return has_trait(/decl/trait/undead) ? null : ..() + +/mob/living/human/should_have_organ(organ_to_check) + // It might be nice to have eyes etc. matter for zombies, but as all organs are dead it won't work currently. + return has_trait(/decl/trait/undead) ? FALSE : ..() + +/mob/living/human/get_vision_organ_tag() + // Where we're going, we don't need eyes. + return has_trait(/decl/trait/undead) ? null : ..() + +/mob/living/human/need_breathe() + return has_trait(/decl/trait/undead) ? FALSE : ..() + +// Undead don't get hungry/thirsty (except for brains) +/mob/living/human/get_nutrition() + return has_trait(/decl/trait/undead) ? get_max_nutrition() : ..() + +/mob/living/human/get_hydration() + return has_trait(/decl/trait/undead) ? get_max_hydration() : ..() + +// Overrides to handle dead flag separately. +/obj/item/organ/is_usable() + . = !(status & (ORGAN_CUT_AWAY|ORGAN_MUTATED)) + if(. && (status & ORGAN_DEAD)) + return owner?.has_trait(/decl/trait/undead) + +/obj/item/organ/external/check_status_flags_for_process() + if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_MUTATED|ORGAN_DISLOCATED)) + return TRUE + if((status & ORGAN_DEAD) && !owner?.has_trait(/decl/trait/undead)) + return TRUE + return FALSE + +/mob/living/human/set_status_condition(condition, amount) + if(has_trait(/decl/trait/undead)) + var/static/list/ignore_status_conditions = list( + STAT_BLIND, + STAT_DEAF, + STAT_CONFUSE, + STAT_DIZZY, + STAT_JITTER, + STAT_STUTTER, + STAT_SLUR, + STAT_ASLEEP, + STAT_DRUGGY, + STAT_DROWSY, + STAT_BLURRY, + STAT_BLIND, + STAT_TINNITUS, + STAT_DEAF + ) + if(condition in ignore_status_conditions) + return + . = ..() diff --git a/mods/content/undead/skillset.dm b/mods/content/undead/skillset.dm new file mode 100644 index 000000000000..479d7cfe5505 --- /dev/null +++ b/mods/content/undead/skillset.dm @@ -0,0 +1,2 @@ +/datum/skillset/undead + default_value = SKILL_BASIC diff --git a/mods/content/undead/traits.dm b/mods/content/undead/traits.dm new file mode 100644 index 000000000000..06d4f34e9572 --- /dev/null +++ b/mods/content/undead/traits.dm @@ -0,0 +1,4 @@ +/decl/trait/undead + name = "Undead" + description = "Your body is dead, but remains animated through some supernatural force." + levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MODERATE) // Moderate means skeleton, minor means zombie. diff --git a/mods/~compatibility/patches/drakes.dm b/mods/~compatibility/patches/drakes.dm new file mode 100644 index 000000000000..c128e102020a --- /dev/null +++ b/mods/~compatibility/patches/drakes.dm @@ -0,0 +1,9 @@ +// Undead drakes +#ifdef MODPACK_UNDEAD +#include "drakes/undead_drakes.dm" +#endif + +// Override drake lore and names for the fantasy modpack. +#ifdef MODPACK_FANTASY_SPECIES +#include "drakes/fantasy_drakes.dm" +#endif diff --git a/mods/~compatibility/patches/fantasy/drake_fantasy.dm b/mods/~compatibility/patches/drakes/fantasy_drakes.dm similarity index 100% rename from mods/~compatibility/patches/fantasy/drake_fantasy.dm rename to mods/~compatibility/patches/drakes/fantasy_drakes.dm diff --git a/mods/~compatibility/patches/drakes/undead_drakes.dm b/mods/~compatibility/patches/drakes/undead_drakes.dm new file mode 100644 index 000000000000..59425c43f468 --- /dev/null +++ b/mods/~compatibility/patches/drakes/undead_drakes.dm @@ -0,0 +1,9 @@ +/mob/living/human/skeleton/meredrake/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/grafadreka::uid + . = ..() + +/mob/living/human/zombie/meredrake/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/grafadreka::uid + . = ..() diff --git a/mods/~compatibility/patches/fantasy.dm b/mods/~compatibility/patches/fantasy.dm index b0abba63bcd4..090e04dca00a 100644 --- a/mods/~compatibility/patches/fantasy.dm +++ b/mods/~compatibility/patches/fantasy.dm @@ -1,8 +1,3 @@ -// Override drake lore and names for the fantasy modpack. -#ifdef MODPACK_DRAKES -#include "fantasy/drake_fantasy.dm" -#endif - // Make whetstones available for the fantasy modpack/ #ifdef MODPACK_ITEM_SHARPENING #include "fantasy/whetstone_fantasy.dm" @@ -10,4 +5,8 @@ #ifdef MODPACK_BLACKSMITHY #include "fantasy/forging_fantasy.dm" +#endif + +#ifdef MODPACK_UNDEAD +#include "fantasy/undead_fantasy.dm" #endif \ No newline at end of file diff --git a/mods/~compatibility/patches/fantasy/undead_fantasy.dm b/mods/~compatibility/patches/fantasy/undead_fantasy.dm new file mode 100644 index 000000000000..ef255509e96a --- /dev/null +++ b/mods/~compatibility/patches/fantasy/undead_fantasy.dm @@ -0,0 +1,53 @@ +/mob/living/human/skeleton/hnoll/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/hnoll::uid + . = ..() + +/mob/living/human/skeleton/kobaloi/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/kobaloi::uid + . = ..() + +/mob/living/human/zombie/hnoll/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/hnoll::uid + . = ..() + +/mob/living/human/zombie/kobaloi/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) + if(!species_uid) + species_uid = /decl/species/kobaloi::uid + . = ..() + +/mob/living/human/grant_basic_undead_equipment() + + var/species_name = get_species_name() + if(species_name == /decl/species/human::name || species_name == /decl/species/hnoll::name) + var/pants_type = pick(/obj/item/clothing/pants/trousers, /obj/item/clothing/pants/trousers/braies) + equip_to_slot_or_del(new pants_type(src), slot_w_uniform_str) + + var/jerkin_type = pick(/obj/item/clothing/shirt/tunic, /obj/item/clothing/shirt/tunic/short, /obj/item/clothing/shirt/jerkin) + equip_to_slot_or_del(new jerkin_type(src), slot_w_uniform_str) + + if(prob(30)) + equip_to_slot_or_del(new /obj/item/clothing/suit/armor/forged/banded(src), slot_wear_suit_str) + else + equip_to_slot_or_del(new /obj/item/clothing/suit/armor/crafted/leather(src), slot_wear_suit_str) + if(prob(20)) + put_in_active_hand(new /obj/item/bladed/broadsword(src)) + else + put_in_active_hand(new /obj/item/bladed/shortsword(src)) + put_in_inactive_hand(new /obj/item/shield/crafted/buckler(src)) + return + + if(species_name == /decl/species/kobaloi::name) + + var/pants_type = pick(/obj/item/clothing/pants/trousers/braies, /obj/item/clothing/pants/loincloth) + equip_to_slot_or_del(new pants_type(src), slot_w_uniform_str) + if(prob(75)) + var/jerkin_type = pick(/obj/item/clothing/shirt/tunic/short, /obj/item/clothing/shirt/jerkin) + equip_to_slot_or_del(new jerkin_type(src), slot_w_uniform_str) + + if(prob(30)) + equip_to_slot_or_del(new /obj/item/clothing/suit/armor/crafted/leather(src), slot_wear_suit_str) + put_in_active_hand(new /obj/item/bladed/knife(src)) + return diff --git a/mods/~compatibility/~compatibility.dm b/mods/~compatibility/~compatibility.dm index 84f09c182555..261d4d018071 100644 --- a/mods/~compatibility/~compatibility.dm +++ b/mods/~compatibility/~compatibility.dm @@ -29,4 +29,8 @@ #ifdef CONTENT_PACK_CIRCUITS #include "patches/circuits.dm" -#endif \ No newline at end of file +#endif + +#ifdef MODPACK_DRAKES +#include "patches/drakes.dm" +#endif From c1d671c8d3a8219ee304441385b59c19cffcff5a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 20 Oct 2025 07:27:47 +1100 Subject: [PATCH 23/93] Automatic changelog generation for PR #5155 [ci skip] --- html/changelogs/AutoChangeLog-pr-5155.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5155.yml diff --git a/html/changelogs/AutoChangeLog-pr-5155.yml b/html/changelogs/AutoChangeLog-pr-5155.yml new file mode 100644 index 000000000000..4cabef2465e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5155.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: Crafted barrels will need barrel rims forged if the forging modpack + is in use.} +delete-after: true From 59197d9f81c82600aa6d503db51ead38dbd2342f Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Mon, 20 Oct 2025 11:33:45 +1100 Subject: [PATCH 24/93] Lobotomises the laundry basket. --- .../items/weapons/storage/laundry_basket.dm | 70 +++--------------- icons/mob/onmob/items/lefthand.dmi | Bin 56681 -> 56204 bytes icons/mob/onmob/items/righthand.dmi | Bin 56796 -> 56668 bytes icons/obj/items/storage/laundry.dmi | Bin 0 -> 808 bytes icons/obj/janitor.dmi | Bin 9502 -> 8136 bytes 5 files changed, 11 insertions(+), 59 deletions(-) create mode 100644 icons/obj/items/storage/laundry.dmi diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index 4d03a5567929..95451bc35a7a 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -1,72 +1,24 @@ -// ----------------------------- -// Laundry Basket -// ----------------------------- -// An item designed for hauling the belongings of a character. -// So this cannot be abused for other uses, we make it two-handed and inable to have its storage looked into. /obj/item/laundry_basket name = "laundry basket" - icon = 'icons/obj/janitor.dmi' - icon_state = "laundry-empty" - item_state = "laundry" + icon = 'icons/obj/items/storage/laundry.dmi' + icon_state = ICON_STATE_WORLD desc = "The peak of thousands of years of laundry evolution." w_class = ITEM_SIZE_GARGANTUAN storage = /datum/storage/laundry_basket material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW - var/linked - -/obj/item/laundry_basket/attack_hand(mob/user) - if(!ishuman(user)) - return ..() - var/mob/living/human/H = user - var/obj/item/organ/external/temp = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - if(!temp) - to_chat(user, SPAN_WARNING("You need two hands to pick this up!")) - return TRUE - if(!user.get_empty_hand_slot()) - to_chat(user, SPAN_WARNING("You need a hand to be empty.")) - return TRUE - return ..() /obj/item/laundry_basket/attack_self(mob/user) - var/turf/T = get_turf(user) - to_chat(user, "You dump \the [src]'s contents onto \the [T].") + var/turf/dump_loc = get_turf(user) + if(length(contents) && dump_loc) + to_chat(user, SPAN_NOTICE("You dump \the [src]'s contents onto \the [dump_loc].")) + for(var/atom/movable/thing as anything in get_contained_external_atoms()) + thing.dropInto(dump_loc) + return TRUE return ..() -/obj/item/laundry_basket/on_picked_up(mob/user, atom/old_loc) - var/obj/item/laundry_basket/offhand/O = new(user) - O.SetName("[name] - second hand") - O.desc = "Your second grip on \the [src]." - O.linked = src - user.put_in_inactive_hand(O) - linked = O - return - /obj/item/laundry_basket/on_update_icon() . = ..() - if(contents.len) - icon_state = "laundry-full" - else - icon_state = "laundry-empty" - -/obj/item/laundry_basket/handle_mouse_drop(atom/over, mob/user, params) - if(over == user) - return TRUE - . = ..() - -/obj/item/laundry_basket/dropped(mob/user) - qdel(linked) - return ..() - -//Offhand -/obj/item/laundry_basket/offhand - icon = 'icons/mob/offhand.dmi' - icon_state = "offhand" - name = "second hand" - storage = null - -/obj/item/laundry_basket/offhand/dropped(mob/user) - ..() - user.drop_from_inventory(linked) - return - + icon_state = get_world_inventory_state() + if(length(contents)) + icon_state = "[icon_state]-full" diff --git a/icons/mob/onmob/items/lefthand.dmi b/icons/mob/onmob/items/lefthand.dmi index 40271107dd3cbc610460b48eb68ff184120d7ba3..d7947b3d21b12edd15259a08fb123422a4a36b06 100644 GIT binary patch delta 17502 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 delta 16052 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 literal 9502 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 CF Date: Mon, 20 Oct 2025 11:41:27 +1100 Subject: [PATCH 25/93] Greyscales laundry icons. --- .../items/weapons/storage/laundry_basket.dm | 18 +++++++++++++++++- icons/obj/items/storage/laundry.dmi | Bin 808 -> 841 bytes 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index 95451bc35a7a..deb912d9ba69 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -7,6 +7,7 @@ storage = /datum/storage/laundry_basket material = /decl/material/solid/organic/plastic obj_flags = OBJ_FLAG_HOLLOW + paint_color = COLOR_NAVY_BLUE /obj/item/laundry_basket/attack_self(mob/user) var/turf/dump_loc = get_turf(user) @@ -17,8 +18,23 @@ return TRUE return ..() +/obj/item/laundry_basket/Entered(atom/movable/atom, atom/old_loc) + . = ..() + update_clothing_icon() + +/obj/item/laundry_basket/Exited(atom/movable/atom, atom/old_loc) + . = ..() + update_clothing_icon() + /obj/item/laundry_basket/on_update_icon() . = ..() icon_state = get_world_inventory_state() + cut_overlays() + if(length(contents)) + add_overlay(overlay_image(icon, "[icon_state]-full", COLOR_WHITE, RESET_COLOR)) + +/obj/item/laundry_basket/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing, skip_adjustment) + var/image/res = ..() if(length(contents)) - icon_state = "[icon_state]-full" + res.overlays += overlay_image(res.icon, "[res.icon_state]-full", COLOR_WHITE, RESET_COLOR) + return res diff --git a/icons/obj/items/storage/laundry.dmi b/icons/obj/items/storage/laundry.dmi index 25a5eef434e4d06d785600182c67e42c0e952180..d7b34eda9204e7d5770ad458ca633bbbe32a106a 100644 GIT binary patch delta 718 zcmV;<0x|ul2FV6fiBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>C;$Ke6;Mo6 zMZmzo|NsBd(b2lPx}2PxfPjF&z`&^C4Q2oU00DGTPE!Ct=GbNc005kkUx%%j90s|f~%hkILrYsKXiqx{ufLD00KHmL_t(&f$f^#vYQ|f#`%*65NPj#r1ubW z?%SBYz{%wOU!@?53aJX?nO<~%<2a78yWfJDd|`qR091iBb7+SWha_Y-^z+mo%p8#q zi*88xYY@m3SIV85N`a=kJ$irGHB>mWD-%knT7hU#h=&xMX=@d?l>)VLE5iMfXla*^ zNL4~A@7<+)+`7m4-Y3M8W2s2Pk*rEcE~Jy)$#f?!b$>(Za1<(R+whJMp_y(y{N65y zj0#zQ#_MzHVsS{=+#jK3erZD>3rAE){fp0LFMShFi+o`T$T#x)`{#e_HKJ!EJO}o%oZDqus^&woyxPvN*U2bwo?}&eg94~h4%@VRT z$PJhjqWNCnzW8^PyOHy zR{dZla=fVfH$lR>AFLxLIYQyOAFKrYAOMW~0pe3o`BIGi`Tzg`07*qoM6N<$f|qSn A4FCWD delta 685 zcmV;e0#g0S2B-#KiBL{Q4GJ0x0000DNk~Le0001h0001B1Oos704G#udH?_bAy7r0CxZYr~m+F002|}|Nqg^(Ym_2002V3z`!GcQq*6^>YFH8UWMeOV7cR)J6aR0v1U`K~z|U?Uq4rn=l;3DI(f+A=|3m zh~eeJkk&F;I=@HanxG-A4Y0`Mz@L9Qz#^vwrR?@-7yxC zLPGJjfW*kaow-?%jZil71Hg4uRuQQ%seBBK48DOeNH~6)^mQo@vG#F;3kF})b-e|D zCJcXmZ1QlMueP}#C32VIL|``)v^PHR-F^7^db~dz{R86qx~$m6w?L45XT?FC0cvkD zvJW7O43Z%&BJdquJcA%T-iQQ1c)B6m!iH}FbZg=WqoHBp9v}Gh{oyr{T6_hVl--)_ z5H2Thk_I%ac>tE+Gy-aGhMf8RyMe`Gu~>gT9_=r`r}!6A&C{1n{V9AZ`VQ)T(9Rbd z*(YE~`wr@UAm1r=Wz-my(Vn8yr^BuHnXm+;_goKK;iN^H zL;ay!EEbF9eR;=zU^sudADE!-2PP={feGq Date: Mon, 20 Oct 2025 00:59:30 +0000 Subject: [PATCH 26/93] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-5155.yml | 5 ----- 3 files changed, 10 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5155.yml diff --git a/html/changelog.html b/html/changelog.html index 02e47675ee10..a1998ef1ef37 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ --> - +

CAPACITOR STATUS

- +
Charge Precentage:
- +
{{:helper.displayBar(data.chargepercent, 0, 100)}}
- +
Maximum Capacitor Charge:
- +
{{:data.max_charge}} MJ
- +
Target Charge Level:
- +
{{:helper.link(data.target_charge, null, { 'adjust_target' : 1})}} MJ
- +
Estimated Charge Time:
- +
{{:data.chargetime}}
- +
Maximum Power Input: @@ -67,7 +67,7 @@ {{:data.max_power}} Kw
- +
Current Power Input: @@ -76,12 +76,12 @@ {{:helper.link(data.power_input, null, { 'adjust_power' : 1})}} Kw
- +
Charging Status:
- +
{{if data.charging == 1}} Charging @@ -90,22 +90,22 @@ {{/if}}
- +
{{:helper.link("Toggle Capacitor Charging", null, { 'toggle_charge' : 1})}}
- +

FUEL SYSTEM STATUS

- +
Remaining Fuel:
- {{:data.fuel_joules}} MJ + {{:data.fuel_joules}} MJ / {{:data.maxfuel}} MJ
- +
Average Conversion Rate: @@ -114,9 +114,9 @@ {{:data.fuel_conversion}} MJ/cm3
- +

JUMP SOLUTION ESTIMATES

- +
Jump Solution Status: @@ -142,7 +142,7 @@ {{:data.jumpcost}} MJ/cm
- +
Estimated Power Requirement: @@ -169,7 +169,7 @@ {{:helper.link(data.to_plot_y, null, { 'set_shunt_y' : 1})}}
- +
Plotted Shunt X/Y Coordinates: @@ -181,27 +181,27 @@ Y {{:data.shunt_y}}
- +

JUMP CONTROLS

-
+
{{:helper.link("Cancel Jump Plotting", null, { 'cancel_plot' : 1})}}
- -
+ +
{{:helper.link("Engage Jump Plotting", null, { 'plot_jump' : 1})}}
- -
+ +
{{:helper.link("Engage Shunt Drive", null, { 'start_shunt' : 1 })}}
- +
{{:helper.link("Disengage Shunt Drive", null, { 'cancel_shunt' : 1 })}} From bc0def1ab8735c5bb1a0481fa65c717c029d00fa Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 20 Oct 2025 19:47:06 -0400 Subject: [PATCH 38/93] Remove unused get_linked_to_desc helper --- mods/content/integrated_electronics/pins/_pins.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mods/content/integrated_electronics/pins/_pins.dm b/mods/content/integrated_electronics/pins/_pins.dm index 08f9194f2ca7..1cd253dfcb93 100644 --- a/mods/content/integrated_electronics/pins/_pins.dm +++ b/mods/content/integrated_electronics/pins/_pins.dm @@ -144,12 +144,6 @@ D [1]/ || var/datum/integrated_io/io = linked[k] write_data_to_pin(io.data) -/datum/integrated_io/proc/get_linked_to_desc() - if(linked.len) - return "the [english_list(linked)]" - return "nothing" - - /datum/integrated_io/proc/connect_pin(datum/integrated_io/pin) pin.linked |= src linked |= pin From c876d1f012d9df6a91306e20142840dc75c16079 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 20 Oct 2025 19:50:00 -0400 Subject: [PATCH 39/93] Remove redundant prefab assembly_name variable --- mods/content/integrated_electronics/prefab/prefab.dm | 1 - mods/content/integrated_electronics/prefab/prefabs.dm | 3 +-- mods/content/integrated_electronics/prefab/test/testprefabs.dm | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/mods/content/integrated_electronics/prefab/prefab.dm b/mods/content/integrated_electronics/prefab/prefab.dm index ae769b301a79..689fbbd687b4 100644 --- a/mods/content/integrated_electronics/prefab/prefab.dm +++ b/mods/content/integrated_electronics/prefab/prefab.dm @@ -5,7 +5,6 @@ return TRUE /decl/prefab/ic_assembly - var/assembly_name var/data var/power_cell_type diff --git a/mods/content/integrated_electronics/prefab/prefabs.dm b/mods/content/integrated_electronics/prefab/prefabs.dm index 41d1d8b8b4a1..a17305b58f9a 100644 --- a/mods/content/integrated_electronics/prefab/prefabs.dm +++ b/mods/content/integrated_electronics/prefab/prefabs.dm @@ -1,6 +1,5 @@ /decl/prefab/ic_assembly/hand_teleporter - assembly_name = "hand-teleporter" - data = @'{"assembly":{"type":"type-a electronic mechanism","name":"Hand Teleporter", "detail_color":"#5d99be"},"components":[{"type":"teleporter locator"},{"type":"wormhole generator"},{"type":"button","name":"Open Wormhole"}],"wires":[[[1,"O",1],[2,"I",1]],[[2,"A",1],[3,"A",1]]]}' + data = @'{"assembly":{"type":"type-a electronic mechanism","name":"hand teleporter", "detail_color":"#5d99be"},"components":[{"type":"teleporter locator"},{"type":"wormhole generator"},{"type":"button","name":"Open Wormhole"}],"wires":[[[1,"O",1],[2,"I",1]],[[2,"A",1],[3,"A",1]]]}' power_cell_type = /obj/item/cell/hyper /obj/abstract/prefab/hand_teleporter diff --git a/mods/content/integrated_electronics/prefab/test/testprefabs.dm b/mods/content/integrated_electronics/prefab/test/testprefabs.dm index 983536b1c873..96972a8bdbb8 100644 --- a/mods/content/integrated_electronics/prefab/test/testprefabs.dm +++ b/mods/content/integrated_electronics/prefab/test/testprefabs.dm @@ -1,6 +1,5 @@ /decl/prefab/ic_assembly/test_heatercooler - assembly_name = "heating-cooling-test" - data = @'{"assembly":{"type":"type-c electronic machine"},"components":[{"type":"starter"},{"type":"reagent funnel"},{"type":"big reagent storage"},{"type":"reagent pump","name":"Hot Pump","inputs":[[3,0,5]]},{"type":"reagent pump","name":"Cool Pump","inputs":[[3,0,5]]},{"type":"reagent heater","name":"Heater","inputs":[[1,0,80]]},{"type":"reagent cooler","name":"Cooler","inputs":[[1,0,-50]]},{"type":"button","name":"Heat And Cool"},{"type":"and gate","name":"Heater Active Check","inputs":[[1,0,0],[2,0,1]]},{"type":"and gate","name":"Cooler Active Check","inputs":[[1,0,0],[2,0,1]]},{"type":"custom delay circuit","name":"Heater Delay","inputs":[[1,0,100]]},{"type":"custom delay circuit","name":"Cooler Delay","inputs":[[1,0,100]]}],"wires":[[[1,"A",1],[3,"A",1]],[[1,"A",1],[6,"A",3]],[[1,"A",1],[7,"A",3]],[[2,"I",1],[3,"O",2]],[[3,"O",2],[4,"I",1]],[[3,"O",2],[5,"I",1]],[[4,"I",2],[6,"O",4]],[[4,"A",1],[8,"A",1]],[[4,"A",2],[6,"A",1]],[[5,"I",2],[7,"O",4]],[[5,"A",1],[8,"A",1]],[[5,"A",2],[7,"A",1]],[[6,"O",3],[9,"I",1]],[[6,"A",1],[11,"A",2]],[[6,"A",2],[9,"A",1]],[[7,"O",3],[10,"I",1]],[[7,"A",1],[12,"A",2]],[[7,"A",2],[10,"A",1]],[[9,"A",2],[11,"A",1]],[[10,"A",2],[12,"A",1]]]}' + data = @'{"assembly":{"type":"type-c electronic machine", "name":"heating-cooling test"},"components":[{"type":"starter"},{"type":"reagent funnel"},{"type":"big reagent storage"},{"type":"reagent pump","name":"Hot Pump","inputs":[[3,0,5]]},{"type":"reagent pump","name":"Cool Pump","inputs":[[3,0,5]]},{"type":"reagent heater","name":"Heater","inputs":[[1,0,80]]},{"type":"reagent cooler","name":"Cooler","inputs":[[1,0,-50]]},{"type":"button","name":"Heat And Cool"},{"type":"and gate","name":"Heater Active Check","inputs":[[1,0,0],[2,0,1]]},{"type":"and gate","name":"Cooler Active Check","inputs":[[1,0,0],[2,0,1]]},{"type":"custom delay circuit","name":"Heater Delay","inputs":[[1,0,100]]},{"type":"custom delay circuit","name":"Cooler Delay","inputs":[[1,0,100]]}],"wires":[[[1,"A",1],[3,"A",1]],[[1,"A",1],[6,"A",3]],[[1,"A",1],[7,"A",3]],[[2,"I",1],[3,"O",2]],[[3,"O",2],[4,"I",1]],[[3,"O",2],[5,"I",1]],[[4,"I",2],[6,"O",4]],[[4,"A",1],[8,"A",1]],[[4,"A",2],[6,"A",1]],[[5,"I",2],[7,"O",4]],[[5,"A",1],[8,"A",1]],[[5,"A",2],[7,"A",1]],[[6,"O",3],[9,"I",1]],[[6,"A",1],[11,"A",2]],[[6,"A",2],[9,"A",1]],[[7,"O",3],[10,"I",1]],[[7,"A",1],[12,"A",2]],[[7,"A",2],[10,"A",1]],[[9,"A",2],[11,"A",1]],[[10,"A",2],[12,"A",1]]]}' power_cell_type = /obj/item/cell/hyper /obj/abstract/prefab/test_heatcool From b4cdb48e271930dcc4b37a7b6dc7c232242421e5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 20 Oct 2025 19:51:54 -0400 Subject: [PATCH 40/93] Implement added_to_assembly and removed_from_assembly methods --- mods/content/integrated_electronics/assemblies/_assemblies.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/content/integrated_electronics/assemblies/_assemblies.dm b/mods/content/integrated_electronics/assemblies/_assemblies.dm index a88f2c84e44c..c262a1bbc7ee 100644 --- a/mods/content/integrated_electronics/assemblies/_assemblies.dm +++ b/mods/content/integrated_electronics/assemblies/_assemblies.dm @@ -360,6 +360,7 @@ component.forceMove(get_object()) component.assembly = src assembly_components |= component + component.added_to_assembly(src) /obj/item/electronic_assembly/proc/try_remove_component(obj/item/integrated_circuit/component, mob/user, silent) @@ -391,6 +392,7 @@ component.dropInto(loc) component.assembly = null assembly_components.Remove(component) + component.removed_from_assembly(src) /obj/item/electronic_assembly/afterattack(atom/target, mob/user, proximity) From 16fb91404855579eaa95e1d2c22cfc297d5d5619 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 20 Oct 2025 19:58:46 -0400 Subject: [PATCH 41/93] Fix circuit assembly names always starting with an uppercase letter --- mods/content/integrated_electronics/assemblies/_assemblies.dm | 2 +- mods/content/integrated_electronics/circuit_serialization.dm | 4 ++-- .../integrated_electronics/components/_integrated_circuit.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/content/integrated_electronics/assemblies/_assemblies.dm b/mods/content/integrated_electronics/assemblies/_assemblies.dm index c262a1bbc7ee..c129dca73355 100644 --- a/mods/content/integrated_electronics/assemblies/_assemblies.dm +++ b/mods/content/integrated_electronics/assemblies/_assemblies.dm @@ -279,7 +279,7 @@ if(!check_interactivity(M)) return var/input = input("What do you want to name this?", "Rename", src.name) as null|text - input = sanitize_name(input,allow_numbers = 1) + input = sanitize_name(input, allow_numbers = TRUE, force_first_letter_uppercase = FALSE) if(!check_interactivity(M)) return if(!QDELETED(src) && input) diff --git a/mods/content/integrated_electronics/circuit_serialization.dm b/mods/content/integrated_electronics/circuit_serialization.dm index 8954b3217e54..fd6eda7eabf7 100644 --- a/mods/content/integrated_electronics/circuit_serialization.dm +++ b/mods/content/integrated_electronics/circuit_serialization.dm @@ -52,7 +52,7 @@ var/init_name = initial(name) // Validate name if(component_params["name"]) - sanitize_name(component_params["name"],allow_numbers=TRUE) + sanitize_name(component_params["name"],allow_numbers=TRUE,force_first_letter_uppercase = FALSE) // Validate input values if(component_params["inputs"]) var/list/loaded_inputs = component_params["inputs"] @@ -138,7 +138,7 @@ /obj/item/electronic_assembly/proc/verify_save(list/assembly_params) // Validate name and color if(assembly_params["name"]) - if(sanitize_name(assembly_params["name"], allow_numbers = TRUE) != assembly_params["name"]) + if(sanitize_name(assembly_params["name"], allow_numbers = TRUE, force_first_letter_uppercase = FALSE) != assembly_params["name"]) return "Bad assembly name." if(assembly_params["desc"]) if(sanitize(assembly_params["desc"]) != assembly_params["desc"]) diff --git a/mods/content/integrated_electronics/components/_integrated_circuit.dm b/mods/content/integrated_electronics/components/_integrated_circuit.dm index 454b80a3b6ae..fce50fde07f8 100644 --- a/mods/content/integrated_electronics/components/_integrated_circuit.dm +++ b/mods/content/integrated_electronics/components/_integrated_circuit.dm @@ -113,7 +113,7 @@ a creative player the means to solve many problems. Circuits are held inside an if(!check_interactivity(M)) return - var/input = sanitize_name(input(M, "What do you want to name this?", "Rename", name) as null|text, allow_numbers = TRUE) + var/input = sanitize_name(input(M, "What do you want to name this?", "Rename", name) as null|text, allow_numbers = TRUE, force_first_letter_uppercase = FALSE) if(check_interactivity(M)) if(!input) input = name From 645501439c0250c552f76616ea5d03d1175274de Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 24 Oct 2025 00:52:35 +0000 Subject: [PATCH 42/93] Automatic changelog generation [ci skip] --- html/changelog.html | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index a1998ef1ef37..94d93182b2f7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -63,17 +63,6 @@

Elizabeth updated:

  • added some variant sprites for cobblestone and running bond paths
- -

22 August 2025

-

Sutures updated:

-
    -
  • added new amanita mushroom plant growth states
  • -
  • changed coffee plant growth states
  • -
  • added ambience to Shaded Hills river and swamp areas
  • -
  • ambience should be louder and more frequent overall
  • -
  • stone walls now have a slight noise effect on their sprite
  • -
  • added a boiling-water sound to cooking pots on Shaded Hills
  • -
From ea50f3fc278164bd08cb483b69dddcc7acc86196 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sun, 19 Oct 2025 23:14:55 +1100 Subject: [PATCH 43/93] Generalizing some default colour retrieval code. --- .../living/simple_animal/_simple_animal.dm | 14 +++++++++++++ .../mob/living/simple_animal/passive/deer.dm | 4 +++- .../mob/living/simple_animal/passive/fox.dm | 20 ++++++++++++++----- .../mob/living/simple_animal/passive/horse.dm | 2 +- .../living/simple_animal/passive/rabbit.dm | 17 ++++++++++++---- .../mob/living/simple_animal/passive/wolf.dm | 4 +++- 6 files changed, 49 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 28c2a4c16e30..ab53e5630e3f 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -114,6 +114,10 @@ /mob/living/simple_animal/Initialize() . = ..() + if(isnull(draw_visible_overlays)) + var/list/defaults = get_default_animal_colours() + draw_visible_overlays = defaults?.Copy() // do not mutate static list + if(length(ability_handlers)) for(var/handler in ability_handlers) add_ability_handler(handler) @@ -127,6 +131,9 @@ minbodytemp = 0 check_mob_icon_states(TRUE) + if(length(draw_visible_overlays)) + update_icon() + if(isnull(base_animal_type)) base_animal_type = type if(LAZYLEN(natural_armor)) @@ -603,3 +610,10 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/is_space_movement_permitted(allow_movement = FALSE) return skip_spacemove ? SPACE_MOVE_PERMITTED : ..() + +/mob/living/simple_animal/proc/get_default_animal_colour(marking_type) + var/list/colors = get_default_animal_colours() + return LAZYACCESS(colors, marking_type) // Return null if unset, rather than forcing COLOR_BLACK or such. + +/mob/living/simple_animal/proc/get_default_animal_colours() + return diff --git a/code/modules/mob/living/simple_animal/passive/deer.dm b/code/modules/mob/living/simple_animal/passive/deer.dm index da09424bce87..c9590c54714d 100644 --- a/code/modules/mob/living/simple_animal/passive/deer.dm +++ b/code/modules/mob/living/simple_animal/passive/deer.dm @@ -23,11 +23,13 @@ ai = /datum/mob_controller/passive/deer eye_color = "#1a1a1a" - draw_visible_overlays = list( +/mob/living/simple_animal/passive/deer/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#b39161", "markings" = "#3a3329", "socks" = "#ddd5c9" ) + return default_colors /mob/living/simple_animal/passive/deer/get_bodytype() return GET_DECL(/decl/bodytype/quadruped/animal/deer) diff --git a/code/modules/mob/living/simple_animal/passive/fox.dm b/code/modules/mob/living/simple_animal/passive/fox.dm index c2db673e6e85..09567e7abf19 100644 --- a/code/modules/mob/living/simple_animal/passive/fox.dm +++ b/code/modules/mob/living/simple_animal/passive/fox.dm @@ -9,12 +9,15 @@ pass_flags = PASS_FLAG_TABLE butchery_data = /decl/butchery_data/animal/fox eye_color = "#1d628a" - draw_visible_overlays = list( + ability_handlers = list(/datum/ability_handler/predator) + +/mob/living/simple_animal/passive/fox/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#ed5a20", "markings" = "#efe9e6", "socks" = "#36221b" ) - ability_handlers = list(/datum/ability_handler/predator) + return default_colors /mob/living/simple_animal/passive/fox/get_available_postures() var/static/list/available_postures = list( @@ -51,31 +54,38 @@ name = "arctic fox" desc = "A cunning and graceful predatory mammal, known for leaping headfirst into snowbanks while hunting burrowing rodents." eye_color = "#7a6f3b" - draw_visible_overlays = list( + +/mob/living/simple_animal/passive/fox/arctic/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#ccc496", "markings" = "#efe9e6", "socks" = "#cab9b1" ) + return default_colors /mob/living/simple_animal/passive/fox/silver name = "silver fox" desc = "A cunning and graceful predatory mammal, known for the rarity and high value of their pelts." eye_color = "#2db1c9" - draw_visible_overlays = list( + +/mob/living/simple_animal/passive/fox/silver/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#2c2c2a", "markings" = "#3d3b39", "socks" = "#746d66" ) + return default_colors /mob/living/simple_animal/passive/fox/sparkle name = "sparklefox" desc = "A cunning and graceful predatory mammal, known for being really into hardstyle." /mob/living/simple_animal/passive/fox/sparkle/Initialize() - eye_color = get_random_colour(TRUE) draw_visible_overlays = list( "base" = get_random_colour(), "markings" = get_random_colour(TRUE), "socks" = get_random_colour() ) + eye_color = get_random_colour(TRUE) . = ..() + diff --git a/code/modules/mob/living/simple_animal/passive/horse.dm b/code/modules/mob/living/simple_animal/passive/horse.dm index 0e2c0d0c023e..5ab8801cddd8 100644 --- a/code/modules/mob/living/simple_animal/passive/horse.dm +++ b/code/modules/mob/living/simple_animal/passive/horse.dm @@ -15,7 +15,7 @@ max_rider_size = MOB_SIZE_MEDIUM ai = /datum/mob_controller/passive/horse color = "#806146" // preview color - draw_visible_overlays = null // e.g. list("base" = "#806146") + draw_visible_overlays = list() // to avoid applying any defaults /datum/mob_controller/passive/horse emote_speech = list("Neigh!","NEIGH!","Neigh?") diff --git a/code/modules/mob/living/simple_animal/passive/rabbit.dm b/code/modules/mob/living/simple_animal/passive/rabbit.dm index 44afe0ed8698..4fe5386ebc36 100644 --- a/code/modules/mob/living/simple_animal/passive/rabbit.dm +++ b/code/modules/mob/living/simple_animal/passive/rabbit.dm @@ -11,11 +11,14 @@ ai = /datum/mob_controller/passive/rabbit butchery_data = /decl/butchery_data/animal/rabbit eye_color = COLOR_BLACK - draw_visible_overlays = list( + +/mob/living/simple_animal/passive/rabbit/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#e6e5da", "markings" = "#c8b1a5", "socks" = "#e6e5da" ) + return default_colors /datum/mob_controller/passive/rabbit emote_hear = list("chitters") @@ -31,30 +34,36 @@ /mob/living/simple_animal/passive/rabbit/brown name = "brown rabbit" butchery_data = /decl/butchery_data/animal/rabbit/brown - draw_visible_overlays = list( + +/mob/living/simple_animal/passive/rabbit/brown/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#62472b", "markings" = "#958279", "socks" = "#62472b" ) + return default_colors /mob/living/simple_animal/passive/rabbit/black name = "black rabbit" butchery_data = /decl/butchery_data/animal/rabbit/black - draw_visible_overlays = list( + +/mob/living/simple_animal/passive/rabbit/black/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#4f4f4f", "markings" = "#958279", "socks" = "#4f4f4f" ) + return default_colors /mob/living/simple_animal/passive/rabbit/sparkle name = "sparklerabbit" desc = "A hopping mammal with long ears and a love for raves." /mob/living/simple_animal/passive/rabbit/sparkle/Initialize() - eye_color = get_random_colour(TRUE) draw_visible_overlays = list( "base" = get_random_colour(), "markings" = get_random_colour(TRUE), "socks" = get_random_colour() ) + eye_color = get_random_colour(TRUE) . = ..() diff --git a/code/modules/mob/living/simple_animal/passive/wolf.dm b/code/modules/mob/living/simple_animal/passive/wolf.dm index 980c2ca729f2..aae33697bfb8 100644 --- a/code/modules/mob/living/simple_animal/passive/wolf.dm +++ b/code/modules/mob/living/simple_animal/passive/wolf.dm @@ -11,11 +11,13 @@ eye_color = "#9b7214" ability_handlers = list(/datum/ability_handler/predator) - draw_visible_overlays = list( +/mob/living/simple_animal/passive/wolf/get_default_animal_colours() + var/static/list/default_colors = list( "base" = "#6a6a6d", "markings" = "#574938", "socks" = "#41414d" ) + return default_colors /datum/mob_controller/passive/hunter/wolf emote_speech = list("Awoo!","Aroo!","Rrr!") From 1cc7512cd034438234c31391e7aaebf282329b1e Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sun, 19 Oct 2025 22:03:17 +1100 Subject: [PATCH 44/93] Backporting animal ears from Pyrelight as biomod modpack. --- code/modules/mob/mob_snapshot.dm | 21 +++++- maps/modpack_testing/modpack_testing.dm | 1 + mods/content/biomods/_biomods.dm | 2 + mods/content/biomods/_biomods.dme | 9 +++ .../content/biomods/ears.dm | 14 ++-- mods/content/biomods/ears_animal.dm | 26 +++++++ mods/content/biomods/icons/ears.dmi | Bin 0 -> 2740 bytes mods/content/biomods/icons/tails.dmi | Bin 0 -> 6696 bytes mods/content/biomods/tails.dm | 68 ++++++++++++++++++ nebula.dme | 1 - 10 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 mods/content/biomods/_biomods.dm create mode 100644 mods/content/biomods/_biomods.dme rename code/modules/sprite_accessories/ears/accessory_ears_pointed.dm => mods/content/biomods/ears.dm (54%) create mode 100644 mods/content/biomods/ears_animal.dm create mode 100644 mods/content/biomods/icons/ears.dmi create mode 100644 mods/content/biomods/icons/tails.dmi create mode 100644 mods/content/biomods/tails.dm diff --git a/code/modules/mob/mob_snapshot.dm b/code/modules/mob/mob_snapshot.dm index 950dc9b2cce6..01398160314a 100644 --- a/code/modules/mob/mob_snapshot.dm +++ b/code/modules/mob/mob_snapshot.dm @@ -78,9 +78,26 @@ target.set_skin_tone(skin_tone) for(var/limb_data in extra_limbs) + + // Grab our limb type for checking. var/limb_path = extra_limbs[limb_data]["path"] - var/obj/item/organ/external/new_limb = new limb_path(null, null, src) - target.add_organ(new_limb, null, TRUE, FALSE, FALSE, TRUE) + + // For whatever reason, we already have a limb in this slot. + // Creating a new one without removing the old one would cause limb overwrite runtimes. + var/obj/item/organ/external/limb = target.get_organ(limb_data) + if(istype(limb)) + // TODO: some way to cleanly remove and restitch an organ up the limb chain. + if(length(limb.children)) + continue + // If it's already the appropriate type, we're probably safe to leave it. + if(limb.type == limb_path) + continue + // Snip off the limb so we can replace it without issues. + target.remove_organ(limb, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE) + + // Create and install the new limb. + target.add_organ(new limb_path(null, null, src), null, TRUE, FALSE, FALSE, TRUE) + extra_limbs = null // can't reuse it! for(var/obj/item/organ/organ in target.get_organs()) diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 2ad67edc3e01..bdb2a0ebdca8 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -8,6 +8,7 @@ #include "../../mods/content/beekeeping/_beekeeping.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" + #include "../../mods/content/biomods/_biomods.dme" #include "../../mods/content/blacksmithy/_blacksmithy.dme" #include "../../mods/content/blob/_blob.dme" #include "../../mods/content/breath_holding/_breath_holding.dme" diff --git a/mods/content/biomods/_biomods.dm b/mods/content/biomods/_biomods.dm new file mode 100644 index 000000000000..e0695f8190b7 --- /dev/null +++ b/mods/content/biomods/_biomods.dm @@ -0,0 +1,2 @@ +/decl/modpack/biomods + name = "Biomodding Content" \ No newline at end of file diff --git a/mods/content/biomods/_biomods.dme b/mods/content/biomods/_biomods.dme new file mode 100644 index 000000000000..cdb7470d9b3d --- /dev/null +++ b/mods/content/biomods/_biomods.dme @@ -0,0 +1,9 @@ +#ifndef MODPACK_BIOMODS +#define MODPACK_BIOMODS +// BEGIN_INCLUDE +#include "_biomods.dm" +#include "ears.dm" +#include "ears_animal.dm" +#include "tails.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/code/modules/sprite_accessories/ears/accessory_ears_pointed.dm b/mods/content/biomods/ears.dm similarity index 54% rename from code/modules/sprite_accessories/ears/accessory_ears_pointed.dm rename to mods/content/biomods/ears.dm index 303e0611e326..bf929c74e068 100644 --- a/code/modules/sprite_accessories/ears/accessory_ears_pointed.dm +++ b/mods/content/biomods/ears.dm @@ -1,24 +1,28 @@ -/decl/sprite_accessory/ears/pointed +/decl/sprite_accessory/ears/biomods + abstract_type = /decl/sprite_accessory/ears/biomods + icon = 'mods/content/biomods/icons/ears.dmi' + +/decl/sprite_accessory/ears/biomods/pointed name = "Pointed Ears" icon_state = "ears_pointy" uid = "accessory_ears_pointy" -/decl/sprite_accessory/ears/pointed_long +/decl/sprite_accessory/ears/biomods/pointed_long name = "Long Pointed Ears" icon_state = "ears_pointy_long" uid = "accessory_ears_pointy_long" -/decl/sprite_accessory/ears/pointed_down +/decl/sprite_accessory/ears/biomods/pointed_down name = "Pointed Ears (Downward)" icon_state = "ears_pointy_down" uid = "accessory_ears_pointy_down" -/decl/sprite_accessory/ears/pointed_long_down +/decl/sprite_accessory/ears/biomods/pointed_long_down name = "Long Pointed Ears (Downward)" icon_state = "ears_pointy_long_down" uid = "accessory_ears_long_down" -/decl/sprite_accessory/ears/elven +/decl/sprite_accessory/ears/biomods/elven name = "Elven Ears" icon_state = "elfs" uid = "accessory_ears_elfs" diff --git a/mods/content/biomods/ears_animal.dm b/mods/content/biomods/ears_animal.dm new file mode 100644 index 000000000000..3e39b6567dd1 --- /dev/null +++ b/mods/content/biomods/ears_animal.dm @@ -0,0 +1,26 @@ +/decl/sprite_accessory/ears/biomods/animal + name = "Animal Ears" + icon_state = "ears_plain" + uid = "accessory_ears_animal" + accessory_metadata_types = list(SAM_COLOR, SAM_COLOR_INNER) + +/decl/sprite_accessory/ears/biomods/animal/lupine + name = "Lupine Ears" + icon_state = "wolf" + uid = "accessory_ears_wolf" + +/decl/sprite_accessory/ears/biomods/animal/fennec + name = "Fennec Ears" + icon_state = "fennec" + uid = "accessory_ears_fennec" + +/decl/sprite_accessory/ears/biomods/animal/vulpine + name = "Vulpine Ears" + icon_state = "fox" + uid = "accessory_ears_fox" + +/decl/sprite_accessory/ears/biomods/antlers + name = "Antlers" + icon_state = "antlers" + uid = "accessory_ears_antlers" + accessory_metadata_types = list(SAM_COLOR) diff --git a/mods/content/biomods/icons/ears.dmi b/mods/content/biomods/icons/ears.dmi new file mode 100644 index 0000000000000000000000000000000000000000..229f9ee647955d6c35addf54a4219c72632e90a7 GIT binary patch literal 2740 zcmb_ec{tST9{-IkOT~#$$C8dq_sEu|BD=9olo+xOb&wb;W~jlCq(VGYnx>K_ON1;# zS!Pm}J0USy#u%fy$vQLUSO#Op`FWoE*SXLA=RW><-|zEo&-?v+KJVxI-aYH#yhrw+ zEC2v|TwNT`0RRLHfk|m8uwAfwcNXm4-S9pi?-&+$@ml1S_{i8807!iL@T-;VC!^hx zlQioLm({_dH^FXhl)ON#$4(v+)q&B}h9+)aar_Zar*{7HTW%*1)$Y4c^cmeQ$Fz1^ zB0b8Cnx|`Y#p1G=R*qNj?FUFFqqDv3E%udZ7sSLL`WTE^>KI*FgIXD13@q7;F)H55O!U|b5%G%po>*XK$7-Wn<+!P=a-fYD4GS5p0W)M~56?(v@-t|IJRyxBJ- z!REYW2M6uMGy?#cCRay0@5HBUMt=<5N4cB#$u9L}yNl6jaY^q~KxOQ7HYDFaK#_sc zcoDSfS;}s;WfGPE6PQUr6GbQZx|Xf2q{Q2&hxZ01q9Q^~2s4_lu0Ps-as__SeI;=& zJkb#f#3LS!4u`K`YE4WqSd*-|Q;mkCc|kcGdPz9RTZ1ulJDf9#9OiN6O7ak0`&IDb zJMX=zDTZj?K=D5)9|q%Rerm#~#jyOePUlR`8YjUpx0AD;brF`|el7=G=6dYywBh|< zE6JnIJg!a@+;jPB7YR=r#30aE-;4%w%ksICz`ahg>n~z6rH5yH{ZOH{YnQQ-Mkc@J z8WP-_@QrIhBO?h+1yWoS%^`nx^f6p@64*QnKBVw`43am!{#h}GAr$;>zgfQSlU5KSqU%mLy_i3X4}hj_%=PqB38GOnWlH@ zRON%e#bQFDyyn!ziyBXgO6nogDyg)&^tb0ndlyzJk7EQ9ll7ufjd0(Q35OTVEC%c2 zaXMF|BKP6V29NuhW%xi{ya)|$Btu%sIA{%`Z9UP_RSITlt$}cIf0jg=ubJ0!m6}i? z(~@JMHW|s>txbye)LH_Phu7CkUl*<*Yl|$p$%DD6OL8HMEEPUi@I$UxbU_}!u^37! zEL|m+d!jcTEDQwZFc{MwpMf;){ErZnV?ajcMU%8+~F`=w05x_j6U+ z2a?os7`JIdL{Q1f_R>n!vctT?*5sFU*bU6ucH*U-Bd9 z+S6`E#o669S8vq!d-NWz0uU9XBe4myB|dfE}{z7@G1Q55yAJSR#2Vs2k{FnqGo>(H&gXSYgH5X%<6I`nqk3Ds7j#|E5;hj z+#q>jxSplf!I{@!{>eoTwnZ9w4CnuRdVtlyGSBWV^aMi#Lh-!YwhOfnQXZ8$@TUq9 zrX(ZtAp{DGw_0m}op~ts;&Dc>&x^z)W<51|1mS%&MN&%RA=>aKH z{)|B!`I3h0y5%dI%3C`Io~fs2)Y9AtBA=|O#$4%X5E_sB_OX5-HccN*Utbn*V-ucu zA<9H7K}(O=sFO<;`7QDcu{*s6?=Ugk8_!(n74ATq<&&rw8-dgMPe$1G9iq+T{5Fc z!oa_BoCrBuh%kJ&KX!sbp|q4neIp{zY)ap8`_kX9Cz&+F)(8+nK{3KxmiIk-_KaP- z-}cib(`(2KcU;g7EzmTQBzMlB|3}LI1T?w~umM-;v3#qOLkYsp;Fm`%F3qhp?S~H7 zxhO`p9R0?};-}%VshJc4*&Ej%6HZ>hT(015$dTj{tv3_ghszT;Ed$7tPX&Y=3sf}S zYpMnyP1g&mZTK5o=5le?Ndo}|W~)TT#Y*z|-x~N>dWxz%sie9$)7c6{$trncS=Xfg zR6llk{5}pB=C?|~(b#OZJgQ$Dq`C_M+3{NSUr>~5_td#jBPwI~qjM_vb8~}~pu60M zN1ec~yStmnZ@UJZ%046_{ekD=)#R-X=8z0%Kj-th%o8YVHgcBrxvrNnF@dg2`Oado zrm0kFLXI-+QRS14nz`P>jEODxI7j9~&{mY}Sro%XxkE5&a^??%JvA8XYdHM|;Mj&FjIl zv7qt-rr&4pstGl?)9d!J+`V{p2=1vQTv}dUF3S^}oa!mG0oTC!@3-r{CIqtMb$<&8 Wf&vPS73Ik7PpK=^!?D^vTAMWl(8 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 M_jKST>eiwE0Z3(D`Tzg` literal 0 HcmV?d00001 diff --git a/mods/content/biomods/tails.dm b/mods/content/biomods/tails.dm new file mode 100644 index 000000000000..d42ff27af93c --- /dev/null +++ b/mods/content/biomods/tails.dm @@ -0,0 +1,68 @@ +/decl/sprite_accessory/tail/biomods + abstract_type = /decl/sprite_accessory/tail/biomods + icon = 'mods/content/biomods/icons/tails.dmi' + accessory_metadata_types = list(SAM_COLOR) + +/decl/sprite_accessory/tail/biomods/twotone + abstract_type = /decl/sprite_accessory/tail/biomods/twotone + accessory_metadata_types = list(SAM_COLOR, SAM_COLOR_INNER) + +/decl/sprite_accessory/tail/biomods/twotone/skunk + name = "Skunk Tail" + icon_state = "skunktail" + uid = "acc_tail_skunk" + +/decl/sprite_accessory/tail/biomods/twotone/vulpine + name = "Vulpine Tail" + icon_state = "vulptail" + uid = "acc_tail_vulpine" + +/decl/sprite_accessory/tail/biomods/twotone/tuft + name = "Tuft Tail" + icon_state = "deertail" + uid = "acc_tail_deer" + +/decl/sprite_accessory/tail/biomods/twotone/long_tuft + name = "Long Tufted Tail" + icon_state = "easterntail" + uid = "acc_tail_eastern" + +/decl/sprite_accessory/tail/biomods/horse + name = "Horse Tail" + icon_state = "horse" + uid = "acc_tail_horse" + +/decl/sprite_accessory/tail/biomods/fantail + name = "Fantail" + icon_state = "fantail" + uid = "acc_tail_fan" + +/decl/sprite_accessory/tail/biomods/wagtail + name = "Wagtail" + icon_state = "wagtail" + uid = "acc_tail_wag" + +/decl/sprite_accessory/tail/biomods/mouse + name = "Mouse Tail" + icon_state = "mouse" + uid = "acc_tail_mouse" + +/decl/sprite_accessory/tail/biomods/straight + name = "Straight Tail" + icon_state = "straighttail" + uid = "acc_tail_straight" + +/decl/sprite_accessory/tail/biomods/spiky + name = "Spiky Tail" + icon_state = "ztail" + uid = "acc_tail_ztail" + +/decl/sprite_accessory/tail/biomods/fox + name = "Fox Tail" + icon_state = "fox_tail" + uid = "acc_tail_fox" + +/decl/sprite_accessory/tail/biomods/wolf + name = "Wolf Tail" + icon_state = "wolf_tail" + uid = "acc_tail_wolf" diff --git a/nebula.dme b/nebula.dme index eed1fb548983..4042ee05fc6e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3797,7 +3797,6 @@ #include "code\modules\sprite_accessories\cosmetics\_accessory_cosmetics.dm" #include "code\modules\sprite_accessories\ears\_accessory_ears.dm" #include "code\modules\sprite_accessories\ears\accessory_ears_antennae.dm" -#include "code\modules\sprite_accessories\ears\accessory_ears_pointed.dm" #include "code\modules\sprite_accessories\facial\_accessory_facial.dm" #include "code\modules\sprite_accessories\facial\accessory_facial_hair.dm" #include "code\modules\sprite_accessories\frills\_accessory_frills.dm" From e5a542bf8e01a6f41c288ab03384d3882b1f044b Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Tue, 28 Oct 2025 19:47:46 +1100 Subject: [PATCH 45/93] Adding UID to flooring decls. --- code/game/turfs/flooring/_flooring.dm | 1 + code/game/turfs/flooring/flooring_carpet.dm | 28 +++++++++++++------ code/game/turfs/flooring/flooring_concrete.dm | 3 ++ code/game/turfs/flooring/flooring_grass.dm | 3 ++ .../game/turfs/flooring/flooring_holowater.dm | 1 + code/game/turfs/flooring/flooring_lava.dm | 1 + code/game/turfs/flooring/flooring_misc.dm | 7 +++++ code/game/turfs/flooring/flooring_mud.dm | 3 ++ code/game/turfs/flooring/flooring_natural.dm | 6 ++++ code/game/turfs/flooring/flooring_path.dm | 4 +++ code/game/turfs/flooring/flooring_plating.dm | 1 + .../turfs/flooring/flooring_reinforced.dm | 12 ++++++++ code/game/turfs/flooring/flooring_rock.dm | 1 + code/game/turfs/flooring/flooring_sand.dm | 6 ++++ code/game/turfs/flooring/flooring_snow.dm | 3 ++ code/game/turfs/flooring/flooring_tiled.dm | 18 ++++++++++++ code/game/turfs/flooring/flooring_wood.dm | 20 +++++++++++++ .../psionics/system/psionics/null/flooring.dm | 1 + mods/gamemodes/cult/flooring.dm | 1 + .../mobs/dionaea/mob/gestalt/gestalt_turfs.dm | 1 + mods/species/ascent/turfs/ship.dm | 2 ++ mods/species/skrell/turfs/flooring.dm | 6 ++++ 22 files changed, 120 insertions(+), 9 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index a4e97fe7d360..f5f8083873f8 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -9,6 +9,7 @@ var/global/list/flooring_cache = list() /decl/flooring abstract_type = /decl/flooring + decl_flags = DECL_FLAG_MANDATORY_UID var/name var/desc diff --git a/code/game/turfs/flooring/flooring_carpet.dm b/code/game/turfs/flooring/flooring_carpet.dm index 8c7be4c850f1..4236c3c2597b 100644 --- a/code/game/turfs/flooring/flooring_carpet.dm +++ b/code/game/turfs/flooring/flooring_carpet.dm @@ -11,6 +11,7 @@ footstep_type = /decl/footsteps/carpet force_material = /decl/material/solid/organic/cloth constructed = TRUE + uid = "floor_carpet" burned_states = list( "burned0", "burned1" @@ -27,49 +28,58 @@ name = "blue carpet" icon_base = "blue1" build_type = /obj/item/stack/tile/carpet/blue + uid = "floor_carpet_blue" /decl/flooring/carpet/blue2 name = "pale blue carpet" icon_base = "blue2" build_type = /obj/item/stack/tile/carpet/blue2 + uid = "floor_carpet_blue2" /decl/flooring/carpet/blue3 name = "sea blue carpet" icon_base = "blue3" build_type = /obj/item/stack/tile/carpet/blue3 + uid = "floor_carpet_blue3" /decl/flooring/carpet/magenta name = "magenta carpet" icon_base = "purple" build_type = /obj/item/stack/tile/carpet/magenta + uid = "floor_carpet_magenta" /decl/flooring/carpet/purple name = "purple carpet" icon_base = "purple" build_type = /obj/item/stack/tile/carpet/purple + uid = "floor_carpet_purple" /decl/flooring/carpet/orange name = "orange carpet" icon_base = "orange" build_type = /obj/item/stack/tile/carpet/orange + uid = "floor_carpet_orange" /decl/flooring/carpet/green name = "green carpet" icon_base = "green" build_type = /obj/item/stack/tile/carpet/green + uid = "floor_carpet_green" /decl/flooring/carpet/red name = "red carpet" icon_base = "red" build_type = /obj/item/stack/tile/carpet/red + uid = "floor_carpet_red" /decl/flooring/carpet/rustic - name = "rustic carpet" - desc = "A stretch of simple woven carpet. Cozy, but a little itchy." - icon = 'icons/turf/flooring/simple_carpet.dmi' - icon_base = "carpet" - build_type = /obj/item/stack/tile/carpet/rustic - can_paint = TRUE - color = null - broken_states = null - burned_states = null + name = "rustic carpet" + desc = "A stretch of simple woven carpet. Cozy, but a little itchy." + icon = 'icons/turf/flooring/simple_carpet.dmi' + icon_base = "carpet" + build_type = /obj/item/stack/tile/carpet/rustic + can_paint = TRUE + color = null + broken_states = null + burned_states = null + uid = "floor_carpet_rustic" diff --git a/code/game/turfs/flooring/flooring_concrete.dm b/code/game/turfs/flooring/flooring_concrete.dm index 4b747fc28d2c..e5d6edd5f174 100644 --- a/code/game/turfs/flooring/flooring_concrete.dm +++ b/code/game/turfs/flooring/flooring_concrete.dm @@ -6,14 +6,17 @@ has_base_range = null force_material = /decl/material/solid/stone/concrete constructed = TRUE + uid = "floor_concrete" /decl/flooring/concrete/reinforced name = "reinforced concrete" icon_base = "hexacrete" desc = "A flat stretch of stone-like artificial material. It has been reinforced with an unknown compound." + uid = "floor_concrete_reinf" /decl/flooring/concrete/asphalt name = "asphalt" color = COLOR_GRAY40 icon_base = "concrete" desc = "A stretch of rough blacktop, probably part of a road." + uid = "floor_asphalt" diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index bc340140b5d5..dc53aaf46808 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -13,6 +13,7 @@ flooring_flags = TURF_REMOVE_SHOVEL force_material = /decl/material/solid/organic/plantmatter/grass growth_value = 1.2 // Shouldn't really matter since you can't plant on grass, it turns to dirt first. + uid = "floor_grass" var/harvestable = FALSE /decl/flooring/grass/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -33,6 +34,7 @@ has_base_range = null icon_edge_layer = FLOOR_EDGE_GRASS_WILD harvestable = TRUE + uid = "floor_grass_wild" /decl/flooring/grass/wild/get_movable_alpha_mask_state(atom/movable/mover) . = ..() || "mask_grass" @@ -53,3 +55,4 @@ color = "#5e7a3b" build_type = /obj/item/stack/tile/grass force_material = /decl/material/solid/organic/plastic + uid = "floor_grass_fake" diff --git a/code/game/turfs/flooring/flooring_holowater.dm b/code/game/turfs/flooring/flooring_holowater.dm index d873db21a10e..6bfe235d67e1 100644 --- a/code/game/turfs/flooring/flooring_holowater.dm +++ b/code/game/turfs/flooring/flooring_holowater.dm @@ -8,3 +8,4 @@ footstep_type = /decl/footsteps/water holographic = TRUE constructed = TRUE + uid = "floor_water_fake" diff --git a/code/game/turfs/flooring/flooring_lava.dm b/code/game/turfs/flooring/flooring_lava.dm index d8137d15b356..adf4f4b4f1af 100644 --- a/code/game/turfs/flooring/flooring_lava.dm +++ b/code/game/turfs/flooring/flooring_lava.dm @@ -10,6 +10,7 @@ turf_light_color = LIGHT_COLOR_LAVA turf_light_range = 2 turf_light_power = 0.7 + uid = "floor_lava" /decl/flooring/lava/handle_environment_proc(turf/floor/target) . = PROCESS_KILL diff --git a/code/game/turfs/flooring/flooring_misc.dm b/code/game/turfs/flooring/flooring_misc.dm index d72c2f54d96d..893b2e72dee4 100644 --- a/code/game/turfs/flooring/flooring_misc.dm +++ b/code/game/turfs/flooring/flooring_misc.dm @@ -9,6 +9,7 @@ footstep_type = /decl/footsteps/tiles force_material = /decl/material/solid/organic/plastic constructed = TRUE + uid = "floor_lino" /decl/flooring/crystal name = "crystal flooring" @@ -20,6 +21,7 @@ color = "#00ffe1" force_material = /decl/material/solid/gemstone/crystal constructed = TRUE + uid = "floor_crystal" /decl/flooring/glass name = "glass flooring" @@ -37,6 +39,7 @@ z_flags = ZM_MIMIC_DEFAULTS force_material = /decl/material/solid/glass constructed = TRUE + uid = "floor_glass" /decl/flooring/glass/boro name = "borosilicate glass flooring" @@ -44,6 +47,7 @@ color = GLASS_COLOR_SILICATE damage_temperature = T0C + 4000 force_material = /decl/material/solid/glass/borosilicate + uid = "floor_glass_boro" /decl/flooring/pool name = "pool floor" @@ -57,6 +61,7 @@ force_material = /decl/material/solid/stone/ceramic constructed = TRUE gender = NEUTER + uid = "floor_pool" /decl/flooring/woven name = "woven floor" @@ -71,6 +76,7 @@ force_material = /decl/material/solid/organic/plantmatter/grass/dry constructed = TRUE gender = NEUTER + uid = "floor_woven" /decl/flooring/straw name = "straw floor" @@ -86,3 +92,4 @@ force_material = /decl/material/solid/organic/plantmatter/grass/dry constructed = TRUE gender = NEUTER + uid = "floor_straw" diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 6265343f2e7f..001a0c33ce90 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -11,6 +11,7 @@ growth_value = 1.1 can_collect = TRUE print_type = /obj/effect/footprints + uid = "floor_mud" /decl/flooring/mud/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!target.reagents?.total_volume) @@ -43,6 +44,7 @@ color = "#ae9e66" dirt_color = "#ae9e66" force_material = /decl/material/solid/soil + uid = "floor_dry_mud" /decl/flooring/dry_mud/fluid_act(turf/floor/target, datum/reagents/fluids) if(target.get_topmost_flooring() == src) @@ -64,6 +66,7 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/soil growth_value = 1 + uid = "floor_dirt" /decl/flooring/dirt/fluid_act(turf/floor/target, datum/reagents/fluids) if(target.get_topmost_flooring() == src) diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 63d3b2ec93c5..17bf186c0ad9 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -8,6 +8,7 @@ force_material = /decl/material/solid/sand gender = NEUTER footstep_type = /decl/footsteps/sand + uid = "floor_seafloor" /decl/flooring/shrouded name = "packed sand" @@ -19,6 +20,7 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand footstep_type = /decl/footsteps/asteroid + uid = "floor_shrouded" /decl/flooring/meat name = "fleshy ground" @@ -30,6 +32,7 @@ footstep_type = /decl/footsteps/mud force_material = /decl/material/solid/organic/meat print_type = /obj/effect/footprints + uid = "floor_meat" /decl/flooring/barren name = "ground" @@ -42,6 +45,7 @@ icon_edge_layer = FLOOR_EDGE_BARREN force_material = /decl/material/solid/soil growth_value = 0.1 + uid = "floor_barren" /decl/flooring/clay name = "clay" @@ -55,6 +59,7 @@ growth_value = 1.2 can_collect = TRUE print_type = /obj/effect/footprints + uid = "floor_clay" /decl/flooring/ice name = "ice" @@ -63,6 +68,7 @@ icon_base = "ice" color = COLOR_LIQUID_WATER force_material = /decl/material/solid/ice + uid = "floor_ice" /decl/flooring/ice/update_turf_icon(turf/floor/target) . = ..() diff --git a/code/game/turfs/flooring/flooring_path.dm b/code/game/turfs/flooring/flooring_path.dm index cd821d713a86..c0de0be830eb 100644 --- a/code/game/turfs/flooring/flooring_path.dm +++ b/code/game/turfs/flooring/flooring_path.dm @@ -7,6 +7,7 @@ neighbour_type = /decl/flooring/path color = null constructed = TRUE + uid = "floor_path" // If null, this is just skipped. var/paving_adjective = "cobbled" @@ -28,6 +29,7 @@ icon_edge_layer = FLOOR_EDGE_PATH flooring_flags = TURF_REMOVE_CROWBAR has_base_range = 1 + uid = "floor_path_cobble" /decl/flooring/path/running_bond name = "stone path" @@ -35,6 +37,7 @@ icon_base = "runningbond" has_base_range = 3 gender = NEUTER + uid = "floor_path_bond" /decl/flooring/path/herringbone name = "stone path" @@ -42,3 +45,4 @@ icon_base = "herringbone" has_base_range = null gender = NEUTER + uid = "floor_path_herring" diff --git a/code/game/turfs/flooring/flooring_plating.dm b/code/game/turfs/flooring/flooring_plating.dm index 505bad7a3edc..2b51940d1336 100644 --- a/code/game/turfs/flooring/flooring_plating.dm +++ b/code/game/turfs/flooring/flooring_plating.dm @@ -17,3 +17,4 @@ "broken3", "broken4" ) + uid = "floor_plating" diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index 97ce3b7302e4..38234d29ce8e 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -23,6 +23,7 @@ "broken3", "broken4" ) + uid = "floor_reinf" /decl/flooring/reinforced/circuit name = "processing strata" @@ -36,10 +37,12 @@ turf_light_range = 2 turf_light_power = 3 turf_light_color = COLOR_BLUE + uid = "floor_reinf_circ" /decl/flooring/reinforced/circuit/green icon_base = "gcircuit" turf_light_color = COLOR_GREEN + uid = "floor_reinf_gcirc" /decl/flooring/reinforced/circuit/red icon_base = "rcircuit" @@ -47,6 +50,7 @@ can_paint = FALSE turf_light_power = 2 turf_light_color = COLOR_RED + uid = "floor_reinf_rcirc" /decl/flooring/reinforced/shuttle name = "floor" @@ -57,24 +61,32 @@ can_paint = TRUE can_engrave = FALSE gender = NEUTER + uid = "floor_reinf_shuttle" /decl/flooring/reinforced/shuttle/blue icon_base = "floor" + uid = "floor_reinf_shuttle_blue" /decl/flooring/reinforced/shuttle/yellow icon_base = "floor2" + uid = "floor_reinf_shuttle_yellow" /decl/flooring/reinforced/shuttle/white icon_base = "floor3" + uid = "floor_reinf_shuttle_white" /decl/flooring/reinforced/shuttle/red icon_base = "floor4" + uid = "floor_reinf_shuttle_red" /decl/flooring/reinforced/shuttle/purple icon_base = "floor5" + uid = "floor_reinf_shuttle_purple" /decl/flooring/reinforced/shuttle/darkred icon_base = "floor6" + uid = "floor_reinf_shuttle_darkred" /decl/flooring/reinforced/shuttle/black icon_base = "floor7" + uid = "floor_reinf_shuttle_black" diff --git a/code/game/turfs/flooring/flooring_rock.dm b/code/game/turfs/flooring/flooring_rock.dm index 89b3fd455353..b5935e2109cc 100644 --- a/code/game/turfs/flooring/flooring_rock.dm +++ b/code/game/turfs/flooring/flooring_rock.dm @@ -7,6 +7,7 @@ color = null icon_edge_layer = FLOOR_EDGE_VOLCANIC gender = NEUTER + uid = "floor_reinf_shuttle_rock" /decl/flooring/rock/update_turf_strings(turf/floor/target) var/decl/material/material = target?.get_material() diff --git a/code/game/turfs/flooring/flooring_sand.dm b/code/game/turfs/flooring/flooring_sand.dm index caf29c810493..3a7c0843f653 100644 --- a/code/game/turfs/flooring/flooring_sand.dm +++ b/code/game/turfs/flooring/flooring_sand.dm @@ -10,6 +10,7 @@ force_material = /decl/material/solid/sand can_collect = TRUE print_type = /obj/effect/footprints + uid = "floor_sand" /decl/flooring/sand/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if((exposed_temperature > T0C + 1700 && prob(5)) || exposed_temperature > T0C + 3000) @@ -31,15 +32,18 @@ color = "#d2e0b7" dirt_color = "#d2e0b7" footstep_type = /decl/footsteps/sand + uid = "floor_sand_chlorine" /decl/flooring/sand/chlorine/marsh name = "chlorine marsh" desc = "A pool of noxious liquid chlorine. It's full of silt and plant matter." + uid = "floor_sand_chlorine_marsh" /decl/flooring/sand/fake name = "holosand" desc = "Uncomfortably coarse and gritty for a hologram." holographic = TRUE + uid = "floor_sand_fake" /decl/flooring/fake_space name = "\proper space" @@ -49,6 +53,7 @@ has_base_range = 25 holographic = TRUE gender = NEUTER + uid = "floor_space_fake" /decl/flooring/melted_sand name = "molten silica" @@ -57,3 +62,4 @@ icon_base = "glass" has_base_range = null force_material = /decl/material/solid/glass + uid = "floor_sand_melted" diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm index 8dabb7167af5..78e5b5f0b486 100644 --- a/code/game/turfs/flooring/flooring_snow.dm +++ b/code/game/turfs/flooring/flooring_snow.dm @@ -11,6 +11,7 @@ can_collect = TRUE print_type = /obj/effect/footprints drop_material_on_remove = TRUE + uid = "floor_snow" /decl/flooring/snow/get_movement_delay(var/travel_dir, var/mob/mover) . = ..() @@ -51,8 +52,10 @@ icon = 'icons/turf/flooring/snow.dmi' icon_base = "permafrost" force_material = /decl/material/solid/ice + uid = "floor_permafrost" /decl/flooring/snow/fake name = "holosnow" desc = "Not quite the same as snow on an entertainment terminal, but close." holographic = TRUE + uid = "floor_snow_fake" diff --git a/code/game/turfs/flooring/flooring_tiled.dm b/code/game/turfs/flooring/flooring_tiled.dm index b8cf9e4c0154..e2b4af68c879 100644 --- a/code/game/turfs/flooring/flooring_tiled.dm +++ b/code/game/turfs/flooring/flooring_tiled.dm @@ -26,34 +26,41 @@ "broken3", "broken4" ) + uid = "floor_tiled" /decl/flooring/tiling/mono icon_base = "monotile" build_type = /obj/item/stack/tile/mono + uid = "floor_tiled_mono" /decl/flooring/tiling/mono/dark color = COLOR_DARK_GRAY build_type = /obj/item/stack/tile/mono/dark + uid = "floor_tiled_dark_mono" /decl/flooring/tiling/mono/white icon_base = "monotile_light" color = COLOR_OFF_WHITE build_type = /obj/item/stack/tile/mono/white + uid = "floor_tiled_mono_white" /decl/flooring/tiling/white icon_base = "tiled_light" desc = "A layer of sterile white tiles." color = COLOR_OFF_WHITE build_type = /obj/item/stack/tile/floor_white + uid = "floor_tiled_white" /decl/flooring/tiling/dark desc = "A layer of ominously dark tiles." color = COLOR_DARK_GRAY build_type = /obj/item/stack/tile/floor_dark + uid = "floor_tiled_dark" /decl/flooring/tiling/dark/mono icon_base = "monotile" build_type = null + uid = "floor_tiled_dark_monotile" /decl/flooring/tiling/freezer desc = "A section of non-slip tiles suitable for a cool room or freezer." @@ -61,48 +68,59 @@ color = null flooring_flags = TURF_REMOVE_CROWBAR build_type = /obj/item/stack/tile/floor_freezer + uid = "floor_tiled_freezer" /decl/flooring/tiling/tech icon = 'icons/turf/flooring/techfloor.dmi' icon_base = "techfloor_gray" build_type = /obj/item/stack/tile/techgrey color = null + uid = "floor_tiled_tech" /decl/flooring/tiling/tech/grid icon_base = "techfloor_grid" build_type = /obj/item/stack/tile/techgrid + uid = "floor_tiled_tech_grid" /decl/flooring/tiling/new_tile icon_base = "tile_full" color = null build_type = null + uid = "floor_tiled_new" /decl/flooring/tiling/new_tile/cargo_one icon_base = "cargo_one_full" build_type = null + uid = "floor_tiled_cargo" /decl/flooring/tiling/new_tile/kafel icon_base = "kafel_full" build_type = null + uid = "floor_tiled_kafel" /decl/flooring/tiling/stone icon_base = "stone" build_type = /obj/item/stack/tile/stone + uid = "floor_tiled_stone" /decl/flooring/tiling/new_tile/techmaint icon_base = "techmaint" build_type = /obj/item/stack/tile/techmaint + uid = "floor_tiled_techmaint" /decl/flooring/tiling/new_tile/monofloor icon_base = "monofloor" color = COLOR_GUNMETAL + uid = "floor_tiled_monofloor" /decl/flooring/tiling/new_tile/steel_grid icon_base = "grid" color = COLOR_GUNMETAL build_type = /obj/item/stack/tile/grid + uid = "floor_tiled_steel_grid" /decl/flooring/tiling/new_tile/steel_ridged icon_base = "ridged" color = COLOR_GUNMETAL build_type = /obj/item/stack/tile/ridge + uid = "floor_tiled_steel_ridged" diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index d7352fb03ae2..20a479a891e0 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -22,30 +22,37 @@ "broken5", "broken6" ) + uid = "floor_wood" /decl/flooring/wood/mahogany build_type = /obj/item/stack/tile/wood/mahogany force_material = /decl/material/solid/organic/wood/mahogany + uid = "floor_wood_mahogany" /decl/flooring/wood/maple build_type = /obj/item/stack/tile/wood/maple force_material = /decl/material/solid/organic/wood/maple + uid = "floor_wood_maple" /decl/flooring/wood/ebony build_type = /obj/item/stack/tile/wood/ebony force_material = /decl/material/solid/organic/wood/ebony + uid = "floor_wood_ebony" /decl/flooring/wood/walnut build_type = /obj/item/stack/tile/wood/walnut force_material = /decl/material/solid/organic/wood/walnut + uid = "floor_wood_walnut" /decl/flooring/wood/bamboo build_type = /obj/item/stack/tile/wood/bamboo force_material = /decl/material/solid/organic/wood/bamboo + uid = "floor_wood_bamboo" /decl/flooring/wood/yew build_type = /obj/item/stack/tile/wood/yew force_material = /decl/material/solid/organic/wood/yew + uid = "floor_wood_yew" // Rough-hewn floors. /decl/flooring/wood/rough @@ -57,30 +64,37 @@ has_base_range = 3 build_type = /obj/item/stack/tile/wood/rough broken_states = null + uid = "floor_wood_rough" /decl/flooring/wood/rough/mahogany build_type = /obj/item/stack/tile/wood/rough/mahogany force_material = /decl/material/solid/organic/wood/mahogany + uid = "floor_wood_rough_mahogany" /decl/flooring/wood/rough/maple build_type = /obj/item/stack/tile/wood/rough/maple force_material = /decl/material/solid/organic/wood/maple + uid = "floor_wood_rough_maple" /decl/flooring/wood/rough/ebony build_type = /obj/item/stack/tile/wood/rough/ebony force_material = /decl/material/solid/organic/wood/ebony + uid = "floor_wood_rough_ebony" /decl/flooring/wood/rough/walnut build_type = /obj/item/stack/tile/wood/rough/walnut force_material = /decl/material/solid/organic/wood/walnut + uid = "floor_wood_rough_walnut" /decl/flooring/wood/rough/bamboo build_type = /obj/item/stack/tile/wood/rough/bamboo force_material = /decl/material/solid/organic/wood/bamboo + uid = "floor_wood_rough_bamboo" /decl/flooring/wood/rough/yew build_type = /obj/item/stack/tile/wood/rough/yew force_material = /decl/material/solid/organic/wood/yew + uid = "floor_wood_rough_yew" // Chipboard/wood laminate floors. Uses older icons. /decl/flooring/laminate @@ -106,23 +120,29 @@ "broken5", "broken6" ) + uid = "floor_wood_lami" /decl/flooring/laminate/mahogany build_type = /obj/item/stack/tile/wood/laminate/mahogany force_material = /decl/material/solid/organic/wood/chipboard/mahogany + uid = "floor_wood_lami_mahogany" /decl/flooring/laminate/maple build_type = /obj/item/stack/tile/wood/laminate/maple force_material = /decl/material/solid/organic/wood/chipboard/maple + uid = "floor_wood_lami_maple" /decl/flooring/laminate/ebony build_type = /obj/item/stack/tile/wood/laminate/ebony force_material = /decl/material/solid/organic/wood/chipboard/ebony + uid = "floor_wood_lami_ebony" /decl/flooring/laminate/walnut build_type = /obj/item/stack/tile/wood/laminate/walnut force_material = /decl/material/solid/organic/wood/chipboard/walnut + uid = "floor_wood_lami_walnut" /decl/flooring/laminate/yew build_type = /obj/item/stack/tile/wood/laminate/yew force_material = /decl/material/solid/organic/wood/chipboard/yew + uid = "floor_wood_lami_yew" diff --git a/mods/content/psionics/system/psionics/null/flooring.dm b/mods/content/psionics/system/psionics/null/flooring.dm index b65ad250dd3e..581466a484e1 100644 --- a/mods/content/psionics/system/psionics/null/flooring.dm +++ b/mods/content/psionics/system/psionics/null/flooring.dm @@ -12,6 +12,7 @@ flooring_flags = TURF_REMOVE_SCREWDRIVER build_type = /obj/item/stack/tile/floor_nullglass psi_null = TRUE + uid = "floor_tiled_nullglass" /obj/item/stack/tile/floor_nullglass name = "nullglass floor tile" diff --git a/mods/gamemodes/cult/flooring.dm b/mods/gamemodes/cult/flooring.dm index 7169311366c7..17952ec6373f 100644 --- a/mods/gamemodes/cult/flooring.dm +++ b/mods/gamemodes/cult/flooring.dm @@ -6,6 +6,7 @@ build_type = null turf_flags = TURF_ACID_IMMUNE | TURF_REMOVE_WRENCH can_paint = FALSE + uid = "floor_cult" /decl/flooring/reinforced/cult/on_flooring_remove(turf/removing_from) var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) diff --git a/mods/mobs/dionaea/mob/gestalt/gestalt_turfs.dm b/mods/mobs/dionaea/mob/gestalt/gestalt_turfs.dm index ea5c20e36ef0..04d498ef7613 100644 --- a/mods/mobs/dionaea/mob/gestalt/gestalt_turfs.dm +++ b/mods/mobs/dionaea/mob/gestalt/gestalt_turfs.dm @@ -4,6 +4,7 @@ icon = 'mods/mobs/dionaea/icons/turfs.dmi' icon_base = "floor" flooring_flags = TURF_ACID_IMMUNE | TURF_REMOVE_SHOVEL + uid = "floor_diona" /turf/floor/diona name = "biomass" diff --git a/mods/species/ascent/turfs/ship.dm b/mods/species/ascent/turfs/ship.dm index e62ba1cbab16..320a2d8c30e2 100644 --- a/mods/species/ascent/turfs/ship.dm +++ b/mods/species/ascent/turfs/ship.dm @@ -3,6 +3,7 @@ icon = 'icons/turf/flooring/alium.dmi' burned_states = null broken_states = null + uid = "floor_ascent_plating" /decl/flooring/tiling_ascent name = "floor" @@ -15,6 +16,7 @@ constructed = TRUE burned_states = null broken_states = null + uid = "floor_ascent_tiled" /turf/wall/ascent color = COLOR_PURPLE diff --git a/mods/species/skrell/turfs/flooring.dm b/mods/species/skrell/turfs/flooring.dm index 8ddfdf54d665..0ce56ba08591 100644 --- a/mods/species/skrell/turfs/flooring.dm +++ b/mods/species/skrell/turfs/flooring.dm @@ -28,18 +28,24 @@ /decl/flooring/reinforced/shuttle/skrell icon = 'mods/species/skrell/icons/turf/skrellturf.dmi' icon_base = "skrellblack" + uid = "floor_skrell" /decl/flooring/reinforced/shuttle/skrell/white icon_base = "skrellwhite" + uid = "floor_skrell_white" /decl/flooring/reinforced/shuttle/skrell/red icon_base = "skrellred" + uid = "floor_skrell_red" /decl/flooring/reinforced/shuttle/skrell/blue icon_base = "skrellblue" + uid = "floor_skrell_blue" /decl/flooring/reinforced/shuttle/skrell/orange icon_base = "skrellorange" + uid = "floor_skrell_orange" /decl/flooring/reinforced/shuttle/skrell/green icon_base = "skrellgreen" + uid = "floor_skrell_green" From 28b0caddd3b38595a125ce0efdf4391dc6c2c10a Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:03:57 +1100 Subject: [PATCH 46/93] Predators can now eat internal organs and cannot rip off unamputatable limbs. --- .../abilities/abilities_predator.dm | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/code/datums/extensions/abilities/abilities_predator.dm b/code/datums/extensions/abilities/abilities_predator.dm index 4fc37d4a8281..4c73a709cc7b 100644 --- a/code/datums/extensions/abilities/abilities_predator.dm +++ b/code/datums/extensions/abilities/abilities_predator.dm @@ -56,6 +56,11 @@ to_chat(user, SPAN_WARNING("\The [victim] is too big for you to dismember.")) return TRUE + var/obj/item/organ/external/limb = victim.get_organ(user.get_target_zone()) + if(!limb) + to_chat(user, SPAN_WARNING("\The [victim] is missing that limb!")) + return TRUE + to_chat(user, SPAN_NOTICE("You dig into \the [victim], hunting for something edible.")) if(!do_after(user, max(2 SECONDS, victim.get_object_size() * 5), victim) || QDELETED(victim) || !victim.butchery_data || victim.stat != DEAD) return TRUE @@ -66,13 +71,24 @@ victim.gib() return TRUE - var/obj/item/organ/external/limb = victim.get_organ(user.get_target_zone()) + limb = victim.get_organ(user.get_target_zone()) // In case we changed zone or such in the meantime. if(!limb) to_chat(user, SPAN_WARNING("\The [victim] is missing that limb!")) return TRUE - user.visible_message(SPAN_DANGER("\The [user] tears \the [limb] from \the [victim]!")) - limb.dismember(FALSE, DISMEMBER_METHOD_EDGE, silent = TRUE) - if(!QDELETED(limb)) - user.put_in_hands(limb) + if(length(limb.internal_organs)) + var/obj/item/organ/internal/stolen = pick(limb.internal_organs) + user.visible_message(SPAN_DANGER("\The [user] tears \the [stolen] out of \the [victim]'s [limb.name]!")) + victim.remove_organ(stolen, TRUE, TRUE) + if(!QDELETED(stolen)) + user.put_in_hands(stolen) + return TRUE + + if(!(limb.limb_flags & ORGAN_FLAG_CAN_AMPUTATE)) + to_chat(user, SPAN_WARNING("You gnaw on \the [victim]'s [limb.name], but can't pull it loose.")) + else + user.visible_message(SPAN_DANGER("\The [user] tears \the [limb] from \the [victim]!")) + limb.dismember(FALSE, DISMEMBER_METHOD_EDGE, silent = TRUE) + if(!QDELETED(limb)) + user.put_in_hands(limb) return TRUE From 3fbdb748d226f5648e3ffc5952f4782c737588f4 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:04:17 +1100 Subject: [PATCH 47/93] Ramps no longer get colour applied twice. --- code/game/turfs/walls/wall_natural_icon.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/turfs/walls/wall_natural_icon.dm b/code/game/turfs/walls/wall_natural_icon.dm index e0231caf658a..8aeffa788445 100644 --- a/code/game/turfs/walls/wall_natural_icon.dm +++ b/code/game/turfs/walls/wall_natural_icon.dm @@ -66,8 +66,6 @@ else if(has_right_neighbor) state = "ramp-blend-right" var/image/I = image(material_icon_base, state, dir = ramp_slope_direction) - I.color = base_color - I.appearance_flags |= RESET_COLOR add_overlay(I) if(shine) I = image(material_icon_base, "[state]-shine", dir = ramp_slope_direction) From 73beee653b649a3cc92db81953d540e42608100c Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:04:36 +1100 Subject: [PATCH 48/93] Fixes drake spit/abilities not working. --- mods/species/drakes/sifsap.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/species/drakes/sifsap.dm b/mods/species/drakes/sifsap.dm index 5334839e70fa..75f0315b71e9 100644 --- a/mods/species/drakes/sifsap.dm +++ b/mods/species/drakes/sifsap.dm @@ -2,7 +2,7 @@ var/obj/item/organ/internal/drake_gizzard/gizzard = user.get_organ(BP_DRAKE_GIZZARD) if(!gizzard?.sap_crop?.total_volume) return FALSE - if(LAZYACCESS(gizzard.sap_crop.reagent_volumes, /decl/material/liquid/sifsap) < amount) + if(!gizzard.sap_crop.has_reagent(/decl/material/liquid/sifsap, amount)) return FALSE gizzard.sap_crop.remove_reagent(/decl/material/liquid/sifsap, amount) return TRUE From 808130711b842d0562bb1b5253981da67cf4d8a3 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:05:38 +1100 Subject: [PATCH 49/93] A turf becoming open will cause everything on it to fall. --- code/game/turfs/turf_changing.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index ac2e306ea590..dedebcfc16aa 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -188,6 +188,11 @@ for(var/atom/movable/AM as anything in changed_turf) AM.update_turf_alpha_mask() + // Anything on our turf needs to fall down. + if(HasBelow(z) && changed_turf.is_open() && !old_is_open) + for(var/atom/movable/thing in changed_turf.get_contained_external_atoms()) + thing.fall() + /turf/proc/transport_properties_from(turf/other, transport_air) if(transport_air && can_inherit_air && (other.zone || other.air)) if(!air) From bdf17c83a8d53d191a9f181886ee6f4a8c026d5e Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:06:03 +1100 Subject: [PATCH 50/93] Barren ground will no longer drop soil. --- code/game/turfs/flooring/flooring_natural.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 63d3b2ec93c5..e83234890ed4 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -40,7 +40,7 @@ footstep_type = /decl/footsteps/asteroid turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH icon_edge_layer = FLOOR_EDGE_BARREN - force_material = /decl/material/solid/soil + force_material = /decl/material/solid/sand growth_value = 0.1 /decl/flooring/clay From f77d5cfa6fe11daa3795c39e0f79286ca6a27756 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:08:16 +1100 Subject: [PATCH 51/93] get_all_flooring() no longer duplicates flooring for lists. --- code/game/turfs/floors/floor_layers.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/turfs/floors/floor_layers.dm b/code/game/turfs/floors/floor_layers.dm index 5396b3607cf2..0b91d43f8af1 100644 --- a/code/game/turfs/floors/floor_layers.dm +++ b/code/game/turfs/floors/floor_layers.dm @@ -9,8 +9,7 @@ if(islist(_flooring)) for(var/floor in _flooring) . += RESOLVE_TO_DECL(floor) - _flooring = . // ensure the list elements are resolved - else + else if(ispath(_flooring)) . += RESOLVE_TO_DECL(_flooring) if(_base_flooring) . += get_base_flooring() From 3d1c30c53cd3dd5b7709352b39ae4e15fc5ee3f2 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:08:59 +1100 Subject: [PATCH 52/93] Drakes will default to clawing as their unarmed attack, instead of randomly kicking people. --- mods/species/drakes/species.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 78ace9a7326b..6b0398df1865 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -74,6 +74,10 @@ pain_emotes_with_pain_level = adult_pain_emotes_with_pain_level return ..() +/decl/species/grafadreka/handle_post_spawn(var/mob/living/human/H) + . = ..() + H.default_attack = GET_DECL(/decl/natural_attack/claws/strong/drake) + // Stub for muscle memory of the Sit verb on Polaris. /mob/living/human/proc/drake_sit() set name = "Sit" From 06f00cf78a3c073ec02dc48ab9887bc5babc8c69 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:09:54 +1100 Subject: [PATCH 53/93] Drake claws work as picks (too soft for stone) and not as hoes (why would drakes farm). --- mods/species/drakes/species_bodytypes.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index 5d8bf5862b68..9057ac1fe228 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -321,8 +321,8 @@ . = ..() item_flags |= ITEM_FLAG_NO_BLUDGEON set_extension(src, /datum/extension/tool, list( - TOOL_SHOVEL = TOOL_QUALITY_GOOD, - TOOL_HOE = TOOL_QUALITY_GOOD + TOOL_PICK = TOOL_QUALITY_MEDIOCRE, + TOOL_SHOVEL = TOOL_QUALITY_GOOD )) /obj/item/organ/external/hand/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) @@ -341,8 +341,8 @@ . = ..() item_flags |= ITEM_FLAG_NO_BLUDGEON set_extension(src, /datum/extension/tool, list( - TOOL_SHOVEL = TOOL_QUALITY_GOOD, - TOOL_HOE = TOOL_QUALITY_GOOD + TOOL_PICK = TOOL_QUALITY_MEDIOCRE, + TOOL_SHOVEL = TOOL_QUALITY_GOOD )) /obj/item/organ/external/hand/right/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) From 31dc87ba864bce60ea1e6067ddc1c5813fb523b7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 29 Oct 2025 16:16:52 -0400 Subject: [PATCH 54/93] Give new_player and observer mobs skillsets again --- code/modules/mob/new_player/new_player.dm | 1 + code/modules/mob/observer/observer.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2a460c53a435..77ef427f3e49 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -10,6 +10,7 @@ anchored = TRUE // don't get pushed around virtual_mob = null // Hear no evil, speak no evil is_spawnable_type = FALSE + skillset = /datum/skillset // moved here from /mob to avoid giving dview a skillset var/ready = 0 /// Referenced when you want to delete the new_player later on in the code. diff --git a/code/modules/mob/observer/observer.dm b/code/modules/mob/observer/observer.dm index e76f34229eb2..7311b0eb3f00 100644 --- a/code/modules/mob/observer/observer.dm +++ b/code/modules/mob/observer/observer.dm @@ -15,6 +15,7 @@ var/global/const/GHOST_IMAGE_ALL = ~GHOST_IMAGE_NONE stat = DEAD status_flags = GODMODE shift_to_open_context_menu = FALSE + skillset = /datum/skillset // moved here from /mob to avoid giving dview a skillset var/ghost_image_flag = GHOST_IMAGE_DARKNESS var/image/ghost_image = null //this mobs ghost image, for deleting and stuff From eedba7d0629e35912174a40c6541d83acd08dcb8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 29 Oct 2025 16:17:53 -0400 Subject: [PATCH 55/93] Remove unnecessary skill_link nulling --- code/modules/client/preference_setup/occupation/occupation.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index feb41bc98058..e8b60f09dab0 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -185,9 +185,6 @@ skill_link = "View Skills" skill_link = "[skill_link]" - if(!user.skillset?.skills_transferable) - skill_link = "" - // Begin assembling the actual HTML. index += 1 if((index >= limit) || (job.title in splitJobs)) From 2508c70829fc540c8142e1bebc6d3a1d4a66998c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 29 Oct 2025 16:14:46 -0400 Subject: [PATCH 56/93] Update BYOND and SpacemanDMM versions in CI --- .github/workflows/generate_documentation.yml | 2 +- .github/workflows/test.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index c3c4eced76b6..0f5480f5a2e3 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -7,7 +7,7 @@ on: workflow_dispatch: env: - SPACEMAN_DMM_VERSION: suite-1.9 + SPACEMAN_DMM_VERSION: suite-1.11 jobs: generate_documentation: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 66af11e7167b..c3dc37b34642 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,9 +14,9 @@ on: workflow_dispatch: env: - BYOND_MAJOR: "515" - BYOND_MINOR: "1647" - SPACEMAN_DMM_VERSION: suite-1.9 + BYOND_MAJOR: "516" + BYOND_MINOR: "1669" + SPACEMAN_DMM_VERSION: suite-1.11 jobs: DreamChecker: From dc2da95971e93319c3db4656cf7a47ce162f9195 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 29 Oct 2025 16:33:35 -0400 Subject: [PATCH 57/93] Update CI to use ubuntu-latest --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c3dc37b34642..4e7118fe154a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ env: jobs: DreamChecker: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Cache @@ -52,7 +52,7 @@ jobs: chmod +x send.sh ./send.sh failure $WEBHOOK_URL OpenDream: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Python setup @@ -69,7 +69,7 @@ jobs: - name: Run OpenDream run: ./DMCompiler_linux-x64/DMCompiler nebula.dme --define=UNIT_TEST --suppress-unimplemented --skip-anything-typecheck --version=${BYOND_MAJOR}.${BYOND_MINOR} | bash test/annotate_od.sh Code: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Cache @@ -95,7 +95,7 @@ jobs: chmod +x send.sh ./send.sh failure $WEBHOOK_URL Maps: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: matrix: map_path: [example, tradeship, exodus, ministation, shaded_hills, away_sites_testing, modpack_testing, planets_testing] From 8817d93efbd2400a46e8a4c5435c97e1c43a0a80 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Wed, 29 Oct 2025 17:10:24 +1100 Subject: [PATCH 58/93] Various changes to allow digging through a turf and carving a ramp from one level up as a human or drake. --- .../abilities/abilities_predator.dm | 9 +++- code/game/base_turf.dm | 6 +++ code/game/turfs/floors/floor_digging.dm | 23 ++++++---- code/game/turfs/floors/floor_layers.dm | 2 +- code/game/turfs/open/_open.dm | 43 ++++++++++++++++++- code/game/turfs/turf.dm | 33 ++++++++------ code/game/turfs/turf_digging.dm | 5 ++- code/game/turfs/walls/wall_natural.dm | 11 ++++- code/game/turfs/walls/wall_natural_ramps.dm | 27 ++++++++---- .../archetypes/tool_archetype_definitions.dm | 2 +- 10 files changed, 123 insertions(+), 38 deletions(-) diff --git a/code/datums/extensions/abilities/abilities_predator.dm b/code/datums/extensions/abilities/abilities_predator.dm index 4c73a709cc7b..379316b3de80 100644 --- a/code/datums/extensions/abilities/abilities_predator.dm +++ b/code/datums/extensions/abilities/abilities_predator.dm @@ -56,7 +56,8 @@ to_chat(user, SPAN_WARNING("\The [victim] is too big for you to dismember.")) return TRUE - var/obj/item/organ/external/limb = victim.get_organ(user.get_target_zone()) + var/target_zone = user.get_target_zone() + var/obj/item/organ/external/limb = victim.get_organ(target_zone) if(!limb) to_chat(user, SPAN_WARNING("\The [victim] is missing that limb!")) return TRUE @@ -65,13 +66,17 @@ if(!do_after(user, max(2 SECONDS, victim.get_object_size() * 5), victim) || QDELETED(victim) || !victim.butchery_data || victim.stat != DEAD) return TRUE + // Changing zone means we cancel. + if(target_zone != user.get_target_zone()) + return + var/list/external_organs = victim.get_external_organs() if(length(external_organs) <= 1) user.visible_message(SPAN_DANGER("\The [user] tears \the [victim] apart!")) victim.gib() return TRUE - limb = victim.get_organ(user.get_target_zone()) // In case we changed zone or such in the meantime. + limb = victim.get_organ(target_zone) // In case it was removed in the interim. if(!limb) to_chat(user, SPAN_WARNING("\The [victim] is missing that limb!")) return TRUE diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm index 0fa6f37889ec..22c582f53a8f 100644 --- a/code/game/base_turf.dm +++ b/code/game/base_turf.dm @@ -26,6 +26,12 @@ return A.base_turf return get_base_turf(T.z) +/proc/get_open_turf_type_by_area(var/turf/T) + if(!HasBelow(T.z)) + return + var/area/area = get_area(T) + return area?.open_turf || T.open_turf_type + // Returns the open turf of a Z-stack by finding the nearest non-open turf below. /proc/get_open_turf_type(var/turf/T) if(!HasBelow(T.z)) diff --git a/code/game/turfs/floors/floor_digging.dm b/code/game/turfs/floors/floor_digging.dm index 123458d009cd..24a4f9edb132 100644 --- a/code/game/turfs/floors/floor_digging.dm +++ b/code/game/turfs/floors/floor_digging.dm @@ -25,22 +25,27 @@ return FALSE return TRUE -/turf/floor/can_dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) - return can_be_dug(tool_hardness, using_tool) && get_physical_height() > -(FLUID_DEEP) - /turf/floor/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) - if(flooring_is_diggable()) - handle_trench_digging(user) + if(!flooring_is_diggable()) + return -/turf/floor/proc/handle_trench_digging(mob/user) var/decl/flooring/flooring = get_topmost_flooring() if(!flooring.handle_turf_digging(src)) return - // Only drop mats if we actually changed the turf height sufficiently. + var/old_height = get_physical_height() var/new_height = max(old_height-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) - var/height_diff = abs(old_height-new_height) - if(height_diff >= TRENCH_DEPTH_PER_ACTION) + var/height_diff = round(abs(old_height-new_height)) + if(new_height <= -(FLUID_DEEP)) + var/open_turf_path = get_open_turf_type_by_area(src) + if(!open_turf_path) + to_chat(user, SPAN_WARNING("You cannot dig any lower!")) + return + to_chat(user, SPAN_DANGER("You break through \the [src]!")) + drop_diggable_resources(user) + ChangeTurf(open_turf_path) + // Only drop mats if we actually changed the turf height sufficiently. + else if(height_diff >= TRENCH_DEPTH_PER_ACTION) drop_diggable_resources(user) set_physical_height(new_height) diff --git a/code/game/turfs/floors/floor_layers.dm b/code/game/turfs/floors/floor_layers.dm index 0b91d43f8af1..18cfa6f04fe9 100644 --- a/code/game/turfs/floors/floor_layers.dm +++ b/code/game/turfs/floors/floor_layers.dm @@ -9,7 +9,7 @@ if(islist(_flooring)) for(var/floor in _flooring) . += RESOLVE_TO_DECL(floor) - else if(ispath(_flooring)) + else if(!isnull(_flooring)) . += RESOLVE_TO_DECL(_flooring) if(_base_flooring) . += get_base_flooring() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 3836af3e8072..abbcfecc695a 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -101,4 +101,45 @@ T.drill_act() /turf/open/airless - initial_gas = null \ No newline at end of file + initial_gas = null + +/decl/interaction_handler/dig_ramp_from_above + name = "Dig Ramp From Above" + expected_target_type = /turf/open + examine_desc = "dig a ramp in the direction you are facing, one level down" + +/decl/interaction_handler/dig_ramp_from_above/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(.) + // TODO: check for blocking floors etc. + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. + if(!IS_PICK(prop) && !IS_SHOVEL(prop)) + return FALSE + var/turf/turf = get_turf(target) + if(!istype(turf) || !turf.is_open() || !HasBelow(turf.z)) + return FALSE + var/turf/wall/natural/wall = GetBelow(target) + if(!istype(wall)) + return FALSE + if(!user.Adjacent(target)) + return FALSE + return TRUE + +/decl/interaction_handler/dig_ramp_from_above/invoked(atom/target, mob/user, obj/item/prop) + var/turf/wall/natural/wall = GetBelow(target) + var/user_dir = get_dir(user, target) // opposite of regular wall carving as we are going downwards + if(!(user_dir in global.cardinal)) + to_chat(user, SPAN_WARNING("You must be standing at a cardinal angle to create a ramp.")) + return FALSE + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. + if(wall.material?.hardness > prop?.material?.hardness) + to_chat(user, SPAN_WARNING("Your [prop.name] is not hard enough to cut into \the [wall].")) + return FALSE + var/turf/wall/natural/support = get_step(wall, global.reverse_dir[user_dir]) + if(!istype(support) || support.ramp_slope_direction) + to_chat(user, SPAN_WARNING("You cannot cut a ramp into a wall with no additional walls behind it.")) + return FALSE + if(prop.do_tool_interaction((IS_PICK(prop) ? TOOL_PICK : TOOL_SHOVEL), user, wall, 3 SECONDS, suffix_message = ", forming it into a ramp") && !wall.ramp_slope_direction) + wall.make_ramp(user, user_dir) + return TRUE + return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a9a61db02d40..6a6df3ddcc8a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -250,10 +250,6 @@ T.try_build_turf(user, src) return TRUE - if(IS_HOE(used_item) && can_dig_farm(used_item.material?.hardness)) - try_dig_farm(user, used_item) - return TRUE - if(IS_SHOVEL(used_item)) // TODO: move these checks into the interaction handlers. @@ -274,6 +270,10 @@ to_chat(user, SPAN_WARNING("You cannot dig anything out of \the [src] with \the [used_item].")) return TRUE + if(IS_HOE(used_item) && can_dig_farm(used_item.material?.hardness)) + try_dig_farm(user, used_item) + return TRUE + var/decl/material/material = get_material() if(IS_PICK(used_item) && material) @@ -856,21 +856,28 @@ var/obj/item/held = user ? (user.get_active_held_item() || user.get_usable_hand_slot_organ()) : null if(!istype(held)) return - if(IS_SHOVEL(held)) - if(can_dig_pit(held.material?.hardness)) - LAZYADD(., /decl/interaction_handler/dig/pit) - if(can_dig_trench(held.material?.hardness)) + if(is_open()) + if(HasBelow(z)) + LAZYADD(., /decl/interaction_handler/dig_ramp_from_above) + else + if(IS_SHOVEL(held)) + if(can_dig_pit(held.material?.hardness)) + LAZYADD(., /decl/interaction_handler/dig/pit) + if(can_dig_trench(held.material?.hardness)) + LAZYADD(., /decl/interaction_handler/dig/trench) + if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) LAZYADD(., /decl/interaction_handler/dig/trench) - if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) - LAZYADD(., /decl/interaction_handler/dig/trench) - if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) - LAZYADD(., /decl/interaction_handler/dig/farm) + if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) + LAZYADD(., /decl/interaction_handler/dig/farm) /// Contaminant may be the chemical decl of the footprint being provided, /// or null if we just want to know if we support footprints, at all, ever. /turf/proc/can_show_coating_footprints(decl/material/contaminant) return simulated +/turf/proc/is_purged() + return + /decl/interaction_handler/show_turf_contents name = "Show Turf Contents" expected_user_type = /mob @@ -929,5 +936,3 @@ /turf/take_vaporized_reagent(reagent, amount) return assume_gas(reagent, round(amount / REAGENT_UNITS_PER_GAS_MOLE)) - -/turf/proc/is_purged() \ No newline at end of file diff --git a/code/game/turfs/turf_digging.dm b/code/game/turfs/turf_digging.dm index 5f832ae8045c..d9944cc1c814 100644 --- a/code/game/turfs/turf_digging.dm +++ b/code/game/turfs/turf_digging.dm @@ -35,6 +35,9 @@ to_chat(user, SPAN_NOTICE("You unearth \a [thing]!")) LAZYADD(., loot) + for(var/obj/item/stack/stack in .) + stack.add_to_stacks() + clear_diggable_resources() // Procs for digging pits. @@ -66,7 +69,7 @@ // Proc for digging trenches. /turf/proc/can_dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) - return can_be_dug(tool_hardness, using_tool) && get_physical_height() > -(FLUID_DEEP) + return can_be_dug(tool_hardness, using_tool) && (HasBelow(z) || get_physical_height() > -(FLUID_DEEP)) /turf/proc/try_dig_trench(mob/user, obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 2.5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index 095e8f7ed26e..c85396e05f5f 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -50,9 +50,18 @@ update_neighboring_ramps(destroying_self = TRUE) . = ..() +/turf/wall/natural/attack_hand(mob/user) + + // Allow species with digging limbs to dig (drakes) + var/obj/item/prop = user.get_usable_hand_slot_organ() + if(istype(prop)) + return attackby(prop, user) + + . = ..() + /turf/wall/natural/attackby(obj/item/used_item, mob/user, click_params) - if(user.check_dexterity(DEXTERITY_COMPLEX_TOOLS) && !ramp_slope_direction) + if(!ramp_slope_direction && user.check_dexterity(DEXTERITY_COMPLEX_TOOLS, silent = TRUE)) if(istype(used_item, /obj/item/depth_scanner)) var/obj/item/depth_scanner/C = used_item diff --git a/code/game/turfs/walls/wall_natural_ramps.dm b/code/game/turfs/walls/wall_natural_ramps.dm index 760c4a01f0d5..3cb6ea73728a 100644 --- a/code/game/turfs/walls/wall_natural_ramps.dm +++ b/code/game/turfs/walls/wall_natural_ramps.dm @@ -4,6 +4,9 @@ var/old_ao = permit_ao if(ramp_slope_direction) + + user?.visible_message(SPAN_NOTICE("\The [user] digs out \the [src], forming a ramp.")) + drop_ore() permit_ao = FALSE blocks_air = FALSE @@ -23,6 +26,9 @@ update_neighboring_ramps() else + + user?.visible_message(SPAN_NOTICE("\The [user] clears out \the [src].")) + permit_ao = initial(permit_ao) blocks_air = initial(blocks_air) density = initial(density) @@ -49,17 +55,18 @@ /turf/wall/natural/get_alt_interactions(mob/user) . = ..() - LAZYADD(., /decl/interaction_handler/drill_ramp) + LAZYADD(., /decl/interaction_handler/dig_ramp) -/decl/interaction_handler/drill_ramp - name = "Drill Ramp" +/decl/interaction_handler/dig_ramp + name = "Dig Ramp" expected_target_type = /turf/wall/natural - examine_desc = "drill a ramp in the direction you are facing" + examine_desc = "dig a ramp in the direction you are facing" -/decl/interaction_handler/drill_ramp/is_possible(atom/target, mob/user, obj/item/prop) +/decl/interaction_handler/dig_ramp/is_possible(atom/target, mob/user, obj/item/prop) . = ..() if(.) - if(!IS_PICK(prop)) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. + if(!IS_PICK(prop) && !IS_SHOVEL(prop)) return FALSE var/turf/wall/natural/wall = target if(!HasAbove(wall.z)) @@ -68,17 +75,21 @@ return FALSE return TRUE -/decl/interaction_handler/drill_ramp/invoked(atom/target, mob/user, obj/item/prop) +/decl/interaction_handler/dig_ramp/invoked(atom/target, mob/user, obj/item/prop) var/turf/wall/natural/wall = target var/user_dir = get_dir(wall, user) if(!(user_dir in global.cardinal)) to_chat(user, SPAN_WARNING("You must be standing at a cardinal angle to create a ramp.")) return FALSE + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. + if(wall.material?.hardness > prop?.material?.hardness) + to_chat(user, SPAN_WARNING("Your [prop.name] is not hard enough to cut into \the [wall].")) + return FALSE var/turf/wall/natural/support = get_step(wall, global.reverse_dir[user_dir]) if(!istype(support) || support.ramp_slope_direction) to_chat(user, SPAN_WARNING("You cannot cut a ramp into a wall with no additional walls behind it.")) return FALSE - if(prop.do_tool_interaction(TOOL_PICK, user, wall, 3 SECONDS, suffix_message = ", forming it into a ramp") && !wall.ramp_slope_direction) + if(prop.do_tool_interaction((IS_PICK(prop) ? TOOL_PICK : TOOL_SHOVEL), user, wall, 3 SECONDS, suffix_message = ", forming it into a ramp") && !wall.ramp_slope_direction) wall.make_ramp(user, user_dir) return TRUE return FALSE diff --git a/code/modules/tools/archetypes/tool_archetype_definitions.dm b/code/modules/tools/archetypes/tool_archetype_definitions.dm index 2b2b2f14f4d6..bf8e02c84f86 100644 --- a/code/modules/tools/archetypes/tool_archetype_definitions.dm +++ b/code/modules/tools/archetypes/tool_archetype_definitions.dm @@ -37,7 +37,7 @@ /decl/tool_archetype/shovel name = "shovel" tool_sound = 'sound/items/shovel_dirt.ogg' - tool_message = "digging" + tool_message = "digging into" /decl/tool_archetype/pick name = "pick" From 36b4be55135c26e6bbec5b0885592f13f8343824 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 30 Oct 2025 11:11:37 -0400 Subject: [PATCH 59/93] Downgrade CI BYOND version to 1663 to avoid libcurl4 requirement --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4e7118fe154a..5c6c414a8e26 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ on: env: BYOND_MAJOR: "516" - BYOND_MINOR: "1669" + BYOND_MINOR: "1663" SPACEMAN_DMM_VERSION: suite-1.11 jobs: From 3119596246770e74d372c3eb0c5af4b0febb6410 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 31 Oct 2025 00:56:52 +0000 Subject: [PATCH 60/93] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 94d93182b2f7..561c88760f9c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,12 +57,6 @@

MistakeNot4892 updated:

  • Crafted barrels will need barrel rims forged if the forging modpack is in use.
- -

29 August 2025

-

Elizabeth updated:

-
    -
  • added some variant sprites for cobblestone and running bond paths
  • -
From c9f08ec258a445a2ff9d504dbb831acc8ade051c Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 21:54:11 +1100 Subject: [PATCH 61/93] Adding a couple of decl-related helpers. --- code/__globals.dm | 3 ++- code/datums/repositories/decls.dm | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/__globals.dm b/code/__globals.dm index ecb9b3eb1fc1..a328e0649715 100644 --- a/code/__globals.dm +++ b/code/__globals.dm @@ -1,7 +1,8 @@ // Defined here due to being used immediately below. #define GET_DECL(D) (ispath(D, /decl) ? (decls_repository.fetched_decls[D] || decls_repository.get_decl(D)) : null) #define IMPLIED_DECL GET_DECL(__IMPLIED_TYPE__) -#define RESOLVE_TO_DECL(D) (istype(D, /decl) ? D : GET_DECL(D)) +#define RESOLVE_TO_DECL(D) (istype(D, /decl) ? D : (istext(D) ? decls_repository.get_decl_by_id(D, validate_decl_type = FALSE) : GET_DECL(D))) +#define DECLS_ARE_EQUIVALENT(F, S) ((RESOLVE_TO_DECL(F) == RESOLVE_TO_DECL(S))) // Defined here due to compile order; overrides in macros make the compiler complain. /decl/global_vars diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index 28dea46d5cd1..82476aae8e53 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -20,6 +20,12 @@ var/global/repository/decls/decls_repository = new +/proc/resolve_decl_uid_list(list/decl_uids) + for(var/uid in decl_uids) + var/decl/decl = decls_repository.get_decl_by_id(uid) + if(istype(decl)) + LAZYADD(., decl) + /repository/decls var/list/fetched_decls = list() var/list/fetched_decl_ids = list() From 6040b07b6355a19e5fda169aeff25b3066b4ede1 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 21:59:34 +1100 Subject: [PATCH 62/93] Flooring lists are now handled as JSON text. --- code/game/turfs/floors/_floor.dm | 6 +++++- code/game/turfs/floors/subtypes/floor_natural.dm | 11 ++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 22123008d757..d12e92b393cb 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -34,6 +34,11 @@ set_turf_materials(floor_material, skip_update = TRUE) + if(istext(_flooring)) + _flooring = resolve_decl_uid_list(cached_json_decode(_flooring)) + if(!length(_flooring)) + _flooring = null + if(!floortype && (ispath(_flooring) || islist(_flooring))) floortype = _flooring else @@ -49,7 +54,6 @@ if(ml) // We skipped the update above to avoid updating our neighbors, but we need to update ourselves. lazy_update_icon() - /turf/floor/ChangeTurf(turf/N, tell_universe, force_lighting_update, keep_air, update_open_turfs_above, keep_height) if(is_processing) STOP_PROCESSING(SSobj, src) diff --git a/code/game/turfs/floors/subtypes/floor_natural.dm b/code/game/turfs/floors/subtypes/floor_natural.dm index f265dea98b1f..ae7350535805 100644 --- a/code/game/turfs/floors/subtypes/floor_natural.dm +++ b/code/game/turfs/floors/subtypes/floor_natural.dm @@ -41,20 +41,13 @@ name = "snow" icon = 'icons/turf/flooring/snow.dmi' icon_state = "snow0" - _flooring = list( - /decl/flooring/grass, - /decl/flooring/snow - ) + _flooring = @'["' + /decl/flooring/grass::uid + @'","' + /decl/flooring/snow::uid + @'"]' /turf/floor/grass/wild name = "wild grass" icon = 'icons/turf/flooring/wildgrass.dmi' icon_state = "wildgrass" - _flooring = list( - /decl/flooring/grass, - /decl/flooring/grass/wild - ) - _base_flooring = /decl/flooring/dirt + _flooring = @'["' + /decl/flooring/grass::uid + @'","' + /decl/flooring/grass/wild::uid + @'"]' /turf/floor/ice name = "ice" From 24d01b7f50db764c889349d6001a9ad8b2fc4823 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 1 Nov 2025 12:35:44 +1100 Subject: [PATCH 63/93] Automatic changelog generation for PR #5185 [ci skip] --- html/changelogs/AutoChangeLog-pr-5185.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5185.yml diff --git a/html/changelogs/AutoChangeLog-pr-5185.yml b/html/changelogs/AutoChangeLog-pr-5185.yml new file mode 100644 index 000000000000..88680675a9e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5185.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: 'Drakes can no longer farm, but they can mine (in dirt).'} +delete-after: true From e39ec59d21ec7f9991e3eab97efb950eca9219ca Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Thu, 30 Oct 2025 11:23:38 +1100 Subject: [PATCH 64/93] Unified brick/log/stone/natural walls with a consistent ramp/style. --- icons/turf/walls/brick.dmi | Bin 2651 -> 2046 bytes icons/turf/walls/log.dmi | Bin 2681 -> 1851 bytes icons/turf/walls/stone.dmi | Bin 2943 -> 2766 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/turf/walls/brick.dmi b/icons/turf/walls/brick.dmi index c01691514259e70c2e912f684bccef2aff39d1b6..530e4e03027138e61291f4bb623451c1f8e42e41 100644 GIT binary patch delta 1850 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 B*O34K diff --git a/icons/turf/walls/log.dmi b/icons/turf/walls/log.dmi index d54b0750e288b8d0f57e3f9e5c3621b294e9d4dd..d4e2c05916568fca12ba4b7c152dbbf1d771a022 100644 GIT binary patch delta 1823 zcmZ8ic~H}L7XK!{92kR%AVUB#;ZP94M2ZJz!XZMrVgeGYMULgL2pc)9MfCUM5G(@~ zShPSu0;N_!kdz8p!x4~61nU9fK#CERS`edhCP3J9XJ@v%GjHbedGkK+&3p6t<0-dE zwuFDn_CKOcFeCr~w7tDNH~^qD6a_Gl1{zM@4bp%)+c)sA2EC7*+}PMiO)XU_m1Sjh zIXO4@{QTwR<;d`JU7ZgW78YuF#FRg~lQ{ldz?yy$rAdA&IBST;$qVwf!!456l2;pv z_7&qkqlt-gZ{yq-=DRH#zQ)#Er52vJUTgm5HY{E^5pMfnZ^W^`RpY3WDXf_tgAW^; zCNi_CGON<7vcgF{s2sCxi3tbf{ayU{utTj38NxW3!H`{Moa~RYdzQ#m1-y|h<*ogu zk0I5cS5Eyr4FFEZ+ru>wK3_IhCW;^TB4@1=x;ky2);h>*S)#OIlLR24wU~6j5ADN@ z7>6Ehd>D8-gJoA#T9kirK=5O+r{sQ#EWfB+fR!<}e|q+gDRJxwuP8Up^L7-E{&RUK z>dxLKbEP1Mxf=F5aYjtHnKO|;NlB@y}429MM{A-ybik=7q#39@Mk#|A4BO-U$+5pqr zS+;yZeFr>kU;k--#UV^e=X9do-pdWUWWGVj^4G;zK)PnWj&N(-ySmB`(lje=~R_AzM3GQ_Y-}6#B)c5 zC~HWRY#IvebZ)iozD3)R45*ihye9ls^IR(!Y`V=+9Im+=6+K&&+gB?c-b_Z-qk^-h zPt3(ii&YukZL@uljeBvs&EQ^lXgt-ZIJO1&G^=bRT z$?PRG@1ZNk4tUXuzKY$$%iWVgU~la*MQgT3FdSW-usF`F4ci6m>dMfHL7tv@Doy7~ zuJw}1_N1#*c= zG4jGX)Ud_t;wJ~v=P$gj*f0WFOdxXHjvURpY44=!Q{a$SB-WWDI7;N(E!CCory=PF zJgqsF@Rpc#nzrYVVL$&)u~`=-MXaJrHuv6%foaXFTYx8Siwnyb*H1D1#W?<(>$knN zDLu_S7kPCUc#?ofd^4m~z?PMgMj;uJQ5SGfhEa;G~Fr>Hhvex8- zHes)WS+iEyP7(E@=xH_2gF6=SV$*kPDL3G)Ofi$D(7vojD6ARMLcYe{ zOUbaX$r+wdv*-r-E6_U7T1#^Q9%`wVY4>_sh==7zyyt+l(U7c!%&wWdC*=laiJ6Q- zt?Ut`pGw&ciJ6amaON6$5MPxH7V(}se~Nax4O3V4KSzDbWN`H4YAG)WQ9)*K5K2=s zcau@c=rs!W?*-1eagMk2ui$ZvF*dT{C@oZLYhl^oFM)6&K3ovS0P(sG6eO9uYc71E8u literal 2681 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 Date: Thu, 30 Oct 2025 11:23:51 +1100 Subject: [PATCH 65/93] Implemented chisels and wall smoothing. --- code/__defines/tools.dm | 3 +- code/game/objects/items/chisel.dm | 7 ++- code/game/objects/items/tools/screwdriver.dm | 5 +- code/game/turfs/turf.dm | 2 +- code/game/turfs/walls/wall_engraving.dm | 16 ++++++ code/game/turfs/walls/wall_natural.dm | 46 ++++++++++++++++-- code/game/turfs/walls/wall_natural_icon.dm | 21 ++++++++ code/game/turfs/walls/wall_natural_ramps.dm | 1 + code/modules/gemstones/_gemstone.dm | 2 +- .../archetypes/tool_archetype_definitions.dm | 5 ++ icons/turf/walls/log.dmi | Bin 1851 -> 2097 bytes icons/turf/walls/stone.dmi | Bin 2766 -> 2807 bytes mods/content/fantasy/_fantasy.dm | 16 +++++- mods/content/fantasy/_fantasy.dme | 4 +- mods/content/fantasy/datum/skills.dm | 9 ---- mods/~compatibility/patches/drakes.dm | 2 +- mods/~compatibility/~compatibility.dm | 2 +- nebula.dme | 1 + 18 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 code/game/turfs/walls/wall_engraving.dm diff --git a/code/__defines/tools.dm b/code/__defines/tools.dm index 05931f41a2f4..4b0065e96b71 100644 --- a/code/__defines/tools.dm +++ b/code/__defines/tools.dm @@ -17,6 +17,7 @@ #define TOOL_PEN /decl/tool_archetype/pen #define TOOL_STAMP /decl/tool_archetype/stamp #define TOOL_SHEARS /decl/tool_archetype/shears +#define TOOL_CHISEL /decl/tool_archetype/chisel // Surgical tools. #define TOOL_SCALPEL /decl/tool_archetype/scalpel @@ -63,7 +64,7 @@ #define IS_HAMMER(A) IS_TOOL(A, TOOL_HAMMER) #define IS_HOE(A) IS_TOOL(A, TOOL_HOE) #define IS_SHEARS(A) IS_TOOL(A, TOOL_SHEARS) - +#define IS_CHISEL(A) IS_TOOL(A, TOOL_CHISEL) #define IS_HEMOSTAT(A) IS_TOOL(A, TOOL_HEMOSTAT) #define IS_RETRACTOR(A) IS_TOOL(A, TOOL_RETRACTOR) diff --git a/code/game/objects/items/chisel.dm b/code/game/objects/items/chisel.dm index 8bdcf2ab1a40..fb32a9888d3b 100644 --- a/code/game/objects/items/chisel.dm +++ b/code/game/objects/items/chisel.dm @@ -1,4 +1,3 @@ -// Stub for forging. TODO implement TOOL_CHISEL. /obj/item/tool/chisel name = "chisel" desc = "A hard, sharpened tool used to chisel stone, wood or bone." @@ -8,5 +7,11 @@ handle_material = /decl/material/solid/organic/plastic binding_material = null +/obj/item/tool/chisel/get_initial_tool_qualities() + var/static/list/tool_qualities = list( + TOOL_CHISEL = TOOL_QUALITY_DEFAULT + ) + return tool_qualities + /obj/item/tool/chisel/forged handle_material = null diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index ce927361ee62..9ec972e56958 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -20,7 +20,10 @@ if(prob(75)) pixel_y = rand(0, 16) . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_SCREWDRIVER = TOOL_QUALITY_DEFAULT)) + set_extension(src, /datum/extension/tool, list( + TOOL_SCREWDRIVER = TOOL_QUALITY_DEFAULT, + TOOL_CHISEL = TOOL_QUALITY_BAD + )) /obj/item/screwdriver/on_update_icon() . = ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6a6df3ddcc8a..7385ceef2fe1 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -882,7 +882,7 @@ name = "Show Turf Contents" expected_user_type = /mob interaction_flags = 0 - examine_desc = "list everything on $TARGET_THEM$" + examine_desc = "list everything on the turf" /decl/interaction_handler/show_turf_contents/invoked(atom/target, mob/user, obj/item/prop) target.show_atom_list_for_turf(user, get_turf(target)) diff --git a/code/game/turfs/walls/wall_engraving.dm b/code/game/turfs/walls/wall_engraving.dm new file mode 100644 index 000000000000..ee730aa2a220 --- /dev/null +++ b/code/game/turfs/walls/wall_engraving.dm @@ -0,0 +1,16 @@ +/datum/engraving + var/name = "nondescript design" + var/desc + var/icon + var/icon_state + var/dir + +/datum/engraving/New(var/decl/banner_symbol/engraving_symbol) + if(engraving_symbol) + icon = engraving_symbol.icon + icon_state = engraving_symbol.icon_state + name = engraving_symbol.name + +/datum/engraving/random/New() + var/banner_decls = decls_repository.get_decls_of_subtype_unassociated(/decl/banner_symbol) + ..(pick(banner_decls)) diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index c85396e05f5f..4710e89e5626 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -1,3 +1,5 @@ +var/global/_wall_chisel_skill = SKILL_CONSTRUCTION + /turf/wall/natural icon_state = "natural" desc = "A rough natural wall." @@ -11,6 +13,8 @@ var/static/list/exterior_wall_shine_cache = list() var/being_mined = FALSE var/gem_dropped = FALSE + var/smoothed + var/list/engravings /turf/wall/natural/flooded flooded = /decl/material/liquid/water @@ -20,7 +24,7 @@ return SPAN_NOTICE("It has been noticeably discoloured by the elements.") /turf/wall/natural/get_wall_icon() - return 'icons/turf/walls/natural.dmi' + return (smoothed && !ramp_slope_direction) ? 'icons/turf/walls/stone.dmi' : 'icons/turf/walls/natural.dmi' /turf/wall/natural/Initialize(var/ml, var/materialtype, var/rmaterialtype) . = ..() @@ -50,6 +54,11 @@ update_neighboring_ramps(destroying_self = TRUE) . = ..() +/turf/wall/natural/proc/get_engraving_for_dir(facing_dir) + for(var/datum/engraving/engraving in engravings) + if(engraving.dir == facing_dir) + return engraving + /turf/wall/natural/attack_hand(mob/user) // Allow species with digging limbs to dig (drakes) @@ -102,12 +111,39 @@ return FALSE /turf/wall/natural/update_strings() + var/modifier + if(length(engravings)) + modifier = "engraved" + else if(smoothed) + if(reinf_material) + modifier = "polished" + else + modifier = "smooth" + else if(!reinf_material) + modifier = "natural" + if(reinf_material) - SetName("[reinf_material.ore_name] deposit") - desc = "A natural cliff face composed of bare [material.solid_name] and a deposit of [reinf_material.ore_name]." + if(modifier) + SetName("[modifier] [reinf_material.ore_name] deposit") + else + SetName("[reinf_material.ore_name] deposit") + desc = "A natural wall composed of bare [material.solid_name] and a deposit of [reinf_material.ore_name]." else - SetName("natural [material.solid_name] wall") - desc = "A natural cliff face composed of bare [material.solid_name]." + SetName("[modifier] [material.solid_name] wall") + desc = "A natural wall composed of bare [material.solid_name]." + +/turf/wall/natural/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + if(length(engravings)) + for(var/datum/engraving/engraving in engravings) + var/engraving_line + if(engraving.name) + engraving_line = "It has been engraved with \a [engraving.name]." + else + engraving_line = "It has been engraved." + if(engraving.desc) + engraving_line = "[engraving_line] [engraving.desc]" + . += engraving_line /turf/wall/natural/update_material(var/update_neighbors) if(reinf_material?.ore_icon_overlay) diff --git a/code/game/turfs/walls/wall_natural_icon.dm b/code/game/turfs/walls/wall_natural_icon.dm index 8aeffa788445..715297e7339b 100644 --- a/code/game/turfs/walls/wall_natural_icon.dm +++ b/code/game/turfs/walls/wall_natural_icon.dm @@ -92,3 +92,24 @@ add_overlay(excav_overlay) if(archaeo_overlay) add_overlay(archaeo_overlay) + + // Might be worth having a dedicated wall engraving icon set in the future instead of using the banner/sign symbols. + // That would let us avoid this offsetting stuff and make the icons look less wonky on foreshortened faces. + for(var/datum/engraving/engraving in engravings) + // Not aware of a nice way to handle this. Would like to use BLEND_INSET_OVERLAY but we need BLEND_MULTIPLY. + if(engraving.dir == NORTH || !engraving.icon || !engraving.icon_state) + continue + + var/y_offset = 9 + var/x_offset = 0 + if(engraving.dir == SOUTH) + y_offset = 0 + else if(engraving.dir == EAST) + x_offset = -1 + else if(engraving.dir == WEST) + x_offset = 1 + + var/image/eng = image(icon = engraving.icon, icon_state = engraving.icon_state, dir = engraving.dir, pixel_x = x_offset, pixel_y = y_offset) + eng.blend_mode = BLEND_MULTIPLY + add_overlay(eng) + diff --git a/code/game/turfs/walls/wall_natural_ramps.dm b/code/game/turfs/walls/wall_natural_ramps.dm index 3cb6ea73728a..3ec738ff1221 100644 --- a/code/game/turfs/walls/wall_natural_ramps.dm +++ b/code/game/turfs/walls/wall_natural_ramps.dm @@ -1,6 +1,7 @@ /turf/wall/natural/proc/make_ramp(var/mob/user, var/new_slope, var/skip_icon_update = FALSE) ramp_slope_direction = new_slope + QDEL_NULL_LIST(engravings) var/old_ao = permit_ao if(ramp_slope_direction) diff --git a/code/modules/gemstones/_gemstone.dm b/code/modules/gemstones/_gemstone.dm index b95cb57181d3..02d698d4a130 100644 --- a/code/modules/gemstones/_gemstone.dm +++ b/code/modules/gemstones/_gemstone.dm @@ -38,7 +38,7 @@ var/global/list/_available_gemstone_cuts . = ..() * cut.worth_multiplier /obj/item/gemstone/attackby(obj/item/used_item, mob/user) - if(IS_HAMMER(used_item) && !user.check_intent(I_FLAG_HARM)) // TOOL_CHISEL when? + if(IS_CHISEL(used_item) && !user.check_intent(I_FLAG_HARM)) if(!cut.can_attempt_cut) to_chat(user, SPAN_WARNING("\The [src] has already been cut.")) return TRUE diff --git a/code/modules/tools/archetypes/tool_archetype_definitions.dm b/code/modules/tools/archetypes/tool_archetype_definitions.dm index bf8e02c84f86..61dfd1f5d668 100644 --- a/code/modules/tools/archetypes/tool_archetype_definitions.dm +++ b/code/modules/tools/archetypes/tool_archetype_definitions.dm @@ -63,6 +63,11 @@ tool_sound = 'sound/weapons/bladeslice.ogg' tool_message = "shearing" +/decl/tool_archetype/chisel + name = "chisel" + tool_sound = 'sound/items/shovel_dirt.ogg' + tool_message = "chiseling" + /decl/tool_archetype/knife name = "knife" tool_sound = 'sound/weapons/bladeslice.ogg' diff --git a/icons/turf/walls/log.dmi b/icons/turf/walls/log.dmi index d4e2c05916568fca12ba4b7c152dbbf1d771a022..f7f3e773a79b583c3ff47fc733988a3de0ccde2d 100644 GIT binary patch delta 2033 zcmZuyX*ApE8jm1JTasu^sVzxWuR3k1y*gx(T4zWs)m2bIV{9$jtK=_)SnfrwV^6w` zpfqVQstsDLlxnFMjBRvCiCRVm71G{J&-BAR_kMVP=eIrQJm>lHw!wKwOeV?0S$(I@ zP7nyB?&?DH0)dp!iU(3rRyfm2&1p9H*+)z(mFwp9TE=p3H#%7G!93)o z6Kw_40KL7``S^p~!uMguZpJ3YG~;!W9^001>>r`ZIs4U0G}5K8Xa8nSlb%K&3A8OW z8(*|8n{PcN|LJn%meZtkSA6f!;UlyA@E{Nr;z|VYKG!N1E8awnS!;H0nW{MI{V5qt zu7ubq#W(aTJyO>XC$?a?sHkF9;jlX zpBw@##K}J`1|5r}9R6T;UM*1NY%v@ccQ09dOqZpg=9r_8tic!2Xw(grnnoa{hY$-LD0k|B&w=|;L(6^x{F{uj zN5>ioQVDod2xG`-)npy6%Rp5)`gaF_Itk$D5e66%;2Zg=!6f0E%Ep#H)AAwOxIibR zry7G})7L8~=ah!VLdG1PYUD>0w?w#u@7ahobcRcM*B|lA_;C;VmZdRmukO6M;_9)l z*%+6^(<~Y?sav?KksCBV8AlL$xMU|9B5T^u+FQ0s%JevAZW&x(?MIpu*Z}?L+JUp6 zwcWJN!X}zv{a&nM6-rj9Ri=Bk@7)6rkK(2YZoHBUc(Gxfnn-J+sf>8mF<~^@R9}>b zoPd&(*JA>D4Mcu}?cN1p9L|L%i?HYZj^abgYj-|e1!wzpH$RCo(%#YZ!l&-x2rKW9 z?r=$(sKCXuG{65A^PTVafSc3OO~~3EWWw%wjkmjZN4Jv?*M5^TZW~R`l`L!mw0OWv z-~U4`wBS^|)k8AQ#z|e?BA{z=U2iiAncsOEQtSK;j@VN(YVb)zB~`>-Xd@2cN8&^# zAw_);7~^f-V2UVkQML*?r)}NgvHUNu_yfp;k{G!^$P-b`g;M~my>?Sj9cPycO!TG@ z%%@1hYaNsJ5-k7pSi{j^_Q!G-+>_!z{`wZTsb&8tx`)UcUa0En_Sa_%WG%*mtSkws zU09gTuG!VvGRnH|3z0<0Mh0|#)vwZPiLw^Q!-5s}oEnbg^>v>bZP^ylk=nekFaq(~ z0`LL4E{jk`1iA^uj8NXQBW9bux!p5B&YpuFAMN68vjfkeb5EdyHu0~mV-915&kpAN z4qe0PmS|+nKwGoz@=-I9x1Cp0$DNH8bbFqp=!B1UucTI#Bq^w)C}tZSO78x<5Ub7U z`$H#d7J9sqf0~{rbpSMb5tsMIDVk?QJVlfJm+PUgF#V|t{oZ%)SL!8l-o%T+@yWsr zhD?^T_WE7b5aq=y+^G%AAG&Z!W94C=`-^tWy)Z$IK@_shZYh4G3{mXgnXSYb!voc+8ILDpX~Y8a5?aw@ncJlGJNUd@V5O>XYZluqGo1IB4#X@kym<~w~N;3~tLKa`tuIsAI=wz*}Vs5+HvdXd$;dZPz`FG4T9ab706u#Ac* zto793cJ)rgxpZFwSal=SY^r-hOF3l=|4X}_##zyQ!}jcpD*#h0mL) zK1md8nC!R=TH#y$=Jlsa)W*>$CCi2{QwakyXRYs6mV(hH+8H|`H&Ylj0slq))r9LI zx_U4Rt@_X2M^xtW7D3ESe6xcF#PaqDIi_I%!C%WXV`Jo^yFbKz3m^~rQ^*CIlIx+N zjk=!CdO8th4a;q&A17y1w?t~h=NpKbD6}eY^;jN-CD>H!!u<~@G4eO@59FB&@Rp{A z{3M3~-TOKz0BHHf%@2PNKA>0n`{Sj4o*bHlYCV)=j+geSDQ4idMR>w^v RtQ5aE$n~TLv4Ief@*mG$&QbsX delta 1785 zcmZ8ic~Fyg8vZ38Ngx~vP=)|P!l597M2ZJz!cl}G5)+PCEOIPYku-9&7SZqHwhUBY z(FFn}P-^8Sr9x^rB65jfkwY9vF@jPHA|iKyu#p~h$0IHrIZcG4B`w|5dpnYn%aL+H_kgoqzk}o^KEj&IfE}EMV{Ury0E2SAD z0<}~s5i8BVegJM2y%N3Li?=PG@|uW`Uwjkmy1LSB+VC}|`X;#`@OF*K>pEDt8W?K* z=xCV#->R_WnI!tW!QkVD=IQjz%JjKwHly(@na^vmODeAff(ks3Q` z4PB5jW*7%Vlvcy;cfoxM~7t z4=Ygy>8G(g?PNa7;d3o#`rDo$2kRcykSD}P&Q%pY{g9A8LooM=)8$(XaBroLFZG1! zAa+@{PdxL>>=CJ*dIN0LLAU1e>O0{%+xibH<9CwVJKEP~rks0xjv-NGD>mr4Bk?6% z$6nIv@$<_EwTUG0p>d-~?*}!K?ym*fQMoibAgL7;v!j^XZu1QWa(PeVL5oz6`D%cD~jpBHXUvn`c%x$ zJ~{q*c)Jh&I0&!|)2CYpvliUwJ}3|A16gRA7X`{!%+*Adp-fS;6ZUO-4YFcegUui? zE0D-t9i^eX7g=*9aDB>ga3O0Q&3^2xU;{iTgTI|+;TyKm*HhDZt7=Pw|e4Ke9?*l(|1v8xc)0^xH0m7g8vgKrb~q2bQ*@l z;hbMKtFT|`3@_d0%~4du^LoS9FTZjc@(wUWV*DLGJ0zJVEWzJ>vm8~NqsXmP8H@;U zfl`$=adG7ms381JR<1jzPpI6>vh_cBNzXEyLnOb?_WNVVyTVv!!u{d;wHuLTxDp=q zrdi;qPSaEG1DHwfjZVR3w{^_r1lA%0WGWhq>gH|MzY8M5uPxB#)6c_`a?#X*rW0iE z&$e+IIO6^5u!BYSEXYwwh>{l6qQ*>L6+JzXx^neZ`JNugqyd5b0pwif9a{%k-x3yi zNuXakjU|P@QLCzOjfTYUag>%A{2P^oXv&dOy8Yb7BI7Pnl2B$PQtoYxf+;QAYQP<< z=0w-W_LGc$(dT?~yUtUU^i#@YI!fcd6%}iH8;-B#vmj6B7|H@#S_ie%%!G5TkWKp} z{CXLS4xQ5E2lYP4P@H+x&hND|Zcz+5C?H=G+*_`q1&ca^m)Q+-oCxp6JdU{BRnmqTj}I&Lc2h5C&dZ4$;BQ<-McA4Zf46k_W^N} zE^!MozGe81kmH*vq)`hLv&NBrGU+fRqz!vvP4>(ExUxjBhI7~WSJ6S2G4kf|XQ*#! zRHl|xE@t~7GRPSAL+$5GTqI;7dWXdNGT$*L*8Z;c4IGv_$w2n(#RYOzMGOP{1qch` z!ucUoz|piLA+ddrz*#3uTI-)on7{4heoJ*q&m2MLfrm?&Zk+G`G)Ah37fZVVJAOcJ zOk#pTvQ!3RL;ua#-(Wmdux8>SG~BZ;PQOSkZZpfkW(rRhHfZAcz;P2|LauFUW(fMf z5dR%RY>mizRsc~M@slkZHe!aHJ~cfGT(_WDY&24_gZgt~#iy4{ycu%Ub^n4ml}??* zf1QA!kMdpT2{*FF$V5Uljbgxr=?=23rEMBbj`?^s^h3Jr)sOq%40wKW)~&%MIQ5^+ CeH6F= diff --git a/icons/turf/walls/stone.dmi b/icons/turf/walls/stone.dmi index 4e53252374fc0498fcce95f764eb8ef837348823..3a9c3be5a1dbeea5209c16729b12ab9dd41c5689 100644 GIT binary patch delta 2750 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 Date: Sun, 2 Nov 2025 01:00:36 +0000 Subject: [PATCH 66/93] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-5185.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5185.yml diff --git a/html/changelog.html b/html/changelog.html index 561c88760f9c..b68d6c828dd7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

02 November 2025

+

MistakeNot4892 updated:

+
    +
  • Drakes can no longer farm, but they can mine (in dirt).
  • +
+

20 October 2025

MistakeNot4892 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index fb4a05ef19b2..c6ca91572aca 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -15045,3 +15045,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. MistakeNot4892: - tweak: Crafted barrels will need barrel rims forged if the forging modpack is in use. +2025-11-02: + MistakeNot4892: + - tweak: Drakes can no longer farm, but they can mine (in dirt). diff --git a/html/changelogs/AutoChangeLog-pr-5185.yml b/html/changelogs/AutoChangeLog-pr-5185.yml deleted file mode 100644 index 88680675a9e3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5185.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: 'Drakes can no longer farm, but they can mine (in dirt).'} -delete-after: true From db8d8b9f0ddde770c1b84352b70d9b36fafcc1e8 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sat, 1 Nov 2025 11:48:06 +1100 Subject: [PATCH 67/93] Moving paint_color to /atom. --- code/game/atoms.dm | 3 +++ code/game/objects/items/__item.dm | 1 - code/game/objects/structures/__structure.dm | 1 - code/game/turfs/turf.dm | 2 -- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d6d80c68478b..376472d4ffa5 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -64,6 +64,9 @@ /// (FLOAT) world.time of last on_reagent_update call, used to prevent recursion due to reagents updating reagents VAR_PRIVATE/_reagent_update_started = 0 + /// (STRING) A color applied over the top of any material color. Implemented on /obj/item, /obj/structure and /turf. + var/paint_color + /atom/proc/get_max_health() return max_health diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 171b27c8b98b..ece94ed6a6a9 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -112,7 +112,6 @@ /// Controls what method is used to resolve conflicts between equipped items and mob loadout. var/replaced_in_loadout = LOADOUT_CONFLICT_DELETE - var/paint_color var/paint_verb /// What dexterity is required to attack with this item? diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 2a90385995b3..43070098384d 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -17,7 +17,6 @@ var/footstep_type var/mob_offset - var/paint_color var/paint_verb /obj/structure/get_color() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6a6df3ddcc8a..5c21bc62b0e2 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -84,8 +84,6 @@ // Temporary list of weakrefs of atoms who should be excepted from falling into us var/list/skip_height_fall_for - var/paint_color - /// Floorlike structures like catwalks. Updated/retrieved by get_supporting_platform() var/obj/structure/supporting_platform From 8a2f9653b8b35a54a0c2de8e987d74a01034b7ac Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 20:34:53 +1100 Subject: [PATCH 68/93] Reworking some really bad code in borg hypos. --- .../{borghydro.dm => borghypo.dm} | 88 ++++++++++++------- nebula.dme | 2 +- 2 files changed, 56 insertions(+), 34 deletions(-) rename code/modules/reagents/reagent_containers/{borghydro.dm => borghypo.dm} (67%) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghypo.dm similarity index 67% rename from code/modules/reagents/reagent_containers/borghydro.dm rename to code/modules/reagents/reagent_containers/borghypo.dm index 35110bc10b99..5234b4c0ff72 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -12,29 +12,39 @@ var/charge_tick = 0 var/recharge_time = 5 //Time it takes for shots to recharge (in seconds) - var/list/reagent_ids = list(/decl/material/liquid/regenerator, /decl/material/liquid/stabilizer, /decl/material/liquid/antibiotics) - var/list/reagent_volumes = list() - var/list/reagent_names = list() +/obj/item/chems/borghypo/Initialize() + volume *= length(get_generated_reagents()) + . = ..() -/obj/item/chems/borghypo/surgeon - reagent_ids = list( +/obj/item/chems/borghypo/proc/get_generated_reagents() + var/static/list/_reagent_ids = list( + /decl/material/liquid/regenerator, + /decl/material/liquid/stabilizer, + /decl/material/liquid/antibiotics + ) + return _reagent_ids + +/obj/item/chems/borghypo/surgeon/get_generated_reagents() + var/static/list/_reagent_ids = list( /decl/material/liquid/brute_meds, /decl/material/liquid/oxy_meds, /decl/material/liquid/painkillers/strong ) + return _reagent_ids -/obj/item/chems/borghypo/crisis - reagent_ids = list( +/obj/item/chems/borghypo/crisis/get_generated_reagents() + var/static/list/_reagent_ids = list( /decl/material/liquid/regenerator, /decl/material/liquid/stabilizer, /decl/material/liquid/painkillers/strong ) + return _reagent_ids -/obj/item/chems/borghypo/Initialize() +/obj/item/chems/borghypo/populate_reagents() . = ..() + var/list/reagent_ids = get_generated_reagents() for(var/decl/material/reagent in decls_repository.get_decls_unassociated(reagent_ids)) - reagent_volumes[reagent.type] = volume - reagent_names += reagent.use_name // TODO: should we even bother precaching this? all of this code sucks anyway + reagents.add_reagent(reagent.type, round(reagents.maximum_volume / length(reagent_ids))) START_PROCESSING(SSobj, src) /obj/item/chems/borghypo/Destroy() @@ -43,21 +53,25 @@ /obj/item/chems/borghypo/Process() //Every [recharge_time] seconds, recharge some reagents for the cyborg+ if(++charge_tick < recharge_time) - return 0 + return charge_tick = 0 - - if(isrobot(loc)) - var/mob/living/silicon/robot/robot = loc - if(robot && robot.cell) - for(var/reagent in reagent_ids) - if(reagent_volumes[reagent] < volume) - robot.cell.use(charge_cost) - reagent_volumes[reagent] = min(reagent_volumes[reagent] + 5, volume) - return 1 + if(!isrobot(loc)) + return + var/mob/living/silicon/robot/robot = loc + if(!robot?.cell) + return + var/list/reagent_ids = get_generated_reagents() + var/max_per_reagent = round(reagents.maximum_volume / length(reagent_ids)) + for(var/reagent in reagent_ids) + var/has_reagent = REAGENT_VOLUME(reagents, GET_DECL(reagent)) + if(has_reagent < max_per_reagent) + robot.cell.use(charge_cost) + reagents.add_reagent(reagent, round(max_per_reagent - has_reagent)) /obj/item/chems/borghypo/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(!reagent_volumes[reagent_ids[mode]]) + var/list/reagent_ids = get_generated_reagents() + if(REAGENT_VOLUME(reagents, GET_DECL(reagent_ids[mode])) <= 0) to_chat(user, SPAN_WARNING("The injector is empty.")) return TRUE @@ -72,24 +86,26 @@ to_chat(target, SPAN_NOTICE("You feel a tiny prick!")) if(target.reagents) - var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) + var/t = min(amount_per_transfer_from_this, REAGENT_VOLUME(reagents, GET_DECL(reagent_ids[mode]))) target.add_to_reagents(reagent_ids[mode], t) - reagent_volumes[reagent_ids[mode]] -= t + reagents.remove_reagent(reagent_ids[mode], t) admin_inject_log(user, target, src, reagent_ids[mode], t) - to_chat(user, SPAN_NOTICE("[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.")) + to_chat(user, SPAN_NOTICE("[t] units injected. [REAGENT_VOLUME(reagents, GET_DECL(reagent_ids[mode])) || 0] unit\s remaining.")) return TRUE return ..() /obj/item/chems/borghypo/attack_self(mob/user) //Change the mode var/t = "" - for(var/i = 1 to reagent_ids.len) + var/list/reagent_ids = get_generated_reagents() + for(var/i = 1 to length(reagent_ids)) + var/decl/material/reagent = GET_DECL(reagent_ids[i]) if(t) t += ", " if(mode == i) - t += "[reagent_names[i]]" + t += "[reagent.liquid_name]" else - t += "[reagent_names[i]]" + t += "[reagent.liquid_name]" t = "Available reagents: [t]." to_chat(user, t) @@ -97,6 +113,7 @@ /obj/item/chems/borghypo/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["reagent_index"]) + var/list/reagent_ids = get_generated_reagents() var/index = text2num(href_list["reagent_index"]) if(index > 0 && index <= reagent_ids.len) playsound(loc, 'sound/effects/pop.ogg', 50, 0) @@ -109,8 +126,9 @@ . = ..() if(distance > 2) return + var/list/reagent_ids = get_generated_reagents() var/decl/material/reagent = GET_DECL(reagent_ids[mode]) - . += SPAN_NOTICE("It is currently producing [reagent.use_name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left.") + . += SPAN_NOTICE("It is currently producing [reagent.use_name] and has [REAGENT_VOLUME(reagents, reagent)] out of [round(reagents.maximum_volume / length(reagent_ids))] units left.") /obj/item/chems/borghypo/service name = "cyborg drink synthesizer" @@ -121,7 +139,9 @@ recharge_time = 3 volume = 60 possible_transfer_amounts = @"[5,10,20,30]" - reagent_ids = list( + +/obj/item/chems/borghypo/service/get_generated_reagents() + var/static/list/_reagent_ids = list( /decl/material/liquid/alcohol/beer, /decl/material/liquid/alcohol/coffee, /decl/material/liquid/alcohol/whiskey, @@ -154,7 +174,8 @@ /decl/material/liquid/drink/citrussoda, /decl/material/liquid/alcohol/beer, /decl/material/liquid/alcohol/coffee - ) + ) + return _reagent_ids /obj/item/chems/borghypo/service/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) return FALSE @@ -166,7 +187,8 @@ if(!ATOM_IS_OPEN_CONTAINER(target) || !target.reagents) return - if(!reagent_volumes[reagent_ids[mode]]) + var/list/reagent_ids = get_generated_reagents() + if(REAGENT_VOLUME(reagents, GET_DECL(reagent_ids[mode])) <= 0) to_chat(user, "[src] is out of this reagent, give it some time to refill.") return @@ -174,8 +196,8 @@ to_chat(user, "[target] is full.") return - var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) + var/t = min(amount_per_transfer_from_this, REAGENT_VOLUME(reagents, GET_DECL(reagent_ids[mode]))) target.add_to_reagents(reagent_ids[mode], t) - reagent_volumes[reagent_ids[mode]] -= t + reagents.remove_reagent(reagent_ids[mode], t) to_chat(user, "You transfer [t] units of the solution to [target].") return diff --git a/nebula.dme b/nebula.dme index 4042ee05fc6e..9506f4371d19 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3634,7 +3634,7 @@ #include "code\modules\reagents\reagent_containers\_glass_edibility.dm" #include "code\modules\reagents\reagent_containers\beaker.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\borghypo.dm" #include "code\modules\reagents\reagent_containers\bowl.dm" #include "code\modules\reagents\reagent_containers\bucket.dm" #include "code\modules\reagents\reagent_containers\drinks.dm" From 7f7887d8a45e9d78234c01f2e69eb821ec606bdf Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 21:46:00 +1100 Subject: [PATCH 69/93] Cleaning up current_health setting in atom definitions. --- code/game/machinery/doors/windowdoor.dm | 5 +---- code/game/objects/__objs.dm | 4 +++- code/game/objects/items/weapons/tape.dm | 1 - .../objects/items/welding/weldingtool_tank.dm | 1 - code/game/objects/structures/__structure.dm | 2 +- .../closets/secure/_secure_closets.dm | 4 +--- .../crates_lockers/closets/statue.dm | 2 +- code/game/objects/structures/pit.dm | 18 +++++++++--------- code/modules/barricade_tape/barricade_tape.dm | 2 +- .../modules/hydroponics/spreading/spreading.dm | 6 ++---- code/modules/mob/living/human/human.dm | 2 +- .../mob/living/silicon/robot/component.dm | 1 - .../mob/living/simple_animal/hostile/carp.dm | 2 +- .../hostile/retaliate/king_of_goats.dm | 2 +- code/modules/organs/organ.dm | 4 ++-- code/modules/paperwork/paper_bundle.dm | 3 +-- .../guns/launcher/bows/bow_string.dm | 2 +- code/modules/vehicles/bike.dm | 3 --- code/modules/vehicles/train.dm | 3 --- mods/species/ascent/mobs/insectoid_egg.dm | 1 - 20 files changed, 26 insertions(+), 42 deletions(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index f39b5849a088..57c7d8feb451 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -6,7 +6,6 @@ min_force = 4 hitsound = 'sound/effects/Glasshit.ogg' max_health = 150 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file - current_health = 150 visible = 0.0 use_power = POWER_USE_OFF stat_immune = NOSCREEN | NOINPUT | NOPOWER @@ -213,11 +212,9 @@ icon = 'icons/obj/doors/windoor.dmi' icon_state = "leftsecure" base_state = "leftsecure" - max_health = 300 - current_health = 300.0 //Stronger doors for prison (regular window door health is 150) + max_health = 300 //Stronger doors for prison (regular window door health is 150) pry_mod = 0.65 - /obj/machinery/door/window/northleft dir = NORTH diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm index 62566afe1a1c..4510c03626d7 100644 --- a/code/game/objects/__objs.dm +++ b/code/game/objects/__objs.dm @@ -30,8 +30,10 @@ //Only apply directional offsets if the mappers haven't set any offsets already if(!pixel_x && !pixel_y && !pixel_w && !pixel_z) update_directional_offset() - if(isnull(current_health)) + if(isnull(current_health) || current_health == INFINITY) current_health = get_max_health() + else + current_health = min(current_health, get_max_health()) /obj/object_shaken() shake_animation() diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index d10c34c4f8e3..0e443936683c 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -11,7 +11,6 @@ max_amount = 32 w_class = ITEM_SIZE_SMALL material = /decl/material/solid/organic/plastic - current_health = 10 max_health = 10 matter_multiplier = 0.25 diff --git a/code/game/objects/items/welding/weldingtool_tank.dm b/code/game/objects/items/welding/weldingtool_tank.dm index b28b73115dff..023de068b878 100644 --- a/code/game/objects/items/welding/weldingtool_tank.dm +++ b/code/game/objects/items/welding/weldingtool_tank.dm @@ -12,7 +12,6 @@ obj_flags = OBJ_FLAG_HOLLOW volume = 20 presentation_flags = PRESENTATION_FLAG_NAME - current_health = 40 max_health = 40 material = /decl/material/solid/metal/steel var/can_refuel = TRUE diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 43070098384d..839530cbdbc3 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -124,7 +124,7 @@ return FALSE /obj/structure/take_damage(damage, damage_type = BRUTE, damage_flags, inflicter, armor_pen = 0, silent, do_update_health) - if(current_health == -1) // This object does not take damage. + if(current_health == ITEM_HEALTH_NO_DAMAGE) // This object does not take damage. return if(material && material.is_brittle()) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm index ff568d29a611..1c2713ef45a2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm @@ -1,13 +1,11 @@ /obj/structure/closet/secure_closet name = "secure locker" desc = "It's a card-locked storage unit." - closet_appearance = /decl/closet_appearance/secure_closet setup = CLOSET_HAS_LOCK | CLOSET_CAN_BE_WELDED locked = TRUE - wall_mounted = 0 //never solid (You can always pass over it) - current_health = 200 + max_health = 200 /obj/structure/closet/secure_closet/slice_into_parts(obj/item/weldingtool/welder, mob/user) to_chat(user, "\The [src] is too strong to be taken apart.") diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 946821ceff5a..a8bac2f5fa78 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE setup = 0 - current_health = 0 //destroying the statue kills the mob within + max_health = 1 //destroying the statue kills the mob within var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils. var/intialBrute = 0 diff --git a/code/game/objects/structures/pit.dm b/code/game/objects/structures/pit.dm index 658290a567ca..09c8ee2cca5d 100644 --- a/code/game/objects/structures/pit.dm +++ b/code/game/objects/structures/pit.dm @@ -1,13 +1,13 @@ /obj/structure/pit - name = "pit" - desc = "Watch your step, partner." - icon = 'icons/obj/structures/pit.dmi' - icon_state = "pit1" - blend_mode = BLEND_MULTIPLY - density = FALSE - anchored = TRUE - current_health = ITEM_HEALTH_NO_DAMAGE //You can't break a hole in the ground. - var/open = TRUE + name = "pit" + desc = "Watch your step, partner." + icon = 'icons/obj/structures/pit.dmi' + icon_state = "pit1" + blend_mode = BLEND_MULTIPLY + density = FALSE + anchored = TRUE + max_health = ITEM_HEALTH_NO_DAMAGE //You can't break a hole in the ground. + var/open = TRUE /obj/structure/pit/attackby(obj/item/used_item, mob/user) if(IS_SHOVEL(used_item)) diff --git a/code/modules/barricade_tape/barricade_tape.dm b/code/modules/barricade_tape/barricade_tape.dm index b0f81d840a3f..689039b34c09 100644 --- a/code/modules/barricade_tape/barricade_tape.dm +++ b/code/modules/barricade_tape/barricade_tape.dm @@ -25,7 +25,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar pass_flags = PASS_FLAG_TABLE //About the height of table anchored = TRUE material = /decl/material/solid/organic/plastic - current_health = 5 + max_health = 5 var/neighbors = 0 //Contains all the direction flags of all the neighboring tape_barricades var/is_lifted = 0 //Whether the tape is lifted and we're allowing everyone passage. var/is_crumpled = 0 //Whether the tape was damaged diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 2b772c7f15f4..523d2ec04c84 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -45,9 +45,7 @@ icon_state = "" pass_flags = PASS_FLAG_TABLE mouse_opacity = MOUSE_OPACITY_NORMAL - - current_health = 10 - max_health = 100 + max_health = 10 var/growth_threshold = 0 var/growth_type = 0 var/max_growth = 0 @@ -82,7 +80,7 @@ max_health = round(seed.get_trait(TRAIT_ENDURANCE)/2) if(start_matured) mature_time = 0 - current_health = max_health + current_health = get_max_health() if(seed.get_trait(TRAIT_SPREAD) == 2) mouse_opacity = MOUSE_OPACITY_PRIORITY diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 14fd42f76b5c..bd8bec8ebf45 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -9,7 +9,7 @@ /mob/living/human/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - current_health = max_health + current_health = get_max_health() reset_hud_overlays() var/list/newargs = args.Copy(2) setup_human(arglist(newargs)) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 3d4a7b1000d8..45a09beca266 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -224,7 +224,6 @@ icon = 'icons/obj/robot_component.dmi' icon_state = "working" material = /decl/material/solid/metal/steel - current_health = 30 max_health = 30 var/burn_damage = 0 var/brute_damage = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 9d63b3a9b810..2212b6d6d3df 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -45,7 +45,7 @@ /mob/living/simple_animal/hostile/carp/proc/carp_randomify() max_health = rand(initial(max_health), (1.5 * initial(max_health))) - current_health = max_health + current_health = get_max_health() if(prob(1)) carp_color = pick(COLOR_WHITE, COLOR_BLACK) else diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 57710f9594f0..9e0c73835b94 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -222,7 +222,7 @@ phase3 = TRUE spellscast = 0 max_health = 750 - current_health = max_health + current_health = get_max_health() new /obj/item/grenade/flashbang/instant(src.loc) QDEL_NULL(boss_theme) boss_theme = play_looping_sound(src, sound_id, 'sound/music/Visager-Miniboss_Fight.ogg', volume = 10, range = 8, falloff = 4, prefer_mute = TRUE) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 6f483c9e85ec..4833f59de7ed 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -620,9 +620,9 @@ var/global/list/ailment_reference_cache = list() max_health = max_damage if(current_health == ITEM_HEALTH_NO_DAMAGE) - current_health = max_health + current_health = get_max_health() else - current_health = min(current_health, max_health) + current_health = min(current_health, get_max_health()) action_button_name = null screen_loc = null diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index ccb16e145bcf..36e3a047c95d 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -18,8 +18,7 @@ drop_sound = 'sound/foley/paperpickup1.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' item_flags = ITEM_FLAG_CAN_TAPE - current_health = 10 - max_health = 10 + max_health = 10 var/tmp/cur_page = 1 // current page var/tmp/max_pages = 100 //Maximum number of papers that can be in the bundle var/list/pages // Ordered list of pages as they are to be displayed. Can be different order than src.contents. diff --git a/code/modules/projectiles/guns/launcher/bows/bow_string.dm b/code/modules/projectiles/guns/launcher/bows/bow_string.dm index d2f9569221a7..72212cde43b1 100644 --- a/code/modules/projectiles/guns/launcher/bows/bow_string.dm +++ b/code/modules/projectiles/guns/launcher/bows/bow_string.dm @@ -12,7 +12,7 @@ . = ..() if(material) max_health = max(1, round(initial(max_health) * material.tensile_strength)) - current_health = max_health + current_health = get_max_health() /obj/item/bowstring/Destroy() if(istype(loc, /obj/item/gun/launcher/bow)) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 2dd01cbc386c..7522827dc86f 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -4,12 +4,9 @@ icon = 'icons/obj/bike.dmi' icon_state = "bike_off" dir = SOUTH - load_item_visible = 1 buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 5) - current_health = 100 max_health = 100 - locked = 0 fire_dam_coeff = 0.6 brute_dam_coeff = 0.5 diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 7c62d658b2e8..0cb43501e1e8 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -1,10 +1,7 @@ /obj/vehicle/train name = "train" dir = EAST - move_delay = 1 - - current_health = 100 max_health = 100 fire_dam_coeff = 0.7 brute_dam_coeff = 0.5 diff --git a/mods/species/ascent/mobs/insectoid_egg.dm b/mods/species/ascent/mobs/insectoid_egg.dm index 0385817c1ec7..5a9fba0cd993 100644 --- a/mods/species/ascent/mobs/insectoid_egg.dm +++ b/mods/species/ascent/mobs/insectoid_egg.dm @@ -18,7 +18,6 @@ var/global/default_gyne /obj/structure/insectoid_egg name = "alien egg" desc = "A semi-translucent alien egg." - current_health = 100 max_health = 100 icon = 'mods/species/ascent/icons/egg.dmi' icon_state = "egg" From 9c2ba22b56100f3581b64acaad99699a7e2f60a5 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 22:47:23 +1100 Subject: [PATCH 70/93] Fixes issues with chest trim. --- code/game/objects/structures/crates_lockers/crates.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 4eaac0b2cc2e..6b85c90efb6d 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -327,14 +327,14 @@ var/decl/material/overlay_material = /decl/material/solid/metal/iron /obj/structure/closet/crate/chest/Initialize() - . = ..() if(ispath(overlay_material)) overlay_material = GET_DECL(overlay_material) + . = ..() // icon update is already queued in parent because of closet appearance /obj/structure/closet/crate/chest/update_material_desc(override_desc) ..() - if(overlay_material) + if(istype(overlay_material)) desc = "[desc] It has a trim made of [overlay_material.solid_name]." /obj/structure/closet/crate/chest/on_update_icon() From cf309cb8b67cd03e5889302a3a3bef3ab4943a8f Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 23:19:11 +1100 Subject: [PATCH 71/93] Moving various material references onto /atom and cleaning up use of ambiguous terms. --- code/datums/repositories/atom_info.dm | 86 +++++++++---------- code/game/atoms.dm | 6 ++ code/game/objects/items/__item.dm | 2 - code/game/objects/items/_item_drying.dm | 4 +- .../structures/_structure_materials.dm | 2 - code/game/turfs/flooring/flooring_path.dm | 8 +- code/game/turfs/flooring/flooring_rock.dm | 8 +- code/game/turfs/turf.dm | 17 ++-- code/game/turfs/turf_digging.dm | 4 +- code/game/turfs/walls/_wall.dm | 2 - code/modules/admin/verbs/debug.dm | 7 +- .../preference_setup/loadout/loadout.dm | 8 +- .../codex/categories/category_substances.dm | 8 +- code/modules/fabrication/designs/_design.dm | 4 +- code/modules/fabrication/fabricator_intake.dm | 12 +-- code/modules/fabrication/recycler.dm | 4 +- code/modules/materials/_material_stack.dm | 1 - code/modules/materials/_materials.dm | 24 +++--- .../solids/materials_solid_alien.dm | 2 +- code/modules/materials/material_debris.dm | 4 +- .../modules/materials/material_gas_overlay.dm | 1 - .../materials/material_product_spawning.dm | 4 +- code/modules/mechs/mech.dm | 3 - .../modules/power/fusion/kinetic_harvester.dm | 32 +++---- code/modules/reagents/Chemistry-Grinder.dm | 12 +-- code/modules/reagents/Chemistry-Holder.dm | 4 +- code/unit_tests/food_tests.dm | 4 +- code/unit_tests/materials.dm | 16 ++-- .../circuit_serialization.dm | 4 +- .../components/input.dm | 4 +- .../integrated_electronics/tools/printer.dm | 40 ++++----- mods/content/xenobiology/slime/items.dm | 4 +- mods/gamemodes/cult/materials.dm | 2 +- 33 files changed, 166 insertions(+), 177 deletions(-) diff --git a/code/datums/repositories/atom_info.dm b/code/datums/repositories/atom_info.dm index 9e842cf2feb0..a84f10736b76 100644 --- a/code/datums/repositories/atom_info.dm +++ b/code/datums/repositories/atom_info.dm @@ -9,79 +9,79 @@ var/global/repository/atom_info/atom_info_repository = new() var/list/matter_mult_cache = list() var/list/origin_tech_cache = list() -/repository/atom_info/proc/create_key_for(var/path, var/material, var/amount) - . = "[path]" - if(ispath(path, /obj) && material) // only objects take material as an arg - . = "[.]-[material]" - if(ispath(path, /obj/item/stack) && !isnull(amount)) // similarly for stacks and amount - . = "[.]-[amount]" +/repository/atom_info/proc/create_key_for(var/_path, var/_mat, var/_amount) + . = "[_path]" + if(ispath(_path, /obj) && _mat) // only objects take material as an arg + . = "[.]-[_mat]" + if(ispath(_path, /obj/item/stack) && !isnull(_amount)) // similarly for stacks and amount + . = "[.]-[_amount]" -/repository/atom_info/proc/get_instance_of(var/path, var/material, var/amount) - if(ispath(path, /obj/item/stack)) - . = new path(null, amount, material) - else if(ispath(path, /obj)) - . = new path(null, material) +/repository/atom_info/proc/get_instance_of(var/_path, var/_mat, var/_amount) + if(ispath(_path, /obj/item/stack)) + . = new _path(null, _amount, _mat) + else if(ispath(_path, /obj)) + . = new _path(null, _mat) else - . = new path + . = new _path -/repository/atom_info/proc/update_cached_info_for(var/path, var/material, var/amount, var/key) +/repository/atom_info/proc/update_cached_info_for(var/_path, var/_mat, var/_amount, var/key) var/atom/instance if(!matter_cache[key]) - instance = get_instance_of(path, material, amount) + instance = get_instance_of(_path, _mat, _amount) matter_cache[key] = instance.get_contained_matter() || list() if(!combined_worth_cache[key]) - instance = instance || get_instance_of(path, material, amount) + instance = instance || get_instance_of(_path, _mat, _amount) combined_worth_cache[key] = instance.get_combined_monetary_worth() if(!single_worth_cache[key]) - instance = instance || get_instance_of(path, material, amount) + instance = instance || get_instance_of(_path, _mat, _amount) single_worth_cache[key] = instance.get_single_monetary_worth() if(!name_cache[key]) - instance = instance || get_instance_of(path, material, amount) + instance = instance || get_instance_of(_path, _mat, _amount) name_cache[key] = instance.name if(!description_cache[key]) - instance = instance || get_instance_of(path, material, amount) + instance = instance || get_instance_of(_path, _mat, _amount) description_cache[key] = instance.desc - if(!matter_mult_cache[key] && ispath(path, /obj)) - var/obj/obj_instance = instance || get_instance_of(path, material, amount) + if(!matter_mult_cache[key] && ispath(_path, /obj)) + var/obj/obj_instance = instance || get_instance_of(_path, _mat, _amount) matter_mult_cache[key] = obj_instance.get_matter_amount_modifier() - if(!origin_tech_cache[key] && ispath(path, /obj/item)) - var/obj/item/item_instance = instance || get_instance_of(path, material, amount) + if(!origin_tech_cache[key] && ispath(_path, /obj/item)) + var/obj/item/item_instance = instance || get_instance_of(_path, _mat, _amount) origin_tech_cache[key] = cached_json_decode(item_instance.get_origin_tech()) if(!QDELETED(instance)) qdel(instance) -/repository/atom_info/proc/get_matter_for(var/path, var/material, var/amount) +/repository/atom_info/proc/get_matter_for(var/_path, var/_mat, var/_amount) RETURN_TYPE(/list) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = matter_cache[key] -/repository/atom_info/proc/get_combined_worth_for(var/path, var/material, var/amount) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) +/repository/atom_info/proc/get_combined_worth_for(var/_path, var/_mat, var/_amount) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = combined_worth_cache[key] -/repository/atom_info/proc/get_single_worth_for(var/path, var/material, var/amount) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) +/repository/atom_info/proc/get_single_worth_for(var/_path, var/_mat, var/_amount) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = single_worth_cache[key] -/repository/atom_info/proc/get_name_for(var/path, var/material, var/amount) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) +/repository/atom_info/proc/get_name_for(var/_path, var/_mat, var/_amount) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = name_cache[key] -/repository/atom_info/proc/get_description_for(var/path, var/material, var/amount) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) +/repository/atom_info/proc/get_description_for(var/_path, var/_mat, var/_amount) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = description_cache[key] -/repository/atom_info/proc/get_matter_multiplier_for(var/path, var/material, var/amount) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) +/repository/atom_info/proc/get_matter_multiplier_for(var/_path, var/_mat, var/_amount) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = matter_mult_cache[key] -/repository/atom_info/proc/get_origin_tech_for(var/path, var/material, var/amount) - var/key = create_key_for(path, material, amount) - update_cached_info_for(path, material, amount, key) +/repository/atom_info/proc/get_origin_tech_for(var/_path, var/_mat, var/_amount) + var/key = create_key_for(_path, _mat, _amount) + update_cached_info_for(_path, _mat, _amount, key) . = origin_tech_cache[key] \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 376472d4ffa5..18af0e9a1886 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -67,6 +67,12 @@ /// (STRING) A color applied over the top of any material color. Implemented on /obj/item, /obj/structure and /turf. var/paint_color + /// (DATUM) Reference to material decl. If set to a /decl/material path, will init the item with that material. + /// Implemented on /mob/living/exosuit, /turf/wall, /obj/item and /obj/structure + var/decl/material/material + /// (DATUM) Similar to above, but largely used by /turf/wall, /obj/structure and /obj/item/stack/material + var/decl/material/reinf_material + /atom/proc/get_max_health() return max_health diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index ece94ed6a6a9..5c0a8f52c946 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -90,8 +90,6 @@ /// Assoc list of bodytype category to icon for producing onmob overlays when this item is held or worn. var/list/sprite_sheets - // Material handling for material weapons (not used by default, unless material is supplied or set) - var/decl/material/material // Reference to material decl. If set to a string corresponding to a material ID, will init the item with that material. ///Will apply the flagged modifications to the object var/material_alteration = MAT_FLAG_ALTERATION_NONE var/anomaly_shielding // 0..1 value of how well it shields against xenoarch anomalies diff --git a/code/game/objects/items/_item_drying.dm b/code/game/objects/items/_item_drying.dm index c3044b33be21..5357133fe505 100644 --- a/code/game/objects/items/_item_drying.dm +++ b/code/game/objects/items/_item_drying.dm @@ -77,9 +77,9 @@ if(!length(matter)) return FALSE for(var/mat in matter) - var/decl/material/material = GET_DECL(mat) + var/decl/material/heated_material = GET_DECL(mat) // We should burn if we're above the temperature damage threshold. - if(!isnull(material.temperature_damage_threshold) && exposed_temperature >= material.temperature_damage_threshold) + if(!isnull(heated_material.temperature_damage_threshold) && exposed_temperature >= heated_material.temperature_damage_threshold) return TRUE return FALSE diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 533df4ca3d72..a6c98ee0a1bc 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -1,6 +1,4 @@ /obj/structure - var/decl/material/material - var/decl/material/reinf_material var/material_alteration var/dismantled var/name_prefix diff --git a/code/game/turfs/flooring/flooring_path.dm b/code/game/turfs/flooring/flooring_path.dm index c0de0be830eb..6a934d5c5eb3 100644 --- a/code/game/turfs/flooring/flooring_path.dm +++ b/code/game/turfs/flooring/flooring_path.dm @@ -16,11 +16,11 @@ var/paver_noun = "stones" /decl/flooring/path/update_turf_strings(turf/floor/target) - var/decl/material/material = target?.get_material() - ASSERT(material?.adjective_name) + var/decl/material/floor_material = target?.get_material() + ASSERT(floor_material?.adjective_name) ASSERT(paver_noun) - target.SetName("[material.adjective_name] [name]") - target.desc = "[jointext_no_nulls(list("A", paving_adjective, "path made of", paver_adjective, material.adjective_name, paver_noun), " ")]." + target.SetName("[floor_material.adjective_name] [name]") + target.desc = "[jointext_no_nulls(list("A", paving_adjective, "path made of", paver_adjective, floor_material.adjective_name, paver_noun), " ")]." /decl/flooring/path/cobblestone name = "cobblestones" diff --git a/code/game/turfs/flooring/flooring_rock.dm b/code/game/turfs/flooring/flooring_rock.dm index b5935e2109cc..13836a0a7da7 100644 --- a/code/game/turfs/flooring/flooring_rock.dm +++ b/code/game/turfs/flooring/flooring_rock.dm @@ -10,7 +10,7 @@ uid = "floor_reinf_shuttle_rock" /decl/flooring/rock/update_turf_strings(turf/floor/target) - var/decl/material/material = target?.get_material() - ASSERT(material?.adjective_name) - target.SetName("[material.adjective_name] [name]") - target.desc = "An expanse of bare [material.solid_name]." + var/decl/material/turf_material = target?.get_material() + ASSERT(turf_material?.adjective_name) + target.SetName("[turf_material.adjective_name] [name]") + target.desc = "An expanse of bare [turf_material.solid_name]." diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 5c21bc62b0e2..8f74908751a6 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -272,8 +272,8 @@ try_dig_farm(user, used_item) return TRUE - var/decl/material/material = get_material() - if(IS_PICK(used_item) && material) + var/decl/material/digging_material = get_material() + if(IS_PICK(used_item) && digging_material) // TODO: move these checks into the interaction handlers. var/atom/platform = get_supporting_platform() @@ -281,7 +281,7 @@ to_chat(user, SPAN_WARNING("\The [platform] [platform.get_pronouns().is] in the way!")) return TRUE - if(material?.hardness <= MAT_VALUE_FLEXIBLE) + if(digging_material?.hardness <= MAT_VALUE_FLEXIBLE) to_chat(user, SPAN_WARNING("\The [src] is too soft to be excavated with \the [used_item]. Use a shovel.")) return TRUE @@ -823,12 +823,7 @@ return null /turf/get_color() - if(paint_color) - return paint_color - var/decl/material/material = get_material() - if(material) - return material.color - return color + return paint_color || get_material()?.color || color /turf/proc/get_fishing_result(obj/item/food/bait) var/area/A = get_area(src) @@ -908,8 +903,8 @@ if(T.can_dig_trench(prop?.material?.hardness)) T.try_dig_trench(user, prop) else if(IS_PICK(prop)) - var/decl/material/material = T.get_material() - if(material?.hardness > MAT_VALUE_FLEXIBLE && T.can_dig_trench(prop?.material?.hardness, using_tool = TOOL_PICK)) + var/decl/material/digging_material = T.get_material() + if(digging_material?.hardness > MAT_VALUE_FLEXIBLE && T.can_dig_trench(prop?.material?.hardness, using_tool = TOOL_PICK)) T.try_dig_trench(user, prop, using_tool = TOOL_PICK) /decl/interaction_handler/dig/pit diff --git a/code/game/turfs/turf_digging.dm b/code/game/turfs/turf_digging.dm index d9944cc1c814..41be30031860 100644 --- a/code/game/turfs/turf_digging.dm +++ b/code/game/turfs/turf_digging.dm @@ -57,8 +57,8 @@ return get_plant_growth_rate() > 0 && can_be_dug(tool_hardness, using_tool) && !(locate(/obj/machinery/portable_atmospherics/hydroponics/soil) in src) /turf/proc/try_dig_farm(mob/user, obj/item/tool, using_tool = TOOL_HOE) - var/decl/material/material = get_material() - if(!material?.tillable) + var/decl/material/turf_material = get_material() + if(!turf_material?.tillable) return if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, set_cooldown = TRUE, check_skill = SKILL_BOTANY)) return dig_farm(user, tool?.material?.hardness, using_tool) diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index ef02c8f94328..119683c5413c 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -36,8 +36,6 @@ var/global/list/wall_fullblend_objects = list( var/unique_merge_identifier var/damage = 0 var/can_open = 0 - var/decl/material/material - var/decl/material/reinf_material var/decl/material/girder_material = /decl/material/solid/metal/steel var/construction_stage var/hitsound = 'sound/weapons/Genhit.ogg' diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 22e04658b19a..ff76ca49fe9b 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -425,10 +425,9 @@ set name = "Spawn Material Stack" if(!check_rights(R_DEBUG)) return - var/decl/material/material = input("Select material to spawn") as null|anything in decls_repository.get_decls_of_subtype_unassociated(/decl/material) - if(!istype(material)) - return - material.create_object(get_turf(mob), 50) + var/decl/material/spawn_material = input("Select material to spawn") as null|anything in decls_repository.get_decls_of_subtype_unassociated(/decl/material) + if(istype(spawn_material)) + spawn_material.create_object(get_turf(mob), 50) /client/proc/force_ghost_trap_trigger() set category = "Debug" diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index f893c8b49080..ceb5eaaeac52 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -491,10 +491,10 @@ var/location var/material -/datum/gear_data/New(var/path, var/location, var/material) - src.path = path - src.location = location - src.material = material +/datum/gear_data/New(var/_path, var/_location, var/_mat) + src.path = _path + src.location = _location + src.material = _mat /datum/gear_data/proc/can_replace_existing(obj/item/candidate) return istype(candidate, path) diff --git a/code/modules/codex/categories/category_substances.dm b/code/modules/codex/categories/category_substances.dm index 7deca9a4156c..9d2c5ab8c95e 100644 --- a/code/modules/codex/categories/category_substances.dm +++ b/code/modules/codex/categories/category_substances.dm @@ -66,10 +66,10 @@ if(mat.dissolves_in != MAT_SOLVENT_IMMUNE && LAZYLEN(mat.dissolves_into)) var/chems = list() for(var/chemical in mat.dissolves_into) - var/decl/material/material = GET_DECL(chemical) - var/material_link = "[material.name]" - if(material.hidden_from_codex) - material_link = material.name + var/decl/material/chemical_decl = GET_DECL(chemical) + var/material_link = "[chemical_decl.name]" + if(chemical_decl.hidden_from_codex) + material_link = chemical_decl.name chems += "[material_link] ([mat.dissolves_into[chemical]*100]%)" var/solvent_needed if(mat.dissolves_in <= MAT_SOLVENT_NONE) diff --git a/code/modules/fabrication/designs/_design.dm b/code/modules/fabrication/designs/_design.dm index c37667e53ad3..0b4e7ecd7114 100644 --- a/code/modules/fabrication/designs/_design.dm +++ b/code/modules/fabrication/designs/_design.dm @@ -17,7 +17,7 @@ // Populate name and resources from the product type. /datum/fabricator_recipe/proc/get_product_name() - . = atom_info_repository.get_name_for(path, amount = 1) + . = atom_info_repository.get_name_for(path, _amount = 1) /datum/fabricator_recipe/New() ..() @@ -29,7 +29,7 @@ name = get_product_name() if(required_technology == TRUE) if(ispath(path, /obj/item)) - required_technology = atom_info_repository.get_origin_tech_for(path, amount = 1) + required_technology = atom_info_repository.get_origin_tech_for(path, _amount = 1) if(!islist(required_technology)) required_technology = list() if(!resources) diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index f3458e04a45f..3d2f8cf9e294 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -40,22 +40,22 @@ var/mat_colour = thing.color for(var/mat in thing.matter) - var/decl/material/material_def = GET_DECL(mat) - if(!material_def || !base_storage_capacity[material_def.type]) + var/decl/material/ingest_material = GET_DECL(mat) + if(!ingest_material || !base_storage_capacity[mat]) continue - var/taking_material = min(thing.matter[mat], storage_capacity[material_def.type] - stored_material[material_def.type]) + var/taking_material = min(thing.matter[mat], storage_capacity[mat] - stored_material[mat]) if(taking_material <= 0) continue if(!mat_colour) - mat_colour = material_def.color + mat_colour = ingest_material.color - stored_material[material_def.type] += taking_material + stored_material[mat] += taking_material if(stack_ref) stacks_used = max(stacks_used, ceil(taking_material/stack_matter_div)) - if(storage_capacity[material_def.type] == stored_material[material_def.type]) + if(storage_capacity[mat] == stored_material[mat]) . = SUBSTANCE_TAKEN_FULL else if(. != SUBSTANCE_TAKEN_FULL) . = SUBSTANCE_TAKEN_ALL diff --git a/code/modules/fabrication/recycler.dm b/code/modules/fabrication/recycler.dm index d6da2d6efd70..10ab9407a954 100644 --- a/code/modules/fabrication/recycler.dm +++ b/code/modules/fabrication/recycler.dm @@ -83,8 +83,8 @@ visible_message("[capitalize(english_list(fell_out))] fall out of \the overflowing [src]!") for(var/mat in munched_matter) - var/decl/material/material = GET_DECL(mat) - switch(material.phase_at_temperature()) + var/decl/material/munched_material = GET_DECL(mat) + switch(munched_material.phase_at_temperature()) if(MAT_PHASE_SOLID) // Dump the material out as a stack. diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 759b9c08801f..113e54a57647 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -18,7 +18,6 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR var/can_be_pulverized = FALSE var/can_be_reinforced = FALSE - var/decl/material/reinf_material /obj/item/stack/material/Initialize(mapload, var/amount, var/_material, var/_reinf_material) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 9defbc34504d..2ed880fd3b89 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -545,25 +545,25 @@ var/global/list/_descriptive_temperature_strings if(!_descriptive_temperature_strings) _descriptive_temperature_strings = list() - for(var/decl/material/material as anything in decls_repository.get_decls_of_subtype_unassociated(/decl/material)) + for(var/decl/material/desc_material as anything in decls_repository.get_decls_of_subtype_unassociated(/decl/material)) - if(material.type != material.temperature_burn_milestone_material) + if(desc_material.type != desc_material.temperature_burn_milestone_material) continue - if(!isnull(material.bakes_into_at_temperature) && material.bakes_into_material) - var/decl/material/cook = GET_DECL(material.bakes_into_material) - global._descriptive_temperature_strings["bake [material.name] into [cook.name]"] = material.bakes_into_at_temperature + if(!isnull(desc_material.bakes_into_at_temperature) && desc_material.bakes_into_material) + var/decl/material/cook = GET_DECL(desc_material.bakes_into_material) + global._descriptive_temperature_strings["bake [desc_material.name] into [cook.name]"] = desc_material.bakes_into_at_temperature continue - switch(material.phase_at_temperature()) + switch(desc_material.phase_at_temperature()) if(MAT_PHASE_SOLID) - if(!isnull(material.ignition_point)) - global._descriptive_temperature_strings["ignite [material.name]"] = material.ignition_point - else if(!isnull(material.melting_point)) - global._descriptive_temperature_strings["melt [material.name]"] = material.melting_point + if(!isnull(desc_material.ignition_point)) + global._descriptive_temperature_strings["ignite [desc_material.name]"] = desc_material.ignition_point + else if(!isnull(desc_material.melting_point)) + global._descriptive_temperature_strings["melt [desc_material.name]"] = desc_material.melting_point if(MAT_PHASE_LIQUID) - if(!isnull(material.boiling_point)) - global._descriptive_temperature_strings["boil [material.name]"] = material.boiling_point + if(!isnull(desc_material.boiling_point)) + global._descriptive_temperature_strings["boil [desc_material.name]"] = desc_material.boiling_point for(var/burn_string in global._descriptive_temperature_strings) if(temperature >= global._descriptive_temperature_strings[burn_string]) diff --git a/code/modules/materials/definitions/solids/materials_solid_alien.dm b/code/modules/materials/definitions/solids/materials_solid_alien.dm index 97ff03bfe45f..8b4c33935d44 100644 --- a/code/modules/materials/definitions/solids/materials_solid_alien.dm +++ b/code/modules/materials/definitions/solids/materials_solid_alien.dm @@ -26,5 +26,5 @@ melting_point = rand(400,11000) . = ..() -/decl/material/solid/metal/aliumium/place_dismantled_girder(var/turf/target, var/decl/material/reinf_material) +/decl/material/solid/metal/aliumium/place_dismantled_girder(var/turf/target, var/decl/material/r_mat) return \ No newline at end of file diff --git a/code/modules/materials/material_debris.dm b/code/modules/materials/material_debris.dm index aa5a3ffed5c3..0eece4d7788d 100644 --- a/code/modules/materials/material_debris.dm +++ b/code/modules/materials/material_debris.dm @@ -21,8 +21,8 @@ var/mat_amt = matter[mat] if(!highest_mat || matter[highest_mat] < mat_amt) highest_mat = mat - var/decl/material/material_decl = GET_DECL(mat) - mat_names += material_decl.solid_name + var/decl/material/scrap_material = GET_DECL(mat) + mat_names += scrap_material.solid_name total_matter += mat_amt // Safety check, although this should be prevented for player side interactions diff --git a/code/modules/materials/material_gas_overlay.dm b/code/modules/materials/material_gas_overlay.dm index a6384957de02..0eb154f43058 100644 --- a/code/modules/materials/material_gas_overlay.dm +++ b/code/modules/materials/material_gas_overlay.dm @@ -6,7 +6,6 @@ layer = FIRE_LAYER appearance_flags = RESET_COLOR mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - var/decl/material/material INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) diff --git a/code/modules/materials/material_product_spawning.dm b/code/modules/materials/material_product_spawning.dm index 291e4c1ea8c8..8e5711291cd7 100644 --- a/code/modules/materials/material_product_spawning.dm +++ b/code/modules/materials/material_product_spawning.dm @@ -27,8 +27,8 @@ placed.dropInto(target) // Places a girder object when a wall is dismantled, also applies reinforced material. -/decl/material/proc/place_dismantled_girder(var/turf/target, var/decl/material/reinf_material) - return create_object(target, 1, /obj/structure/girder, ispath(reinf_material) ? reinf_material : reinf_material?.type) +/decl/material/proc/place_dismantled_girder(var/turf/target, var/decl/material/r_mat) + return create_object(target, 1, /obj/structure/girder, ispath(r_mat) ? r_mat : r_mat?.type) // General wall debris product placement. // Not particularly necessary aside from snowflakey cult girders. diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index ca7f1783cc39..2530ea6bd46d 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -47,9 +47,6 @@ var/hardpoints_locked var/maintenance_protocols - // Material - var/decl/material/material - // Cockpit access vars. var/hatch_closed = FALSE var/hatch_locked = FALSE diff --git a/code/modules/power/fusion/kinetic_harvester.dm b/code/modules/power/fusion/kinetic_harvester.dm index 51d150e0c8d0..34f832bf13fa 100644 --- a/code/modules/power/fusion/kinetic_harvester.dm +++ b/code/modules/power/fusion/kinetic_harvester.dm @@ -65,9 +65,9 @@ data["status"] = (use_power >= POWER_USE_ACTIVE) data["materials"] = list() for(var/mat in stored) - var/decl/material/material = GET_DECL(mat) + var/decl/material/stored_material = GET_DECL(mat) var/sheets = floor(stored[mat]/(SHEET_MATERIAL_AMOUNT * 1.5)) - data["materials"] += list(list("name" = material.solid_name, "amount" = sheets, "harvest" = harvesting[mat], "mat_ref" = "\ref[material]")) + data["materials"] += list(list("name" = stored_material.solid_name, "amount" = sheets, "harvest" = harvesting[mat], "mat_ref" = "\ref[stored_material]")) ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -109,15 +109,15 @@ /obj/machinery/kinetic_harvester/OnTopic(var/mob/user, var/href_list, var/datum/topic_state/state) if(href_list["remove_mat"]) - var/decl/material/material = locate(href_list["remove_mat"]) - if(istype(material)) + var/decl/material/remove_material = locate(href_list["remove_mat"]) + if(istype(remove_material)) var/sheet_cost = (SHEET_MATERIAL_AMOUNT * 1.5) - var/sheets = floor(stored[material.type]/sheet_cost) + var/sheets = floor(stored[remove_material.type]/sheet_cost) if(sheets > 0) - material.create_object(loc, sheets) - stored[material.type] -= (sheets * sheet_cost) - if(stored[material.type] <= 0) - stored -= material.type + remove_material.create_object(loc, sheets) + stored[remove_material.type] -= (sheets * sheet_cost) + if(stored[remove_material.type] <= 0) + stored -= remove_material.type return TOPIC_REFRESH if(href_list["toggle_power"]) @@ -126,12 +126,12 @@ return TOPIC_REFRESH if(href_list["toggle_harvest"]) - var/decl/material/material = locate(href_list["toggle_harvest"]) - if(istype(material)) - if(harvesting[material.type]) - harvesting -= material.type + var/decl/material/harvest_material = locate(href_list["toggle_harvest"]) + if(istype(harvest_material)) + if(harvesting[harvest_material.type]) + harvesting -= harvest_material.type else - harvesting[material.type] = TRUE - if(!(material.type in stored)) - stored[material.type] = 0 + harvesting[harvest_material.type] = TRUE + if(!(harvest_material.type in stored)) + stored[harvest_material.type] = 0 return TOPIC_REFRESH diff --git a/code/modules/reagents/Chemistry-Grinder.dm b/code/modules/reagents/Chemistry-Grinder.dm index c5ff5f530bab..ca34cc020990 100644 --- a/code/modules/reagents/Chemistry-Grinder.dm +++ b/code/modules/reagents/Chemistry-Grinder.dm @@ -100,9 +100,9 @@ return if(istype(used_item,/obj/item/stack/material)) - var/decl/material/material = used_item.get_material() - if(!material) - to_chat(user, SPAN_NOTICE("\The [material.solid_name] cannot be ground down to any usable reagents.")) + var/decl/material/grind_material = used_item.get_material() + if(!grind_material) + to_chat(user, SPAN_NOTICE("\The [grind_material.solid_name] cannot be ground down to any usable reagents.")) return TRUE else if(!used_item.reagents?.total_volume) @@ -203,8 +203,8 @@ var/obj/item/stack/material/stack = thing if(istype(stack)) - var/decl/material/material = stack.get_material() - if(!material) + var/decl/material/grind_material = stack.get_material() + if(!grind_material) break var/amount_to_take = max(0,min(stack.amount, floor(remaining_volume / REAGENT_UNITS_PER_MATERIAL_SHEET))) @@ -212,7 +212,7 @@ stack.use(amount_to_take) if(QDELETED(stack)) holdingitems -= stack - beaker.add_to_reagents(material.type, (amount_to_take * REAGENT_UNITS_PER_MATERIAL_SHEET * skill_factor)) + beaker.add_to_reagents(grind_material.type, (amount_to_take * REAGENT_UNITS_PER_MATERIAL_SHEET * skill_factor)) continue else if(thing.reagents) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 079b274c59a4..db6297109b64 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -30,8 +30,8 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/obj/item/debris/scraps/scraps for(var/mat in materials) var/amount = materials[mat] - var/decl/material/material_data = GET_DECL(mat) - switch(material_data.phase_at_temperature(exposed_temperature, ambient_pressure)) + var/decl/material/burn_material = GET_DECL(mat) + switch(burn_material.phase_at_temperature(exposed_temperature, ambient_pressure)) if(MAT_PHASE_SOLID) if(!scraps) diff --git a/code/unit_tests/food_tests.dm b/code/unit_tests/food_tests.dm index d9192ca4a272..44fc77c01f66 100644 --- a/code/unit_tests/food_tests.dm +++ b/code/unit_tests/food_tests.dm @@ -127,8 +127,8 @@ grown = grown.dry_out(null, grown.get_max_drying_wetness() + 1) grown.forceMove(container) - for(var/material_key in recipe.reagents) - container.add_to_reagents(material_key, recipe.reagents[material_key]) + for(var/mat in recipe.reagents) + container.add_to_reagents(mat, recipe.reagents[mat]) if(!recipe_is_valid) QDEL_LIST(container.contents) // clean up prematurely diff --git a/code/unit_tests/materials.dm b/code/unit_tests/materials.dm index 8ad6424f271c..71791687f612 100644 --- a/code/unit_tests/materials.dm +++ b/code/unit_tests/materials.dm @@ -60,11 +60,11 @@ // This is obscene, but completeness requires it. for(var/stack_type in stack_types) for(var/tool_type in tool_types) - for(var/decl/material/material in test_materials) + for(var/decl/material/test_material in test_materials) for(var/decl/material/reinforced as anything in (test_materials + null)) // Get a linear list of all recipes available to this combination. - var/list/recipes = get_stack_recipes(material, reinforced, stack_type, tool_type, flat = TRUE) + var/list/recipes = get_stack_recipes(test_material, reinforced, stack_type, tool_type, flat = TRUE) if(!length(recipes)) continue @@ -72,7 +72,7 @@ for(var/decl/stack_recipe/recipe as anything in recipes) if(!recipe.result_type || ispath(recipe.result_type, /turf)) // Cannot exist without a loc and doesn't have matter, cannot assess here. continue - var/list/results = recipe.spawn_result(null, null, 1, material, reinforced, null) + var/list/results = recipe.spawn_result(null, null, 1, test_material, reinforced, null) var/atom/product = LAZYACCESS(results, 1) var/list/failed = list() if(!product) @@ -83,21 +83,21 @@ var/list/product_matter = list() for(var/obj/product_obj in results) product_matter = MERGE_ASSOCS_WITH_NUM_VALUES(product_matter, product_obj.get_contained_matter(include_reagents = FALSE)) - if(!material && !reinforced) + if(!test_material && !reinforced) if(length(product_matter)) failed += "unsupplied material types" - else if(material && (product_matter[material.type]) > recipe.req_amount) - failed += "excessive base material ([recipe.req_amount]/[ceil(product_matter[material.type])])" + else if(test_material && (product_matter[test_material.type]) > recipe.req_amount) + failed += "excessive base material ([recipe.req_amount]/[ceil(product_matter[test_material.type])])" else if(reinforced && (product_matter[reinforced.type]) > recipe.req_amount) failed += "excessive reinf material ([recipe.req_amount]/[ceil(product_matter[reinforced.type])])" else for(var/mat in product_matter) - if(mat != material?.type && mat != reinforced?.type) + if(mat != test_material?.type && mat != reinforced?.type) failed += "extra material type ([mat])" if(length(failed)) // Try to prune out some duplicate error spam, we have too many materials now if(!(recipe.type in seen_design_types)) - failed_designs += "[material?.type || "null mat"] - [reinforced?.type || "null reinf"] - [tool_type] - [stack_type] - [recipe.type] - [english_list(failed)]" + failed_designs += "[test_material?.type || "null mat"] - [reinforced?.type || "null reinf"] - [tool_type] - [stack_type] - [recipe.type] - [english_list(failed)]" seen_design_types += recipe.type failed_count++ else diff --git a/mods/content/integrated_electronics/circuit_serialization.dm b/mods/content/integrated_electronics/circuit_serialization.dm index fd6eda7eabf7..11eb269e0520 100644 --- a/mods/content/integrated_electronics/circuit_serialization.dm +++ b/mods/content/integrated_electronics/circuit_serialization.dm @@ -293,8 +293,8 @@ // Update estimated assembly complexity, taken space and material cost blocks["complexity"] += component.complexity blocks["used_space"] += component.size - for(var/material in component.matter) - blocks["cost"][material] += component.matter[material] + for(var/mat in component.matter) + blocks["cost"][mat] += component.matter[mat] // Check if the assembly requires printer upgrades if(!(component.spawn_flags & IC_SPAWN_DEFAULT)) diff --git a/mods/content/integrated_electronics/components/input.dm b/mods/content/integrated_electronics/components/input.dm index 0e0492966ced..30268d3cb5da 100644 --- a/mods/content/integrated_electronics/components/input.dm +++ b/mods/content/integrated_electronics/components/input.dm @@ -299,8 +299,8 @@ set_pin_data(IC_OUTPUT, i, null) if(plant.seed && (plant in view(get_turf(src)))) // Like the medbot's analyzer it can be used at range. for(var/chem_path in plant.seed.chems) - var/decl/material/material = GET_DECL(chem_path) - greagents.Add(material.use_name) + var/decl/material/seed_chem = GET_DECL(chem_path) + greagents.Add(seed_chem.use_name) set_pin_data(IC_OUTPUT, 1, greagents) push_data() diff --git a/mods/content/integrated_electronics/tools/printer.dm b/mods/content/integrated_electronics/tools/printer.dm index a27fd59fe930..43077bfe89e8 100644 --- a/mods/content/integrated_electronics/tools/printer.dm +++ b/mods/content/integrated_electronics/tools/printer.dm @@ -49,14 +49,14 @@ /obj/item/integrated_circuit_printer/proc/recycle(obj/item/used_item, mob/user, obj/item/electronic_assembly/assembly) if(!used_item.canremove) //in case we have an augment circuit return - for(var/material in used_item.matter) - if(materials[material] + used_item.matter[material] > metal_max) - var/decl/material/material_datum = GET_DECL(material) - if(material_datum) - to_chat(user, "[src] can't hold any more [material_datum.name]!") + for(var/mat in used_item.matter) + if(materials[mat] + used_item.matter[mat] > metal_max) + var/decl/material/recycle_material = GET_DECL(mat) + if(recycle_material) + to_chat(user, "[src] can't hold any more [recycle_material.name]!") return - for(var/material in used_item.matter) - materials[material] += used_item.matter[material] + for(var/mat in used_item.matter) + materials[mat] += used_item.matter[mat] if(assembly) assembly.remove_component(used_item) if(user) @@ -152,9 +152,9 @@ else HTML += "Materials: " var/list/dat = list() - for(var/material in materials) - var/decl/material/material_datum = GET_DECL(material) - dat += "[materials[material]]/[metal_max] [material_datum.name]" + for(var/mat in materials) + var/decl/material/print_material = GET_DECL(mat) + dat += "[materials[mat]]/[metal_max] [print_material.name]" HTML += jointext(dat, "; ") HTML += ".

    " @@ -296,8 +296,8 @@ if(!subtract_material_costs(cost, usr)) return var/cloning_time = 0 - for(var/material in cost) - cloning_time += cost[material] + for(var/mat in cost) + cloning_time += cost[mat] cloning_time = round(cloning_time/15) cloning_time = min(cloning_time, MAX_CIRCUIT_CLONE_TIME) cloning = TRUE @@ -313,19 +313,19 @@ to_chat(usr, "Cloning has been canceled. Cost has been refunded.") cloning = FALSE var/cost = program["cost"] - for(var/material in cost) - materials[material] = min(metal_max, materials[material] + cost[material]) + for(var/mat in cost) + materials[mat] = min(metal_max, materials[mat] + cost[mat]) interact(usr) /obj/item/integrated_circuit_printer/proc/subtract_material_costs(var/list/cost, var/mob/user) - for(var/material in cost) - if(materials[material] < cost[material]) - var/decl/material/material_datum = GET_DECL(material) - to_chat(user, "You need [cost[material]] [material_datum.name] to build that!") + for(var/mat in cost) + if(materials[mat] < cost[mat]) + var/decl/material/print_material = GET_DECL(mat) + to_chat(user, "You need [cost[mat]] [print_material.name] to build that!") return FALSE - for(var/material in cost) //Iterate twice to make sure it's going to work before deducting - materials[material] -= cost[material] + for(var/mat in cost) //Iterate twice to make sure it's going to work before deducting + materials[mat] -= cost[mat] return TRUE // FUKKEN UPGRADE DISKS diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index 769f8c631d61..19c61ced8d9b 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -32,8 +32,8 @@ return TRUE . = ..() -/obj/item/slime_extract/Initialize(var/ml, var/material, var/_stype = /decl/slime_colour/grey) - . = ..(ml, material) +/obj/item/slime_extract/Initialize(var/ml, var/mat, var/_stype = /decl/slime_colour/grey) + . = ..(ml, mat) slime_type = _stype if(!ispath(slime_type, /decl/slime_colour)) PRINT_STACK_TRACE("Slime extract initialized with non-decl slime colour: [slime_type || "NULL"].") diff --git a/mods/gamemodes/cult/materials.dm b/mods/gamemodes/cult/materials.dm index e014bd441ec4..a606e344ad5c 100644 --- a/mods/gamemodes/cult/materials.dm +++ b/mods/gamemodes/cult/materials.dm @@ -12,7 +12,7 @@ exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/solid/stone/cult/place_dismantled_girder(var/turf/target) +/decl/material/solid/stone/cult/place_dismantled_girder(var/turf/target, var/decl/material/r_mat) return list(new /obj/structure/girder/cult(target)) /decl/material/solid/stone/cult/reinforced From e9319b63a574e5f6a6d83ce008b85943ca91bcce Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 23:26:46 +1100 Subject: [PATCH 72/93] Replacing floor_material with material. --- code/game/atom_material.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/blast_door.dm | 2 +- code/game/objects/items/_item_materials.dm | 4 --- .../structures/_structure_materials.dm | 4 --- code/game/turfs/floors/_floor.dm | 4 +-- code/game/turfs/floors/floor_materials.dm | 17 +++++------- .../turfs/floors/subtypes/floor_concrete.dm | 2 +- code/game/turfs/floors/subtypes/floor_path.dm | 26 +++++++++---------- code/game/turfs/floors/subtypes/floor_rock.dm | 10 +++---- code/game/turfs/walls/_wall.dm | 4 --- .../random_exoplanet/planet_types/meat.dm | 2 +- 12 files changed, 32 insertions(+), 47 deletions(-) diff --git a/code/game/atom_material.dm b/code/game/atom_material.dm index 7313f51691fa..91bfa983ba44 100644 --- a/code/game/atom_material.dm +++ b/code/game/atom_material.dm @@ -2,7 +2,7 @@ //Will we ever need to return more than one value here? Or should we just return the "dominant" material. /atom/proc/get_material() RETURN_TYPE(/decl/material) - return + return material //mostly for convenience /atom/proc/get_material_type() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 8c44f0f99c0b..930c9329ae6e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -42,7 +42,7 @@ var/aiDisabledIdScanner = 0 var/aiHacking = 0 autoclose = 1 - var/mineral = null + var/mineral = null // TODO: replace with material and get_material() var/justzap = 0 var/safe = 1 var/speaker = 1 diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index ca111e877bcf..0b1c0084639b 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -36,7 +36,7 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 - var/decl/material/implicit_material + var/decl/material/implicit_material // TODO: replace with material and get_material() autoset_access = FALSE // Uses different system with buttons. pry_mod = 1.35 diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 893b901af7c8..2a269fac6c9b 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -53,10 +53,6 @@ material.place_shards(T) qdel(src) -/obj/item/get_material() - RETURN_TYPE(/decl/material) - return material - // TODO: Refactor more code to use this where necessary, and then make this use // some sort of generalized system for hitting with different parts of an item // e.g. pommel vs blade, rifle butt vs bayonet, knife hilt vs blade diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index a6c98ee0a1bc..ccb8ddf43076 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -5,10 +5,6 @@ /// The base alpha used to calculate material-based alpha in update_material_color(). var/base_alpha = 50 -/obj/structure/get_material() - RETURN_TYPE(/decl/material) - return material - /obj/structure/proc/get_material_health_modifier() . = 1 diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 22123008d757..bed01a51616d 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -32,7 +32,7 @@ . = ..(ml) - set_turf_materials(floor_material, skip_update = TRUE) + set_turf_materials(material, skip_update = TRUE) if(!floortype && (ispath(_flooring) || islist(_flooring))) floortype = _flooring @@ -44,7 +44,7 @@ fill_to_zero_height() // try to refill turfs that act as fluid sources - if(floor_material || get_topmost_flooring()) + if(material || get_topmost_flooring()) update_from_flooring(skip_update = ml) if(ml) // We skipped the update above to avoid updating our neighbors, but we need to update ourselves. lazy_update_icon() diff --git a/code/game/turfs/floors/floor_materials.dm b/code/game/turfs/floors/floor_materials.dm index 17dbe09f0a91..213deaca53b1 100644 --- a/code/game/turfs/floors/floor_materials.dm +++ b/code/game/turfs/floors/floor_materials.dm @@ -1,17 +1,14 @@ -/turf/floor - VAR_PROTECTED/decl/material/floor_material - /turf/floor/set_turf_materials(decl/material/new_material, decl/material/new_reinf_material, force, decl/material/new_girder_material, skip_update) if(ispath(new_material)) new_material = GET_DECL(new_material) - if(floor_material != new_material || force) - floor_material = new_material - if(!istype(floor_material)) - if(floor_material) - PRINT_STACK_TRACE("Floor turf has been supplied non-material '[istype(floor_material, /datum) ? floor_material.type : (floor_material || "NULL")]'.") - floor_material = get_default_material() + if(material != new_material || force) + material = new_material + if(!istype(material)) + if(material) + PRINT_STACK_TRACE("Floor turf has been supplied non-material '[istype(material, /datum) ? material.type : (material || "NULL")]'.") + material = get_default_material() . = TRUE if(. && !skip_update) @@ -21,4 +18,4 @@ var/decl/flooring/flooring = get_topmost_flooring() if(istype(flooring) && istype(flooring.force_material)) return flooring.force_material - return floor_material + return material diff --git a/code/game/turfs/floors/subtypes/floor_concrete.dm b/code/game/turfs/floors/subtypes/floor_concrete.dm index 7e8056a04c70..60303ef1ee79 100644 --- a/code/game/turfs/floors/subtypes/floor_concrete.dm +++ b/code/game/turfs/floors/subtypes/floor_concrete.dm @@ -4,7 +4,7 @@ icon_state = "inset" _flooring = /decl/flooring/concrete _base_flooring = /decl/flooring/dirt - floor_material = /decl/material/solid/stone/concrete + material = /decl/material/solid/stone/concrete /turf/floor/concrete/smooth icon_state = "concrete" diff --git a/code/game/turfs/floors/subtypes/floor_path.dm b/code/game/turfs/floors/subtypes/floor_path.dm index 7d714f8efab9..b67e06bf1b70 100644 --- a/code/game/turfs/floors/subtypes/floor_path.dm +++ b/code/game/turfs/floors/subtypes/floor_path.dm @@ -1,18 +1,18 @@ /turf/floor/path - name = "path" - gender = NEUTER - desc = "A cobbled path made of loose stones." - color = COLOR_GRAY - icon = 'icons/turf/flooring/path.dmi' - icon_state = "cobble0" - _flooring = /decl/flooring/path/cobblestone - floor_material = /decl/material/solid/stone/sandstone - _base_flooring = /decl/flooring/dirt + name = "path" + gender = NEUTER + desc = "A cobbled path made of loose stones." + color = COLOR_GRAY + icon = 'icons/turf/flooring/path.dmi' + icon_state = "cobble0" + _flooring = /decl/flooring/path/cobblestone + material = /decl/material/solid/stone/sandstone + _base_flooring = /decl/flooring/dirt /turf/floor/path/Initialize(mapload, no_update_icon) . = ..() - set_turf_materials(floor_material || get_strata_material_type() || /decl/material/solid/stone/sandstone, skip_update = no_update_icon) + set_turf_materials(material || get_strata_material_type() || /decl/material/solid/stone/sandstone, skip_update = no_update_icon) if(mapload && is_outside() && prob(20)) var/image/moss = image('icons/effects/decals/plant_remains.dmi', "leafy_bits", DECAL_LAYER) moss.pixel_x = rand(-6, 6) @@ -39,15 +39,15 @@ #define PATH_MATERIAL_SUBTYPES(material_name) \ /turf/floor/path/##material_name { \ color = /decl/material/solid/stone/##material_name::color; \ - floor_material = /decl/material/solid/stone/##material_name; \ + material = /decl/material/solid/stone/##material_name; \ } \ /turf/floor/path/herringbone/##material_name { \ color = /decl/material/solid/stone/##material_name::color; \ - floor_material = /decl/material/solid/stone/##material_name; \ + material = /decl/material/solid/stone/##material_name; \ } \ /turf/floor/path/running_bond/##material_name { \ color = /decl/material/solid/stone/##material_name::color; \ - floor_material = /decl/material/solid/stone/##material_name; \ + material = /decl/material/solid/stone/##material_name; \ } \ /turf/floor/path/##material_name/water { \ color = COLOR_SKY_BLUE; \ diff --git a/code/game/turfs/floors/subtypes/floor_rock.dm b/code/game/turfs/floors/subtypes/floor_rock.dm index de364ec1cc90..a0e1194fda70 100644 --- a/code/game/turfs/floors/subtypes/floor_rock.dm +++ b/code/game/turfs/floors/subtypes/floor_rock.dm @@ -6,12 +6,12 @@ /turf/floor/rock/Initialize(mapload, no_update_icon) . = ..() - set_turf_materials(floor_material || get_strata_material_type() || /decl/material/solid/stone/sandstone, skip_update = no_update_icon) + set_turf_materials(material || get_strata_material_type() || /decl/material/solid/stone/sandstone, skip_update = no_update_icon) /turf/floor/rock/volcanic - name = "volcanic floor" - floor_material = /decl/material/solid/stone/basalt + name = "volcanic floor" + material = /decl/material/solid/stone/basalt /turf/floor/rock/basalt - color = /decl/material/solid/stone/basalt::color - floor_material = /decl/material/solid/stone/basalt + color = /decl/material/solid/stone/basalt::color + material = /decl/material/solid/stone/basalt diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 119683c5413c..1d26dbb74a65 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -121,10 +121,6 @@ var/global/list/wall_fullblend_objects = list( if(!radiate()) return PROCESS_KILL -/turf/wall/get_material() - RETURN_TYPE(/decl/material) - return material - /turf/wall/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj,/obj/item/projectile/beam)) burn(2500) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm index 95ad399b57d1..533174a5fa11 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm @@ -132,7 +132,7 @@ icon = 'icons/turf/flooring/flesh.dmi' icon_state = "meat" _base_flooring = /decl/flooring/meat - floor_material = /decl/material/solid/organic/meat + material = /decl/material/solid/organic/meat /turf/floor/meat/acid name = "juices" From fc3dc4571f58bd7aae7bb195e16aeaa6c5e4e9e2 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 23:28:33 +1100 Subject: [PATCH 73/93] Replaces implicit_material with material. --- code/game/machinery/doors/blast_door.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 0b1c0084639b..830d9f241672 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -36,7 +36,6 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 - var/decl/material/implicit_material // TODO: replace with material and get_material() autoset_access = FALSE // Uses different system with buttons. pry_mod = 1.35 @@ -54,7 +53,7 @@ base_type = /obj/machinery/door/blast /obj/machinery/door/blast/Initialize() - implicit_material = GET_DECL(/decl/material/solid/metal/plasteel) + material = GET_DECL(/decl/material/solid/metal/plasteel) . = ..() /obj/machinery/door/blast/get_examine_strings(mob/user, distance, infix, suffix) @@ -137,10 +136,6 @@ else force_close() -/obj/machinery/door/blast/get_material() - RETURN_TYPE(/decl/material) - return implicit_material - // Proc: attackby() // Parameters: 2 (used_item - Item this object was clicked with, user - Mob which clicked this object) // Description: If we are clicked with crowbar or wielded fire axe, try to manually open the door. From a8cee8a889ac66d0140161edca85d2bf5c0e5562 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 23:35:29 +1100 Subject: [PATCH 74/93] Replaces airlock mineral with material, replaces glass_material with reinf_material. --- code/game/machinery/doors/airlock.dm | 83 ++++++------- code/game/machinery/doors/airlock_subtypes.dm | 18 +-- code/game/machinery/doors/double.dm | 6 - code/game/objects/structures/door_assembly.dm | 113 ++++++++++-------- 4 files changed, 101 insertions(+), 119 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 930c9329ae6e..b19b2f20f189 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -15,14 +15,12 @@ icon_state = "preview" power_channel = ENVIRON interact_offline = FALSE - explosion_resistance = 10 - base_type = /obj/machinery/door/airlock frame_type = /obj/structure/door_assembly - icon_state_open = "open" icon_state_closed = "closed" + material = /decl/material/solid/metal/steel var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = 0 // if 1, this door can't be hacked by the AI @@ -42,7 +40,7 @@ var/aiDisabledIdScanner = 0 var/aiHacking = 0 autoclose = 1 - var/mineral = null // TODO: replace with material and get_material() + var/justzap = 0 var/safe = 1 var/speaker = 1 @@ -75,29 +73,21 @@ var/stripe_color = null var/symbol_color = null var/window_color = null - var/window_material = /decl/material/solid/glass - - var/fill_file = 'icons/obj/doors/station/fill_steel.dmi' - var/color_file = 'icons/obj/doors/station/color.dmi' - var/color_fill_file = 'icons/obj/doors/station/fill_color.dmi' - var/stripe_file = 'icons/obj/doors/station/stripe.dmi' - var/stripe_fill_file = 'icons/obj/doors/station/fill_stripe.dmi' - var/glass_file = 'icons/obj/doors/station/fill_glass.dmi' - var/bolts_file = 'icons/obj/doors/station/lights_bolts.dmi' - var/deny_file = 'icons/obj/doors/station/lights_deny.dmi' - var/lights_file = 'icons/obj/doors/station/lights_green.dmi' - var/panel_file = 'icons/obj/doors/station/panel.dmi' - var/sparks_damaged_file = 'icons/obj/doors/station/sparks_damaged.dmi' - var/sparks_broken_file = 'icons/obj/doors/station/sparks_broken.dmi' - var/welded_file = 'icons/obj/doors/station/welded.dmi' - var/emag_file = 'icons/obj/doors/station/emag.dmi' -/obj/machinery/door/airlock/get_material() - RETURN_TYPE(/decl/material) - return GET_DECL(mineral ? mineral : /decl/material/solid/metal/steel) - -/obj/machinery/door/airlock/proc/get_window_material() - return GET_DECL(window_material) + var/fill_file = 'icons/obj/doors/station/fill_steel.dmi' + var/color_file = 'icons/obj/doors/station/color.dmi' + var/color_fill_file = 'icons/obj/doors/station/fill_color.dmi' + var/stripe_file = 'icons/obj/doors/station/stripe.dmi' + var/stripe_fill_file = 'icons/obj/doors/station/fill_stripe.dmi' + var/glass_file = 'icons/obj/doors/station/fill_glass.dmi' + var/bolts_file = 'icons/obj/doors/station/lights_bolts.dmi' + var/deny_file = 'icons/obj/doors/station/lights_deny.dmi' + var/lights_file = 'icons/obj/doors/station/lights_green.dmi' + var/panel_file = 'icons/obj/doors/station/panel.dmi' + var/sparks_damaged_file = 'icons/obj/doors/station/sparks_damaged.dmi' + var/sparks_broken_file = 'icons/obj/doors/station/sparks_broken.dmi' + var/welded_file = 'icons/obj/doors/station/welded.dmi' + var/emag_file = 'icons/obj/doors/station/emag.dmi' /obj/machinery/door/airlock/Process() if(main_power_lost_until > 0 && world.time >= main_power_lost_until) @@ -324,15 +314,15 @@ About the new airlock wires panel: set_light(0) - if(door_color && !(door_color == "none")) + if(door_color) var/ikey = "[airlock_type]-[door_color]-color" color_overlay = airlock_icon_cache["[ikey]"] if(!color_overlay) color_overlay = new(color_file) color_overlay.Blend(door_color, ICON_MULTIPLY) airlock_icon_cache["[ikey]"] = color_overlay - if(glass) - if (window_color && window_color != "none") + if(reinf_material) + if (window_color) var/ikey = "[airlock_type]-[window_color]-windowcolor" filling_overlay = airlock_icon_cache["[ikey]"] if (!filling_overlay) @@ -342,7 +332,7 @@ About the new airlock wires panel: else filling_overlay = glass_file else - if(door_color && !(door_color == "none")) + if(door_color) var/ikey = "[airlock_type]-[door_color]-fillcolor" filling_overlay = airlock_icon_cache["[ikey]"] if(!filling_overlay) @@ -866,9 +856,8 @@ About the new airlock wires panel: var/obj/structure/door_assembly/da = ..() // Note that we're deleted here already. Don't do unsafe stuff. . = da - if(mineral) - da.glass_material = mineral - da.glass = 1 + if(da.can_install_glass) + da.reinf_material = reinf_material da.paintable = paintable da.door_color = door_color @@ -1026,6 +1015,10 @@ About the new airlock wires panel: return ..(M) /obj/machinery/door/airlock/Initialize(var/mapload, var/d, var/populate_parts = TRUE, obj/structure/door_assembly/assembly = null) + + material = RESOLVE_TO_DECL(material) + reinf_material = RESOLVE_TO_DECL(reinf_material) + . = ..() //wires @@ -1048,27 +1041,22 @@ About the new airlock wires panel: else if(!begins_closed) queue_icon_update() - if (glass) + if(reinf_material) paintable |= PAINT_WINDOW_PAINTABLE - if (!window_color) - var/decl/material/window = get_window_material() - window_color = window.color + paint_window(reinf_material.color) /obj/machinery/door/airlock/inherit_from_assembly(obj/structure/door_assembly/assembly) //if assembly is given, create the new door from the assembly if (..(assembly)) - var/decl/material/mat = GET_DECL(assembly.glass_material) - - if(assembly.glass == 1) // supposed to use material in this case - mineral = assembly.glass_material - if(mat.opacity <= 0.7) - glass = TRUE + if(assembly.reinf_material && assembly.can_install_glass) + material = assembly.reinf_material + if(assembly.reinf_material.opacity <= 0.7) set_opacity(0) hitsound = 'sound/effects/Glasshit.ogg' max_health = 300 explosion_resistance = 5 else - door_color = mat.color + door_color = assembly.reinf_material.color else door_color = assembly.door_color @@ -1076,7 +1064,7 @@ About the new airlock wires panel: if(assembly.created_name) SetName(assembly.created_name) else - SetName("[mineral ? "[mat.solid_name || mat.name] airlock" : assembly.base_name]") + SetName("[material ? "[material.solid_name || material.name] airlock" : assembly.base_name]") paintable = assembly.paintable stripe_color = assembly.stripe_color @@ -1149,9 +1137,8 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/paint_window(new_color) if (new_color) window_color = new_color - else if (window_material) - var/decl/material/window = get_window_material() - window_color = window.color + else if (reinf_material) + window_color = reinf_material.color else window_color = GLASS_COLOR queue_icon_update() diff --git a/code/game/machinery/doors/airlock_subtypes.dm b/code/game/machinery/doors/airlock_subtypes.dm index b3474720a5f6..f2eda23a2f77 100644 --- a/code/game/machinery/doors/airlock_subtypes.dm +++ b/code/game/machinery/doors/airlock_subtypes.dm @@ -11,7 +11,6 @@ stripe_color = COLOR_NT_RED /obj/machinery/door/airlock/engineering - name = "Maintenance Hatch" door_color = COLOR_AMBER /obj/machinery/door/airlock/medical @@ -27,7 +26,6 @@ stripe_color = COLOR_GREEN /obj/machinery/door/airlock/mining - name = "Mining Airlock" door_color = COLOR_PALE_ORANGE stripe_color = COLOR_BEASTY_BROWN @@ -53,24 +51,20 @@ stripe_color = COLOR_GRAY20 /obj/machinery/door/airlock/freezer - name = "Freezer Airlock" door_color = COLOR_WHITE /obj/machinery/door/airlock/maintenance - name = "Maintenance Access" stripe_color = COLOR_AMBER // Glass airlock presets - /obj/machinery/door/airlock/glass - name = "Glass Airlock" icon_state = "preview_glass" hitsound = 'sound/effects/Glasshit.ogg' max_health = 300 explosion_resistance = 5 opacity = FALSE - glass = TRUE + reinf_material = /decl/material/solid/glass /obj/machinery/door/airlock/glass/command door_color = COLOR_COMMAND_BLUE @@ -120,7 +114,6 @@ door_color = COLOR_WHITE /obj/machinery/door/airlock/glass/maintenance - name = "Maintenance Access" stripe_color = COLOR_AMBER /obj/machinery/door/airlock/glass/civilian @@ -130,8 +123,7 @@ // External airlock presets /obj/machinery/door/airlock/external - airlock_type = "External" - name = "External Airlock" + airlock_type = "external" icon = 'icons/obj/doors/external/door.dmi' fill_file = 'icons/obj/doors/external/fill_steel.dmi' color_file = 'icons/obj/doors/external/color.dmi' @@ -160,7 +152,6 @@ LAZYADD(., access_external_airlocks) /obj/machinery/door/airlock/external/escapepod - name = "Escape Pod" locked = TRUE /obj/machinery/door/airlock/external/escapepod/attackby(obj/item/used_item, mob/user) @@ -210,14 +201,12 @@ /obj/machinery/door/airlock/centcom airlock_type = "centcomm" - name = "\improper Airlock" icon = 'icons/obj/doors/centcomm/door.dmi' fill_file = 'icons/obj/doors/centcomm/fill_steel.dmi' paintable = PAINT_PAINTABLE|PAINT_STRIPABLE /obj/machinery/door/airlock/highsecurity airlock_type = "secure" - name = "Secure Airlock" icon = 'icons/obj/doors/secure/door.dmi' fill_file = 'icons/obj/doors/secure/fill_steel.dmi' explosion_resistance = 20 @@ -232,7 +221,6 @@ /obj/machinery/door/airlock/hatch airlock_type = "hatch" - name = "\improper Airtight Hatch" icon = 'icons/obj/doors/hatch/door.dmi' fill_file = 'icons/obj/doors/hatch/fill_steel.dmi' stripe_file = 'icons/obj/doors/hatch/stripe.dmi' @@ -249,7 +237,6 @@ paintable = PAINT_STRIPABLE /obj/machinery/door/airlock/hatch/maintenance - name = "Maintenance Hatch" stripe_color = COLOR_AMBER /obj/machinery/door/airlock/hatch/maintenance/bolted @@ -257,7 +244,6 @@ /obj/machinery/door/airlock/vault airlock_type = "vault" - name = "Vault" icon = 'icons/obj/doors/vault/door.dmi' fill_file = 'icons/obj/doors/vault/fill_steel.dmi' explosion_resistance = 20 diff --git a/code/game/machinery/doors/double.dm b/code/game/machinery/doors/double.dm index 4bfc77f73631..134f2a3ef11d 100644 --- a/code/game/machinery/doors/double.dm +++ b/code/game/machinery/doors/double.dm @@ -84,7 +84,6 @@ door_color = COLOR_NT_RED /obj/machinery/door/airlock/double/engineering - name = "Maintenance Hatch" door_color = COLOR_AMBER /obj/machinery/door/airlock/double/medical @@ -96,7 +95,6 @@ stripe_color = COLOR_GREEN /obj/machinery/door/airlock/double/mining - name = "Mining Airlock" door_color = COLOR_PALE_ORANGE stripe_color = COLOR_BEASTY_BROWN @@ -116,18 +114,15 @@ door_color = COLOR_BLUE_GRAY /obj/machinery/door/airlock/double/maintenance - name = "Maintenance Access" stripe_color = COLOR_AMBER /obj/machinery/door/airlock/double/civilian stripe_color = COLOR_CIVIE_GREEN /obj/machinery/door/airlock/double/freezer - name = "Freezer Airlock" door_color = COLOR_WHITE /obj/machinery/door/airlock/double/glass - name = "Glass Airlock" opacity = FALSE glass = TRUE @@ -175,7 +170,6 @@ door_color = COLOR_WHITE /obj/machinery/door/airlock/double/glass/maintenance - name = "Maintenance Access" stripe_color = COLOR_AMBER /obj/machinery/door/airlock/double/glass/civilian diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index cf7af2c01748..04cd6b7e88f7 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -5,22 +5,43 @@ anchored = FALSE density = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED + + material = /decl/material/solid/metal/steel + material_alteration = MAT_FLAG_ALTERATION_NAME + + var/can_install_glass = TRUE var/state = 0 - var/base_name = "Airlock" + var/base_name = "airlock assembly" var/obj/item/stock_parts/circuitboard/airlock_electronics/electronics = null var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed - var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. - var/glass_material = /decl/material/solid/glass // if this door was to built right now and be made of glass, what material should the glass be? var/created_name = null var/panel_icon = 'icons/obj/doors/station/panel.dmi' var/fill_icon = 'icons/obj/doors/station/fill_steel.dmi' var/glass_icon = 'icons/obj/doors/station/fill_glass.dmi' var/paintable = PAINT_PAINTABLE|PAINT_STRIPABLE - var/door_color = "none" - var/stripe_color = "none" - var/symbol_color = "none" + var/door_color + var/stripe_color + var/symbol_color var/width = 1 // For multi-tile doors +/obj/structure/door_assembly/update_material_name(override_name) + var/modifier + switch (state) + if(0) + if(anchored) + modifier = "secured " + if(1) + modifier = "wired " + if(2) + modifier = "near-finished " + if(reinf_material) + SetName("[modifier][reinf_material.solid_name] window [base_name]") + else + SetName("[modifier][base_name]") + +/obj/structure/door_assembly/window + reinf_material = /decl/material/solid/glass + /obj/structure/door_assembly/Initialize(mapload, _mat, _reinf_mat, _dir) . = ..(mapload, _mat, _reinf_mat) set_dir(_dir) @@ -52,10 +73,9 @@ if(0) LAZYADD(., "Use a wrench to [anchored ? "un" : ""]anchor it.") if(!anchored) - if(glass == 1) - var/decl/material/glass_material_datum = GET_DECL(glass_material) - if(glass_material_datum) - var/mat_name = glass_material_datum.solid_name || glass_material_datum.name + if(can_install_glass) + if(reinf_material) + var/mat_name = reinf_material.solid_name || reinf_material.name LAZYADD(., "Use a welder to remove the [mat_name] plating currently attached.") else LAZYADD(., "Use a welder to disassemble completely.") @@ -72,23 +92,23 @@ icon = 'icons/obj/doors/hatch/door.dmi' panel_icon = 'icons/obj/doors/hatch/panel.dmi' fill_icon = 'icons/obj/doors/hatch/fill_steel.dmi' - base_name = "Airtight Hatch" + base_name = "airtight hatch" airlock_type = /obj/machinery/door/airlock/hatch - glass = -1 + can_install_glass = FALSE /obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly icon = 'icons/obj/doors/secure/door.dmi' fill_icon = 'icons/obj/doors/secure/fill_steel.dmi' - base_name = "High Security Airlock" + base_name = "high security airlock" airlock_type = /obj/machinery/door/airlock/highsecurity - glass = -1 + can_install_glass = FALSE paintable = 0 /obj/structure/door_assembly/door_assembly_ext icon = 'icons/obj/doors/external/door.dmi' fill_icon = 'icons/obj/doors/external/fill_steel.dmi' glass_icon = 'icons/obj/doors/external/fill_glass.dmi' - base_name = "External Airlock" + base_name = "external airlock" airlock_type = /obj/machinery/door/airlock/external paintable = 0 @@ -105,7 +125,7 @@ icon = 'icons/obj/doors/rapid_pdoor.dmi' icon_state = "pdoor1" airlock_type = /obj/machinery/door/blast/regular - glass = -1 + can_install_glass = FALSE paintable = 0 /obj/structure/door_assembly/blast/on_update_icon() @@ -135,23 +155,21 @@ created_name = t return TRUE - if(IS_WELDER(used_item) && (glass == 1 || !anchored)) + if(IS_WELDER(used_item) && (can_install_glass || !anchored)) var/obj/item/weldingtool/welder = used_item if (welder.weld(0, user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - if(glass == 1) - var/decl/material/glass_material_datum = GET_DECL(glass_material) - if(glass_material_datum) - var/mat_name = glass_material_datum.solid_name || glass_material_datum.name - user.visible_message("[user] welds the [mat_name] plating off the airlock assembly.", "You start to weld the [mat_name] plating off the airlock assembly.") - if(do_after(user, 4 SECONDS, src)) - if(!welder.isOn()) - return TRUE - to_chat(user, "You welded the [mat_name] plating off!") - glass_material_datum.create_object(get_turf(src), 2) - glass = 0 - update_icon() - return TRUE + if(reinf_material) + var/mat_name = reinf_material.solid_name + user.visible_message("[user] welds the [mat_name] plating off the airlock assembly.", "You start to weld the [mat_name] plating off the airlock assembly.") + if(do_after(user, 4 SECONDS, src)) + if(!welder.isOn()) + return TRUE + to_chat(user, "You welded the [mat_name] plating off!") + reinf_material.create_object(get_turf(src), 2) + reinf_material = null + update_icon() + return TRUE if(!anchored) user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.") if(do_after(user, 4 SECONDS, src)) @@ -243,17 +261,16 @@ update_icon() return TRUE - else if(istype(used_item, /obj/item/stack/material) && !glass) + else if(istype(used_item, /obj/item/stack/material) && can_install_glass && !reinf_material) var/obj/item/stack/material/S = used_item - var/material_name = S.get_material_type() + var/decl/material/sheet_material = S.get_material() if (S.get_amount() >= 2) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") - if(do_after(user, 4 SECONDS, src) && !glass) + if(do_after(user, 4 SECONDS, src) && can_install_glass && !reinf_material) if (S.use(2)) - to_chat(user, "You installed reinforced glass windows into the airlock assembly.") - glass = 1 - glass_material = material_name + reinf_material = sheet_material + to_chat(user, "You installed [reinf_material.solid_name] windows into the airlock assembly.") update_icon() return TRUE return FALSE @@ -274,24 +291,22 @@ /obj/structure/door_assembly/on_update_icon() ..() + var/image/filling_overlay - var/image/panel_overlay - var/final_name = "" - if(glass == 1) + if(reinf_material) filling_overlay = image(glass_icon, "construction") + filling_overlay.color = reinf_material.color + filling_overlay.appearance_flags |= RESET_COLOR else filling_overlay = image(fill_icon, "construction") - switch (state) - if(0) - if (anchored) - final_name = "Secured " + if(filling_overlay) + add_overlay(filling_overlay) + + var/image/panel_overlay + switch(state) if(1) - final_name = "Wired " panel_overlay = image(panel_icon, "construction0") if(2) - final_name = "Near Finished " panel_overlay = image(panel_icon, "construction1") - final_name += "[glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly" - SetName(final_name) - add_overlay(filling_overlay) - add_overlay(panel_overlay) + if(panel_overlay) + add_overlay(panel_overlay) From e44fedf43f1b420e2ebbc887e2290dc935a28777 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sat, 25 Oct 2025 00:00:43 +1100 Subject: [PATCH 75/93] Reworking how chems are tracked on /datum/seed. --- code/__defines/hydroponics.dm | 6 + .../codex/categories/category_substances.dm | 6 +- .../genetics/plants/gene_biochemistry.dm | 15 +- code/modules/hydroponics/grown.dm | 56 ++-- .../hydroponics/plant_types/seeds_herbs.dm | 38 +-- .../hydroponics/plant_types/seeds_misc.dm | 283 ++++++++++-------- code/modules/hydroponics/seed.dm | 45 +-- code/modules/hydroponics/seed_composition.dm | 21 ++ .../hydroponics/spreading/spreading.dm | 2 +- .../hydroponics/spreading/spreading_growth.dm | 4 +- .../random_exoplanet/flora_generator.dm | 10 +- .../random_exoplanet/planet_types/meat.dm | 6 +- .../components/input.dm | 2 +- mods/species/drakes/sifpod.dm | 6 +- nebula.dme | 1 + 15 files changed, 279 insertions(+), 222 deletions(-) create mode 100644 code/modules/hydroponics/seed_composition.dm diff --git a/code/__defines/hydroponics.dm b/code/__defines/hydroponics.dm index e40a83850d8b..9d0163f585e6 100644 --- a/code/__defines/hydroponics.dm +++ b/code/__defines/hydroponics.dm @@ -62,3 +62,9 @@ #define GROWTH_VINES "vines" #define GROWTH_BIOMASS "mass" #define GROWTH_MOLD "mold" + +#define PLANT_SEG_BODY "body" // Non-dissectable plants + +#define PLANT_STATE_FRESH "fresh" +#define PLANT_STATE_ROASTED "roasted" +#define PLANT_STATE_DRIED "dried" diff --git a/code/modules/codex/categories/category_substances.dm b/code/modules/codex/categories/category_substances.dm index 9d2c5ab8c95e..1c7763343dbf 100644 --- a/code/modules/codex/categories/category_substances.dm +++ b/code/modules/codex/categories/category_substances.dm @@ -64,13 +64,13 @@ else if(mat.solvent_power <= MAT_SOLVENT_STRONG) material_info += "
  • It is a strong solvent and will burn exposed skin on contact.
  • " if(mat.dissolves_in != MAT_SOLVENT_IMMUNE && LAZYLEN(mat.dissolves_into)) - var/chems = list() + var/list/chemicals = list() for(var/chemical in mat.dissolves_into) var/decl/material/chemical_decl = GET_DECL(chemical) var/material_link = "[chemical_decl.name]" if(chemical_decl.hidden_from_codex) material_link = chemical_decl.name - chems += "[material_link] ([mat.dissolves_into[chemical]*100]%)" + chemicals += "[material_link] ([mat.dissolves_into[chemical]*100]%)" var/solvent_needed if(mat.dissolves_in <= MAT_SOLVENT_NONE) solvent_needed = "any liquid" @@ -80,7 +80,7 @@ solvent_needed = "a moderately strong solvent, like acetone" else if(mat.dissolves_in <= MAT_SOLVENT_STRONG) solvent_needed = "a strong solvent, like sulfuric acid" - material_info += "
  • It can be dissolved with [solvent_needed] solvent, producing [english_list(chems)].
  • " + material_info += "
  • It can be dissolved with [solvent_needed] solvent, producing [english_list(chemicals)].
  • " if(mat.radioactivity) material_info += "
  • It is radioactive.
  • " if(mat.flags & MAT_FLAG_FUSION_FUEL) diff --git a/code/modules/genetics/plants/gene_biochemistry.dm b/code/modules/genetics/plants/gene_biochemistry.dm index 296eebe4fbfe..74276d797a6f 100644 --- a/code/modules/genetics/plants/gene_biochemistry.dm +++ b/code/modules/genetics/plants/gene_biochemistry.dm @@ -19,22 +19,23 @@ seed.produces_pollen = LAZYACCESS(gene.values, TRAIT_POLLEN) - LAZYINITLIST(seed.chems) var/list/gene_value = LAZYACCESS(gene.values, TRAIT_CHEMS) for(var/rid in gene_value) var/list/gene_chem = gene_value[rid] - if(!seed.chems[rid]) - seed.chems[rid] = gene_chem.Copy() + if(!seed.get_chemical_amount(rid)) + seed.set_chemical_amount(rid, gene_chem.Copy()) continue for(var/i = 1 to length(gene_chem)) if(isnull(gene_chem[i])) gene_chem[i] = 0 - if(seed.chems[rid][i]) - seed.chems[rid][i] = max(1, round((gene_chem[i] + seed.chems[rid][i])/2)) + var/list/seed_chems = seed.get_chemical_amount(rid) + if(LAZYACCESS(seed_chems, i)) + seed_chems[i] = max(1, round((gene_chem[i] + seed_chems[i])/2)) else - seed.chems[rid][i] = gene_chem[i] + seed_chems[i] = gene_chem[i] + seed.set_chemical_amount(rid, seed_chems) var/list/new_gasses = LAZYACCESS(gene.values, TRAIT_EXUDE_GASSES) if(islist(new_gasses) && length(new_gasses)) @@ -49,7 +50,7 @@ return ..() /decl/plant_gene/biochemistry/copy_initial_seed_values(datum/plantgene/gene, datum/seed/seed) - LAZYSET(gene.values, TRAIT_CHEMS, seed.chems?.Copy()) + LAZYSET(gene.values, TRAIT_CHEMS, deepCopyList(seed.get_chemical_composition())) LAZYSET(gene.values, TRAIT_EXUDE_GASSES, seed.exude_gasses?.Copy()) LAZYSET(gene.values, TRAIT_POLLEN, seed.produces_pollen) return ..() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 3f9b4b7f1503..99bd9f8962cc 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -11,6 +11,8 @@ drying_wetness = 45 dried_type = /obj/item/food/grown/dry allergen_flags = ALLERGEN_VEGETABLE + + var/plant_segment_type = PLANT_SEG_BODY // Used for growns produced via plant dissection. var/work_skill = SKILL_BOTANY var/seeds_extracted = FALSE var/datum/seed/seed @@ -35,27 +37,35 @@ else if(!seeds_extracted && seed.min_seed_extracted) . += SPAN_NOTICE("With a knife, you could extract at least [seed.min_seed_extracted] seed\s.") +/obj/item/food/grown/proc/update_base_name() + base_name = seed?.product_name || "grown" + /obj/item/food/grown/update_name() if(!seed) return ..() + update_base_name() var/descriptor = list() if(dry) descriptor += "dried" if(backyard_grilling_count > 0) descriptor += "roasted" if(length(descriptor)) - SetName("[english_list(descriptor)] [seed.product_name]") + SetName("[english_list(descriptor)] [base_name]") else - SetName("[seed.product_name]") - -/obj/item/food/grown/Initialize(mapload, material_key, skip_plate = FALSE, _seed) + SetName(base_name) +// Separated out of Initialize() for subtype overrides. +/obj/item/food/grown/proc/set_seed(_seed) if(isnull(seed) && _seed) seed = _seed - if(istext(seed)) seed = SSplants.seeds[seed] + if(!isnull(seed) && !istype(seed)) + seed = null + +/obj/item/food/grown/Initialize(mapload, material_key, skip_plate = FALSE, _seed) + set_seed(_seed) if(!istype(seed)) PRINT_STACK_TRACE("Grown initializing with null or invalid seed type '[seed || "NULL"]'") return INITIALIZE_HINT_QDEL @@ -65,7 +75,7 @@ slice_num = seed.slice_amount w_class = seed.product_w_class - if(!seed.chems && !(dry && seed.dried_chems) && !(backyard_grilling_count > 0 && seed.roasted_chems)) + if(!seed.get_chemical_composition() && !(dry && seed.get_chemical_composition(_state = PLANT_STATE_DRIED)) && !(backyard_grilling_count > 0 && seed.get_chemical_composition(_state = PLANT_STATE_ROASTED))) return INITIALIZE_HINT_QDEL // No reagent contents, no froot if(seed.scannable_result) @@ -88,7 +98,7 @@ /obj/item/food/grown/initialize_reagents(populate) if(reagents) reagents.clear_reagents() - if(!seed?.chems) + if(!length(seed?.get_chemical_composition(_segment = plant_segment_type))) return . = ..() //create_reagent and populate_reagents @@ -103,11 +113,13 @@ . = ..() // Fill the object up with the appropriate reagents. var/list/chems_to_fill + if(backyard_grilling_count > 0) - chems_to_fill ||= seed?.roasted_chems + chems_to_fill ||= seed?.get_chemical_composition(_segment = plant_segment_type, _state = PLANT_STATE_ROASTED) if(dry) - chems_to_fill ||= seed?.dried_chems - chems_to_fill ||= seed?.chems + chems_to_fill ||= seed?.get_chemical_composition(_segment = plant_segment_type, _state = PLANT_STATE_DRIED) + chems_to_fill ||= seed?.get_chemical_composition(_segment = plant_segment_type) + for(var/rid in chems_to_fill) var/list/reagent_amounts = chems_to_fill[rid] if(LAZYLEN(reagent_amounts)) @@ -180,9 +192,13 @@ . = ..() if(!seed) return - icon_state = "[seed.get_trait(TRAIT_PRODUCT_ICON)]-product" if(!dry && !backyard_grilling_count) color = seed.get_trait(TRAIT_PRODUCT_COLOUR) + update_grown_icon() + +// Separated for subtypes to override. +/obj/item/food/grown/proc/update_grown_icon() + icon_state = "[seed.get_trait(TRAIT_PRODUCT_ICON)]-product" if("[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf" in icon_states('icons/obj/hydroponics/hydroponics_products.dmi')) var/image/fruit_leaves = image('icons/obj/hydroponics/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf") if(!dry && !backyard_grilling_count) @@ -255,14 +271,16 @@ var/global/list/_wood_materials = list( seeds_extracted = TRUE return TRUE - if(IS_HATCHET(used_item) && seed.chems) - for(var/wood_mat in global._wood_materials) - if(!isnull(seed.chems[wood_mat])) - user.visible_message(SPAN_NOTICE("\The [user] makes planks out of \the [src].")) - for(var/obj/item/stack/material/stack in SSmaterials.create_object(wood_mat, user.loc, rand(1,2))) - stack.add_to_stacks(user, TRUE) - qdel(src) - return TRUE + if(IS_HATCHET(used_item)) + var/list/seed_chems = seed?.get_chemical_composition() + if(length(seed_chems)) + for(var/wood_mat in global._wood_materials) + if(!isnull(seed_chems[wood_mat])) + user.visible_message(SPAN_NOTICE("\The [user] makes planks out of \the [src].")) + for(var/obj/item/stack/material/stack in SSmaterials.create_object(wood_mat, user.loc, rand(1,2))) + stack.add_to_stacks(user, TRUE) + qdel(src) + return TRUE if(istype(used_item, /obj/item/paper)) diff --git a/code/modules/hydroponics/plant_types/seeds_herbs.dm b/code/modules/hydroponics/plant_types/seeds_herbs.dm index ec4273ebc4fc..246c81aeed4a 100644 --- a/code/modules/hydroponics/plant_types/seeds_herbs.dm +++ b/code/modules/hydroponics/plant_types/seeds_herbs.dm @@ -14,11 +14,6 @@ name = "yarrow" product_name = "yarrow flower" display_name = "yarrow patch" - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/brute_meds/yarrow = list(1, 1) - ) - dried_chems = list(/decl/material/liquid/brute_meds/yarrow = list(10,10)) /datum/seed/herb/yarrow/New() ..() @@ -26,15 +21,14 @@ set_trait(TRAIT_PRODUCT_ICON,"flower4") set_trait(TRAIT_PLANT_COLOUR,"#6b8c5e") set_trait(TRAIT_PLANT_ICON,"flower4") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/brute_meds/yarrow, list(1, 1)) + set_chemical_amount(/decl/material/liquid/brute_meds/yarrow, list(10,10), _state = PLANT_STATE_DRIED) /datum/seed/herb/aloe name = "aloe" product_name = "aloe vera" display_name = "aloe patch" - chems = list( - /decl/material/liquid/nutriment = list(1,5), - /decl/material/liquid/burn_meds/aloe = list(10,10) - ) /datum/seed/herb/aloe/New() ..() @@ -42,16 +36,13 @@ set_trait(TRAIT_PRODUCT_ICON,"grass") set_trait(TRAIT_PLANT_COLOUR,"#2d7746") set_trait(TRAIT_PLANT_ICON,"ambrosia") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,5)) + set_chemical_amount(/decl/material/liquid/burn_meds/aloe, list(10,10)) /datum/seed/herb/ginseng name = "ginseng" product_name = "ginseng root" display_name = "ginseng patch" - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/antitoxins/ginseng = list(1, 1) - ) - dried_chems = list(/decl/material/liquid/antitoxins/ginseng = list(10,10)) /datum/seed/herb/ginseng/New() ..() @@ -59,16 +50,14 @@ set_trait(TRAIT_PRODUCT_ICON,"pod") set_trait(TRAIT_PLANT_COLOUR,"#6b8c5e") set_trait(TRAIT_PLANT_ICON,"grass") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/antitoxins/ginseng, list(1, 1)) + set_chemical_amount(/decl/material/liquid/antitoxins/ginseng, list(10,10), _state = PLANT_STATE_DRIED) /datum/seed/herb/valerian name = "valerian" product_name = "valerian flower" display_name = "valerian patch" - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/sedatives/valerian = list(1, 1) - ) - dried_chems = list(/decl/material/liquid/sedatives/valerian = list(10,10)) /datum/seed/herb/valerian/New() ..() @@ -76,16 +65,14 @@ set_trait(TRAIT_PRODUCT_ICON,"flower4") set_trait(TRAIT_PLANT_COLOUR,"#6b8c5e") set_trait(TRAIT_PLANT_ICON,"flower4") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/sedatives/valerian, list(1, 1)) + set_chemical_amount(/decl/material/liquid/sedatives/valerian, list(10,10), _state = PLANT_STATE_DRIED) /datum/seed/herb/foxglove name = "foxglove" product_name = "foxglove flower" display_name = "foxglove patch" - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/stabilizer/foxglove = list(1, 1) - ) - dried_chems = list(/decl/material/liquid/stabilizer/foxglove = list(10,10)) /datum/seed/herb/foxglove/New() ..() @@ -93,3 +80,6 @@ set_trait(TRAIT_PRODUCT_ICON,"flowers") set_trait(TRAIT_PLANT_COLOUR,"#6b8c5e") set_trait(TRAIT_PLANT_ICON,"bush7") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/stabilizer/foxglove, list(1, 1)) + set_chemical_amount(/decl/material/liquid/stabilizer/foxglove, list(10,10), _state = PLANT_STATE_DRIED) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index a36f8486b7f3..1ed4775af8fd 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -3,10 +3,6 @@ product_name = "cotton" display_name = "cotton patch" product_material = /decl/material/solid/organic/plantmatter/pith/husk - chems = list( - /decl/material/liquid/oil/plant = list(3,10), - /decl/material/solid/organic/cloth = list(10,1) - ) slice_product = null slice_amount = 0 @@ -21,27 +17,26 @@ set_trait(TRAIT_PRODUCT_COLOUR, "#ffffff") set_trait(TRAIT_PLANT_ICON,"bush2") set_trait(TRAIT_IDEAL_LIGHT, 6) + set_chemical_amount(/decl/material/liquid/oil/plant, list(3,10)) + set_chemical_amount(/decl/material/solid/organic/cloth, list(10,1)) /datum/seed/cotton/flax name = "flax" product_name = "flax" display_name = "flax patch" - // Do we want linseed oil at some point? - chems = list( - /decl/material/liquid/oil/plant = list(5,12), - /decl/material/solid/organic/cloth/linen = list(8,1) - ) /datum/seed/cotton/flax/New() ..() set_trait(TRAIT_PRODUCT_COLOUR, "#eee4c7") + // Do we want linseed oil at some point? + set_chemical_amount(/decl/material/liquid/oil/plant, list(5,12)) + set_chemical_amount(/decl/material/solid/organic/cloth/linen, list(8,1)) // Chili plants/variants. /datum/seed/chili name = "chili" product_name = "chili" display_name = "chili plants" - chems = list(/decl/material/liquid/capsaicin = list(3,5), /decl/material/liquid/nutriment = list(1,25)) mutants = list("icechili") grown_tag = "chili" allergen_flags = ALLERGEN_FRUIT @@ -58,13 +53,14 @@ set_trait(TRAIT_PLANT_ICON,"bush2") set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_IDEAL_LIGHT, 7) + set_chemical_amount(/decl/material/liquid/capsaicin, list(3,5)) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,25)) /datum/seed/chili/ice name = "icechili" product_name = "chilly pepper" display_name = "chilly pepper plant" mutants = null - chems = list(/decl/material/liquid/frostoil = list(3,5), /decl/material/liquid/nutriment = list(1,50)) grown_tag = "icechili" /datum/seed/chili/ice/New() @@ -72,6 +68,8 @@ set_trait(TRAIT_MATURATION,4) set_trait(TRAIT_PRODUCTION,4) set_trait(TRAIT_PRODUCT_COLOUR,"#00edc6") + set_chemical_amount(/decl/material/liquid/frostoil, list(3,5)) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,50)) // Berry plants/variants. /datum/seed/berry @@ -79,7 +77,6 @@ product_name = "berries" display_name = "berry bush" mutants = list("glowberries","poisonberries","blueberries") - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/berry = list(10,10)) grown_tag = "berries" slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -98,13 +95,14 @@ set_trait(TRAIT_PLANT_ICON,"bush") set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/berry, list(10,10)) /datum/seed/berry/blue name = "blueberries" product_name = "blueberries" display_name = "blueberry bush" mutants = list("berries","poisonberries","glowberries") - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/berry = list(10,10)) grown_tag = "blueberries" /datum/seed/berry/blue/New() @@ -116,13 +114,14 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#1c225c") set_trait(TRAIT_WATER_CONSUMPTION, 5) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.2) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/berry, list(10,10)) /datum/seed/berry/glow name = "glowberries" product_name = "glowberries" display_name = "glowberry bush" mutants = null - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/solid/metal/uranium = list(3,5)) /datum/seed/berry/glow/New() ..() @@ -136,34 +135,29 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#c9fa16") set_trait(TRAIT_WATER_CONSUMPTION, 3) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/solid/metal/uranium, list(3,5)) /datum/seed/berry/poison name = "poisonberries" product_name = "poison berries" display_name = "poison berry bush" mutants = list("deathberries") - chems = list( - /decl/material/liquid/nutriment = list(1), - /decl/material/liquid/bromide = list(3,5), - /decl/material/liquid/poisonberryjuice = list(10,5) - ) /datum/seed/berry/poison/New() ..() set_trait(TRAIT_PRODUCT_COLOUR,"#6dc961") set_trait(TRAIT_WATER_CONSUMPTION, 3) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + set_chemical_amount(/decl/material/liquid/bromide, list(3,5)) + set_chemical_amount(/decl/material/liquid/poisonberryjuice, list(10,5)) /datum/seed/berry/poison/death name = "deathberries" product_name = "death berries" display_name = "death berry bush" mutants = null - chems = list( - /decl/material/liquid/nutriment = list(1), - /decl/material/liquid/bromide = list(3,3), - /decl/material/gas/carbon_monoxide = list(1,5) - ) /datum/seed/berry/poison/death/New() ..() @@ -171,6 +165,9 @@ set_trait(TRAIT_POTENCY,50) set_trait(TRAIT_PRODUCT_COLOUR,"#7a5454") set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.35) + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + set_chemical_amount(/decl/material/liquid/bromide, list(3,3)) + set_chemical_amount(/decl/material/gas/carbon_monoxide, list(1,5)) // Nettles/variants. /datum/seed/nettle @@ -178,11 +175,6 @@ product_name = "nettle" display_name = "nettle patch" mutants = list("deathnettle") - chems = list( - /decl/material/liquid/nutriment = list(1,50), - /decl/material/liquid/drink/juice/nettle = list(1,10), - /decl/material/liquid/nettle_histamine = list(1, 5) - ) grown_tag = "nettle" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -198,16 +190,15 @@ set_trait(TRAIT_PLANT_ICON,"bush5") set_trait(TRAIT_PRODUCT_ICON,"nettles") set_trait(TRAIT_PRODUCT_COLOUR,"#728a54") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,50)) + set_chemical_amount(/decl/material/liquid/drink/juice/nettle, list(1,10)) + set_chemical_amount(/decl/material/liquid/nettle_histamine, list(1, 5)) /datum/seed/nettle/death name = "deathnettle" product_name = "death nettle" display_name = "death nettle patch" mutants = null - chems = list( - /decl/material/liquid/nutriment = list(1,50), - /decl/material/liquid/acid/polyacid = list(0,1) - ) grown_tag = "deathnettle" /datum/seed/nettle/death/New() @@ -216,6 +207,8 @@ set_trait(TRAIT_YIELD,2) set_trait(TRAIT_PRODUCT_COLOUR,"#8c5030") set_trait(TRAIT_PLANT_COLOUR,"#634941") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,50)) + set_chemical_amount(/decl/material/liquid/acid/polyacid, list(0,1)) //Tomatoes/variants. /datum/seed/tomato @@ -223,7 +216,6 @@ product_name = "tomato" display_name = "tomato plant" mutants = list("bluetomato","bloodtomato") - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/tomato = list(10,10)) grown_tag = "tomato" allergen_flags = ALLERGEN_FRUIT | ALLERGEN_VEGETABLE // Which is it?? @@ -241,13 +233,14 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/tomato, list(10,10)) /datum/seed/tomato/blood name = "bloodtomato" product_name = "blood tomato" display_name = "blood tomato plant" mutants = list("killer") - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/blood = list(1,5)) splat_type = /obj/effect/decal/cleanable/blood/splatter allergen_flags = ALLERGEN_MEAT @@ -255,6 +248,8 @@ ..() set_trait(TRAIT_YIELD,3) set_trait(TRAIT_PRODUCT_COLOUR,"#ff0000") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/blood, list(1,5)) /datum/seed/tomato/killer name = "killertomato" @@ -274,22 +269,19 @@ product_name = "blue tomato" display_name = "blue tomato plant" mutants = list("quantumato") - chems = list(/decl/material/liquid/nutriment = list(1,20), /decl/material/liquid/lube = list(1,5)) /datum/seed/tomato/blue/New() ..() set_trait(TRAIT_PRODUCT_COLOUR,"#4d86e8") set_trait(TRAIT_PLANT_COLOUR,"#070aad") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/lube, list(1,5)) /datum/seed/tomato/blue/teleport name = "quantumato" product_name = "quantumato" display_name = "quantumato plant" mutants = null - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/alcohol/bluecuracao = list(10,5) - ) /datum/seed/tomato/blue/teleport/New() ..() @@ -297,6 +289,8 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#00e5ff") set_trait(TRAIT_BIOLUM,1) set_trait(TRAIT_BIOLUM_COLOUR,"#4da4a8") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/alcohol/bluecuracao, list(10,5)) //Eggplants/varieties. /datum/seed/eggplant @@ -304,7 +298,6 @@ product_name = "eggplant" display_name = "eggplant vine" mutants = list("realeggplant") - chems = list(/decl/material/liquid/nutriment = list(1,10)) grown_tag = "eggplant" /datum/seed/eggplant/New() @@ -319,6 +312,7 @@ set_trait(TRAIT_PLANT_ICON,"bush4") set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_IDEAL_LIGHT, 7) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) //Apples/varieties. /datum/seed/apple @@ -326,7 +320,6 @@ product_name = "apple" display_name = "apple tree" mutants = list("poisonapple","goldapple") - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/apple = list(10,10)) grown_tag = "apple" allergen_flags = ALLERGEN_FRUIT @@ -343,18 +336,22 @@ set_trait(TRAIT_FLESH_COLOUR,"#e8e39b") set_trait(TRAIT_IDEAL_LIGHT, 4) set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/apple, list(10,10)) /datum/seed/apple/poison name = "poisonapple" mutants = null - chems = list(/decl/material/liquid/cyanide = list(1,5)) + +/datum/seed/apple/poison/New() + ..() + set_chemical_amount(/decl/material/liquid/cyanide, list(1,5)) /datum/seed/apple/gold name = "goldapple" product_name = "golden apple" display_name = "gold apple tree" mutants = null - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/solid/metal/gold = list(1,5)) grown_tag = "goldapple" /datum/seed/apple/gold/New() @@ -364,6 +361,8 @@ set_trait(TRAIT_YIELD,3) set_trait(TRAIT_PRODUCT_COLOUR,"#ffdd00") set_trait(TRAIT_PLANT_COLOUR,"#d6b44d") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/solid/metal/gold, list(1,5)) //Ambrosia/varieties. /datum/seed/ambrosia @@ -371,13 +370,6 @@ product_name = "ambrosia vulgaris" display_name = "ambrosia vulgaris patch" mutants = list("ambrosiadeus", "hemp") - chems = list( - /decl/material/liquid/nutriment = list(1), - /decl/material/liquid/psychoactives = list(1,8), - /decl/material/liquid/burn_meds = list(1,8,1), - /decl/material/liquid/brute_meds = list(1,10,1), - /decl/material/liquid/bromide = list(1,10) - ) grown_tag = "ambrosiavulgaris" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -393,38 +385,42 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#9fad55") set_trait(TRAIT_PLANT_ICON,"ambrosia") set_trait(TRAIT_IDEAL_LIGHT, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + set_chemical_amount(/decl/material/liquid/psychoactives, list(1,8)) + set_chemical_amount(/decl/material/liquid/burn_meds, list(1,8,1)) + set_chemical_amount(/decl/material/liquid/brute_meds, list(1,10,1)) + set_chemical_amount(/decl/material/liquid/bromide, list(1,10)) /datum/seed/ambrosia/hemp name = "hemp" product_name = "hemp" display_name = "hemp patch" mutants = null - chems = list( - /decl/material/liquid/oil/plant = list(3,10), - /decl/material/solid/organic/cloth/hemp = list(8,1), - /decl/material/liquid/nutriment = list(1) - ) grown_tag = null +/datum/seed/ambrosia/hemp/New() + ..() + set_chemical_amount(/decl/material/liquid/oil/plant, list(3,10)) + set_chemical_amount(/decl/material/solid/organic/cloth/hemp, list(8,1)) + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + /datum/seed/ambrosia/deus name = "ambrosiadeus" product_name = "ambrosia deus" display_name = "ambrosia deus patch" mutants = null - chems = list( - /decl/material/liquid/nutriment = list(1), - /decl/material/liquid/brute_meds = list(1,8), - /decl/material/liquid/accumulated/antidepressants = list(1,8,1), - /decl/material/liquid/accumulated/stimulants = list(1,8,1), - /decl/material/liquid/amphetamines = list(1,10,1), - /decl/material/liquid/psychoactives = list(1,10) - ) grown_tag = "ambrosiadeus" /datum/seed/ambrosia/deus/New() ..() set_trait(TRAIT_PRODUCT_COLOUR,"#a3f0ad") set_trait(TRAIT_PLANT_COLOUR,"#2a9c61") + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + set_chemical_amount(/decl/material/liquid/brute_meds, list(1,8)) + set_chemical_amount(/decl/material/liquid/accumulated/antidepressants, list(1,8,1)) + set_chemical_amount(/decl/material/liquid/accumulated/stimulants, list(1,8,1)) + set_chemical_amount(/decl/material/liquid/amphetamines, list(1,10,1)) + set_chemical_amount(/decl/material/liquid/psychoactives, list(1,10)) //Mushrooms/varieties. /datum/seed/mushroom @@ -433,7 +429,6 @@ seed_noun = SEED_NOUN_SPORES display_name = "chanterelle mushroom patch" mutants = list("reishi","amanita","plumphelmet") - chems = list(/decl/material/liquid/nutriment = list(1,25)) splat_type = /obj/effect/vine grown_tag = "mushroom" slice_product = /obj/item/food/processed_grown/chopped @@ -459,6 +454,7 @@ set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_IDEAL_HEAT, 288) set_trait(TRAIT_LIGHT_TOLERANCE, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,25)) /datum/seed/mushroom/mold name = "mold" @@ -481,7 +477,6 @@ product_name = "plump helmet" display_name = "plump helmet mushroom patch" mutants = list("walkingmushroom","towercap") - chems = list(/decl/material/liquid/nutriment = list(2,10)) grown_tag = "plumphelmet" /datum/seed/mushroom/plump/New() @@ -495,6 +490,7 @@ set_trait(TRAIT_PLANT_COLOUR,"#9e4f9d") set_trait(TRAIT_PLANT_ICON,"mushroom2") set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.35) + set_chemical_amount(/decl/material/liquid/nutriment, list(2,10)) /datum/seed/mushroom/plump/walking name = "walkingmushroom" @@ -516,7 +512,6 @@ product_name = "reishi" display_name = "reishi patch" mutants = list("libertycap","glowbell") - chems = list(/decl/material/liquid/nutriment = list(1,50), /decl/material/liquid/psychotropics = list(3,5)) /datum/seed/mushroom/hallucinogenic/New() ..() @@ -528,13 +523,14 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#ffb70f") set_trait(TRAIT_PLANT_COLOUR,"#f58a18") set_trait(TRAIT_PLANT_ICON,"mushroom6") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,50)) + set_chemical_amount(/decl/material/liquid/psychotropics, list(3,5)) /datum/seed/mushroom/hallucinogenic/strong name = "libertycap" product_name = "liberty cap" display_name = "liberty cap mushroom patch" mutants = null - chems = list(/decl/material/liquid/nutriment = list(1), /decl/material/liquid/sedatives = list(3,3), /decl/material/liquid/psychoactives = list(1,25)) /datum/seed/mushroom/hallucinogenic/strong/New() ..() @@ -544,13 +540,15 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#f2e550") set_trait(TRAIT_PLANT_COLOUR,"#d1ca82") set_trait(TRAIT_PLANT_ICON,"mushroom3") + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + set_chemical_amount(/decl/material/liquid/sedatives, list(3,3)) + set_chemical_amount(/decl/material/liquid/psychoactives, list(1,25)) /datum/seed/mushroom/poison name = "amanita" product_name = "fly amanita" display_name = "fly amanita mushroom patch" mutants = list("destroyingangel","plastic") - chems = list(/decl/material/liquid/nutriment = list(1), /decl/material/liquid/amatoxin = list(3,3), /decl/material/liquid/psychotropics = list(1,25)) /datum/seed/mushroom/poison/New() ..() @@ -563,13 +561,15 @@ set_trait(TRAIT_LEAVES_COLOUR,"#ff4545") // to make it so they aren't pale while immature set_trait(TRAIT_PLANT_COLOUR,"#e0ddba") set_trait(TRAIT_PLANT_ICON,"mushroom4") + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) + set_chemical_amount(/decl/material/liquid/amatoxin, list(3,3)) + set_chemical_amount(/decl/material/liquid/psychotropics, list(1,25)) /datum/seed/mushroom/poison/death name = "destroyingangel" product_name = "destroying angel" display_name = "destroying angel mushroom patch" mutants = null - chems = list(/decl/material/liquid/nutriment = list(1,50), /decl/material/liquid/amatoxin = list(13,3), /decl/material/liquid/psychotropics = list(1,25)) /datum/seed/mushroom/poison/death/New() ..() @@ -581,12 +581,14 @@ set_trait(TRAIT_PLANT_COLOUR,"#e6d8dd") set_trait(TRAIT_PLANT_ICON,"mushroom5") set_trait(TRAIT_LEAVES_COLOUR,null) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,50)) + set_chemical_amount(/decl/material/liquid/amatoxin, list(13,3)) + set_chemical_amount(/decl/material/liquid/psychotropics, list(1,25)) /datum/seed/mushroom/towercap name = "towercap" product_name = "dwarf towercap" display_name = "dwarf towercap thicket" - chems = list(/decl/material/solid/organic/wood/fungal = list(10,1)) mutants = null product_type = /obj/item/stack/material/log/towercap @@ -600,13 +602,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#d3aca3") set_trait(TRAIT_PLANT_COLOUR,"#dcd9d9") set_trait(TRAIT_PLANT_ICON,"mushroom8") + set_chemical_amount(/decl/material/solid/organic/wood/fungal, list(10,1)) /datum/seed/mushroom/glowbell name = "glowbell" product_name = "glowbell" display_name = "glowbell patch" mutants = list("weepingmoon", "caverncandle") - chems = list(/decl/material/liquid/glowsap = list(1,20)) /datum/seed/mushroom/glowbell/New() ..() @@ -620,13 +622,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#90d7f0") set_trait(TRAIT_PLANT_COLOUR,"#75bdd7") set_trait(TRAIT_PLANT_ICON,"mushroom2") + set_chemical_amount(/decl/material/liquid/glowsap, list(1,20)) /datum/seed/mushroom/weepingmoon name = "weepingmoon" product_name = "weeping moon" display_name = "weeping moon patch" mutants = null - chems = list(/decl/material/liquid/glowsap = list(1,20)) /datum/seed/mushroom/weepingmoon/New() ..() @@ -640,13 +642,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#90d7f0") set_trait(TRAIT_PLANT_COLOUR,"#75bdd7") set_trait(TRAIT_PLANT_ICON,"mushroom4") + set_chemical_amount(/decl/material/liquid/glowsap, list(1,20)) /datum/seed/mushroom/caverncandle name = "caverncandle" product_name = "caverncandle" display_name = "cavern candle patch" mutants = null - chems = list(/decl/material/liquid/glowsap = list(1,20)) /datum/seed/mushroom/caverncandle/New() ..() @@ -660,13 +662,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#90d7f0") set_trait(TRAIT_PLANT_COLOUR,"#75bdd7") set_trait(TRAIT_PLANT_ICON,"mushroom3") + set_chemical_amount(/decl/material/liquid/glowsap, list(1,20)) /datum/seed/mushroom/plastic name = "plastic" product_name = "plastellium" display_name = "plastellium patch" mutants = null - chems = list(/decl/material/liquid/plasticide = list(1,10)) /datum/seed/mushroom/plastic/New() ..() @@ -678,13 +680,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#e6e6e6") set_trait(TRAIT_PLANT_COLOUR,"#e6e6e6") set_trait(TRAIT_PLANT_ICON,"mushroom10") + set_chemical_amount(/decl/material/liquid/plasticide, list(1,10)) //Flowers/varieties /datum/seed/flower name = "harebells" product_name = "harebell" display_name = "harebell patch" - chems = list(/decl/material/liquid/nutriment = list(1,20)) slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 produces_pollen = 1 @@ -699,15 +701,12 @@ set_trait(TRAIT_PLANT_COLOUR,"#6b8c5e") set_trait(TRAIT_PLANT_ICON,"flower") set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) /datum/seed/flower/poppy name = "poppies" product_name = "poppy" display_name = "poppy patch" - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/painkillers/strong = list(1,10) - ) grown_tag = "poppy" /datum/seed/flower/poppy/New() @@ -722,14 +721,13 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 0.5) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/painkillers/strong, list(1,10)) /datum/seed/flower/sunflower name = "sunflowers" product_name = "sunflower" display_name = "sunflower patch" - chems = list( - /decl/material/liquid/oil/plant = list(10,10) - ) /datum/seed/flower/sunflower/New() ..() @@ -740,12 +738,12 @@ set_trait(TRAIT_IDEAL_LIGHT, 7) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/oil/plant, list(10,10)) /datum/seed/flower/lavender name = "lavender" product_name = "lavender" display_name = "lavender patch" - chems = list(/decl/material/liquid/nutriment = list(1,20), /decl/material/liquid/brute_meds = list(1,10)) /datum/seed/flower/lavender/New() ..() @@ -759,6 +757,8 @@ set_trait(TRAIT_IDEAL_LIGHT, 7) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.05) set_trait(TRAIT_WATER_CONSUMPTION, 0.5) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/brute_meds, list(1,10)) //Grapes/varieties /datum/seed/grapes @@ -766,7 +766,6 @@ product_name = "grapes" display_name = "grapevine" mutants = list("greengrapes") - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/nutriment/sugar = list(1,5), /decl/material/liquid/drink/juice/grape = list(10,10)) slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 allergen_flags = ALLERGEN_FRUIT @@ -784,27 +783,28 @@ set_trait(TRAIT_PLANT_ICON,"vine") set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/nutriment/sugar, list(1,5)) + set_chemical_amount(/decl/material/liquid/drink/juice/grape, list(10,10)) /datum/seed/grapes/green name = "greengrapes" product_name = "green grapes" display_name = "green grapevine" mutants = null - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/burn_meds = list(3,5), /decl/material/liquid/drink/juice/grape = list(10,10)) /datum/seed/grapes/green/New() ..() set_trait(TRAIT_PRODUCT_COLOUR,"42ed2f") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/burn_meds, list(3,5)) + set_chemical_amount(/decl/material/liquid/drink/juice/grape, list(10,10)) //Everything else /datum/seed/peanuts name = "peanut" product_name = "peanut" display_name = "peanut vine" - chems = list( - /decl/material/liquid/nutriment = list(1,10), - /decl/material/liquid/oil/plant = list(1,10) - ) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 allergen_flags = ALLERGEN_NUTS @@ -820,12 +820,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#c4ae7a") set_trait(TRAIT_PLANT_ICON,"bush2") set_trait(TRAIT_IDEAL_LIGHT, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/oil/plant, list(1,10)) /datum/seed/peppercorn name = "peppercorn" product_name = "peppercorn" display_name = "black pepper plant" - chems = list(/decl/material/solid/blackpepper = list(10,10)) slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -840,12 +841,12 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#4d4d4d") set_trait(TRAIT_PLANT_ICON,"vine2") set_trait(TRAIT_IDEAL_LIGHT, 6) + set_chemical_amount(/decl/material/solid/blackpepper, list(10,10)) /datum/seed/cabbage name = "cabbage" product_name = "cabbage" display_name = "cabbage patch" - chems = list(/decl/material/liquid/nutriment = list(1,10)) grown_tag = "cabbage" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -864,12 +865,12 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) /datum/seed/banana name = "banana" product_name = "banana" display_name = "banana tree" - chems = list(/decl/material/liquid/drink/juice/banana = list(10,10), /decl/material/solid/potassium = list(2,3)) trash_type = /obj/item/bananapeel grown_tag = "banana" allergen_flags = ALLERGEN_FRUIT @@ -888,12 +889,13 @@ set_trait(TRAIT_IDEAL_LIGHT, 7) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/drink/juice/banana, list(10,10)) + set_chemical_amount(/decl/material/solid/potassium, list(2,3)) /datum/seed/corn name = "corn" product_name = "corn" display_name = "ears of corn" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/oil/plant/corn = list(1,10)) grown_tag = "corn" trash_type = /obj/item/corncob backyard_grilling_product = /obj/item/food/popcorn @@ -914,12 +916,13 @@ set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/oil/plant/corn, list(1,10)) /datum/seed/potato name = "potato" product_name = "potato" display_name = "potato patch" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/potato = list(10,10)) grown_tag = "potato" grown_is_seed = TRUE min_seed_extracted = 0 @@ -938,12 +941,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#d4cab4") set_trait(TRAIT_PLANT_ICON,"bush2") set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/potato, list(10,10)) /datum/seed/garlic name = "garlic" product_name = "garlic" display_name = "garlic plant" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/garlic = list(10,10)) grown_tag = "garlic" slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -962,12 +966,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#fff8dd") set_trait(TRAIT_PLANT_ICON,"stalk") set_trait(TRAIT_WATER_CONSUMPTION, 7) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/garlic, list(10,10)) /datum/seed/onion name = "onion" product_name = "onion" display_name = "onion patch" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/drink/juice/onion = list(10,10)) grown_tag = "onion" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -983,16 +988,13 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#ffeedd") set_trait(TRAIT_PLANT_ICON,"stalk") set_trait(TRAIT_WATER_CONSUMPTION, 5) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/drink/juice/onion, list(10,10)) /datum/seed/soybean name = "soybeans" product_name = "soybeans" display_name = "soybean patch" - chems = list( - /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/oil/plant = list(3,20), - /decl/material/liquid/drink/milk/soymilk = list(7,20) - ) grown_tag = "soybeans" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -1008,12 +1010,14 @@ set_trait(TRAIT_PRODUCT_ICON,"bean") set_trait(TRAIT_PRODUCT_COLOUR,"#ebe7c0") set_trait(TRAIT_PLANT_ICON,"stalk") + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/oil/plant, list(3,20)) + set_chemical_amount(/decl/material/liquid/drink/milk/soymilk, list(7,20)) /datum/seed/wheat name = "wheat" product_name = "wheat" display_name = "wheat patch" - chems = list(/decl/material/liquid/nutriment = list(1,25), /decl/material/liquid/nutriment/flour = list(15,15)) grown_tag = "wheat" slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -1031,12 +1035,13 @@ set_trait(TRAIT_PLANT_ICON,"stalk2") set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,25)) + set_chemical_amount(/decl/material/liquid/nutriment/flour, list(15,15)) /datum/seed/rice name = "rice" product_name = "rice" display_name = "rice paddy" - chems = list(/decl/material/liquid/nutriment = list(1,25), /decl/material/liquid/nutriment/rice = list(10,15)) grown_tag = "rice" slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -1054,12 +1059,13 @@ set_trait(TRAIT_PLANT_ICON,"stalk2") set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,25)) + set_chemical_amount(/decl/material/liquid/nutriment/rice, list(10,15)) /datum/seed/carrots name = "carrot" product_name = "carrot" display_name = "carrot patch" - chems = list(/decl/material/liquid/nutriment = list(1,20), /decl/material/liquid/eyedrops = list(3,5), /decl/material/liquid/drink/juice/carrot = list(10,20)) grown_tag = "carrot" slice_product = /obj/item/food/processed_grown/sticks slice_amount = 3 @@ -1074,6 +1080,9 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#ff9900") set_trait(TRAIT_PLANT_ICON,"carrot") set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/eyedrops, list(3,5)) + set_chemical_amount(/decl/material/liquid/drink/juice/carrot, list(10,20)) /datum/seed/weeds name = "weeds" @@ -1096,7 +1105,6 @@ name = "whitebeet" product_name = "white-beet" display_name = "white-beet patch" - chems = list(/decl/material/liquid/nutriment = list(0,20), /decl/material/liquid/nutriment/sugar = list(1,5)) grown_tag = "whitebeet" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -1112,12 +1120,13 @@ set_trait(TRAIT_PLANT_COLOUR,"#4d8f53") set_trait(TRAIT_PLANT_ICON,"carrot2") set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(0,20)) + set_chemical_amount(/decl/material/liquid/nutriment/sugar, list(1,5)) /datum/seed/sugarcane name = "sugarcane" product_name = "sugarcane" display_name = "sugarcane patch" - chems = list(/decl/material/liquid/nutriment/sugar = list(4,5)) /datum/seed/sugarcane/New() ..() @@ -1131,13 +1140,13 @@ set_trait(TRAIT_PLANT_COLOUR,"#6bbd68") set_trait(TRAIT_PLANT_ICON,"stalk3") set_trait(TRAIT_IDEAL_HEAT, 298) + set_chemical_amount(/decl/material/liquid/nutriment/sugar, list(4,5)) /datum/seed/watermelon name = "watermelon" product_name = "watermelon" display_name = "watermelon vine" product_w_class = ITEM_SIZE_LARGE - chems = list(/decl/material/liquid/nutriment = list(1,6), /decl/material/liquid/drink/juice/watermelon = list(10,6)) slice_product = /obj/item/food/processed_grown/slice/large allergen_flags = ALLERGEN_FRUIT @@ -1157,13 +1166,14 @@ set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,6)) + set_chemical_amount(/decl/material/liquid/drink/juice/watermelon, list(10,6)) /datum/seed/pumpkin name = "pumpkin" product_name = "pumpkin" display_name = "pumpkin vine" product_w_class = ITEM_SIZE_LARGE - chems = list(/decl/material/liquid/nutriment = list(1,6)) grown_tag = "pumpkin" slice_product = /obj/item/clothing/head/pumpkinhead slice_amount = 1 @@ -1188,12 +1198,12 @@ set_trait(TRAIT_PLANT_COLOUR,"#bae8c1") set_trait(TRAIT_PLANT_ICON,"vine2") set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,6)) /datum/seed/citrus name = "lime" product_name = "lime" display_name = "lime tree" - chems = list(/decl/material/liquid/nutriment = list(1,20), /decl/material/liquid/drink/juice/lime = list(10,20)) grown_tag = "lime" allergen_flags = ALLERGEN_FRUIT @@ -1210,12 +1220,13 @@ set_trait(TRAIT_PLANT_ICON,"tree") set_trait(TRAIT_FLESH_COLOUR,"#3af026") set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/drink/juice/lime, list(10,20)) /datum/seed/citrus/lemon name = "lemon" product_name = "lemon" display_name = "lemon tree" - chems = list(/decl/material/liquid/nutriment = list(1,20), /decl/material/liquid/drink/juice/lemon = list(10,20)) grown_tag = "lemon" /datum/seed/citrus/lemon/New() @@ -1225,25 +1236,27 @@ set_trait(TRAIT_FLESH_COLOUR,"#f0e226") set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/drink/juice/lemon, list(10,20)) /datum/seed/citrus/orange name = "orange" product_name = "orange" display_name = "orange tree" grown_tag = "orange" - chems = list(/decl/material/liquid/nutriment = list(1,20), /decl/material/liquid/drink/juice/orange = list(10,20)) /datum/seed/citrus/orange/New() ..() set_trait(TRAIT_PRODUCT_COLOUR,"#ffc20a") set_trait(TRAIT_FLESH_COLOUR,"#ffc20a") set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) + set_chemical_amount(/decl/material/liquid/drink/juice/orange, list(10,20)) /datum/seed/grass name = "grass" product_name = "grass" display_name = "grass patch" - chems = list(/decl/material/liquid/nutriment = list(1,20)) grown_tag = "grass" product_type = /obj/item/stack/material/bundle/grass slice_product = /obj/item/food/processed_grown/chopped @@ -1262,12 +1275,12 @@ set_trait(TRAIT_WATER_CONSUMPTION, 0.5) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,20)) /datum/seed/cocoa name = "cocoa" product_name = "cacao" display_name = "cacao tree" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/nutriment/coco = list(4,5)) slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -1284,13 +1297,14 @@ set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,10)) + set_chemical_amount(/decl/material/liquid/nutriment/coco, list(4,5)) /datum/seed/cherries name = "cherry" product_name = "cherry" seed_noun = SEED_NOUN_PITS display_name = "cherry tree" - chems = list(/decl/material/liquid/nutriment = list(1,15), /decl/material/liquid/nutriment/sugar = list(1,15), /decl/material/liquid/nutriment/cherryjelly = list(10,15)) grown_tag = "cherries" slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 @@ -1309,12 +1323,14 @@ set_trait(TRAIT_PLANT_ICON,"tree2") set_trait(TRAIT_PLANT_COLOUR,"#2f7d2d") set_trait(TRAIT_PHOTOSYNTHESIS, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,15)) + set_chemical_amount(/decl/material/liquid/nutriment/sugar, list(1,15)) + set_chemical_amount(/decl/material/liquid/nutriment/cherryjelly, list(10,15)) /datum/seed/kudzu name = "kudzu" product_name = "kudzu" display_name = "kudzu vine" - chems = list(/decl/material/liquid/nutriment = list(1,50), /decl/material/liquid/antitoxins = list(1,25)) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -1330,12 +1346,13 @@ set_trait(TRAIT_PLANT_COLOUR,"#6f7a63") set_trait(TRAIT_PLANT_ICON,"vine2") set_trait(TRAIT_WATER_CONSUMPTION, 0.5) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,50)) + set_chemical_amount(/decl/material/liquid/antitoxins, list(1,25)) /datum/seed/shand name = "shand" product_name = "S'randar's hand" display_name = "S'randar's hand patch" - chems = list(/decl/material/liquid/brute_meds = list(0,10)) grown_tag = "shand" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -1352,12 +1369,12 @@ set_trait(TRAIT_PLANT_ICON,"tree5") set_trait(TRAIT_IDEAL_HEAT, 283) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/brute_meds, list(0,10)) /datum/seed/mtear name = "mtear" product_name = "Messa's tear" display_name = "Messa's tear patch" - chems = list(/decl/material/liquid/nutriment/honey = list(1,10), /decl/material/liquid/burn_meds = list(3,5)) grown_tag = "mtear" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -1374,13 +1391,14 @@ set_trait(TRAIT_PLANT_ICON,"bush7") set_trait(TRAIT_IDEAL_HEAT, 283) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment/honey, list(1,10)) + set_chemical_amount(/decl/material/liquid/burn_meds, list(3,5)) /datum/seed/tobacco name = "tobacco" product_name = "tobacco" display_name = "tobacco plant" mutants = list("finetobacco", "puretobacco", "badtobacco") - chems = list(/decl/material/solid/tobacco = list(1,10)) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 product_w_class = ITEM_SIZE_TINY // so that it can fit in bags of tobacco @@ -1398,12 +1416,12 @@ set_trait(TRAIT_IDEAL_LIGHT, 7) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/solid/tobacco, list(1,10)) /datum/seed/tobacco/finetobacco name = "finetobacco" product_name = "fine tobacco" display_name = "fine tobacco plant" - chems = list(/decl/material/solid/tobacco/fine = list(1,10)) /datum/seed/tobacco/finetobacco/New() ..() @@ -1411,12 +1429,12 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#33571b") set_trait(TRAIT_PLANT_COLOUR,"#33571b") set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.20) + set_chemical_amount(/decl/material/solid/tobacco/fine, list(1,10)) /datum/seed/tobacco/puretobacco //provides the pure nicotine reagent name = "puretobacco" product_name = "succulent tobacco" display_name = "succulent tobacco plant" - chems = list(/decl/material/liquid/nicotine = list(1,10)) /datum/seed/tobacco/puretobacco/New() ..() @@ -1425,22 +1443,22 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#b7c61a") set_trait(TRAIT_PLANT_COLOUR,"#b7c61a") set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.30) + set_chemical_amount(/decl/material/liquid/nicotine, list(1,10)) /datum/seed/tobacco/bad name = "badtobacco" product_name = "low-grade tobacco" display_name = "low-grade tobacco plant" mutants = list("tobacco") - chems = list(/decl/material/solid/tobacco/bad = list(1,10)) + +/datum/seed/tobacco/bad/New() + ..() + set_chemical_amount(/decl/material/solid/tobacco/bad, list(1,10)) /datum/seed/algae name = "algae" product_name = "algae" display_name = "algae patch" - chems = list( - /decl/material/liquid/nutriment = list(2,12), - /decl/material/liquid/bromide = list(3,8) - ) grown_tag = "algae" exude_gasses = list(/decl/material/gas/methyl_bromide = 3) slice_product = /obj/item/food/processed_grown/crushed @@ -1460,12 +1478,13 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment, list(2,12)) + set_chemical_amount(/decl/material/liquid/bromide, list(3,8)) /datum/seed/bamboo name = "bamboo" product_name = "bamboo" display_name = "bamboo thicket" - chems = list(/decl/material/solid/organic/wood/bamboo = list(6,1)) mutants = null slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -1483,13 +1502,12 @@ set_trait(TRAIT_IDEAL_HEAT, 298) set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_chemical_amount(/decl/material/solid/organic/wood/bamboo, list(6,1)) /datum/seed/tea name = "tea" product_name = "tea leaf" display_name = "tea plant" - chems = list(/decl/material/liquid/nutriment = list(1)) - dried_chems = list(/decl/material/liquid/nutriment/tea = list(10,10)) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 allergen_flags = ALLERGEN_CAFFEINE | ALLERGEN_STIMULANT @@ -1508,13 +1526,13 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + set_chemical_amount(/decl/material/liquid/nutriment/tea, list(10,10), _state = PLANT_STATE_DRIED) + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) /datum/seed/coffee name = "coffee" product_name = "coffee cherries" display_name = "coffee plant" - chems = list(/decl/material/liquid/nutriment = list(1)) - roasted_chems = list(/decl/material/liquid/nutriment/coffee = list(10,10)) backyard_grilling_product = /obj/item/food/grown/grilled backyard_grilling_announcement = "roasts and darkens." product_material = /decl/material/solid/organic/plantmatter/pith @@ -1536,3 +1554,6 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) + + set_chemical_amount(/decl/material/liquid/nutriment/coffee, list(10,10), _state = PLANT_STATE_ROASTED) + set_chemical_amount(/decl/material/liquid/nutriment, list(1)) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index bf56a5e39f18..236a5ae569a3 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -15,9 +15,6 @@ var/growth_stages = 0 // Number of stages the plant passes through before it is mature. var/list/_traits // Initialized in New() var/list/mutants // Possible predefined mutant varieties, if any. - var/list/chems // Chemicals that plant produces in products/injects into victim. - var/list/dried_chems // Chemicals that a dried plant product will have. - var/list/roasted_chems // Chemicals that a roasted/grilled plant product will have. var/list/consume_gasses // The plant will absorb these gasses during its life. var/list/exude_gasses // The plant will exude these gasses during its life. var/grown_tag // Used by the reagent grinder. @@ -100,8 +97,9 @@ return var/datum/reagents/R = new/datum/reagents(100, global.temp_reagents_holder) - if(chems.len) - for(var/rid in chems) + var/list/seed_chems = get_chemical_composition() + if(length(seed_chems)) + for(var/rid in seed_chems) var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3)) R.add_reagent(rid,injecting) @@ -157,7 +155,8 @@ return var/list/external_organs = target.get_external_organs() - if(chems && chems.len && target.reagents && LAZYLEN(external_organs)) + var/list/seed_chems = get_chemical_composition() + if(length(seed_chems) && target.reagents && LAZYLEN(external_organs)) var/obj/item/organ/external/affecting = pick(external_organs) for(var/slot in global.standard_clothing_slots) @@ -170,7 +169,7 @@ if(affecting) to_chat(target, "You are stung by \the [fruit] in your [affecting.name]!") - for(var/rid in chems) + for(var/rid in seed_chems) var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5)) target.add_to_reagents(rid,injecting) else @@ -213,16 +212,18 @@ if(!splat_reagents?.maximum_volume) // if thrown doesn't exist or has no reagents, use the seed's default reagents. splat_reagents = new /datum/reagents(INFINITY, global.temp_reagents_holder) var/potency = get_trait(TRAIT_POTENCY) - for(var/rid in chems) - var/list/reagent_amounts = chems[rid] - if(LAZYLEN(reagent_amounts)) - var/rtotal = reagent_amounts[1] - var/list/data = null - if(reagent_amounts?[2] && potency > 0) - rtotal += round(potency/reagent_amounts[2]) - if(rid == /decl/material/liquid/nutriment) - LAZYSET(data, product_name, max(1,rtotal)) - splat_reagents.add_reagent(rid,max(1,rtotal),data) + var/list/seed_chems = get_chemical_composition() + if(length(seed_chems)) + for(var/rid in seed_chems) + var/list/reagent_amounts = seed_chems[rid] + if(LAZYLEN(reagent_amounts)) + var/rtotal = reagent_amounts[1] + var/list/data = null + if(reagent_amounts?[2] && potency > 0) + rtotal += round(potency/reagent_amounts[2]) + if(rid == /decl/material/liquid/nutriment) + LAZYSET(data, product_name, max(1,rtotal)) + splat_reagents.add_reagent(rid,max(1,rtotal),data) if(splat_reagents) var/splat_range = min(10,max(1,get_trait(TRAIT_POTENCY)/15)) splat_reagents.splash_area(T, range = splat_range) @@ -442,14 +443,14 @@ gasses -= gas LAZYSET(exude_gasses, gas, rand(3,9)) - chems = list() + clear_chemical_composition() if(prob(80)) - chems[/decl/material/liquid/nutriment] = list(rand(1,10),rand(10,20)) + set_chemical_amount(/decl/material/liquid/nutriment, list(rand(1,10),rand(10,20))) if(length(liquids)) for(var/x = 1 to rand(0, 5)) var/new_chem = pickweight(liquids) liquids -= new_chem - chems[new_chem] = list(rand(1,10), rand(10,20)) + set_chemical_amount(new_chem, list(rand(1,10),rand(10,20))) if(prob(90)) set_trait(TRAIT_REQUIRES_NUTRIENTS,1) @@ -680,8 +681,8 @@ new_seed.product_type = product_type //Copy over everything else. + new_seed.copy_chemical_composition(src) if(mutants) new_seed.mutants = mutants.Copy() - if(chems) new_seed.chems = chems.Copy() if(consume_gasses) new_seed.consume_gasses = consume_gasses.Copy() if(exude_gasses) new_seed.exude_gasses = exude_gasses.Copy() @@ -750,9 +751,9 @@ //Seed traits clone._traits = deepCopyList(_traits) clone.mutants = mutants?.Copy() - clone.chems = chems?.Copy() clone.consume_gasses = consume_gasses?.Copy() clone.exude_gasses = exude_gasses?.Copy() + clone.copy_chemical_composition(src) //Appearence clone.growth_stages = growth_stages diff --git a/code/modules/hydroponics/seed_composition.dm b/code/modules/hydroponics/seed_composition.dm new file mode 100644 index 000000000000..e25b34789af1 --- /dev/null +++ b/code/modules/hydroponics/seed_composition.dm @@ -0,0 +1,21 @@ +/datum/seed + VAR_PRIVATE/list/_chemical_composition + +/datum/seed/proc/copy_chemical_composition(datum/seed/donor) + UNLINT(_chemical_composition = deepCopyList(donor._chemical_composition)) + +/datum/seed/proc/get_chemical_amount(_chem, _state = PLANT_STATE_FRESH, _segment = PLANT_SEG_BODY) + var/list/comp = get_chemical_composition(_state, _segment) + return LAZYACCESS(comp, _chem) + +/datum/seed/proc/set_chemical_amount(_chem, list/_amt, _state = PLANT_STATE_FRESH, _segment = PLANT_SEG_BODY) + LAZYINITLIST(_chemical_composition) + LAZYINITLIST(_chemical_composition[_state]) + LAZYSET(_chemical_composition[_state][_segment], _chem, _amt) + +/datum/seed/proc/get_chemical_composition(_state = PLANT_STATE_FRESH, _segment = PLANT_SEG_BODY) + var/list/comp = LAZYACCESS(_chemical_composition, _state) + return LAZYACCESS(comp, _segment) + +/datum/seed/proc/clear_chemical_composition() + LAZYCLEARLIST(_chemical_composition) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 523d2ec04c84..18dc92c3ce02 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -129,7 +129,7 @@ layer = (seed && seed.force_layer) ? seed.force_layer : ABOVE_OBJ_LAYER if(growth_type in list(GROWTH_VINES,GROWTH_BIOMASS)) set_opacity(1) - if(islist(seed.chems) && !isnull(seed.chems[/decl/material/solid/organic/wood])) + if(seed.get_chemical_amount(/decl/material/solid/organic/wood)) set_density(1) set_opacity(1) diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 6f3019810d30..dcc68137e6f5 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -29,7 +29,7 @@ if(blocked) continue if(floor.density) - if(!isnull(seed.chems[/decl/material/liquid/acid/polyacid])) + if(seed.get_chemical_amount(/decl/material/liquid/acid/polyacid)) spawn(rand(5,25)) floor.explosion_act(3) continue if(!Adjacent(floor) || !floor.Enter(src)) @@ -119,7 +119,7 @@ child.set_dir(child.calc_dir()) child.update_icon() // Some plants eat through plating. - if(islist(seed.chems) && !isnull(seed.chems[/decl/material/liquid/acid/polyacid])) + if(seed.get_chemical_amount(/decl/material/liquid/acid/polyacid)) target_turf.explosion_act(prob(80) ? 3 : 2) else qdel(child) diff --git a/code/modules/maps/template_types/random_exoplanet/flora_generator.dm b/code/modules/maps/template_types/random_exoplanet/flora_generator.dm index 6bf9ff36f00d..75c97b70ffc0 100644 --- a/code/modules/maps/template_types/random_exoplanet/flora_generator.dm +++ b/code/modules/maps/template_types/random_exoplanet/flora_generator.dm @@ -79,10 +79,10 @@ if(prob(50)) var/chem_type = SSmaterials.get_random_chem(TRUE, atmos.temperature || T0C) if(chem_type) - var/nutriment = S.chems[/decl/material/liquid/nutriment] - S.chems.Cut() - S.chems[/decl/material/liquid/nutriment] = nutriment - S.chems[chem_type] = list(rand(1,10),rand(10,20)) + var/nutriment = S.get_chemical_amount(_chem = /decl/material/liquid/nutriment) + S.clear_chemical_composition() + S.set_chemical_amount(/decl/material/liquid/nutriment, nutriment) + S.set_chemical_amount(chem_type, list(rand(1,10),rand(10,20))) return S @@ -162,6 +162,6 @@ S.set_trait(TRAIT_HARVEST_REPEAT, 1) S.set_trait(TRAIT_LARGE, 1) S.set_trait(TRAIT_LEAVES_COLOUR, color) - S.chems[/decl/material/solid/organic/wood] = list(1,0) //#TODO: Maybe look at Why the seed creates injectable wood? + S.set_chemical_amount(/decl/material/solid/organic/wood, list(1,0)) //#TODO: Maybe look at Why the seed creates injectable wood? adapt_seed(S, atmos) LAZYADD(big_flora_types, S) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm index 533174a5fa11..d1515fe6582f 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/meat.dm @@ -40,9 +40,9 @@ if(prob(75)) S.get_trait(TRAIT_STINGS, 1) - LAZYSET(S.chems, /decl/material/solid/organic/meat, list(10,30)) - LAZYSET(S.chems, /decl/material/liquid/blood, list(5,10)) - LAZYSET(S.chems, /decl/material/liquid/acid/stomach, list(5,10)) + S.set_chemical_amount(/decl/material/solid/organic/meat, list(10,30)) + S.set_chemical_amount(/decl/material/liquid/blood, list(5,10)) + S.set_chemical_amount(/decl/material/liquid/acid/stomach, list(5,10)) S.set_trait(TRAIT_PARASITE,1) diff --git a/mods/content/integrated_electronics/components/input.dm b/mods/content/integrated_electronics/components/input.dm index 30268d3cb5da..17d9c59cb75b 100644 --- a/mods/content/integrated_electronics/components/input.dm +++ b/mods/content/integrated_electronics/components/input.dm @@ -298,7 +298,7 @@ for(var/i=1, i<=outputs.len, i++) set_pin_data(IC_OUTPUT, i, null) if(plant.seed && (plant in view(get_turf(src)))) // Like the medbot's analyzer it can be used at range. - for(var/chem_path in plant.seed.chems) + for(var/chem_path in plant.seed.get_chemical_composition()) var/decl/material/seed_chem = GET_DECL(chem_path) greagents.Add(seed_chem.use_name) diff --git a/mods/species/drakes/sifpod.dm b/mods/species/drakes/sifpod.dm index 1e7e45c2744f..a3fed05a820b 100644 --- a/mods/species/drakes/sifpod.dm +++ b/mods/species/drakes/sifpod.dm @@ -10,10 +10,6 @@ grown_tag = "sifpod" backyard_grilling_product = /obj/item/food/roast_sifpod backyard_grilling_announcement = "crackles and pops as the roast hull splits open." - chems = list( - /decl/material/liquid/nutriment = list(1,5), - /decl/material/liquid/sifsap = list(10,20) - ) /datum/seed/sifpod/New() ..() @@ -27,6 +23,8 @@ set_trait(TRAIT_PLANT_ICON,"tree5") set_trait(TRAIT_FLESH_COLOUR,"#05157d") set_trait(TRAIT_IDEAL_LIGHT, 1) + set_chemical_amount(/decl/material/liquid/nutriment, list(1,5)) + set_chemical_amount(/decl/material/liquid/sifsap, list(10,20)) /obj/item/food/roast_sifpod name = "roast sifpod" diff --git a/nebula.dme b/nebula.dme index 4042ec7bc748..01ed6a26c97e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2570,6 +2570,7 @@ #include "code\modules\hydroponics\processed_grown.dm" #include "code\modules\hydroponics\seed.dm" #include "code\modules\hydroponics\seed_appearance.dm" +#include "code\modules\hydroponics\seed_composition.dm" #include "code\modules\hydroponics\seed_datums_aquaculture.dm" #include "code\modules\hydroponics\seed_gene_mut.dm" #include "code\modules\hydroponics\seed_machines.dm" From 3ac58aed8694acb69f98bebdd4ac21f07f184f51 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sat, 25 Oct 2025 00:15:42 +1100 Subject: [PATCH 76/93] Adding plant dissection based on Pyrelight implementation. --- maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 2 + .../plant_dissection/_plant_dissection.dm | 6 + .../plant_dissection/_plant_dissection.dme | 10 ++ mods/content/plant_dissection/grown.dm | 106 ++++++++++++++++++ .../content/plant_dissection/grown_segment.dm | 44 ++++++++ .../plant_dissection/icons/segment.dmi | Bin 0 -> 354 bytes .../content/plant_dissection/plant_segment.dm | 88 +++++++++++++++ .../plant_dissection/seed_dissection.dm | 44 ++++++++ 9 files changed, 301 insertions(+) create mode 100644 mods/content/plant_dissection/_plant_dissection.dm create mode 100644 mods/content/plant_dissection/_plant_dissection.dme create mode 100644 mods/content/plant_dissection/grown.dm create mode 100644 mods/content/plant_dissection/grown_segment.dm create mode 100644 mods/content/plant_dissection/icons/segment.dmi create mode 100644 mods/content/plant_dissection/plant_segment.dm create mode 100644 mods/content/plant_dissection/seed_dissection.dm diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index bdb2a0ebdca8..068804e94192 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -25,6 +25,7 @@ #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/plant_dissection/_plant_dissection.dme" #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/standard_jobs/_standard_jobs.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index ef453a040ce1..acaaf113f919 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -14,6 +14,8 @@ #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/plant_dissection/_plant_dissection.dme" + #include "../../mods/content/beekeeping/_beekeeping.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/blob/_blob.dme" diff --git a/mods/content/plant_dissection/_plant_dissection.dm b/mods/content/plant_dissection/_plant_dissection.dm new file mode 100644 index 000000000000..a8229cd13147 --- /dev/null +++ b/mods/content/plant_dissection/_plant_dissection.dm @@ -0,0 +1,6 @@ +#define PLANT_SEG_PETAL "petal" +#define PLANT_SEG_STAMEN "stamen" +#define PLANT_SEG_STIGMA "stigma" + +/decl/modpack/plant_dissection + name = "Plant Dissection" diff --git a/mods/content/plant_dissection/_plant_dissection.dme b/mods/content/plant_dissection/_plant_dissection.dme new file mode 100644 index 000000000000..ebf842d7a97e --- /dev/null +++ b/mods/content/plant_dissection/_plant_dissection.dme @@ -0,0 +1,10 @@ +// BEGIN_INCLUDE +#ifndef MODPACK_PLANT_DISSECTION +#define MODPACK_PLANT_DISSECTION +#include "_plant_dissection.dm" +#include "grown.dm" +#include "grown_segment.dm" +#include "plant_segment.dm" +#include "seed_dissection.dm" +#endif +// END_INCLUDE \ No newline at end of file diff --git a/mods/content/plant_dissection/grown.dm b/mods/content/plant_dissection/grown.dm new file mode 100644 index 000000000000..a5e74515f470 --- /dev/null +++ b/mods/content/plant_dissection/grown.dm @@ -0,0 +1,106 @@ +/obj/item/food/grown + var/examine_info + var/examine_info_skill = SKILL_BOTANY + var/examine_info_rank = SKILL_BASIC + var/can_dissect = TRUE + var/list/segments + +/obj/item/food/grown/set_seed() + ..() + if(!seed || !can_dissect) + return + var/list/all_segments = seed.get_physical_composition() + if(!length(all_segments)) + can_dissect = FALSE + return + for(var/datum/plant_segment/segment as anything in all_segments) + var/add_seg = 0 + if(islist(segment.dissect_amount)) + add_seg = rand(segment.dissect_amount[1], segment.dissect_amount[2]) + else if(isnum(segment.dissect_amount)) + add_seg = segment.dissect_amount + if(add_seg) + LAZYSET(segments, segment, add_seg) + +/obj/item/food/grown/initialize_reagents(populate) + var/segment_amount = 0 + for(var/datum/plant_segment/segment as anything in segments) + if(segment.contributes_to_reagents) + segment_amount += LAZYACCESS(segment.total_reagent_volume_by_state, (PLANT_STATE_FRESH)) + volume = max(volume, segment_amount) + return ..() + +/obj/item/food/grown/Destroy() + segments = null + return ..() + +/obj/item/food/grown/update_grown_icon() + . = ..() + if(can_dissect && length(segments)) + var/list/segment_count = list() + for(var/datum/plant_segment/segment as anything in segments) + if(!segment.grown_icon || !segment.grown_icon_state) + continue + for(var/i = 1 to segments[segment]) + add_overlay(image(segment.grown_icon, "[segment.grown_icon_state][++segment_count[segment.name]]")) + +/obj/item/food/grown/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + if(distance <= 1 && can_dissect && examine_info && (!examine_info_skill || !examine_info_rank || user.skill_check(examine_info_skill, examine_info_rank))) + . += examine_info + +/obj/item/food/grown/get_examine_hints(mob/user, distance, infix, suffix) + . = ..() + if(distance > 1 || !can_dissect) + return + + var/list/fruit_segment_strings = list() + for(var/datum/plant_segment/segment as anything in segments) + if(!segment.dissect_skill || !segment.dissect_skill_requirement || user.skill_check(segment.dissect_skill, segment.dissect_skill_requirement)) + var/decl/tool_archetype/tool = segment.dissect_tool && GET_DECL(segment.dissect_tool) + var/segment_string_index = tool?.name ? ADD_ARTICLE(tool.name) : "your hands" + LAZYINITLIST(fruit_segment_strings[segment_string_index]) + fruit_segment_strings[segment_string_index][segment.name] += LAZYACCESS(segments, segment) + + for(var/segment_ind in fruit_segment_strings) + var/list/segment_strings_count = list() + for(var/segment_string in fruit_segment_strings[segment_ind]) + segment_strings_count += "[fruit_segment_strings[segment_ind][segment_string]] [segment_string]\s" + if(length(segment_strings_count)) + LAZYADD(., SPAN_NOTICE("With [segment_ind], you could harvest [english_list(segment_strings_count)].")) + +/obj/item/food/grown/attackby(obj/item/W, mob/living/user) + if(can_dissect && !user?.check_intent(I_FLAG_HARM)) + for(var/datum/plant_segment/segment as anything in segments) + if(!segment.dissect_tool || !W.get_tool_quality(segment.dissect_tool)) + continue + segment.on_harvest(W, user, src) + return TRUE + return ..() + +/obj/item/food/grown/attack_self(mob/user) + if(can_dissect) + for(var/datum/plant_segment/segment as anything in segments) + if(segment.dissect_tool) + continue + if(!segment.dissect_skill || !segment.dissect_skill_requirement || user.skill_check(segment.dissect_skill, segment.dissect_skill_requirement)) + segment.on_harvest(null, user, src) + return TRUE + return ..() + +/obj/item/food/grown/proc/remove_segment(var/datum/plant_segment/segment) + + if(!can_dissect || !(segment in segments)) + return + + if(reagents?.total_volume && segment.contributes_to_reagents) + for(var/rid in segment.reagents) + reagents.remove_reagent(rid, segment.reagents[rid]) + + segments[segment]-- + if(segments[segment] <= 0) + LAZYREMOVE(segments, segment) + update_icon() + + if(!length(segments) && !QDELETED(src)) + qdel(src) diff --git a/mods/content/plant_dissection/grown_segment.dm b/mods/content/plant_dissection/grown_segment.dm new file mode 100644 index 000000000000..70b4a9c094a1 --- /dev/null +++ b/mods/content/plant_dissection/grown_segment.dm @@ -0,0 +1,44 @@ +/datum/unit_test/icon_test/food_shall_have_icon_states/assemble_skipped_types() + ..() + skip_types |= typesof(/obj/item/food/grown/segment) + +/obj/item/food/grown/segment + name = "abstract segment" + is_spawnable_type = FALSE + seeds_extracted = TRUE // no seed extraction from petals or stamen + can_dissect = FALSE + var/datum/plant_segment/segment_data + +/obj/item/food/grown/segment/Initialize(mapload, material_key, skip_plate = FALSE, _seed, datum/plant_segment/_segment, obj/item/_source) + if(!_segment) + PRINT_STACK_TRACE("Dissected segment created with no segment datum.") + return INITIALIZE_HINT_QDEL + segment_data = _segment + plant_segment_type = segment_data.plant_segment_type + . = ..() + update_desc() + +/obj/item/food/grown/segment/Destroy() + . = ..() + segment_data = null + +/obj/item/food/grown/segment/update_base_name() + // to allow for 'dried nightweave stamen' etc + if(seed) + base_name = "[seed.product_name] [segment_data.name]" + else + base_name = segment_data.name + +/obj/item/food/grown/segment/update_desc() + base_desc = segment_data.desc // Don't bother doing the descriptor stuff from /grown + desc = base_desc + +/obj/item/food/grown/segment/update_grown_icon() + . = ..() + set_icon(segment_data.segment_icon) + icon_state = segment_data.segment_icon_state + +/obj/item/food/grown/segment/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + if(distance <= 1 && segment_data.examine_info && (!segment_data.examine_info_skill || !segment_data.examine_info_rank || user.skill_check(segment_data.examine_info_skill, segment_data.examine_info_rank))) + . += segment_data.examine_info diff --git a/mods/content/plant_dissection/icons/segment.dmi b/mods/content/plant_dissection/icons/segment.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4a9a7d372822fe9597a735d00de1c45d7ae15d19 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$Dv*8>L*{Qv*|`0?{AR_yHR znwOeX=II^-6!d!Z)fK3Qu_VYZn8D%MjWi&qqADb!#3i*jxhS)sBr`t`C^9EFte~j$ z`BCEXA`f0Y&-%uL;qM!R ztfhbYm4I$2@pN$v@#suWkYH`*HQ?fU5U#LfNymML)DqS+TpBTAs>-P;cB?mc8h6e0 zJ9bKg>yndf0B=c{nUTYzO|8pX7ezhH$>~aRklLj@*O}QMwr>&Z{x2F5tcx3L6r4O5 wCo?j#Hl1tnF*vAyUgOOyhZCZU6D}|_Fbi_|WmGG01MO$ Date: Mon, 3 Nov 2025 14:52:05 +1100 Subject: [PATCH 77/93] Simplifying hand offset logic. --- code/_onclick/hud/hud_elements/hud_robot.dm | 1 - code/_onclick/hud/hud_types/_hud.dm | 34 ++++++--------------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/code/_onclick/hud/hud_elements/hud_robot.dm b/code/_onclick/hud/hud_elements/hud_robot.dm index 687d673f3a27..9c37069baa3a 100644 --- a/code/_onclick/hud/hud_elements/hud_robot.dm +++ b/code/_onclick/hud/hud_elements/hud_robot.dm @@ -1,5 +1,4 @@ /datum/hud/robot - offset_hands_vertically = FALSE gun_mode_toggle_type = /obj/screen/gun/mode omit_hud_elements = list( /decl/hud_element/health, diff --git a/code/_onclick/hud/hud_types/_hud.dm b/code/_onclick/hud/hud_types/_hud.dm index c14dcf7c378e..9e65b258399d 100644 --- a/code/_onclick/hud/hud_types/_hud.dm +++ b/code/_onclick/hud/hud_types/_hud.dm @@ -99,8 +99,6 @@ VAR_PRIVATE/obj/screen/gun/item/gun_item_use_toggle VAR_PRIVATE/obj/screen/gun/radio/gun_radio_use_toggle - var/offset_hands_vertically = TRUE - /datum/hud/New(mob/_owner) if(istype(_owner)) owner = weakref(_owner) @@ -353,30 +351,18 @@ qdel(inv_box) // Rebuild offsets for the hand elements. + var/const/elems_per_row = 4 var/hand_y_offset = 21 var/list/elements = hud_elements_hands?.Copy() - if(length(elements)) - if(offset_hands_vertically) - while(length(elements)) - var/copy_index = min(length(elements), 2)+1 - var/list/sublist = elements.Copy(1, copy_index) - elements.Cut(1, copy_index) - var/obj/screen/inventory/inv_box - if(length(sublist) == 1) - inv_box = sublist[1] - inv_box.screen_loc = "CENTER,BOTTOM:[hand_y_offset]" - else - inv_box = sublist[1] - inv_box.screen_loc = "CENTER:-[world.icon_size/2],BOTTOM:[hand_y_offset]" - inv_box = sublist[2] - inv_box.screen_loc = "CENTER:[world.icon_size/2],BOTTOM:[hand_y_offset]" - hand_y_offset += world.icon_size - else - var/hand_x_offset = -((length(elements) * world.icon_size) / 2) + (world.icon_size/2) - for(var/obj/screen/inventory/inv_box in elements) - inv_box.screen_loc = "CENTER:[hand_x_offset],BOTTOM:[hand_y_offset]" - hand_x_offset += world.icon_size - hand_y_offset += world.icon_size + while(length(elements)) + var/copy_index = min(length(elements), elems_per_row)+1 + var/list/sublist = elements.Copy(1, copy_index) + elements.Cut(1, copy_index) + var/hand_x_offset = (world.icon_size/2) * (1 - length(sublist)) + for(var/obj/screen/inventory/inv_box in sublist) + inv_box.screen_loc = "CENTER:[hand_x_offset],BOTTOM:[hand_y_offset]" + hand_x_offset += world.icon_size + hand_y_offset += world.icon_size if(mymob.client && islist(hud_elements_hands) && length(hud_elements_hands)) mymob.client.screen |= hud_elements_hands From a0efe85d3eab3a30378f698a1657014e891d6341 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 19:05:09 +1100 Subject: [PATCH 78/93] /datum/composite_sound/var/volume -> play_volume --- code/datums/composite_sounds/_composite_sound.dm | 4 ++-- code/datums/composite_sounds/fire_sounds.dm | 4 ++-- code/datums/composite_sounds/loom.dm | 4 ++-- code/datums/composite_sounds/machinery_sounds.dm | 2 +- mods/content/supermatter/datums/sm_looping_sound.dm | 2 +- mods/content/supermatter/structures/supermatter_crystal.dm | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/datums/composite_sounds/_composite_sound.dm b/code/datums/composite_sounds/_composite_sound.dm index 8a9f563910f9..7a551b53e0fd 100644 --- a/code/datums/composite_sounds/_composite_sound.dm +++ b/code/datums/composite_sounds/_composite_sound.dm @@ -19,7 +19,7 @@ var/start_length var/end_sound var/chance - var/volume = 100 + var/play_volume = 100 var/max_loops var/direct var/timerid @@ -71,7 +71,7 @@ /datum/composite_sound/proc/play(soundfile) var/sound/S = sound(soundfile) for(var/atom/thing as anything in output_atoms) - playsound(thing, S, volume) + playsound(thing, S, play_volume) /datum/composite_sound/proc/get_sound(starttime, _mid_sounds) . = _mid_sounds || mid_sounds diff --git a/code/datums/composite_sounds/fire_sounds.dm b/code/datums/composite_sounds/fire_sounds.dm index 348962238046..ae6d8d714380 100644 --- a/code/datums/composite_sounds/fire_sounds.dm +++ b/code/datums/composite_sounds/fire_sounds.dm @@ -11,7 +11,7 @@ ) mid_length = 10 end_sound = 'sound/ambience/firecrackle06.ogg' - volume = 10 + play_volume = 10 /datum/composite_sound/grill start_sound = 'sound/machines/kitchen/grill/grill-start.ogg' @@ -19,4 +19,4 @@ mid_sounds = list('sound/machines/kitchen/grill/grill-mid1.ogg'=10) mid_length = 40 end_sound = 'sound/machines/kitchen/grill/grill-stop.ogg' - volume = 50 + play_volume = 50 diff --git a/code/datums/composite_sounds/loom.dm b/code/datums/composite_sounds/loom.dm index 4661196c2896..3f5c525c1049 100644 --- a/code/datums/composite_sounds/loom.dm +++ b/code/datums/composite_sounds/loom.dm @@ -9,7 +9,7 @@ 'sound/items/loom3.ogg' ) end_sound = 'sound/items/loomstop.ogg' - volume = 40 + play_volume = 40 // Spinning wheel sampled from 'Wooden Spinning Wheel' by Kessir on freesound.org: https://freesound.org/people/kessir/sounds/414554/ /datum/composite_sound/spinning_wheel_working @@ -22,4 +22,4 @@ 'sound/items/spinningwheel3.ogg' ) end_sound = 'sound/items/spinningwheelstop.ogg' - volume = 60 \ No newline at end of file + play_volume = 60 \ No newline at end of file diff --git a/code/datums/composite_sounds/machinery_sounds.dm b/code/datums/composite_sounds/machinery_sounds.dm index d8a261cac346..e9247a13cf32 100644 --- a/code/datums/composite_sounds/machinery_sounds.dm +++ b/code/datums/composite_sounds/machinery_sounds.dm @@ -4,4 +4,4 @@ mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1) mid_length = 10 end_sound = 'sound/machines/microwave/microwave-end.ogg' - volume = 1 \ No newline at end of file + play_volume = 1 \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_looping_sound.dm b/mods/content/supermatter/datums/sm_looping_sound.dm index bfea4820cd3b..1cdcb1933531 100644 --- a/mods/content/supermatter/datums/sm_looping_sound.dm +++ b/mods/content/supermatter/datums/sm_looping_sound.dm @@ -1,4 +1,4 @@ /datum/composite_sound/supermatter mid_sounds = list('sound/machines/sm/loops/calm.ogg'=1) mid_length = 60 - volume = 40 \ No newline at end of file + play_volume = 40 \ No newline at end of file diff --git a/mods/content/supermatter/structures/supermatter_crystal.dm b/mods/content/supermatter/structures/supermatter_crystal.dm index 415212605f44..8bc697cd896d 100644 --- a/mods/content/supermatter/structures/supermatter_crystal.dm +++ b/mods/content/supermatter/structures/supermatter_crystal.dm @@ -454,7 +454,7 @@ var/global/list/supermatter_delam_accent_sounds = list( // (this is probably wrong since hydrogen heat cap is changed from phoron) // Capped to 20 volume since higher volumes get annoying and it sounds worse. // Formula previously was min(round(power/10)+1, 20) - soundloop.volume = clamp((50 + (power / 50)), 50, 100) + soundloop.play_volume = clamp((50 + (power / 50)), 50, 100) // Swap loops between calm and delamming. if(damage >= explosion_point * 0.25) From 2d3fd2f801962b5558b0da88147b8070d54e9641 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 19:08:43 +1100 Subject: [PATCH 79/93] /decl/music_track/var/volume -> music_volume --- code/datums/music_tracks/_music_track.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/music_tracks/_music_track.dm b/code/datums/music_tracks/_music_track.dm index 290de89153a8..c1eba028164f 100644 --- a/code/datums/music_tracks/_music_track.dm +++ b/code/datums/music_tracks/_music_track.dm @@ -5,7 +5,7 @@ var/decl/license/license var/song var/url // Remember to include http:// or https:// or BYOND will be sad - var/volume = 70 + var/music_volume = 70 abstract_type = /decl/music_track /decl/music_track/Initialize() @@ -34,7 +34,7 @@ to_chat(listener, url) to_chat(listener, "License: [license.name]") - sound_to(listener, sound(song, repeat = 1, wait = 0, volume = volume, channel = sound_channels.lobby_channel)) + sound_to(listener, sound(song, repeat = 1, wait = 0, volume = music_volume, channel = sound_channels.lobby_channel)) // No VV editing anything about music tracks /decl/music_track/VV_static() From 1d38cb9eea2450ba0b8925bbf8808f0670a17d77 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 19:09:30 +1100 Subject: [PATCH 80/93] Jukebox and boombox volume -> music_volume --- code/game/machinery/jukebox.dm | 10 +++++----- code/game/objects/items/devices/boombox.dm | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 530e66903cbb..85a6ad930679 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -17,7 +17,7 @@ construct_state = /decl/machine_construction/default/panel_closed var/playing = 0 - var/volume = 20 + var/music_volume = 20 var/sound_id var/datum/sound_token/sound_token @@ -84,7 +84,7 @@ "current_track" = current_track != null ? current_track.title : "No track selected", "playing" = playing, "tracks" = juke_tracks, - "volume" = volume + "volume" = music_volume ) ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -180,12 +180,12 @@ return // Jukeboxes cheat massively and actually don't share id. This is only done because it's music rather than ambient noise. - sound_token = play_looping_sound(src, sound_id, current_track.GetTrack(), volume = volume, range = 7, falloff = 3, prefer_mute = TRUE, preference = /datum/client_preference/play_game_music, streaming = TRUE) + sound_token = play_looping_sound(src, sound_id, current_track.GetTrack(), volume = music_volume, range = 7, falloff = 3, prefer_mute = TRUE, preference = /datum/client_preference/play_game_music, streaming = TRUE) playing = 1 update_use_power(POWER_USE_ACTIVE) /obj/machinery/media/jukebox/proc/AdjustVolume(var/new_volume) - volume = clamp(new_volume, 0, 50) + music_volume = clamp(new_volume, 0, 50) if(sound_token) - sound_token.SetVolume(volume) + sound_token.SetVolume(music_volume) diff --git a/code/game/objects/items/devices/boombox.dm b/code/game/objects/items/devices/boombox.dm index 01f0e716d581..0c3e1c273082 100644 --- a/code/game/objects/items/devices/boombox.dm +++ b/code/game/objects/items/devices/boombox.dm @@ -14,7 +14,7 @@ ) var/playing = 0 var/track_num = 1 - var/volume = 20 + var/music_volume = 20 var/max_volume = 40 var/frequency = 1 var/datum/sound_token/sound_token @@ -84,10 +84,10 @@ start() return TOPIC_HANDLED if(href_list["volup"]) - change_volume(volume + 10) + change_volume(music_volume + 10) return TOPIC_HANDLED if(href_list["voldown"]) - change_volume(volume - 10) + change_volume(music_volume - 10) return TOPIC_HANDLED /obj/item/boombox/attackby(var/obj/item/used_item, var/mob/user) @@ -180,7 +180,7 @@ /obj/item/boombox/proc/start() QDEL_NULL(sound_token) var/datum/track/T = tracks[track_num] - sound_token = play_looping_sound(src, sound_id, T.GetTrack(), volume = volume, frequency = frequency, range = 7, falloff = 4, prefer_mute = TRUE, preference = /datum/client_preference/play_game_music, streaming = TRUE) + sound_token = play_looping_sound(src, sound_id, T.GetTrack(), volume = music_volume, frequency = frequency, range = 7, falloff = 4, prefer_mute = TRUE, preference = /datum/client_preference/play_game_music, streaming = TRUE) playing = 1 update_icon() if(prob(break_chance)) @@ -193,9 +193,9 @@ stop() /obj/item/boombox/proc/change_volume(var/new_volume) - volume = clamp(new_volume, 0, max_volume) + music_volume = clamp(new_volume, 0, max_volume) if(sound_token) - sound_token.SetVolume(volume) + sound_token.SetVolume(music_volume) /obj/random_multi/single_item/boombox name = "boombox spawnpoint" From 1eca96a6f84642787010b297f977bd943d38c981 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 19:11:11 +1100 Subject: [PATCH 81/93] Atmospherics device/item volume -> air_volume --- code/game/machinery/alarm.dm | 2 +- code/game/machinery/atmoalter/canister.dm | 10 +++---- .../atmoalter/portable_atmospherics.dm | 6 ++-- code/game/machinery/atmoalter/pump.dm | 6 ++-- code/game/machinery/atmoalter/scrubber.dm | 6 ++-- code/game/machinery/cracker.dm | 2 +- code/game/objects/items/devices/oxycandle.dm | 14 ++++----- .../objects/items/devices/transfer_valve.dm | 6 ++-- code/game/objects/items/rescuebag.dm | 2 +- .../objects/items/weapons/tanks/tank_types.dm | 12 ++++---- .../game/objects/items/weapons/tanks/tanks.dm | 12 ++++---- code/modules/ZAS/Fire.dm | 12 ++++---- code/modules/ZAS/Zone.dm | 6 ++-- code/modules/admin/verbs/debug.dm | 2 +- code/modules/atmospherics/atmos_primitives.dm | 28 ++++++++--------- .../binary_devices/binary_atmos_base.dm | 4 +-- .../components/binary_devices/circulator.dm | 8 ++--- .../binary_devices/oxyregenerator.dm | 2 +- .../components/binary_devices/passive_gate.dm | 16 +++++----- .../components/binary_devices/pipeturbine.dm | 10 +++---- .../components/binary_devices/pump.dm | 10 +++---- .../components/omni_devices/_omni_extras.dm | 2 +- .../components/omni_devices/filter.dm | 10 +++---- .../components/omni_devices/mixer.dm | 8 ++--- .../trinary_devices/trinary_base.dm | 6 ++-- .../components/unary/cold_sink.dm | 2 +- .../components/unary/heat_source.dm | 2 +- .../components/unary/outlet_injector.dm | 6 ++-- .../atmospherics/components/unary/tank.dm | 6 ++-- .../components/unary/unary_base.dm | 4 +-- .../components/unary/vent_pump.dm | 8 ++--- .../components/unary/vent_scrubber.dm | 8 ++--- .../atmospherics/datum_pipe_network.dm | 6 ++-- code/modules/atmospherics/datum_pipeline.dm | 22 +++++++------- code/modules/atmospherics/he_pipes.dm | 2 +- code/modules/atmospherics/pipes.dm | 12 ++++---- code/modules/hydroponics/trays/tray.dm | 2 +- code/modules/mechs/components/body.dm | 6 ++-- code/modules/mob/living/human/life.dm | 2 +- code/modules/mob/living/living_breath.dm | 2 +- code/modules/multiz/pipes.dm | 2 +- code/modules/organs/internal/lungs.dm | 2 +- .../ships/device_types/gas_thruster.dm | 6 ++-- code/modules/power/stirling.dm | 8 ++--- .../projectiles/guns/launcher/pneumatic.dm | 2 +- code/modules/recycling/disposal.dm | 2 +- code/modules/scanners/gas.dm | 2 +- code/modules/xgm/xgm_gas_mixture.dm | 30 +++++++++---------- .../components/input.dm | 2 +- mods/species/ascent/items/rig.dm | 2 +- 50 files changed, 175 insertions(+), 175 deletions(-) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 4e52cbc8c9c1..884b99b45fd0 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -272,7 +272,7 @@ environment.merge(gas) /obj/machinery/alarm/proc/overall_danger_level(var/datum/gas_mixture/environment) - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.air_volume var/environment_pressure = environment.return_pressure() var/other_moles = 0 diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index af152d8b5028..b5b96c98756a 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -9,7 +9,7 @@ construct_state = /decl/machine_construction/pipe/welder stat_immune = NOSCREEN | NOINPUT | NOPOWER start_pressure = 45 ATM - volume = 1000 + air_volume = 1000 interact_offline = TRUE matter = list( /decl/material/solid/metal/steel = 10 * SHEET_MATERIAL_AMOUNT @@ -195,7 +195,7 @@ EMPTY_CANISTER(hydrogen, /obj/machinery/portable_atmospherics/canister/hydrogen) if((air_contents.temperature > 0) && (pressure_delta > 0)) var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) - transfer_moles = min(transfer_moles, (release_flow_rate/air_contents.volume)*air_contents.total_moles) //flow rate limit + transfer_moles = min(transfer_moles, (release_flow_rate/air_contents.air_volume)*air_contents.total_moles) //flow rate limit pump_gas_passive(src, air_contents, environment, transfer_moles) can_label = (air_contents?.return_pressure() < 1) @@ -207,13 +207,13 @@ EMPTY_CANISTER(hydrogen, /obj/machinery/portable_atmospherics/canister/hydrogen) /obj/machinery/portable_atmospherics/canister/proc/return_temperature() var/datum/gas_mixture/GM = return_air() - if(GM && GM.volume>0) + if(GM && GM.air_volume>0) return GM.temperature return 0 /obj/machinery/portable_atmospherics/canister/proc/return_pressure() var/datum/gas_mixture/GM = return_air() - if(GM && GM.volume>0) + if(GM && GM.air_volume>0) return GM.return_pressure() return 0 @@ -241,7 +241,7 @@ EMPTY_CANISTER(hydrogen, /obj/machinery/portable_atmospherics/canister/hydrogen) //Can not have a pressure delta that would cause environment pressure > tank pressure var/transfer_moles = 0 if((air_contents.temperature > 0) && (pressure_delta > 0)) - transfer_moles = pressure_delta*thejetpack.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas + transfer_moles = pressure_delta*thejetpack.air_volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) thejetpack.merge(removed) to_chat(user, "You pulse-pressurize your jetpack from the tank.") diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 2958d2eab9ae..5ef82168e9d9 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -6,7 +6,7 @@ var/datum/gas_mixture/air_contents = new var/obj/item/tank/holding - var/volume = 0 + var/air_volume = 0 var/destroyed = 0 var/start_pressure = ONE_ATMOSPHERE @@ -19,7 +19,7 @@ /obj/machinery/portable_atmospherics/Initialize() ..() - air_contents.volume = volume + air_contents.air_volume = air_volume air_contents.temperature = T20C @@ -52,7 +52,7 @@ /decl/material/gas/nitrogen = N2STANDARD * MolesForPressure()) /obj/machinery/portable_atmospherics/proc/MolesForPressure(var/target_pressure = start_pressure) - return (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + return (target_pressure * air_contents.air_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) /obj/machinery/portable_atmospherics/on_update_icon() return null diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 43297c50a477..4febead3e39b 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -15,7 +15,7 @@ var/pressuremin = 0 var/pressuremax = 10 ATM - volume = 1000 + air_volume = 1000 power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 @@ -76,11 +76,11 @@ var/air_temperature if(direction_out) pressure_delta = target_pressure - environment.return_pressure() - output_volume = environment.volume * environment.group_multiplier + output_volume = environment.air_volume * environment.group_multiplier air_temperature = environment.temperature? environment.temperature : air_contents.temperature else pressure_delta = environment.return_pressure() - target_pressure - output_volume = air_contents.volume * air_contents.group_multiplier + output_volume = air_contents.air_volume * air_contents.group_multiplier air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index bf3c3498dda1..0d93d05998fd 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -10,7 +10,7 @@ movable_flags = MOVABLE_FLAG_WHEELED var/volume_rate = 800 - volume = 750 + air_volume = 750 power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 @@ -67,7 +67,7 @@ else environment = loc.return_air() - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles + var/transfer_moles = min(1, volume_rate/environment.air_volume)*environment.total_moles power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating) @@ -151,7 +151,7 @@ name = "huge air scrubber" icon_state = "scrubber:0" anchored = TRUE - volume = 50000 + air_volume = 50000 volume_rate = 5000 base_type = /obj/machinery/portable_atmospherics/powered/scrubber/huge diff --git a/code/game/machinery/cracker.dm b/code/game/machinery/cracker.dm index b3b31d1e54b0..a8287bd5038c 100644 --- a/code/game/machinery/cracker.dm +++ b/code/game/machinery/cracker.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE waterproof = TRUE - volume = 5000 + air_volume = 5000 use_power = POWER_USE_IDLE idle_power_usage = 100 active_power_usage = 10000 diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm index c24ced497aef..bed530e8b26e 100644 --- a/code/game/objects/items/devices/oxycandle.dm +++ b/code/game/objects/items/devices/oxycandle.dm @@ -14,7 +14,7 @@ var/target_pressure = ONE_ATMOSPHERE var/datum/gas_mixture/air_contents = null - var/volume = 4600 + var/candle_volume = 4600 var/on = 0 var/activation_sound = 'sound/effects/flare.ogg' var/brightness_on = 1 // Moderate-low bright. @@ -33,10 +33,10 @@ update_icon() playsound(src.loc, activation_sound, 75, 1) air_contents = new /datum/gas_mixture() - air_contents.volume = 200 //liters + air_contents.air_volume = 200 //liters air_contents.temperature = T20C var/const/OXYGEN_FRACTION = 1 // separating out the constant so it's clearer why it exists and how to modify it later - air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.air_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) START_PROCESSING(SSprocessing, src) // Process of Oxygen candles releasing air. Makes 200 volume of oxygen @@ -44,7 +44,7 @@ if(!loc) return var/turf/pos = get_turf(src) - if(volume <= 0 || !pos || (pos.turf_flags & TURF_IS_WET)) //Now uses turf flags instead of whatever aurora did + if(candle_volume <= 0 || !pos || (pos.turf_flags & TURF_IS_WET)) //Now uses turf flags instead of whatever aurora did STOP_PROCESSING(SSprocessing, src) on = 2 update_icon() @@ -56,16 +56,16 @@ pos.hotspot_expose(1500, 5) var/datum/gas_mixture/environment = loc.return_air() var/pressure_delta = target_pressure - environment.return_pressure() - var/output_volume = environment.volume * environment.group_multiplier + var/output_volume = environment.air_volume * environment.group_multiplier var/air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) if (!removed) //Just in case return environment.merge(removed) - volume -= 200 + candle_volume -= 200 var/const/OXYGEN_FRACTION = 1 // separating out the constant so it's clearer why it exists and how to modify it later - air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.air_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) /obj/item/oxycandle/on_update_icon() . = ..() diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 40f7cc830eff..6d007fa27283 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -175,7 +175,7 @@ /obj/item/transfer_valve/proc/merge_gases() if(valve_open) return - tank_two.air_contents.volume += tank_one.air_contents.volume + tank_two.air_contents.air_volume += tank_one.air_contents.air_volume var/datum/gas_mixture/temp = tank_one.remove_air_ratio(1) tank_two.assume_air(temp) valve_open = 1 @@ -189,9 +189,9 @@ if(QDELETED(tank_one) || QDELETED(tank_two)) return - var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume + var/ratio1 = tank_one.air_contents.air_volume/tank_two.air_contents.air_volume var/datum/gas_mixture/temp = tank_two.remove_air_ratio(ratio1) - tank_two.air_contents.volume -= tank_one.air_contents.volume + tank_two.air_contents.air_volume -= tank_one.air_contents.air_volume tank_one.assume_air(temp) /* diff --git a/code/game/objects/items/rescuebag.dm b/code/game/objects/items/rescuebag.dm index df7b9225027f..565d538eef84 100644 --- a/code/game/objects/items/rescuebag.dm +++ b/code/game/objects/items/rescuebag.dm @@ -70,7 +70,7 @@ /obj/structure/closet/body_bag/rescue/Initialize() . = ..() atmo = new() - atmo.volume = 0.1*CELL_VOLUME + atmo.air_volume = 0.1*CELL_VOLUME START_PROCESSING(SSobj, src) /obj/structure/closet/body_bag/rescue/Destroy() diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 643125e14e14..2792f2dca8a2 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -16,7 +16,7 @@ icon = 'icons/obj/items/tanks/tank_blue.dmi' distribute_pressure = ONE_ATMOSPHERE*O2STANDARD starting_pressure = list(/decl/material/gas/oxygen = 6 ATM) - volume = 180 + air_volume = 180 /obj/item/tank/oxygen/yellow desc = "A tank of oxygen. This one is yellow." @@ -37,7 +37,7 @@ desc = "Mixed anyone?" icon = 'icons/obj/items/tanks/tank_blue.dmi' starting_pressure = list(/decl/material/gas/oxygen = (6 ATM) * O2STANDARD, /decl/material/gas/nitrogen = (6 ATM) * N2STANDARD) - volume = 180 + air_volume = 180 /* * Hydrogen @@ -69,7 +69,7 @@ attack_cooldown = DEFAULT_WEAPON_COOLDOWN melee_accuracy_bonus = -10 distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - volume = 40 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) + air_volume = 40 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) /obj/item/tank/emergency/oxygen name = "emergency oxygen tank" @@ -81,13 +81,13 @@ /obj/item/tank/emergency/oxygen/engi name = "extended-capacity emergency oxygen tank" icon = 'icons/obj/items/tanks/tank_emergency_engineer.dmi' - volume = 60 + air_volume = 60 /obj/item/tank/emergency/oxygen/double name = "double emergency oxygen tank" icon = 'icons/obj/items/tanks/tank_emergency_double.dmi' gauge_icon = "indicator_emergency_double" - volume = 90 + air_volume = 90 w_class = ITEM_SIZE_NORMAL /obj/item/tank/emergency/oxygen/double/red //firefighting tank, fits on belt, back or suitslot @@ -105,4 +105,4 @@ icon = 'icons/obj/items/tanks/tank_red.dmi' distribute_pressure = ONE_ATMOSPHERE*O2STANDARD starting_pressure = list(/decl/material/gas/nitrogen = 10 ATM) - volume = 180 \ No newline at end of file + air_volume = 180 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 55bedc9bca88..fa7a80942993 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -42,7 +42,7 @@ var/global/list/global/tank_gauge_cache = list() var/maxintegrity = 20 var/valve_welded = 0 var/obj/item/tankassemblyproxy/proxyassembly - var/volume = 70 + var/air_volume = 70 //Used by _onclick/hud/screen_objects.dm internals to determine if someone has messed with our tank or not. //If they have and we haven't scanned it with the PDA or gas analyzer then we might just breath whatever they put in it. var/manipulated_by = null @@ -56,9 +56,9 @@ var/global/list/global/tank_gauge_cache = list() proxyassembly = new /obj/item/tankassemblyproxy(src) proxyassembly.tank = src - air_contents = new /datum/gas_mixture(volume, T20C) + air_contents = new /datum/gas_mixture(air_volume, T20C) for(var/gas in starting_pressure) - air_contents.adjust_gas(gas, starting_pressure[gas]*volume/(R_IDEAL_GAS_EQUATION*T20C), 0) + air_contents.adjust_gas(gas, starting_pressure[gas]*air_volume/(R_IDEAL_GAS_EQUATION*T20C), 0) air_contents.update_values() START_PROCESSING(SSobj, src) @@ -366,7 +366,7 @@ var/global/list/global/tank_gauge_cache = list() var/datum/gas_mixture/removed = remove_air(distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature)) if(removed) - removed.volume = volume_to_return + removed.air_volume = volume_to_return return removed /obj/item/tank/Process() @@ -418,7 +418,7 @@ var/global/list/global/tank_gauge_cache = list() pressure = air_contents.return_pressure() var/strength = ((pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE) - var/mult = ((air_contents.volume/140)**(1/2)) * (air_contents.total_moles**2/3)/((29*0.64) **2/3) //tanks appear to be experiencing a reduction on scale of about 0.64 total moles + var/mult = ((air_contents.air_volume/140)**(1/2)) * (air_contents.total_moles**2/3)/((29*0.64) **2/3) //tanks appear to be experiencing a reduction on scale of about 0.64 total moles //tanks appear to be experiencing a reduction on scale of about 0.64 total moles var/turf/T = get_turf(src) @@ -514,7 +514,7 @@ var/global/list/global/tank_gauge_cache = list() desc = initial(tank_copy.desc) icon = initial(tank_copy.icon) icon_state = initial(tank_copy.icon_state) - volume = initial(tank_copy.volume) + air_volume = initial(tank_copy.air_volume) // Set up explosive mix. air_contents.gas[DEFAULT_GAS_ACCELERANT] = 4 + rand(4) diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index b4b955ecf4e1..fe5c981c7890 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -112,15 +112,15 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin for(var/mob/living/L in loc) L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs! - loc.fire_act(air_contents, air_contents.temperature, air_contents.volume) + loc.fire_act(air_contents, air_contents.temperature, air_contents.air_volume) for(var/atom/A in loc) - A.fire_act(air_contents, air_contents.temperature, air_contents.volume) + A.fire_act(air_contents, air_contents.temperature, air_contents.air_volume) // prioritize nearby fuel overlays first for(var/direction in global.cardinal) var/turf/enemy_tile = get_step(my_tile, direction) if(istype(enemy_tile) && enemy_tile.reagents) - enemy_tile.hotspot_expose(air_contents.temperature, air_contents.volume) + enemy_tile.hotspot_expose(air_contents.temperature, air_contents.air_volume) //spread for(var/direction in global.cardinal) @@ -141,7 +141,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin enemy_tile.create_fire(firelevel) else - enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.volume) + enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.air_volume) animate(src, color = fire_color(air_contents.temperature), 5) set_light(l_color = color) @@ -209,8 +209,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).) - var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / vsc.fire_firelevel_multiplier - var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast + var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, air_volume*group_multiplier) / vsc.fire_firelevel_multiplier + var/min_burn = 0.30*air_volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast var/total_reaction_progress = min(max(min_burn, firelevel*total_fuel)*FIRE_GAS_BURNRATE_MULT, total_fuel) var/used_fuel = min(total_reaction_progress, reaction_limit) var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) diff --git a/code/modules/ZAS/Zone.dm b/code/modules/ZAS/Zone.dm index 8b3f477a586b..c62020538391 100644 --- a/code/modules/ZAS/Zone.dm +++ b/code/modules/ZAS/Zone.dm @@ -57,7 +57,7 @@ Class Procs: SSair.add_zone(src) air.temperature = TCMB air.group_multiplier = 1 - air.volume = CELL_VOLUME + air.air_volume = CELL_VOLUME /zone/proc/add(turf/T) #ifdef ZASDBG @@ -136,7 +136,7 @@ Class Procs: CHECK_TICK /zone/proc/add_tile_air(datum/gas_mixture/tile_air) - //air.volume += CELL_VOLUME + //air.air_volume += CELL_VOLUME air.group_multiplier = 1 air.multiply(contents.len) air.merge(tile_air) @@ -200,7 +200,7 @@ Class Procs: for(var/g in air.gas) var/decl/material/mat = GET_DECL(g) to_chat(M, "[capitalize(mat.gas_name)]: [air.gas[g]]") - to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") + to_chat(M, "P: [air.return_pressure()] kPa V: [air.air_volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") to_chat(M, "O2 per N2: [(air.gas[/decl/material/gas/nitrogen] ? air.gas[/decl/material/gas/oxygen]/air.gas[/decl/material/gas/nitrogen] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") to_chat(M, "Edges: [length(edges)]") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index ff76ca49fe9b..a76b2b3ef42c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -17,7 +17,7 @@ t += "Temperature: [env.temperature]\n" t += "Pressure: [env.return_pressure()]kPa\n" for(var/g in env.gas) - t += "[g]: [env.gas[g]] / [env.gas[g] * R_IDEAL_GAS_EQUATION * env.temperature / env.volume]kPa\n" + t += "[g]: [env.gas[g]] / [env.gas[g] * R_IDEAL_GAS_EQUATION * env.temperature / env.air_volume]kPa\n" usr.show_message(t, 1) SSstatistics.add_field_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/atmospherics/atmos_primitives.dm b/code/modules/atmospherics/atmos_primitives.dm index 4d78c3a4553a..d5f55ac7c74f 100644 --- a/code/modules/atmospherics/atmos_primitives.dm +++ b/code/modules/atmospherics/atmos_primitives.dm @@ -45,7 +45,7 @@ //Update flow rate meter if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + A.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here if (A.debug) A.visible_message("[A]: source entropy: [round(source.specific_entropy(), 0.01)] J/Kmol --> sink entropy: [round(sink.specific_entropy(), 0.01)] J/Kmol") @@ -55,7 +55,7 @@ if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + P.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(transfer_moles) if (!removed) //Just in case @@ -86,13 +86,13 @@ //Update flow rate meter if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + A.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here if (A.debug) A.visible_message("[A]: moles transferred = [transfer_moles] mol") if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + P.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(transfer_moles) if(!removed) //Just in case @@ -148,10 +148,10 @@ //Update flow rate var if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here var/power_draw = 0 for (var/g in filtering) @@ -217,10 +217,10 @@ //Update flow rate var if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(total_transfer_moles) if (!removed) //Just in case @@ -290,10 +290,10 @@ //Update Flow Rate var if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(total_transfer_moles) if (!removed) //Just in case @@ -350,7 +350,7 @@ source_specific_power[source] = calculate_specific_power(source, sink)*mix_ratio/ATMOS_FILTER_EFFICIENCY total_specific_power += source_specific_power[source] - total_input_volume += source.volume + total_input_volume += source.air_volume total_input_moles += source.total_moles if (total_mixing_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing @@ -429,7 +429,7 @@ /proc/calculate_transfer_moles(datum/gas_mixture/source, datum/gas_mixture/sink, var/pressure_delta, var/sink_volume_mod=0) if(source.temperature == 0 || source.total_moles == 0) return 0 - var/output_volume = (sink.volume * sink.group_multiplier) + sink_volume_mod + var/output_volume = (sink.air_volume * sink.group_multiplier) + sink_volume_mod var/source_total_moles = source.total_moles * source.group_multiplier var/air_temperature = source.temperature @@ -448,8 +448,8 @@ if(source.temperature == 0) return 0 //Make the approximation that the sink temperature is unchanged after transferring gas - var/source_volume = source.volume * source.group_multiplier - var/sink_volume = sink.volume * sink.group_multiplier + var/source_volume = source.air_volume * source.group_multiplier + var/sink_volume = sink.air_volume * sink.group_multiplier var/source_pressure = source.return_pressure() var/sink_pressure = sink.return_pressure() diff --git a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm index bd58d0d112f0..a0323b68ecad 100644 --- a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm @@ -12,8 +12,8 @@ air1 = new air2 = new - air1.volume = 200 - air2.volume = 200 + air1.air_volume = 200 + air2.air_volume = 200 . = ..() /obj/machinery/atmospherics/binary/air_in_dir(direction) diff --git a/code/modules/atmospherics/components/binary_devices/circulator.dm b/code/modules/atmospherics/components/binary_devices/circulator.dm index 16f42c276e6f..58964df51c3d 100644 --- a/code/modules/atmospherics/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/components/binary_devices/circulator.dm @@ -31,7 +31,7 @@ /obj/machinery/atmospherics/binary/circulator/Initialize() . = ..() desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]." - air1.volume = 400 + air1.air_volume = 400 /obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air() var/datum/gas_mixture/removed @@ -45,11 +45,11 @@ if(air1.temperature > 0 && last_pressure_delta > 5) //Calculate necessary moles to transfer using PV = nRT - recent_moles_transferred = (last_pressure_delta*input.volume/(air1.temperature * R_IDEAL_GAS_EQUATION))/3 //uses the volume of the whole network, not just itself - volume_capacity_used = min( (last_pressure_delta*input.volume/3)/(input_starting_pressure*air1.volume) , 1) //how much of the gas in the input air volume is consumed + recent_moles_transferred = (last_pressure_delta*input.air_volume/(air1.temperature * R_IDEAL_GAS_EQUATION))/3 //uses the volume of the whole network, not just itself + volume_capacity_used = min( (last_pressure_delta*input.air_volume/3)/(input_starting_pressure*air1.air_volume) , 1) //how much of the gas in the input air volume is consumed //Calculate energy generated from kinetic turbine - stored_energy += 1/ADIABATIC_EXPONENT * min(last_pressure_delta * input.volume , input_starting_pressure*air1.volume) * (1 - volume_ratio**ADIABATIC_EXPONENT) * kinetic_efficiency + stored_energy += 1/ADIABATIC_EXPONENT * min(last_pressure_delta * input.air_volume , input_starting_pressure*air1.air_volume) * (1 - volume_ratio**ADIABATIC_EXPONENT) * kinetic_efficiency //Actually transfer the gas removed = air1.remove(recent_moles_transferred) diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm index d38b7277bb12..0b505490c25e 100644 --- a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -90,7 +90,7 @@ var/pressure_delta = target_pressure - air2.return_pressure() if (pressure_delta > 0.01 && inner_tank.temperature > 0) var/datum/pipe_network/output = network_in_dir(dir) - var/transfer_moles = calculate_transfer_moles(inner_tank, air2, pressure_delta, output?.volume) + var/transfer_moles = calculate_transfer_moles(inner_tank, air2, pressure_delta, output?.air_volume) power_draw = pump_gas(src, inner_tank, air2, transfer_moles, power_rating*power_setting) if (power_draw >= 0) last_power_draw = power_draw diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index caacc188ddab..7573cd540fb1 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -52,8 +52,8 @@ /obj/machinery/atmospherics/binary/passive_gate/Initialize() . = ..() - air1.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 - air2.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 + air1.air_volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 + air2.air_volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 /obj/machinery/atmospherics/binary/passive_gate/on_update_icon() icon_state = (unlocked && flowing)? "on" : "off" @@ -87,7 +87,7 @@ flowing = 1 //flow rate limit - var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles + var/transfer_moles = (set_flow_rate/air1.air_volume)*air1.total_moles //Figure out how much gas to transfer to meet the target pressure. switch (regulate_mode) @@ -95,7 +95,7 @@ transfer_moles = min(transfer_moles, air1.total_moles*(pressure_delta/input_starting_pressure)) if (REGULATE_OUTPUT) var/datum/pipe_network/output = network_in_dir(dir) - transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, output?.volume)) + transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, output?.air_volume)) //pump_gas() will return a negative number if no flow occurred returnval = pump_gas_passive(src, air1, air2, transfer_moles) @@ -174,11 +174,11 @@ set_flow_rate = 0 . = TOPIC_REFRESH if ("max") - set_flow_rate = air1.volume + set_flow_rate = air1.air_volume . = TOPIC_REFRESH if ("set") - var/new_flow_rate = input(user, "Enter new flow rate limit (0-[air1.volume]kPa)","Flow Rate Control",set_flow_rate) as num - set_flow_rate = clamp(new_flow_rate, 0, air1.volume) + var/new_flow_rate = input(user, "Enter new flow rate limit (0-[air1.air_volume]kPa)","Flow Rate Control",set_flow_rate) as num + set_flow_rate = clamp(new_flow_rate, 0, air1.air_volume) . = TOPIC_REFRESH /obj/machinery/atmospherics/binary/passive_gate/proc/toggle_unlocked() @@ -219,7 +219,7 @@ return machine.set_flow_rate /decl/public_access/public_variable/passive_gate_flow_rate/write_var(obj/machinery/atmospherics/binary/passive_gate/machine, new_value) - new_value = clamp(new_value, 0, machine.air1?.volume) + new_value = clamp(new_value, 0, machine.air1?.air_volume) . = ..() if(.) machine.set_flow_rate = new_value diff --git a/code/modules/atmospherics/components/binary_devices/pipeturbine.dm b/code/modules/atmospherics/components/binary_devices/pipeturbine.dm index 510fe486f1e5..53022013e628 100644 --- a/code/modules/atmospherics/components/binary_devices/pipeturbine.dm +++ b/code/modules/atmospherics/components/binary_devices/pipeturbine.dm @@ -21,9 +21,9 @@ /obj/machinery/atmospherics/pipeturbine/Initialize() . = ..() - air_in.volume = 200 - air_out.volume = 800 - volume_ratio = air_in.volume / (air_in.volume + air_out.volume) + air_in.air_volume = 200 + air_out.air_volume = 800 + volume_ratio = air_in.air_volume / (air_in.air_volume + air_out.air_volume) /obj/machinery/atmospherics/pipeturbine/get_initialize_directions() switch(dir) @@ -48,11 +48,11 @@ kin_energy *= 1 - kin_loss dP = max(air_in.return_pressure() - air_out.return_pressure(), 0) if(dP > 10) - kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency + kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.air_volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency air_in.temperature *= volume_ratio**ADIABATIC_EXPONENT var/datum/gas_mixture/air_all = new - air_all.volume = air_in.volume + air_out.volume + air_all.air_volume = air_in.air_volume + air_out.air_volume air_all.merge(air_in.remove_ratio(1)) air_all.merge(air_out.remove_ratio(1)) diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index eeb70c699672..60fca50ad150 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -5,9 +5,9 @@ node1, air1, network1 correspond to input node2, air2, network2 correspond to output Thus, the two variables affect pump operation are set in New(): - air1.volume + air1.air_volume This is the volume of gas available to the pump that may be transfered to the output - air2.volume + air2.air_volume Higher quantities of this cause more air to be perfected later but overall network volume is also increased as this increases... */ @@ -61,8 +61,8 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/Initialize() . = ..() - air1.volume = ATMOS_DEFAULT_VOLUME_PUMP - air2.volume = ATMOS_DEFAULT_VOLUME_PUMP + air1.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + air2.air_volume = ATMOS_DEFAULT_VOLUME_PUMP /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" @@ -93,7 +93,7 @@ Thus, the two variables affect pump operation are set in New(): if(pressure_delta > 0.01 && air1.temperature > 0) //Figure out how much gas to transfer to meet the target pressure. var/datum/pipe_network/output = network_in_dir(dir) - var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, output?.volume) + var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, output?.air_volume) power_draw = pump_gas(src, air1, air2, transfer_moles, power_rating) if(transfer_moles > 0) diff --git a/code/modules/atmospherics/components/omni_devices/_omni_extras.dm b/code/modules/atmospherics/components/omni_devices/_omni_extras.dm index 1135f240029f..44357fdc75df 100644 --- a/code/modules/atmospherics/components/omni_devices/_omni_extras.dm +++ b/code/modules/atmospherics/components/omni_devices/_omni_extras.dm @@ -30,7 +30,7 @@ if(istype(M)) master = M air = new - air.volume = 200 + air.air_volume = 200 /datum/omni_port/Destroy() QDEL_NULL(network) diff --git a/code/modules/atmospherics/components/omni_devices/filter.dm b/code/modules/atmospherics/components/omni_devices/filter.dm index 1c140c763a77..198f93531b6d 100644 --- a/code/modules/atmospherics/components/omni_devices/filter.dm +++ b/code/modules/atmospherics/components/omni_devices/filter.dm @@ -39,7 +39,7 @@ rebuild_filtering_list() for(var/datum/omni_port/P in ports) - P.air.volume = ATMOS_DEFAULT_VOLUME_FILTER + P.air.air_volume = ATMOS_DEFAULT_VOLUME_FILTER /obj/machinery/atmospherics/omni/filter/Destroy() input = null @@ -57,7 +57,7 @@ if(P in gas_filters) gas_filters -= P - P.air.volume = ATMOS_DEFAULT_VOLUME_FILTER + P.air.air_volume = ATMOS_DEFAULT_VOLUME_FILTER switch(P.mode) if(ATM_INPUT) input = P @@ -82,13 +82,13 @@ var/datum/gas_mixture/input_air = input.air // it's completely happy with them if they're in a loop though i.e. "P.air.return_pressure()"... *shrug* var/delta = clamp(0, (output_air ? (max_output_pressure - output_air.return_pressure()) : 0), max_output_pressure) - var/transfer_moles_max = calculate_transfer_moles(input_air, output_air, delta, (output && output.network && output.network.volume) ? output.network.volume : 0) + var/transfer_moles_max = calculate_transfer_moles(input_air, output_air, delta, (output && output.network && output.network.air_volume) ? output.network.air_volume : 0) for(var/datum/omni_port/filter_output in gas_filters) delta = clamp(0, (filter_output.air ? (max_output_pressure - filter_output.air.return_pressure()) : 0), max_output_pressure) - transfer_moles_max = min(transfer_moles_max, (calculate_transfer_moles(input_air, filter_output.air, delta, (filter_output && filter_output.network && filter_output.network.volume) ? filter_output.network.volume : 0))) + transfer_moles_max = min(transfer_moles_max, (calculate_transfer_moles(input_air, filter_output.air, delta, (filter_output && filter_output.network && filter_output.network.air_volume) ? filter_output.network.air_volume : 0))) //Figure out the amount of moles to transfer - var/transfer_moles = clamp(0, ((set_flow_rate/input_air.volume)*input_air.total_moles), transfer_moles_max) + var/transfer_moles = clamp(0, ((set_flow_rate/input_air.air_volume)*input_air.total_moles), transfer_moles_max) var/power_draw = -1 if (transfer_moles > MINIMUM_MOLES_TO_FILTER) diff --git a/code/modules/atmospherics/components/omni_devices/mixer.dm b/code/modules/atmospherics/components/omni_devices/mixer.dm index 483e114a9f60..053803779eb4 100644 --- a/code/modules/atmospherics/components/omni_devices/mixer.dm +++ b/code/modules/atmospherics/components/omni_devices/mixer.dm @@ -54,7 +54,7 @@ con += max(0, tag_west_con) for(var/datum/omni_port/P in ports) - P.air.volume = ATMOS_DEFAULT_VOLUME_MIXER + P.air.air_volume = ATMOS_DEFAULT_VOLUME_MIXER /obj/machinery/atmospherics/omni/mixer/Destroy() inputs.Cut() @@ -80,7 +80,7 @@ P.concentration = 1 / max(1, inputs.len) if(output) - output.air.volume = ATMOS_DEFAULT_VOLUME_MIXER * 0.75 * inputs.len + output.air.air_volume = ATMOS_DEFAULT_VOLUME_MIXER * 0.75 * inputs.len output.concentration = 1 rebuild_mixing_inputs() @@ -117,8 +117,8 @@ for (var/datum/omni_port/P in inputs) if(!P.concentration) continue - transfer_moles += (set_flow_rate*P.concentration/P.air.volume)*P.air.total_moles - transfer_moles_max = min(transfer_moles_max, calculate_transfer_moles(P.air, output.air, delta, (output && output.network && output.network.volume) ? output.network.volume : 0)) + transfer_moles += (set_flow_rate*P.concentration/P.air.air_volume)*P.air.total_moles + transfer_moles_max = min(transfer_moles_max, calculate_transfer_moles(P.air, output.air, delta, (output && output.network && output.network.air_volume) ? output.network.air_volume : 0)) transfer_moles = clamp(0, transfer_moles, transfer_moles_max) var/power_draw = -1 diff --git a/code/modules/atmospherics/components/trinary_devices/trinary_base.dm b/code/modules/atmospherics/components/trinary_devices/trinary_base.dm index 38a0a30f0116..d4e72576e3dd 100644 --- a/code/modules/atmospherics/components/trinary_devices/trinary_base.dm +++ b/code/modules/atmospherics/components/trinary_devices/trinary_base.dm @@ -15,9 +15,9 @@ air2 = new air3 = new - air1.volume = 200 - air2.volume = 200 - air3.volume = 200 + air1.air_volume = 200 + air2.air_volume = 200 + air3.air_volume = 200 . = ..() /obj/machinery/atmospherics/trinary/air_in_dir(direction) diff --git a/code/modules/atmospherics/components/unary/cold_sink.dm b/code/modules/atmospherics/components/unary/cold_sink.dm index f65afc65962f..802b7c8377d3 100644 --- a/code/modules/atmospherics/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/components/unary/cold_sink.dm @@ -123,7 +123,7 @@ power_rating = initial(power_rating) * cap_rating / 2 //more powerful heatsink_temperature = initial(heatsink_temperature) / ((manip_rating + bin_rating) / 2) //more efficient - air_contents.volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating + air_contents.air_volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating set_power_level(power_setting) /obj/machinery/atmospherics/unary/freezer/proc/set_power_level(var/new_power_setting) diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index cb7df0f6098a..8b0a103476e5 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -110,7 +110,7 @@ max_power_rating = initial(max_power_rating) * cap_rating / 2 max_temperature = max(initial(max_temperature) - T20C, 0) * ((bin_rating * 4 + cap_rating) / 5) + T20C - air_contents.volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating + air_contents.air_volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating set_power_level(power_setting) /obj/machinery/atmospherics/unary/heater/proc/set_power_level(var/new_power_setting) diff --git a/code/modules/atmospherics/components/unary/outlet_injector.dm b/code/modules/atmospherics/components/unary/outlet_injector.dm index 1ed273483573..83ad2a6548cf 100644 --- a/code/modules/atmospherics/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/components/unary/outlet_injector.dm @@ -56,7 +56,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/Initialize() . = ..() //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 + air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 /obj/machinery/atmospherics/unary/outlet_injector/on_update_icon() if(stat & NOPOWER) @@ -94,7 +94,7 @@ var/datum/gas_mixture/environment = loc.return_air() if(environment && air_contents.temperature > 0) - var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit + var/transfer_moles = (volume_rate/air_contents.air_volume)*air_contents.total_moles //apply flow rate limit power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) if(transfer_moles > 0) update_networks() @@ -147,7 +147,7 @@ return machine.volume_rate /decl/public_access/public_variable/volume_rate/write_var(obj/machinery/atmospherics/unary/outlet_injector/machine, new_value) - new_value = clamp(new_value, 0, machine.air_contents.volume) + new_value = clamp(new_value, 0, machine.air_contents.air_volume) . = ..() if(.) machine.volume_rate = new_value diff --git a/code/modules/atmospherics/components/unary/tank.dm b/code/modules/atmospherics/components/unary/tank.dm index 52c6c6fc0278..ad1672b32934 100644 --- a/code/modules/atmospherics/components/unary/tank.dm +++ b/code/modules/atmospherics/components/unary/tank.dm @@ -5,7 +5,7 @@ name = "Pressure Tank" desc = "A large vessel containing pressurized gas." - var/volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet + var/air_volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet var/start_pressure = 25 ATM var/filling // list of gas ratios to use. @@ -25,12 +25,12 @@ /obj/machinery/atmospherics/unary/tank/Initialize() . = ..() - air_contents.volume = volume + air_contents.air_volume = air_volume air_contents.temperature = T20C if(filling) for(var/gas in filling) - air_contents.adjust_gas(gas, start_pressure * filling[gas] * (air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature), FALSE) + air_contents.adjust_gas(gas, start_pressure * filling[gas] * (air_contents.air_volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature), FALSE) air_contents.update_values() update_icon() diff --git a/code/modules/atmospherics/components/unary/unary_base.dm b/code/modules/atmospherics/components/unary/unary_base.dm index 290cd80db5be..308bb3294a93 100644 --- a/code/modules/atmospherics/components/unary/unary_base.dm +++ b/code/modules/atmospherics/components/unary/unary_base.dm @@ -19,7 +19,7 @@ /obj/machinery/atmospherics/unary/Initialize() air_contents = new - air_contents.volume = 200 + air_contents.air_volume = 200 if(controlled) reset_area(null, get_area(src)) . = ..() @@ -34,7 +34,7 @@ /obj/machinery/atmospherics/unary/physically_destroyed() if(loc && air_contents) loc.assume_air(air_contents) - . = ..() + . = ..() /obj/machinery/atmospherics/unary/dismantle() if(loc && air_contents) diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index c463a0687ce1..b50640cd3cf5 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -85,7 +85,7 @@ update_name() events_repository.register(/decl/observ/name_set, A, src, PROC_REF(change_area_name)) . = ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP update_sound() /obj/machinery/atmospherics/unary/vent_pump/proc/change_area_name(var/area/A, var/old_area_name, var/new_area_name) @@ -170,7 +170,7 @@ /obj/machinery/atmospherics/unary/vent_pump/high_volume/Initialize() . = ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 800 + air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + 800 /obj/machinery/atmospherics/unary/vent_pump/on_update_icon() var/visible_directions = build_device_underlays() @@ -223,7 +223,7 @@ power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) else //external -> internal var/datum/pipe_network/network = network_in_dir(dir) - transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, network?.volume) / environment.group_multiplier // limit it to just one turf's worth of gas per tick + transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, network?.air_volume) / environment.group_multiplier // limit it to just one turf's worth of gas per tick power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) else @@ -562,7 +562,7 @@ /obj/machinery/atmospherics/unary/vent_pump/engine/Initialize() . = ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //meant to match air injector + air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //meant to match air injector /obj/machinery/atmospherics/unary/vent_pump/power_change() . = ..() diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index 9ab3bc3e4976..437ff5b505c7 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -68,7 +68,7 @@ if(g != /decl/material/gas/oxygen && g != /decl/material/gas/nitrogen) scrubbing_gas += g . = ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_FILTER + air_contents.air_volume = ATMOS_DEFAULT_VOLUME_FILTER /obj/machinery/atmospherics/unary/vent_scrubber/reset_area(area/old_area, area/new_area) if(!controlled) @@ -151,17 +151,17 @@ var/transfer_moles = 0 if(scrubbing == SCRUBBER_SIPHON) //Just siphon all air //limit flow rate from turfs - transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.volume) //group_multiplier gets divided out here + transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.air_volume) //group_multiplier gets divided out here power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) else //limit flow rate from turfs - transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.volume) //group_multiplier gets divided out here + transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.air_volume) //group_multiplier gets divided out here power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating) if(scrubbing != SCRUBBER_SIPHON && power_draw <= 0) //99% of all scrubbers //Fucking hibernate because you ain't doing shit. hibernate = world.time + (rand(100,200)) else if(scrubbing == SCRUBBER_EXCHANGE) // after sleep check so it only does an exchange if there are bad gasses that have been scrubbed - transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.volume) + transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.air_volume) power_draw += pump_gas(src, environment, air_contents, transfer_moles / 4, power_rating) if (power_draw >= 0) diff --git a/code/modules/atmospherics/datum_pipe_network.dm b/code/modules/atmospherics/datum_pipe_network.dm index 37d8d1be7687..72e5c22cbe1f 100644 --- a/code/modules/atmospherics/datum_pipe_network.dm +++ b/code/modules/atmospherics/datum_pipe_network.dm @@ -1,6 +1,6 @@ /datum/pipe_network var/list/datum/gas_mixture/gases = list() //All of the gas_mixtures continuously connected in this network - var/volume = 0 //caches the total volume for atmos machines to use in gas calculations + var/air_volume = 0 //caches the total volume for atmos machines to use in gas calculations var/list/obj/machinery/atmospherics/normal_members = list() var/list/datum/pipeline/line_members = list() @@ -71,7 +71,7 @@ //Go through membership roster and make sure gases is up to date gases = list() - volume = 0 + air_volume = 0 for(var/obj/machinery/atmospherics/normal_member in normal_members) var/result = normal_member.return_network_air(src) @@ -81,4 +81,4 @@ gases += line_member.air for(var/datum/gas_mixture/air in gases) - volume += air.volume + air_volume += air.air_volume diff --git a/code/modules/atmospherics/datum_pipeline.dm b/code/modules/atmospherics/datum_pipeline.dm index 7ece1fe43700..6465b8dbb63d 100644 --- a/code/modules/atmospherics/datum_pipeline.dm +++ b/code/modules/atmospherics/datum_pipeline.dm @@ -30,7 +30,7 @@ STOP_PROCESSING(SSprocessing, src) QDEL_NULL(network) - if(air?.volume || liquid?.total_volume) + if(air?.air_volume || liquid?.total_volume) temporarily_store_fluids() QDEL_NULL(air) @@ -62,15 +62,15 @@ //Update individual gas_mixtures by volume ratio var/liquid_transfer_per_pipe = min(REAGENT_UNITS_PER_PIPE, (liquid && length(members)) ? (liquid.total_volume / length(members)) : 0) - if(!air?.volume && !liquid_transfer_per_pipe) + if(!air?.air_volume && !liquid_transfer_per_pipe) return for(var/obj/machinery/atmospherics/pipe/member in members) - if(air?.volume) + if(air?.air_volume) member.air_temporary = new member.air_temporary.copy_from(air) - member.air_temporary.volume = member.volume - member.air_temporary.multiply(member.volume / air.volume) + member.air_temporary.air_volume = member.air_volume + member.air_temporary.multiply(member.air_volume / air.air_volume) if(liquid_transfer_per_pipe) member.liquid_temporary = new(REAGENT_UNITS_PER_PIPE, member) @@ -81,7 +81,7 @@ members = list(base) edges = list() - var/volume = base.volume + var/temp_volume = base.air_volume base.parent = src maximum_pressure = base.maximum_pressure @@ -110,7 +110,7 @@ members += item possible_expansions += item - volume += item.volume + temp_volume += item.air_volume item.parent = src maximum_pressure = min(maximum_pressure, item.maximum_pressure) @@ -134,7 +134,7 @@ possible_expansions -= borderline - air.volume = volume + air.air_volume = temp_volume liquid.maximum_volume = length(members) * REAGENT_UNITS_PER_PIPE /datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) @@ -194,11 +194,11 @@ /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) - if(air.volume <= 0) // Avoid div by zero. + if(air.air_volume <= 0) // Avoid div by zero. return var/total_heat_capacity = air.heat_capacity() - var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) + var/partial_heat_capacity = total_heat_capacity*(share_volume/air.air_volume) var/datum/gas_mixture/target_air = target.return_air() if(total_heat_capacity <= 0) // Avoid div by zero. @@ -225,7 +225,7 @@ //surface must be the surface area in m^2 /datum/pipeline/proc/radiate_heat_to_space(surface, thermal_conductivity) - var/gas_density = air.total_moles/air.volume + var/gas_density = air.total_moles/air.air_volume thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio var/heat_gain = get_thermal_radiation(air.temperature, surface, RADIATOR_EXPOSED_SURFACE_AREA_RATIO, thermal_conductivity) diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index a82bfab40318..0479a7827ccd 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -73,7 +73,7 @@ var/datum/gas_mixture/environment = turf.return_air() environment_temperature = environment?.temperature || 0 if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(turf, volume, thermal_conductivity) + parent.temperature_interact(turf, air_volume, thermal_conductivity) // Burn mobs buckled to this pipe. if(buckled_mob) diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index f054a258a916..7775e036c593 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -24,7 +24,7 @@ var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke var/datum/reagents/liquid_temporary // used when reconstructing a pipeline that broke var/datum/pipeline/parent - var/volume = 0 + var/air_volume = 0 var/leaking = 0 // Do not set directly, use set_leaking(TRUE/FALSE) //minimum pressure before check_pressure(...) should be called @@ -210,7 +210,7 @@ update_sound(0) . = PROCESS_KILL else if(leaking) - parent.mingle_with_turf(loc, volume) + parent.mingle_with_turf(loc, air_volume) var/air = parent.air?.return_pressure() if(!sound_token && air) update_sound(1) @@ -225,7 +225,7 @@ name = "pipe" desc = "A one-meter section of regular pipe." - volume = ATMOS_DEFAULT_VOLUME_PIPE + air_volume = ATMOS_DEFAULT_VOLUME_PIPE dir = SOUTH initialize_directions = SOUTH|NORTH @@ -380,7 +380,7 @@ icon_state = "map" name = "pipe manifold" desc = "A manifold composed of regular pipes." - volume = ATMOS_DEFAULT_VOLUME_PIPE * 1.5 + air_volume = ATMOS_DEFAULT_VOLUME_PIPE * 1.5 dir = SOUTH initialize_directions = EAST|NORTH|WEST @@ -509,7 +509,7 @@ icon_state = "" name = "4-way pipe manifold" desc = "A manifold composed of regular pipes." - volume = ATMOS_DEFAULT_VOLUME_PIPE * 2 + air_volume = ATMOS_DEFAULT_VOLUME_PIPE * 2 dir = SOUTH initialize_directions = NORTH|SOUTH|EAST|WEST @@ -634,7 +634,7 @@ icon = 'icons/atmos/pipes.dmi' icon_state = "cap" level = LEVEL_ABOVE_PLATING - volume = 35 + air_volume = 35 pipe_class = PIPE_CLASS_UNARY dir = SOUTH diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index f3e74bd61470..5108dff2b679 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -5,7 +5,7 @@ icon_state = "hydrotray3" density = TRUE anchored = TRUE - volume = 100 + air_volume = 100 construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index 16fe9e6f62f0..7ec1cf569712 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -52,13 +52,13 @@ ) if(pilot_coverage >= 100) //Open cockpits dont get to have air cockpit = new - cockpit.volume = 200 + cockpit.air_volume = 200 if(loc) var/datum/gas_mixture/air = loc.return_air() if(air) //Essentially at this point its like we created a vacuum, but realistically making a bottle doesnt actually increase volume of a room and neither should a mech for(var/g in air.gas) - cockpit.gas[g] = (air.gas[g] / air.volume) * cockpit.volume + cockpit.gas[g] = (air.gas[g] / air.air_volume) * cockpit.air_volume cockpit.temperature = air.temperature cockpit.update_values() @@ -107,7 +107,7 @@ if(pressure_delta > 0) if(air_supply.air_contents.temperature > 0) var/transfer_moles = calculate_transfer_moles(air_supply.air_contents, cockpit, pressure_delta) - transfer_moles = min(transfer_moles, (air_supply.release_flow_rate/air_supply.air_contents.volume)*air_supply.air_contents.total_moles) + transfer_moles = min(transfer_moles, (air_supply.release_flow_rate/air_supply.air_contents.air_volume)*air_supply.air_contents.total_moles) pump_gas_passive(air_supply, air_supply.air_contents, cockpit, transfer_moles) changed = TRUE else if(pressure_delta < 0) //Release overpressure. diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index b6b9c2961886..5550afd919ab 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -173,7 +173,7 @@ var/temperature_gain = heat_gain/HUMAN_HEAT_CAPACITY bodytemperature += temperature_gain //temperature_gain will often be negative - var/relative_density = (environment.total_moles/environment.volume) / (MOLES_CELLSTANDARD/CELL_VOLUME) + var/relative_density = (environment.total_moles/environment.air_volume) / (MOLES_CELLSTANDARD/CELL_VOLUME) if(relative_density > 0.02) //don't bother if we are in vacuum or near-vacuum var/loc_temp = environment.temperature diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index 69241dac54ae..de595f991f41 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -81,7 +81,7 @@ if(!can_breathe_air_above) breath = new if(!can_drown()) - breath.volume = volume_needed + breath.air_volume = volume_needed breath.temperature = my_turf.temperature // TODO: species-breathable gas instead of oxygen default. Maybe base it on the reagents being breathed breath.adjust_gas(/decl/material/gas/oxygen, ONE_ATMOSPHERE*volume_needed/(R_IDEAL_GAS_EQUATION*T20C)) diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 8ed74828c58e..414fd5ff0b6d 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -8,7 +8,7 @@ name = "upwards pipe" desc = "A pipe segment to connect upwards." - volume = 70 + air_volume = 70 dir = SOUTH initialize_directions = SOUTH diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 003f7b851d15..199a8b4e8e4b 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -307,7 +307,7 @@ else temp_adj /= (BODYTEMP_HEAT_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed - var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * breath.volume/CELL_VOLUME) + var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * breath.air_volume/CELL_VOLUME) temp_adj *= relative_density if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX diff --git a/code/modules/overmap/ships/device_types/gas_thruster.dm b/code/modules/overmap/ships/device_types/gas_thruster.dm index b2fcd8711772..1656acd207d2 100644 --- a/code/modules/overmap/ships/device_types/gas_thruster.dm +++ b/code/modules/overmap/ships/device_types/gas_thruster.dm @@ -29,10 +29,10 @@ /datum/extension/ship_engine/gas/proc/get_propellant(var/sample_only = TRUE, var/partial = 1) var/obj/machinery/atmospherics/unary/engine/E = holder - if(istype(E) && E.air_contents?.volume > 0) - var/datum/gas_mixture/removed = E.air_contents.remove_ratio((volume_per_burn * thrust_limit * partial) / E.air_contents.volume) + if(istype(E) && E.air_contents?.air_volume > 0) + var/datum/gas_mixture/removed = E.air_contents.remove_ratio((volume_per_burn * thrust_limit * partial) / E.air_contents.air_volume) if(removed && sample_only) - var/datum/gas_mixture/sample = new(removed.volume) + var/datum/gas_mixture/sample = new(removed.air_volume) sample.copy_from(removed) E.air_contents.merge(removed) return sample diff --git a/code/modules/power/stirling.dm b/code/modules/power/stirling.dm index ea7b725c4cb1..0903296bdddb 100644 --- a/code/modules/power/stirling.dm +++ b/code/modules/power/stirling.dm @@ -196,10 +196,10 @@ if(!sound_id) sound_id = "[type]_[sequential_id(/obj/machinery/atmospherics/binary/stirling)]" if(active) - var/volume = 10 + 15*genlev + var/work_volume = 10 + 15*genlev if(!sound_token) - sound_token = play_looping_sound(src, sound_id, 'sound/machines/engine.ogg', volume = volume) - sound_token.SetVolume(volume) + sound_token = play_looping_sound(src, sound_id, 'sound/machines/engine.ogg', volume = work_volume) + sound_token.SetVolume(work_volume) else if(sound_token) QDEL_NULL(sound_token) @@ -225,7 +225,7 @@ slot_flags = null starting_pressure = list(/decl/material/gas/hydrogen = 2 ATM) - volume = 30 + air_volume = 30 failure_temp = 1000 /obj/item/tank/stirling/Initialize() diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 5e1dcb93e82d..331322b76cfd 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -111,7 +111,7 @@ /obj/item/gun/launcher/pneumatic/update_release_force(obj/item/projectile) if(tank) - release_force = ((fire_pressure*tank.volume)/projectile.w_class)/force_divisor //projectile speed. + release_force = ((fire_pressure*tank.air_volume)/projectile.w_class)/force_divisor //projectile speed. if(release_force > 80) release_force = 80 //damage cap. else release_force = 0 diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index efcccf407aac..7f728007f023 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -364,7 +364,7 @@ var/global/list/diversion_junctions = list() var/power_draw = -1 if(env && env.temperature > 0) - var/transfer_moles = (PUMP_MAX_FLOW_RATE/env.volume)*env.total_moles //group_multiplier is divided out here + var/transfer_moles = (PUMP_MAX_FLOW_RATE/env.air_volume)*env.total_moles //group_multiplier is divided out here power_draw = pump_gas(src, env, air_contents, transfer_moles, active_power_usage) if (power_draw > 0) diff --git a/code/modules/scanners/gas.dm b/code/modules/scanners/gas.dm index b4bc1705cf26..5ad8c4bc9f02 100644 --- a/code/modules/scanners/gas.dm +++ b/code/modules/scanners/gas.dm @@ -79,7 +79,7 @@ . += "[capitalize(mat.gas_name)]: [percentage]%[perGas_add_string]" var/totalGas_add_string = "" if(mode == MV_MODE) - totalGas_add_string = ", Total moles: [round(mixture.total_moles, 0.01)], Volume: [mixture.volume]L" + totalGas_add_string = ", Total moles: [round(mixture.total_moles, 0.01)], Volume: [mixture.air_volume]L" . += "Temperature: [round(mixture.temperature-T0C)]°C / [round(mixture.temperature)]K[totalGas_add_string]" return diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index 823c729e3b1f..0c947ca8ba2a 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -8,7 +8,7 @@ //Sum of all the gas moles in this mix. Updated by update_values() var/total_moles = 0 //Volume of this mix. - var/volume = CELL_VOLUME + var/air_volume = CELL_VOLUME //Size of the group this gas_mixture is representing. 1 for singletons. var/group_multiplier = 1 @@ -21,14 +21,14 @@ /datum/gas_mixture/New(_volume, _temperature, _group_multiplier) if(!isnull(_volume)) - volume = _volume + air_volume = _volume if(!isnull(_temperature)) temperature = _temperature if(!isnull(_group_multiplier)) group_multiplier = _group_multiplier //Since we may have values defined on creation, update everything. - if(volume && length(gas)) + if(air_volume && length(gas)) update_values() /datum/gas_mixture/proc/get_gas(gasid) @@ -107,9 +107,9 @@ for(var/g in gas|sharer.gas) var/comb = gas[g] + sharer.gas[g] - comb /= volume + sharer.volume - gas[g] = comb * volume - sharer.gas[g] = comb * sharer.volume + comb /= air_volume + sharer.air_volume + gas[g] = comb * air_volume + sharer.gas[g] = comb * sharer.air_volume if(our_heatcap + share_heatcap) temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) @@ -188,7 +188,7 @@ var/molar_mass = mat.molar_mass var/specific_heat = mat.gas_specific_heat var/safe_temp = max(temperature, TCMB) // We're about to divide by this. - return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) + return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*air_volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) //alternative, simpler equation //var/partial_pressure = gas[gasid] * R_IDEAL_GAS_EQUATION * temperature / volume @@ -209,8 +209,8 @@ //Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since update_values() has been called. /datum/gas_mixture/proc/return_pressure() - if(volume) - return total_moles * R_IDEAL_GAS_EQUATION * temperature / volume + if(air_volume) + return total_moles * R_IDEAL_GAS_EQUATION * temperature / air_volume return 0 @@ -249,7 +249,7 @@ gas[g] = gas[g] * (1 - ratio) removed.temperature = temperature - removed.volume = volume * group_multiplier / out_group_multiplier + removed.air_volume = air_volume * group_multiplier / out_group_multiplier update_values() removed.update_values() @@ -257,8 +257,8 @@ //Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume /datum/gas_mixture/proc/remove_volume(removed_volume) - var/datum/gas_mixture/removed = remove_ratio(removed_volume/(volume*group_multiplier), 1) - removed.volume = removed_volume + var/datum/gas_mixture/removed = remove_ratio(removed_volume/(air_volume*group_multiplier), 1) + removed.air_volume = removed_volume return removed //Removes moles from the gas mixture, limited by a given flag. Returns a gax_mixture containing the removed air. @@ -305,7 +305,7 @@ return 1 /datum/gas_mixture/GetCloneArgs() - return list(volume, temperature, group_multiplier) + return list(air_volume, temperature, group_multiplier) /datum/gas_mixture/PopulateClone(datum/gas_mixture/clone) clone.gas = gas.Copy() @@ -461,7 +461,7 @@ var/list/total_gas = list() for(var/datum/gas_mixture/gasmix in gases) - total_volume += gasmix.volume + total_volume += gasmix.air_volume var/temp_heatcap = gasmix.heat_capacity() total_thermal_energy += gasmix.temperature * temp_heatcap total_heat_capacity += temp_heatcap @@ -488,7 +488,7 @@ for(var/datum/gas_mixture/gasmix in gases) gasmix.gas = combined.gas.Copy() gasmix.temperature = combined.temperature - gasmix.multiply(gasmix.volume) + gasmix.multiply(gasmix.air_volume) return 1 diff --git a/mods/content/integrated_electronics/components/input.dm b/mods/content/integrated_electronics/components/input.dm index 17d9c59cb75b..1b9dadba0695 100644 --- a/mods/content/integrated_electronics/components/input.dm +++ b/mods/content/integrated_electronics/components/input.dm @@ -1109,7 +1109,7 @@ set_pin_data(IC_OUTPUT, 3, round(air_contents.get_total_moles(), 0.001)) set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001)) set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001)) - set_pin_data(IC_OUTPUT, 6, round(air_contents.volume, 0.001)) + set_pin_data(IC_OUTPUT, 6, round(air_contents.air_volume, 0.001)) push_data() activate_pin(2) diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index 321d28d856af..0ff52ab6c846 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -135,7 +135,7 @@ name = "mantid gas tank" icon = 'mods/species/ascent/icons/tank.dmi' distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - volume = 180 + air_volume = 180 /obj/item/tank/mantid/methyl_bromide starting_pressure = list(/decl/material/gas/methyl_bromide = 6 ATM) From 2efd349dbcd5de1ae56c076b7c9bcc483ee78a52 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 19:25:18 +1100 Subject: [PATCH 82/93] Various local uses of var/volume -> disambiguated var names. --- code/game/objects/explosion.dm | 8 ++++---- code/game/objects/items/_item_damage.dm | 8 ++++---- code/game/objects/structures/fires.dm | 6 +++--- .../liquids/materials_liquid_water.dm | 4 ++-- .../solids/materials_solid_elements.dm | 6 +++--- .../solids/materials_solid_mineral.dm | 6 +++--- code/modules/materials/material_metabolism.dm | 6 +++--- code/modules/mob/living/living.dm | 18 +++++++++--------- .../modules/overmap/ships/computers/sensors.dm | 6 +++--- code/modules/power/port_gen.dm | 7 +++---- code/modules/reagents/Chemistry-Holder.dm | 16 ++++++++-------- code/modules/reagents/chems/chems_blood.dm | 6 +++--- code/modules/reagents/chems/chems_compounds.dm | 8 ++++---- code/modules/reagents/chems/chems_drinks.dm | 6 +++--- code/modules/reagents/chems/chems_drugs.dm | 6 +++--- .../modules/reagents/chems/chems_explosives.dm | 14 +++++++------- code/modules/reagents/chems/chems_fuel.dm | 14 +++++++------- code/modules/reagents/chems/chems_medicines.dm | 8 ++++---- .../reagents/chems/chems_painkillers.dm | 6 +++--- .../reagents/chems/chems_psychiatric.dm | 4 ++-- 20 files changed, 81 insertions(+), 82 deletions(-) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index f037c65998aa..51ac6d43b52c 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -182,7 +182,7 @@ log_debug("iexpl: Beginning SFX phase.") time = REALTIMEOFDAY - var/volume = 10 + (power * 20) + var/explosion_volume = 10 + (power * 20) var/frequency = get_rand_frequency() var/close_dist = round(power + world.view - 2, 1) @@ -217,12 +217,12 @@ var/dist = get_dist(M, epicenter) || 1 if ((reception & EXPLFX_SOUND) && !HAS_STATUS(M, STAT_DEAF)) if (dist <= close_dist) - M.playsound_local(epicenter, explosion_sound, min(100, volume), 1, frequency, falloff = 5) + M.playsound_local(epicenter, explosion_sound, min(100, explosion_volume), 1, frequency, falloff = 5) //You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. else - volume = M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', volume, 1, frequency, falloff = 1000) + explosion_volume = M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', explosion_volume, 1, frequency, falloff = 1000) - if ((reception & EXPLFX_SHAKE) && volume > 0) + if ((reception & EXPLFX_SHAKE) && explosion_volume > 0) shake_camera(M, min(30, max(2,(power*2) / dist)), min(3.5, ((power/3) / dist)),0.05) //Maximum duration is 3 seconds, and max strength is 3.5 //Becuse values higher than those just get really silly diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index 15affb6205ba..f63e42bcd930 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -77,14 +77,14 @@ /obj/item/throw_impact(atom/hit_atom, datum/thrownthing/TT) . = ..() if(isliving(hit_atom)) //Living mobs handle hit sounds differently. - var/volume = get_volume_by_throwforce_and_or_w_class() + var/impact_volume = get_volume_by_throwforce_and_or_w_class() if (get_thrown_attack_force() > 0) if(hitsound) - playsound(hit_atom, hitsound, volume, TRUE, -1) + playsound(hit_atom, hitsound, impact_volume, TRUE, -1) else - playsound(hit_atom, 'sound/weapons/genhit.ogg', volume, TRUE, -1) + playsound(hit_atom, 'sound/weapons/genhit.ogg', impact_volume, TRUE, -1) else - playsound(hit_atom, 'sound/weapons/throwtap.ogg', volume, TRUE, -1) + playsound(hit_atom, 'sound/weapons/throwtap.ogg', impact_volume, TRUE, -1) /obj/item/proc/eyestab(mob/living/M, mob/living/user) var/mob/living/human/H = M diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index b96ef8f2aef1..a8b408d77a45 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -374,12 +374,12 @@ if(reagent.accelerant_value <= FUEL_VALUE_SUPPRESSANT && reagent.phase_at_temperature(get_effective_burn_temperature(), ambient_pressure) == MAT_PHASE_GAS) do_steam = TRUE - var/volume = NONUNIT_CEILING(REAGENT_VOLUME(reagents, reagent) / REAGENT_UNITS_PER_GAS_MOLE, 0.1) - var/list/waste_products = burn_material(reagent, volume) + var/result_volume = NONUNIT_CEILING(REAGENT_VOLUME(reagents, reagent) / REAGENT_UNITS_PER_GAS_MOLE, 0.1) + var/list/waste_products = burn_material(reagent, result_volume) if(!isnull(waste_products)) for(var/product in waste_products) waste[product] += waste_products[product] - reagents.remove_reagent(reagent.type, volume) + reagents.remove_reagent(reagent.type, result_volume) dump_waste_products(loc, waste) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 3c1a5adbc39a..7524049c51de 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -89,9 +89,9 @@ touching_turf.assume_air(lowertemp) qdel(hotspot) - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) if (environment && environment.temperature > min_temperature) // Abstracted as steam or something - var/removed_heat = clamp(volume * WATER_LATENT_HEAT, 0, -environment.get_thermal_energy_change(min_temperature)) + var/removed_heat = clamp(affect_volume * WATER_LATENT_HEAT, 0, -environment.get_thermal_energy_change(min_temperature)) environment.add_thermal_energy(-removed_heat) if (prob(5) && environment && environment.temperature > T100C) touching_turf.visible_message(SPAN_NOTICE("The water sizzles as it lands on \the [touching_turf]!")) diff --git a/code/modules/materials/definitions/solids/materials_solid_elements.dm b/code/modules/materials/definitions/solids/materials_solid_elements.dm index 330c11ada5ab..2e1c477f4aa7 100644 --- a/code/modules/materials/definitions/solids/materials_solid_elements.dm +++ b/code/modules/materials/definitions/solids/materials_solid_elements.dm @@ -109,8 +109,8 @@ /decl/material/solid/potassium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() - var/volume = REAGENT_VOLUME(holder, src) - if(volume > 3) + var/affect_volume = REAGENT_VOLUME(holder, src) + if(affect_volume > 3) M.add_chemical_effect(CE_PULSE, 1) - if(volume > 10) + if(affect_volume > 10) M.add_chemical_effect(CE_PULSE, 1) diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 805cff68e0ef..d88305ae97c7 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -184,10 +184,10 @@ /decl/material/solid/potash/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() - var/volume = REAGENT_VOLUME(holder, src) - if(volume > 3) + var/affect_volume = REAGENT_VOLUME(holder, src) + if(affect_volume > 3) M.add_chemical_effect(CE_PULSE, 1) - if(volume > 10) + if(affect_volume > 10) M.add_chemical_effect(CE_PULSE, 1) /decl/material/solid/bauxite diff --git a/code/modules/materials/material_metabolism.dm b/code/modules/materials/material_metabolism.dm index db8c71101741..0223b10a6738 100644 --- a/code/modules/materials/material_metabolism.dm +++ b/code/modules/materials/material_metabolism.dm @@ -56,11 +56,11 @@ touching_turf.wet_floor(slipperiness) if(length(vapor_products)) - var/volume = REAGENT_VOLUME(holder, src) + var/result_volume = REAGENT_VOLUME(holder, src) var/temperature = holder?.my_atom?.temperature || T20C for(var/vapor in vapor_products) - touching_turf.assume_gas(vapor, (volume * vapor_products[vapor]), temperature) - holder.remove_reagent(src, volume) + touching_turf.assume_gas(vapor, (result_volume * vapor_products[vapor]), temperature) + holder.remove_reagent(src, result_volume) /decl/material/proc/on_mob_life(var/mob/living/M, var/metabolism_class, var/datum/reagents/holder, var/list/life_dose_tracker) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 043a2bc69b54..1e6497c10a04 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1672,23 +1672,23 @@ default behaviour is: return var/range = world.view - 2 - var/volume = 70 + var/step_volume = 70 if(MOVING_DELIBERATELY(src)) - volume -= 45 + step_volume -= 45 range -= 0.333 var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) - volume = round(modify_footstep_volume(volume, shoes)) + step_volume = round(modify_footstep_volume(step_volume, shoes)) range = round(modify_footstep_range(range, shoes)) - if(volume > 0 && range > 0) - playsound(T, footsound, volume, 1, range) + if(step_volume > 0 && range > 0) + playsound(T, footsound, step_volume, 1, range) -/mob/living/proc/modify_footstep_volume(volume, obj/item/clothing/shoes/shoes) +/mob/living/proc/modify_footstep_volume(step_volume, obj/item/clothing/shoes/shoes) if(istype(shoes)) - return volume * shoes.footstep_volume_mod + return step_volume * shoes.footstep_volume_mod if(!shoes) - return volume - 60 - return volume + return step_volume - 60 + return step_volume /mob/living/proc/modify_footstep_range(range, obj/item/clothing/shoes/shoes) if(istype(shoes)) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index d1a572768517..9e2494128f91 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -38,10 +38,10 @@ var/obj/machinery/shipsensors/sensors = get_sensors() if(linked && sensors?.use_power && !(sensors.stat & NOPOWER)) - var/volume = 10 + var/ping_volume = 10 if(!sound_token) - sound_token = play_looping_sound(src, sound_id, working_sound, volume = volume, range = 10) - sound_token.SetVolume(volume) + sound_token = play_looping_sound(src, sound_id, working_sound, volume = ping_volume, range = 10) + sound_token.SetVolume(ping_volume) else if(sound_token) QDEL_NULL(sound_token) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 526fefb07ed4..0097a98ff0c0 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -37,11 +37,10 @@ if(!sound_id) sound_id = "[type]_[sequential_id(/obj/machinery/port_gen)]" if(active && HasFuel() && !IsBroken()) - var/volume = 10 + 15*power_output + var/work_volume = 10 + 15*power_output if(!sound_token) - - sound_token = play_looping_sound(src, sound_id, working_sound, volume = volume) - sound_token.SetVolume(volume) + sound_token = play_looping_sound(src, sound_id, working_sound, volume = work_volume) + sound_token.SetVolume(work_volume) else if(sound_token) QDEL_NULL(sound_token) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index db6297109b64..accaa0b35218 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -460,19 +460,19 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new for(var/decl/material/reagent as anything in liquid_volumes) if(scannable_only && !reagent.scannable) continue - var/volume = REAGENT_VOLUME(src, reagent) + var/scan_volume = REAGENT_VOLUME(src, reagent) if(precision) - volume = round(volume, precision) - if(volume) - . += "[reagent.get_reagent_name(src, MAT_PHASE_LIQUID)] ([volume])" + scan_volume = round(scan_volume, precision) + if(scan_volume) + . += "[reagent.get_reagent_name(src, MAT_PHASE_LIQUID)] ([scan_volume])" for(var/decl/material/reagent as anything in solid_volumes) if(scannable_only && !reagent.scannable) continue - var/volume = REAGENT_VOLUME(src, reagent) + var/scan_volume = REAGENT_VOLUME(src, reagent) if(precision) - volume = round(volume, precision) - if(volume) - . += "[reagent.get_reagent_name(src, MAT_PHASE_SOLID)] ([volume])" + scan_volume = round(scan_volume, precision) + if(scan_volume) + . += "[reagent.get_reagent_name(src, MAT_PHASE_SOLID)] ([scan_volume])" return english_list(., "EMPTY", "", ", ", ", ") /datum/reagents/proc/get_dirtiness() diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index 4642d9af3883..c4396a07c04f 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -65,10 +65,10 @@ /decl/material/liquid/blood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) var/mob/living/human/H = M - H.inject_blood(volume, holder) - holder.remove_reagent(type, volume) + H.inject_blood(affect_volume, holder) + holder.remove_reagent(type, affect_volume) . = ..() /decl/material/liquid/blood/get_reagent_color(datum/reagents/holder) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index bb54882996bf..7467842c66e9 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -283,14 +283,14 @@ /decl/material/liquid/lactate/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) M.add_chemical_effect(CE_PULSE, 1) - if(volume >= 10) + if(affect_volume >= 10) M.add_chemical_effect(CE_PULSE, 1) - M.add_chemical_effect(CE_SLOWDOWN, (volume/15) ** 2) + M.add_chemical_effect(CE_SLOWDOWN, (affect_volume/15) ** 2) else if(CHEM_DOSE(M, src) > 30) //after prolonged exertion ADJ_STATUS(M, STAT_JITTER, 5) - M.add_chemical_effect(CE_BREATHLOSS, 0.02 * volume) + M.add_chemical_effect(CE_BREATHLOSS, 0.02 * affect_volume) /decl/material/liquid/nanoblood name = "nanoblood" diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index b02703e26e11..95ee2c8611c7 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -369,10 +369,10 @@ if(M.has_trait(/decl/trait/metabolically_inert)) return - var/volume = REAGENT_VOLUME(holder, src) - if(volume > 15) + var/affect_volume = REAGENT_VOLUME(holder, src) + if(affect_volume > 15) M.add_chemical_effect(CE_PULSE, 1) - if(volume > 45) + if(affect_volume > 45) M.add_chemical_effect(CE_PULSE, 1) /decl/material/liquid/drink/coffee/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index c00540af2334..7a998e6981d0 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -50,14 +50,14 @@ uid = "chem_nicotine" /decl/material/liquid/nicotine/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) . = ..() - if(prob(volume*20)) + if(prob(affect_volume*20)) M.add_chemical_effect(CE_PULSE, 1) var/update_data = FALSE var/list/data = REAGENT_DATA(holder, src) - if(volume <= 0.02 && CHEM_DOSE(M, src) >= 0.05 && world.time > LAZYACCESS(data, DATA_COOLDOWN_TIME) + 3 MINUTES) + if(affect_volume <= 0.02 && CHEM_DOSE(M, src) >= 0.05 && world.time > LAZYACCESS(data, DATA_COOLDOWN_TIME) + 3 MINUTES) update_data = TRUE to_chat(M, "You feel antsy, your concentration wavers...") else if(world.time > LAZYACCESS(data, DATA_COOLDOWN_TIME) + 3 MINUTES) diff --git a/code/modules/reagents/chems/chems_explosives.dm b/code/modules/reagents/chems/chems_explosives.dm index 58573abdbb42..c23813eed550 100644 --- a/code/modules/reagents/chems/chems_explosives.dm +++ b/code/modules/reagents/chems/chems_explosives.dm @@ -11,22 +11,22 @@ /decl/material/liquid/anfo/explosion_act(obj/item/chems/holder, severity) . = ..() if(.) - var/volume = REAGENT_VOLUME(holder?.reagents, type) - var/activated_volume = volume + var/affect_volume = REAGENT_VOLUME(holder?.reagents, type) + var/activated_volume = affect_volume switch(severity) if(2) - if(prob(max(0, 2*(volume - 120)))) - activated_volume = rand(volume/4, volume) + if(prob(max(0, 2*(affect_volume - 120)))) + activated_volume = rand(affect_volume/4, affect_volume) if(3) - if(prob(max(0, 2*(volume - 60)))) - activated_volume = rand(volume, 120) + if(prob(max(0, 2*(affect_volume - 60)))) + activated_volume = rand(affect_volume, 120) if(activated_volume < 30) //whiff return var/turf/T = get_turf(holder) if(T) var/adj_power = round(boompower * activated_volume/60) var/datum/gas_mixture/products = new(_temperature = 5 * FLAMMABLE_GAS_FLASHPOINT) - var/gas_moles = 3 * volume + var/gas_moles = 3 * affect_volume products.adjust_gas(/decl/material/gas/carbon_dioxide, 0.5 * gas_moles, FALSE) products.adjust_gas(/decl/material/gas/nitrogen, 0.3 * gas_moles, FALSE) products.adjust_gas(/decl/material/liquid/water, 0.2 * gas_moles, TRUE) diff --git a/code/modules/reagents/chems/chems_fuel.dm b/code/modules/reagents/chems/chems_fuel.dm index 539d0e1b2e8d..c3adf5d8c90a 100644 --- a/code/modules/reagents/chems/chems_fuel.dm +++ b/code/modules/reagents/chems/chems_fuel.dm @@ -20,24 +20,24 @@ /decl/material/liquid/fuel/explosion_act(obj/item/chems/holder, severity) . = ..() if(.) - var/volume = REAGENT_VOLUME(holder?.reagents, type) - if(volume <= 50) + var/product_volume = REAGENT_VOLUME(holder?.reagents, type) + if(product_volume <= 50) return var/turf/T = get_turf(holder) var/datum/gas_mixture/products = new(_temperature = 5 * FLAMMABLE_GAS_FLASHPOINT) - var/gas_moles = 3 * volume + var/gas_moles = 3 * product_volume products.adjust_gas(/decl/material/gas/nitricoxide, 0.1 * gas_moles, FALSE) products.adjust_gas(/decl/material/gas/nitrodioxide, 0.1 * gas_moles, FALSE) products.adjust_gas(/decl/material/gas/nitrogen, 0.6 * gas_moles, FALSE) products.adjust_gas(/decl/material/gas/hydrogen, 0.02 * gas_moles, TRUE) T.assume_air(products) - if(volume > 500) + if(product_volume > 500) explosion(T,1,2,4) - else if(volume > 100) + else if(product_volume > 100) explosion(T,0,1,3) - else if(volume > 50) + else if(product_volume > 50) explosion(T,-1,1,2) - holder?.reagents?.remove_reagent(type, volume) + holder?.reagents?.remove_reagent(type, product_volume) /decl/material/liquid/fuel/hydrazine name = "hydrazine" diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 9c22dfc135ef..fac296caebb6 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -226,18 +226,18 @@ uid = "chem_adrenaline" /decl/material/liquid/adrenaline/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) var/dose = CHEM_DOSE(M, src) . = ..() if(dose < 0.2) //not that effective after initial rush - M.add_chemical_effect(CE_PAINKILLER, min(30*volume, 80)) + M.add_chemical_effect(CE_PAINKILLER, min(30*affect_volume, 80)) M.add_chemical_effect(CE_PULSE, 1) else if(dose < 1) - M.add_chemical_effect(CE_PAINKILLER, min(10*volume, 20)) + M.add_chemical_effect(CE_PAINKILLER, min(10*affect_volume, 20)) M.add_chemical_effect(CE_PULSE, 2) if(dose > 10) ADJ_STATUS(M, STAT_JITTER, 5) - if(volume >= 5 && M.is_asystole()) + if(affect_volume >= 5 && M.is_asystole()) holder.remove_reagent(type, 5) if(ishuman(M)) var/mob/living/human/H = M diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index 9a976f06e2de..f6185712f460 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -43,14 +43,14 @@ narcotic = TRUE /decl/material/liquid/painkillers/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) var/dose = CHEM_DOSE(M, src) . = ..() var/effectiveness = 1 if(dose < effective_dose) //some ease-in ease-out for the effect effectiveness = dose/effective_dose - else if(volume < effective_dose) - effectiveness = volume/effective_dose + else if(affect_volume < effective_dose) + effectiveness = affect_volume/effective_dose M.add_chemical_effect(CE_PAINKILLER, (pain_power * effectiveness)) diff --git a/code/modules/reagents/chems/chems_psychiatric.dm b/code/modules/reagents/chems/chems_psychiatric.dm index 2bc88925516f..e81e3c6eba49 100644 --- a/code/modules/reagents/chems/chems_psychiatric.dm +++ b/code/modules/reagents/chems/chems_psychiatric.dm @@ -14,13 +14,13 @@ var/effect_cooldown = 5 MINUTES /decl/material/liquid/accumulated/affect_blood(mob/living/victim, removed, datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, src) + var/affect_volume = REAGENT_VOLUME(holder, src) . = ..() var/update_data = FALSE var/list/data = REAGENT_DATA(holder, src) var/is_off_cooldown = world.time > LAZYACCESS(data, DATA_COOLDOWN_TIME) + effect_cooldown - if(volume <= required_volume && CHEM_DOSE(victim, src) >= required_dose) + if(affect_volume <= required_volume && CHEM_DOSE(victim, src) >= required_dose) update_data = discontinuation_effect(victim, removed, holder, is_off_cooldown) else update_data = positive_effect(victim, removed, holder, is_off_cooldown) From ed4b6d7600812366734e79884f527f7c520269e1 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 19:26:09 +1100 Subject: [PATCH 83/93] /datum/sound_player/var/volume -> play_volume --- code/modules/synthesized_instruments/real_instruments.dm | 4 ++-- .../real_instruments/Synthesizer/synthesizer.dm | 2 +- .../synthesized_instruments/real_instruments/Violin/violin.dm | 2 +- code/modules/synthesized_instruments/song.dm | 2 +- code/modules/synthesized_instruments/sound_player.dm | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/synthesized_instruments/real_instruments.dm b/code/modules/synthesized_instruments/real_instruments.dm index b3cd8c900e2b..157e5fa1dab1 100644 --- a/code/modules/synthesized_instruments/real_instruments.dm +++ b/code/modules/synthesized_instruments/real_instruments.dm @@ -79,7 +79,7 @@ src.usage_info = new (owner, src.player) src.usage_info.ui_interact(user) if ("volume") - src.player.volume = min(max(min(player.volume+text2num(value), 100), 0), player.max_volume) + src.player.play_volume = min(max(min(player.play_volume+text2num(value), 100), 0), player.max_volume) if ("transposition") src.player.song.transposition = max(min(player.song.transposition+value, global.musical_config.highest_transposition), global.musical_config.lowest_transposition) if ("min_octave") @@ -151,7 +151,7 @@ ), "basic_options" = list( "cur_instrument" = src.player.song.instrument_data.name, - "volume" = src.player.volume, + "volume" = src.player.play_volume, "BPM" = round(600 / src.player.song.tempo), "transposition" = src.player.song.transposition, "octave_range" = list( diff --git a/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm b/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm index 4706caad9d8e..222a35e22002 100644 --- a/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm +++ b/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm @@ -1,7 +1,7 @@ //Synthesizer and minimoog. They work the same /datum/sound_player/synthesizer - volume = 40 + play_volume = 40 /obj/structure/synthesized_instrument/synthesizer name = "The Synthesizer 3.0" diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index 5eb4e3e773e3..791c664b0e37 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -1,5 +1,5 @@ /datum/sound_player/violin - volume = 25 + play_volume = 25 range = 10 //Kinda don't want this horrible thing to be heard from far away /obj/item/synthesized_instrument/violin diff --git a/code/modules/synthesized_instruments/song.dm b/code/modules/synthesized_instruments/song.dm index 77fef5ee6e2d..86d00ab2edd0 100644 --- a/code/modules/synthesized_instruments/song.dm +++ b/code/modules/synthesized_instruments/song.dm @@ -82,7 +82,7 @@ var/current_volume = clamp(sound_copy.volume, 0, 100) sound_copy.volume = current_volume //Sanitize volume var/datum/sound_token/token = new /datum/sound_token/instrument(src.player.actual_instrument, src.sound_id, sound_copy, src.player.range, FALSE, use_env, player) - var/delta_volume = player.volume / src.sustain_timer + var/delta_volume = player.play_volume / src.sustain_timer var/tick = duration while ((current_volume > 0) && token) diff --git a/code/modules/synthesized_instruments/sound_player.dm b/code/modules/synthesized_instruments/sound_player.dm index dcedc7096001..855f53f05589 100644 --- a/code/modules/synthesized_instruments/sound_player.dm +++ b/code/modules/synthesized_instruments/sound_player.dm @@ -3,7 +3,7 @@ // Virtual object // It's the one used to modify shit var/range = 15 - var/volume = 30 + var/play_volume = 30 var/max_volume = 50 var/falloff = 2 var/apply_echo = 0 @@ -64,7 +64,7 @@ I.PrivLocateListeners(prior_turfs.Copy(), current_turfs.Copy()) /datum/sound_player/proc/apply_modifications(sound/what, note_num, which_line, which_note) // You don't need to override this - what.volume = volume + what.volume = play_volume what.falloff = falloff if (global.musical_config.env_settings_available) what.environment = global.musical_config.is_custom_env(src.virtual_environment_selected) ? src.env : src.virtual_environment_selected From f300289333918fae59e786c390f7dfa17132f7aa Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 20:02:38 +1100 Subject: [PATCH 84/93] Food, chem, various bespoke local volume vars -> chem_volume, many initialize_reagents() calls removed. --- code/datums/extensions/milkable/milkable.dm | 4 +-- code/game/machinery/kitchen/icecream.dm | 8 ++--- code/game/objects/__objs.dm | 9 +++++- .../game/objects/items/flame/flame_fuelled.dm | 14 +++------ .../items/flame/flame_fuelled_lantern.dm | 2 +- .../flame/flame_fuelled_lighter_zippo.dm | 10 +++---- code/game/objects/items/toys.dm | 2 +- code/game/objects/items/waterskin.dm | 2 +- code/game/objects/items/weapons/ecigs.dm | 2 +- .../objects/items/weapons/extinguisher.dm | 4 +-- code/game/objects/items/weapons/mop.dm | 7 ++--- code/game/objects/items/weapons/paint.dm | 2 +- code/game/objects/items/weapons/soap.dm | 8 ++--- .../items/weapons/storage/fancy/cigar.dm | 6 +--- .../items/weapons/storage/fancy/cigarettes.dm | 6 +--- .../items/weapons/storage/med_pouch.dm | 18 +++++------ code/game/objects/items/weapons/towels.dm | 6 +--- .../objects/items/welding/weldbackpack.dm | 16 +++++----- .../objects/items/welding/weldingtool_tank.dm | 10 +++---- .../game/objects/structures/barrels/barrel.dm | 2 +- .../game/objects/structures/beds/rollerbed.dm | 6 ++-- .../structures/chemistry/filter_stand.dm | 11 ++----- code/game/objects/structures/compost.dm | 2 +- code/game/objects/structures/fishtanks.dm | 15 ++-------- code/game/objects/structures/fountain.dm | 10 ++----- code/game/objects/structures/iv_drip.dm | 11 ++++--- code/game/objects/structures/well.dm | 2 +- code/modules/butchery/butchery_products.dm | 2 +- .../gloves/jewelry/rings/ring_reagent.dm | 13 +------- code/modules/clothing/masks/chewable.dm | 12 ++------ code/modules/clothing/masks/smokable.dm | 5 +--- code/modules/crafting/handmade_fancy.dm | 8 ++--- code/modules/crafting/handmade_items.dm | 14 ++++----- .../crafting/metalwork/metalwork_items.dm | 5 +--- .../crafting/pottery/pottery_moulds.dm | 11 +++---- code/modules/crafting/working/butter_churn.dm | 9 +----- code/modules/detectivework/tools/luminol.dm | 2 +- code/modules/detectivework/tools/rag.dm | 2 +- .../cooking/cooking_vessels/baking_dish.dm | 2 +- .../food/cooking/cooking_vessels/pot.dm | 18 +++++------ .../food/cooking/cooking_vessels/skillet.dm | 2 +- code/modules/hydroponics/grown.dm | 13 ++------ code/modules/hydroponics/seed_packets.dm | 6 +--- code/modules/mechs/equipment/engineering.dm | 2 +- .../robot/flying/module_flying_emergency.dm | 4 +-- .../robot/flying/module_flying_forensics.dm | 4 +-- .../mob/living/silicon/robot/robot_items.dm | 2 +- code/modules/organs/organ.dm | 10 +------ code/modules/paperwork/pen/quill_and_ink.dm | 2 +- code/modules/paperwork/pen/reagent_pen.dm | 9 +----- code/modules/paperwork/toner_cartridge.dm | 2 +- .../projectiles/ammunition/chemdart.dm | 12 ++------ .../projectiles/guns/projectile/dartgun.dm | 6 ++-- code/modules/reagents/dispenser/cartridge.dm | 12 ++++---- .../reagents/dispenser/cartridge_presets.dm | 4 +-- .../reagents/dispenser/cartridge_spawn.dm | 2 +- code/modules/reagents/reagent_containers.dm | 10 +------ .../reagents/reagent_containers/_glass.dm | 2 +- .../reagents/reagent_containers/beaker.dm | 18 +++++------ .../reagents/reagent_containers/blood_pack.dm | 6 ++-- .../reagents/reagent_containers/borghypo.dm | 4 +-- .../reagents/reagent_containers/bowl.dm | 2 +- .../reagents/reagent_containers/bucket.dm | 6 ++-- .../condiments/__condiment.dm | 2 +- .../condiments/_condiment_large.dm | 2 +- .../condiments/_condiment_small.dm | 2 +- .../condiments/condiments_small.dm | 2 +- .../drinkingglass/drinkingglass.dm | 4 +-- .../drinkingglass/glass_types.dm | 26 ++++++++-------- .../drinkingglass/shaker.dm | 2 +- .../reagents/reagent_containers/drinks.dm | 30 +++++++++---------- .../reagent_containers/drinks/bottle.dm | 4 +-- .../reagent_containers/drinks/cans.dm | 2 +- .../drinks/cocktailshaker.dm | 2 +- .../reagent_containers/drinks/juicebox.dm | 2 +- .../reagents/reagent_containers/dropper.dm | 4 +-- .../reagents/reagent_containers/food.dm | 11 +------ .../reagent_containers/food/burgers.dm | 2 +- .../reagents/reagent_containers/food/eggs.dm | 2 +- .../reagent_containers/glass/bottle.dm | 4 +-- .../reagent_containers/glass/bottle/robot.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 10 +++---- .../reagents/reagent_containers/inhaler.dm | 2 +- .../reagents/reagent_containers/mortar.dm | 2 +- .../reagents/reagent_containers/packets.dm | 2 +- .../reagents/reagent_containers/pill.dm | 6 ++-- .../reagents/reagent_containers/retort.dm | 14 ++++----- .../reagents/reagent_containers/spray.dm | 12 ++++---- .../reagents/reagent_containers/syringes.dm | 10 +++---- code/modules/reagents/reagent_dispenser.dm | 18 ++++------- mods/content/beekeeping/hive_frame.dm | 9 +----- .../components/reagents.dm | 18 +++++------ mods/content/xenobiology/slime/items.dm | 6 +--- 93 files changed, 251 insertions(+), 401 deletions(-) diff --git a/code/datums/extensions/milkable/milkable.dm b/code/datums/extensions/milkable/milkable.dm index 523a37e3e533..caa797e18786 100644 --- a/code/datums/extensions/milkable/milkable.dm +++ b/code/datums/extensions/milkable/milkable.dm @@ -85,7 +85,7 @@ to_chat(user, SPAN_WARNING("Wait for \the [critter] to stop moving before you try milking it.")) return TRUE - if(container.reagents.total_volume >= container.volume) + if(container.reagents.total_volume >= container.reagents.maximum_volume) to_chat(user, SPAN_WARNING("\The [container] is full.")) return TRUE @@ -112,7 +112,7 @@ to_chat(user, SPAN_WARNING("\The [critter]'s udder is dry. Wait a little longer.")) return TRUE - if(container.reagents.total_volume >= container.volume) + if(container.reagents.total_volume >= container.reagents.maximum_volume) to_chat(user, SPAN_NOTICE("\The [container] is full.")) return TRUE diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 9671e16e3614..f4a52486e668 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -18,6 +18,7 @@ anchored = FALSE atom_flags = ATOM_FLAG_NO_CHEM_CHANGE | ATOM_FLAG_OPEN_CONTAINER idle_power_usage = 100 + chem_volume = 100 var/list/product_types = list() var/dispense_flavour = ICECREAM_VANILLA @@ -66,14 +67,9 @@ /obj/machinery/icecream_vat/Initialize(mapload, d, populate_parts) . = ..() - initialize_reagents() while(product_types.len < 8) product_types.Add(5) -/obj/machinery/icecream_vat/initialize_reagents(populate = TRUE) - create_reagents(100) - . = ..() - /obj/machinery/icecream_vat/populate_reagents() add_to_reagents(/decl/material/liquid/drink/milk, 5) add_to_reagents(/decl/material/liquid/nutriment/flour, 5) @@ -201,7 +197,7 @@ icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time layer = ABOVE_OBJ_LAYER bitesize = 3 - volume = 20 + chem_volume = 20 nutriment_amt = 5 nutriment_type = /decl/material/liquid/nutriment nutriment_desc = list("crunchy waffle cone" = 1) diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm index 4510c03626d7..e1a861e46dd4 100644 --- a/code/game/objects/__objs.dm +++ b/code/game/objects/__objs.dm @@ -9,6 +9,9 @@ ///The current health of the obj. Leave to null, unless you want the object to start at a different health than max_health. current_health = null + // If >0 will create a reagent holder on Initialize() + var/chem_volume = 0 + var/obj_flags var/datum/talking_atom/talking_atom var/list/req_access @@ -34,6 +37,8 @@ current_health = get_max_health() else current_health = min(current_health, get_max_health()) + if(chem_volume > 0) + initialize_reagents() /obj/object_shaken() shake_animation() @@ -259,13 +264,15 @@ return TRUE /** - * Init starting reagents and/or reagent var. Not called at the /obj level. + * Init starting reagents and/or reagent var. Called if chem_volume > 0 in /obj/Initialize() * populate: If set to true, we expect map load/admin spawned reagents to be set. */ /obj/proc/initialize_reagents(var/populate = TRUE) SHOULD_CALL_PARENT(TRUE) if(reagents?.total_volume > 0) log_warning("\The [src] possibly is initializing its reagents more than once!") + if(chem_volume > 0) + create_reagents(chem_volume) if(populate) populate_reagents() diff --git a/code/game/objects/items/flame/flame_fuelled.dm b/code/game/objects/items/flame/flame_fuelled.dm index ce4c864b0a82..51cdb60beefe 100644 --- a/code/game/objects/items/flame/flame_fuelled.dm +++ b/code/game/objects/items/flame/flame_fuelled.dm @@ -5,8 +5,8 @@ can_manually_light = TRUE extinguish_on_dropped = FALSE watertight = TRUE + chem_volume = 5 - var/tmp/max_fuel = 5 var/tmp/start_fuelled = FALSE /// TODO: make this calculate a fuel amount via accelerant value or some other check. @@ -14,10 +14,9 @@ var/fuel_type /obj/item/flame/fuelled/Initialize() - . = ..() if(isnull(fuel_type)) fuel_type = global.using_map.default_liquid_fuel_type - initialize_reagents() + . = ..() // Boilerplate from /obj/item/chems/glass. TODO generalize to a lower level. /obj/item/flame/fuelled/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) @@ -84,14 +83,9 @@ return TRUE return FALSE -/obj/item/flame/fuelled/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(max_fuel) - . = ..() - /obj/item/flame/fuelled/populate_reagents() - if(start_fuelled && fuel_type && max_fuel) - add_to_reagents(fuel_type, max_fuel) + if(start_fuelled && fuel_type && reagents?.maximum_volume) + add_to_reagents(fuel_type, reagents.maximum_volume) /obj/item/flame/fuelled/Process() . = ..() diff --git a/code/game/objects/items/flame/flame_fuelled_lantern.dm b/code/game/objects/items/flame/flame_fuelled_lantern.dm index 38d4ca1f22f2..31504a3c324c 100644 --- a/code/game/objects/items/flame/flame_fuelled_lantern.dm +++ b/code/game/objects/items/flame/flame_fuelled_lantern.dm @@ -10,7 +10,7 @@ slot_flags = SLOT_LOWER_BODY lit_light_power = 0.7 lit_light_range = 6 - max_fuel = 60 + chem_volume = 60 _fuel_spend_amt = (1 / 60) // a full lantern should last an hour material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/metal/copper diff --git a/code/game/objects/items/flame/flame_fuelled_lighter_zippo.dm b/code/game/objects/items/flame/flame_fuelled_lighter_zippo.dm index 50a734b487f1..399bb5063b2d 100644 --- a/code/game/objects/items/flame/flame_fuelled_lighter_zippo.dm +++ b/code/game/objects/items/flame/flame_fuelled_lighter_zippo.dm @@ -1,9 +1,9 @@ /obj/item/flame/fuelled/lighter/zippo - name = "zippo lighter" - desc = "It's a zippo-styled lighter, using a replaceable flint in a fetching steel case. It makes a clicking sound that everyone loves." - icon = 'icons/obj/items/flame/zippo.dmi' - max_fuel = 10 - material = /decl/material/solid/metal/stainlesssteel + name = "zippo lighter" + desc = "It's a zippo-styled lighter, using a replaceable flint in a fetching steel case. It makes a clicking sound that everyone loves." + icon = 'icons/obj/items/flame/zippo.dmi' + chem_volume = 10 + material = /decl/material/solid/metal/stainlesssteel /obj/item/flame/fuelled/lighter/zippo/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_offset = FALSE) if(overlay && lit && (slot in global.all_hand_slots)) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 76255a19f118..545cc0b21be6 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -47,7 +47,7 @@ throw_range = 20 possible_transfer_amounts = null amount_per_transfer_from_this = 10 - volume = 10 + chem_volume = 10 material = /decl/material/solid/organic/plastic _base_attack_force = 0 diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 89baf179ab28..729f6b1e9240 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -6,7 +6,7 @@ material = /decl/material/solid/organic/leather/gut color = /decl/material/solid/organic/leather/gut::color atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 120 + chem_volume = 120 material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME var/decl/material/stopper_material = /decl/material/solid/organic/cloth/hemp diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 353404026db9..305d0aa5f5ce 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -184,7 +184,7 @@ icon_state = "ecartridge" material = /decl/material/solid/metal/aluminium matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) - volume = 20 + chem_volume = 20 atom_flags = ATOM_FLAG_OPEN_CONTAINER /obj/item/chems/ecig_cartridge/get_examine_strings(mob/user, distance, infix, suffix) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 5610bf4cf254..7c57b93689e5 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -16,7 +16,7 @@ possible_transfer_amounts = @"[30,60,120]" //units of liquid per spray - 120 -> same as splashing them with a bucket per spray possible_particle_amounts = @"[1,2,3]" //Amount of chempuff particles to spawn on spray amount_per_transfer_from_this = 120 - volume = 2000 + chem_volume = 2000 spray_particles = 3 //Amount of liquid particles to spawn on spray particle_move_delay = 5 //Spray effect move delay safety = TRUE @@ -36,7 +36,7 @@ possible_particle_amounts = @"[1,2]" amount_per_transfer_from_this = 80 spray_particles = 2 - volume = 1000 + chem_volume = 1000 material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE, diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 2efa8c00554f..d46890df842d 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -11,6 +11,8 @@ matter = list( /decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY, ) + chem_volume = 30 + var/mopspeed = 40 var/static/list/moppable_types @@ -23,14 +25,9 @@ /obj/item/mop/Initialize() . = ..() - initialize_reagents() if(!moppable_types) populate_moppable_types() -/obj/item/mop/initialize_reagents(populate = TRUE) - create_reagents(30) - . = ..() - /obj/item/mop/afterattack(atom/A, mob/user, proximity) if(!proximity) return ..() diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 49426d67046f..ddbe13a497ee 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -6,7 +6,7 @@ w_class = ITEM_SIZE_NORMAL amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[10,20,30,60]" - volume = 60 + chem_volume = 60 var/pigment /obj/item/chems/glass/bucket/paint/populate_reagents() diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index ebb10a60b96d..47518ab9b3d0 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -14,8 +14,9 @@ material = /decl/material/liquid/cleaner/soap max_health = 5 _base_attack_force = 0 - var/key_data + chem_volume = SOAP_MAX_VOLUME + var/key_data var/list/valid_colors = list(COLOR_GREEN_GRAY, COLOR_RED_GRAY, COLOR_BLUE_GRAY, COLOR_BROWN, COLOR_PALE_PINK, COLOR_PALE_BTL_GREEN, COLOR_OFF_WHITE, COLOR_GRAY40, COLOR_GOLD) var/list/valid_scents = list("fresh air", "cinnamon", "mint", "cocoa", "lavender", "an ocean breeze", "a summer garden", "vanilla", "cheap perfume") var/list/scent_intensity = list("faintly", "strongly", "overbearingly") @@ -31,16 +32,11 @@ /obj/item/soap/crafted/generate_icon() return -/obj/item/soap/initialize_reagents(populate = TRUE) - create_reagents(SOAP_MAX_VOLUME) - . = ..() - /obj/item/soap/populate_reagents() wet() /obj/item/soap/Initialize() . = ..() - initialize_reagents() generate_icon() /obj/item/soap/proc/generate_icon() diff --git a/code/game/objects/items/weapons/storage/fancy/cigar.dm b/code/game/objects/items/weapons/storage/fancy/cigar.dm index a83021f72999..5128bed573ae 100644 --- a/code/game/objects/items/weapons/storage/fancy/cigar.dm +++ b/code/game/objects/items/weapons/storage/fancy/cigar.dm @@ -15,11 +15,7 @@ storage = /datum/storage/box/cigar /obj/item/box/fancy/cigar/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/box/fancy/cigar/initialize_reagents(populate) - create_reagents(10 * max(1, storage?.storage_slots)) + chem_volume = 10 * max(1, /datum/storage/box/cigar::storage_slots) . = ..() /obj/item/box/fancy/cigar/WillContain() diff --git a/code/game/objects/items/weapons/storage/fancy/cigarettes.dm b/code/game/objects/items/weapons/storage/fancy/cigarettes.dm index 379d275b5f8f..80610b50e2cc 100644 --- a/code/game/objects/items/weapons/storage/fancy/cigarettes.dm +++ b/code/game/objects/items/weapons/storage/fancy/cigarettes.dm @@ -17,11 +17,7 @@ return list(/obj/item/clothing/mask/smokable/cigarette = 6) /obj/item/box/fancy/cigarettes/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/box/fancy/cigarettes/initialize_reagents(populate) - create_reagents(5 * max(storage?.max_storage_space, 1)) //so people can inject cigarettes without opening a packet, now with being able to inject the whole one + chem_volume = 5 * max(/datum/storage/box/cigarettes::max_storage_space, 1) //so people can inject cigarettes without opening a packet, now with being able to inject the whole one . = ..() /obj/item/box/fancy/cigarettes/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index 5151fadcfdd9..a24f2ff187cb 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -189,22 +189,22 @@ Single Use Emergency Pouches // Pills /obj/item/chems/pill/pouch_pill - name = "emergency pill" - desc = "An emergency pill from an emergency medical pouch." - icon_state = "pill2" - volume = 15 + name = "emergency pill" + desc = "An emergency pill from an emergency medical pouch." + icon_state = "pill2" + chem_volume = 15 abstract_type = /obj/item/chems/pill/pouch_pill + var/_reagent_name /obj/item/chems/pill/pouch_pill/Initialize(ml, material_key) . = ..() if(!reagents?.total_volume) log_warning("[log_info_line(src)] was deleted for containing no reagents during init!") return INITIALIZE_HINT_QDEL - -/obj/item/chems/pill/pouch_pill/initialize_reagents(populate = TRUE) - . = ..() - if(populate && reagents?.get_primary_reagent_name()) - SetName("emergency [reagents.get_primary_reagent_name()] pill ([reagents.total_volume]u)") + if(reagents?.get_primary_reagent_name() && !_reagent_name) + _reagent_name = "emergency [reagents.get_primary_reagent_name()] pill ([reagents.total_volume]u)" + if(_reagent_name) + SetName(_reagent_name) /obj/item/chems/pill/pouch_pill/stabilizer/populate_reagents() add_to_reagents(/decl/material/liquid/stabilizer, reagents.maximum_volume) diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 80cacb07e3da..623042a6c029 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -17,8 +17,8 @@ var/additional_description /obj/item/towel/Initialize() + chem_volume = round(50 * (w_class / ITEM_SIZE_NORMAL)) // larger towels have more room, smaller ones have less . = ..() - initialize_reagents() /obj/item/towel/Destroy() if(is_processing) @@ -66,10 +66,6 @@ if(!reagents?.total_volume) return PROCESS_KILL -/obj/item/towel/initialize_reagents() - create_reagents(round(50 * (w_class / ITEM_SIZE_NORMAL))) // larger towels have more room, smaller ones have less - . = ..() - /obj/item/towel/update_name() if(reagents?.total_volume) if(!REAGENTS_FREE_SPACE(reagents)) diff --git a/code/game/objects/items/welding/weldbackpack.dm b/code/game/objects/items/welding/weldbackpack.dm index 661197c56601..82db07b9617a 100644 --- a/code/game/objects/items/welding/weldbackpack.dm +++ b/code/game/objects/items/welding/weldbackpack.dm @@ -62,14 +62,14 @@ //Welder Pack //////////////////////////////////////////////////////////// /obj/item/chems/weldpack - name = "welding kit" - desc = "An unwieldy, heavy backpack with two massive fuel tanks. Comes with an attached welder gun." - icon = 'icons/obj/items/welderpack.dmi' - icon_state = ICON_STATE_WORLD - slot_flags = SLOT_BACK - w_class = ITEM_SIZE_HUGE - atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 350 + name = "welding kit" + desc = "An unwieldy, heavy backpack with two massive fuel tanks. Comes with an attached welder gun." + icon = 'icons/obj/items/welderpack.dmi' + icon_state = ICON_STATE_WORLD + slot_flags = SLOT_BACK + w_class = ITEM_SIZE_HUGE + atom_flags = ATOM_FLAG_OPEN_CONTAINER + chem_volume = 350 var/obj/item/weldingtool/weldpack/welder = /obj/item/weldingtool/weldpack // Duplicated from welder tanks. diff --git a/code/game/objects/items/welding/weldingtool_tank.dm b/code/game/objects/items/welding/weldingtool_tank.dm index 023de068b878..ed87e2be8489 100644 --- a/code/game/objects/items/welding/weldingtool_tank.dm +++ b/code/game/objects/items/welding/weldingtool_tank.dm @@ -10,7 +10,7 @@ w_class = ITEM_SIZE_SMALL atom_flags = ATOM_FLAG_OPEN_CONTAINER obj_flags = OBJ_FLAG_HOLLOW - volume = 20 + chem_volume = 20 presentation_flags = PRESENTATION_FLAG_NAME max_health = 40 material = /decl/material/solid/metal/steel @@ -86,7 +86,7 @@ base_name = "small welding tank" icon_state = "tank_small" w_class = ITEM_SIZE_TINY - volume = 5 + chem_volume = 5 size_in_use = ITEM_SIZE_SMALL unlit_force = 5 lit_force = 7 @@ -97,7 +97,7 @@ base_name = "large welding tank" icon_state = "tank_large" w_class = ITEM_SIZE_SMALL - volume = 40 + chem_volume = 40 size_in_use = ITEM_SIZE_NORMAL _base_attack_force = 6 @@ -106,7 +106,7 @@ base_name = "huge welding tank" icon_state = "tank_huge" w_class = ITEM_SIZE_NORMAL - volume = 80 + chem_volume = 80 size_in_use = ITEM_SIZE_LARGE unlit_force = 9 lit_force = 15 @@ -117,7 +117,7 @@ base_name = "experimental welding tank" icon_state = "tank_experimental" w_class = ITEM_SIZE_NORMAL - volume = 40 + chem_volume = 40 can_refuel = FALSE size_in_use = ITEM_SIZE_LARGE unlit_force = 9 diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 0e987ec6aa2b..c14f9007882d 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -12,7 +12,7 @@ wrenchable = FALSE storage = /datum/storage/barrel amount_dispensed = 10 - volume = 7500 + chem_volume = 7500 movable_flags = MOVABLE_FLAG_WHEELED throwpass = TRUE tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT diff --git a/code/game/objects/structures/beds/rollerbed.dm b/code/game/objects/structures/beds/rollerbed.dm index a3f332b4b044..39ad505e97d4 100644 --- a/code/game/objects/structures/beds/rollerbed.dm +++ b/code/game/objects/structures/beds/rollerbed.dm @@ -22,9 +22,9 @@ icon_state = "up" else icon_state = "down" - if(beaker) + if(beaker?.reagents) var/image/iv = image(icon, "iv[iv_attached]") - var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25) + var/percentage = round((beaker.reagents.total_volume / max(beaker.reagents.maximum_volume, 1)) * 100, 25) var/image/filling = image(icon, "iv_filling[percentage]") filling.color = beaker.reagents.get_color() iv.overlays += filling @@ -74,7 +74,7 @@ if(SSobj.times_fired % 2) return - if(beaker.volume > 0) + if(beaker.reagents?.total_volume > 0) beaker.reagents.trans_to_mob(buckled_mob, beaker.amount_per_transfer_from_this, CHEM_INJECT) queue_icon_update() diff --git a/code/game/objects/structures/chemistry/filter_stand.dm b/code/game/objects/structures/chemistry/filter_stand.dm index 3cd598d2e7be..b236e3f3dd29 100644 --- a/code/game/objects/structures/chemistry/filter_stand.dm +++ b/code/game/objects/structures/chemistry/filter_stand.dm @@ -8,18 +8,11 @@ material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_ALL atom_flags = ATOM_FLAG_OPEN_CONTAINER + chem_volume = 200 var/obj/item/chems/filter/filter var/obj/item/chems/glass/loaded -/obj/structure/filter_stand/Initialize(ml, _mat, _reinf_mat) - . = ..() - initialize_reagents() - -/obj/structure/filter_stand/initialize_reagents(populate) - create_reagents(200) - . = ..() - /obj/structure/filter_stand/mapped/Initialize(ml, _mat, _reinf_mat) filter = new(src) set_loaded_vessel(new /obj/item/chems/glass/handmade/jar(src)) @@ -111,7 +104,7 @@ w_class = ITEM_SIZE_TINY material_alteration = MAT_FLAG_ALTERATION_ALL material = /decl/material/solid/organic/cloth - volume = 100 + chem_volume = 100 atom_flags = ATOM_FLAG_OPEN_CONTAINER /obj/item/chems/filter/on_reagent_change() diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index e8f3c18ec831..5d9c3dd623ed 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -16,7 +16,7 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC wrenchable = FALSE possible_transfer_amounts = @"[10,25,50,100]" - volume = 2000 + chem_volume = 2000 storage = /datum/storage/hopper/industrial/compost /obj/structure/reagent_dispensers/compost_bin/Initialize() diff --git a/code/game/objects/structures/fishtanks.dm b/code/game/objects/structures/fishtanks.dm index 313c92a5ccd7..a8855275998b 100644 --- a/code/game/objects/structures/fishtanks.dm +++ b/code/game/objects/structures/fishtanks.dm @@ -25,21 +25,19 @@ var/global/list/fishtank_cache = list() atom_flags = ATOM_FLAG_CHECKS_BORDER | ATOM_FLAG_CLIMBABLE mob_offset = TRUE max_health = 50 + chem_volume = 300 var/deleting var/fill_type - var/fill_amt var/obj/effect/glass_tank_overlay/tank_overlay // I don't like this, but there's no other way to get a mouse-transparent overlay :( /obj/structure/glass_tank/aquarium name = "aquarium" desc = "A clear glass box for keeping specimens in. This one is full of water." fill_type = /decl/material/liquid/water - fill_amt = 300 /obj/structure/glass_tank/Initialize(mapload) tank_overlay = new(loc, src) - initialize_reagents() . = ..() update_icon() if(!mapload) @@ -53,16 +51,9 @@ var/global/list/fishtank_cache = list() for(var/obj/structure/glass_tank/A in orange(1, oldloc)) A.update_icon() -/obj/structure/glass_tank/initialize_reagents(populate = TRUE) - if(!fill_amt) - return - create_reagents(fill_amt) - if(!fill_type) - return - . = ..() - /obj/structure/glass_tank/populate_reagents() - add_to_reagents(fill_type, reagents.maximum_volume) + if(fill_type) + add_to_reagents(fill_type, reagents.maximum_volume) /obj/structure/glass_tank/attack_hand(var/mob/user) if(user.check_intent(I_FLAG_HARM)) diff --git a/code/game/objects/structures/fountain.dm b/code/game/objects/structures/fountain.dm index f596d169c6e0..d4287c844c53 100644 --- a/code/game/objects/structures/fountain.dm +++ b/code/game/objects/structures/fountain.dm @@ -10,6 +10,8 @@ pixel_x = -16 light_range = 5 light_power = 0.5 + chem_volume = 500 + var/used = FALSE var/increase_age_prob = (100 / 6) @@ -114,14 +116,6 @@ light_range = null light_power = null -/obj/structure/fountain/mundane/Initialize(ml, _mat, _reinf_mat) - . = ..() - initialize_reagents(ml) - -/obj/structure/fountain/mundane/initialize_reagents(populate = TRUE) - create_reagents(500) - . = ..() - /obj/structure/fountain/mundane/populate_reagents() add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) //Don't give free water when building one diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm index 796690f63565..e95fa1df572b 100644 --- a/code/game/objects/structures/iv_drip.dm +++ b/code/game/objects/structures/iv_drip.dm @@ -37,10 +37,9 @@ base.icon_state = "[beaker ? "beaker" : "nothing"][attached ? "_hooked" : ""]" add_overlay(base) - if(beaker) - var/datum/reagents/reagents = beaker.reagents - var/percent = round((reagents.total_volume / beaker.volume) * 100) - if(reagents.total_volume) + if(beaker?.reagents) + var/percent = round((beaker.reagents.total_volume / beaker.reagents.maximum_volume) * 100) + if(beaker.reagents.total_volume) var/mutable_appearance/filling = mutable_appearance(icon, "reagent") switch(percent) if(0) @@ -59,7 +58,7 @@ filling.icon_state = "reagent80" if(91 to INFINITY) filling.icon_state = "reagent100" - filling.color = reagents.get_color() + filling.color = beaker.reagents.get_color() add_overlay(filling) if(istype(beaker, /obj/item/chems/ivbag)) @@ -120,7 +119,7 @@ return if(mode) // Give blood - if(beaker.volume > 0) + if(beaker.reagents?.total_volume > 0) beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_INJECT) queue_icon_update() else // Take blood diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 911413e67e9b..9480d5721d51 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -14,7 +14,7 @@ wrenchable = FALSE amount_dispensed = 10 possible_transfer_amounts = @"[10,25,50,100]" - volume = 10000 + chem_volume = 10000 can_toggle_open = FALSE var/auto_refill diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 659416ea06c3..268f02b43d93 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -5,7 +5,7 @@ material = /decl/material/solid/organic/meat color = /decl/material/solid/organic/meat::color w_class = ITEM_SIZE_NORMAL - volume = 20 + chem_volume = 20 nutriment_type = /decl/material/solid/organic/meat nutriment_desc = list("umami" = 10) nutriment_amt = 20 diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm index c19417797489..c38fdeaa1319 100644 --- a/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm +++ b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm @@ -3,18 +3,7 @@ /obj/item/clothing/gloves/ring/reagent atom_flags = ATOM_FLAG_OPEN_CONTAINER origin_tech = @'{"materials":2,"esoteric":4}' - var/tmp/volume = 15 - -/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(volume, reagents.maximum_volume) - . = ..() + chem_volume = 15 /obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) ..() diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index 1df74f5bc5fa..c6d6285826bc 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -8,17 +8,11 @@ matter = null // no plastic/fiberglass var/type_butt = null - var/chem_volume = 0 var/chewtime = 0 var/brand /obj/item/clothing/mask/chewable/Initialize() - . = ..() atom_flags |= ATOM_FLAG_NO_CHEM_CHANGE // so it doesn't react until you light it - initialize_reagents() - -/obj/item/clothing/mask/chewable/initialize_reagents(populate = TRUE) - create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 . = ..() /obj/item/clothing/mask/chewable/equipped(var/mob/living/user, var/slot) @@ -107,9 +101,9 @@ icon = 'icons/clothing/mask/chewables/gum_nicotine.dmi' type_butt = /obj/item/trash/cigbutt/spitgum -/obj/item/clothing/mask/chewable/tobacco/nico/initialize_reagents(populate = TRUE) +/obj/item/clothing/mask/chewable/tobacco/nico/Initialize() . = ..() - color = reagents.get_color() + color = reagents?.get_color() /obj/item/clothing/mask/chewable/tobacco/nico/populate_reagents() add_to_reagents(/decl/material/liquid/nicotine, 2) @@ -137,7 +131,7 @@ /obj/item/clothing/mask/chewable/candy/proc/get_possible_initial_reagents() return -/obj/item/clothing/mask/chewable/candy/initialize_reagents() +/obj/item/clothing/mask/chewable/candy/Initialize() . = ..() if(reagents?.total_volume) set_color(reagents.get_color()) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 49aa63a031dd..34327fc8e7ca 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -9,7 +9,6 @@ var/lit = FALSE var/waterproof = FALSE var/type_butt = null - var/chem_volume = 0 var/smoketime = 0 var/genericmes = "USER lights their NAME with the FLAME." var/matchmes = "USER lights NAME with FLAME" @@ -38,7 +37,6 @@ /obj/item/clothing/mask/smokable/Initialize() . = ..() atom_flags |= ATOM_FLAG_NO_CHEM_CHANGE // so it doesn't react until you light it - create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 /obj/item/clothing/mask/smokable/Destroy() . = ..() @@ -223,7 +221,6 @@ /obj/item/clothing/mask/smokable/cigarette/Initialize() . = ..() - initialize_reagents() set_extension(src, /datum/extension/tool, list(TOOL_CAUTERY = TOOL_QUALITY_MEDIOCRE)) /obj/item/clothing/mask/smokable/cigarette/populate_reagents() @@ -395,7 +392,7 @@ if(!ATOM_IS_OPEN_CONTAINER(glass)) to_chat(user, SPAN_NOTICE("You need to take the lid off first.")) return TRUE - var/transfered = glass.reagents.trans_to_obj(src, chem_volume) + var/transfered = glass.reagents.trans_to_obj(src, glass.reagents.total_volume) if(transfered) //if reagents were transfered, show the message to_chat(user, SPAN_NOTICE("You dip \the [src] into \the [glass].")) else //if not, either the beaker was empty, or the cigarette was full diff --git a/code/modules/crafting/handmade_fancy.dm b/code/modules/crafting/handmade_fancy.dm index 9622296a587c..8fbe5e3dfc75 100644 --- a/code/modules/crafting/handmade_fancy.dm +++ b/code/modules/crafting/handmade_fancy.dm @@ -10,7 +10,7 @@ desc = "A masterfully made decanter with a fluted neck and graceful handle." icon = 'icons/obj/items/handmade/decanter.dmi' amount_per_transfer_from_this = 10 - volume = 120 + chem_volume = 120 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE /obj/item/chems/glass/handmade/fancy/goblet @@ -18,21 +18,21 @@ desc = "An elegant goblet with a flared base, likely handmade by some master artisan." icon = 'icons/obj/items/handmade/cup_fancy.dmi' amount_per_transfer_from_this = 10 - volume = 60 + chem_volume = 60 /obj/item/chems/glass/handmade/fancy/bowl name = "bowl" desc = "A sleek, polished bowl, likely handmade by some master artisan." icon = 'icons/obj/items/handmade/bowl_fancy.dmi' amount_per_transfer_from_this = 10 - volume = 60 + chem_volume = 60 /obj/item/chems/glass/handmade/fancy/vase name = "vase" desc = "An elegant masterwork vase." icon = 'icons/obj/items/handmade/vase_fancy.dmi' amount_per_transfer_from_this = 20 - volume = 240 + chem_volume = 240 material = /decl/material/solid/stone/ceramic /obj/item/chems/glass/handmade/fancy/vase/fluted diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 75a8ac9650f2..ab4636d25369 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -21,7 +21,7 @@ desc = "A handmade, slightly lumpy teapot." icon = 'icons/obj/items/handmade/teapot.dmi' amount_per_transfer_from_this = 10 - volume = 120 + chem_volume = 120 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE /obj/item/chems/glass/handmade/cup @@ -29,14 +29,14 @@ desc = "A handmade, slightly lumpy cup." icon = 'icons/obj/items/handmade/cup.dmi' amount_per_transfer_from_this = 10 - volume = 30 + chem_volume = 30 /obj/item/chems/glass/handmade/mug name = "mug" desc = "A handmade, slightly lumpy mug." icon = 'icons/obj/items/handmade/mug.dmi' amount_per_transfer_from_this = 10 - volume = 60 + chem_volume = 60 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE /obj/item/chems/glass/handmade/vase @@ -44,21 +44,21 @@ desc = "A handmade, slightly lumpy vase." icon = 'icons/obj/items/handmade/vase.dmi' amount_per_transfer_from_this = 20 - volume = 240 + chem_volume = 240 /obj/item/chems/glass/handmade/jar name = "jar" desc = "A handmade, slightly lumpy jar." icon = 'icons/obj/items/handmade/jar.dmi' amount_per_transfer_from_this = 10 - volume = 60 + chem_volume = 60 /obj/item/chems/glass/handmade/bottle name = "bottle" desc = "A handmade, slightly lumpy bottle." icon = 'icons/obj/items/handmade/bottle.dmi' amount_per_transfer_from_this = 10 - volume = 120 + chem_volume = 120 /obj/item/chems/glass/handmade/bottle/tall name = "tall bottle" @@ -73,7 +73,7 @@ desc = "A handmade, slightly lumpy bowl." icon = 'icons/obj/items/handmade/bowl.dmi' amount_per_transfer_from_this = 10 - volume = 60 + chem_volume = 60 /obj/item/chems/glass/handmade/cup/wood material = /decl/material/solid/organic/wood/oak diff --git a/code/modules/crafting/metalwork/metalwork_items.dm b/code/modules/crafting/metalwork/metalwork_items.dm index 2727db4ada8f..511d68ec109b 100644 --- a/code/modules/crafting/metalwork/metalwork_items.dm +++ b/code/modules/crafting/metalwork/metalwork_items.dm @@ -17,6 +17,7 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME storage = /datum/storage/crucible obj_flags = OBJ_FLAG_NO_STORAGE + chem_volume = 300 * REAGENT_UNITS_PER_MATERIAL_SHEET /obj/item/chems/crucible/attackby(obj/item/used_item, mob/user) @@ -66,7 +67,3 @@ I.alpha = 255 * primary_reagent.opacity I.appearance_flags |= RESET_COLOR add_overlay(I) - -/obj/item/chems/crucible/initialize_reagents() - create_reagents(300 * REAGENT_UNITS_PER_MATERIAL_SHEET) // holds a single full stack of 200 ore - return ..() diff --git a/code/modules/crafting/pottery/pottery_moulds.dm b/code/modules/crafting/pottery/pottery_moulds.dm index 6057a7a626a3..a3cdb2d587e1 100644 --- a/code/modules/crafting/pottery/pottery_moulds.dm +++ b/code/modules/crafting/pottery/pottery_moulds.dm @@ -7,12 +7,14 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME max_health = 100 atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 20 // updated in populate_reagents() + chem_volume = 20 // updated in Initialize() var/product_type var/list/product_metadata var/work_skill = SKILL_CONSTRUCTION /obj/item/chems/mould/Initialize() + if(ispath(product_type, /obj)) + update_volume_from_product() . = ..() var/datum/extension/labels/lext = get_or_create_extension(src, /datum/extension/labels) if(ispath(product_type, /obj)) @@ -35,11 +37,6 @@ product_metadata = null return ..() -/obj/item/chems/mould/initialize_reagents() - if(ispath(product_type, /obj)) - update_volume_from_product() - ..() - /obj/item/chems/mould/proc/update_volume_from_product() var/required_volume = 0 var/list/matter_for_product = atom_info_repository.get_matter_for(product_type, /decl/material/placeholder, 1) @@ -53,7 +50,7 @@ else if(atom_flags & ATOM_FLAG_INITIALIZED) create_reagents(required_volume) else - volume = required_volume + chem_volume = required_volume else QDEL_NULL(reagents) diff --git a/code/modules/crafting/working/butter_churn.dm b/code/modules/crafting/working/butter_churn.dm index f4fe1205dd52..10a2790167d7 100644 --- a/code/modules/crafting/working/butter_churn.dm +++ b/code/modules/crafting/working/butter_churn.dm @@ -5,14 +5,7 @@ product_type = /obj/item/food/dairy/butter/stick work_sound = /datum/composite_sound/loom_working atom_flags = ATOM_FLAG_OPEN_CONTAINER - -/obj/structure/working/butter_churn/Initialize() - . = ..() - initialize_reagents() - -/obj/structure/working/butter_churn/initialize_reagents(populate) - create_reagents(200) - . = ..() + chem_volume = 200 /obj/structure/working/butter_churn/try_start_working(mob/user) diff --git a/code/modules/detectivework/tools/luminol.dm b/code/modules/detectivework/tools/luminol.dm index d4b7253df557..9a6556e31045 100644 --- a/code/modules/detectivework/tools/luminol.dm +++ b/code/modules/detectivework/tools/luminol.dm @@ -6,7 +6,7 @@ item_state = "cleaner" amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10]" - volume = 250 + chem_volume = 250 /obj/item/chems/spray/luminol/populate_reagents() add_to_reagents(/decl/material/liquid/luminol, reagents.maximum_volume) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 60717340915e..bebd8ca7d69d 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -6,7 +6,7 @@ icon_state = "rag" amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[5]" - volume = 10 + chem_volume = 10 item_flags = ITEM_FLAG_NO_BLUDGEON atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/organic/cloth diff --git a/code/modules/food/cooking/cooking_vessels/baking_dish.dm b/code/modules/food/cooking/cooking_vessels/baking_dish.dm index ae30572f570d..e9cd7e643902 100644 --- a/code/modules/food/cooking/cooking_vessels/baking_dish.dm +++ b/code/modules/food/cooking/cooking_vessels/baking_dish.dm @@ -2,7 +2,7 @@ name = "baking dish" desc = "A large baking dish for baking things." icon = 'icons/obj/food/cooking_vessels/baking_dish.dmi' - volume = 100 + chem_volume = 100 cooking_category = RECIPE_CATEGORY_BAKING_DISH presentation_flags = PRESENTATION_FLAG_NAME obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE // TODO: dynamically add/remove OBJ_FLAG_INSULATED_HANDLE based on handle material? diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index 20bc6b8eb134..2152ea77b56f 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -2,7 +2,7 @@ name = "pot" desc = "A large pot for boiling things." icon = 'icons/obj/food/cooking_vessels/pot.dmi' - volume = 100 + chem_volume = 100 cooking_category = RECIPE_CATEGORY_POT presentation_flags = PRESENTATION_FLAG_NAME obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -53,14 +53,14 @@ last_boil_status = null /obj/item/chems/cooking_vessel/cauldron - name = "cauldron" - desc = "A large round-bodied vessel for making large quantities of potion or soup." - material = /decl/material/solid/metal/iron - color = /decl/material/solid/metal/iron::color - icon = 'icons/obj/food/cooking_vessels/cauldron.dmi' - volume = 1000 - w_class = ITEM_SIZE_STRUCTURE - density = TRUE + name = "cauldron" + desc = "A large round-bodied vessel for making large quantities of potion or soup." + material = /decl/material/solid/metal/iron + color = /decl/material/solid/metal/iron::color + icon = 'icons/obj/food/cooking_vessels/cauldron.dmi' + chem_volume = 1000 + w_class = ITEM_SIZE_STRUCTURE + density = TRUE /obj/item/chems/cooking_vessel/cauldron/can_be_picked_up(mob/user) return FALSE diff --git a/code/modules/food/cooking/cooking_vessels/skillet.dm b/code/modules/food/cooking/cooking_vessels/skillet.dm index 1f39c841ab69..761a6e0b0e73 100644 --- a/code/modules/food/cooking/cooking_vessels/skillet.dm +++ b/code/modules/food/cooking/cooking_vessels/skillet.dm @@ -2,7 +2,7 @@ name = "skillet" desc = "A shallow pan for frying food." icon = 'icons/obj/food/cooking_vessels/skillet.dmi' - volume = 30 + chem_volume = 30 cooking_category = RECIPE_CATEGORY_SKILLET obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 99bd9f8962cc..402232bc89d0 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -95,25 +95,18 @@ . = ..(mapload, material_key, skip_plate) //Init reagents -/obj/item/food/grown/initialize_reagents(populate) - if(reagents) - reagents.clear_reagents() - if(!length(seed?.get_chemical_composition(_segment = plant_segment_type))) - return - - . = ..() //create_reagent and populate_reagents - update_desc() if(reagents.total_volume > 0) bitesize = 1 + round(reagents.total_volume / 2, 1) - update_icon() /obj/item/food/grown/populate_reagents() . = ..() + if(!length(seed?.get_chemical_composition(_segment = plant_segment_type))) + return + // Fill the object up with the appropriate reagents. var/list/chems_to_fill - if(backyard_grilling_count > 0) chems_to_fill ||= seed?.get_chemical_composition(_segment = plant_segment_type, _state = PLANT_STATE_ROASTED) if(dry) diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 2b291d791c3e..c86b81ef2e98 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -7,6 +7,7 @@ abstract_type = /obj/item/seeds max_health = 10 //Can't set a material, otherwise extracting seeds would generate free materials material = /decl/material/solid/organic/plantmatter/pith + chem_volume = 3 var/seed_mask_icon = 'icons/obj/seeds/seed_masks.dmi' var/seed_base_name = "packet" @@ -17,11 +18,6 @@ if(isnull(seed) && !isnull(_seed)) seed = _seed update_seed() - initialize_reagents() - . = ..() - -/obj/item/seeds/initialize_reagents() - create_reagents(3) . = ..() /obj/item/seeds/populate_reagents() diff --git a/code/modules/mechs/equipment/engineering.dm b/code/modules/mechs/equipment/engineering.dm index b287ef5713e3..d0ff7b2006b8 100644 --- a/code/modules/mechs/equipment/engineering.dm +++ b/code/modules/mechs/equipment/engineering.dm @@ -28,7 +28,7 @@ return null /obj/item/chems/spray/extinguisher/mech - volume = 4000 //Good is gooder + chem_volume = 4000 //Good is gooder icon_state = "mech_exting" /obj/item/chems/spray/extinguisher/mech/get_hardpoint_maptext() diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm index 49a95a47aa63..3e9944558ac7 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm @@ -70,8 +70,8 @@ /obj/item/robot_module/flying/emergency/respawn_consumable(var/mob/living/silicon/robot/robot, var/amount) var/obj/item/chems/spray/PS = emag - if(PS && PS.reagents.total_volume < PS.volume) - var/adding = min(PS.volume-PS.reagents.total_volume, 2*amount) + if(PS && PS.reagents.total_volume < PS.reagents.maximum_volume) + var/adding = min(PS.reagents.maximum_volume-PS.reagents.total_volume, 2*amount) if(adding > 0) PS.add_to_reagents(/decl/material/liquid/acid/polyacid, adding) ..() diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm index 2a942c74e968..9ea5d4ee7ef6 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm @@ -41,8 +41,8 @@ if(!luminol) luminol = new(src) equipment += luminol - if(luminol.reagents.total_volume < luminol.volume) - var/adding = min(luminol.volume-luminol.reagents.total_volume, 2*amount) + if(luminol.reagents.total_volume < luminol.reagents.maximum_volume) + var/adding = min(luminol.reagents.maximum_volume-luminol.reagents.total_volume, 2*amount) if(adding > 0) luminol.add_to_reagents(/decl/material/liquid/luminol, adding) ..() diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 0f61b2f14bcd..c8da4e16f144 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -315,7 +315,7 @@ /obj/item/chems/spray/cleaner/drone name = "space cleaner" desc = "BLAM!-brand non-foaming space cleaner!" - volume = 150 + chem_volume = 150 /obj/item/robot_rack name = "a generic robot rack" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 4833f59de7ed..d3d49512d744 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -88,11 +88,11 @@ //Third argument may be a dna datum; if null will be set to holder's dna. /obj/item/organ/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance) + chem_volume = 5 * (w_class-1)**2 . = ..(mapload, material_key) if(. == INITIALIZE_HINT_QDEL) return . setup_organ(supplied_appearance) - initialize_reagents() /obj/item/organ/proc/setup_organ(datum/mob_snapshot/supplied_appearance) //Null DNA setup @@ -123,14 +123,6 @@ else set_species(owner?.get_species() || global.using_map.default_species) -//Called on initialization to add the neccessary reagents - -/obj/item/organ/initialize_reagents(populate = TRUE) - if(reagents) - return - create_reagents(5 * (w_class-1)**2) - . = ..() - // todo: make this redundant with matter shenanigans /obj/item/organ/populate_reagents() var/reagent_to_add = /decl/material/solid/organic/meat diff --git a/code/modules/paperwork/pen/quill_and_ink.dm b/code/modules/paperwork/pen/quill_and_ink.dm index ff4ebba1db7a..7cb3ba4a1dc1 100644 --- a/code/modules/paperwork/pen/quill_and_ink.dm +++ b/code/modules/paperwork/pen/quill_and_ink.dm @@ -56,7 +56,7 @@ icon = 'icons/obj/items/inkwell.dmi' icon_state = ICON_STATE_WORLD desc = "An inkwell used to hold ink. Dip a quill pen into this to re-ink it." - volume = 30 + chem_volume = 30 /// The minimum amount of ink in the inkwell when populating reagents. var/starting_volume_low = 20 /// The maximum amount of ink in the inkwell when populating reagents. diff --git a/code/modules/paperwork/pen/reagent_pen.dm b/code/modules/paperwork/pen/reagent_pen.dm index 7334323851a1..dfd52e06b040 100644 --- a/code/modules/paperwork/pen/reagent_pen.dm +++ b/code/modules/paperwork/pen/reagent_pen.dm @@ -3,14 +3,7 @@ origin_tech = @'{"materials":2,"esoteric":5}' sharp = TRUE pen_quality = TOOL_QUALITY_MEDIOCRE - -/obj/item/pen/reagent/Initialize() - . = ..() - initialize_reagents() - -/obj/item/pen/reagent/initialize_reagents(populate = TRUE) - create_reagents(30) - . = ..() + chem_volume = 30 /obj/item/pen/reagent/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/modules/paperwork/toner_cartridge.dm b/code/modules/paperwork/toner_cartridge.dm index f8c14247fb56..8e4e6155f479 100644 --- a/code/modules/paperwork/toner_cartridge.dm +++ b/code/modules/paperwork/toner_cartridge.dm @@ -10,7 +10,7 @@ throw_speed = 4 w_class = ITEM_SIZE_NORMAL material = /decl/material/solid/organic/plastic - volume = 60 + chem_volume = 60 amount_per_transfer_from_this = 30 possible_transfer_amounts = @"[30,60]" atom_flags = ATOM_FLAG_OPEN_CONTAINER diff --git a/code/modules/projectiles/ammunition/chemdart.dm b/code/modules/projectiles/ammunition/chemdart.dm index e153ddb9c559..97ce9edf74ef 100644 --- a/code/modules/projectiles/ammunition/chemdart.dm +++ b/code/modules/projectiles/ammunition/chemdart.dm @@ -7,21 +7,13 @@ life_span = 15 //shorter range muzzle_type = null material = /decl/material/solid/glass - var/reagent_amount = 15 - -/obj/item/projectile/bullet/chemdart/Initialize() - . = ..() - initialize_reagents() - -/obj/item/projectile/bullet/chemdart/initialize_reagents(populate = TRUE) - create_reagents(reagent_amount) - . = ..() + chem_volume = 15 /obj/item/projectile/bullet/chemdart/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) if(reagents?.total_volume && blocked < 100 && isliving(target)) var/mob/living/L = target if(L.can_inject(null, def_zone) == CAN_INJECT) - reagents.trans_to_mob(L, reagent_amount, CHEM_INJECT) + reagents.trans_to_mob(L, reagents.total_volume, CHEM_INJECT) /obj/item/ammo_casing/chemdart name = "chemical dart" diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index b5a33cfa8745..8b46af8c094a 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -22,7 +22,7 @@ var/list/starting_chems = null /obj/item/gun/projectile/dartgun/Initialize() - initialize_reagents() + chem_volume = length(starting_chems) * 60 . = ..() update_icon() @@ -89,8 +89,8 @@ //fills the given dart with reagents /obj/item/gun/projectile/dartgun/proc/fill_dart(var/obj/item/projectile/bullet/chemdart/dart) - if(mixing.len) - var/mix_amount = dart.reagent_amount/mixing.len + if(length(mixing)) + var/mix_amount = dart.reagents?.total_volume/length(mixing) for(var/obj/item/chems/glass/beaker/B in mixing) B.reagents.trans_to_obj(dart, mix_amount) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index 60c0df079836..872653d4804e 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -4,24 +4,24 @@ icon = 'icons/obj/items/chem/chem_cartridge.dmi' icon_state = "cartridge" w_class = ITEM_SIZE_NORMAL - volume = CARTRIDGE_VOLUME_LARGE + chem_volume = CARTRIDGE_VOLUME_LARGE amount_per_transfer_from_this = 50 material = /decl/material/solid/stone/ceramic // Large, but inaccurate. Use a chem dispenser or beaker for accuracy. possible_transfer_amounts = @"[50,100]" -/obj/item/chems/chem_disp_cartridge/initialize_reagents(populate = TRUE) +/obj/item/chems/chem_disp_cartridge/Initialize() . = ..() - if(populate && reagents.primary_reagent) + if(reagents?.primary_reagent) setLabel(reagents.get_primary_reagent_name()) /obj/item/chems/chem_disp_cartridge/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - . += "It has a capacity of [volume] units." - if(reagents.total_volume <= 0) + . += "It has a capacity of [reagents?.maximum_volume || 0] unit\s." + if(reagents?.total_volume <= 0) . += "It is empty." else - . += "It contains [reagents.total_volume] units of reagents." + . += "It contains [reagents?.total_volume || 0] unit\s of reagents." if(!ATOM_IS_OPEN_CONTAINER(src)) . += "The cap is sealed." diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 79d763d1f945..553e42ba766f 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -1,8 +1,8 @@ /obj/item/chems/chem_disp_cartridge/small - volume = CARTRIDGE_VOLUME_SMALL + chem_volume = CARTRIDGE_VOLUME_SMALL /obj/item/chems/chem_disp_cartridge/medium - volume = CARTRIDGE_VOLUME_MEDIUM + chem_volume = CARTRIDGE_VOLUME_MEDIUM /** * Helper macro to define a new cartridge type for a given reagent. diff --git a/code/modules/reagents/dispenser/cartridge_spawn.dm b/code/modules/reagents/dispenser/cartridge_spawn.dm index 2d81ee8be767..50b6f7e7454d 100644 --- a/code/modules/reagents/dispenser/cartridge_spawn.dm +++ b/code/modules/reagents/dispenser/cartridge_spawn.dm @@ -8,7 +8,7 @@ if("medium") cartridge_type = /obj/item/chems/chem_disp_cartridge/medium if("large") cartridge_type = /obj/item/chems/chem_disp_cartridge var/obj/item/chems/chem_disp_cartridge/cartridge = new cartridge_type(usr.loc) - cartridge.add_to_reagents(reagent_type, cartridge.volume) + cartridge.add_to_reagents(reagent_type, cartridge.reagents?.maximum_volume) var/reagent_name = cartridge.reagents.get_primary_reagent_name() cartridge.setLabel(reagent_name) log_and_message_admins("spawned a [size] reagent container containing [reagent_name] ([reagent_type])") diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 4b2165d06896..639b4a2b87fe 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -8,10 +8,10 @@ obj_flags = OBJ_FLAG_HOLLOW abstract_type = /obj/item/chems watertight = TRUE + chem_volume = 30 var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = @"[5,10,15,25,30]" - var/volume = 30 var/label_text var/presentation_flags = 0 var/detail_color @@ -19,7 +19,6 @@ /obj/item/chems/Initialize(ml, material_key) . = ..() - initialize_reagents() if(!possible_transfer_amounts) src.verbs -= /obj/item/chems/verb/set_amount_per_transfer_from_this @@ -151,13 +150,6 @@ reagents.splash(get_turf(src), reagents.total_volume) . = ..() -/obj/item/chems/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(reagents.maximum_volume, volume) - . = ..() - /obj/item/chems/proc/set_detail_color(var/new_color) if(new_color != detail_color) detail_color = new_color diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index a1816287111e..8fd812e2cc78 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -9,7 +9,7 @@ item_state = "null" amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60]" - volume = 60 + chem_volume = 60 w_class = ITEM_SIZE_SMALL atom_flags = ATOM_FLAG_OPEN_CONTAINER obj_flags = OBJ_FLAG_HOLLOW diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index cc2557974423..f8f844a21c0e 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -15,7 +15,7 @@ /obj/item/chems/glass/beaker/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - . += "It can hold up to [volume] units." + . += "It can hold up to [reagents?.maximum_volume] units." /obj/item/chems/glass/beaker/on_picked_up(mob/user, atom/old_loc) . = ..() @@ -33,7 +33,7 @@ if(reagents?.total_volume) var/image/filling = mutable_appearance(icon, "[icon_state]1", reagents.get_color()) - var/percent = round((reagents.total_volume / volume) * 100) + var/percent = round((reagents.total_volume / reagents.maximum_volume) * 100) switch(percent) if(0 to 9) filling.icon_state = "[icon_state]1" if(10 to 24) filling.icon_state = "[icon_state]10" @@ -69,7 +69,7 @@ desc = "A large beaker." icon = 'icons/obj/items/chem/beakers/large.dmi' center_of_mass = @'{"x":16,"y":10}' - volume = 120 + chem_volume = 120 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,120]" w_class = ITEM_SIZE_LARGE @@ -79,7 +79,7 @@ desc = "A large mixing bowl." icon = 'icons/obj/items/chem/mixingbowl.dmi' center_of_mass = @'{"x":16,"y":10}' - volume = 180 + chem_volume = 180 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,180]" atom_flags = ATOM_FLAG_OPEN_CONTAINER @@ -96,7 +96,7 @@ desc = "A heavy kettle for heating water." icon = 'icons/obj/items/chem/kettle.dmi' icon_state = ICON_STATE_WORLD - volume = 180 + chem_volume = 180 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,180]" atom_flags = ATOM_FLAG_OPEN_CONTAINER @@ -112,7 +112,7 @@ desc = "A cryostasis beaker that allows for chemical storage without reactions." icon = 'icons/obj/items/chem/beakers/stasis.dmi' center_of_mass = @'{"x":16,"y":8}' - volume = 60 + chem_volume = 60 amount_per_transfer_from_this = 10 atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_CHEM_CHANGE presentation_flags = PRESENTATION_FLAG_NAME @@ -126,7 +126,7 @@ desc = "An advanced beaker, powered by experimental technology." icon = 'icons/obj/items/chem/beakers/advanced.dmi' center_of_mass = @'{"x":16,"y":10}' - volume = 300 + chem_volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60,120,150,200,250,300]" material_alteration = MAT_FLAG_ALTERATION_NONE @@ -143,7 +143,7 @@ desc = "A small glass vial." icon = 'icons/obj/items/chem/vial.dmi' center_of_mass = @'{"x":15,"y":8}' - volume = 30 + chem_volume = 30 w_class = ITEM_SIZE_TINY //half the volume of a bottle, half the size amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,30]" @@ -178,7 +178,7 @@ icon = 'icons/obj/items/chem/beakers/insulated_large.dmi' center_of_mass = @'{"x":16,"y":10}' matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) - volume = 120 + chem_volume = 120 /obj/item/chems/glass/beaker/sulfuric/populate_reagents() add_to_reagents(/decl/material/liquid/acid, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 2178c3da5c2b..4368f1486288 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -12,7 +12,7 @@ icon = 'icons/obj/bloodpack.dmi' icon_state = "empty" w_class = ITEM_SIZE_SMALL - volume = 120 + chem_volume = 120 possible_transfer_amounts = @"[0.2,1,2]" amount_per_transfer_from_this = REM atom_flags = ATOM_FLAG_OPEN_CONTAINER @@ -27,14 +27,14 @@ /obj/item/chems/ivbag/on_reagent_change() if(!(. = ..())) return - if(reagents?.total_volume > volume/2) + if(reagents?.total_volume > reagents?.maximum_volume / 2) w_class = ITEM_SIZE_NORMAL else w_class = ITEM_SIZE_SMALL /obj/item/chems/ivbag/on_update_icon() . = ..() - var/percent = round(reagents?.total_volume / volume * 100) + var/percent = round(reagents?.total_volume / reagents?.maximum_volume * 100) if(percent) add_overlay(overlay_image(icon, "[round(percent,25)]", reagents.get_color())) add_overlay(attached? "dongle" : "top") diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index 5234b4c0ff72..3a1e4df3bfcb 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -3,7 +3,7 @@ desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment." icon = 'icons/obj/hypospray_borg.dmi' amount_per_transfer_from_this = 5 - volume = 30 + chem_volume = 30 possible_transfer_amounts = null max_health = ITEM_HEALTH_NO_DAMAGE @@ -137,7 +137,7 @@ icon_state = "shaker" charge_cost = 5 recharge_time = 3 - volume = 60 + chem_volume = 60 possible_transfer_amounts = @"[5,10,20,30]" /obj/item/chems/borghypo/service/get_generated_reagents() diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index bc54aadbaa47..c7ad55d990e6 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -6,7 +6,7 @@ icon_state = ICON_STATE_WORLD material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME presentation_flags = PRESENTATION_FLAG_NAME - volume = 30 + chem_volume = 30 amount_per_transfer_from_this = 5 /obj/item/chems/glass/bowl/can_lid() diff --git a/code/modules/reagents/reagent_containers/bucket.dm b/code/modules/reagents/reagent_containers/bucket.dm index 2a3dd2a016eb..2f950c3dd9af 100644 --- a/code/modules/reagents/reagent_containers/bucket.dm +++ b/code/modules/reagents/reagent_containers/bucket.dm @@ -7,7 +7,7 @@ w_class = ITEM_SIZE_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = @"[10,20,30,60,120,150,180]" - volume = 180 + chem_volume = 180 atom_flags = ATOM_FLAG_OPEN_CONTAINER presentation_flags = PRESENTATION_FLAG_NAME material = /decl/material/solid/organic/plastic @@ -44,14 +44,14 @@ /obj/item/chems/glass/bucket/get_reagents_overlay(state_prefix) if(!ATOM_IS_OPEN_CONTAINER(src)) return null // no overlay while closed! - if(!reagents || (reagents.total_volume / volume) < 0.8) + if(!reagents || (reagents.total_volume / reagents.maximum_volume) < 0.8) return null // must be at least 80% full to show return ..() /obj/item/chems/glass/bucket/wood desc = "It's a wooden bucket. How rustic." icon = 'icons/obj/items/wooden_bucket.dmi' - volume = 200 + chem_volume = 200 material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR // name is already modified /// The material used for the chain, belts, and rivets holding the wood together, typically iron or steel. diff --git a/code/modules/reagents/reagent_containers/condiments/__condiment.dm b/code/modules/reagents/reagent_containers/condiments/__condiment.dm index 9b5af2524d70..18fe2ee33785 100644 --- a/code/modules/reagents/reagent_containers/condiments/__condiment.dm +++ b/code/modules/reagents/reagent_containers/condiments/__condiment.dm @@ -7,7 +7,7 @@ possible_transfer_amounts = @"[1,5,10]" center_of_mass = @'{"x":16,"y":6}' randpixel = 6 - volume = 50 + chem_volume = 50 var/condiment_key var/morphic_container = TRUE var/use_condiment_name = TRUE diff --git a/code/modules/reagents/reagent_containers/condiments/_condiment_large.dm b/code/modules/reagents/reagent_containers/condiments/_condiment_large.dm index 877b64b928bd..0a260a574d22 100644 --- a/code/modules/reagents/reagent_containers/condiments/_condiment_large.dm +++ b/code/modules/reagents/reagent_containers/condiments/_condiment_large.dm @@ -1,6 +1,6 @@ /obj/item/chems/condiment/large name = "large condiment container" possible_transfer_amounts = @"[1,5,10,20,50,100]" - volume = 500 + chem_volume = 500 w_class = ITEM_SIZE_LARGE use_condiment_name = FALSE diff --git a/code/modules/reagents/reagent_containers/condiments/_condiment_small.dm b/code/modules/reagents/reagent_containers/condiments/_condiment_small.dm index 9c92a450df16..34c521eec487 100644 --- a/code/modules/reagents/reagent_containers/condiments/_condiment_small.dm +++ b/code/modules/reagents/reagent_containers/condiments/_condiment_small.dm @@ -3,5 +3,5 @@ name = "small condiment container" possible_transfer_amounts = @"[1,2,5,8,10,20]" amount_per_transfer_from_this = 1 - volume = 20 + chem_volume = 20 use_condiment_name = FALSE diff --git a/code/modules/reagents/reagent_containers/condiments/condiments_small.dm b/code/modules/reagents/reagent_containers/condiments/condiments_small.dm index 2ed3a0abe878..198f7ca470ba 100644 --- a/code/modules/reagents/reagent_containers/condiments/condiments_small.dm +++ b/code/modules/reagents/reagent_containers/condiments/condiments_small.dm @@ -2,7 +2,7 @@ name = "small condiment container" possible_transfer_amounts = @"[1,2,5,8,10,20]" amount_per_transfer_from_this = 1 - volume = 20 + chem_volume = 20 condiment_key = "small" #define MAPPED_CONDIMENT_TYPE(ID, TYPE) \ diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 4937cbe44298..5be3c085609c 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -12,7 +12,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" icon_state = null base_icon = "square" // Base icon name filling_states = @"[20,40,60,80,100]" - volume = 30 + chem_volume = 30 material = /decl/material/solid/glass drop_sound = 'sound/foley/bottledrop1.ogg' pickup_sound = 'sound/foley/bottlepickup1.ogg' @@ -77,7 +77,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" for(var/decl/material/reagent as anything in reagents.reagent_volumes) if("vapor" in reagent.glass_special) totalvape += REAGENT_VOLUME(reagents, reagent) - if(totalvape >= volume * 0.6) // 60% vapor by container volume + if(totalvape >= reagents.maximum_volume * 0.6) // 60% vapor by container volume return 1 return 0 diff --git a/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm b/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm index 6f7bafbe93a6..79a18bcae309 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/drink_glasses/square.dmi' desc = "Your standard drinking glass." filling_states = @"[20,40,60,80,100]" - volume = 30 + chem_volume = 30 possible_transfer_amounts = @"[5,10,15,30]" rim_pos = @'{"y":23,"x_left":13,"x_right":20}' @@ -16,7 +16,7 @@ icon_state = "rocks" icon = 'icons/obj/drink_glasses/rocks.dmi' filling_states = @"[25,50,75,100]" - volume = 20 + chem_volume = 20 possible_transfer_amounts = @"[5,10,20]" rim_pos = @'{"y":21,"x_left":10,"x_right":23}' @@ -27,7 +27,7 @@ icon_state = "shake" icon = 'icons/obj/drink_glasses/shake.dmi' filling_states = @"[25,50,75,100]" - volume = 30 + chem_volume = 30 possible_transfer_amounts = @"[5,10,15,30]" rim_pos = @'{"y":25,"x_left":13,"x_right":21}' @@ -38,7 +38,7 @@ icon_state = "cocktail" icon = 'icons/obj/drink_glasses/cocktail.dmi' filling_states = @"[33,66,100]" - volume = 15 + chem_volume = 15 possible_transfer_amounts = @"[5,10,15]" rim_pos = @'{"y":22,"x_left":13,"x_right":21}' @@ -49,7 +49,7 @@ icon_state = "shot" icon = 'icons/obj/drink_glasses/shot.dmi' filling_states = @"[33,66,100]" - volume = 5 + chem_volume = 5 possible_transfer_amounts = @"[1,2,5]" rim_pos = @'{"y":17,"x_left":13,"x_right":21}' @@ -59,7 +59,7 @@ icon_state = "pint" icon = 'icons/obj/drink_glasses/pint.dmi' filling_states = @"[16,33,50,66,83,100]" - volume = 60 + chem_volume = 60 possible_transfer_amounts = @"[5,10,15,30,60]" rim_pos = @'{"y":25,"x_left":12,"x_right":21}' @@ -70,7 +70,7 @@ icon_state = "mug" icon = 'icons/obj/drink_glasses/mug.dmi' filling_states = @"[25,50,75,100]" - volume = 40 + chem_volume = 40 possible_transfer_amounts = @"[5,10,20,40]" rim_pos = @'{"y":22,"x_left":12,"x_right":20}' @@ -81,7 +81,7 @@ icon_state = "wine" icon = 'icons/obj/drink_glasses/wine.dmi' filling_states = @"[20,40,60,80,100]" - volume = 25 + chem_volume = 25 possible_transfer_amounts = @"[5,10,15,25]" rim_pos = @'{"y":25,"x_left":12,"x_right":21}' @@ -91,7 +91,7 @@ base_icon = "flute" icon_state = "flute" icon = 'icons/obj/drink_glasses/flute.dmi' - volume = 25 + chem_volume = 25 filling_states = @"[20,40,60,80,100]" possible_transfer_amounts = @"[5,10,15,25]" rim_pos = @'{"y":24,"x_left":13,"x_right":19}' @@ -103,7 +103,7 @@ icon_state = "carafe" icon = 'icons/obj/drink_glasses/carafe.dmi' filling_states = @"[10,20,30,40,50,60,70,80,90,100]" - volume = 120 + chem_volume = 120 possible_transfer_amounts = @"[5,10,15,30,60,120]" rim_pos = @'{"y":26,"x_left":12,"x_right":21}' center_of_mass = @'{"x":16,"y":7}' @@ -114,7 +114,7 @@ icon = 'icons/obj/drink_glasses/coffecup.dmi' icon_state = "coffeecup" item_state = "coffee" - volume = 30 + chem_volume = 30 center_of_mass = @'{"x":15,"y":13}' filling_states = @"[40,80,100]" base_name = "cup" @@ -187,7 +187,7 @@ desc = "An unreasonably tall coffee cup, for when you really need to wake up in the morning." icon = 'icons/obj/drink_glasses/coffecup_tall.dmi' icon_state = "coffeecup_tall" - volume = 60 + chem_volume = 60 center_of_mass = @'{"x":15,"y":19}' filling_states = @"[50,70,90,100]" base_name = "tall cup" @@ -200,7 +200,7 @@ icon = 'icons/obj/drink_glasses/teacup.dmi' icon_state = "teacup" item_state = "coffee" - volume = 20 + chem_volume = 20 filling_states = @"[100]" base_name = "teacup" base_icon = "teacup" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm b/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm index 54d1b22bd65a..84959a660099 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm @@ -6,7 +6,7 @@ icon_state = "fitness-cup_black" base_icon = "fitness-cup" icon = 'icons/obj/drink_glasses/fitness.dmi' - volume = 100 + chem_volume = 100 material = /decl/material/solid/organic/plastic filling_states = @"[10,20,30,40,50,60,70,80,90,100]" possible_transfer_amounts = @"[5,10,15,25]" diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index 73f240c3b34f..acf8e61b283e 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -11,7 +11,7 @@ possible_transfer_amounts = null amount_per_transfer_from_this = 5 randpixel = 6 - volume = 50 + chem_volume = 50 abstract_type = /obj/item/chems/drinks watertight = FALSE // /drinks uses the open container flag for this @@ -69,17 +69,17 @@ return if(!reagents || reagents.total_volume == 0) . += SPAN_NOTICE("\The [src] is empty!") - else if (reagents.total_volume <= volume * 0.25) + else if (reagents.total_volume <= reagents.maximum_volume * 0.25) . += SPAN_NOTICE("\The [src] is almost empty!") - else if (reagents.total_volume <= volume * 0.66) + else if (reagents.total_volume <= reagents.maximum_volume * 0.66) . += SPAN_NOTICE("\The [src] is half full!") - else if (reagents.total_volume <= volume * 0.90) + else if (reagents.total_volume <= reagents.maximum_volume * 0.90) . += SPAN_NOTICE("\The [src] is almost full!") else . += SPAN_NOTICE("\The [src] is full!") /obj/item/chems/drinks/proc/get_filling_state() - var/percent = round((reagents.total_volume / volume) * 100) + var/percent = round((reagents.total_volume / reagents.maximum_volume) * 100) for(var/k in cached_json_decode(filling_states)) if(percent <= k) return k @@ -102,7 +102,7 @@ w_class = ITEM_SIZE_HUGE amount_per_transfer_from_this = 20 possible_transfer_amounts = null - volume = 150 + chem_volume = 150 atom_flags = ATOM_FLAG_OPEN_CONTAINER obj_flags = OBJ_FLAG_CONDUCTIBLE _base_attack_force = 14 @@ -134,7 +134,7 @@ /obj/item/chems/drinks/milk/smallcarton name = "small milk carton" - volume = 30 + chem_volume = 30 icon_state = "mini-milk" /obj/item/chems/drinks/milk/smallcarton/populate_reagents() @@ -190,7 +190,7 @@ desc = "A paper water cup." icon_state = "water_cup_e" possible_transfer_amounts = null - volume = 10 + chem_volume = 10 center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/sillycup/on_update_icon() @@ -212,7 +212,7 @@ icon_state = "teapot" item_state = "teapot" amount_per_transfer_from_this = 10 - volume = 120 + chem_volume = 120 center_of_mass = @'{"x":17,"y":7}' material = /decl/material/solid/stone/ceramic obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -221,7 +221,7 @@ name = "insulated pitcher" desc = "A stainless steel insulated pitcher. Everyone's best friend in the morning." icon_state = "pitcher" - volume = 120 + chem_volume = 120 amount_per_transfer_from_this = 10 center_of_mass = @'{"x":16,"y":9}' filling_states = @"[15,30,50,70,85,100]" @@ -233,7 +233,7 @@ name = "\improper Captain's flask" desc = "A metal flask belonging to the captain." icon_state = "flask" - volume = 60 + chem_volume = 60 center_of_mass = @'{"x":17,"y":7}' /obj/item/chems/drinks/flask/shiny @@ -250,21 +250,21 @@ name = "\improper Detective's flask" desc = "A metal flask with a leather band and golden badge belonging to the detective." icon_state = "detflask" - volume = 60 + chem_volume = 60 center_of_mass = @'{"x":17,"y":8}' /obj/item/chems/drinks/flask/barflask name = "flask" desc = "For those who can't be bothered to hang out at the bar to drink." icon_state = "barflask" - volume = 60 + chem_volume = 60 center_of_mass = @'{"x":17,"y":7}' /obj/item/chems/drinks/flask/vacuumflask name = "vacuum flask" desc = "Keeping your drinks at the perfect temperature since 1892." icon_state = "vacuumflask" - volume = 60 + chem_volume = 60 center_of_mass = @'{"x":15,"y":4}' //tea and tea accessories @@ -276,7 +276,7 @@ center_of_mass = @'{"x":16,"y":14}' filling_states = @"[100]" base_icon = "cup" - volume = 30 + chem_volume = 30 /obj/item/chems/drinks/tea/black name = "cup of black tea" diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 3de103abcbb2..f6a7161ed3c4 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -5,7 +5,7 @@ //#TODO: Maybe merge this with /obj/item/glass/bottle? /obj/item/chems/drinks/bottle amount_per_transfer_from_this = 10 - volume = 100 + chem_volume = 100 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. material = /decl/material/solid/glass drop_sound = 'sound/foley/bottledrop1.ogg' @@ -600,7 +600,7 @@ //Small bottles /obj/item/chems/drinks/bottle/small - volume = 50 + chem_volume = 50 smash_duration = 1 atom_flags = 0 //starts closed rag_underlay = "rag_small" diff --git a/code/modules/reagents/reagent_containers/drinks/cans.dm b/code/modules/reagents/reagent_containers/drinks/cans.dm index 3b0974dd6e3a..c59761ee3e1e 100644 --- a/code/modules/reagents/reagent_containers/drinks/cans.dm +++ b/code/modules/reagents/reagent_containers/drinks/cans.dm @@ -1,5 +1,5 @@ /obj/item/chems/drinks/cans - volume = 40 //just over one and a half cups + chem_volume = 40 //just over one and a half cups amount_per_transfer_from_this = 5 atom_flags = 0 //starts closed material = /decl/material/solid/metal/aluminium diff --git a/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm b/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm index f8416cf3a1f0..4b503ded567a 100644 --- a/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm +++ b/code/modules/reagents/reagent_containers/drinks/cocktailshaker.dm @@ -4,7 +4,7 @@ icon_state = "shaker" amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,60]" //Professional bartender should be able to transfer as much as needed - volume = 120 + chem_volume = 120 center_of_mass = @'{"x":17,"y":10}' atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT diff --git a/code/modules/reagents/reagent_containers/drinks/juicebox.dm b/code/modules/reagents/reagent_containers/drinks/juicebox.dm index 1ffae8ceb750..cc01e61767ae 100644 --- a/code/modules/reagents/reagent_containers/drinks/juicebox.dm +++ b/code/modules/reagents/reagent_containers/drinks/juicebox.dm @@ -3,7 +3,7 @@ icon_state = "juicebox_base" name = "juicebox" desc = "A small cardboard juicebox. Cheap and flimsy." - volume = 30 + chem_volume = 30 amount_per_transfer_from_this = 5 atom_flags = 0 material = /decl/material/solid/organic/cardboard diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index e762458818d5..3686618113bd 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -10,7 +10,7 @@ possible_transfer_amounts = @"[1,2,3,4,5]" w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS - volume = 5 + chem_volume = 5 item_flags = ITEM_FLAG_NO_BLUDGEON /obj/item/chems/dropper/afterattack(var/obj/target, var/mob/user, var/proximity) @@ -96,7 +96,7 @@ desc = "A larger dropper. Transfers 10 units." amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[1,2,3,4,5,6,7,8,9,10]" - volume = 10 + chem_volume = 10 //////////////////////////////////////////////////////////////////////////////// /// Droppers. END diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index 3de925eb5c54..661eed567e3b 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -21,9 +21,8 @@ w_class = ITEM_SIZE_SMALL abstract_type = /obj/item/food needs_attack_dexterity = DEXTERITY_NONE + chem_volume = 50 - /// The maximum reagent volume of this food. Used in initialize_reagents. - var/volume = 50 /// Indicates the food should give a stress effect on eating. // This is set to 1 if the food is created by a recipe, -1 if the food is raw. var/cooked_food = FOOD_PREPARED @@ -59,19 +58,11 @@ else if(!istype(plate)) plate = null - initialize_reagents() if(isnull(_utensil_food_type)) _utensil_food_type = type if(slice_path && slice_num) utensil_flags |= UTENSIL_FLAG_SLICE -/obj/item/food/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(reagents.maximum_volume, volume) - return ..() - // Dummy type used solely for soup bowls/soup spoons. /obj/item/food/lump name = "lump" diff --git a/code/modules/reagents/reagent_containers/food/burgers.dm b/code/modules/reagents/reagent_containers/food/burgers.dm index baa622d0f766..728d89478596 100644 --- a/code/modules/reagents/reagent_containers/food/burgers.dm +++ b/code/modules/reagents/reagent_containers/food/burgers.dm @@ -108,7 +108,7 @@ desc = "This massive patty looks like poison. Beep." icon = 'icons/obj/food/burgers/roburger.dmi' filling_color = COLOR_GRAY80 - volume = 100 + chem_volume = 100 center_of_mass = @'{"x":16,"y":11}' bitesize = 0.1 diff --git a/code/modules/reagents/reagent_containers/food/eggs.dm b/code/modules/reagents/reagent_containers/food/eggs.dm index 8c4b82aa292e..5c3b600079ce 100644 --- a/code/modules/reagents/reagent_containers/food/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/eggs.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/food/eggs/egg.dmi' icon_state = ICON_STATE_WORLD filling_color = "#fdffd1" - volume = 10 + chem_volume = 10 center_of_mass = @'{"x":16,"y":13}' material = /decl/material/solid/organic/bone/eggshell obj_flags = OBJ_FLAG_HOLLOW diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 54559692503d..13c52ae77249 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -14,7 +14,7 @@ w_class = ITEM_SIZE_SMALL item_flags = 0 obj_flags = 0 - volume = 60 + chem_volume = 60 material = /decl/material/solid/glass material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME @@ -39,7 +39,7 @@ /obj/item/chems/glass/bottle/update_overlays() if(reagents?.total_volume) - var/percent = round(reagents.total_volume / volume * 100, 25) + var/percent = round(reagents.total_volume / reagents.maximum_volume * 100, 25) add_overlay(mutable_appearance(icon, "[icon_state]_filling_[percent]", reagents.get_color())) var/image/overglass = mutable_appearance(icon, "[icon_state]_over", color) overglass.alpha = alpha * ((alpha/255) ** 3) diff --git a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm index 54464dc89126..530cbf5362c2 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm @@ -5,7 +5,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10,15,25,30,50,100]" atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 60 + chem_volume = 60 /obj/item/chems/glass/bottle/robot/Initialize() . = ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 908e70a81d5d..e0406f96dd66 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -10,7 +10,7 @@ abstract_type = /obj/item/chems/hypospray origin_tech = @'{"materials":4,"biotech":5}' amount_per_transfer_from_this = 5 - volume = 30 + chem_volume = 30 possible_transfer_amounts = null atom_flags = ATOM_FLAG_OPEN_CONTAINER slot_flags = SLOT_LOWER_BODY @@ -86,7 +86,7 @@ desc = "A sterile, air-needle autoinjector for rapid administration of drugs to patients. Uses a replaceable 30u vial." possible_transfer_amounts = @"[1,2,5,10,15,20,30]" amount_per_transfer_from_this = 5 - volume = 0 + chem_volume = 0 time = 0 // hyposprays are instant for conscious people single_use = FALSE material = /decl/material/solid/metal/steel @@ -116,7 +116,7 @@ loaded_vial = V reagents.maximum_volume = loaded_vial.reagents.maximum_volume - loaded_vial.reagents.trans_to_holder(reagents, volume) + loaded_vial.reagents.trans_to_holder(reagents, chem_volume) if(user) user.visible_message(SPAN_NOTICE("[user] has loaded [V] into \the [src]."), SPAN_NOTICE("[usermessage]")) @@ -128,7 +128,7 @@ /obj/item/chems/hypospray/vial/proc/remove_vial(var/mob/user, var/swap_mode, var/should_update_icon = TRUE) if(!loaded_vial) return - reagents.trans_to_holder(loaded_vial.reagents,volume) + reagents.trans_to_holder(loaded_vial.reagents,chem_volume) reagents.maximum_volume = 0 loaded_vial.update_icon() if(user) @@ -172,7 +172,7 @@ desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel." icon = 'icons/obj/autoinjector.dmi' amount_per_transfer_from_this = 5 - volume = 5 + chem_volume = 5 origin_tech = @'{"materials":2,"biotech":2}' slot_flags = SLOT_LOWER_BODY | SLOT_EARS w_class = ITEM_SIZE_SMALL diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 7408e7545d33..6ed443810914 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -7,7 +7,7 @@ icon_state = ICON_STATE_WORLD center_of_mass = @'{"x":16,"y":11}' amount_per_transfer_from_this = 5 - volume = 5 + chem_volume = 5 w_class = ITEM_SIZE_SMALL possible_transfer_amounts = null atom_flags = ATOM_FLAG_OPEN_CONTAINER diff --git a/code/modules/reagents/reagent_containers/mortar.dm b/code/modules/reagents/reagent_containers/mortar.dm index 76cb59c9a98e..6af747cd6a1d 100644 --- a/code/modules/reagents/reagent_containers/mortar.dm +++ b/code/modules/reagents/reagent_containers/mortar.dm @@ -3,7 +3,7 @@ desc = "A hard, sturdy bowl used to hold organic matter for crushing." icon = 'icons/obj/items/chem/mortar.dmi' icon_state = ICON_STATE_WORLD - volume = 40 + chem_volume = 40 material = /decl/material/solid/stone/basalt color = /decl/material/solid/stone/basalt::color material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/code/modules/reagents/reagent_containers/packets.dm b/code/modules/reagents/reagent_containers/packets.dm index 391c3440471b..6b417f2254ea 100644 --- a/code/modules/reagents/reagent_containers/packets.dm +++ b/code/modules/reagents/reagent_containers/packets.dm @@ -5,7 +5,7 @@ w_class = ITEM_SIZE_TINY possible_transfer_amounts = @"[1,2,5,10]" amount_per_transfer_from_this = 1 - volume = 10 + chem_volume = 10 /obj/item/chems/packet/attack_self(mob/user) if(!ATOM_IS_OPEN_CONTAINER(src)) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index e58ada9128be..3fe3c69ad6f0 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -12,7 +12,7 @@ possible_transfer_amounts = null w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS - volume = 30 + chem_volume = 30 material = /decl/material/solid/organic/plantmatter var/autolabel = TRUE // if set, will add label with the name of the first initial reagent var/static/list/colorizable_icon_states = list("pill1", "pill2", "pill3", "pill4", "pill5") // if using an icon state from here, color will be derived from reagents @@ -74,7 +74,7 @@ /obj/item/chems/pill/bromide desc = "Highly toxic." icon_state = "pill4" - volume = 50 + chem_volume = 50 /obj/item/chems/pill/bromide/populate_reagents() add_to_reagents(/decl/material/liquid/bromide, reagents.maximum_volume) @@ -84,7 +84,7 @@ name = "strange pill" desc = "It's marked 'KCN'. Smells vaguely of almonds." icon_state = "pillC" - volume = 50 + chem_volume = 50 autolabel = FALSE /obj/item/chems/pill/cyanide/populate_reagents() diff --git a/code/modules/reagents/reagent_containers/retort.dm b/code/modules/reagents/reagent_containers/retort.dm index c5640394ce48..6605adad776d 100644 --- a/code/modules/reagents/reagent_containers/retort.dm +++ b/code/modules/reagents/reagent_containers/retort.dm @@ -1,11 +1,11 @@ /obj/item/chems/glass/retort - name = "retort" - base_name = "retort" - desc = "A strangely-shaped vessel for separating chemicals when heated." - icon = 'icons/obj/items/retort.dmi' - icon_state = ICON_STATE_WORLD - volume = 120 - material = /decl/material/solid/glass + name = "retort" + base_name = "retort" + desc = "A strangely-shaped vessel for separating chemicals when heated." + icon = 'icons/obj/items/retort.dmi' + icon_state = ICON_STATE_WORLD + chem_volume = 120 + material = /decl/material/solid/glass material_alteration = MAT_FLAG_ALTERATION_ALL /obj/item/chems/glass/retort/can_lid() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 9b53bcaedb9a..427175a7493e 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -12,7 +12,7 @@ throw_range = 10 attack_cooldown = DEFAULT_QUICK_COOLDOWN material = /decl/material/solid/organic/plastic - volume = 250 + chem_volume = 250 amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[5,10]" var/tmp/possible_particle_amounts = @"[1,3]" ///Possible chempuff particles amount for each transfer amount setting @@ -160,7 +160,7 @@ icon = 'icons/obj/items/weapon/pepperspray.dmi' icon_state = ICON_STATE_WORLD possible_transfer_amounts = null - volume = 60 + chem_volume = 60 particle_move_delay = 1 safety = TRUE @@ -178,7 +178,7 @@ item_state = "sunflower" amount_per_transfer_from_this = 1 possible_transfer_amounts = null - volume = 10 + chem_volume = 10 /obj/item/chems/spray/waterflower/populate_reagents() add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) @@ -191,7 +191,7 @@ item_state = "chemsprayer" w_class = ITEM_SIZE_LARGE possible_transfer_amounts = null - volume = 600 + chem_volume = 600 origin_tech = @'{"combat":3,"materials":3,"engineering":3}' particle_move_delay = 2 //Was hardcoded to 2 before, and 8 was slower than most mob's move speed material = /decl/material/solid/metal/steel @@ -216,7 +216,7 @@ icon = 'icons/obj/hydroponics/hydroponics_machines.dmi' icon_state = "plantbgone" item_state = "plantbgone" - volume = 100 + chem_volume = 100 /obj/item/chems/spray/plantbgone/populate_reagents() add_to_reagents(/decl/material/liquid/weedkiller, reagents.maximum_volume) @@ -225,7 +225,7 @@ name = "deodorant" desc = "A can of Gold Standard spray deodorant - for when you're too lazy to shower." gender = PLURAL - volume = 35 + chem_volume = 35 icon = 'icons/obj/items/deodorant.dmi' icon_state = "deodorant" item_state = "deodorant" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index f6128d0f6cd4..713453cb5b5e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -14,7 +14,7 @@ material = /decl/material/solid/glass amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[1,2,5]" - volume = 15 + chem_volume = 15 w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS sharp = TRUE @@ -100,7 +100,7 @@ return var/rounded_vol = 0 if (reagents?.total_volume > 0) - rounded_vol = clamp(round((reagents.total_volume / volume * 15),5), 5, 15) + rounded_vol = clamp(round((reagents.total_volume / max(1, reagents.maximum_volume * 15)),5), 5, 15) if(ismob(loc)) add_overlay((mode == SYRINGE_DRAW)? "[icon_state]_draw" : "[icon_state]_inject") icon_state = "[icon_state]_[rounded_vol]" @@ -317,7 +317,7 @@ name = "lethal injection syringe" desc = "A syringe used for lethal injections." amount_per_transfer_from_this = 60 - volume = 60 + chem_volume = 60 visible_name = "a giant syringe" time = 30 SECONDS mode = SYRINGE_INJECT @@ -389,7 +389,7 @@ name = "advanced syringe" desc = "An advanced syringe that can hold 60 units of chemicals." amount_per_transfer_from_this = 20 - volume = 60 + chem_volume = 60 icon = 'icons/obj/syringe_advanced.dmi' material = /decl/material/solid/glass matter = list( @@ -401,7 +401,7 @@ /obj/item/chems/syringe/noreact name = "cryostasis syringe" desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units." - volume = 20 + chem_volume = 20 atom_flags = ATOM_FLAG_NO_CHEM_CHANGE icon = 'icons/obj/syringe_cryo.dmi' material = /decl/material/solid/glass diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ecb39c854f4a..ba4d347b9fc3 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -10,17 +10,16 @@ matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY) max_health = 100 tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + chem_volume = 1000 var/wrenchable = TRUE var/unwrenched = FALSE - var/tmp/volume = 1000 var/amount_dispensed = 10 var/can_toggle_open = TRUE var/tmp/possible_transfer_amounts = @"[10,25,50,100,500]" /obj/structure/reagent_dispensers/Initialize(ml, _mat, _reinf_mat) . = ..() - initialize_reagents() if (!possible_transfer_amounts) verbs -= /obj/structure/reagent_dispensers/verb/set_amount_dispensed @@ -42,13 +41,6 @@ else tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT -/obj/structure/reagent_dispensers/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(reagents.maximum_volume, volume) - . = ..() - /obj/structure/reagent_dispensers/proc/leak() var/turf/T = get_turf(src) if(reagents && T) @@ -126,7 +118,7 @@ icon_state = "watertank" amount_dispensed = 10 possible_transfer_amounts = @"[10,25,50,100]" - volume = 7500 + chem_volume = 7500 atom_flags = ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED @@ -140,8 +132,8 @@ icon_state = ICON_STATE_WORLD /obj/structure/reagent_dispensers/watertank/firefighter - name = "firefighting water reserve" - volume = 50000 + name = "firefighting water reserve" + chem_volume = 50000 /obj/structure/reagent_dispensers/watertank/attackby(obj/item/used_item, mob/user) //FIXME: Maybe this should be handled differently? Since it can essentially make the tank unusable. @@ -254,7 +246,7 @@ possible_transfer_amounts = null amount_dispensed = 5 anchored = TRUE - volume = 500 + chem_volume = 500 tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) var/cups = 12 var/tmp/max_cups = 12 diff --git a/mods/content/beekeeping/hive_frame.dm b/mods/content/beekeeping/hive_frame.dm index 0bfd7265f231..e126ec1a7fa2 100644 --- a/mods/content/beekeeping/hive_frame.dm +++ b/mods/content/beekeeping/hive_frame.dm @@ -3,16 +3,9 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_SMALL material_alteration = MAT_FLAG_ALTERATION_ALL + chem_volume = 20 var/destroy_on_centrifuge = FALSE -/obj/item/hive_frame/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/hive_frame/initialize_reagents(populate = TRUE) - create_reagents(20) - . = ..() - /obj/item/hive_frame/on_reagent_change() . = ..() if(reagents?.total_volume) diff --git a/mods/content/integrated_electronics/components/reagents.dm b/mods/content/integrated_electronics/components/reagents.dm index b29a7e1c21c3..a89077170c70 100644 --- a/mods/content/integrated_electronics/components/reagents.dm +++ b/mods/content/integrated_electronics/components/reagents.dm @@ -7,15 +7,13 @@ /obj/item/integrated_circuit/reagent category_text = "Reagent" cooldown_per_use = 10 - var/volume = 0 /obj/item/integrated_circuit/reagent/solvent_can_melt(var/solvent_power = MAT_SOLVENT_STRONG) return FALSE /obj/item/integrated_circuit/reagent/Initialize() . = ..() - if(volume) - create_reagents(volume) + if(reagents?.maximum_volume) push_vol() /obj/item/integrated_circuit/reagent/proc/push_vol() @@ -30,7 +28,7 @@ into the smoke clouds when activated. The reagents are consumed when the smoke is made." ext_cooldown = 1 atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 100 + chem_volume = 100 complexity = 20 cooldown_per_use = 1 SECONDS @@ -81,7 +79,7 @@ must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. Negative given amounts makes the injector suck out reagents instead." atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 30 + chem_volume = 30 complexity = 20 cooldown_per_use = 6 SECONDS @@ -117,7 +115,7 @@ else direction_mode = IC_REAGENTS_INJECT if(isnum(new_amount)) - new_amount = clamp(new_amount, 0, volume) + new_amount = clamp(new_amount, 0, chem_volume) transfer_amount = new_amount @@ -304,7 +302,7 @@ extended_desc = "This is effectively an internal beaker." atom_flags = ATOM_FLAG_OPEN_CONTAINER - volume = 60 + chem_volume = 60 complexity = 4 inputs = list() @@ -326,7 +324,7 @@ icon_state = "reagent_storage_big" desc = "Stores liquid inside the device away from electrical components. Can store up to 180u." - volume = 180 + chem_volume = 180 complexity = 16 spawn_flags = IC_SPAWN_RESEARCH @@ -359,7 +357,7 @@ "on fail" = IC_PINTYPE_PULSE_OUT, "push ref" = IC_PINTYPE_PULSE_IN ) - volume = 100 + chem_volume = 100 power_draw_per_use = 150 complexity = 16 spawn_flags = IC_SPAWN_RESEARCH @@ -552,7 +550,7 @@ complexity = 12 cooldown_per_use = 1 power_draw_per_use = 50 - volume = 30 + chem_volume = 30 var/active = 0 var/min_temp = 40 CELSIUS diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index 19c61ced8d9b..3235d8b0c1b6 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -10,6 +10,7 @@ atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/liquid/slimejelly _base_attack_force = 1 + chem_volume = 100 var/slime_type = /decl/slime_colour/grey var/Uses = 1 // uses before it goes inert var/enhanced = 0 //has it been enhanced before? @@ -38,13 +39,8 @@ if(!ispath(slime_type, /decl/slime_colour)) PRINT_STACK_TRACE("Slime extract initialized with non-decl slime colour: [slime_type || "NULL"].") SSstatistics.extracted_slime_cores_amount++ - initialize_reagents() update_icon() -/obj/item/slime_extract/initialize_reagents(populate) - create_reagents(100) - . = ..() - /obj/item/slime_extract/populate_reagents() add_to_reagents(/decl/material/liquid/slimejelly, 30) From 5c49df31c585f759a0fccc5f43dc1bfbc249ce01 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 20:10:26 +1100 Subject: [PATCH 85/93] Updating uses of volume in maps. --- maps/away/lost_supply_base/lost_supply_base.dmm | 2 +- maps/away/unishi/unishi-1.dmm | 2 +- maps/exodus/exodus-2.dmm | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 646d3271d4f2..204c6d60b768 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -1426,7 +1426,7 @@ /area/lost_supply_base/common) "eD" = ( /obj/machinery/atmospherics/unary/tank/hydrogen{ - volume = 3200 + air_volume = 3200 }, /turf/floor/plating/airless, /area/lost_supply_base) diff --git a/maps/away/unishi/unishi-1.dmm b/maps/away/unishi/unishi-1.dmm index 69dafd229b14..befa32bfaf72 100644 --- a/maps/away/unishi/unishi-1.dmm +++ b/maps/away/unishi/unishi-1.dmm @@ -251,7 +251,7 @@ /area/unishi/engineering) "aO" = ( /obj/machinery/atmospherics/unary/tank/oxygen{ - volume = 3200 + air_volume = 3200 }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/floor, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 99e6fc86be8f..d333b7a254be 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -48513,7 +48513,7 @@ /area/exodus/engineering/storage) "bXs" = ( /obj/machinery/atmospherics/unary/tank/oxygen{ - volume = 3200 + air_volume = 3200 }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, @@ -48544,7 +48544,7 @@ /area/exodus/engineering/break_room) "bXv" = ( /obj/machinery/atmospherics/unary/tank/hydrogen{ - volume = 3200 + air_volume = 3200 }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, From 48a38670077c7b227520f6af3beaf00fc4cae097 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 20:24:36 +1100 Subject: [PATCH 86/93] create_reagents() -> create_or_update_reagents() or chem_volume set. --- code/datums/composite_sounds/_composite_sound.dm | 2 +- code/game/machinery/biogenerator.dm | 3 ++- code/game/machinery/kitchen/microwave.dm | 3 ++- code/game/machinery/washing_machine.dm | 5 +---- code/game/objects/__objs.dm | 9 ++++----- code/game/objects/effects/chem/chemsmoke.dm | 8 ++++---- code/game/objects/effects/chem/foam.dm | 11 ++++------- code/game/objects/effects/chem/water.dm | 2 ++ code/game/objects/effects/chem_holder.dm | 6 ++++++ .../objects/effects/decals/Cleanable/misc.dm | 4 ++-- .../items/weapons/grenades/chem_grenade.dm | 6 ++---- code/game/objects/structures/fires.dm | 2 +- code/game/objects/structures/iv_drip.dm | 2 +- code/game/objects/structures/janicart.dm | 10 +++------- code/game/objects/structures/mop_bucket.dm | 6 +----- code/game/objects/structures/watercloset.dm | 6 +----- code/game/turfs/turf_fluids.dm | 12 ++++-------- code/modules/crafting/pottery/pottery_moulds.dm | 7 ++----- code/modules/food/utensils/_utensil.dm | 16 ++++++++-------- code/modules/hydroponics/grown.dm | 10 ++-------- code/modules/hydroponics/trays/tray.dm | 9 ++++----- code/modules/implants/implant_types/chem.dm | 2 +- .../mining/machinery/material_extractor.dm | 8 ++++---- .../modules/mining/machinery/material_smelter.dm | 3 ++- code/modules/mob/living/living_powers.dm | 1 - .../silicon/robot/modules/module_clerical.dm | 2 +- code/modules/power/port_gen.dm | 5 +---- code/modules/reagents/Chemistry-Holder.dm | 13 +++++++++++-- code/modules/reagents/Chemistry-Machinery.dm | 8 ++------ code/modules/reagents/dispenser/cartridge.dm | 7 +++++-- .../reagents/reagent_containers/hypospray.dm | 6 +++--- .../modules/reagents/reagent_containers/spray.dm | 1 - code/modules/scanners/mass_spectrometer.dm | 5 +---- code/modules/sealant_gun/sealant_tank.dm | 2 +- code/modules/vehicles/engine.dm | 2 +- .../machinery/geosample_scanner.dm | 5 +---- code/unit_tests/chemistry_tests.dm | 4 ++-- code/unit_tests/food_tests.dm | 3 +-- .../components/power_passive.dm | 4 ++-- .../components/reagents.dm | 2 +- nebula.dme | 1 + 41 files changed, 98 insertions(+), 125 deletions(-) create mode 100644 code/game/objects/effects/chem_holder.dm diff --git a/code/datums/composite_sounds/_composite_sound.dm b/code/datums/composite_sounds/_composite_sound.dm index 7a551b53e0fd..c8b412c6c0a3 100644 --- a/code/datums/composite_sounds/_composite_sound.dm +++ b/code/datums/composite_sounds/_composite_sound.dm @@ -6,7 +6,7 @@ start_length (num) How long to wait before starting the main loop after playing start_sound end_sound (soundfile) The sound played after the main loop has concluded chance (num) Chance per loop to play a mid_sound - volume (num) Sound output volume + play_volume (num) Sound output volume max_loops (num) The max amount of loops to run for. direct (bool) If true plays directly to provided atoms instead of from them */ diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 75e0387142c4..59ef63bfc7c1 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -16,6 +16,8 @@ construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + chem_volume = 1000 + var/processing = 0 var/obj/item/chems/glass/beaker = null var/points = 0 @@ -54,7 +56,6 @@ /obj/item/stack/material/skin/mapped/synthleather =30)) /obj/machinery/biogenerator/Initialize() - create_reagents(1000) beaker = new /obj/item/chems/glass/bottle(src) . = ..() diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index f1b754a8920e..1455ec5907ac 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -11,6 +11,8 @@ construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + chem_volume = 100 + var/operating = FALSE // Is it on? var/dirty = 0 // = {0..100} Does it need cleaning? var/broken = 0 // ={0,1,2} How broken is it??? @@ -37,7 +39,6 @@ /obj/machinery/microwave/Initialize() . = ..() - create_reagents(100) soundloop = new(list(src), FALSE) /obj/machinery/microwave/Destroy() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index f6e04eb2d50f..1113f10ec678 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -19,6 +19,7 @@ obj_flags = OBJ_FLAG_ANCHORABLE clicksound = "button" clickvol = 40 + chem_volume = 100 // Power idle_power_usage = 10 @@ -57,10 +58,6 @@ ) return wash_blacklist -/obj/machinery/washing_machine/Initialize(mapload, d, populate_parts) - create_reagents(100) - . = ..() - /obj/machinery/washing_machine/get_examine_strings(mob/user, distance, infix, suffix) . = ..() . += SPAN_NOTICE("The detergent port is [atom_flags & ATOM_FLAG_OPEN_CONTAINER ? "open" : "closed"].") diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm index e1a861e46dd4..7295fe42516e 100644 --- a/code/game/objects/__objs.dm +++ b/code/game/objects/__objs.dm @@ -9,8 +9,8 @@ ///The current health of the obj. Leave to null, unless you want the object to start at a different health than max_health. current_health = null - // If >0 will create a reagent holder on Initialize() - var/chem_volume = 0 + // If non-null and positive, will create a reagent holder on Initialize() + var/chem_volume var/obj_flags var/datum/talking_atom/talking_atom @@ -37,7 +37,7 @@ current_health = get_max_health() else current_health = min(current_health, get_max_health()) - if(chem_volume > 0) + if(!isnull(chem_volume) && chem_volume >= 0) // 0-volume holders perserved for legacy code reasons. Ideally shouldn't exist if <= 0 initialize_reagents() /obj/object_shaken() @@ -271,8 +271,7 @@ SHOULD_CALL_PARENT(TRUE) if(reagents?.total_volume > 0) log_warning("\The [src] possibly is initializing its reagents more than once!") - if(chem_volume > 0) - create_reagents(chem_volume) + create_or_update_reagents(chem_volume) if(populate) populate_reagents() diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index ccfd9b93b6e5..1305d6ee4112 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -7,13 +7,14 @@ layer = ABOVE_PROJECTILE_LAYER time_to_live = 300 pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE | PASS_FLAG_GLASS //PASS_FLAG_GLASS is fine here, it's just so the visual effect can "flow" around glass + chem_volume = 500 + var/splash_amount = 10 //atoms moving through a smoke cloud get splashed with up to 10 units of reagent var/turf/destination /obj/effect/effect/smoke/chem/Initialize(mapload, smoke_duration, turf/dest_turf = null, icon/cached_icon = null) . = ..() - create_reagents(500) if(cached_icon) icon = cached_icon @@ -76,7 +77,7 @@ ///////////////////////////////////////////// /datum/effect/effect/system/smoke_spread/chem smoke_type = /obj/effect/effect/smoke/chem - var/obj/chemholder + var/obj/effect/chem_holder/chemholder var/range var/list/targetTurfs var/list/wallList @@ -96,8 +97,7 @@ /datum/effect/effect/system/smoke_spread/chem/New() ..() - chemholder = new/obj() - chemholder.create_reagents(500) + chemholder = new(null, 500) //Sets up the chem smoke effect // Calculates the max range smoke can travel, then gets all turfs in that view range. diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 06a1a7d81f79..a961e82da284 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -11,6 +11,7 @@ layer = ABOVE_OBJ_LAYER mouse_opacity = MOUSE_OPACITY_UNCLICKABLE animate_movement = 0 + chem_volume = 10 var/amount = 3 var/metal = 0 @@ -56,11 +57,9 @@ F = new(T, metal) F.amount = amount - if(!metal) - F.create_reagents(10) - if(reagents) - for(var/decl/material/reagent as anything in reagents.reagent_volumes) - F.add_to_reagents(reagent, 1, safety = 1) //added safety check since reagents in the foam have already had a chance to react + if(!metal && reagents?.total_volume) + for(var/decl/material/reagent as anything in reagents.reagent_volumes) + F.add_to_reagents(reagent, 1, safety = 1) //added safety check since reagents in the foam have already had a chance to react /obj/effect/effect/foam/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) // foam disolves when heated, except metal foams if(!metal && prob(max(0, exposed_temperature - 475))) @@ -107,8 +106,6 @@ F.amount = amount if(!metal) // don't carry other chemicals if a metal foam - F.create_reagents(10) - if(carried_reagents) for(var/id in carried_reagents) F.add_to_reagents(id, 1, safety = 1) //makes a safety call because all reagents should have already reacted anyway diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index 8f4dbce7bb75..aafbd41b47df 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -4,6 +4,7 @@ icon_state = "extinguish" mouse_opacity = MOUSE_OPACITY_UNCLICKABLE pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GRILLE + chem_volume = 10 /obj/effect/effect/water/Initialize() . = ..() @@ -62,3 +63,4 @@ name = "chemicals" icon = 'icons/obj/chempuff.dmi' icon_state = "" + chem_volume = 10 diff --git a/code/game/objects/effects/chem_holder.dm b/code/game/objects/effects/chem_holder.dm new file mode 100644 index 000000000000..b6c0ea502f78 --- /dev/null +++ b/code/game/objects/effects/chem_holder.dm @@ -0,0 +1,6 @@ +/obj/effect/chem_holder + atom_flags = ATOM_FLAG_OPEN_CONTAINER + +/obj/effect/chem_holder/Initialize(mapload, _vol) + chem_volume = _vol + . = ..() diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 3da636a2c505..6758e59d78c8 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -81,12 +81,12 @@ icon_state = "vomit_1" persistent = TRUE generic_filth = TRUE + chem_volume = 30 /obj/effect/decal/cleanable/vomit/Initialize(ml, _age) random_icon_states = icon_states(icon) - . = ..() atom_flags |= ATOM_FLAG_OPEN_CONTAINER - create_reagents(30, src) + . = ..() if(prob(75)) set_rotation(pick(90, 180, 270)) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 060c4864e227..d5bb28f18f47 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -5,16 +5,14 @@ w_class = ITEM_SIZE_SMALL _base_attack_force = 2.0 det_time = null + chem_volume = 1000 + var/stage = 0 var/path = 0 var/obj/item/assembly_holder/detonator = null var/list/beakers = new/list() var/list/allowed_containers = list(/obj/item/chems/glass/beaker, /obj/item/chems/glass/bottle) -/obj/item/grenade/chem_grenade/Initialize() - . = ..() - create_reagents(1000) - /obj/item/grenade/chem_grenade/Destroy() QDEL_NULL(detonator) QDEL_NULL_LIST(beakers) diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index a8b408d77a45..6c1ae805e1ca 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -27,6 +27,7 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC abstract_type = /obj/structure/fire_source throwpass = TRUE + chem_volume = 100 // Counter for world.time, used to reduce lighting spam. var/next_light_spam_guard = 0 @@ -75,7 +76,6 @@ /obj/structure/fire_source/Initialize() . = ..() update_icon() - create_reagents(100) steam = new(name) steam.attach(get_turf(src)) steam.set_up(3, 0, get_turf(src)) diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm index e95fa1df572b..e6dbe8176ab3 100644 --- a/code/game/objects/structures/iv_drip.dm +++ b/code/game/objects/structures/iv_drip.dm @@ -192,7 +192,7 @@ . += "The IV drip is [mode ? "injecting" : "taking blood"]." . += "It is set to transfer [transfer_amount]u of chemicals per cycle." if(beaker) - if(beaker.reagents && beaker.reagents.total_volume) + if(beaker.reagents?.total_volume) . += SPAN_NOTICE("Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else . += SPAN_NOTICE("Attached is an empty [beaker].") diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 5d67e910f7cb..7f01952bc4b6 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -7,23 +7,19 @@ density = TRUE atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_CLIMBABLE movable_flags = MOVABLE_FLAG_WHEELED + chem_volume = 180 + var/obj/item/bag/trash/mybag = null var/obj/item/mop/mymop = null var/obj/item/chems/spray/myspray = null var/obj/item/lightreplacer/myreplacer = null var/signs = 0 //maximum capacity hardcoded below - -/obj/structure/janitorialcart/Initialize() - . = ..() - create_reagents(180) - /obj/structure/janitorialcart/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) . += "\The [src] [html_icon(src)] contains [reagents.total_volume] unit\s of liquid!" - /obj/structure/janitorialcart/attackby(obj/item/used_item, mob/user) if(istype(used_item, /obj/item/bag/trash) && !mybag) if(!user.try_unequip(used_item, src)) @@ -191,6 +187,7 @@ density = TRUE material_alteration = MAT_FLAG_ALTERATION_NONE atom_flags = ATOM_FLAG_OPEN_CONTAINER + chem_volume = 100 movement_handlers = list( /datum/movement_handler/deny_multiz, /datum/movement_handler/delay = list(1), @@ -208,7 +205,6 @@ "[WEST]" = list("x" = 13, "y" = 7, "z" = 0) ) . = ..() - create_reagents(100) /obj/structure/janicart/get_examine_strings(mob/user, distance, infix, suffix) . = ..() diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 22eec93ece55..57cc6d0e03f6 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -6,11 +6,7 @@ density = TRUE w_class = ITEM_SIZE_NORMAL atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER - - -/obj/structure/mopbucket/Initialize() - . = ..() - create_reagents(180) + chem_volume = 180 /obj/structure/mopbucket/get_examine_strings(mob/user, distance, infix, suffix) . = ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1778979d9b52..76b4a59db265 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -248,6 +248,7 @@ var/global/list/hygiene_props = list() clogged = -1 can_drain = 1 drainage = 0.2 //showers are tiny, drain a little slower + chem_volume = 5 var/on = 0 var/next_mist = 0 @@ -259,11 +260,6 @@ var/global/list/hygiene_props = list() var/datum/sound_token/sound_token //add heat controls? when emagged, you can freeze to death in it? - -/obj/structure/hygiene/shower/Initialize() - . = ..() - create_reagents(5) - /obj/structure/hygiene/shower/Destroy() QDEL_NULL(sound_token) . = ..() diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index 48c6e74fc863..bb59234398df 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -106,18 +106,15 @@ ADD_ACTIVE_FLUID(src) /turf/get_reagents() - if(!reagents) - create_reagents(FLUID_MAX_DEPTH) + create_or_update_reagents(FLUID_MAX_DEPTH) return ..() /turf/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase = null) - if(!reagents) - create_reagents(FLUID_MAX_DEPTH) + create_or_update_reagents(FLUID_MAX_DEPTH) return ..() /turf/get_reagent_space() - if(!reagents) - create_reagents(FLUID_MAX_DEPTH) + create_or_update_reagents(FLUID_MAX_DEPTH) return ..() /turf/fluid_act(var/datum/reagents/fluids) @@ -146,8 +143,7 @@ // No flowing of reagents without liquids, but this proc should not be called if liquids are not present regardless. if(!reagents?.total_liquid_volume) return - if(!target.reagents) - target.create_reagents(FLUID_MAX_DEPTH) + target.create_or_update_reagents(FLUID_MAX_DEPTH) // We reference total_volume instead of total_liquid_volume here because the maximum volume limits of the turfs still respect solid volumes, and depth is still determined by total volume. reagents.trans_to_turf(target, min(reagents.total_volume, min(target.reagents.maximum_volume - target.reagents.total_volume, amount)), defer_update = defer_update) diff --git a/code/modules/crafting/pottery/pottery_moulds.dm b/code/modules/crafting/pottery/pottery_moulds.dm index a3cdb2d587e1..42339a40f1ae 100644 --- a/code/modules/crafting/pottery/pottery_moulds.dm +++ b/code/modules/crafting/pottery/pottery_moulds.dm @@ -44,11 +44,8 @@ required_volume += matter_for_product[mat] required_volume = ceil(required_volume * REAGENT_UNITS_PER_MATERIAL_UNIT) if(required_volume > 0) - if(reagents) - reagents.maximum_volume = required_volume - reagents.update_total() - else if(atom_flags & ATOM_FLAG_INITIALIZED) - create_reagents(required_volume) + if(atom_flags & ATOM_FLAG_INITIALIZED) + create_or_update_reagents(required_volume) else chem_volume = required_volume else diff --git a/code/modules/food/utensils/_utensil.dm b/code/modules/food/utensils/_utensil.dm index 856ecd502bfb..d04d06979d96 100644 --- a/code/modules/food/utensils/_utensil.dm +++ b/code/modules/food/utensils/_utensil.dm @@ -12,13 +12,14 @@ /obj/item/utensil - abstract_type = /obj/item/utensil - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_SMALL - origin_tech = @'{"materials":1}' - attack_verb = list("attacked", "stabbed", "poked") - material = /decl/material/solid/metal/aluminium - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + abstract_type = /obj/item/utensil + icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_SMALL + origin_tech = @'{"materials":1}' + attack_verb = list("attacked", "stabbed", "poked") + material = /decl/material/solid/metal/aluminium + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + chem_volume = 5 var/obj/item/food/loaded_food var/utensil_flags @@ -32,7 +33,6 @@ if (prob(60)) default_pixel_y = rand(0, 4) reset_offsets(0) - create_reagents(5) set_extension(src, /datum/extension/tool/variable/simple, list( TOOL_RETRACTOR = TOOL_QUALITY_BAD, TOOL_HEMOSTAT = TOOL_QUALITY_MEDIOCRE diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 402232bc89d0..eebf86d0ccb9 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -285,15 +285,9 @@ var/global/list/_wood_materials = list( return TRUE var/obj/item/clothing/mask/smokable/cigarette/rolled/R = new(get_turf(src)) - R.chem_volume = max(R.reagents?.maximum_volume, reagents?.total_volume) - if(R.reagents) - R.reagents.maximum_volume = R.chem_volume - R.reagents.update_total() - else - R.create_reagents(R.chem_volume) - + R.create_or_update_reagents(max(R.reagents?.maximum_volume, reagents?.total_volume)) R.brand = "[src] handrolled in \the [used_item]." - reagents.trans_to_holder(R.reagents, R.chem_volume) + reagents.trans_to_holder(R.reagents, R.reagents.total_volume) to_chat(user, SPAN_NOTICE("You roll \the [src] into \the [used_item].")) user.put_in_active_hand(R) qdel(used_item) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 5108dff2b679..a4000ce56bba 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -10,6 +10,7 @@ uncreated_component_parts = null stat_immune = 0 atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_NO_CHEM_CHANGE + chem_volume = 200 var/mechanical = 1 // Set to 0 to stop it from drawing the alert lights. var/base_name = "tray" @@ -38,7 +39,8 @@ var/lastproduce = 0 // Last time tray was harvested var/closed_system // If set, the tray will attempt to take atmos from a pipe. var/force_update // Set this to bypass the cycle time check. - var/obj/temp_chem_holder // Something to hold reagents during process_reagents() + /// Something to hold reagents during process_reagents() + var/obj/effect/chem_holder/temp_chem_holder // Counter used by bees. var/pollen = 0 @@ -164,10 +166,7 @@ if(!mechanical) construct_state = /decl/machine_construction/noninteractive . = ..() - temp_chem_holder = new() - temp_chem_holder.create_reagents(10) - temp_chem_holder.atom_flags |= ATOM_FLAG_OPEN_CONTAINER - create_reagents(200) + temp_chem_holder = new(null, 10) if(mechanical) connect() update_icon() diff --git a/code/modules/implants/implant_types/chem.dm b/code/modules/implants/implant_types/chem.dm index b78de9f03523..b00656a0cbf6 100644 --- a/code/modules/implants/implant_types/chem.dm +++ b/code/modules/implants/implant_types/chem.dm @@ -5,6 +5,7 @@ var/global/list/chem_implants = list() desc = "Injects things." origin_tech = @'{"materials":1,"biotech":2}' known = TRUE + chem_volume = 50 /obj/item/implant/chem/get_data() return {" @@ -26,7 +27,6 @@ var/global/list/chem_implants = list() /obj/item/implant/chem/Initialize() . = ..() global.chem_implants += src - create_reagents(50) /obj/item/implant/chem/Destroy() . = ..() diff --git a/code/modules/mining/machinery/material_extractor.dm b/code/modules/mining/machinery/material_extractor.dm index 809c4af4ac04..6b19126688c1 100644 --- a/code/modules/mining/machinery/material_extractor.dm +++ b/code/modules/mining/machinery/material_extractor.dm @@ -17,15 +17,15 @@ var/dispense_amount = 50 // Since reactions and heating products may overfill the reagent tank, the reagent tank has 1.25x this volume. - var/static/max_liquid = 3000 + var/const/MAX_LIQUID = 3000 /obj/machinery/material_processing/extractor/Initialize() + chem_volume = round(MAX_LIQUID * 1.25) . = ..() if(!gas_contents) gas_contents = new(800) set_extension(src, /datum/extension/atmospherics_connection, FALSE, gas_contents) - create_reagents(round(1.25*max_liquid)) queue_temperature_atoms(src) return INITIALIZE_HINT_LATELOAD @@ -70,7 +70,7 @@ if(!use_power || (stat & (BROKEN|NOPOWER))) return - if(reagents?.total_volume >= max_liquid) + if(reagents?.total_volume >= MAX_LIQUID) return if(input_turf) @@ -245,7 +245,7 @@ var/is_liquid = reagent.phase_at_temperature(temperature, ONE_ATMOSPHERE) == MAT_PHASE_LIQUID data["reagents"] += list(list("label" = "[reagent.liquid_name] ([reagents.reagent_volumes[reagent]] U)", "index" = index, "liquid" = is_liquid)) - data["full"] = reagents.total_volume >= max_liquid + data["full"] = reagents.total_volume >= MAX_LIQUID data["gas_pressure"] = gas_contents?.return_pressure() return data diff --git a/code/modules/mining/machinery/material_smelter.dm b/code/modules/mining/machinery/material_smelter.dm index 43cd4b1cf63a..b5f609877800 100644 --- a/code/modules/mining/machinery/material_smelter.dm +++ b/code/modules/mining/machinery/material_smelter.dm @@ -5,6 +5,8 @@ icon_state = "furnace" use_ui_template = "material_processing_smeltery.tmpl" atom_flags = ATOM_FLAG_CLIMBABLE | ATOM_FLAG_OPEN_CONTAINER + chem_volume = INFINITY + var/show_all_materials = FALSE var/list/casting var/static/list/always_show_materials = list( @@ -21,7 +23,6 @@ /obj/machinery/material_processing/smeltery/Initialize() show_materials = always_show_materials.Copy() . = ..() - create_reagents(INFINITY) queue_temperature_atoms(src) // Update displayed materials diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index 874941029beb..6b30fafc0e25 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -33,7 +33,6 @@ var/turf/T = get_turf(src) var/obj/effect/effect/water/chempuff/chem = new(T) - chem.create_reagents(10) chem.add_to_reagents(/decl/material/liquid/zombie, 2) chem.set_up(get_step(T, dir), 2, 10) playsound(T, 'sound/hallucinations/wail.ogg', 20, 1) diff --git a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm index a43672e98d20..e09c3548c825 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm @@ -62,7 +62,7 @@ /obj/item/robot_module/clerical/butler/finalize_emag() . = ..() if(emag) - var/datum/reagents/reagent = emag.create_reagents(50) + var/datum/reagents/reagent = emag.create_or_update_reagents(50) reagent.add_reagent(/decl/material/liquid/paralytics, 10) reagent.add_reagent(/decl/material/liquid/sedatives, 15) reagent.add_reagent(/decl/material/liquid/alcohol/beer, 20) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 0097a98ff0c0..7d2788d0ca3a 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -457,10 +457,7 @@ rad_power = 12 atom_flags = ATOM_FLAG_OPEN_CONTAINER anchored = TRUE - -/obj/machinery/port_gen/pacman/super/potato/Initialize() - create_reagents(120) - . = ..() + chem_volume = 120 /obj/machinery/port_gen/pacman/super/potato/get_examine_strings(mob/user, distance, infix, suffix) . = ..() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index accaa0b35218..a1e484aa57e4 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -905,8 +905,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new qdel(reagent) return - if(!target.reagents) - target.create_reagents(FLUID_MAX_DEPTH) + target.create_or_update_reagents(FLUID_MAX_DEPTH) . = trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) // Deferred updates are presumably being done by SSfluids. @@ -987,6 +986,16 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new reagents = new/datum/reagents(max_vol, src) return reagents +/atom/proc/create_or_update_reagents(_vol, override_volume) + if(reagents) + if(override_volume) + reagents.maximum_volume = _vol // should we remove excess reagents here? + else + reagents.maximum_volume = max(reagents.maximum_volume, _vol) + reagents.update_total() + return reagents + return create_reagents(_vol) + /// Infinite reagent sink: nothing is ever actually added to it, useful for complex, filtered deletion of reagents without holder churn. /datum/reagents/sink diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index e2cf9e4abe10..af6fa27d09f8 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -17,6 +17,7 @@ base_type = /obj/machinery/chem_master atom_flags = ATOM_FLAG_OPEN_CONTAINER core_skill = SKILL_CHEMISTRY + chem_volume = 120 var/obj/item/chems/beaker = null var/obj/item/pill_bottle/loaded_pill_bottle = null @@ -27,16 +28,11 @@ var/list/client/has_sprites = list() var/max_pill_count = 20 var/sloppy = 1 //Whether reagents will not be fully purified (sloppy = 1) or there will be reagent loss (sloppy = 0) on reagent add. - var/reagent_limit = 120 var/bottle_label_color = COLOR_WHITE var/bottle_lid_color = COLOR_OFF_WHITE -/obj/machinery/chem_master/Initialize() - . = ..() - create_reagents(reagent_limit) - /obj/machinery/chem_master/proc/get_remaining_volume() - return clamp(reagent_limit - reagents.total_volume, 0, reagent_limit) + return reagents ? clamp(reagents.maximum_volume - reagents.total_volume, 0, reagents.maximum_volume) : 0 /obj/machinery/chem_master/attackby(var/obj/item/used_item, var/mob/user) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index 872653d4804e..96dbb3859411 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -9,11 +9,14 @@ material = /decl/material/solid/stone/ceramic // Large, but inaccurate. Use a chem dispenser or beaker for accuracy. possible_transfer_amounts = @"[50,100]" + var/_reagent_label /obj/item/chems/chem_disp_cartridge/Initialize() . = ..() - if(reagents?.primary_reagent) - setLabel(reagents.get_primary_reagent_name()) + if(reagents?.primary_reagent && !_reagent_label) + _reagent_label = reagents.get_primary_reagent_name() + if(_reagent_label) + setLabel(_reagent_label) /obj/item/chems/chem_disp_cartridge/get_examine_strings(mob/user, distance, infix, suffix) . = ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index e0406f96dd66..3353a13f981f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -115,8 +115,8 @@ V.update_icon() loaded_vial = V - reagents.maximum_volume = loaded_vial.reagents.maximum_volume - loaded_vial.reagents.trans_to_holder(reagents, chem_volume) + create_or_update_reagents(loaded_vial.reagents.maximum_volume, override_volume = TRUE) + loaded_vial.reagents.trans_to_holder(reagents, reagents.maximum_volume) if(user) user.visible_message(SPAN_NOTICE("[user] has loaded [V] into \the [src]."), SPAN_NOTICE("[usermessage]")) @@ -128,7 +128,7 @@ /obj/item/chems/hypospray/vial/proc/remove_vial(var/mob/user, var/swap_mode, var/should_update_icon = TRUE) if(!loaded_vial) return - reagents.trans_to_holder(loaded_vial.reagents,chem_volume) + reagents.trans_to_holder(loaded_vial.reagents, reagents.maximum_volume) reagents.maximum_volume = 0 loaded_vial.update_icon() if(user) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 427175a7493e..390eff88e405 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -73,7 +73,6 @@ set waitfor = FALSE var/obj/effect/effect/water/chempuff/D = new(get_turf(src)) - D.create_reagents(amount_per_transfer_from_this) if(QDELETED(src)) return reagents.trans_to_obj(D, amount_per_transfer_from_this) diff --git a/code/modules/scanners/mass_spectrometer.dm b/code/modules/scanners/mass_spectrometer.dm index 7e186c85abfe..b1b194944993 100644 --- a/code/modules/scanners/mass_spectrometer.dm +++ b/code/modules/scanners/mass_spectrometer.dm @@ -7,12 +7,9 @@ window_width = 550 window_height = 300 scan_sound = 'sound/effects/scanbeep.ogg' + chem_volume = 5 var/details = 0 -/obj/item/scanner/spectrometer/Initialize() - . = ..() - create_reagents(5) - /obj/item/scanner/spectrometer/on_reagent_change() if((. = ..())) update_icon() diff --git a/code/modules/sealant_gun/sealant_tank.dm b/code/modules/sealant_gun/sealant_tank.dm index 890b4746992b..05244c89b98e 100644 --- a/code/modules/sealant_gun/sealant_tank.dm +++ b/code/modules/sealant_gun/sealant_tank.dm @@ -17,8 +17,8 @@ . += SPAN_NOTICE("\The [src] has about [foam_charges] liter\s of sealant left.") /obj/item/sealant_tank/Initialize(ml, material_key) + chem_volume = max_foam_charges . = ..() - create_reagents(max_foam_charges) /obj/item/sealant_tank/mapped/Initialize() . = ..() diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index db7e0dfb8e42..423db9ca032e 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -79,6 +79,7 @@ icon_state = "engine_fuel" trail_type = /datum/effect/effect/system/trail/thermal atom_flags = ATOM_FLAG_OPEN_CONTAINER + chem_volume = 500 var/datum/reagents/combustion_chamber var/fuel_points = 0 //fuel points are determined by differing reagents @@ -88,7 +89,6 @@ /obj/item/engine/thermal/Initialize() . = ..() - create_reagents(500) combustion_chamber = new(15, global.temp_reagents_holder) /obj/item/engine/thermal/attackby(var/obj/item/used_item, var/mob/user) diff --git a/code/modules/xenoarcheaology/machinery/geosample_scanner.dm b/code/modules/xenoarcheaology/machinery/geosample_scanner.dm index 486a5eb5ea83..28ec8b72504c 100644 --- a/code/modules/xenoarcheaology/machinery/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/machinery/geosample_scanner.dm @@ -12,6 +12,7 @@ uncreated_component_parts = null maximum_component_parts = list(/obj/item/stock_parts = 15) stat_immune = 0 + chem_volume = 500 //var/obj/item/chems/glass/coolant_container var/scanning = 0 @@ -52,10 +53,6 @@ /decl/material/liquid/adminordrazine = 2 ) -/obj/machinery/radiocarbon_spectrometer/Initialize() - . = ..() - create_reagents(500) - /obj/machinery/radiocarbon_spectrometer/interface_interact(var/mob/user) ui_interact(user) return TRUE diff --git a/code/unit_tests/chemistry_tests.dm b/code/unit_tests/chemistry_tests.dm index cdc9dae00d42..666048b0a0b4 100644 --- a/code/unit_tests/chemistry_tests.dm +++ b/code/unit_tests/chemistry_tests.dm @@ -11,7 +11,7 @@ var/turf/test_loc = get_safe_turf() var/atom/from = new donor_type(test_loc) - from.create_reagents(container_volume) + from.create_or_update_reagents(container_volume) from.add_to_reagents(/decl/material/liquid/water, container_volume) var/atom/target @@ -22,7 +22,7 @@ else target = new recipient_type(test_loc) if(!target.reagents) - target.create_reagents(container_volume) + target.create_or_update_reagents(container_volume) if(ismob(target)) var/mob/victim = target victim.death() // to prevent reagent processing diff --git a/code/unit_tests/food_tests.dm b/code/unit_tests/food_tests.dm index 44fc77c01f66..fc8affd9b6e1 100644 --- a/code/unit_tests/food_tests.dm +++ b/code/unit_tests/food_tests.dm @@ -63,8 +63,7 @@ seeds_by_tag[seed.grown_tag] = seed_name var/failures = list() - var/obj/container = new // dummy container for holding ingredients - container.create_reagents(1000) + var/obj/effect/chem_holder/container = new(null, 1000) // dummy container for holding ingredients var/static/list/all_recipe_categories = list( RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_POT, diff --git a/mods/content/integrated_electronics/components/power_passive.dm b/mods/content/integrated_electronics/components/power_passive.dm index f33dab219d4d..7a855c5a366d 100644 --- a/mods/content/integrated_electronics/components/power_passive.dm +++ b/mods/content/integrated_electronics/components/power_passive.dm @@ -95,7 +95,8 @@ outputs = list("volume used" = IC_PINTYPE_NUMBER, "self reference" = IC_PINTYPE_REF) activators = list("push ref" = IC_PINTYPE_PULSE_IN) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/volume = 60 + chem_volume = 60 + var/list/fuel = list( /decl/material/gas/hydrogen = 50000, /decl/material/gas/hydrogen/deuterium = 50000, @@ -109,7 +110,6 @@ /obj/item/integrated_circuit/passive/power/chemical_cell/Initialize() . = ..() - create_reagents(volume) extended_desc +="But no fuel can be compared with blood of living human." diff --git a/mods/content/integrated_electronics/components/reagents.dm b/mods/content/integrated_electronics/components/reagents.dm index a89077170c70..3cce58ca5c6a 100644 --- a/mods/content/integrated_electronics/components/reagents.dm +++ b/mods/content/integrated_electronics/components/reagents.dm @@ -115,7 +115,7 @@ else direction_mode = IC_REAGENTS_INJECT if(isnum(new_amount)) - new_amount = clamp(new_amount, 0, chem_volume) + new_amount = clamp(new_amount, 0, reagents.maximum_volume) transfer_amount = new_amount diff --git a/nebula.dme b/nebula.dme index 01ed6a26c97e..cd846616a915 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1017,6 +1017,7 @@ #include "code\game\objects\compass\compass_waypoint.dm" #include "code\game\objects\effects\_effect.dm" #include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\chem_holder.dm" #include "code\game\objects\effects\cig_smoke.dm" #include "code\game\objects\effects\dirty_floor.dm" #include "code\game\objects\effects\effect_system.dm" From deecd2e91d2c187e3511476c2d12a449fe6d5084 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sun, 2 Nov 2025 13:50:19 +1100 Subject: [PATCH 87/93] Addressing some changes requested on the chems PR. --- code/datums/extensions/milkable/milkable.dm | 4 ++-- code/game/objects/items/weapons/storage/fancy/cigar.dm | 3 ++- code/game/objects/structures/fires.dm | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/datums/extensions/milkable/milkable.dm b/code/datums/extensions/milkable/milkable.dm index caa797e18786..a377c2293ce9 100644 --- a/code/datums/extensions/milkable/milkable.dm +++ b/code/datums/extensions/milkable/milkable.dm @@ -85,7 +85,7 @@ to_chat(user, SPAN_WARNING("Wait for \the [critter] to stop moving before you try milking it.")) return TRUE - if(container.reagents.total_volume >= container.reagents.maximum_volume) + if(REAGENTS_FREE_SPACE(container.reagents) <= 0) to_chat(user, SPAN_WARNING("\The [container] is full.")) return TRUE @@ -112,7 +112,7 @@ to_chat(user, SPAN_WARNING("\The [critter]'s udder is dry. Wait a little longer.")) return TRUE - if(container.reagents.total_volume >= container.reagents.maximum_volume) + if(REAGENTS_FREE_SPACE(container.reagents) <= 0) to_chat(user, SPAN_NOTICE("\The [container] is full.")) return TRUE diff --git a/code/game/objects/items/weapons/storage/fancy/cigar.dm b/code/game/objects/items/weapons/storage/fancy/cigar.dm index 5128bed573ae..a24b3da8a2b4 100644 --- a/code/game/objects/items/weapons/storage/fancy/cigar.dm +++ b/code/game/objects/items/weapons/storage/fancy/cigar.dm @@ -15,7 +15,8 @@ storage = /datum/storage/box/cigar /obj/item/box/fancy/cigar/Initialize(ml, material_key) - chem_volume = 10 * max(1, /datum/storage/box/cigar::storage_slots) + if(istype(storage)) + chem_volume = 10 * max(1, storage.storage_slots) . = ..() /obj/item/box/fancy/cigar/WillContain() diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index 6c1ae805e1ca..273c685709aa 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -374,12 +374,12 @@ if(reagent.accelerant_value <= FUEL_VALUE_SUPPRESSANT && reagent.phase_at_temperature(get_effective_burn_temperature(), ambient_pressure) == MAT_PHASE_GAS) do_steam = TRUE - var/result_volume = NONUNIT_CEILING(REAGENT_VOLUME(reagents, reagent) / REAGENT_UNITS_PER_GAS_MOLE, 0.1) - var/list/waste_products = burn_material(reagent, result_volume) + var/result_amount = NONUNIT_CEILING(REAGENT_VOLUME(reagents, reagent) / REAGENT_UNITS_PER_GAS_MOLE, 0.1) + var/list/waste_products = burn_material(reagent, result_amount) if(!isnull(waste_products)) for(var/product in waste_products) waste[product] += waste_products[product] - reagents.remove_reagent(reagent.type, result_volume) + reagents.remove_reagent(reagent.type, result_amount) dump_waste_products(loc, waste) From d1e4e2fa5954d0198b41b0248b0b3155cd894c66 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Tue, 4 Nov 2025 09:33:15 +1100 Subject: [PATCH 88/93] air_volume -> total_volume, gas_volume --- code/game/machinery/alarm.dm | 2 +- code/game/machinery/atmoalter/canister.dm | 10 +++---- .../atmoalter/portable_atmospherics.dm | 6 ++-- code/game/machinery/atmoalter/pump.dm | 6 ++-- code/game/machinery/atmoalter/scrubber.dm | 6 ++-- code/game/machinery/cracker.dm | 2 +- code/game/objects/items/devices/oxycandle.dm | 8 ++--- .../objects/items/devices/transfer_valve.dm | 6 ++-- code/game/objects/items/rescuebag.dm | 2 +- .../objects/items/weapons/tanks/tank_types.dm | 12 ++++---- .../game/objects/items/weapons/tanks/tanks.dm | 12 ++++---- code/modules/ZAS/Fire.dm | 12 ++++---- code/modules/ZAS/Zone.dm | 6 ++-- code/modules/admin/verbs/debug.dm | 2 +- code/modules/atmospherics/atmos_primitives.dm | 28 ++++++++--------- .../binary_devices/binary_atmos_base.dm | 4 +-- .../components/binary_devices/circulator.dm | 8 ++--- .../binary_devices/oxyregenerator.dm | 2 +- .../components/binary_devices/passive_gate.dm | 16 +++++----- .../components/binary_devices/pipeturbine.dm | 10 +++---- .../components/binary_devices/pump.dm | 10 +++---- .../components/omni_devices/_omni_extras.dm | 2 +- .../components/omni_devices/filter.dm | 10 +++---- .../components/omni_devices/mixer.dm | 8 ++--- .../trinary_devices/trinary_base.dm | 6 ++-- .../components/unary/cold_sink.dm | 2 +- .../components/unary/heat_source.dm | 2 +- .../components/unary/outlet_injector.dm | 6 ++-- .../atmospherics/components/unary/tank.dm | 6 ++-- .../components/unary/unary_base.dm | 2 +- .../components/unary/vent_pump.dm | 8 ++--- .../components/unary/vent_scrubber.dm | 8 ++--- .../atmospherics/datum_pipe_network.dm | 6 ++-- code/modules/atmospherics/datum_pipeline.dm | 22 +++++++------- code/modules/atmospherics/he_pipes.dm | 2 +- code/modules/atmospherics/pipes.dm | 12 ++++---- code/modules/hydroponics/trays/tray.dm | 2 +- code/modules/mechs/components/body.dm | 6 ++-- code/modules/mob/living/human/life.dm | 2 +- code/modules/mob/living/living_breath.dm | 2 +- code/modules/multiz/pipes.dm | 2 +- code/modules/organs/internal/lungs.dm | 2 +- .../ships/device_types/gas_thruster.dm | 6 ++-- code/modules/power/stirling.dm | 2 +- .../projectiles/guns/launcher/pneumatic.dm | 2 +- .../reagents/reagent_containers/borghypo.dm | 2 +- code/modules/recycling/disposal.dm | 2 +- code/modules/scanners/gas.dm | 2 +- code/modules/xgm/xgm_gas_mixture.dm | 30 +++++++++---------- .../lost_supply_base/lost_supply_base.dmm | 2 +- maps/away/unishi/unishi-1.dmm | 2 +- maps/exodus/exodus-2.dmm | 4 +-- .../components/input.dm | 2 +- mods/content/plant_dissection/grown.dm | 2 +- mods/species/ascent/items/rig.dm | 2 +- 55 files changed, 174 insertions(+), 174 deletions(-) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 884b99b45fd0..1770f09178cc 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -272,7 +272,7 @@ environment.merge(gas) /obj/machinery/alarm/proc/overall_danger_level(var/datum/gas_mixture/environment) - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.air_volume + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.total_volume var/environment_pressure = environment.return_pressure() var/other_moles = 0 diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index b5b96c98756a..bb0801f80b5b 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -9,7 +9,7 @@ construct_state = /decl/machine_construction/pipe/welder stat_immune = NOSCREEN | NOINPUT | NOPOWER start_pressure = 45 ATM - air_volume = 1000 + gas_volume = 1000 interact_offline = TRUE matter = list( /decl/material/solid/metal/steel = 10 * SHEET_MATERIAL_AMOUNT @@ -195,7 +195,7 @@ EMPTY_CANISTER(hydrogen, /obj/machinery/portable_atmospherics/canister/hydrogen) if((air_contents.temperature > 0) && (pressure_delta > 0)) var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) - transfer_moles = min(transfer_moles, (release_flow_rate/air_contents.air_volume)*air_contents.total_moles) //flow rate limit + transfer_moles = min(transfer_moles, (release_flow_rate/air_contents.total_volume)*air_contents.total_moles) //flow rate limit pump_gas_passive(src, air_contents, environment, transfer_moles) can_label = (air_contents?.return_pressure() < 1) @@ -207,13 +207,13 @@ EMPTY_CANISTER(hydrogen, /obj/machinery/portable_atmospherics/canister/hydrogen) /obj/machinery/portable_atmospherics/canister/proc/return_temperature() var/datum/gas_mixture/GM = return_air() - if(GM && GM.air_volume>0) + if(GM?.total_volume>0) return GM.temperature return 0 /obj/machinery/portable_atmospherics/canister/proc/return_pressure() var/datum/gas_mixture/GM = return_air() - if(GM && GM.air_volume>0) + if(GM?.total_volume>0) return GM.return_pressure() return 0 @@ -241,7 +241,7 @@ EMPTY_CANISTER(hydrogen, /obj/machinery/portable_atmospherics/canister/hydrogen) //Can not have a pressure delta that would cause environment pressure > tank pressure var/transfer_moles = 0 if((air_contents.temperature > 0) && (pressure_delta > 0)) - transfer_moles = pressure_delta*thejetpack.air_volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas + transfer_moles = pressure_delta*thejetpack.total_volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) thejetpack.merge(removed) to_chat(user, "You pulse-pressurize your jetpack from the tank.") diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 5ef82168e9d9..3de7c00f4368 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -6,7 +6,7 @@ var/datum/gas_mixture/air_contents = new var/obj/item/tank/holding - var/air_volume = 0 + var/gas_volume = 0 var/destroyed = 0 var/start_pressure = ONE_ATMOSPHERE @@ -19,7 +19,7 @@ /obj/machinery/portable_atmospherics/Initialize() ..() - air_contents.air_volume = air_volume + air_contents.total_volume = gas_volume air_contents.temperature = T20C @@ -52,7 +52,7 @@ /decl/material/gas/nitrogen = N2STANDARD * MolesForPressure()) /obj/machinery/portable_atmospherics/proc/MolesForPressure(var/target_pressure = start_pressure) - return (target_pressure * air_contents.air_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + return (target_pressure * air_contents.total_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) /obj/machinery/portable_atmospherics/on_update_icon() return null diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 4febead3e39b..492f0b0c26f5 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -15,7 +15,7 @@ var/pressuremin = 0 var/pressuremax = 10 ATM - air_volume = 1000 + gas_volume = 1000 power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 @@ -76,11 +76,11 @@ var/air_temperature if(direction_out) pressure_delta = target_pressure - environment.return_pressure() - output_volume = environment.air_volume * environment.group_multiplier + output_volume = environment.total_volume * environment.group_multiplier air_temperature = environment.temperature? environment.temperature : air_contents.temperature else pressure_delta = environment.return_pressure() - target_pressure - output_volume = air_contents.air_volume * air_contents.group_multiplier + output_volume = air_contents.total_volume * air_contents.group_multiplier air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 0d93d05998fd..b6989e112bdd 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -10,7 +10,7 @@ movable_flags = MOVABLE_FLAG_WHEELED var/volume_rate = 800 - air_volume = 750 + gas_volume = 750 power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 @@ -67,7 +67,7 @@ else environment = loc.return_air() - var/transfer_moles = min(1, volume_rate/environment.air_volume)*environment.total_moles + var/transfer_moles = min(1, volume_rate/environment.total_volume)*environment.total_moles power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating) @@ -151,7 +151,7 @@ name = "huge air scrubber" icon_state = "scrubber:0" anchored = TRUE - air_volume = 50000 + gas_volume = 50000 volume_rate = 5000 base_type = /obj/machinery/portable_atmospherics/powered/scrubber/huge diff --git a/code/game/machinery/cracker.dm b/code/game/machinery/cracker.dm index a8287bd5038c..2de58f1e211c 100644 --- a/code/game/machinery/cracker.dm +++ b/code/game/machinery/cracker.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE waterproof = TRUE - air_volume = 5000 + gas_volume = 5000 use_power = POWER_USE_IDLE idle_power_usage = 100 active_power_usage = 10000 diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm index bed530e8b26e..719223e6ec8f 100644 --- a/code/game/objects/items/devices/oxycandle.dm +++ b/code/game/objects/items/devices/oxycandle.dm @@ -33,10 +33,10 @@ update_icon() playsound(src.loc, activation_sound, 75, 1) air_contents = new /datum/gas_mixture() - air_contents.air_volume = 200 //liters + air_contents.total_volume = 200 //liters air_contents.temperature = T20C var/const/OXYGEN_FRACTION = 1 // separating out the constant so it's clearer why it exists and how to modify it later - air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.air_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.total_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) START_PROCESSING(SSprocessing, src) // Process of Oxygen candles releasing air. Makes 200 volume of oxygen @@ -56,7 +56,7 @@ pos.hotspot_expose(1500, 5) var/datum/gas_mixture/environment = loc.return_air() var/pressure_delta = target_pressure - environment.return_pressure() - var/output_volume = environment.air_volume * environment.group_multiplier + var/output_volume = environment.total_volume * environment.group_multiplier var/air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) @@ -65,7 +65,7 @@ environment.merge(removed) candle_volume -= 200 var/const/OXYGEN_FRACTION = 1 // separating out the constant so it's clearer why it exists and how to modify it later - air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.air_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(/decl/material/gas/oxygen, OXYGEN_FRACTION * (target_pressure * air_contents.total_volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) /obj/item/oxycandle/on_update_icon() . = ..() diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 6d007fa27283..31aaf31b8044 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -175,7 +175,7 @@ /obj/item/transfer_valve/proc/merge_gases() if(valve_open) return - tank_two.air_contents.air_volume += tank_one.air_contents.air_volume + tank_two.air_contents.total_volume += tank_one.air_contents.total_volume var/datum/gas_mixture/temp = tank_one.remove_air_ratio(1) tank_two.assume_air(temp) valve_open = 1 @@ -189,9 +189,9 @@ if(QDELETED(tank_one) || QDELETED(tank_two)) return - var/ratio1 = tank_one.air_contents.air_volume/tank_two.air_contents.air_volume + var/ratio1 = tank_one.air_contents.total_volume/tank_two.air_contents.total_volume var/datum/gas_mixture/temp = tank_two.remove_air_ratio(ratio1) - tank_two.air_contents.air_volume -= tank_one.air_contents.air_volume + tank_two.air_contents.total_volume -= tank_one.air_contents.total_volume tank_one.assume_air(temp) /* diff --git a/code/game/objects/items/rescuebag.dm b/code/game/objects/items/rescuebag.dm index 565d538eef84..e4c56dafd6bb 100644 --- a/code/game/objects/items/rescuebag.dm +++ b/code/game/objects/items/rescuebag.dm @@ -70,7 +70,7 @@ /obj/structure/closet/body_bag/rescue/Initialize() . = ..() atmo = new() - atmo.air_volume = 0.1*CELL_VOLUME + atmo.total_volume = 0.1*CELL_VOLUME START_PROCESSING(SSobj, src) /obj/structure/closet/body_bag/rescue/Destroy() diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 2792f2dca8a2..13c9162b87f9 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -16,7 +16,7 @@ icon = 'icons/obj/items/tanks/tank_blue.dmi' distribute_pressure = ONE_ATMOSPHERE*O2STANDARD starting_pressure = list(/decl/material/gas/oxygen = 6 ATM) - air_volume = 180 + gas_volume = 180 /obj/item/tank/oxygen/yellow desc = "A tank of oxygen. This one is yellow." @@ -37,7 +37,7 @@ desc = "Mixed anyone?" icon = 'icons/obj/items/tanks/tank_blue.dmi' starting_pressure = list(/decl/material/gas/oxygen = (6 ATM) * O2STANDARD, /decl/material/gas/nitrogen = (6 ATM) * N2STANDARD) - air_volume = 180 + gas_volume = 180 /* * Hydrogen @@ -69,7 +69,7 @@ attack_cooldown = DEFAULT_WEAPON_COOLDOWN melee_accuracy_bonus = -10 distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - air_volume = 40 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) + gas_volume = 40 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) /obj/item/tank/emergency/oxygen name = "emergency oxygen tank" @@ -81,13 +81,13 @@ /obj/item/tank/emergency/oxygen/engi name = "extended-capacity emergency oxygen tank" icon = 'icons/obj/items/tanks/tank_emergency_engineer.dmi' - air_volume = 60 + gas_volume = 60 /obj/item/tank/emergency/oxygen/double name = "double emergency oxygen tank" icon = 'icons/obj/items/tanks/tank_emergency_double.dmi' gauge_icon = "indicator_emergency_double" - air_volume = 90 + gas_volume = 90 w_class = ITEM_SIZE_NORMAL /obj/item/tank/emergency/oxygen/double/red //firefighting tank, fits on belt, back or suitslot @@ -105,4 +105,4 @@ icon = 'icons/obj/items/tanks/tank_red.dmi' distribute_pressure = ONE_ATMOSPHERE*O2STANDARD starting_pressure = list(/decl/material/gas/nitrogen = 10 ATM) - air_volume = 180 \ No newline at end of file + gas_volume = 180 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index fa7a80942993..9af831affc7d 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -42,7 +42,7 @@ var/global/list/global/tank_gauge_cache = list() var/maxintegrity = 20 var/valve_welded = 0 var/obj/item/tankassemblyproxy/proxyassembly - var/air_volume = 70 + var/gas_volume = 70 //Used by _onclick/hud/screen_objects.dm internals to determine if someone has messed with our tank or not. //If they have and we haven't scanned it with the PDA or gas analyzer then we might just breath whatever they put in it. var/manipulated_by = null @@ -56,9 +56,9 @@ var/global/list/global/tank_gauge_cache = list() proxyassembly = new /obj/item/tankassemblyproxy(src) proxyassembly.tank = src - air_contents = new /datum/gas_mixture(air_volume, T20C) + air_contents = new /datum/gas_mixture(gas_volume, T20C) for(var/gas in starting_pressure) - air_contents.adjust_gas(gas, starting_pressure[gas]*air_volume/(R_IDEAL_GAS_EQUATION*T20C), 0) + air_contents.adjust_gas(gas, starting_pressure[gas]*gas_volume/(R_IDEAL_GAS_EQUATION*T20C), 0) air_contents.update_values() START_PROCESSING(SSobj, src) @@ -366,7 +366,7 @@ var/global/list/global/tank_gauge_cache = list() var/datum/gas_mixture/removed = remove_air(distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature)) if(removed) - removed.air_volume = volume_to_return + removed.total_volume = volume_to_return return removed /obj/item/tank/Process() @@ -418,7 +418,7 @@ var/global/list/global/tank_gauge_cache = list() pressure = air_contents.return_pressure() var/strength = ((pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE) - var/mult = ((air_contents.air_volume/140)**(1/2)) * (air_contents.total_moles**2/3)/((29*0.64) **2/3) //tanks appear to be experiencing a reduction on scale of about 0.64 total moles + var/mult = ((air_contents.total_volume/140)**(1/2)) * (air_contents.total_moles**2/3)/((29*0.64) **2/3) //tanks appear to be experiencing a reduction on scale of about 0.64 total moles //tanks appear to be experiencing a reduction on scale of about 0.64 total moles var/turf/T = get_turf(src) @@ -514,7 +514,7 @@ var/global/list/global/tank_gauge_cache = list() desc = initial(tank_copy.desc) icon = initial(tank_copy.icon) icon_state = initial(tank_copy.icon_state) - air_volume = initial(tank_copy.air_volume) + gas_volume = initial(tank_copy.gas_volume) // Set up explosive mix. air_contents.gas[DEFAULT_GAS_ACCELERANT] = 4 + rand(4) diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index fe5c981c7890..8e68d92a22f9 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -112,15 +112,15 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin for(var/mob/living/L in loc) L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs! - loc.fire_act(air_contents, air_contents.temperature, air_contents.air_volume) + loc.fire_act(air_contents, air_contents.temperature, air_contents.total_volume) for(var/atom/A in loc) - A.fire_act(air_contents, air_contents.temperature, air_contents.air_volume) + A.fire_act(air_contents, air_contents.temperature, air_contents.total_volume) // prioritize nearby fuel overlays first for(var/direction in global.cardinal) var/turf/enemy_tile = get_step(my_tile, direction) if(istype(enemy_tile) && enemy_tile.reagents) - enemy_tile.hotspot_expose(air_contents.temperature, air_contents.air_volume) + enemy_tile.hotspot_expose(air_contents.temperature, air_contents.total_volume) //spread for(var/direction in global.cardinal) @@ -141,7 +141,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin enemy_tile.create_fire(firelevel) else - enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.air_volume) + enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.total_volume) animate(src, color = fire_color(air_contents.temperature), 5) set_light(l_color = color) @@ -209,8 +209,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).) - var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, air_volume*group_multiplier) / vsc.fire_firelevel_multiplier - var/min_burn = 0.30*air_volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast + var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit, total_volume*group_multiplier) / vsc.fire_firelevel_multiplier + var/min_burn = 0.30*total_volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast var/total_reaction_progress = min(max(min_burn, firelevel*total_fuel)*FIRE_GAS_BURNRATE_MULT, total_fuel) var/used_fuel = min(total_reaction_progress, reaction_limit) var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) diff --git a/code/modules/ZAS/Zone.dm b/code/modules/ZAS/Zone.dm index c62020538391..cac84cb69bf5 100644 --- a/code/modules/ZAS/Zone.dm +++ b/code/modules/ZAS/Zone.dm @@ -57,7 +57,7 @@ Class Procs: SSair.add_zone(src) air.temperature = TCMB air.group_multiplier = 1 - air.air_volume = CELL_VOLUME + air.total_volume = CELL_VOLUME /zone/proc/add(turf/T) #ifdef ZASDBG @@ -136,7 +136,7 @@ Class Procs: CHECK_TICK /zone/proc/add_tile_air(datum/gas_mixture/tile_air) - //air.air_volume += CELL_VOLUME + //air.total_volume += CELL_VOLUME air.group_multiplier = 1 air.multiply(contents.len) air.merge(tile_air) @@ -200,7 +200,7 @@ Class Procs: for(var/g in air.gas) var/decl/material/mat = GET_DECL(g) to_chat(M, "[capitalize(mat.gas_name)]: [air.gas[g]]") - to_chat(M, "P: [air.return_pressure()] kPa V: [air.air_volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") + to_chat(M, "P: [air.return_pressure()] kPa V: [air.total_volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") to_chat(M, "O2 per N2: [(air.gas[/decl/material/gas/nitrogen] ? air.gas[/decl/material/gas/oxygen]/air.gas[/decl/material/gas/nitrogen] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") to_chat(M, "Edges: [length(edges)]") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index a76b2b3ef42c..8ff55c421dea 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -17,7 +17,7 @@ t += "Temperature: [env.temperature]\n" t += "Pressure: [env.return_pressure()]kPa\n" for(var/g in env.gas) - t += "[g]: [env.gas[g]] / [env.gas[g] * R_IDEAL_GAS_EQUATION * env.temperature / env.air_volume]kPa\n" + t += "[g]: [env.gas[g]] / [env.gas[g] * R_IDEAL_GAS_EQUATION * env.temperature / env.total_volume]kPa\n" usr.show_message(t, 1) SSstatistics.add_field_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/atmospherics/atmos_primitives.dm b/code/modules/atmospherics/atmos_primitives.dm index d5f55ac7c74f..6a09490b3251 100644 --- a/code/modules/atmospherics/atmos_primitives.dm +++ b/code/modules/atmospherics/atmos_primitives.dm @@ -45,7 +45,7 @@ //Update flow rate meter if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + A.last_flow_rate = (transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here if (A.debug) A.visible_message("[A]: source entropy: [round(source.specific_entropy(), 0.01)] J/Kmol --> sink entropy: [round(sink.specific_entropy(), 0.01)] J/Kmol") @@ -55,7 +55,7 @@ if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + P.last_flow_rate = (transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(transfer_moles) if (!removed) //Just in case @@ -86,13 +86,13 @@ //Update flow rate meter if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + A.last_flow_rate = (transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here if (A.debug) A.visible_message("[A]: moles transferred = [transfer_moles] mol") if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + P.last_flow_rate = (transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(transfer_moles) if(!removed) //Just in case @@ -148,10 +148,10 @@ //Update flow rate var if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here var/power_draw = 0 for (var/g in filtering) @@ -217,10 +217,10 @@ //Update flow rate var if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(total_transfer_moles) if (!removed) //Just in case @@ -290,10 +290,10 @@ //Update Flow Rate var if (istype(M, /obj/machinery/atmospherics)) var/obj/machinery/atmospherics/A = M - A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + A.last_flow_rate = (total_transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here if (istype(M, /obj/machinery/portable_atmospherics)) var/obj/machinery/portable_atmospherics/P = M - P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.air_volume //group_multiplier gets divided out here + P.last_flow_rate = (total_transfer_moles/source.total_moles)*source.total_volume //group_multiplier gets divided out here var/datum/gas_mixture/removed = source.remove(total_transfer_moles) if (!removed) //Just in case @@ -350,7 +350,7 @@ source_specific_power[source] = calculate_specific_power(source, sink)*mix_ratio/ATMOS_FILTER_EFFICIENCY total_specific_power += source_specific_power[source] - total_input_volume += source.air_volume + total_input_volume += source.total_volume total_input_moles += source.total_moles if (total_mixing_moles < MINIMUM_MOLES_TO_FILTER) //if we cant transfer enough gas just stop to avoid further processing @@ -429,7 +429,7 @@ /proc/calculate_transfer_moles(datum/gas_mixture/source, datum/gas_mixture/sink, var/pressure_delta, var/sink_volume_mod=0) if(source.temperature == 0 || source.total_moles == 0) return 0 - var/output_volume = (sink.air_volume * sink.group_multiplier) + sink_volume_mod + var/output_volume = (sink.total_volume * sink.group_multiplier) + sink_volume_mod var/source_total_moles = source.total_moles * source.group_multiplier var/air_temperature = source.temperature @@ -448,8 +448,8 @@ if(source.temperature == 0) return 0 //Make the approximation that the sink temperature is unchanged after transferring gas - var/source_volume = source.air_volume * source.group_multiplier - var/sink_volume = sink.air_volume * sink.group_multiplier + var/source_volume = source.total_volume * source.group_multiplier + var/sink_volume = sink.total_volume * sink.group_multiplier var/source_pressure = source.return_pressure() var/sink_pressure = sink.return_pressure() diff --git a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm index a0323b68ecad..70ccb935f755 100644 --- a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm @@ -12,8 +12,8 @@ air1 = new air2 = new - air1.air_volume = 200 - air2.air_volume = 200 + air1.total_volume = 200 + air2.total_volume = 200 . = ..() /obj/machinery/atmospherics/binary/air_in_dir(direction) diff --git a/code/modules/atmospherics/components/binary_devices/circulator.dm b/code/modules/atmospherics/components/binary_devices/circulator.dm index 58964df51c3d..723d76e56c0d 100644 --- a/code/modules/atmospherics/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/components/binary_devices/circulator.dm @@ -31,7 +31,7 @@ /obj/machinery/atmospherics/binary/circulator/Initialize() . = ..() desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]." - air1.air_volume = 400 + air1.total_volume = 400 /obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air() var/datum/gas_mixture/removed @@ -45,11 +45,11 @@ if(air1.temperature > 0 && last_pressure_delta > 5) //Calculate necessary moles to transfer using PV = nRT - recent_moles_transferred = (last_pressure_delta*input.air_volume/(air1.temperature * R_IDEAL_GAS_EQUATION))/3 //uses the volume of the whole network, not just itself - volume_capacity_used = min( (last_pressure_delta*input.air_volume/3)/(input_starting_pressure*air1.air_volume) , 1) //how much of the gas in the input air volume is consumed + recent_moles_transferred = (last_pressure_delta*input.total_volume/(air1.temperature * R_IDEAL_GAS_EQUATION))/3 //uses the volume of the whole network, not just itself + volume_capacity_used = min( (last_pressure_delta*input.total_volume/3)/(input_starting_pressure*air1.total_volume) , 1) //how much of the gas in the input air volume is consumed //Calculate energy generated from kinetic turbine - stored_energy += 1/ADIABATIC_EXPONENT * min(last_pressure_delta * input.air_volume , input_starting_pressure*air1.air_volume) * (1 - volume_ratio**ADIABATIC_EXPONENT) * kinetic_efficiency + stored_energy += 1/ADIABATIC_EXPONENT * min(last_pressure_delta * input.total_volume , input_starting_pressure*air1.total_volume) * (1 - volume_ratio**ADIABATIC_EXPONENT) * kinetic_efficiency //Actually transfer the gas removed = air1.remove(recent_moles_transferred) diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm index 0b505490c25e..7061e5bab0e6 100644 --- a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -90,7 +90,7 @@ var/pressure_delta = target_pressure - air2.return_pressure() if (pressure_delta > 0.01 && inner_tank.temperature > 0) var/datum/pipe_network/output = network_in_dir(dir) - var/transfer_moles = calculate_transfer_moles(inner_tank, air2, pressure_delta, output?.air_volume) + var/transfer_moles = calculate_transfer_moles(inner_tank, air2, pressure_delta, output?.total_volume) power_draw = pump_gas(src, inner_tank, air2, transfer_moles, power_rating*power_setting) if (power_draw >= 0) last_power_draw = power_draw diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index 7573cd540fb1..e34784fb7ee1 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -52,8 +52,8 @@ /obj/machinery/atmospherics/binary/passive_gate/Initialize() . = ..() - air1.air_volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 - air2.air_volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 + air1.total_volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 + air2.total_volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 /obj/machinery/atmospherics/binary/passive_gate/on_update_icon() icon_state = (unlocked && flowing)? "on" : "off" @@ -87,7 +87,7 @@ flowing = 1 //flow rate limit - var/transfer_moles = (set_flow_rate/air1.air_volume)*air1.total_moles + var/transfer_moles = (set_flow_rate/air1.total_volume)*air1.total_moles //Figure out how much gas to transfer to meet the target pressure. switch (regulate_mode) @@ -95,7 +95,7 @@ transfer_moles = min(transfer_moles, air1.total_moles*(pressure_delta/input_starting_pressure)) if (REGULATE_OUTPUT) var/datum/pipe_network/output = network_in_dir(dir) - transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, output?.air_volume)) + transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, output?.total_volume)) //pump_gas() will return a negative number if no flow occurred returnval = pump_gas_passive(src, air1, air2, transfer_moles) @@ -174,11 +174,11 @@ set_flow_rate = 0 . = TOPIC_REFRESH if ("max") - set_flow_rate = air1.air_volume + set_flow_rate = air1.total_volume . = TOPIC_REFRESH if ("set") - var/new_flow_rate = input(user, "Enter new flow rate limit (0-[air1.air_volume]kPa)","Flow Rate Control",set_flow_rate) as num - set_flow_rate = clamp(new_flow_rate, 0, air1.air_volume) + var/new_flow_rate = input(user, "Enter new flow rate limit (0-[air1.total_volume]kPa)","Flow Rate Control",set_flow_rate) as num + set_flow_rate = clamp(new_flow_rate, 0, air1.total_volume) . = TOPIC_REFRESH /obj/machinery/atmospherics/binary/passive_gate/proc/toggle_unlocked() @@ -219,7 +219,7 @@ return machine.set_flow_rate /decl/public_access/public_variable/passive_gate_flow_rate/write_var(obj/machinery/atmospherics/binary/passive_gate/machine, new_value) - new_value = clamp(new_value, 0, machine.air1?.air_volume) + new_value = clamp(new_value, 0, machine.air1?.total_volume) . = ..() if(.) machine.set_flow_rate = new_value diff --git a/code/modules/atmospherics/components/binary_devices/pipeturbine.dm b/code/modules/atmospherics/components/binary_devices/pipeturbine.dm index 53022013e628..3891c252af87 100644 --- a/code/modules/atmospherics/components/binary_devices/pipeturbine.dm +++ b/code/modules/atmospherics/components/binary_devices/pipeturbine.dm @@ -21,9 +21,9 @@ /obj/machinery/atmospherics/pipeturbine/Initialize() . = ..() - air_in.air_volume = 200 - air_out.air_volume = 800 - volume_ratio = air_in.air_volume / (air_in.air_volume + air_out.air_volume) + air_in.total_volume = 200 + air_out.total_volume = 800 + volume_ratio = air_in.total_volume / (air_in.total_volume + air_out.total_volume) /obj/machinery/atmospherics/pipeturbine/get_initialize_directions() switch(dir) @@ -48,11 +48,11 @@ kin_energy *= 1 - kin_loss dP = max(air_in.return_pressure() - air_out.return_pressure(), 0) if(dP > 10) - kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.air_volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency + kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.total_volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency air_in.temperature *= volume_ratio**ADIABATIC_EXPONENT var/datum/gas_mixture/air_all = new - air_all.air_volume = air_in.air_volume + air_out.air_volume + air_all.total_volume = air_in.total_volume + air_out.total_volume air_all.merge(air_in.remove_ratio(1)) air_all.merge(air_out.remove_ratio(1)) diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index 60fca50ad150..27fe8910c85f 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -5,9 +5,9 @@ node1, air1, network1 correspond to input node2, air2, network2 correspond to output Thus, the two variables affect pump operation are set in New(): - air1.air_volume + air1.total_volume This is the volume of gas available to the pump that may be transfered to the output - air2.air_volume + air2.total_volume Higher quantities of this cause more air to be perfected later but overall network volume is also increased as this increases... */ @@ -61,8 +61,8 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/Initialize() . = ..() - air1.air_volume = ATMOS_DEFAULT_VOLUME_PUMP - air2.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + air1.total_volume = ATMOS_DEFAULT_VOLUME_PUMP + air2.total_volume = ATMOS_DEFAULT_VOLUME_PUMP /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" @@ -93,7 +93,7 @@ Thus, the two variables affect pump operation are set in New(): if(pressure_delta > 0.01 && air1.temperature > 0) //Figure out how much gas to transfer to meet the target pressure. var/datum/pipe_network/output = network_in_dir(dir) - var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, output?.air_volume) + var/transfer_moles = calculate_transfer_moles(air1, air2, pressure_delta, output?.total_volume) power_draw = pump_gas(src, air1, air2, transfer_moles, power_rating) if(transfer_moles > 0) diff --git a/code/modules/atmospherics/components/omni_devices/_omni_extras.dm b/code/modules/atmospherics/components/omni_devices/_omni_extras.dm index 44357fdc75df..9aeb0d2eb576 100644 --- a/code/modules/atmospherics/components/omni_devices/_omni_extras.dm +++ b/code/modules/atmospherics/components/omni_devices/_omni_extras.dm @@ -30,7 +30,7 @@ if(istype(M)) master = M air = new - air.air_volume = 200 + air.total_volume = 200 /datum/omni_port/Destroy() QDEL_NULL(network) diff --git a/code/modules/atmospherics/components/omni_devices/filter.dm b/code/modules/atmospherics/components/omni_devices/filter.dm index 198f93531b6d..64d99bb5140c 100644 --- a/code/modules/atmospherics/components/omni_devices/filter.dm +++ b/code/modules/atmospherics/components/omni_devices/filter.dm @@ -39,7 +39,7 @@ rebuild_filtering_list() for(var/datum/omni_port/P in ports) - P.air.air_volume = ATMOS_DEFAULT_VOLUME_FILTER + P.air.total_volume = ATMOS_DEFAULT_VOLUME_FILTER /obj/machinery/atmospherics/omni/filter/Destroy() input = null @@ -57,7 +57,7 @@ if(P in gas_filters) gas_filters -= P - P.air.air_volume = ATMOS_DEFAULT_VOLUME_FILTER + P.air.total_volume = ATMOS_DEFAULT_VOLUME_FILTER switch(P.mode) if(ATM_INPUT) input = P @@ -82,13 +82,13 @@ var/datum/gas_mixture/input_air = input.air // it's completely happy with them if they're in a loop though i.e. "P.air.return_pressure()"... *shrug* var/delta = clamp(0, (output_air ? (max_output_pressure - output_air.return_pressure()) : 0), max_output_pressure) - var/transfer_moles_max = calculate_transfer_moles(input_air, output_air, delta, (output && output.network && output.network.air_volume) ? output.network.air_volume : 0) + var/transfer_moles_max = calculate_transfer_moles(input_air, output_air, delta, (output && output.network && output.network.total_volume) ? output.network.total_volume : 0) for(var/datum/omni_port/filter_output in gas_filters) delta = clamp(0, (filter_output.air ? (max_output_pressure - filter_output.air.return_pressure()) : 0), max_output_pressure) - transfer_moles_max = min(transfer_moles_max, (calculate_transfer_moles(input_air, filter_output.air, delta, (filter_output && filter_output.network && filter_output.network.air_volume) ? filter_output.network.air_volume : 0))) + transfer_moles_max = min(transfer_moles_max, (calculate_transfer_moles(input_air, filter_output.air, delta, (filter_output && filter_output.network && filter_output.network.total_volume) ? filter_output.network.total_volume : 0))) //Figure out the amount of moles to transfer - var/transfer_moles = clamp(0, ((set_flow_rate/input_air.air_volume)*input_air.total_moles), transfer_moles_max) + var/transfer_moles = clamp(0, ((set_flow_rate/input_air.total_volume)*input_air.total_moles), transfer_moles_max) var/power_draw = -1 if (transfer_moles > MINIMUM_MOLES_TO_FILTER) diff --git a/code/modules/atmospherics/components/omni_devices/mixer.dm b/code/modules/atmospherics/components/omni_devices/mixer.dm index 053803779eb4..bff092218863 100644 --- a/code/modules/atmospherics/components/omni_devices/mixer.dm +++ b/code/modules/atmospherics/components/omni_devices/mixer.dm @@ -54,7 +54,7 @@ con += max(0, tag_west_con) for(var/datum/omni_port/P in ports) - P.air.air_volume = ATMOS_DEFAULT_VOLUME_MIXER + P.air.total_volume = ATMOS_DEFAULT_VOLUME_MIXER /obj/machinery/atmospherics/omni/mixer/Destroy() inputs.Cut() @@ -80,7 +80,7 @@ P.concentration = 1 / max(1, inputs.len) if(output) - output.air.air_volume = ATMOS_DEFAULT_VOLUME_MIXER * 0.75 * inputs.len + output.air.total_volume = ATMOS_DEFAULT_VOLUME_MIXER * 0.75 * inputs.len output.concentration = 1 rebuild_mixing_inputs() @@ -117,8 +117,8 @@ for (var/datum/omni_port/P in inputs) if(!P.concentration) continue - transfer_moles += (set_flow_rate*P.concentration/P.air.air_volume)*P.air.total_moles - transfer_moles_max = min(transfer_moles_max, calculate_transfer_moles(P.air, output.air, delta, (output && output.network && output.network.air_volume) ? output.network.air_volume : 0)) + transfer_moles += (set_flow_rate*P.concentration/P.air.total_volume)*P.air.total_moles + transfer_moles_max = min(transfer_moles_max, calculate_transfer_moles(P.air, output.air, delta, (output && output.network && output.network.total_volume) ? output.network.total_volume : 0)) transfer_moles = clamp(0, transfer_moles, transfer_moles_max) var/power_draw = -1 diff --git a/code/modules/atmospherics/components/trinary_devices/trinary_base.dm b/code/modules/atmospherics/components/trinary_devices/trinary_base.dm index d4e72576e3dd..ba82faaf6d1e 100644 --- a/code/modules/atmospherics/components/trinary_devices/trinary_base.dm +++ b/code/modules/atmospherics/components/trinary_devices/trinary_base.dm @@ -15,9 +15,9 @@ air2 = new air3 = new - air1.air_volume = 200 - air2.air_volume = 200 - air3.air_volume = 200 + air1.total_volume = 200 + air2.total_volume = 200 + air3.total_volume = 200 . = ..() /obj/machinery/atmospherics/trinary/air_in_dir(direction) diff --git a/code/modules/atmospherics/components/unary/cold_sink.dm b/code/modules/atmospherics/components/unary/cold_sink.dm index 802b7c8377d3..18ab66f03864 100644 --- a/code/modules/atmospherics/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/components/unary/cold_sink.dm @@ -123,7 +123,7 @@ power_rating = initial(power_rating) * cap_rating / 2 //more powerful heatsink_temperature = initial(heatsink_temperature) / ((manip_rating + bin_rating) / 2) //more efficient - air_contents.air_volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating + air_contents.total_volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating set_power_level(power_setting) /obj/machinery/atmospherics/unary/freezer/proc/set_power_level(var/new_power_setting) diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index 8b0a103476e5..435bf70e9f1e 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -110,7 +110,7 @@ max_power_rating = initial(max_power_rating) * cap_rating / 2 max_temperature = max(initial(max_temperature) - T20C, 0) * ((bin_rating * 4 + cap_rating) / 5) + T20C - air_contents.air_volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating + air_contents.total_volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating set_power_level(power_setting) /obj/machinery/atmospherics/unary/heater/proc/set_power_level(var/new_power_setting) diff --git a/code/modules/atmospherics/components/unary/outlet_injector.dm b/code/modules/atmospherics/components/unary/outlet_injector.dm index 83ad2a6548cf..8f3d287c78c1 100644 --- a/code/modules/atmospherics/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/components/unary/outlet_injector.dm @@ -56,7 +56,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/Initialize() . = ..() //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. - air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 + air_contents.total_volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 /obj/machinery/atmospherics/unary/outlet_injector/on_update_icon() if(stat & NOPOWER) @@ -94,7 +94,7 @@ var/datum/gas_mixture/environment = loc.return_air() if(environment && air_contents.temperature > 0) - var/transfer_moles = (volume_rate/air_contents.air_volume)*air_contents.total_moles //apply flow rate limit + var/transfer_moles = (volume_rate/air_contents.total_volume)*air_contents.total_moles //apply flow rate limit power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) if(transfer_moles > 0) update_networks() @@ -147,7 +147,7 @@ return machine.volume_rate /decl/public_access/public_variable/volume_rate/write_var(obj/machinery/atmospherics/unary/outlet_injector/machine, new_value) - new_value = clamp(new_value, 0, machine.air_contents.air_volume) + new_value = clamp(new_value, 0, machine.air_contents.total_volume) . = ..() if(.) machine.volume_rate = new_value diff --git a/code/modules/atmospherics/components/unary/tank.dm b/code/modules/atmospherics/components/unary/tank.dm index ad1672b32934..96bb673ca228 100644 --- a/code/modules/atmospherics/components/unary/tank.dm +++ b/code/modules/atmospherics/components/unary/tank.dm @@ -5,7 +5,7 @@ name = "Pressure Tank" desc = "A large vessel containing pressurized gas." - var/air_volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet + var/gas_volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet var/start_pressure = 25 ATM var/filling // list of gas ratios to use. @@ -25,12 +25,12 @@ /obj/machinery/atmospherics/unary/tank/Initialize() . = ..() - air_contents.air_volume = air_volume + air_contents.total_volume = gas_volume air_contents.temperature = T20C if(filling) for(var/gas in filling) - air_contents.adjust_gas(gas, start_pressure * filling[gas] * (air_contents.air_volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature), FALSE) + air_contents.adjust_gas(gas, start_pressure * filling[gas] * (air_contents.total_volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature), FALSE) air_contents.update_values() update_icon() diff --git a/code/modules/atmospherics/components/unary/unary_base.dm b/code/modules/atmospherics/components/unary/unary_base.dm index 308bb3294a93..6cbe3cb184b6 100644 --- a/code/modules/atmospherics/components/unary/unary_base.dm +++ b/code/modules/atmospherics/components/unary/unary_base.dm @@ -19,7 +19,7 @@ /obj/machinery/atmospherics/unary/Initialize() air_contents = new - air_contents.air_volume = 200 + air_contents.total_volume = 200 if(controlled) reset_area(null, get_area(src)) . = ..() diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index b50640cd3cf5..49fcbbbb2765 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -85,7 +85,7 @@ update_name() events_repository.register(/decl/observ/name_set, A, src, PROC_REF(change_area_name)) . = ..() - air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + air_contents.total_volume = ATMOS_DEFAULT_VOLUME_PUMP update_sound() /obj/machinery/atmospherics/unary/vent_pump/proc/change_area_name(var/area/A, var/old_area_name, var/new_area_name) @@ -170,7 +170,7 @@ /obj/machinery/atmospherics/unary/vent_pump/high_volume/Initialize() . = ..() - air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + 800 + air_contents.total_volume = ATMOS_DEFAULT_VOLUME_PUMP + 800 /obj/machinery/atmospherics/unary/vent_pump/on_update_icon() var/visible_directions = build_device_underlays() @@ -223,7 +223,7 @@ power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) else //external -> internal var/datum/pipe_network/network = network_in_dir(dir) - transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, network?.air_volume) / environment.group_multiplier // limit it to just one turf's worth of gas per tick + transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, network?.total_volume) / environment.group_multiplier // limit it to just one turf's worth of gas per tick power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) else @@ -562,7 +562,7 @@ /obj/machinery/atmospherics/unary/vent_pump/engine/Initialize() . = ..() - air_contents.air_volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //meant to match air injector + air_contents.total_volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //meant to match air injector /obj/machinery/atmospherics/unary/vent_pump/power_change() . = ..() diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index 437ff5b505c7..2a2aac82fd5e 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -68,7 +68,7 @@ if(g != /decl/material/gas/oxygen && g != /decl/material/gas/nitrogen) scrubbing_gas += g . = ..() - air_contents.air_volume = ATMOS_DEFAULT_VOLUME_FILTER + air_contents.total_volume = ATMOS_DEFAULT_VOLUME_FILTER /obj/machinery/atmospherics/unary/vent_scrubber/reset_area(area/old_area, area/new_area) if(!controlled) @@ -151,17 +151,17 @@ var/transfer_moles = 0 if(scrubbing == SCRUBBER_SIPHON) //Just siphon all air //limit flow rate from turfs - transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.air_volume) //group_multiplier gets divided out here + transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.total_volume) //group_multiplier gets divided out here power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) else //limit flow rate from turfs - transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.air_volume) //group_multiplier gets divided out here + transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.total_volume) //group_multiplier gets divided out here power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating) if(scrubbing != SCRUBBER_SIPHON && power_draw <= 0) //99% of all scrubbers //Fucking hibernate because you ain't doing shit. hibernate = world.time + (rand(100,200)) else if(scrubbing == SCRUBBER_EXCHANGE) // after sleep check so it only does an exchange if there are bad gasses that have been scrubbed - transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.air_volume) + transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SCRUBBER_FLOWRATE/environment.total_volume) power_draw += pump_gas(src, environment, air_contents, transfer_moles / 4, power_rating) if (power_draw >= 0) diff --git a/code/modules/atmospherics/datum_pipe_network.dm b/code/modules/atmospherics/datum_pipe_network.dm index 72e5c22cbe1f..edfe6c240328 100644 --- a/code/modules/atmospherics/datum_pipe_network.dm +++ b/code/modules/atmospherics/datum_pipe_network.dm @@ -1,6 +1,6 @@ /datum/pipe_network var/list/datum/gas_mixture/gases = list() //All of the gas_mixtures continuously connected in this network - var/air_volume = 0 //caches the total volume for atmos machines to use in gas calculations + var/total_volume = 0 //caches the total volume for atmos machines to use in gas calculations var/list/obj/machinery/atmospherics/normal_members = list() var/list/datum/pipeline/line_members = list() @@ -71,7 +71,7 @@ //Go through membership roster and make sure gases is up to date gases = list() - air_volume = 0 + total_volume = 0 for(var/obj/machinery/atmospherics/normal_member in normal_members) var/result = normal_member.return_network_air(src) @@ -81,4 +81,4 @@ gases += line_member.air for(var/datum/gas_mixture/air in gases) - air_volume += air.air_volume + total_volume += air.total_volume diff --git a/code/modules/atmospherics/datum_pipeline.dm b/code/modules/atmospherics/datum_pipeline.dm index 6465b8dbb63d..89e598b527ff 100644 --- a/code/modules/atmospherics/datum_pipeline.dm +++ b/code/modules/atmospherics/datum_pipeline.dm @@ -30,7 +30,7 @@ STOP_PROCESSING(SSprocessing, src) QDEL_NULL(network) - if(air?.air_volume || liquid?.total_volume) + if(air?.total_volume || liquid?.total_volume) temporarily_store_fluids() QDEL_NULL(air) @@ -62,15 +62,15 @@ //Update individual gas_mixtures by volume ratio var/liquid_transfer_per_pipe = min(REAGENT_UNITS_PER_PIPE, (liquid && length(members)) ? (liquid.total_volume / length(members)) : 0) - if(!air?.air_volume && !liquid_transfer_per_pipe) + if(!air?.total_volume && !liquid_transfer_per_pipe) return for(var/obj/machinery/atmospherics/pipe/member in members) - if(air?.air_volume) + if(air?.total_volume) member.air_temporary = new member.air_temporary.copy_from(air) - member.air_temporary.air_volume = member.air_volume - member.air_temporary.multiply(member.air_volume / air.air_volume) + member.air_temporary.total_volume = member.gas_volume + member.air_temporary.multiply(member.gas_volume / air.total_volume) if(liquid_transfer_per_pipe) member.liquid_temporary = new(REAGENT_UNITS_PER_PIPE, member) @@ -81,7 +81,7 @@ members = list(base) edges = list() - var/temp_volume = base.air_volume + var/temp_volume = base.gas_volume base.parent = src maximum_pressure = base.maximum_pressure @@ -110,7 +110,7 @@ members += item possible_expansions += item - temp_volume += item.air_volume + temp_volume += item.gas_volume item.parent = src maximum_pressure = min(maximum_pressure, item.maximum_pressure) @@ -134,7 +134,7 @@ possible_expansions -= borderline - air.air_volume = temp_volume + air.total_volume = temp_volume liquid.maximum_volume = length(members) * REAGENT_UNITS_PER_PIPE /datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) @@ -194,11 +194,11 @@ /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) - if(air.air_volume <= 0) // Avoid div by zero. + if(air.total_volume <= 0) // Avoid div by zero. return var/total_heat_capacity = air.heat_capacity() - var/partial_heat_capacity = total_heat_capacity*(share_volume/air.air_volume) + var/partial_heat_capacity = total_heat_capacity*(share_volume/air.total_volume) var/datum/gas_mixture/target_air = target.return_air() if(total_heat_capacity <= 0) // Avoid div by zero. @@ -225,7 +225,7 @@ //surface must be the surface area in m^2 /datum/pipeline/proc/radiate_heat_to_space(surface, thermal_conductivity) - var/gas_density = air.total_moles/air.air_volume + var/gas_density = air.total_moles/air.total_volume thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio var/heat_gain = get_thermal_radiation(air.temperature, surface, RADIATOR_EXPOSED_SURFACE_AREA_RATIO, thermal_conductivity) diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 0479a7827ccd..2a11c6cde77d 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -73,7 +73,7 @@ var/datum/gas_mixture/environment = turf.return_air() environment_temperature = environment?.temperature || 0 if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(turf, air_volume, thermal_conductivity) + parent.temperature_interact(turf, gas_volume, thermal_conductivity) // Burn mobs buckled to this pipe. if(buckled_mob) diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index 7775e036c593..ef7fa5484345 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -24,7 +24,7 @@ var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke var/datum/reagents/liquid_temporary // used when reconstructing a pipeline that broke var/datum/pipeline/parent - var/air_volume = 0 + var/gas_volume = 0 var/leaking = 0 // Do not set directly, use set_leaking(TRUE/FALSE) //minimum pressure before check_pressure(...) should be called @@ -210,7 +210,7 @@ update_sound(0) . = PROCESS_KILL else if(leaking) - parent.mingle_with_turf(loc, air_volume) + parent.mingle_with_turf(loc, gas_volume) var/air = parent.air?.return_pressure() if(!sound_token && air) update_sound(1) @@ -225,7 +225,7 @@ name = "pipe" desc = "A one-meter section of regular pipe." - air_volume = ATMOS_DEFAULT_VOLUME_PIPE + gas_volume = ATMOS_DEFAULT_VOLUME_PIPE dir = SOUTH initialize_directions = SOUTH|NORTH @@ -380,7 +380,7 @@ icon_state = "map" name = "pipe manifold" desc = "A manifold composed of regular pipes." - air_volume = ATMOS_DEFAULT_VOLUME_PIPE * 1.5 + gas_volume = ATMOS_DEFAULT_VOLUME_PIPE * 1.5 dir = SOUTH initialize_directions = EAST|NORTH|WEST @@ -509,7 +509,7 @@ icon_state = "" name = "4-way pipe manifold" desc = "A manifold composed of regular pipes." - air_volume = ATMOS_DEFAULT_VOLUME_PIPE * 2 + gas_volume = ATMOS_DEFAULT_VOLUME_PIPE * 2 dir = SOUTH initialize_directions = NORTH|SOUTH|EAST|WEST @@ -634,7 +634,7 @@ icon = 'icons/atmos/pipes.dmi' icon_state = "cap" level = LEVEL_ABOVE_PLATING - air_volume = 35 + gas_volume = 35 pipe_class = PIPE_CLASS_UNARY dir = SOUTH diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index a4000ce56bba..c286fd0c874c 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -5,7 +5,7 @@ icon_state = "hydrotray3" density = TRUE anchored = TRUE - air_volume = 100 + gas_volume = 100 construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index 7ec1cf569712..90890403e105 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -52,13 +52,13 @@ ) if(pilot_coverage >= 100) //Open cockpits dont get to have air cockpit = new - cockpit.air_volume = 200 + cockpit.total_volume = 200 if(loc) var/datum/gas_mixture/air = loc.return_air() if(air) //Essentially at this point its like we created a vacuum, but realistically making a bottle doesnt actually increase volume of a room and neither should a mech for(var/g in air.gas) - cockpit.gas[g] = (air.gas[g] / air.air_volume) * cockpit.air_volume + cockpit.gas[g] = (air.gas[g] / air.total_volume) * cockpit.total_volume cockpit.temperature = air.temperature cockpit.update_values() @@ -107,7 +107,7 @@ if(pressure_delta > 0) if(air_supply.air_contents.temperature > 0) var/transfer_moles = calculate_transfer_moles(air_supply.air_contents, cockpit, pressure_delta) - transfer_moles = min(transfer_moles, (air_supply.release_flow_rate/air_supply.air_contents.air_volume)*air_supply.air_contents.total_moles) + transfer_moles = min(transfer_moles, (air_supply.release_flow_rate/air_supply.air_contents.total_volume)*air_supply.air_contents.total_moles) pump_gas_passive(air_supply, air_supply.air_contents, cockpit, transfer_moles) changed = TRUE else if(pressure_delta < 0) //Release overpressure. diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 5550afd919ab..21aa9577627e 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -173,7 +173,7 @@ var/temperature_gain = heat_gain/HUMAN_HEAT_CAPACITY bodytemperature += temperature_gain //temperature_gain will often be negative - var/relative_density = (environment.total_moles/environment.air_volume) / (MOLES_CELLSTANDARD/CELL_VOLUME) + var/relative_density = (environment.total_moles/environment.total_volume) / (MOLES_CELLSTANDARD/CELL_VOLUME) if(relative_density > 0.02) //don't bother if we are in vacuum or near-vacuum var/loc_temp = environment.temperature diff --git a/code/modules/mob/living/living_breath.dm b/code/modules/mob/living/living_breath.dm index de595f991f41..43d33f644d02 100644 --- a/code/modules/mob/living/living_breath.dm +++ b/code/modules/mob/living/living_breath.dm @@ -81,7 +81,7 @@ if(!can_breathe_air_above) breath = new if(!can_drown()) - breath.air_volume = volume_needed + breath.total_volume = volume_needed breath.temperature = my_turf.temperature // TODO: species-breathable gas instead of oxygen default. Maybe base it on the reagents being breathed breath.adjust_gas(/decl/material/gas/oxygen, ONE_ATMOSPHERE*volume_needed/(R_IDEAL_GAS_EQUATION*T20C)) diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 414fd5ff0b6d..4f972191a0df 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -8,7 +8,7 @@ name = "upwards pipe" desc = "A pipe segment to connect upwards." - air_volume = 70 + gas_volume = 70 dir = SOUTH initialize_directions = SOUTH diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 199a8b4e8e4b..0fc0f1ea4945 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -307,7 +307,7 @@ else temp_adj /= (BODYTEMP_HEAT_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed - var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * breath.air_volume/CELL_VOLUME) + var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * breath.total_volume/CELL_VOLUME) temp_adj *= relative_density if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX diff --git a/code/modules/overmap/ships/device_types/gas_thruster.dm b/code/modules/overmap/ships/device_types/gas_thruster.dm index 1656acd207d2..1f09c65b3187 100644 --- a/code/modules/overmap/ships/device_types/gas_thruster.dm +++ b/code/modules/overmap/ships/device_types/gas_thruster.dm @@ -29,10 +29,10 @@ /datum/extension/ship_engine/gas/proc/get_propellant(var/sample_only = TRUE, var/partial = 1) var/obj/machinery/atmospherics/unary/engine/E = holder - if(istype(E) && E.air_contents?.air_volume > 0) - var/datum/gas_mixture/removed = E.air_contents.remove_ratio((volume_per_burn * thrust_limit * partial) / E.air_contents.air_volume) + if(istype(E) && E.air_contents?.total_volume > 0) + var/datum/gas_mixture/removed = E.air_contents.remove_ratio((volume_per_burn * thrust_limit * partial) / E.air_contents.total_volume) if(removed && sample_only) - var/datum/gas_mixture/sample = new(removed.air_volume) + var/datum/gas_mixture/sample = new(removed.total_volume) sample.copy_from(removed) E.air_contents.merge(removed) return sample diff --git a/code/modules/power/stirling.dm b/code/modules/power/stirling.dm index 0903296bdddb..bc329ce9e5cc 100644 --- a/code/modules/power/stirling.dm +++ b/code/modules/power/stirling.dm @@ -225,7 +225,7 @@ slot_flags = null starting_pressure = list(/decl/material/gas/hydrogen = 2 ATM) - air_volume = 30 + gas_volume = 30 failure_temp = 1000 /obj/item/tank/stirling/Initialize() diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 331322b76cfd..c5cb01283104 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -111,7 +111,7 @@ /obj/item/gun/launcher/pneumatic/update_release_force(obj/item/projectile) if(tank) - release_force = ((fire_pressure*tank.air_volume)/projectile.w_class)/force_divisor //projectile speed. + release_force = ((fire_pressure*tank.gas_volume)/projectile.w_class)/force_divisor //projectile speed. if(release_force > 80) release_force = 80 //damage cap. else release_force = 0 diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index 3a1e4df3bfcb..468176dbde93 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -13,7 +13,7 @@ var/recharge_time = 5 //Time it takes for shots to recharge (in seconds) /obj/item/chems/borghypo/Initialize() - volume *= length(get_generated_reagents()) + chem_volume *= length(get_generated_reagents()) . = ..() /obj/item/chems/borghypo/proc/get_generated_reagents() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 7f728007f023..49527c33cdbb 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -364,7 +364,7 @@ var/global/list/diversion_junctions = list() var/power_draw = -1 if(env && env.temperature > 0) - var/transfer_moles = (PUMP_MAX_FLOW_RATE/env.air_volume)*env.total_moles //group_multiplier is divided out here + var/transfer_moles = (PUMP_MAX_FLOW_RATE/env.total_volume)*env.total_moles //group_multiplier is divided out here power_draw = pump_gas(src, env, air_contents, transfer_moles, active_power_usage) if (power_draw > 0) diff --git a/code/modules/scanners/gas.dm b/code/modules/scanners/gas.dm index 5ad8c4bc9f02..397ea46d74bf 100644 --- a/code/modules/scanners/gas.dm +++ b/code/modules/scanners/gas.dm @@ -79,7 +79,7 @@ . += "[capitalize(mat.gas_name)]: [percentage]%[perGas_add_string]" var/totalGas_add_string = "" if(mode == MV_MODE) - totalGas_add_string = ", Total moles: [round(mixture.total_moles, 0.01)], Volume: [mixture.air_volume]L" + totalGas_add_string = ", Total moles: [round(mixture.total_moles, 0.01)], Volume: [mixture.total_volume]L" . += "Temperature: [round(mixture.temperature-T0C)]°C / [round(mixture.temperature)]K[totalGas_add_string]" return diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index 0c947ca8ba2a..d88010d37564 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -8,7 +8,7 @@ //Sum of all the gas moles in this mix. Updated by update_values() var/total_moles = 0 //Volume of this mix. - var/air_volume = CELL_VOLUME + var/total_volume = CELL_VOLUME //Size of the group this gas_mixture is representing. 1 for singletons. var/group_multiplier = 1 @@ -21,14 +21,14 @@ /datum/gas_mixture/New(_volume, _temperature, _group_multiplier) if(!isnull(_volume)) - air_volume = _volume + total_volume = _volume if(!isnull(_temperature)) temperature = _temperature if(!isnull(_group_multiplier)) group_multiplier = _group_multiplier //Since we may have values defined on creation, update everything. - if(air_volume && length(gas)) + if(total_volume && length(gas)) update_values() /datum/gas_mixture/proc/get_gas(gasid) @@ -107,9 +107,9 @@ for(var/g in gas|sharer.gas) var/comb = gas[g] + sharer.gas[g] - comb /= air_volume + sharer.air_volume - gas[g] = comb * air_volume - sharer.gas[g] = comb * sharer.air_volume + comb /= total_volume + sharer.total_volume + gas[g] = comb * total_volume + sharer.gas[g] = comb * sharer.total_volume if(our_heatcap + share_heatcap) temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) @@ -188,7 +188,7 @@ var/molar_mass = mat.molar_mass var/specific_heat = mat.gas_specific_heat var/safe_temp = max(temperature, TCMB) // We're about to divide by this. - return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*air_volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) + return R_IDEAL_GAS_EQUATION * ( log( (IDEAL_GAS_ENTROPY_CONSTANT*total_volume/(gas[gasid] * safe_temp)) * (molar_mass*specific_heat*safe_temp)**(2/3) + 1 ) + 15 ) //alternative, simpler equation //var/partial_pressure = gas[gasid] * R_IDEAL_GAS_EQUATION * temperature / volume @@ -209,8 +209,8 @@ //Returns the pressure of the gas mix. Only accurate if there have been no gas modifications since update_values() has been called. /datum/gas_mixture/proc/return_pressure() - if(air_volume) - return total_moles * R_IDEAL_GAS_EQUATION * temperature / air_volume + if(total_volume) + return total_moles * R_IDEAL_GAS_EQUATION * temperature / total_volume return 0 @@ -249,7 +249,7 @@ gas[g] = gas[g] * (1 - ratio) removed.temperature = temperature - removed.air_volume = air_volume * group_multiplier / out_group_multiplier + removed.total_volume = total_volume * group_multiplier / out_group_multiplier update_values() removed.update_values() @@ -257,8 +257,8 @@ //Removes a volume of gas from the mixture and returns a gas_mixture containing the removed air with the given volume /datum/gas_mixture/proc/remove_volume(removed_volume) - var/datum/gas_mixture/removed = remove_ratio(removed_volume/(air_volume*group_multiplier), 1) - removed.air_volume = removed_volume + var/datum/gas_mixture/removed = remove_ratio(removed_volume/(total_volume*group_multiplier), 1) + removed.total_volume = removed_volume return removed //Removes moles from the gas mixture, limited by a given flag. Returns a gax_mixture containing the removed air. @@ -305,7 +305,7 @@ return 1 /datum/gas_mixture/GetCloneArgs() - return list(air_volume, temperature, group_multiplier) + return list(total_volume, temperature, group_multiplier) /datum/gas_mixture/PopulateClone(datum/gas_mixture/clone) clone.gas = gas.Copy() @@ -461,7 +461,7 @@ var/list/total_gas = list() for(var/datum/gas_mixture/gasmix in gases) - total_volume += gasmix.air_volume + total_volume += gasmix.total_volume var/temp_heatcap = gasmix.heat_capacity() total_thermal_energy += gasmix.temperature * temp_heatcap total_heat_capacity += temp_heatcap @@ -488,7 +488,7 @@ for(var/datum/gas_mixture/gasmix in gases) gasmix.gas = combined.gas.Copy() gasmix.temperature = combined.temperature - gasmix.multiply(gasmix.air_volume) + gasmix.multiply(gasmix.total_volume) return 1 diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 204c6d60b768..a8783915b03d 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -1426,7 +1426,7 @@ /area/lost_supply_base/common) "eD" = ( /obj/machinery/atmospherics/unary/tank/hydrogen{ - air_volume = 3200 + gas_volume = 3200 }, /turf/floor/plating/airless, /area/lost_supply_base) diff --git a/maps/away/unishi/unishi-1.dmm b/maps/away/unishi/unishi-1.dmm index befa32bfaf72..865829cd4ee0 100644 --- a/maps/away/unishi/unishi-1.dmm +++ b/maps/away/unishi/unishi-1.dmm @@ -251,7 +251,7 @@ /area/unishi/engineering) "aO" = ( /obj/machinery/atmospherics/unary/tank/oxygen{ - air_volume = 3200 + gas_volume = 3200 }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/floor, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index d333b7a254be..c9e92ad63477 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -48513,7 +48513,7 @@ /area/exodus/engineering/storage) "bXs" = ( /obj/machinery/atmospherics/unary/tank/oxygen{ - air_volume = 3200 + gas_volume = 3200 }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, @@ -48544,7 +48544,7 @@ /area/exodus/engineering/break_room) "bXv" = ( /obj/machinery/atmospherics/unary/tank/hydrogen{ - air_volume = 3200 + gas_volume = 3200 }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, diff --git a/mods/content/integrated_electronics/components/input.dm b/mods/content/integrated_electronics/components/input.dm index 1b9dadba0695..8d4d8995f115 100644 --- a/mods/content/integrated_electronics/components/input.dm +++ b/mods/content/integrated_electronics/components/input.dm @@ -1109,7 +1109,7 @@ set_pin_data(IC_OUTPUT, 3, round(air_contents.get_total_moles(), 0.001)) set_pin_data(IC_OUTPUT, 4, round(air_contents.return_pressure(), 0.001)) set_pin_data(IC_OUTPUT, 5, round(air_contents.temperature, 0.001)) - set_pin_data(IC_OUTPUT, 6, round(air_contents.air_volume, 0.001)) + set_pin_data(IC_OUTPUT, 6, round(air_contents.total_volume, 0.001)) push_data() activate_pin(2) diff --git a/mods/content/plant_dissection/grown.dm b/mods/content/plant_dissection/grown.dm index a5e74515f470..f4c6ea359e00 100644 --- a/mods/content/plant_dissection/grown.dm +++ b/mods/content/plant_dissection/grown.dm @@ -27,7 +27,7 @@ for(var/datum/plant_segment/segment as anything in segments) if(segment.contributes_to_reagents) segment_amount += LAZYACCESS(segment.total_reagent_volume_by_state, (PLANT_STATE_FRESH)) - volume = max(volume, segment_amount) + chem_volume = max(chem_volume, segment_amount) return ..() /obj/item/food/grown/Destroy() diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index 0ff52ab6c846..c43ba40dcfcb 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -135,7 +135,7 @@ name = "mantid gas tank" icon = 'mods/species/ascent/icons/tank.dmi' distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - air_volume = 180 + gas_volume = 180 /obj/item/tank/mantid/methyl_bromide starting_pressure = list(/decl/material/gas/methyl_bromide = 6 ATM) From da44a9c7a5c0d41003b2aa5b9c5af01c44499f23 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Fri, 31 Oct 2025 20:50:00 +1100 Subject: [PATCH 89/93] Reworks sealant gun code to use reagents instead of bespoke tracking vars. --- .../liquids/materials_liquid_chemistry.dm | 8 ++++ .../reactions/reaction_grenade_reaction.dm | 5 +-- code/modules/sealant_gun/sealant_gun.dm | 6 +-- code/modules/sealant_gun/sealant_injector.dm | 2 +- code/modules/sealant_gun/sealant_rack.dm | 1 + code/modules/sealant_gun/sealant_tank.dm | 42 ++++++++----------- 6 files changed, 33 insertions(+), 31 deletions(-) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm b/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm index f7d289cc8693..f60b1158b6d6 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm @@ -16,6 +16,14 @@ value = 0.1 exoplanet_rarity_gas = MAT_RARITY_EXOTIC +/decl/material/liquid/foam + name = "foam" + uid = "liquid_foam" + lore_text = "A frothy, sticky, well-aerated fluid." + taste_description = "chemical blandness" + color = "#a59da4" + exoplanet_rarity_gas = MAT_RARITY_EXOTIC + /decl/material/liquid/lube name = "lubricant" uid = "liquid_lubricant" diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index 7827c6ac0548..4483f376e33b 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -133,9 +133,8 @@ ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) - if(istype(location, /obj/item/sealant_tank)) - var/obj/item/sealant_tank/foam = location - foam.foam_charges = clamp(foam.foam_charges + created_volume, 0, foam.max_foam_charges) + if(istype(location, /obj/item/sealant_tank) && location.reagents?.maximum_volume) + location.reagents.add_reagent(/decl/material/liquid/foam, created_volume) return location = get_turf(location) if(location) diff --git a/code/modules/sealant_gun/sealant_gun.dm b/code/modules/sealant_gun/sealant_gun.dm index 23be0cf3efcd..cbe34aa3cb74 100644 --- a/code/modules/sealant_gun/sealant_gun.dm +++ b/code/modules/sealant_gun/sealant_gun.dm @@ -34,8 +34,8 @@ loaded_tank = /obj/item/sealant_tank/mapped /obj/item/gun/launcher/sealant/consume_next_projectile() - if(loaded_tank?.foam_charges >= foam_charges_per_shot) - loaded_tank.foam_charges -= foam_charges_per_shot + if(loaded_tank?.reagents?.has_reagent(/decl/material/liquid/foam, foam_charges_per_shot)) + loaded_tank.reagents.remove_reagent(/decl/material/liquid/foam, foam_charges_per_shot) . = new /obj/item/sealant(src) /obj/item/gun/launcher/sealant/Initialize() @@ -58,7 +58,7 @@ . = ..() if(loc == user) if(loaded_tank) - . += SPAN_NOTICE("The loaded tank has about [loaded_tank.foam_charges] liter\s of sealant left.") + . += SPAN_NOTICE("The loaded tank has about [REAGENT_VOLUME(loaded_tank.reagents, /decl/material/liquid/foam) || 0] charge\s of sealant left.") else . += SPAN_WARNING("\The [src] has no sealant loaded.") diff --git a/code/modules/sealant_gun/sealant_injector.dm b/code/modules/sealant_gun/sealant_injector.dm index 9bd7735bbd74..6485f401a8f2 100644 --- a/code/modules/sealant_gun/sealant_injector.dm +++ b/code/modules/sealant_gun/sealant_injector.dm @@ -63,7 +63,7 @@ to_chat(user, SPAN_WARNING("There is no tank loaded.")) return TRUE - var/fill_space = floor(loaded_tank.max_foam_charges - loaded_tank.foam_charges) / 5 + var/fill_space = floor(loaded_tank.reagents?.maximum_volume - loaded_tank.reagents?.total_volume) / 5 if(fill_space <= 0) to_chat(user, SPAN_WARNING("\The [loaded_tank] is full.")) return TRUE diff --git a/code/modules/sealant_gun/sealant_rack.dm b/code/modules/sealant_gun/sealant_rack.dm index 4f053d436bd0..84e925a7acdc 100644 --- a/code/modules/sealant_gun/sealant_rack.dm +++ b/code/modules/sealant_gun/sealant_rack.dm @@ -18,6 +18,7 @@ LAZYINITLIST(tanks) for(var/i = 1 to rand(1,max_tanks)) tanks += new /obj/item/sealant_tank(src) + update_icon() /obj/structure/sealant_rack/on_update_icon() ..() diff --git a/code/modules/sealant_gun/sealant_tank.dm b/code/modules/sealant_gun/sealant_tank.dm index 05244c89b98e..7dce9db17401 100644 --- a/code/modules/sealant_gun/sealant_tank.dm +++ b/code/modules/sealant_gun/sealant_tank.dm @@ -1,36 +1,30 @@ /obj/item/sealant_tank - name = "sealant tank" - desc = "A sealed tank used to keep hull sealant foam contained under pressure." - icon = 'icons/obj/sealant_tank.dmi' - icon_state = "tank" - material = /decl/material/solid/metal/steel - var/foam_charges = 0 - var/max_foam_charges = 60 + name = "sealant tank" + desc = "A sealed tank used to keep hull sealant foam contained under pressure." + icon = 'icons/obj/sealant_tank.dmi' + icon_state = "tank" + material = /decl/material/solid/metal/steel + chem_volume = 60 /obj/item/sealant_tank/on_update_icon() . = ..() - add_overlay("fill_[floor((foam_charges/max_foam_charges) * 5)]") + add_overlay("fill_[floor((reagents.total_volume/reagents.maximum_volume) * 5)]") /obj/item/sealant_tank/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(loc == user) - . += SPAN_NOTICE("\The [src] has about [foam_charges] liter\s of sealant left.") + . += SPAN_NOTICE("\The [src] has about [REAGENT_VOLUME(reagents, /decl/material/liquid/foam) || 0] charge\s of sealant left.") -/obj/item/sealant_tank/Initialize(ml, material_key) - chem_volume = max_foam_charges - . = ..() - -/obj/item/sealant_tank/mapped/Initialize() - . = ..() - foam_charges = max_foam_charges +/obj/item/sealant_tank/mapped/populate_reagents() + reagents.add_reagent(/decl/material/liquid/foam, reagents.maximum_volume) /obj/item/sealant_tank/physically_destroyed(var/skip_qdel) - if(foam_charges) - var/turf/T = get_turf(src) - if(T) - T.visible_message(SPAN_WARNING("The ruptured [src.name] spews out metallic foam!")) - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(foam_charges, T, reagents, 1) - s.start() - foam_charges = 0 + var/turf/my_turf = get_turf(src) + var/foam_amt = REAGENT_VOLUME(reagents, /decl/material/liquid/foam) + if(istype(my_turf) && foam_amt) + my_turf.visible_message(SPAN_WARNING("The ruptured [name] spews out foam!")) + var/datum/effect/effect/system/foam_spread/foam_spread = new() + foam_spread.set_up(foam_amt, my_turf, reagents, 1) + foam_spread.start() + reagents.clear_reagents() . = ..() From b26299874a635928339a3d91d0958420ce696f20 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 4 Dec 2024 20:31:32 +1100 Subject: [PATCH 90/93] Adding a quern-stone. --- code/game/objects/items/_item_reagents.dm | 6 +- code/game/objects/structures/__structure.dm | 3 + code/modules/crafting/working/quern.dm | 122 ++++++++++++++++++++ code/modules/reagents/reagent_dispenser.dm | 7 +- icons/obj/structures/quern.dmi | Bin 0 -> 539 bytes nebula.dme | 1 + 6 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 code/modules/crafting/working/quern.dm create mode 100644 icons/obj/structures/quern.dmi diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index e664024c9520..9431fb7e70c2 100644 --- a/code/game/objects/items/_item_reagents.dm +++ b/code/game/objects/items/_item_reagents.dm @@ -1,5 +1,5 @@ -/obj/item/proc/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) // This goes into afterattack - if(!istype(target) || (!skip_container_check && (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER))) +/obj/item/proc/standard_dispenser_refill(mob/user, obj/structure/target, skip_container_check = FALSE) // This goes into afterattack + if(!istype(target) || isnull(target.get_reagent_amount_dispensed()) || (!skip_container_check && (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER))) return FALSE if(!target.reagents || !target.reagents.total_volume) @@ -10,7 +10,7 @@ to_chat(user, SPAN_NOTICE("[src] is full of reagents.")) return TRUE - var/trans = target.reagents.trans_to_obj(src, target.amount_dispensed) + var/trans = target.reagents.trans_to_obj(src, target.get_reagent_amount_dispensed()) to_chat(user, SPAN_NOTICE("You fill [src] with [trans] units of the contents of [target].")) return TRUE diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 839530cbdbc3..90bf4c09f19a 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -345,3 +345,6 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen visible_message(SPAN_DANGER("\The [src] was hit by \the [AM].")) playsound(src.loc, hitsound, 100, 1) take_damage(AM.get_thrown_attack_force() * (TT.speed/THROWFORCE_SPEED_DIVISOR), AM.atom_damage_type) + +/obj/structure/proc/get_reagent_amount_dispensed() + return null diff --git a/code/modules/crafting/working/quern.dm b/code/modules/crafting/working/quern.dm new file mode 100644 index 000000000000..3278110bb870 --- /dev/null +++ b/code/modules/crafting/working/quern.dm @@ -0,0 +1,122 @@ +/datum/storage/hopper/mortar/quern + max_w_class = ITEM_SIZE_SMALL + max_storage_space = DEFAULT_BOX_STORAGE + +/obj/structure/working/quern + name = "quern-stone" + desc = "A pair of heavy stones connected by an axle, used to grind plants and minerals into powder." + icon = 'icons/obj/structures/quern.dmi' + material = /decl/material/solid/stone/granite + color = /decl/material/solid/stone/granite::color + storage = /datum/storage/hopper/mortar/quern + work_skill = SKILL_COOKING // Maybe? + var/tmp/volume = 1000 // Same as reagent dispensers. Possibly too large? + var/amount_dispensed = 10 + var/tmp/possible_transfer_amounts = @"[10,25,50,100,500]" + +/obj/structure/working/quern/Initialize() + . = ..() + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + initialize_reagents() + +/obj/structure/working/quern/try_start_working(mob/user) + + if(!length(get_stored_inventory())) + to_chat(user, SPAN_WARNING("There is nothing in \the [src] to grind.")) + return TRUE + + start_working() + while(length(get_stored_inventory()) && user.do_skilled(1.5 SECONDS, work_skill, src)) + if(QDELETED(src) || QDELETED(user) || user.get_stamina() < 25 || !user.get_empty_hand_slot()) + break + var/list/stored = get_stored_inventory() + var/obj/item/grinding = stored[1] + if(!istype(grinding)) + break + if(!grind_item(grinding, user)) + visible_message(SPAN_WARNING("\The [src] clunks and grinds loudly, unable to crush \the [grinding].")) + break + user.adjust_stamina(-25) + + if(!QDELETED(user)) + to_chat(user, SPAN_NOTICE("You stop working \the [src].")) + + stop_working() + return TRUE + +/obj/structure/working/quern/proc/grind_item(obj/item/grinding, mob/user) + if(!istype(grinding)) + return + var/decl/material/attacking_material = get_material() + var/decl/material/crushing_material = grinding.get_material() + if(!attacking_material || !crushing_material || attacking_material.hardness <= crushing_material.hardness) + return FALSE + if(REAGENTS_FREE_SPACE(reagents) < grinding.reagents?.total_volume) + return FALSE + if(grinding.reagents?.total_volume) // if it has no reagents, skip all the fluff and destroy it instantly + grinding.reagents.trans_to(src, grinding.reagents.total_volume) + QDEL_NULL(grinding) + return TRUE + +// Reagent handling code copied from reagent dispensers. TODO: make reagent handling an extension or something. +/obj/structure/working/quern/attackby(obj/item/used_item, mob/user) + // We do this here to avoid putting the vessel straight into storage. + // This is usually handled by afterattack on /chems. + if(storage && ATOM_IS_OPEN_CONTAINER(used_item) && user.check_intent(I_FLAG_HELP)) + if(used_item.standard_dispenser_refill(user, src)) + return TRUE + if(used_item.standard_pour_into(user, src)) + return TRUE + return ..() + +/obj/structure/working/quern/initialize_reagents(populate = TRUE) + if(!reagents) + create_reagents(volume) + else + reagents.maximum_volume = max(reagents.maximum_volume, volume) + . = ..() + +/obj/structure/working/quern/verb/set_amount_dispensed() + set name = "Set amount dispensed" + set category = "Object" + set src in view(1) + if(!CanPhysicallyInteract(usr)) + to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) + return + var/new_amount = input("Amount dispensed:","[src]") as null|anything in cached_json_decode(possible_transfer_amounts) + if(!CanPhysicallyInteract(usr)) // because input takes time and the situation can change + to_chat(usr, SPAN_NOTICE("You're in no condition to do that!'")) + return + if (new_amount) + amount_dispensed = new_amount + +/obj/structure/working/quern/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + if(distance <= 2) + . += SPAN_NOTICE("It contains:") + if(LAZYLEN(reagents?.reagent_volumes)) + for(var/decl/material/reagent as anything in reagents.liquid_volumes) + . += SPAN_NOTICE("[LIQUID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_LIQUID)].") + for(var/decl/material/reagent as anything in reagents.solid_volumes) + . += SPAN_NOTICE("[SOLID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_SOLID)].") + +/obj/structure/working/quern/get_reagent_amount_dispensed() + return amount_dispensed + +/obj/structure/working/quern/get_alt_interactions(var/mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/set_transfer/quern) + +//Set amount dispensed +/decl/interaction_handler/set_transfer/quern + expected_target_type = /obj/structure/working/quern + +/decl/interaction_handler/set_transfer/quern/is_possible(var/atom/target, var/mob/user) + . = ..() + if(.) + var/obj/structure/working/quern/quern = target + return !!quern.possible_transfer_amounts + +/decl/interaction_handler/set_transfer/quern/invoked(atom/target, mob/user, obj/item/prop) + var/obj/structure/working/quern/quern = target + quern.set_amount_dispensed() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ba4d347b9fc3..ac1dc15b6a4f 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -23,6 +23,9 @@ if (!possible_transfer_amounts) verbs -= /obj/structure/reagent_dispensers/verb/set_amount_dispensed +/obj/structure/reagent_dispensers/get_reagent_amount_dispensed() + return amount_dispensed + /obj/structure/reagent_dispensers/receive_mouse_drop(atom/dropping, mob/user, params) if(!(. = ..()) && user?.get_active_held_item() == dropping && isitem(dropping)) // Awful. Sorry. @@ -97,11 +100,11 @@ set category = "Object" set src in view(1) if(!CanPhysicallyInteract(usr)) - to_chat(usr, SPAN_NOTICE("You're in no condition to do that!'")) + to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) return var/N = input("Amount dispensed:","[src]") as null|anything in cached_json_decode(possible_transfer_amounts) if(!CanPhysicallyInteract(usr)) // because input takes time and the situation can change - to_chat(usr, SPAN_NOTICE("You're in no condition to do that!'")) + to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) return if (N) amount_dispensed = N diff --git a/icons/obj/structures/quern.dmi b/icons/obj/structures/quern.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5867670c10e5e13da731231e55ef18a3358243f8 GIT binary patch literal 539 zcmV+$0_6RPP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRp|oB?99A$?5Zt*qNzEFl^|gq6v(Bl z;OgfBb{zn`c`b=~p#cT}00ApWL_t(oh3%JJu7e;DMn_j5)xHDHT|fmEps)jE|66I( z+oV7(KR4-pX!zcaVUQS{lL2V?V1^98gl0GnV>Hc#2Jd7NFEqtM1l)_=*d@iz?c6Jv zokV46k|la)8m%6+9nx%`8}v%5vs6nd|E<793sMZ-Y_-sqmGbR@lScUq(hS{p`_6V* zOBuR}3$Y+6W$2mad|r7e10YfEGSOm&&JZ%Ke&4IOrRAGb`#;3}Kga#O z@09by2Sdd4EkArfBYy9T-*zr}$XP$c1?QX}SXT!@Nqxjp&y=Gj1f Date: Sat, 11 Oct 2025 00:00:00 +1100 Subject: [PATCH 91/93] Generalising some structure reagent-handling code. --- code/game/objects/structures/__structure.dm | 38 +++++++---- .../structures/_structure_construction.dm | 8 +++ .../objects/structures/structure_reagents.dm | 47 +++++++++++++ code/modules/assembly/igniter.dm | 2 +- code/modules/crafting/working/quern.dm | 55 ++-------------- .../interactions/interactions_reagents.dm | 8 ++- code/modules/reagents/reagent_dispenser.dm | 66 ++----------------- nebula.dme | 1 + 8 files changed, 99 insertions(+), 126 deletions(-) create mode 100644 code/game/objects/structures/structure_reagents.dm diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 90bf4c09f19a..704ab61cde54 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -69,18 +69,32 @@ lock = new /datum/lock(src, lock) if(!CanFluidPass()) fluid_update(TRUE) + if (!isnull(get_possible_reagent_transfer_amounts())) + verbs |= /obj/structure/proc/set_reagent_amount_dispensed_verb /obj/structure/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance <= 3) - if(distance <= 1 && lock) - . += SPAN_NOTICE("\The [src] appears to have a lock, opened by '[lock.lock_data]'.") - var/damage_desc = get_examined_damage_string() - if(length(damage_desc)) - . += damage_desc - if(paint_color) - var/decl/pronouns/structure_pronouns = get_pronouns() // so we can do 'have' for plural objects like sheets - . += "\The [src] [structure_pronouns.has] been [paint_verb]." + if(distance > 3) + return + if(distance <= 1 && lock) + . += SPAN_NOTICE("\The [src] appears to have a lock, opened by '[lock.lock_data]'.") + var/damage_desc = get_examined_damage_string() + if(length(damage_desc)) + . += damage_desc + if(paint_color) + var/decl/pronouns/structure_pronouns = get_pronouns() // so we can do 'have' for plural objects like sheets + . += "\The [src] [structure_pronouns.has] been [paint_verb]." + if(distance <= 2 && !isnull(get_possible_reagent_transfer_amounts()) && reagents) + . += SPAN_NOTICE("It contains:") + if(LAZYLEN(reagents.reagent_volumes)) + for(var/decl/material/reagent as anything in reagents.liquid_volumes) + . += SPAN_NOTICE("[LIQUID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_LIQUID)].") + for(var/decl/material/reagent as anything in reagents.solid_volumes) + . += SPAN_NOTICE("[SOLID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_SOLID)].") + else + . += SPAN_NOTICE("Nothing.") + if(reagents.maximum_volume) + . += "It may contain up to [reagents.maximum_volume] unit\s." /obj/structure/get_examine_hints(mob/user, distance, infix, suffix) . = ..() @@ -346,5 +360,7 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen playsound(src.loc, hitsound, 100, 1) take_damage(AM.get_thrown_attack_force() * (TT.speed/THROWFORCE_SPEED_DIVISOR), AM.atom_damage_type) -/obj/structure/proc/get_reagent_amount_dispensed() - return null +/obj/structure/get_alt_interactions(var/mob/user) + . = ..() + if(!isnull(get_possible_reagent_transfer_amounts())) + LAZYADD(., /decl/interaction_handler/set_transfer/structure) diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index 85ffb92fa599..37d86d02566a 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -61,6 +61,14 @@ /obj/structure/attackby(obj/item/used_item, mob/user) + // We do this here to avoid putting the vessel straight into storage. + // This is usually handled by afterattack on /chems. + if(storage && !isnull(get_possible_reagent_transfer_amounts()) && ATOM_IS_OPEN_CONTAINER(used_item) && user.check_intent(I_FLAG_HELP)) + if(used_item.standard_dispenser_refill(user, src)) + return TRUE + if(used_item.standard_pour_into(user, src)) + return TRUE + if(used_item.user_can_attack_with(user, silent = TRUE)) var/force = used_item.expend_attack_force(user) if(force && user.check_intent(I_FLAG_HARM)) diff --git a/code/game/objects/structures/structure_reagents.dm b/code/game/objects/structures/structure_reagents.dm new file mode 100644 index 000000000000..f2d9decae039 --- /dev/null +++ b/code/game/objects/structures/structure_reagents.dm @@ -0,0 +1,47 @@ +/obj/structure/receive_mouse_drop(atom/dropping, mob/user, params) + if((. = ..()) || user?.get_active_held_item() != dropping || !isitem(dropping) || isnull(get_possible_reagent_transfer_amounts())) + return + // Awful. Sorry. + var/obj/item/item = dropping + var/old_atom_flags = atom_flags + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + if(item.standard_pour_into(user, src)) + . = TRUE + atom_flags = old_atom_flags + +/obj/structure/proc/get_reagent_amount_dispensed() + return null + +/obj/structure/proc/set_reagent_amount_dispensed() + return null + +/obj/structure/proc/set_reagent_amount_dispensed_verb() + set name = "Set amount dispensed" + set category = "Object" + set src in view(1) + if(!CanPhysicallyInteract(usr)) + to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) + return + var/new_amount = input("Amount dispensed:","[src]") as null|anything in get_possible_reagent_transfer_amounts() + if(!CanPhysicallyInteract(usr)) // because input takes time and the situation can change + to_chat(usr, SPAN_NOTICE("You're in no condition to do that!'")) + return + if (new_amount) + set_reagent_amount_dispensed(new_amount) + +/obj/structure/proc/get_possible_reagent_transfer_amounts() + return null + +//Set amount dispensed. Added manually to querns and reagent dispensers. +/decl/interaction_handler/set_transfer/structure + expected_target_type = /obj/structure + +/decl/interaction_handler/set_transfer/structure/is_possible(var/atom/target, var/mob/user) + . = ..() + if(.) + var/obj/structure/dispenser = target + return !isnull(dispenser.get_possible_reagent_transfer_amounts()) + +/decl/interaction_handler/set_transfer/structure/invoked(atom/target, mob/user, obj/item/prop) + var/obj/structure/dispenser = target + dispenser.set_reagent_amount_dispensed_verb() diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index f692cd70b9d7..7f8b14ca0064 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -23,7 +23,7 @@ if(location) location.hotspot_expose(1000,1000) if (istype(src.loc,/obj/item/assembly_holder)) - if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/)) + if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank)) var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc if(tank) tank.try_detonate_reagents() diff --git a/code/modules/crafting/working/quern.dm b/code/modules/crafting/working/quern.dm index 3278110bb870..afe6821edc73 100644 --- a/code/modules/crafting/working/quern.dm +++ b/code/modules/crafting/working/quern.dm @@ -58,17 +58,6 @@ QDEL_NULL(grinding) return TRUE -// Reagent handling code copied from reagent dispensers. TODO: make reagent handling an extension or something. -/obj/structure/working/quern/attackby(obj/item/used_item, mob/user) - // We do this here to avoid putting the vessel straight into storage. - // This is usually handled by afterattack on /chems. - if(storage && ATOM_IS_OPEN_CONTAINER(used_item) && user.check_intent(I_FLAG_HELP)) - if(used_item.standard_dispenser_refill(user, src)) - return TRUE - if(used_item.standard_pour_into(user, src)) - return TRUE - return ..() - /obj/structure/working/quern/initialize_reagents(populate = TRUE) if(!reagents) create_reagents(volume) @@ -76,47 +65,11 @@ reagents.maximum_volume = max(reagents.maximum_volume, volume) . = ..() -/obj/structure/working/quern/verb/set_amount_dispensed() - set name = "Set amount dispensed" - set category = "Object" - set src in view(1) - if(!CanPhysicallyInteract(usr)) - to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) - return - var/new_amount = input("Amount dispensed:","[src]") as null|anything in cached_json_decode(possible_transfer_amounts) - if(!CanPhysicallyInteract(usr)) // because input takes time and the situation can change - to_chat(usr, SPAN_NOTICE("You're in no condition to do that!'")) - return - if (new_amount) - amount_dispensed = new_amount - -/obj/structure/working/quern/get_examine_strings(mob/user, distance, infix, suffix) - . = ..() - if(distance <= 2) - . += SPAN_NOTICE("It contains:") - if(LAZYLEN(reagents?.reagent_volumes)) - for(var/decl/material/reagent as anything in reagents.liquid_volumes) - . += SPAN_NOTICE("[LIQUID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_LIQUID)].") - for(var/decl/material/reagent as anything in reagents.solid_volumes) - . += SPAN_NOTICE("[SOLID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_SOLID)].") +/obj/structure/working/quern/set_reagent_amount_dispensed(new_amount) + amount_dispensed = new_amount /obj/structure/working/quern/get_reagent_amount_dispensed() return amount_dispensed -/obj/structure/working/quern/get_alt_interactions(var/mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/set_transfer/quern) - -//Set amount dispensed -/decl/interaction_handler/set_transfer/quern - expected_target_type = /obj/structure/working/quern - -/decl/interaction_handler/set_transfer/quern/is_possible(var/atom/target, var/mob/user) - . = ..() - if(.) - var/obj/structure/working/quern/quern = target - return !!quern.possible_transfer_amounts - -/decl/interaction_handler/set_transfer/quern/invoked(atom/target, mob/user, obj/item/prop) - var/obj/structure/working/quern/quern = target - quern.set_amount_dispensed() +/obj/structure/working/quern/get_possible_reagent_transfer_amounts() + return cached_json_decode(possible_transfer_amounts) diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm index 7a50cfaacf59..80de48cc9177 100644 --- a/code/modules/interactions/interactions_reagents.dm +++ b/code/modules/interactions/interactions_reagents.dm @@ -27,15 +27,19 @@ return if(target == prop || target.reagents?.total_volume < FLUID_PUDDLE) return FALSE - if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers))) + if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure))) return FALSE + if(istype(target, /obj/structure)) + var/obj/structure/struct = target + if(isnull(struct.get_possible_reagent_transfer_amounts())) + return FALSE // Not a dispenser return target.can_be_poured_from(user, prop) && prop.can_be_poured_into(user, target) /decl/interaction_handler/fill_from/invoked(atom/target, mob/user, obj/item/prop) if(isitem(target)) var/obj/item/vessel = target return vessel.standard_pour_into(user, prop) - if(istype(target, /obj/structure/reagent_dispensers)) + if(istype(target, /obj/structure)) // Reagent dispensers have some wonky assumptions due to old UX around filling/emptying so we skip the atom flags check. return prop.standard_dispenser_refill(user, target, skip_container_check = TRUE) return FALSE diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ac1dc15b6a4f..8b2dc8e5dbab 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -18,23 +18,14 @@ var/can_toggle_open = TRUE var/tmp/possible_transfer_amounts = @"[10,25,50,100,500]" -/obj/structure/reagent_dispensers/Initialize(ml, _mat, _reinf_mat) - . = ..() - if (!possible_transfer_amounts) - verbs -= /obj/structure/reagent_dispensers/verb/set_amount_dispensed - /obj/structure/reagent_dispensers/get_reagent_amount_dispensed() return amount_dispensed -/obj/structure/reagent_dispensers/receive_mouse_drop(atom/dropping, mob/user, params) - if(!(. = ..()) && user?.get_active_held_item() == dropping && isitem(dropping)) - // Awful. Sorry. - var/obj/item/item = dropping - var/old_atom_flags = atom_flags - atom_flags |= ATOM_FLAG_OPEN_CONTAINER - if(item.standard_pour_into(user, src)) - . = TRUE - atom_flags = old_atom_flags +/obj/structure/reagent_dispensers/set_reagent_amount_dispensed(new_amount) + amount_dispensed = new_amount + +/obj/structure/reagent_dispensers/get_possible_reagent_transfer_amounts() + return cached_json_decode(possible_transfer_amounts) /obj/structure/reagent_dispensers/on_reagent_change() if(!(. = ..())) @@ -64,27 +55,9 @@ . += "Its refilling cap is open." else . += "Its refilling cap is closed." - . += SPAN_NOTICE("It contains:") - if(LAZYLEN(reagents?.reagent_volumes)) - for(var/decl/material/reagent as anything in reagents.liquid_volumes) - . += SPAN_NOTICE("[LIQUID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_LIQUID)].") - for(var/decl/material/reagent as anything in reagents.solid_volumes) - . += SPAN_NOTICE("[SOLID_VOLUME(reagents, reagent)] unit\s of [reagent.get_reagent_name(reagents, MAT_PHASE_SOLID)].") - else - . += SPAN_NOTICE("Nothing.") - if(reagents?.maximum_volume) - . += "It may contain up to [reagents.maximum_volume] unit\s of fluid." /obj/structure/reagent_dispensers/attackby(obj/item/used_item, mob/user) - // We do this here to avoid putting the vessel straight into storage. - // This is usually handled by afterattack on /chems. - if(storage && ATOM_IS_OPEN_CONTAINER(used_item) && user.check_intent(I_FLAG_HELP)) - if(used_item.standard_dispenser_refill(user, src)) - return TRUE - if(used_item.standard_pour_into(user, src)) - return TRUE - if(wrenchable && IS_WRENCH(used_item)) unwrenched = !unwrenched visible_message(SPAN_NOTICE("\The [user] wrenches \the [src]'s tap [unwrenched ? "open" : "shut"].")) @@ -95,20 +68,6 @@ . = ..() -/obj/structure/reagent_dispensers/verb/set_amount_dispensed() - set name = "Set amount dispensed" - set category = "Object" - set src in view(1) - if(!CanPhysicallyInteract(usr)) - to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) - return - var/N = input("Amount dispensed:","[src]") as null|anything in cached_json_decode(possible_transfer_amounts) - if(!CanPhysicallyInteract(usr)) // because input takes time and the situation can change - to_chat(usr, SPAN_NOTICE("You're in no condition to do that!")) - return - if (N) - amount_dispensed = N - /obj/structure/reagent_dispensers/explosion_act(severity) . = ..() if(. && (severity == 1) || (severity == 2 && prob(50)) || (severity == 3 && prob(5))) @@ -323,24 +282,9 @@ //Interactions /obj/structure/reagent_dispensers/get_alt_interactions(var/mob/user) . = ..() - LAZYADD(., /decl/interaction_handler/set_transfer/reagent_dispenser) if(can_toggle_open) LAZYADD(., /decl/interaction_handler/toggle_open/reagent_dispenser) -//Set amount dispensed -/decl/interaction_handler/set_transfer/reagent_dispenser - expected_target_type = /obj/structure/reagent_dispensers - -/decl/interaction_handler/set_transfer/reagent_dispenser/is_possible(var/atom/target, var/mob/user) - . = ..() - if(.) - var/obj/structure/reagent_dispensers/R = target - return !!R.possible_transfer_amounts - -/decl/interaction_handler/set_transfer/reagent_dispenser/invoked(atom/target, mob/user, obj/item/prop) - var/obj/structure/reagent_dispensers/R = target - R.set_amount_dispensed() - //Allows normal refilling, or toggle back to normal reagent dispenser operation /decl/interaction_handler/toggle_open/reagent_dispenser name = "Toggle refilling cap" diff --git a/nebula.dme b/nebula.dme index 9413d6426c4f..27a7c09e2e86 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1459,6 +1459,7 @@ #include "code\game\objects\structures\snowman.dm" #include "code\game\objects\structures\sofa.dm" #include "code\game\objects\structures\stasis_cage.dm" +#include "code\game\objects\structures\structure_reagents.dm" #include "code\game\objects\structures\tables.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" From 3989f990495ebf0531091faff54f3ec001318ec4 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Sat, 1 Nov 2025 00:25:08 +1100 Subject: [PATCH 92/93] Adding querns to the shadyhills map. --- maps/shaded_hills/shaded_hills-inn.dmm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 11b1e507fb20..59e1397ce1d1 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -1195,6 +1195,10 @@ }, /turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) +"Fz" = ( +/obj/structure/working/quern, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/storehouse) "FD" = ( /obj/structure/reagent_dispensers/barrel/ebony, /obj/item/seeds/extracted/rice, @@ -1293,6 +1297,11 @@ /obj/structure/wall_sconce/lantern, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) +"Hp" = ( +/obj/structure/table/wood/reinforced/ebony, +/obj/item/chems/glass/bucket/wood, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/storehouse) "Hv" = ( /obj/structure/railing/mapped/wooden/walnut, /obj/structure/flora/bush/sparsegrass, @@ -9547,7 +9556,7 @@ uJ dH HI QQ -fR +Hp fR fR fR @@ -9699,7 +9708,7 @@ uJ Wg HI QQ -fR +Fz fR fR fR @@ -10003,7 +10012,7 @@ yz Wg HI UY -fR +Hp fR fR fR @@ -10155,7 +10164,7 @@ BL dH HI QQ -fR +Fz fR fR fR From 08894150d4689cf9b15e4c787241404475c15c16 Mon Sep 17 00:00:00 2001 From: mistakenot4892 Date: Thu, 20 Nov 2025 15:19:19 +1100 Subject: [PATCH 93/93] Integrating pyrelight content with backported content that went to Neb main. --- code/modules/mob/living/human/death.dm | 15 +--- code/modules/mob/living/human/human.dm | 33 -------- .../mob/living/human/human_appearance_head.dm | 10 --- code/modules/mob/living/human/human_damage.dm | 17 +--- code/modules/mob/living/human/human_organs.dm | 13 --- code/modules/organs/organ.dm | 4 +- maps/karzerfeste/karzerfeste.dm | 2 + maps/shaded_hills/shaded_hills.dm | 2 + mods/content/undead/_undead.dme | 6 +- mods/content/undead/{mods => mobs}/undead.dm | 0 .../undead/{mods => mobs}/undead_skeleton.dm | 0 .../undead/{mods => mobs}/undead_zombie.dm | 0 mods/pyrelight/_pyrelight.dme | 3 - mods/pyrelight/datum/wyrdling/ears.dm | 31 +------ mods/pyrelight/datum/wyrdling/mask.dm | 31 ------- mods/pyrelight/datum/wyrdling/tails.dm | 69 +-------------- mods/pyrelight/undead/_undead.dm | 27 ------ mods/pyrelight/undead/undead.dm | 40 --------- mods/pyrelight/undead/undead_skeleton.dm | 58 ------------- mods/pyrelight/undead/undead_zombie.dm | 84 ------------------- nebula.dme | 1 - 21 files changed, 14 insertions(+), 432 deletions(-) rename mods/content/undead/{mods => mobs}/undead.dm (100%) rename mods/content/undead/{mods => mobs}/undead_skeleton.dm (100%) rename mods/content/undead/{mods => mobs}/undead_zombie.dm (100%) delete mode 100644 mods/pyrelight/undead/_undead.dm delete mode 100644 mods/pyrelight/undead/undead.dm delete mode 100644 mods/pyrelight/undead/undead_skeleton.dm delete mode 100644 mods/pyrelight/undead/undead_zombie.dm diff --git a/code/modules/mob/living/human/death.dm b/code/modules/mob/living/human/death.dm index 06d33a1e66aa..8f21775624ac 100644 --- a/code/modules/mob/living/human/death.dm +++ b/code/modules/mob/living/human/death.dm @@ -1,8 +1,6 @@ /mob/living/human/gib(do_gibs = TRUE) var/turf/my_turf = get_turf(src) - if(do_gibs && has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE)) - do_gibs = FALSE - . = ..(do_gibs) + . = ..() if(.) for(var/obj/item/organ/I in get_internal_organs()) remove_organ(I) @@ -18,15 +16,10 @@ E.throw_at(get_edge_target_turf(E, pick(global.alldirs)), rand(1,3), THROWFORCE_GIBS) /mob/living/human/get_death_message(gibbed) - if(has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE)) - return "crumbles and falls apart!" if(get_config_value(/decl/config/toggle/health_show_human_death_message)) return species.get_species_death_message(src) || "seizes up and falls limp..." return ..() -/mob/living/human/get_self_death_message(gibbed) - return has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE) ? "You have crumbled." : ..() - /mob/living/human/death(gibbed) if(!(. = ..())) return @@ -43,12 +36,6 @@ if(SSticker.mode) SSticker.mode.check_win() - if(!QDELETED(src) && !gibbed && has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE)) - gib() - -/mob/living/human/get_gibber_type() - return has_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE) ? null : ..() - /mob/living/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) for(var/obj/item/organ/external/limb in get_external_organs()) if(!limb.parent_organ) // don't dismember root diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 788746eb3ca5..08c623244b06 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -1121,16 +1121,6 @@ var/temp_inc = max(min(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), exposed_temperature - bodytemperature), 0) bodytemperature += temp_inc -/mob/living/human/need_breathe() - return has_trait(/decl/trait/undead) ? FALSE : ..() - -// Undead don't get hungry/thirsty (except for brains) -/mob/living/human/get_nutrition() - return has_trait(/decl/trait/undead) ? get_max_nutrition() : ..() - -/mob/living/human/get_hydration() - return has_trait(/decl/trait/undead) ? get_max_hydration() : ..() - /mob/living/human/currently_has_skin() return currently_has_meat() @@ -1146,29 +1136,6 @@ /mob/living/human/get_attack_telegraph_delay() return client ? 0 : DEFAULT_ATTACK_COOLDOWN -/mob/living/human/set_status_condition(condition, amount) - if(has_trait(/decl/trait/undead)) - var/static/list/ignore_status_conditions = list( - STAT_BLIND, - STAT_DEAF, - STAT_CONFUSE, - STAT_DIZZY, - STAT_JITTER, - STAT_STUTTER, - STAT_SLUR, - STAT_ASLEEP, - STAT_DRUGGY, - STAT_DROWSY, - STAT_BLURRY, - STAT_BLIND, - STAT_TINNITUS, - STAT_DEAF - ) - if(condition in ignore_status_conditions) - return - - . = ..() - /mob/living/human/isSynthetic() if(isnull(full_prosthetic)) robolimb_count = 0 diff --git a/code/modules/mob/living/human/human_appearance_head.dm b/code/modules/mob/living/human/human_appearance_head.dm index ad631c88e56f..f5ed43182da9 100644 --- a/code/modules/mob/living/human/human_appearance_head.dm +++ b/code/modules/mob/living/human/human_appearance_head.dm @@ -3,18 +3,8 @@ // Eyes! TODO, make these a marking. /mob/living/human/get_eye_colour() - // Force an evil red glow for undead mobs. - if(stat == CONSCIOUS && has_trait(/decl/trait/undead)) - return COLOR_RED return _eye_colour -/mob/living/human/death(gibbed) - . = ..() - if(!QDELETED(src) && has_trait(/decl/trait/undead)) - var/obj/item/organ/external/head/head = get_organ(BP_HEAD) - head.glowing_eyes = initial(head.glowing_eyes) - update_eyes() - /mob/living/human/set_eye_colour(var/new_color, var/skip_update = FALSE) if((. = ..())) _eye_colour = new_color diff --git a/code/modules/mob/living/human/human_damage.dm b/code/modules/mob/living/human/human_damage.dm index 72e1546c7db1..d1d64b56f8a7 100644 --- a/code/modules/mob/living/human/human_damage.dm +++ b/code/modules/mob/living/human/human_damage.dm @@ -1,11 +1,4 @@ /mob/living/human/get_life_damage_types() - if(has_trait(/decl/trait/undead)) - // Undead human mobs use brute and burn damage instead of brain damage, a la simplemobs. - var/static/list/life_damage_types = list( - BURN, - BRUTE - ) - return life_damage_types var/static/list/brain_life_damage_types = list( BRAIN ) @@ -146,13 +139,9 @@ return 0 /mob/living/human/setOxyLoss(var/amount) - if(has_trait(/decl/trait/undead)) - return take_damage(amount - get_damage(OXY), OXY) /mob/living/human/adjustOxyLoss(var/damage, var/do_update_health = TRUE) - if(has_trait(/decl/trait/undead)) - return . = FALSE if(need_breathe()) var/obj/item/organ/internal/lungs/breathe_organ = get_organ(get_bodytype().breathing_organ, /obj/item/organ/internal/lungs) @@ -163,7 +152,7 @@ ..(do_update_health = FALSE) // Oxyloss cannot directly kill humans /mob/living/human/getToxLoss() - if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic() || has_trait(/decl/trait/undead)) + if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return 0 var/amount = 0 for(var/obj/item/organ/internal/I in get_internal_organs()) @@ -171,13 +160,13 @@ return amount /mob/living/human/setToxLoss(var/amount) - if(!(species.species_flags & SPECIES_FLAG_NO_POISON) && !isSynthetic() || has_trait(/decl/trait/undead)) + if(!(species.species_flags & SPECIES_FLAG_NO_POISON) && !isSynthetic()) take_damage(get_damage(TOX)-amount, TOX) // TODO: better internal organ damage procs. /mob/living/human/adjustToxLoss(var/amount, var/do_update_health = TRUE) - if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic() || has_trait(/decl/trait/undead)) + if((species.species_flags & SPECIES_FLAG_NO_POISON) || isSynthetic()) return var/heal = amount < 0 diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm index da7a70ca52c9..1b4884758d9c 100644 --- a/code/modules/mob/living/human/human_organs.dm +++ b/code/modules/mob/living/human/human_organs.dm @@ -156,25 +156,12 @@ LAZYDISTINCTADD(bad_external_organs, E) /mob/living/human/proc/check_vital_organ_missing() - // Undead don't care about missing internal organs. - if(has_trait(/decl/trait/undead)) - return FALSE return get_bodytype()?.check_vital_organ_missing(src) -/mob/living/human/should_have_organ(organ_to_check) - // It might be nice to have eyes etc. matter for zombies, but as all organs are dead it won't work currently. - return has_trait(/decl/trait/undead) ? FALSE : ..() - /mob/living/human/proc/process_internal_organs() - if(has_trait(/decl/trait/undead)) - return for(var/obj/item/organ/I in internal_organs) I.Process() -/mob/living/human/get_vision_organ_tag() - // Where we're going, we don't need eyes. - return has_trait(/decl/trait/undead) ? null : ..() - // Takes care of organ related updates, such as broken and missing limbs /mob/living/human/proc/handle_organs() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e04b90c0ac75..1320a48c919b 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -435,9 +435,7 @@ return bodytype && !(bodytype.body_flags & BODY_FLAG_NO_PAIN) && !(status & ORGAN_DEAD) /obj/item/organ/proc/is_usable() - . = !(status & (ORGAN_CUT_AWAY|ORGAN_MUTATED)) - if(. && (status & ORGAN_DEAD)) - return owner?.has_trait(/decl/trait/undead) + return !(status & (ORGAN_DEAD|ORGAN_CUT_AWAY|ORGAN_MUTATED)) /obj/item/organ/proc/can_recover() return (max_damage > 0) && !(status & ORGAN_DEAD) || death_time >= REALTIMEOFDAY - ORGAN_RECOVERY_THRESHOLD diff --git a/maps/karzerfeste/karzerfeste.dm b/maps/karzerfeste/karzerfeste.dm index 602b4695d4e0..6b8304b79614 100644 --- a/maps/karzerfeste/karzerfeste.dm +++ b/maps/karzerfeste/karzerfeste.dm @@ -6,6 +6,8 @@ #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/content/undead/_undead.dme" + #include "../../mods/content/biomods/_biomods.dme" #include "../../mods/pyrelight/_pyrelight.dme" // include after _fantasy.dme so overrides work #include "areas/_area.dm" diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index be1120e13cfb..d680a153227f 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -8,6 +8,8 @@ #include "../../mods/content/item_sharpening/_item_sharpening.dme" #include "../../mods/content/anima/_anima.dme" // include before _fantasy.dme so skill overrides work #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/content/undead/_undead.dme" + #include "../../mods/content/biomods/_biomods.dme" #include "../../mods/pyrelight/_pyrelight.dme" // include after _fantasy.dme so overrides work #include "../../mods/content/blacksmithy/_blacksmithy.dme" diff --git a/mods/content/undead/_undead.dme b/mods/content/undead/_undead.dme index 2068815dbd2f..7e8632adb2f8 100644 --- a/mods/content/undead/_undead.dme +++ b/mods/content/undead/_undead.dme @@ -5,8 +5,8 @@ #include "overrides.dm" #include "skillset.dm" #include "traits.dm" -#include "mods\undead.dm" -#include "mods\undead_skeleton.dm" -#include "mods\undead_zombie.dm" +#include "mobs\undead.dm" +#include "mobs\undead_skeleton.dm" +#include "mobs\undead_zombie.dm" // END_INCLUDE #endif diff --git a/mods/content/undead/mods/undead.dm b/mods/content/undead/mobs/undead.dm similarity index 100% rename from mods/content/undead/mods/undead.dm rename to mods/content/undead/mobs/undead.dm diff --git a/mods/content/undead/mods/undead_skeleton.dm b/mods/content/undead/mobs/undead_skeleton.dm similarity index 100% rename from mods/content/undead/mods/undead_skeleton.dm rename to mods/content/undead/mobs/undead_skeleton.dm diff --git a/mods/content/undead/mods/undead_zombie.dm b/mods/content/undead/mobs/undead_zombie.dm similarity index 100% rename from mods/content/undead/mods/undead_zombie.dm rename to mods/content/undead/mobs/undead_zombie.dm diff --git a/mods/pyrelight/_pyrelight.dme b/mods/pyrelight/_pyrelight.dme index 8310c9ab4569..ffb1b4057f8e 100644 --- a/mods/pyrelight/_pyrelight.dme +++ b/mods/pyrelight/_pyrelight.dme @@ -20,8 +20,5 @@ #include "plants\plants_fruit_template.dm" #include "plants\fruit_subtypes\nightweave.dm" #include "plants\plant_subtypes\nightweave.dm" -#include "undead\undead.dm" -#include "undead\undead_skeleton.dm" -#include "undead\undead_zombie.dm" #endif // END_INCLUDE diff --git a/mods/pyrelight/datum/wyrdling/ears.dm b/mods/pyrelight/datum/wyrdling/ears.dm index 321bc65ada0d..278dd93c7dba 100644 --- a/mods/pyrelight/datum/wyrdling/ears.dm +++ b/mods/pyrelight/datum/wyrdling/ears.dm @@ -1,31 +1,2 @@ -/decl/sprite_accessory/ears/wyrdling - abstract_type = /decl/sprite_accessory/ears/wyrdling - icon = 'mods/pyrelight/icons/wyrdling/ears.dmi' +/decl/sprite_accessory/ears/biomods/animal required_traits = list(/decl/trait/wyrd/wild) - accessory_metadata_types = list(SAM_COLOR, SAM_COLOR_INNER) - -/decl/sprite_accessory/ears/wyrdling/animal - name = "Animal Ears" - icon_state = "ears_plain" - uid = "accessory_ears_animal" - -/decl/sprite_accessory/ears/wyrdling/lupine - name = "Lupine Ears" - icon_state = "wolf" - uid = "accessory_ears_wolf" - -/decl/sprite_accessory/ears/wyrdling/fennec - name = "Fennec Ears" - icon_state = "fennec" - uid = "accessory_ears_fennec" - -/decl/sprite_accessory/ears/wyrdling/vulpine - name = "Vulpine Ears" - icon_state = "fox" - uid = "accessory_ears_fox" - -/decl/sprite_accessory/ears/wyrdling/antlers - name = "Antlers" - icon_state = "antlers" - uid = "accessory_ears_antlers" - accessory_metadata_types = list(SAM_COLOR) diff --git a/mods/pyrelight/datum/wyrdling/mask.dm b/mods/pyrelight/datum/wyrdling/mask.dm index a2e8e2e6df0b..a4195e91a765 100644 --- a/mods/pyrelight/datum/wyrdling/mask.dm +++ b/mods/pyrelight/datum/wyrdling/mask.dm @@ -48,37 +48,6 @@ /mob/living/proc/copy_wyrd_eyes_color(new_color) return -/mob/living/simple_animal/proc/get_default_animal_colours() - return - -/mob/living/simple_animal/passive/fox/get_default_animal_colours() - var/static/list/default_colors = list( - "base" = "#ed5a20", - "markings" = "#efe9e6", - "socks" = "#36221b" - ) - return default_colors - -/mob/living/simple_animal/passive/deer/get_default_animal_colours() - var/static/list/default_colors = list( - "base" = "#b39161", - "markings" = "#3a3329", - "socks" = "#ddd5c9" - ) - return default_colors - -/mob/living/simple_animal/passive/rabbit/get_default_animal_colours() - var/static/list/default_colors = list( - "base" = "#e6e5da", - "markings" = "#c8b1a5", - "socks" = "#e6e5da" - ) - return default_colors - -/mob/living/simple_animal/proc/get_default_animal_colour(marking_type) - var/list/colors = get_default_animal_colours() - return LAZYACCESS(colors, marking_type) || COLOR_BLACK - /mob/living/simple_animal/copy_wyrd_fur_color(new_color) if(!new_color || new_color == COLOR_BLACK) new_color = get_default_animal_colour("base") diff --git a/mods/pyrelight/datum/wyrdling/tails.dm b/mods/pyrelight/datum/wyrdling/tails.dm index 0511e0f2a98a..278dd93c7dba 100644 --- a/mods/pyrelight/datum/wyrdling/tails.dm +++ b/mods/pyrelight/datum/wyrdling/tails.dm @@ -1,69 +1,2 @@ -/decl/sprite_accessory/tail/wyrdling - abstract_type = /decl/sprite_accessory/tail/wyrdling - icon = 'mods/pyrelight/icons/wyrdling/tails.dmi' +/decl/sprite_accessory/ears/biomods/animal required_traits = list(/decl/trait/wyrd/wild) - accessory_metadata_types = list(SAM_COLOR) - -/decl/sprite_accessory/tail/wyrdling/twotone - abstract_type = /decl/sprite_accessory/tail/wyrdling/twotone - accessory_metadata_types = list(SAM_COLOR, SAM_COLOR_INNER) - -/decl/sprite_accessory/tail/wyrdling/twotone/skunk - name = "Skunk Tail" - icon_state = "skunktail" - uid = "acc_tail_skunk" - -/decl/sprite_accessory/tail/wyrdling/twotone/vulpine - name = "Vulpine Tail" - icon_state = "vulptail" - uid = "acc_tail_vulpine" - -/decl/sprite_accessory/tail/wyrdling/twotone/tuft - name = "Tuft Tail" - icon_state = "deertail" - uid = "acc_tail_deer" - -/decl/sprite_accessory/tail/wyrdling/twotone/long_tuft - name = "Long Tufted Tail" - icon_state = "easterntail" - uid = "acc_tail_eastern" - -/decl/sprite_accessory/tail/wyrdling/horse - name = "Horse Tail" - icon_state = "horse" - uid = "acc_tail_horse" - -/decl/sprite_accessory/tail/wyrdling/fantail - name = "Fantail" - icon_state = "fantail" - uid = "acc_tail_fan" - -/decl/sprite_accessory/tail/wyrdling/wagtail - name = "Wagtail" - icon_state = "wagtail" - uid = "acc_tail_wag" - -/decl/sprite_accessory/tail/wyrdling/mouse - name = "Mouse Tail" - icon_state = "mouse" - uid = "acc_tail_mouse" - -/decl/sprite_accessory/tail/wyrdling/straight - name = "Straight Tail" - icon_state = "straighttail" - uid = "acc_tail_straight" - -/decl/sprite_accessory/tail/wyrdling/spiky - name = "Spiky Tail" - icon_state = "ztail" - uid = "acc_tail_ztail" - -/decl/sprite_accessory/tail/wyrdling/fox - name = "Fox Tail" - icon_state = "fox_tail" - uid = "acc_tail_fox" - -/decl/sprite_accessory/tail/wyrdling/wolf - name = "Wolf Tail" - icon_state = "wolf_tail" - uid = "acc_tail_wolf" diff --git a/mods/pyrelight/undead/_undead.dm b/mods/pyrelight/undead/_undead.dm deleted file mode 100644 index e71e26b89f52..000000000000 --- a/mods/pyrelight/undead/_undead.dm +++ /dev/null @@ -1,27 +0,0 @@ -// This is included in main code due to the invasive overrides needed in human life processing. -/decl/trait/undead - name = "Undead" - description = "Your body is dead, but remains animated through some supernatural force." - levels = list(TRAIT_LEVEL_MINOR, TRAIT_LEVEL_MODERATE) // Moderate means skeleton, minor means zombie. - -/mob/living/human/ssd_check() - if(has_trait(/decl/trait/undead)) - return FALSE - return ..() - -/mob/living/human/get_movement_delay(travel_dir) - . = ..() - if(has_trait(/decl/trait/undead)) - var/static/default_walk_delay = get_config_value(/decl/config/num/movement_walk) - . = max(., default_walk_delay) - -/mob/living/can_feel_pain(var/check_organ) - return !has_trait(/decl/trait/undead) && ..() - -/mob/living/human/get_attack_telegraph_delay() - if(has_trait(/decl/trait/undead)) - return (0.6 SECONDS) - return ..() - -/datum/skillset/undead - default_value = SKILL_BASIC diff --git a/mods/pyrelight/undead/undead.dm b/mods/pyrelight/undead/undead.dm deleted file mode 100644 index 75b4d41e11e0..000000000000 --- a/mods/pyrelight/undead/undead.dm +++ /dev/null @@ -1,40 +0,0 @@ -/mob/living/human/get_movement_delay(var/travel_dir) - . = ..() - if(has_trait(/decl/trait/undead)) - set_moving_slowly() - if(istype(default_walk_intent)) - . = max(., default_walk_intent.move_delay) // no runner zombies yet - -/mob/living/human/proc/grant_basic_undead_equipment() - - var/species_name = get_species_name() - if(species_name == /decl/species/human::name || species_name == /decl/species/hnoll::name) - var/pants_type = pick(/obj/item/clothing/pants/trousers, /obj/item/clothing/pants/trousers/braies) - equip_to_slot_or_del(new pants_type(src), slot_w_uniform_str) - - var/jerkin_type = pick(/obj/item/clothing/shirt/tunic, /obj/item/clothing/shirt/tunic/short, /obj/item/clothing/shirt/jerkin) - equip_to_slot_or_del(new jerkin_type(src), slot_w_uniform_str) - - if(prob(30)) - equip_to_slot_or_del(new /obj/item/clothing/suit/armor/forged/banded(src), slot_wear_suit_str) - else - equip_to_slot_or_del(new /obj/item/clothing/suit/armor/crafted/leather(src), slot_wear_suit_str) - if(prob(20)) - put_in_active_hand(new /obj/item/bladed/broadsword(src)) - else - put_in_active_hand(new /obj/item/bladed/shortsword(src)) - put_in_inactive_hand(new /obj/item/shield/crafted/buckler(src)) - return - - if(species_name == /decl/species/kobaloi::name) - - var/pants_type = pick(/obj/item/clothing/pants/trousers/braies, /obj/item/clothing/pants/loincloth) - equip_to_slot_or_del(new pants_type(src), slot_w_uniform_str) - if(prob(75)) - var/jerkin_type = pick(/obj/item/clothing/shirt/tunic/short, /obj/item/clothing/shirt/jerkin) - equip_to_slot_or_del(new jerkin_type(src), slot_w_uniform_str) - - if(prob(30)) - equip_to_slot_or_del(new /obj/item/clothing/suit/armor/crafted/leather(src), slot_wear_suit_str) - put_in_active_hand(new /obj/item/bladed/knife(src)) - return diff --git a/mods/pyrelight/undead/undead_skeleton.dm b/mods/pyrelight/undead/undead_skeleton.dm deleted file mode 100644 index fbe12dce0511..000000000000 --- a/mods/pyrelight/undead/undead_skeleton.dm +++ /dev/null @@ -1,58 +0,0 @@ -/datum/mob_controller/aggressive/skeleton - -// SKELETONS -// Immune to blind or deaf, but weak to physical damage. -/mob/living/human/proc/make_skeleton() - set_trait(/decl/trait/metabolically_inert, TRAIT_LEVEL_EXISTS) - set_trait(/decl/trait/undead, TRAIT_LEVEL_MODERATE) - - if(istype(ai)) - QDEL_NULL(ai) - ai = new /datum/mob_controller/aggressive/skeleton(src) - faction = "undead" - - if(!istype(skillset, /datum/skillset/undead) && !ispath(skillset, /datum/skillset/undead)) - if(istype(skillset)) - QDEL_NULL(skillset) - skillset = new /datum/skillset/undead(src) - - for(var/obj/item/organ/external/limb in get_external_organs()) - if(!BP_IS_PROSTHETIC(limb)) - limb.skeletonize() - - for(var/obj/item/organ/internal/organ in get_internal_organs()) - remove_organ(organ, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE) - qdel(organ) - - set_max_health(round(species.total_health / 3)) - vessel?.clear_reagents() - SET_HAIR_STYLE(src, /decl/sprite_accessory/hair/bald, FALSE) - update_body() - -/mob/living/human/skeleton - skillset = /datum/skillset/undead - -/mob/living/human/skeleton/post_setup(species_uid, datum/mob_snapshot/supplied_appearance) - . = ..() - make_skeleton() - grant_basic_undead_equipment() - -/mob/living/human/skeleton/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/human::uid - . = ..() - -/mob/living/human/skeleton/hnoll/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/hnoll::uid - . = ..() - -/mob/living/human/skeleton/kobaloi/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/kobaloi::uid - . = ..() - -/mob/living/human/skeleton/meredrake/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/grafadreka::uid - . = ..() diff --git a/mods/pyrelight/undead/undead_zombie.dm b/mods/pyrelight/undead/undead_zombie.dm deleted file mode 100644 index 4a06c7ee5804..000000000000 --- a/mods/pyrelight/undead/undead_zombie.dm +++ /dev/null @@ -1,84 +0,0 @@ -// ZOMBIES -// Dead and rotting, but still mobile and aggressive. - -/datum/mob_controller/aggressive/zombie - -/mob/living/human/proc/make_zombie() - set_trait(/decl/trait/metabolically_inert, TRAIT_LEVEL_EXISTS) - set_trait(/decl/trait/undead, TRAIT_LEVEL_MINOR) - - if(istype(ai)) - QDEL_NULL(ai) - ai = new /datum/mob_controller/aggressive/zombie(src) - faction = "undead" - - if(!istype(skillset, /datum/skillset/undead) && !ispath(skillset, /datum/skillset/undead)) - if(istype(skillset)) - QDEL_NULL(skillset) - skillset = new /datum/skillset/undead(src) - - for(var/obj/item/organ/organ in get_organs()) - organ.die() - organ.germ_level = INFECTION_LEVEL_THREE - - // die() sets to max damage - for(var/obj/item/organ/internal/organ in get_internal_organs()) - organ.set_organ_damage(0) - for(var/obj/item/organ/external/limb in get_internal_organs()) - limb.brute_dam = 0 - limb.burn_dam = 0 - - // Set this so nonhumans look appropriately gross. - reset_hair() - if(get_bodytype()?.appearance_flags & HAS_SKIN_COLOR) - _skin_colour = pick(COLOR_GRAY, COLOR_GRAY15, COLOR_GRAY20, COLOR_GRAY40, COLOR_GRAY80, COLOR_WHITE) - SET_HAIR_COLOR(src, _skin_colour, TRUE) - SET_FACIAL_HAIR_COLOR(src, _skin_colour, TRUE) - - var/obj/item/organ/external/head/head = get_organ(BP_HEAD) - if(istype(head)) - head.glowing_eyes = TRUE - set_eye_colour(COLOR_RED) - - for(var/obj/item/organ/external/limb in get_external_organs()) - if(!BP_IS_PROSTHETIC(limb)) - limb.sync_colour_to_human(src) - if(prob(10)) - limb.skeletonize() - else if(prob(15)) - if(prob(75)) - limb.createwound(CUT, rand(limb.max_damage * 0.25, limb.max_damage * 0.5)) - else - limb.createwound(BURN, rand(limb.max_damage * 0.25, limb.max_damage * 0.5)) - - set_max_health(round(species.total_health / 2)) - vessel.remove_any(vessel.total_volume * rand(0.2, 0.5)) - update_body() - -/mob/living/human/zombie - skillset = /datum/skillset/undead - -/mob/living/human/zombie/post_setup(species_uid, datum/mob_snapshot/supplied_appearance) - . = ..() - make_zombie() - grant_basic_undead_equipment() - -/mob/living/human/zombie/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/human::uid - . = ..() - -/mob/living/human/zombie/hnoll/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/hnoll::uid - . = ..() - -/mob/living/human/zombie/kobaloi/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/kobaloi::uid - . = ..() - -/mob/living/human/zombie/meredrake/Initialize(mapload, species_uid, datum/mob_snapshot/supplied_appearance) - if(!species_uid) - species_uid = /decl/species/grafadreka::uid - . = ..() diff --git a/nebula.dme b/nebula.dme index c725192ab5f7..73e32e4b78ae 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4107,7 +4107,6 @@ #include "maps\~mapsystem\maps_unit_testing.dm" #include "maps\~unit_tests\unit_testing.dm" #include "mods\_modpack.dm" -#include "mods\pyrelight\undead\_undead.dm" #include "mods\~compatibility\~compatibility.dm" #include "~code\global_init.dm" // END_INCLUDE
+

20 October 2025

+

MistakeNot4892 updated:

+
    +
  • Crafted barrels will need barrel rims forged if the forging modpack is in use.
  • +
+

29 August 2025

Elizabeth updated: