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 0df866c15b7..4d59d0f23f7 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 7275277cb13..708f3dbadf3 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 00000000000..a9ef717b7bc --- /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 b7d1221c081..25d655eb530 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 cfc424bd565..2583aa940a3 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 1c81acd2e27..6b3c62d1249 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 36fc54d2f3f..b0ab2d79e09 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 ee1eba20b7c..b9100b54ba3 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 b12dd686d78..ee93934ea51 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 dcc3343b887..83853249985 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 49789e11e9a..0d9165d972f 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 5f03a9d4ba7..0a6de242520 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 6297ef140f0..5268d3e3a38 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 4bc3d51b6f4..68df55bfa2a 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 fe150c173d2..fe1e20a8cfc 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 104617710a6..9af027725ba 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 114a6ae96df..51a5131e92d 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 f3784b1c16d..bfa45de4cb5 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 c22ef2c4ab0..22e04658b19 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 f5e9ac99fa3..c635697b7af 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 4855cc37b22..137847f0313 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 ebeef2b276a..5400a5e174c 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 5a4d60f7f62..03616164955 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 da7666b68ce..2d7d84aa6b7 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 b487dfc897c..e72e3798f8c 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 1785b37ecb5..72c7e11cdff 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 b56da846f44..969dd3dac64 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 3b5321fdf4b..15cddd991fc 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 ca95cf968b9..a74d6a20a28 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 4d59d0f23f7..0339f9ce702 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 708f3dbadf3..89740105196 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 a9ef717b7bc..62648417633 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 25d655eb530..6f6cb10deb7 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 56ef6ac56bf..587bbe766db 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 a3560b8c8db..4449a9dd44a 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 74669d031c1..10a8d5488a9 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 66e5cee66f8..19352222a15 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 4d8d462e7a9..cb78bef6677 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 1ccf80abd71..c4bcfcd61a8 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 9d5a6b626ac..899f3983cb3 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 411ef21b8d3..58a54cc64f0 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 16df5f3e9d9..9d3aa0a558a 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 a4c908ce377..cf784259590 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 13fbb9c4b12..30150ba50d4 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 9351a57a678..dc523a800a1 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 dae85f046cf..efcdd053605 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 79a6b2c6d3a..77c6de05aef 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 4668690ed07..8d9c0495340 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 d47a001a09d..cca1b41781d 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 4981010ff90..646d3271d4f 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 ff34e540ae8..b8848b94ee5 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 211bb4aa833..c5c5cac0f94 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 ab98bd7f708..76d0671080a 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 0261df5f22a..69dafd229b1 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 d80c7b18d96..5f96d95191c 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 81afee9709b..f5ed1e294bf 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 9cc85f9666d..43c5ed43367 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 2aeb3f12d29..129c5b08e97 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 aea14459d2e..f1bf69ddda7 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 f08650be723..7dda2d9ff4c 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 a25c16112a4..2a76b49434c 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 83affb57b56..ee4834d3cee 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 1ee33475b72..0d703c96b6d 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 272d2994851..1ff78b8cade 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 3b9ba99954d..c503f8dbd57 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 e5b68a7fe20..0ffc162ec9a 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 45318e7f6b9..8b1dd94704b 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 b5ae8b072cd..102a1b78168 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 f98b8e3b895..8f79725b6aa 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 05ce95d98f9..5230d809f5a 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 c5b77f4f34c..ef113b8ed76 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 bdad0e37088..03f9624c6d0 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 3ff3588e2d8..bdbac519b57 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 ac4c19eb0c5..cc40f4f674a 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 e6ba0c32dd3..3fa27c6e3b3 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 c189bc9b389..f109b52426b 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 42df960f627..470059b9b2b 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 46eb1efd5bf..157dce06268 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 2fb27aadac3..cdf92f1538d 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 152355b9aab..7386a3cd58a 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 9db2e97943c..9b9da51a4ac 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 00000000000..3725ae8b5d1 --- /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 10e61aa1ff0..224d0cdccc5 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 9674fb2e47e..2cd7d48af02 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 7e476912b24..942d9d9807f 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 cdba384cdf8..bcf8a692236 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 285f4fc05c5..a9a61db02d4 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 6d5b6f65e48..d588df659e2 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 f7a22eaf01f..7f485c20967 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 00000000000..fb0efb77882 --- /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 5f96d95191c..d6e536822aa 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 9876826f1ff..665b85cc7ec 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 ee4834d3cee..42b521da443 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 0d703c96b6d..d54f9cdb73f 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 fb6723cce50..93f116effd9 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 9664671e836..e9de8a41e92 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 72810edb7a4..8dbf88ea752 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 5b221ad03d6..4f03605d61d 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 70dd9469abc..12f2db8dbf2 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 00000000000..01b2c19da59 --- /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 1560d1118d2..fdff0e1d2fe 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 5261f06a069..aa34afe4499 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 2c20605a6b1..73805c93967 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 e259fa26625..0207c648c6e 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 ded45374bd9..dbadf5961a7 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 537de7a311c..13861abcc41 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 cdf92f1538d..cbd3e878fa5 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 93f116effd9..abc090e244d 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 00000000000..92d8b1c3d51 --- /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 2d7427f03d3..72413b05d27 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 cbd3e878fa5..415212605f4 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 8483c234674..4b506210b57 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 4e09933a75e..55d33d3e294 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 49be21fa79f..710db635acf 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 a9d5c479118..afd7fbfe51a 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 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 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 587bbe766db..b18e5bd1681 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 4449a9dd44a..b88f26c3fe6 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 7c527182f6f..b49e271fc03 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 a03d9f836f0..035296bd59a 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 e69de29bb2d..36c945ed89e 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 2d7f45c72ee..a59b23872ae 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 e69de29bb2d..00000000000 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 8b137891791..00000000000 --- 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 7c527182f6f..5f7fb8572ab 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 5f7fb8572ab..76e981eed75 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 4966ef550fe..cca8764cec9 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 cc0a53a8147..6b070b63a7c 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 bc5ece1b759..7b8b9c1b9fd 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 4ed65a929f5..32cc1f3024f 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 6b070b63a7c..e6bc246c0f1 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 7c527182f6f..fac8e40fce3 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 005f27ca346..34843e14fd2 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 15cddd991fc..7c3a7e7faea 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 19352222a15..0f52a584883 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 30150ba50d4..14b782b9dba 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 2a76b49434c..2fa3d828f5e 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 ee4834d3cee..39076a2ae10 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 0d703c96b6d..2932af289c5 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 03f9624c6d0..f476416e573 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 00000000000..076dbeb3335 --- /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 00000000000..33a9fe364e3 --- /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 39184fecc63..a9c5f84cc99 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 00000000000..8c596a52375 --- /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 7c527182f6f..e22351f4639 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 56e7c788416..13bf81ae5e2 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 c877965c4cc..bb76b11ed1f 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 55d33d3e294..aef3b2e9a27 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 33a9fe364e3..00000000000 --- 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 8c596a52375..6923213ab2b 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 00000000000..dde35d626cf --- /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 a9c5f84cc99..0f2f5741a62 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 00000000000..eb0b410aab8 --- /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 067ee2b484b..a580651cb97 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 00000000000..1e0046ef3fb --- /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 00000000000..c3b745ee660 --- /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 00000000000..380a9d5a156 --- /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 df209e9cc0d..0292a67ce84 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 14d4978bf7e..a415018a29c 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 e22351f4639..393a9424259 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 e1b85dc1b3f..00000000000 --- 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 3a0b89f448b..7a546009a86 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 9589372d005..3ae62f5f686 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 73424c45322..0e987ec6aa2 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 d3755dfe55e..603cf2d6433 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 03464a086a4..feac5e54b58 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 978dbebe0d6..0ec35cdf1ac 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 3421d65d10f..806ddef8d9a 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 00000000000..4dca740435d --- /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 253a1dd7332..8e9524336b1 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 515d9d57d21..3070d060a9b 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 4f7a4e24567..4911ec5cedf 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 6de02a927d2..b1817d41139 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 4cafbfe2e10..39c8df5d9a6 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 52d46b1e139..2ad67edc3e0 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 00000000000..37cb8779428 --- /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 00000000000..2068815dbd2 --- /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 00000000000..a42625998f7 --- /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 00000000000..bc39f27a4e5 --- /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 00000000000..8d98b7919d0 --- /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 00000000000..38e0a6f9a9a --- /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 00000000000..479d7cfe550 --- /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 00000000000..06d4f34e957 --- /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 00000000000..c128e102020 --- /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 00000000000..59425c43f46 --- /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 b0abba63bcd..090e04dca00 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 00000000000..ef255509e96 --- /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 84f09c18255..261d4d01807 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 00000000000..4cabef2465e --- /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 4d03a556792..95451bc35a7 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 zcmYLw2UJtb^KcLq%cF}(SEMK?s60SwK*2(b)F>sWG^GXU{i3LVC`c2KD!m7k-W8-u z?+FlkNeH0_2uZ#h-|v6Ed(O?>KD#rsGqXFB$y&zAI>yf;3_r_6ca8%xMWQb)of1z) zy0YwQ#Zb9C!-~1XRk0Jd2qXPO%NXhyaf&+N##mRZ_|0nS$z!=kC)x#k8Ju_$@^$#u z3L}Z#dvh+m-|yX9@ng?FC&8JY>8PqGWXi=EJiqy*H~y5ULiCa(Pn)qyaTq)h`6P|n z&Dc0*-1Ahrgp?{wRxL4!w{8B(^^rK+?57z(5_K}|h8Kx@K<$RpRa&#kSY zH#a{>4QOcS2V2UfAIk`o{SdUq@p@4_{*)_|%@cMFbsVX^zh&)4ozi`{F}x3d;JxwK z^Kq@JvFy+gv1I*83`5EVApPQ0&0Ywuw*qQZiNEnv!_v(u^Yan|T`dmisrYo~E0fw= z2nz&qCho8%loawH#07dGoD|{>w2Z$m_8G@I54TwAtUpp*2B1W_GuDC-AqIX3{*ayt6TTOUX?dou$> zP5p!GDX&ZZbuHS6y2K#&Lzk(MH_Ek$8R(cpeM{sw~ zt_JM1-WsX%0+8(NPpVzMIr5riEWTqNUmA3qGAfq(bQ)sarSU@c=kEg~>Vg-UX>u($~}* zXT|9hTCKwBf<1dbthO?@BlkyepT5r&qiXuZ^{r3|)`BmOv=RC&GASN8&X~BHr+*Qb zVNu^xh~rY3dNxYfC~RNa^CA`QHWABgQBAE6z#iZcl<#Z77jItgZ)z#tQWe?(PG%ZJ z(1@bE7@Dn2hPCPTx;l#Z5~bwV4|RN)Jw_@Yt3XsbWzd=8-GNsFGrQ9E4ZE3xC~wQN z--YyfVjTBp$pfOkm1)?JQr&;@&fLE2@oC5{MwVD$jOA=lcR6o0^~oV-+{XA$r4^~L4HVxOl}LPgZagFgOkp=9IBD6Mki+JR5Ma~2e1@T?ztZYIiX z_-ALrD)Ji_#ltoNR&7<_?8_dfePgo`Z`QlACl&FY9y*YVmd~2Fl?zCLA=&S5>@-OI z0sh7GoZA*EQef6GYGJEJ z*e%YH{QYZBR7g%QH*=v54v`Qyb?fPR zpVuKz1l&iR{B)u*$N((m-ktsMIz;RME09%Oe6m(FHiWdVJZE*NX z5oRwT!LjOh8g;F+I>LUiIzkJ6%I*X|kK1km*bb5|<#sX^B~?9hEWe~gPkA&$^K7E5 zgGnCzrw1L90S3Aw-y|!?8q?-sB%EO*n#|>5{jro80tw1H+@Fu+EG!-w8IgTsmk@BY z*)Ht*G<%$eRLyh3@W(9d>CSPu(_!?#z*IVU1PYmepP12NGx1-qK6_vU!4{@`PEUl6 z-KIARRr;nB*IVlp8HQD*3l0cG_<8r2>y_FaVf506uH=;KqwFH8Z$a4L!^l!*@izf^ z7xT>C2H+i+0<)p5%KE~>HkwR=7$d3FVqXxE8;=>7AQv@0e3%3AqPD}<%)sPMMabLK zz1K-B7|Fib8Lu5+L*0fOou4RSfIQkbHKW#Xpx*MX`B{NUJjl{gyKx77uqROu4jxB+ z;D8 zC*+%2@W%LCc;Ii@y~+8T(Q%UCMjF<5b8&6Pxp1H0`DK-wmq`wlm=6TJ&s~JRSf6e% z)6npo_H@X5lWQ4b8E=`}%O<#Yli`*o$W#}tB_!tJv*L}0X+QM23^!px()p!zXV$y8 zPK8Dcrz<#5-u9s$EZev)&yRE%3%#F{zx>gB_nUmp_9pINIW7Lxd|O!PG~4>GgawJE zuq~RAxw4Tl_}2I?_5u5M>otVhgyux4<0X=g<;OQJ_i^w3()UffEry0bnsdGjlLEP( zJbEp=6!v|JM4$9R%*9eG??nS7_@cnEZ_(lJ&xUA<2>M=+Hwm`vYhi_6n{WFR)Aor^ z+@7`eI=IK-sa`Jf=4VT4al0_ReQcfon_s!2LC{)2V*#BitjPF1OfI^?B{uJJpFDJ8 z>V4h8@v{Za7)sTYYS6EF%Ma_cG7DHvG=BH4_iB9Fay{!VyxB@inMUkC5|wXX6geB&mbxZw=WPkK#VM&T{~)O5c2g_w&q9RGTxUE5HG9Z4S7smPD{ z0tp0GZ8wjC%mcb%<^M#4$@xq3i{j9!oBb%mLNd{i*0A|r!}4fj+4PhSoCF~2)hlXg zjf&)Fb+k$hQxLk^l}*g`>2K%X-g^L&C;*@hhKC(>`rK8*)~kQ z*A^a@vTQWBKRa7VM%GbkCx^a<}6b+hQF$~s2YYE=m6 z+Syr9UH!P^&?Qb$#H2vcbKNmxqTXX|@(D{=TtT6#dG?3!@QUNsoKA1Uv`O-0(p$W9 zJGgD%8!)k2)V8xRn?m0beghWLUAP*gb~u#s1anr?j&G#uNW()yRojGg7&f|*g2T`# z4s*oH7R!=oyxuxY%#nokB(GMV`&Vbg^wcb-{RrbA{*RVsetg%jGU+Z2kUI)>7w0~u zY}c%qGLQhf+GTkk4<=!#aV3QLQs*zJG2HL+u_?7yE_fublKHi5OMeS`A|6t~G3Tu^qeLjrI zggsxj{Cy&jUjsbxN(!NVeI@i4DUhH)B3PQ;tt_Wfi0$uL1SEuo zhjL-i4I;}LCK}4-)baU}u<+KPHXtoZZE#QPs$snei(U4~h%LCOO0|;u2rD?LC}%I6 z_w`Impc#Gj^j8c`Kvy^jSKm_~E3wFy=uWGe05Akb$gTOg*Kmsr4iVk|AO_Cg?PB^+ zQx0r1dg8=mmO1NVGzlE;*Cl5<(wg3^ZQ&eL14^gX7&E6dNxAZ^7Q7y6b$(TtcN6fdf>YWSSw1hw&g!)uTvPUHx zTDAR@j;GBlLa#}ix@Yd-Mzn4FQm@nXJEFliY`MZ|oyAp;_-lyz$CZu~!pmtu zBR#FRXH6UDXw7U67jTa_0jit@yWF&#^+Z~#43obYUKSYn;@}pv5*pHN^5iJ8pqcUc zpE{LHwxrd*6QZ)-;i2Fd-oQrVU5x^bEaOq}%X8v4=V)WBbDbFI!9vI!^gf#xujC8_ zGIJ5;xmvX3rC?zD&kNLZWbs+bPlThIpDeB8vW-oAFRmc2uzb|P-ce`o>PQ(a!Ne+T zY2HDK1t7RJ)2-o$Y|rg8xVPIRvb$QhwXzyfzIUD(H$&s0fX6f%8IrR8TNkg*OOB91MYN>r;o$|&-8$8K9#@Omj7=}; z?e!TEq$2fmY}blnhY$yettZP_J)l;M=)xfcaFFe0*Wajf7QC-S-3g36qz^ z)08!pi7Y&~H+CtrX2(urg@wh_jy_)l=Ssuob~L|6X}czg9b)FaVDEgJEcv)`VnK{R zo^d`r>pADtnG0oM8CuLIt+?B-SZQh+NI0ihUx^bI)zpl7*`6b1Q5zcCv8t=|q(np} zFePwGF_D)qCP2&X=Zxw!ZbY)EJf(P~5Z>|TXFz!f2Yr%(<7VY6_t;-n&@ZsmD63#6QRb>N)kyw@N59CzQv7W>6e5)Y5Z9oy2_GrU~{E^4#+gKQ(}{O+G7 zL{ngjxj^Pe<5u!=mjp7S_e_HuvOoZ%2iUxq&wI)0^R$_nV^6!^3R%1j2wrdr{>L7D zmtMJNs{8TNs_ICNVJ@emYzh}>$=niC-z1(O!F^c$1Fo!M&qiWt3tYsnKNXss#F-A< zof0|rZs6Ur^`d-_RSO;3rcGFeh5oyawT$4u-S2(jPg|Crz{u$orEr>f9-HbEr^iC` z>#(v1fy$u-JG7@gSrPd2^2WWe&?90#cY%9kh_QV@AVqzcfJ<2Dmh_T&noxupxmnP+ zFB~ScQFs0pX)GxZyX(2fcVqd%Jo&45ox6#!aEiR#ttofCBSlKB$1PboF|tw8_wUe$ z-OxzZ-O~wQ06}709HsNIA9yf&^nCg;7wa42FzpOhf0a^>5=r2#U9CloID?c${e$c} z4mALIKokvFklfd&xd7Wk7^4M5R)`1jvgq4cGa0ASw)pNSuFi~A@e;m z^|dmo3%fX|o@otCzLj5`HS7DrZL55VI!_^~p0BMLds0bITr#-C!N=D- z=BEfUXx4+QB3P880hcLw{P;MN>QE(Etf3)DSrSXNgM9218^=|jQ(5}dv(nObi&Eq7 z5JtPc8#7DM{$O%b>BTn{0d<2M=o{_qvf zVeBiKdiY|{XO?0{@pE@(^s)<=JnvV;e@Ytb^!TA_qW*5fm&ia;hD|p-P2Zw?79;=H|Z9UtA1KHA<-$DKK8?6rpL4Q3No!u>r$#yVq=!K{ng~I1GvVSIx<@E^Io!1^}>&bo+v$S=D7J=dS3oAjUuNRo3(b^sxi(yFj0$+V}Xv_1szZH@Nh%#2DPDYgLb zrxv0qZ?U$p{b!`sAqFj!LU9<%`ScNLmm^PeC&BNurO6Bp`9M@@JL_8a`Q(<<1IT-~ zsL6?lKQRyfH1#rWB#8f4o{=GJfC5sOW~g|}c82O=g$-T{?4}tZHngJ^ zSz*|h>i#^d9T?E%F64v}#Vl1kk_;(FxO~iTSgu#N&M8axq2C1oRg6mePC$cx1#uK% zMmrK1UEPkq_guUP5Amn2PK|&$Uqy5&puj}^X|3~6gyolqKv27~{!P);2=M0VHE@F` zZmg+&aa?;ySfGxb`7!}*bf3AxPE#%txzl{&7 z&&N)a^?Gv72<`{35;yMVo^>BJwXnEuCGWVSq0#0%z5*D-;dpxqck|OfN`@1QZLfdr zg2SeA8hvqcBSo5qFGn--zj%U7@Q4}pu_-^a)$5lj@8FePUHY*U)*hhSX~k*HSGj!g z;OQW=+5I8z$UzAL;DT8IK2H>6=bhCIUOB_&+hlbwtq2}(blql-@3KRTZ20O|fLWgn}%;2L4<=t~0 ze{QxvAWjP}-t{Zo#gBD+QMUuHu=cu-n5w#mnl=SCh#)bvs_6zzgmT3v#iazRtiGN2 zI|@<yr>9`#Pr*4r= zSPml$_UuK{?zN7B(<9Pu|1k>ZM5F$58RAK2_&b#j((y znwT@S_SAac+zNor*ALpZsL(?7|FapQp>?n38Grvh@~+gIjA$D=@{-X?vd~&SO09BucbD~*eXnwFv#)j zlEB-W4jlyr1@`{TG6EHXZhvmNPWvo(-epx0F*Y`q1*pn9{dfNs-E8OQeC&5B*Q0y1 zlW99%!ADaqC*%82@u#zPziN)mS>aN5t5lduECUgI@qd&0enKwKnoxdz6Rwn7?rGui zY4~YpG4rN>EV9&9_|7{ulo}iFNbbNI#0k~b51_L+HQ&1tBA_q$Iu^$uB%c`ODDd<0;?9^1B zvG-#+^X$aGYame=X_dTYgyqYDe6T69zV!L6k~mg@j0iruD* z*2ny>kdG(|;;sd`R@=wNr)nPx8G3(H-?`|@GQZ|qsDj;`IqS|(vu`V zb|CYN;_gjv6~q{yPCxWP*iM+gi5W-;ib=O;240`s@ClYOdNz%a%h_9TE_M>o*%4o% zGjh*zDhtTE*<&=^K&G%P?SE_>L}{YPjnkMyD1awjgYM#gj_#u* zPWC7{C-j3=K2OhIpbn`T_3YQeRzIphVyA2V8yL~=UN5Ix4yq(TLP7!@n~RI9w*t)m zPbb{~by6f9PR74XE{2Ys&$$Yx1!+I5U(NLWRy($TG*nl(x%_9xy&lpIYLO(M_CRLV z30+qhx{(wo#XZCZ=ia%3(n3 z5vWMol?Q5RRX3T|XfoW36u<~UQzX$qbu&hVo^gZR7w{|U_)(~_?juSi1uY6RFQ-jg zq^JV<;vB%w^BE|(`qe6f)y5%hp1gu66AB=G|N4MVttDM@8@6i&k zzNG-?5Hz%2v*@Q!y_BX^g~y8i2?cm^>7Yeb@vAZgY8f_SBWwT0bqvdz;09=N6zavK zp4!nId^yOO+Qa&MAOIVyr-;2UG%)hMSfP|M*$tzg%a;IzMGFANv{I6MSO~`!+zT z@c>7cDy+{`xm)7b38U@6F67Gx$d{D7H8NPsR7zxx2q!YEk%Jcp{enQ4<=$nXq1Sl! zEIe@KK)z^8V_~!qt7KDS{NbK{t{yqwHy@d%hTp4_v0Bnm@IW^We@v8dP%hDSt&^v2 zgqUIqbooT5^La~tow^ou-|2)=>z^lgr*x7Z4%1f@+QkQyX(Q`%D$Rt(P(cscxY#B@ z#zeM^(hWB)x};g<>Nld;f~-z6&Ao^L)uX=B!IImmNOF(D?W2vBY@h9=t*Q|5hZ6-S z|9-cZdKNcYSgTA7#g1w%0~U3!nvJL-0v3DJ@S_csk7x^@yvg$2?FanvVaLxkdk6wE z6RK>UDsOA}8+DwT$2XSK)nZY>_FHpxjf zaF_OtwY(#}0U>h2lrO;|_%C9b_O(*^71UC_=T2ipZ8W^5D%(UWrt&(Jf|9C@I$9SE zJ$Mi`!)}D=@<16|-`YOmuP<8c99SHoq^)Oj6+DY$P`KJS9m^Wmfwwj18r_|wISu{X zBPSP^8^Ip-!1WUYAmiRBLzVZmQvXep`*n*+$#d;9zU|YO=w83Y+ElW82jAghDrF0Oz(cniq zX;QULup3(ce1d23TS|x{=%t|x<{KAFVd|ha416js$IK?UfD)P&xL}CuJe!?*1>-TC zJIrYeW-9UYCT!P_Z?J{AZeXw|VrWNrZKcrDYCvD3k#nSmUj3AbLD^iG=P0^`j;wdK8xvQD?f`YR0lu)b9JIXj%J*$!)Ep!mC1nV^-po6Hpij z<#g=23y}}CU?2l~0fE@dukz^{{XPv`zvH3v=+&LGvS7Yw_*~m&|I1~ks)CX}Wq|^! zXTZ|SitS3XVtU1?J41Ei-hrpQ;)EKLrd8B2m&)@$qrx%q=~d95j(%=Uw?>W5y|L5@ z<2KAF=Bxb`ATdQz+o$^`IvP3|JN`7+5DN;&O3G?k^KO58=bN?gJb%&_Sidd88HZ_% zzON;9en|ax(fqgWB&d?!luHZqcbC~anC#(F@KZDUo^PQiO~B5b+M+0^zInGgys(at z>TkZvf)%#C)2P>ba^rFMm(+7Yww3xVgc{x>og#FdqFl{mFT#ao&*mKejRr|!s9ehW z+Pb-r$Jp9jg7syKnI8fG1n;(smSq}Ic3H1`JyPUHu6S~ki7oIXpgUp2#G<-<#oZSJ zCW6U|hWCIi&Ae$6_<2W~8BQF`)HKT^y!TLce~GEcH{YI__;!|0mzX+Z0VW449Sr|g zz8T(GKRw-6SmId%@S$qaGB>5ALXhmt3`b2Tr4t*!0dVP>EE{dZo=)Zl-%j9~1;_ee z_KIR~nf5$eEO#IZve%1`H!564 zdOoM3$cvU70Et|-f4_;j$a4w<+g*Do4qn_rrj)F8MVigkRkwJ8!Jq{Ane?D`Z~esT-MU44Cd8UB z>$-n_fUOyG!930}vsFp<7eQ1qc4YeS+}!Q8=?0AF=_g@xi|Dk#!~9J-FYgRz=+2{q z%>@Bh^_KT~Z#M)|^Um_h#R|cuFI5TozL)`I@za48ghRJ)hPBP|^6hnV;Fgd)vSn)&bi;U)7S0&&CR z%>j1&qmLTMBZ5xi$HqV?qZWrBLPd^YL0{oK%{#foWP5omf!Cm_*nFmSZ>VOD7BCYQ zsyw|Ju95CtZ^h)Xd*9(>@+m<|CpY5vX)~k6;Y5QPLSa9`S>-TBx*p$jQ+M}8z~ebT z3qth`LG_ouq~k=TKIP)2o+LmVw0-{}e6XbNEucZyh&bJ_sMG_9b`u*7v{OnxGJQTx zzmK@|S!yFJ^y7t_cQiCgs2z9odA1yO0vcbv3k^NaW#WNslFB*erKl-cpu!#{Y<9x> zis1XE{^vYO;+DnHGf(*@vdjCrh}Up$BnDC608&91ZMZa)qQ zaz`Xm@OI@--IH zZyqM!jmfkX4ImEg;q9y1%oARmgFrMm82C>q@Xhvd=?n33-|>=|lEv_Ha?{1(TUO9m zK4nA#^h8AS=m1}`HNXChsY0d^IOy5q&Effnz$tnXvJk=*vl(~+^tNyTYOf`)M?Ih- zlJoW?U+4?u=IxzzzD)PEoGTsV&^I{WP|7h9c%rymBlhE`>D!tWmM(w8hSK|uLp81z z9nP9bIKt;bg`=*#Glu$WM-jAwg6Z)=kTVuh8q!53p?i>=%cZ8Lf1YgXy3N?P+VKba z@vkfATn0%C_QNH`IU36VeDoF?|>d=T99A!_UjWTPB z*{9NiP`oqW4}Pi9Lolv9Rq`sGq6ytH^Nz4k##Fm>^+Oe7 z`bp`w8ZHo3p&ijn%toa5sr=uaB7bOqBb&+_f#8Z~yM=N$TS&)iyK1w17zCw6zU=ueaT~xt@r6=!m_dgm!7wYMoORr_=dJ-d_W{0M<0Vydj^Qb0 zOlz;gdBqw4fAcB>ih;#P%c8w<(oA+#8P1V|5S|J>!kbIn`H8N^b&+oxqBI^qWpxvlrjBx0~`giUi zYV;Fn;BVb@N+IR=!`M6BTS7-yZlP$4(EX@APo1~QoNe)8@{RSsIHNlLG=+BTZ=HcH zpH9g814zK(>bk>Da~#X5N_)QAq;Wsfo3skaw+A7JifKmb@M(+Tj;PCvv4(n4@9s)_ zZt;dr59Q_qBrISl21~t$wJb9*6S6%|GQ2P7leH7DY9ro$H6^8Ls-SiUCw0H#1!3n1 zSu!mq$t@k1;|1#<4WW1cDIRb&&5?pCr?h`Eg`;(zQGYntt!Q(1-?ughGyGkZgHg|Ix8|d<61F8F z-;vs5R0@}5gMgA}#}dv-41anU{Cu}+XDOboquVMQGe5sS|9!?n_wfK-DR%wVPDuke znJhtbrn9emItB!v=Mnc?WC6O( zF*TKE>G!>9dXMo2|+%e{d+~sGB+5|EVfRQ^&lc8%t*&%XtG@Bqq{K|NFzCmL;HwSk8 zJFY#~`wjj0E2zN3$0tw%+pJ^%b29(B-1!a`M;+Z$nXdZR8M?+`B)-&Cx-8_o0lH4< z&xK~um6%75Q2i(ldWE#Wpr@u~YyVZX_mb@G2URKQ+4JbEho7{QS zi@D%7bocvuX2qOA6GQy}Kz$CUw>c_37^g($1Lq?*-%Re+Mvk`8q<%Upy$F1~hiCo; z=DQX-u+9l&mg@I^hhG*6K}PL&IRTF@DJ%Gg^PkETd-Gy5*0K%&$ zvz+R@yHF#Fr=`5bx7*YAGcE1vdDq7fW({iJ{z~&^1!9lCD#hyePbcz9iKejd_m@8J z98D4I9hG=j`pW#e)8aqznRVsdtr8csl%Xz~wyaIEH*G4$BC?|K%s^MpBG(g|P}5%b z@_TXtL-YB+cuoFcd(@2xGtcTmOo#{ziv~xQ$mH495m>Uh^A{kz!<7zhe+QRIid{oxAs?(9j@^ByZ6p2)p+vFGgSxuN11al z1sCWRNHW9is>+e`UnqoB&siHqxik~dgJ$pFGx~K?+V9}weN`G1i++6vq%=rymwQqq z(K>5PrNqmr+BipyiKvsz{y{eY%`?JNxBEywcYfj5R*BW^j*I_WK>0#OwWv^3rLe@PNGuJJ-eU zi^@#b@Q-|>6l)!#%8A~|$~Sx>$|-nkMIWdp!iQgSBXV}fUL8=rDgkryh(apDZtYfOttCEU@mRLl<|?v1roIFNt_l4lXJaUao?-LkL1i#gS*S(s?Rq1 z5txWE(C@C4E3?o_KMLf69aJ2WMqvw>hmwOH#m~9Hyr~$INofpi9Y_lsrWs=PaPwn& z`}ay}Ra7(s0ISwhKKH|9`qE@n^wV?_g}Y1m^^rYAprw#355f`^zE$sW3XD5J?!~D7(TN!uVJnGg(e>Axjpqh^g(3>V<#f<=3Uze z!RvT=$ImRFFYMPLGv7kzK;~i$kBml15!vqGoI6DAMbWB%z3I@w{v$+^tm{Zfs?d(O z9q=f#v+hBi<7ZFCAbSzQ)pduEjV zKK~`*P3^|(@dk|IOpxj#%#a}mc^GaB{P~>t!?qKgu;Z85AG>^V9eUp|@S3FNf^?i6P@?lUT|{N8I!p`i^(VduAK87%^9^%zN~AaEt8+vWzNGEw!66 zQ(AGy8E4op?TdWvMQ2aDw1D%qZ0l+K5Oeu#?d3-em0RrYmKp!bHM-9NMj8tdV+a`w zt&8?%6)=L`i*<&yTRV=T!h?&GRAJ%4Z!NF3dWauAs733e+~NhY4x=AJJG#b}!61#$ zRpd!DDjidLllu?gjebfEZaK2cZ7E=FkWGn%yGhmQSa-f|r>LnefA6*?OgDsaEwVf$ zJOO4D3KL~_Q=GCA)kxPhju0_d7Fs@}JS%4t?M-X2($ zQK47Sv-D!>w)+v}dv^_mkpS;^8czr}yRW6*Lo2?lNj?H^+dtLJ>rPJ_zFNv#J2ecJE(Rp;`Y3pmjj+u=$ z{WodC!t=hC@JHLw5|YO^r_7R?ep%XT*4g4d8!4AG9dn{;QrLmC-jh!O1zy))0GT5`I&CmdzZi-S*#Lz^H&z)YCLcya z%%z(&YVL&)RQyN?PqO~F?=s=hGGhsH>~MNxjrO6RF zVP_`2CeJ2m^_SB{i9_=S@iKNzOH=OKJ-w(v@+flrqWqMq@PWmf)S^a$2=?r{<;iI;(t7h9 zZ^g?dC6B;+*BB?SDbZqL^<5Jhm9&+q;I{CZx>6m zClIxd3;aGy!b;N`D0^xqlricIug4^oHk+*~CcM>gIkKZ-3?Uh*dbpx)Sy)i8FlvU3 zJIyI3(x^JPmsjMl8SJ-J838BNR1*Ot%<5l4Rq#lh3dd%~sC zaL$plfVWy(uchmw;!Q@h{N1U0Vs23-Q~o*$*ASL9Kb|fDcS128)>3a$0RTapec956 zhmL#&6}%y@Z1hh__!ZjVHc0P0_n&no>G7~re->#GU_|!Vck)BrYw4y~x{3k=q;1sa z+k`773sbJs2KT{$4u_9np&cNjT9Z5UQ$L>bQHzL`^>c+DeE!q)hmvTQ8ihStk{9M^ zVtxw#slZk1`Zwqmp!1Tlk7!Lnffg9c7`-nc97Y7aLx}k@&|ei^-qT0`zv7j%fJ)<+ zv&1JdQO) z_6#MECy1{X)L-21X0CHUUtcWP(_Xz>b_|hr0yubg2=omNEeuOae*t$t5BlLv{ai^a zb`kjDpCkONR$3zM=s>cBnj3{fq$1ydHa32O2*#JFXW!0S|az|#}31d|$!*Lt7Jzp0m1D$k^6VStQ z;$m>D{_U@F4q_^Go^d{vXFK)#N-S(Tw-#SJ|9H8*^xC!ZJ{Nj9N4H`3#F1#^+SaE%&F+nhCfz5gA%v-dHuUnM%3*E6mG0Z0XrzXJS&l1$r z&o7cxNW7v<`66vd2h+M(EwZ5U4EH<7L2^!2t9#gw^{zr1 zedq7_G)z?;W1dk*a_;?iegF2CM@DSnEG9RTRsRBa>$^D;{oV(>r}vQ<9LJwpG zp9^X+s}^i*|D9xlUfxvIz5sd3AQ>}jVE_d6Gi^A-VEUB~f16&kd~#w#79MFL#`x+& z3+Wz8*SAod;14P%FtEAnBfw+&;o&G@^{V|w zy82&rMK|ic6i5)9MwiP+NWKPTG>22~8XEn_*Z5|MPm@2>r};hJ7?MUoXS8Bdy0eZ$xbq9V=3uha5ZqGr(9( zPXMf2frNz-;({mL_?u!R3KtgJ^~Nc>J^O}y3#G$S?~n+Jgqt-i7;hLULjUdY+@D^F zEA(8PMNsxCBqP_gUd57^&gea$x2@@19s7JxI71D|C+6Xka7Zy(opc=mHQ*$we!*m=>e<`m28GQ1@ z_cM)aUF_eKIy`MaJIAzPqI5w1m(ZhX^V9y4(~eGAqi(5A7MY*MHT28EepV$p*DWh! zOjQO=#<@Y;K5pntb;oO%M$_t2QiZu-sz0qtH*L>SeRS6L+OtaXvY9OZ0@Z&aG_82Vb|^xG?n#E(L|sNb|BDPWG!)W5j0f;<5gI zs*@P01<412z!&+O=_vFX$$BWOnyB1iym4c{d^r=>eJ?k(ki?JN=^Bauq}QpG_x=_C z8yw%~Ui!6D4dAxiMfX^(Pu9$7&D7I6M(zJ3+}!HeS&d)K^ZEHXeE6Ywib!PrPV^Uo zSv<%7(Z~W9va%9x7;&V!a%PskR-edTZGReZ{b!{9mYfx*rbUyc5e}yWfs}xM{UbX9 zx4$}5^lH&lei7k&V?sgwpY8?)Fh7u2>vhuf`AoW#rqIWn`b&7wk3H)R59><^xe@J`r5oHQiUIR0`lo00 zPy7FcmaLP<78dv7@d>PO7@>(maI5$R zpRC4?qrr$glK?k;5soBaH=Vm~CPYCX=$$YB)*9a+Wco2HV8oLR5w(aL#-ctGG4%k z{4>DuB6u&pJ-#zus3-ZN)~A05rm3%1FAFb_*Aq(l25N7Nt{jgQaGVIj`j{#*b7J*ztL5f%yCNXP@nnDUDd(tEut_ zX?7G7?Z-Yk_1wS_d6x2OVC2j7vRj+x^(3W~D?92UiWD&FF}%zv)Rv$hUUsEPvN* ze&3f z$@_hFBefp*g>AFIrIZQUKlzGy=4GO|s%vKjV&n<3Bazbgxes}eSOo?(@ltfDPsZ9V iB{k9&N01Xu$Zho1nF|)ChG6zID@x2wg|Jao>86$DDr0Mq14&%u+_MgRZ; z7D+@wR9J=WmO*cuFdW4xBHDE!+p67&<$!vek`Le_61TSvkwcG-BFJ$12{6l)nY1ikyraYE%uK>YXQ^A{Fl#< z3Eh6w8T|9#zJ>G}}KzO<#+rox#0d#BP z2&184;T|9O^!?#Aky?BOn3Ua`><}&|aFPZzta$*I;4}hiZ-$)t{kwt1VzF309_=r` zr}!6A&C{1n{V9AZ`VQ)T(9Rbd*(YE~`wr@UAm1r=Wz-my(Vn8yr^BuHnXm+;_goKK;iQ^F{h?bd7K`P5dB=WWIDfexn4s}efU+ML mpza5HH2uK9!1e>nfAI#AX{YWJny_&I0000CAH$+@5Dh9)ym*)xH)T}_b^D`n2)z63Uh=r?!Sc=V) z72jZg?C#-s-y7v)rS{sWN7{1q*?JTM`cKYKhpl@w#)sIHHAZmdomK`F{XmTMslI!; z9jeOIL9HlO#C4+M_VF^6&QbT;-iVJjQt-8*#NxJHMQL0-|0qq^8ZW5MXEX{_hXSHM zfp?Cj#%e!RL;EniZ4rz4VGj|B*SVkafBswX2>@UyRF;!|>yv$u6Bs}-)rvx7smb_6 zeul5$goWz?MMgh8CUs{EMNn-pPg%TCc4%;|X(;Z36?J^lA=$&GbC$00lO>GS{f4*1 z5lTd1F@88= zvnOHlO-v+m9B=Zg;V=>vW-Xw5z5C`urIG051xfhVZB0F9!VyD@X8fchjLgwy0oix+Gvk2^`YZ-3;SpBCQ2dcH?zh_n)>l zqvc~kc&iWzC(58_yCFd^#ua|eIOcKcz+bG)*MPl2>f3+)B<(77 zEOEnC3q&8zxMI9QwZg=QQ`{d+4+S?Fd>2F|W%Q&))gE}qdWnbfA1rG8_!k)&|NIv4 zCRi;^EzJJc{KBo@v?El4RCPTE+x*1Xi!5kFDJ zFj|Vy$vt~RBU5L+cvsEvc<3#o1jnxw;q-flpYxA0cD|1uZaG!6Ieg%5{cyECy&O44 zw#{}6(B&GO8n-UOePhJT;yMw%Y1;K~>kH_$|CRQSOYwoBRC1MNU-YEHW(x}k7Z#&f z$#K})dPTK{_4V04hwT!cRmot|%Y9Pa%E;m~-H3u{cvo*te{3?IAc%?ryJaZ$eXYfb z-Pb`I!aRwZj*1jL!bG8i&Mr%k zTKac8Ek_H|#8m&CfTb5vAqA`dYkSWVWhX*Jr{Pgdp)20^;08bu6J9ZkqD9f&Q~08<0gd4x+oH!1&6%3 z1_G2b2=3jrkOw_xH)s0Y68a zZ@N24KoZh9YQ#Ha_1H8&8Xe%-jOxaJbH}1<+(ayB%G+4Z!al%4QhiCy^qBjzN z-vgi04L$QN(25r=A(;dA_OumYZ#)}Fn-HdcmOAcN0_2fbTqky@KZ(kD4wSD$XIG6q zYRh$kum8P^kDva?VYT+=ND}sPZDIB97Q=v|oK`hRaaB~yv~ zYjdjwpGvrw?+RMw7#b5XZVy`hmS+&68Gp&OgkWP1H#Y7R-6HgeIojj8MJB(>sKGtn zMU}SRX!y3>ODdG{B9I6BJ%48Uh#tFFGf1UfV2yyd)cIVmED6CWIf`Ptnx!>mT?mG< zpunSaIpO%GAp^E!!AVheyk3YaVEBF_>OMn^z>Ej?cH|io@!lF1SR)PFCZm%C!+t9K z$3o$y=7^sg7NwUk$F8H%ycKKdmIM^6qlV=XI47SiF08#wgZLV;@_WTept@DdG6M8F1Me#-5`J)>xf^GovQn1DR7)ZYKPe ztY2PJ!iG1AWg}&+{j}$rv@qtak0#J#HfXcc_f4-{C0tX-kCvY&ptZj~Wes(CHa!8I zFCg1ZyWd;YSi0^h)T0e82V5pHWLU-+8DA0Vpc=WmqIFSOlBTE4WgmtaO?3<|JNq++ zjZ6PF-frtPo*%6T)9C2vcovX9jD5>gF3|g0qj&`O5+6Fpd*iffNL8LXp`#D!VERQC zZQ=s%d%bP9^I{b@)r4s1vu%_V8rAT`K%>dAMM2WHt>9xVn0pL3z16P}zzEZL+r#^? zSar2?=3hU%9+M&y@*VmwWjCQB8tIAu!0cu;$51B2@2?IVB+Z3Ln~uv>Be>}zetx?F za~tP9Yy^8e9Vq+J8*Y}cx;p-~sM5AJ+CQFO@;wd99W$Nz7Yw<7WldkI}Z(7nBAQY!gL;=3M(!C8=mX^1k z)fiS*;vvowEh4G08(`Ln!|KdEYW5>u;P@BkWW`)g8V0j(R3l%-C-@ zC}0^=T36F}YizDy5M^Pm62e7cwTJbJ=oXkx6pQmOpDWVXrQf|fwt+$(-3DsyK7cWD zrfy;;f5_fVraoJaX8WN{YkD>vt&%Byn)Aa;y5Myh zU$CJ7s=O9?`R*y;hmfI=XPV5RlmL%61)=4hviNDulhKhRfls!{E( zs?|!{xk6#nt?TluyXWI?x=#7`9TnUDjsM=y6gJf;>n*1= z(y?t+)agD**mTJCaz1DT9XSF!+(Niu5tPH&$%`+$q)*OraZJEVI3_Z)#Vo}738z}S z*vWTU0Rz!&gV9!;(Xg3(E^lKv+3mJNa$w$oZ{oPUsbR2p?e`s!24O@A(g z{BVtg{gJ5D)_{G(Pd!zAo{zQdFw=M69R*nyaf=F|i|WZ#_v(2B@}fy^ng-Fh(MXy% z6pA9$N+bpg`1Mp8^rqaBoN$`w#Qj83(mPm|_eS>pr=c1d_*jw_)EM3lC9yd=wqr%0 zbwNW5nc9iSdkXI@O3u_cNvpr{#{;o9>)y?2r`od%_UNVS>(x*x0#_+l2zPT~$EP~) zJ(f$14D1C98-O>@F>3t@ik%kPkY-H1U3aj#^=ESDR4#%+#+F*LW@tthPxkIki2Ghc zlNrXkD#m&pKyfw0Nw{*xnW)PZ48m;ec{ugNQh+z|P**qmirjHfQV>HiQO%&Qazvy* z+K+Nhux?EaErvrx^!sXNLeC@n$nz+>CIejwpd~bu!;fJr#9QH8@iz-$pz1bJurZ@h zd8S7cN&gXv?v&BamD5`wO2H}I*G#FQAM~~|?{G^1Db=S+U2pdOzL;HCSW|S&`(O^- zcOJFu;rc_~LviW)+|)9Juf9YcJ!;5c%uNDyCINWope>iL_uaM*=Ni8qnetQb)BvoD zxL97_RX@cnP&fW)N1%7Yzw*WgW8OcrG=37TgHp@mhA(3K;XID!AKn`S1vvKC4Oy{= zu$bPF+_{@81YWiTTq%pIqiG3OpyQ}h4Sw3XWjqx$?U=dCPA-QZ)2|O=yHCK-??h^s zoC1g+1)eTtjtlPYDp#t?60@G?_ZL34eeFU-+<|8>vXA_PfxUQdRPQsK#Qa6OF#TD2 z!442YN0|&xJc8ef@ivn-kTFOi8CGY2o^t{lUG%xjL5TJGbxp-gNij#TE>|Ue*%P6T zcxqGyz&#{DHX$}Wf%j{g|6ulR>H?+wORqt^INvnubKcjFT{_xO`sekz%kws?>1x6V z3(Mw@!GDuY#<`!)eG&Y*DV_i-kERaX@KLy{?LlW2Nz-8aecKKxS}b)jL#mn96=^u* z!v@N^mC<0E5TxR3+=(^j?u>mG88Bs%UByZ2e zq1i53GIJxess_0`4be6*?;IAa?LPTGo@6iS&^S~Re2&IJ=ffXq=5GARqmODf%g@ff zq!x8)B}sWX|2j;lVez}qZ-}L*OFG3JLn0t%gRY8e%frF$E3HpU@=FU!A6+-Bxf_Wr zE-?B(Ly=wtoRjE_%1LDP0U3}Lwlif_H7XF7Qe?LE#%WBI|F3&Y$8l z1@9UyRcH6c9x}rDMJ8s}>(x<(fHMpI0q$ zM;$}xE@nrK0LHGHp@J#Pm5{s`!h%LFqFI*>I-yOG_cg=M@KP16ly^DVT&Qh|7QHr8 z0&cEmh-1XYiF}IGe&p$~NjsBuAH7@&hMUyb!OKQ4xMR6AsT1Y*k?8UZH@7%mqsINL zjFOxbq6xz*0_c0dq|H2aA+bZ7f-8Hdj8@l~oKfHez=G3cEArNTIx}`mCc5#!? zw0veArzvoogO_C)-V4^J0vA11v(+>)5RD`zHy`7f@OrM9&RlrjPVEMlcg~#(Q_9Bs z;}Mt0_yk03C*G>gDW}*R&?kgxfhpwqhgn-%wD0`^OO+IKN((^v2%rMJE)X+O{Lc}r zLeL{ZPv9kvIRg{(?@D?1*6Fgw8>jv$zB1mc#nl8*NBrsOu$4ekPqciK#jJyZANl5; zxx^L-5ZT*^dVGb@2|_M>l)A8MH6!W}ALEx#$w_J^lFDW<=?Cw?{VuIHDkpaHy z*Y<2nTQ(4Lu@E4@%I_=2wpGIy1Zr#eDe0{^!I7@alP4!aJEr_BL;@^v{47C8lDAr=W|so>vf?#7erZUR~&0!Yitvv<}(f?_GlBPyG} zd#sCcvl1gR6W2x-M3zU!8JbFiJGeJ-VrmTt@`)S{o~+I7m~`EFM6`QyRG-=x6URe; zj*%wju&}kqWLH+@Rs_tGmpcYML9z6WaIPJ0Y58udZ!fC;D^vip(?ocM@P45Fes0Tg zbdc)nRh&}Qt~J|M_9??0!Qb3(uerrHX+6r0by=v}&2Q_6&k~kONA_O-dr|w)jHw{E zT}XYc_{?zbX|G){z+Y4fz+NENivd}gMqI&(U^FU%9sZU2lT^XDuE^+3sk`Un8O+u- zO_9YNj@DkOcg06B-Mm&-kWb?&s;Y_aN_?vidhdT1Ce3?~xZHKJF_FRyT3}<&F&yWa z>*SenxX3A+TFy}2iAI9;>>ADn--?%mfr_(_S*RFOF>OOL^aee|@&N&A*J&e4mX-P# z{A}zlS^TRm&}LPc4%EL%2qcn`7(JpS0=Ne?;Y?r~yzkeFsCynw%68l{*!`fBKjC~x zPqYRH<3!*hv4=8=5~_Z>-CAM$6np(`gUxwRLR6B?rT&R8A5USEg+u<6^$$1by$A{0>2H-yP<7-;yp=A- z+dpr(p8nmh*xW5a@tOwTL&mbVb7t2H!Ht^fgSxP#(1lDyPcht-hb#y@MM9#J@5J?~o<-Qa&Y)LDKglMKA4zS=0aw)9q$# zFH>Jo4UJQrFnWKR(MGR}eM*2>e*#UBwG^OUKPor*_lJiI*5YLmMg#tdodTtkcG$}^ zfcr=gHYo;`VdJFxUNHXUhA)hOu*R-EHQr(c>PdTWeok7T>|b{f$LIstgm2JjW!3AA zR5^rEx^Aw7`d%hh2V|x9x<#fD;P;L(CE!99Po_{YAKLBAGPzu5`Qz_>PRp9B%9TJG zUGm**HL~8--$#yR2!(J{$HcJ+TL-wOmq@~3tru5RKX`65x94jx`Lms{xJT$tDM0DB zUuAPi4UPlkZ(NAufUfhOd!hSm!@Tq^w%< zFZI>zjV5i-{`dy3Mow;SL;LvX>owWXvVc+i3k*P!v&R#=$n2w>6D>A>ZyIOJA)Ucu zq2k*#NuoH>PT?m`@IAa^=;!EzpDJ1|<0o@9dbuY!_gwJKi}BoVeU_%e0fBr~a59FQ zbL^IK!t))AcB_-HD2#KKNtA#_WCu`c7*skb)cV3o8ZK+gqN@=B_gXc%ugHSz# zah}L_g2&RB25ZlNj9(OI0c%5H2?3|WZ*qwlNTq~VYbzD0TaY+6m)=$#30c91^UEnJ zhB_5H55$D6ye9b-`ZUZ=V>BI7`t4m(=EE0{P%SP%Y;sK&X>nOgF6_Pw#bd&ul0l^P zTcCwWLg$BHRJf1NWuz-S7hFlKBHvXL>GCZ(WWu3cM&w>%XF9#>x5eKF^7sX};mO4t z@xhE8?jy=T-KkyH$EZ?(GGKQsAa=jUxIN;0bUeFwp0B70e7Juj&#E5->{hl%j)5p>cicu{D4F)xG*d<#56sgW(E!s^A6G!f0#Uc%nb{CkIX4D0}wa^B&1Z za}xkd#`dp$gVkI7d__RN{2zQ}scQl+;>W6VQK}k!Ng35f+9|Ldt_S{z5+|K5NO3v{ zGITuv2?3_y6rR*jt!KUa^b1^_!)^nsIBG6SL+x3Q&Zh5x%f@+KK40CO4!TUkwa{2< zMRlU2KESo1m~^!3pNp!!Jaz_DN?_SrJ*}knq~=xvC(fgzjdTs3&!w9aOC85Z;7{B2 zyCw@PB-|ytdIlt``MSV)kM#ZYWd3=5fmzAF>mjTa`#kk=FQspEMYp2O7_WH2E}u~I z3z=B)Y~9c%{gc_bKQD)ABzCDnn0BB|I7N!{Mr9Y#D7xwf4bgi49f*!=~%BEX?GMvJMu9IBt7BU zPO)~G7#G`4MS!r=!pp}CjgOd*;?vnq({S48mJNye0VN5iW3UM=R^GD$3?KSF)D`q( z%{-q4?K($x(|lhL6)DfwX@aC*9v`bghS|SFA(2|sfgRPO{5x(G+dJ=};*iRqS#u(+ zP)!T|3?;Sp7iMT*kw+X+1EwT?*4Fe8AC~<$zz3N2!0Yto)_L(H49{?IJJ>EAfvn&T zXfwl?cT9MoibDgowA9qPzyXJ2saGkxN z*LHSxS!WcyeGe4lJC)M^E`G={1hs<<53C@cY zMHhJXXr5itq*I{_JUcXywS%%7Ok|gzlS97g9XtE`Lj?dN%|!AaD(N)@vPX;j#=2%s zmBC}qJZ=JjLdO1o^;g@zn-p(_u1PL6=fE*`6*EoI=Tt^b!sGoUhSLWmLt{1^;ULy$ zFD*UDZbndR^+U+rO_}DGGCm;tm2t?oM zfgjdQ8)uYM&m|3uqDdc_1>gLf>iCeg_m6TR$ZkDMyN5WMhYE&=a4D+_y8rbnp#6+( z@B$?_4vZRha)J=k?O?qIHsmZfeg2@31bJi|TqEP0$?^+K7U=&kmgsQN_C>Z-KsM&f z7g1EN%ysPJM-4o;OC_W}3eA#msh8ow39QY{S0T8pGSiMqPg(~m&YNTjf6iBW6k}D9 zQ4xF=5LGm3^(bELp6Q-B&_L;sDOTricYaLAneuzB=f|8n$yf!XYEjd6=DZlf-WB1S zO~@p8+baXqJv6fWnUT%%!>Mwiwa%CTp>mS(xCU9|m#F7|elm!#`|RM?_d;UFz9}W! z*)7-)ITdic>2|ru9oc^`%0&UNy$W5{-BqU)*wq_9Js3+X6W4i-XgJ}Cl+3r&KOfcT zDm{Gb=E^xoki%8XSI#_T_OM6$H)E))}IqXj#T{Kyut+VSLOJ$H=8jmAr4;st|jS6 z0owsLnCg`wOJetnFt%}en9hR<5Qk7w#n^_r(mT$MB0zn;k&rwD&{3Dz6%e?04^PN;LOt2Du3o(}+g{P^*8 z20z>6)N$6<)$%ZlBeO5ev3{?eAo=Olu_LP7et+S>oz@DH+vJX=}gA&M*7zG7S+mDw^o2V)#scC#gFj!1ZLUUsLZX)9uws zB=own)zs9Fxk&YpyBABKN1ILCnc;ys;V8;E*;OKhHARb#R3)CxG3^EI-c0x zr@|=pr-xeNF+}|C>{~zYt}j?5CBNR7wn!Byva=UerbLdW znUHQ=p&llWX69PEZ5~Xpn_PTi zR&uTBp{VuJ-#!=;W5n!gi;364+k)#@ti02|&h}juAJ72{I>y^y`SH7*7@7j-WtXmH zx4B_|q3}G>|6T=))BnTxTi5NxH9r<`XPpj<6!o$SXNhZXlriXcO;db{Clzi2>>a`; z6Eu&$aTettUiQBa9Eg3Q{A)*BZAOQu#kU2Gq#O5@dnp6#O`ajH_B$;tq;l&jun^5& u3y`Obi&z>q6>k|T#nuk_S;%sB53B)cC~r;c?mo2U0m|~~a@8_sq5lIwTf=Pt 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 95451bc35a7..deb912d9ba6 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 02e47675ee1..a1998ef1ef3 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 08f9194f2ca..1cd253dfcb9 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 ae769b301a7..689fbbd687b 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 41d1d8b8b4a..a17305b58f9 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 983536b1c87..96972a8bdbb 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 a88f2c84e44..c262a1bbc7e 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 c262a1bbc7e..c129dca7335 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 8954b3217e5..fd6eda7eabf 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 454b80a3b6a..fce50fde07f 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 a1998ef1ef3..94d93182b2f 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 28c2a4c16e3..ab53e5630e3 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 da09424bce8..c9590c54714 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 c2db673e6e8..09567e7abf1 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 0e2c0d0c023..5ab8801cddd 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 44afe0ed869..4fe5386ebc3 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 980c2ca729f..aae33697bfb 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 950dc9b2cce..01398160314 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 2ad67edc3e0..bdb2a0ebdca 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 00000000000..e0695f8190b --- /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 00000000000..cdb7470d9b3 --- /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 303e0611e32..bf929c74e06 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 00000000000..3e39b6567dd --- /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 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 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 00000000000..d42ff27af93 --- /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 eed1fb54898..4042ee05fc6 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 a4e97fe7d36..f5f8083873f 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 8c7be4c850f..4236c3c2597 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 4b747fc28d2..e5d6edd5f17 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 bc340140b5d..dc53aaf4680 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 d873db21a10..6bfe235d67e 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 d8137d15b35..adf4f4b4f1a 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 d72c2f54d96..893b2e72dee 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 6265343f2e7..001a0c33ce9 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 63d3b2ec93c..17bf186c0ad 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 cd821d713a8..c0de0be830e 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 505bad7a3ed..2b51940d133 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 97ce3b7302e..38234d29ce8 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 89b3fd45535..b5935e2109c 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 caf29c81049..3a7c0843f65 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 8dabb7167af..78e5b5f0b48 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 b8cf9e4c015..e2b4af68c87 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 d7352fb03ae..20a479a891e 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 b65ad250dd3..581466a484e 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 7169311366c..17952ec6373 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 ea5c20e36ef..04d498ef761 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 e62ba1cbab1..320a2d8c30e 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 8ddfdf54d66..0ce56ba0859 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 4fc37d4a828..4c73a709cc7 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 e0231caf658..8aeffa78844 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 5334839e70f..75f0315b71e 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 ac2e306ea59..dedebcfc16a 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 63d3b2ec93c..e83234890ed 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 5396b3607cf..0b91d43f8af 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 78ace9a7326..6b0398df186 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 5d8bf5862b6..9057ac1fe22 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 2a460c53a43..77ef427f3e4 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 e76f34229eb..7311b0eb3f0 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 feb41bc9805..e8b60f09dab 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 c3c4eced76b..0f5480f5a2e 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 66af11e7167..c3dc37b3464 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 c3dc37b3464..4e7118fe154 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 4c73a709cc7..379316b3de8 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 0fa6f37889e..22c582f53a8 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 123458d009c..24a4f9edb13 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 0b91d43f8af..18cfa6f04fe 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 3836af3e807..abbcfecc695 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 a9a61db02d4..6a6df3ddcc8 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 5f832ae8045..d9944cc1c81 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 095e8f7ed26..c85396e05f5 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 760c4a01f0d..3cb6ea73728 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 2b2b2f14f4d..bf8e02c84f8 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 4e7118fe154..5c6c414a8e2 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 94d93182b2f..561c88760f9 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 ecb9b3eb1fc..a328e064971 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 28dea46d5cd..82476aae8e5 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 22123008d75..d12e92b393c 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 f265dea98b1..ae735053580 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 00000000000..88680675a9e --- /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 zcmZuydo-Y@ zIn$cEfv*6yJ{JdqcWmK&fm`;71&SV}T9&fL4M!PzLhEmvMo}5bS9NuAsKZ)TIf-Bb zw|x{_scEcn``Eb(6R&c%dNn9qVA3D_c*EKD0NU0!!uMuEQNnm%-^`KdGeFsLQS3(f zI7h z`1Q_jd8MFejREw5)~c`JZ`e4^mqSM>j&t5#?1Fi*=yWZPvi&R;tP~7}o?gl76I|m+ z1|KDD#kUY;_RxMUm1zOGGIV>^pb-1Hz3HJ~L-mJjfW@)`u0KKDV--+U&Jjz?Wh6hW`2iEgqHz?_QYNT&kq0Dby`^NSQ zG=w^~?6paVmjJMQA@ZG#1Yz_PU4HdqAh<$8yC3O?&)C8QUw55{1%!>9w>yNZT8k1) zN(mCTY~cuWzm%Zite@WF&jG&MgL8%!>8k01_H-c4PA*LOIW5y}5v8CL%968rEZPtk z;xGQPI27H9WaSoOU$jA|HVBTLEvcs2=qvYyt~xuE{r~86t>CU4Q$Mp-u;wYptT0~e zNE-godi{|m2WYpaVZY1w0Uti4abzc@n&#~IIq4|FIkIgiMtSJz8o^^Zrp(^JO}`6i zX4POeAO4YMFaZJN9t4Om8Fi*Op@+3dOCgS1&Kw&-@4l`wo#PX<{D*DHD2~0b*VqLY@&U3*XhMWm91hhNDPjI%{e~q4NnfL# zSyN6#uzt@rZa_BxPtfm@iLUS0A8wW8ZZQos)jTfY;44YmxU^LoD?v)gDqcb6F3!Uu z0>$m7v2Z46Yms_+_(&@fwE+7Ugtt}VfNw(Ihr`Deh7jI5E`z$Xd^ z_2FOceh$tI`zjW6@rNNT{sQ9==Wv-QTtXXIENh*3tcbCYv(W2@dO=Ubz$c%D^NK%j zst*vsrFPUR6vjj)UE^w3d6~RXUMFA-wB0~y@3@JmH63B30^u4w0dcV#-XYF(MzIXq*a*aM+7JiS) zDijK3CJbOGiamL+->&-l`rW&Ci$o#-0F%iS2m}QM1yxm53%R?J4kj~42~wfI*c}4jDJrapf~f4$SN=?#qmZ_tc?xr{NR&2VO=TV zM`d#@o1Uxl(?XqL)0u?b$r{5*zD7Jo7KtT^tM`b+TdZw*#rScEMv5S#lGBLVq2bYZ)I-}-c& zHzqsTE9Touc5^V;V~ixYx>R5So9jwt4>QWUIdcA;;Agz5m67e?dPa!sz1AUm*+}p^ zxfDxxBjy-*IX7TWE?V4nHsa?MY|cXbC5039)Gm|cut17eZx5SwC9Rq5cbW*3I zNqOJ==^dxMhI-(N5j{Lek{~@$+DpixI&F4Y@ch$ zIgz)XZpHn>%8sIV3gi`s#8nyL_n=;1gpooYUvUg;-Fhk>$gP^@LRka%1Zrb&=LF?8 znISX|NBLs*hpX1%qRhZlgN+8fY#*N_mOCI|oY9wJqnCT0g@# z=CoFV9_hssDP#%n#XL;Kz8eL-mZwdOV*=%DdQQH{Z5z-IkE^bpD3Lwj8ojmIIJMl<`;e;Y$8r5RQiKO zsznsVcn8J<+jvC^`ER=Y1JDp%j{Rco6q}m9_rV6x9^~;Iwo$=XHn(1=T~TN!np^)) z-!KneT28clc4GF37lrhNG39J-YYF{u#)3c!6JTu*Zr3rnfh$>o3dhdi>knSL# zS;zbYOmdNcYfhcufrcv{Vp05ocUC$nPF-ga@T$qkwm9x@f#fc*V{tx9ry|MW*hTZI zy+C78dh9x9)M2K#Y2(5>+S!zHC%A0>dX2GfDM(jzp_)Aj?fn|g^kOO0HDA;h{poe= z;E$po`>ifb0Pf(CR`j;A#QQhps|A3&lAvdJ__7olm@|xRxm;ch(kI7y8Tz>(OdlFX z$U&1l*4f<3P7^CpP-k`5k6|$I_EXo#&i(9ge7xjm;9ZQ<&oE=-ZXkhsrr(+RC}*#4 zyGg(C2J7SL;HiACXM>Xiaq^JcWM@(-?n;K4w|Yh!Aur`%O=YSZ5h-sI!J;?N>Aqu zDPQ?RZPQ`7@yTkP>b?USagIUBH>O6!^~Mwv5U+Ax2$QVZHXUDiNnus+0w?xoFlY!PY-tL z!CImq1snp@EW(p7tm)bhrtT*+Qzr?iZWvWUM^#{yc8U@GbJ7mzaX|)o^;;rO5Ny?LBuOlgE?cPWnFK}Gc2eT85{~QXrZmk(zcLEc5 z&XatGOhXlLzN^@W%L>MBM{7M6^D%g+S;MSb4Ue=_=HjfwF%m&!rN>)n7=e^3u%UBgvJD!v5X8 z&K9gU@c7HLRoI;VrqgM<=%z^}DQ2A3selEKYTzrJyW@FzvpW>Wy z5_tPyY{x6OxdOG4gKCd7(UIQYTc~8b_=GLlDkl`P{E#zI=pEQ^+OpI=b(oF&Ot41aM|g}v~+|2O`RJJcs7@pKAi2g51a@)UAQ;@xx0(ku(&P;IxX zB8UW+5v*r?q#Y?ZScvv8sPVa+Zy(L^W)NGU>k7h#e_or=TNwzQ)%eoIPUYY{0A~tQ1^T=NVa7F%szrZMP zo-CBJ`|C{no&gI{q{`|U(4mk1-!Y+3l=T3(7#&m8S8Eb=H!o_LPXiVmE6JGgTYSK`Rkq)PLdbub9;be4U~s zNQRptHsM=^=I6n}%hjoqfQs`2-e<^AtDSt6k?!l;zZw56R{XzE9=rDKEZa_@{RgEU 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 05931f41a2f..4b0065e96b7 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 8bdcf2ab1a4..fb32a9888d3 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 ce927361ee6..9ec972e5695 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 6a6df3ddcc8..7385ceef2fe 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 00000000000..ee730aa2a22 --- /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 c85396e05f5..4710e89e562 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 8aeffa78844..715297e7339 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 3cb6ea73728..3ec738ff122 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 b95cb57181d..02d698d4a13 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 bf8e02c84f8..61dfd1f5d66 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 561c88760f9..b68d6c828dd 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 fb4a05ef19b..c6ca91572ac 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 88680675a9e..00000000000 --- 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 d6d80c68478..376472d4ffa 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 171b27c8b98..ece94ed6a6a 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 2a90385995b..43070098384 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 6a6df3ddcc8..5c21bc62b0e 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 35110bc10b9..5234b4c0ff7 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 4042ee05fc6..9506f4371d1 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 f39b5849a08..57c7d8feb45 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 62566afe1a1..4510c03626d 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 d10c34c4f8e..0e443936683 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 b28b73115df..023de068b87 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 43070098384..839530cbdbc 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 ff568d29a61..1c2713ef45a 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 946821ceff5..a8bac2f5fa7 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 658290a567c..09c8ee2cca5 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 b0f81d840a3..689039b34c0 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 2b772c7f15f..523d2ec04c8 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 14fd42f76b5..bd8bec8ebf4 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 3d4a7b1000d..45a09beca26 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 9d63b3a9b81..2212b6d6d3d 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 57710f9594f..9e0c73835b9 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 6f483c9e85e..4833f59de7e 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 ccb16e145bc..36e3a047c95 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 d2f9569221a..72212cde43b 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 2dd01cbc386..7522827dc86 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 7c62d658b2e..0cb43501e1e 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 0385817c1ec..5a9fba0cd99 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 4eaac0b2cc2..6b85c90efb6 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 9e842cf2feb..a84f10736b7 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 376472d4ffa..18af0e9a188 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 ece94ed6a6a..5c0a8f52c94 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 c3044b33be2..5357133fe50 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 533df4ca3d7..a6c98ee0a1b 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 c0de0be830e..6a934d5c5eb 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 b5935e2109c..13836a0a7da 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 5c21bc62b0e..8f74908751a 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 d9944cc1c81..41be3003186 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 ef02c8f9432..119683c5413 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 22e04658b19..ff76ca49fe9 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 f893c8b4908..ceb5eaaeac5 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 7deca9a4156..9d2c5ab8c95 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 c37667e53ad..0b4e7ecd711 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 f3458e04a45..3d2f8cf9e29 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 d6da2d6efd7..10ab9407a95 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 759b9c08801..113e54a5764 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 9defbc34504..2ed880fd3b8 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 97ff03bfe45..8b4c33935d4 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 aa5a3ffed5c..0eece4d7788 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 a6384957de0..0eb154f4305 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 291e4c1ea8c..8e5711291cd 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 ca7f1783cc3..2530ea6bd46 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 51d150e0c8d..34f832bf13f 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 c5ff5f530ba..ca34cc02099 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 079b274c59a..db6297109b6 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 d9192ca4a27..44fc77c01f6 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 8ad6424f271..71791687f61 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 fd6eda7eabf..11eb269e052 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 0e0492966ce..30268d3cb5d 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 a27fd59fe93..43077bfe89e 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 769f8c631d6..19c61ced8d9 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 e014bd441ec..a606e344ad5 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 7313f51691f..91bfa983ba4 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 8c44f0f99c0..930c9329ae6 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 ca111e877bc..0b1c0084639 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 893b901af7c..2a269fac6c9 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 a6c98ee0a1b..ccb8ddf4307 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 22123008d75..bed01a51616 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 17dbe09f0a9..213deaca53b 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 7e8056a04c7..60303ef1ee7 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 7d714f8efab..b67e06bf1b7 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 de364ec1cc9..a0e1194fda7 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 119683c5413..1d26dbb74a6 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 95ad399b57d..533174a5fa1 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 0b1c0084639..830d9f24167 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 930c9329ae6..b19b2f20f18 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 b3474720a5f..f2eda23a2f7 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 4bfc77f7363..134f2a3ef11 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 cf7af2c0174..04cd6b7e88f 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 e40a83850d8..9d0163f585e 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 9d2c5ab8c95..1c7763343db 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 296eebe4fbf..74276d797a6 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 3f9b4b7f150..99bd9f8962c 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 ec4273ebc4f..246c81aeed4 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 a36f8486b7f..1ed4775af8f 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 bf56a5e39f1..236a5ae569a 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 00000000000..e25b34789af --- /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 523d2ec04c8..18dc92c3ce0 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 6f3019810d3..dcc68137e6f 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 6bf9ff36f00..75c97b70ffc 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 533174a5fa1..d1515fe6582 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 30268d3cb5d..17d9c59cb75 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 1e7e45c2744..a3fed05a820 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 4042ec7bc74..01ed6a26c97 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 bdb2a0ebdca..068804e9419 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 ef453a040ce..acaaf113f91 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 00000000000..a8229cd1314 --- /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 00000000000..ebf842d7a97 --- /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 00000000000..a5e74515f47 --- /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 00000000000..70b4a9c094a --- /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 687d673f3a2..9c37069baa3 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 c14dcf7c378..9e65b258399 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 8a9f563910f..7a551b53e0f 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 34896223804..ae6d8d71438 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 4661196c289..3f5c525c104 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 d8a261cac34..e9247a13cf3 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 bfea4820cd3..1cdcb193353 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 415212605f4..8bc697cd896 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 290de89153a..c1eba028164 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 530e66903cb..85a6ad93067 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 01f0e716d58..0c3e1c27308 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 4e52cbc8c9c..884b99b45fd 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 af152d8b502..b5b96c98756 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 2958d2eab9a..5ef82168e9d 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 43297c50a47..4febead3e39 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 bf3c3498dda..0d93d05998f 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 b3b31d1e54b..a8287bd5038 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 c24ced497ae..bed530e8b26 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 40f7cc830ef..6d007fa2728 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 df7b9225027..565d538eef8 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 643125e14e1..2792f2dca8a 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 55bedc9bca8..fa7a8094299 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 b4b955ecf4e..fe5c981c789 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 8b3f477a586..c6202053839 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 ff76ca49fe9..a76b2b3ef42 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 4d78c3a4553..d5f55ac7c74 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 bd58d0d112f..a0323b68eca 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 16f42c276e6..58964df51c3 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 d38b7277bb1..0b505490c25 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 caacc188dda..7573cd540fb 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 510fe486f1e..53022013e62 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 eeb70c69967..60fca50ad15 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 1135f240029..44357fdc75d 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 1c140c763a7..198f93531b6 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 483e114a9f6..053803779eb 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 38a0a30f011..d4e72576e3d 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 f65afc65962..802b7c8377d 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 cb7df0f6098..8b0a103476e 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 1ed27348357..83ad2a6548c 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 52c6c6fc027..ad1672b3293 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 290cd80db5b..308bb3294a9 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 c463a0687ce..b50640cd3cf 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 9ab3bc3e497..437ff5b505c 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 37d8d1be768..72e5c22cbe1 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 7ece1fe4370..6465b8dbb63 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 a82bfab4031..0479a7827cc 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 f054a258a91..7775e036c59 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 f3e74bd6147..5108dff2b67 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 16fe9e6f62f..7ec1cf56971 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 b6b9c296188..5550afd919a 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 69241dac54a..de595f991f4 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 8ed74828c58..414fd5ff0b6 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 003f7b851d1..199a8b4e8e4 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 b2fcd871177..1656acd207d 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 ea7b725c4cb..0903296bddd 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 5e1dcb93e82..331322b76cf 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 efcccf407aa..7f728007f02 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 b4bc1705cf2..5ad8c4bc9f0 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 823c729e3b1..0c947ca8ba2 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 17d9c59cb75..1b9dadba069 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 321d28d856a..0ff52ab6c84 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 f037c65998a..51ac6d43b52 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 15affb6205b..f63e42bcd93 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 b96ef8f2aef..a8b408d77a4 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 3c1a5adbc39..7524049c51d 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 330c11ada5a..2e1c477f4aa 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 805cff68e0e..d88305ae97c 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 db8c7110174..0223b10a673 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 043a2bc69b5..1e6497c10a0 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 d1a57276851..9e2494128f9 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 526fefb07ed..0097a98ff0c 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 db6297109b6..accaa0b3521 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 4642d9af388..c4396a07c04 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 bb54882996b..7467842c66e 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 b02703e26e1..95ee2c8611c 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 c00540af233..7a998e6981d 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 58573abdbb4..c23813eed55 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 539d0e1b2e8..c3adf5d8c90 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 9c22dfc135e..fac296caebb 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 9a976f06e2d..f6185712f46 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 2bc88925516..e81e3c6eba4 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 b3cd8c900e2..157e5fa1dab 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 4706caad9d8..222a35e2200 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 5eb4e3e773e..791c664b0e3 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 77fef5ee6e2..86d00ab2edd 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 dcedc709600..855f53f0558 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 523a37e3e53..caa797e1878 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 9671e16e361..f4a52486e66 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 4510c03626d..e1a861e46dd 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 ce4c864b0a8..51cdb60beef 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 38d4ca1f22f..31504a3c324 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 50a734b487f..399bb5063b2 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 76255a19f11..545cc0b21be 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 89baf179ab2..729f6b1e924 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 353404026db..305d0aa5f5c 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 5610bf4cf25..7c57b93689e 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 2efa8c00554..d46890df842 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 49426d67046..ddbe13a497e 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 ebb10a60b96..47518ab9b3d 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 a83021f7299..5128bed573a 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 379d275b5f8..80610b50e2c 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 5151fadcfdd..a24f2ff187c 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 80cacb07e3d..623042a6c02 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 661197c5660..82db07b9617 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 023de068b87..ed87e2be848 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 0e987ec6aa2..c14f9007882 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 a3f332b4b04..39ad505e97d 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 3cd598d2e7b..b236e3f3dd2 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 e8f3c18ec83..5d9c3dd623e 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 313c92a5ccd..a8855275998 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 f596d169c6e..d4287c844c5 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 796690f6356..e95fa1df572 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 911413e67e9..9480d5721d5 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 659416ea06c..268f02b43d9 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 c1941779748..c38fdeaa131 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 1df74f5bc5f..c6d6285826b 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 49aa63a031d..34327fc8e7c 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 9622296a587..8fbe5e3dfc7 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 75a8ac9650f..ab4636d2536 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 2727db4ada8..511d68ec109 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 6057a7a626a..a3cdb2d587e 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 f4fe1205dd5..10a2790167d 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 d4b7253df55..9a6556e3104 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 60717340915..bebd8ca7d69 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 ae30572f570..e9cd7e64390 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 20bc6b8eb13..2152ea77b56 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 1f39c841ab6..761a6e0b0e7 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 99bd9f8962c..402232bc89d 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 2b291d791c3..c86b81ef2e9 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 b287ef5713e..d0ff7b2006b 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 49a95a47aa6..3e9944558ac 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 2a942c74e96..9ea5d4ee7ef 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 0f61b2f14bc..c8da4e16f14 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 4833f59de7e..d3d49512d74 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 ff4ebba1db7..7cb3ba4a1dc 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 7334323851a..dfd52e06b04 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 f8c14247fb5..8e4e6155f47 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 e153ddb9c55..97ce9edf74e 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 b5a33cfa874..8b46af8c094 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 60c0df07983..872653d4804 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 79d763d1f94..553e42ba766 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 2d81ee8be76..50b6f7e7454 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 4b2165d0689..639b4a2b87f 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 a1816287111..8fd812e2cc7 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 cc255797442..f8f844a21c0 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 2178c3da5c2..4368f148628 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 5234b4c0ff7..3a1e4df3bfc 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 bc54aadbaa4..c7ad55d990e 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 2a3dd2a016e..2f950c3dd9a 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 9b5af2524d7..18fe2ee3378 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 877b64b928b..0a260a574d2 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 9c92a450df1..34c521eec48 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 2ed3a0abe87..198f7ca470b 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 4937cbe4429..5be3c085609 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 6f7bafbe93a..79a18bcae30 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 54d1b22bd65..84959a66009 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 73f240c3b34..acf8e61b283 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 3de103abcbb..f6a7161ed3c 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 3b0974dd6e3..c59761ee3e1 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 f8416cf3a1f..4b503ded567 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 1ffae8ceb75..cc01e61767a 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 e762458818d..3686618113b 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 3de925eb5c5..661eed567e3 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 baa622d0f76..728d8947859 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 8c4b82aa292..5c3b600079c 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 54559692503..13c52ae7724 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 54464dc8912..530cbf5362c 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 908e70a81d5..e0406f96dd6 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 7408e7545d3..6ed44381091 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 76cb59c9a98..6af747cd6a1 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 391c3440471..6b417f2254e 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 e58ada9128b..3fe3c69ad6f 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 c5640394ce4..6605adad776 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 9b53bcaedb9..427175a7493 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 f6128d0f6cd..713453cb5b5 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 ecb39c854f4..ba4d347b9fc 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 0bfd7265f23..e126ec1a7fa 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 b29a7e1c21c..a89077170c7 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 19c61ced8d9..3235d8b0c1b 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 646d3271d4f..204c6d60b76 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 69dafd229b1..befa32bfaf7 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 99e6fc86be8..d333b7a254b 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 7a551b53e0f..c8b412c6c0a 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 75e0387142c..59ef63bfc7c 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 f1b754a8920..1455ec5907a 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 f6e04eb2d50..1113f10ec67 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 e1a861e46dd..7295fe42516 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 ccfd9b93b6e..1305d6ee411 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 06a1a7d81f7..a961e82da28 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 8f4dbce7bb7..aafbd41b47d 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 00000000000..b6c0ea502f7 --- /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 3da636a2c50..6758e59d78c 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 060c4864e22..d5bb28f18f4 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 a8b408d77a4..6c1ae805e1c 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 e95fa1df572..e6dbe8176ab 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 5d67e910f7c..7f01952bc4b 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 22eec93ece5..57cc6d0e03f 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 1778979d9b5..76b4a59db26 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 48c6e74fc86..bb59234398d 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 a3cdb2d587e..42339a40f1a 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 856ecd502bf..d04d06979d9 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 402232bc89d..eebf86d0ccb 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 5108dff2b67..a4000ce56bb 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 b78de9f0352..b00656a0cbf 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 809c4af4ac0..6b19126688c 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 43cd4b1cf63..b5f60987780 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 874941029be..6b30fafc0e2 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 a43672e98d2..e09c3548c82 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 0097a98ff0c..7d2788d0ca3 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 accaa0b3521..a1e484aa57e 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 e2cf9e4abe1..af6fa27d09f 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 872653d4804..96dbb385941 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 e0406f96dd6..3353a13f981 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 427175a7493..390eff88e40 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 7e186c85abf..b1b19494499 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 890b4746992..05244c89b98 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 db7e0dfb8e4..423db9ca032 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 486a5eb5ea8..28ec8b72504 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 cdc9dae00d4..666048b0a0b 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 44fc77c01f6..fc8affd9b6e 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 f33dab219d4..7a855c5a366 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 a89077170c7..3cce58ca5c6 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 01ed6a26c97..cd846616a91 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 caa797e1878..a377c2293ce 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 5128bed573a..a24b3da8a2b 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 6c1ae805e1c..273c685709a 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 884b99b45fd..1770f09178c 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 b5b96c98756..bb0801f80b5 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 5ef82168e9d..3de7c00f436 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 4febead3e39..492f0b0c26f 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 0d93d05998f..b6989e112bd 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 a8287bd5038..2de58f1e211 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 bed530e8b26..719223e6ec8 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 6d007fa2728..31aaf31b804 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 565d538eef8..e4c56dafd6b 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 2792f2dca8a..13c9162b87f 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 fa7a8094299..9af831affc7 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 fe5c981c789..8e68d92a22f 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 c6202053839..cac84cb69bf 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 a76b2b3ef42..8ff55c421de 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 d5f55ac7c74..6a09490b325 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 a0323b68eca..70ccb935f75 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 58964df51c3..723d76e56c0 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 0b505490c25..7061e5bab0e 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 7573cd540fb..e34784fb7ee 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 53022013e62..3891c252af8 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 60fca50ad15..27fe8910c85 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 44357fdc75d..9aeb0d2eb57 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 198f93531b6..64d99bb5140 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 053803779eb..bff09221886 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 d4e72576e3d..ba82faaf6d1 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 802b7c8377d..18ab66f0386 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 8b0a103476e..435bf70e9f1 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 83ad2a6548c..8f3d287c78c 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 ad1672b3293..96bb673ca22 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 308bb3294a9..6cbe3cb184b 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 b50640cd3cf..49fcbbbb276 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 437ff5b505c..2a2aac82fd5 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 72e5c22cbe1..edfe6c24032 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 6465b8dbb63..89e598b527f 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 0479a7827cc..2a11c6cde77 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 7775e036c59..ef7fa548434 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 a4000ce56bb..c286fd0c874 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 7ec1cf56971..90890403e10 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 5550afd919a..21aa9577627 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 de595f991f4..43d33f644d0 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 414fd5ff0b6..4f972191a0d 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 199a8b4e8e4..0fc0f1ea494 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 1656acd207d..1f09c65b318 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 0903296bddd..bc329ce9e5c 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 331322b76cf..c5cb0128310 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 3a1e4df3bfc..468176dbde9 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 7f728007f02..49527c33cdb 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 5ad8c4bc9f0..397ea46d74b 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 0c947ca8ba2..d88010d3756 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 204c6d60b76..a8783915b03 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 befa32bfaf7..865829cd4ee 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 d333b7a254b..c9e92ad6347 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 1b9dadba069..8d4d8995f11 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 a5e74515f47..f4c6ea359e0 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 0ff52ab6c84..c43ba40dcfc 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 f7d289cc869..f60b1158b6d 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 7827c6ac054..4483f376e33 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 23be0cf3efc..cbe34aa3cb7 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 9bd7735bbd7..6485f401a8f 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 4f053d436bd..84e925a7acd 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 05244c89b98..7dce9db1740 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 e664024c952..9431fb7e70c 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 839530cbdbc..90bf4c09f19 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 00000000000..3278110bb87 --- /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 ba4d347b9fc..ac1dc15b6a4 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 90bf4c09f19..704ab61cde5 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 85ffb92fa59..37d86d02566 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 00000000000..f2d9decae03 --- /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 f692cd70b9d..7f8b14ca006 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 3278110bb87..afe6821edc7 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 7a50cfaacf5..80de48cc917 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 ac1dc15b6a4..8b2dc8e5dba 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 9413d6426c4..27a7c09e2e8 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 11b1e507fb2..59e1397ce1d 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 06d33a1e66a..8f21775624a 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 788746eb3ca..08c623244b0 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 ad631c88e56..f5ed43182da 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 72e1546c7db..d1d64b56f8a 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 da7a70ca52c..1b4884758d9 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 e04b90c0ac7..1320a48c919 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 602b4695d4e..6b8304b7961 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 be1120e13cf..d680a153227 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 2068815dbd2..7e8632adb2f 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 8310c9ab456..ffb1b4057f8 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 321bc65ada0..278dd93c7db 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 a2e8e2e6df0..a4195e91a76 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 0511e0f2a98..278dd93c7db 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 e71e26b89f5..00000000000 --- 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 75b4d41e11e..00000000000 --- 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 fbe12dce051..00000000000 --- 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 4a06c7ee580..00000000000 --- 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 c725192ab5f..73e32e4b78a 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: