From 4fb506777e73f6427c7502b263ff7e3299ac8d4a Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:17:12 -0500 Subject: [PATCH 01/82] Add new rough-hewn wood plank turfs --- .../items/stacks/tiles/tile_types_wooden.dm | 10 ++++ code/game/turfs/flooring/flooring_wood.dm | 41 +++++++++++++++ code/game/turfs/floors/subtypes/floor_wood.dm | 48 ++++++++++-------- icons/turf/flooring/wood_alt.dmi | Bin 0 -> 1814 bytes 4 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 icons/turf/flooring/wood_alt.dmi diff --git a/code/game/objects/items/stacks/tiles/tile_types_wooden.dm b/code/game/objects/items/stacks/tiles/tile_types_wooden.dm index fc9ec6517d76..a184391251f5 100644 --- a/code/game/objects/items/stacks/tiles/tile_types_wooden.dm +++ b/code/game/objects/items/stacks/tiles/tile_types_wooden.dm @@ -28,6 +28,9 @@ /obj/item/stack/tile/wood/laminate abstract_type = /obj/item/stack/tile/wood/laminate +/obj/item/stack/tile/wood/rough + abstract_type = /obj/item/stack/tile/wood/rough + WOOD_TILE_SUBTYPE("oak", oak, oak) WOOD_TILE_SUBTYPE("mahogany", mahogany, mahogany) WOOD_TILE_SUBTYPE("maple", maple, maple) @@ -35,6 +38,13 @@ WOOD_TILE_SUBTYPE("ebony", ebony, ebony) WOOD_TILE_SUBTYPE("walnut", walnut, walnut) WOOD_TILE_SUBTYPE("bamboo", bamboo, bamboo) WOOD_TILE_SUBTYPE("yew", yew, yew) +WOOD_TILE_SUBTYPE("rough oak", rough/oak, oak) +WOOD_TILE_SUBTYPE("rough mahogany", rough/mahogany, mahogany) +WOOD_TILE_SUBTYPE("rough maple", rough/maple, maple) +WOOD_TILE_SUBTYPE("rough ebony", rough/ebony, ebony) +WOOD_TILE_SUBTYPE("rough walnut", rough/walnut, walnut) +WOOD_TILE_SUBTYPE("rough bamboo", rough/bamboo, bamboo) +WOOD_TILE_SUBTYPE("rough yew", rough/yew, yew) WOOD_TILE_SUBTYPE("oak laminate", laminate/oak, chipboard) WOOD_TILE_SUBTYPE("mahogany laminate", laminate/mahogany, chipboard/mahogany) WOOD_TILE_SUBTYPE("maple laminate", laminate/maple, chipboard/maple) diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index 9b2b75b0ffd2..b5fc086d42f4 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -53,6 +53,47 @@ build_type = /obj/item/stack/tile/wood/yew force_material = /decl/material/solid/organic/wood/yew +// Rough-hewn floors. +/decl/flooring/wood/rough + + name = "rough wooden floor" + desc = "A stretch of loosely-fitted, rough-hewn wooden planks." + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_base = "wood_peasant" + has_base_range = 3 + build_type = /obj/item/stack/tile/wood/rough + broken_states = null + +/decl/flooring/wood/rough/mahogany + color = /decl/material/solid/organic/wood/mahogany::color + build_type = /obj/item/stack/tile/wood/rough/mahogany + force_material = /decl/material/solid/organic/wood/mahogany + +/decl/flooring/wood/rough/maple + color = /decl/material/solid/organic/wood/maple::color + build_type = /obj/item/stack/tile/wood/rough/maple + force_material = /decl/material/solid/organic/wood/maple + +/decl/flooring/wood/rough/ebony + color = /decl/material/solid/organic/wood/ebony::color + build_type = /obj/item/stack/tile/wood/rough/ebony + force_material = /decl/material/solid/organic/wood/ebony + +/decl/flooring/wood/rough/walnut + color = /decl/material/solid/organic/wood/walnut::color + build_type = /obj/item/stack/tile/wood/rough/walnut + force_material = /decl/material/solid/organic/wood/walnut + +/decl/flooring/wood/rough/bamboo + color = /decl/material/solid/organic/wood/bamboo::color + build_type = /obj/item/stack/tile/wood/rough/bamboo + force_material = /decl/material/solid/organic/wood/bamboo + +/decl/flooring/wood/rough/yew + color = /decl/material/solid/organic/wood/yew::color + build_type = /obj/item/stack/tile/wood/rough/yew + force_material = /decl/material/solid/organic/wood/yew + // Chipboard/wood laminate floors. Uses older icons. /decl/flooring/laminate name = "wooden laminate floor" diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index d5fa771be77a..eff98a2a1176 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -5,6 +5,12 @@ color = /decl/material/solid/organic/wood/oak::color _flooring = /decl/flooring/wood +#define WOOD_FLOOR_SUBTYPE(BASE, WOOD) \ +/turf/floor/##BASE/##WOOD { \ + color = /decl/material/solid/organic/wood/##WOOD::color; \ + _flooring = /decl/flooring/##BASE/##WOOD; \ +} + /turf/floor/wood/broken icon_state = "wood_broken0" _floor_broken = TRUE @@ -31,29 +37,27 @@ icon_state = "wood_broken4" _floor_broken = "broken4" -/turf/floor/wood/mahogany - color = /decl/material/solid/organic/wood/mahogany::color - _flooring = /decl/flooring/wood/mahogany - -/turf/floor/wood/maple - color = /decl/material/solid/organic/wood/maple::color - _flooring = /decl/flooring/wood/maple - -/turf/floor/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - _flooring = /decl/flooring/wood/ebony - -/turf/floor/wood/walnut - color = /decl/material/solid/organic/wood/walnut::color - _flooring = /decl/flooring/wood/walnut - -/turf/floor/wood/bamboo - color = /decl/material/solid/organic/wood/bamboo::color - _flooring = /decl/flooring/wood/bamboo +WOOD_FLOOR_SUBTYPE(wood, mahogany) +WOOD_FLOOR_SUBTYPE(wood, maple) +WOOD_FLOOR_SUBTYPE(wood, ebony) +WOOD_FLOOR_SUBTYPE(wood, walnut) +WOOD_FLOOR_SUBTYPE(wood, bamboo) +WOOD_FLOOR_SUBTYPE(wood, yew) + +// Rough wood floors; lower skill requirement, more wasteful to craft. +/turf/floor/wood/rough + name = "rough-hewn wooden floor" + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_state = "wood_peasant0" + color = /decl/material/solid/organic/wood/oak::color + _flooring = /decl/flooring/wood -/turf/floor/wood/yew - color = /decl/material/solid/organic/wood/yew::color - _flooring = /decl/flooring/wood/yew +WOOD_FLOOR_SUBTYPE(wood/rough, mahogany) +WOOD_FLOOR_SUBTYPE(wood/rough, maple) +WOOD_FLOOR_SUBTYPE(wood/rough, ebony) +WOOD_FLOOR_SUBTYPE(wood/rough, walnut) +WOOD_FLOOR_SUBTYPE(wood/rough, bamboo) +WOOD_FLOOR_SUBTYPE(wood/rough, yew) // Laminate floor; basically identical to wood, but uses older smoother icons. /turf/floor/laminate diff --git a/icons/turf/flooring/wood_alt.dmi b/icons/turf/flooring/wood_alt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2f55a0fb6c4db73750af523aeaca370d05370a89 GIT binary patch literal 1814 zcmV+x2kH2UP)sOZ(?wKaD2nV zwaFvW=Kufz0d!JMQvg8b*k%9#0EK!~Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1 zv)zWcDwhQix@LFpvshrCnx{R%(i_HMQvXg;vuK1|i==Wt9^=#<8 z0w}`VR1FOK4Q+riwP*H?`Ge*G_@JEhGS#*i|FI-1UGHsEt7ZAmP6aL3dpYph^zYjdD{+hebm>-cr*HUr4>Ecm{Kqz3Cpygr^V`j%eAYK?aqrmnt* zhvm{PV%!T9^Je#u$qCRHovo{Zt3`05_7K*;@xs|efEio_MVfmd(}qZS;Jxa%Yynx|gNJdN)&d89MWnQP#qREtD%AVF-}X8kErpixDO_#sTsY-%ttDU%al<0DTt>9aZ= zv*sOla*M>pwRxD%9;)prBUj@VIwZ20BzG!VyEw;5c-+XYr>|KZ1h?5~23;q_3L*$> zQ!@a-3F4fgUz@jCjn>U!@&HpXr znL5}L#GW$T*Nblgxsf>p@|x2YKr#g0Ms~Q)-c7V%?596jW#EC6@l|dB^R$H$IA|X7 z0C`%H<(9jdJ5}?BgE^tl&N=70Zx!wH0nl|@XqLGHI9)WW2cKm`2D_ih`vdNSw*2S^#o1sM(l%4A9UHIU z9cxJwtJv`Y=?|#o6hK#hEz`?ZQ(YkCDt1e&*Ni3=+~j3)&_?ipY4FkCQ*T6cImVom-LC(?8Xu%}h%~!7o)2>349M(i zob>;@P&<)Ihx<--bn@58uTy| zMoRTC5f7Oye<(+LE}{7~fcSxgHQHh-*R(C*Vd~%(StYc)XCjY1R##l=mX5vCm*Ju4 z;wZZW_~67^znuVvKwj5)>JlKM9tsPod0>c|%}U?T2bTbGu8J71hvnInAUaRa2iF>S zIqGq~BgX8lVmh1;++XQd9@xpTN^n{YUJFvgdb$Um4|qy4KlmBo5}=$8bKzS*BL@va zI=S9-a`aQ{q)X%Q+n6kJU=*$%Zl^C9jfpaymNtf`T*z& z*A)r50{EtGXfT9O_w62Fkh5?ZfT#CO4aTaN^1J44B4H8R$(4;(lwKeJ#Vv1cIN6^pwmSI>tN(Y*yj5d=e2)<01_1hd1yG23XoaGf zm9(y9l~E`zzXT8u3-jAr(&yl-t5Vl6nCvhv0fNbF{WacOeGZEONoW24rHQEO*Z%&p z|GzfT$EnU+Ts?U8CTlO3kZTpX1{i53cME6K>gY}QesN3@+}~<`$5(jK-^Z(xh?0A%=JPWXq&2><{907*qoM6N<$ Ef-fh0I{*Lx literal 0 HcmV?d00001 From 21854d52b6d5ad490b8a1742e46e2e5a6c80e063 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:17:30 -0500 Subject: [PATCH 02/82] Add rough-hewn wood floors to Shaded Hills maps --- maps/shaded_hills/shaded_hills-grassland.dmm | 8 +- maps/shaded_hills/shaded_hills-inn.dmm | 239 ++++++++++-------- maps/shaded_hills/shaded_hills-swamp.dmm | 28 +- maps/shaded_hills/shaded_hills-woods.dmm | 26 +- .../woods/chemistry_shack/chemistry_shack.dmm | 24 +- .../submaps/woods/old_cabin/old_cabin.dmm | 30 +-- 6 files changed, 192 insertions(+), 163 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index ac9e42b9c2df..b885f19cf3f4 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -110,7 +110,7 @@ "nl" = ( /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "oo" = ( /obj/item/stack/material/ore/handful/sand, @@ -144,7 +144,7 @@ /area/shaded_hills/caves/unexplored) "ul" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "vX" = ( /turf/floor/path/running_bond/basalt, @@ -159,7 +159,7 @@ /turf/floor/dirt, /area/shaded_hills/outside) "xC" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "yA" = ( /obj/abstract/landmark/latejoin/observer, @@ -188,7 +188,7 @@ /turf/floor/woven, /area/shaded_hills/outside) "EE" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river) "EL" = ( /obj/abstract/exterior_marker/inside, diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index a2ee7dff5e43..62e2a71efb30 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -24,7 +24,7 @@ /area/shaded_hills/outside/downlands) "bu" = ( /obj/structure/table/desk/dresser, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "bv" = ( /obj/structure/bed/chair/rustic{ @@ -45,11 +45,11 @@ /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "cl" = ( /obj/structure/table/wood/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "cq" = ( /obj/structure/table/wood/ebony, @@ -89,11 +89,11 @@ /area/shaded_hills/general_store) "dK" = ( /obj/structure/table/wood/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "dL" = ( /obj/structure/reagent_dispensers/barrel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "dN" = ( /obj/structure/wall_sconce/lantern{ @@ -107,7 +107,7 @@ /area/shaded_hills/shrine) "eD" = ( /obj/structure/working/loom/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "eG" = ( /obj/structure/door/walnut, @@ -149,7 +149,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "fR" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "fS" = ( /obj/structure/table/marble, @@ -176,14 +176,14 @@ /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) "ge" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "gg" = ( /obj/structure/wall_sconce/lantern{ dir = 4 }, /obj/structure/table/wood/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "gn" = ( /obj/item/flame/candle/handmade, @@ -200,7 +200,7 @@ /obj/structure/wall_sconce/lantern{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "gA" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -212,7 +212,7 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "gL" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, @@ -246,7 +246,7 @@ /obj/structure/bed/chair/bench/ebony{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "hu" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -256,7 +256,7 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "hE" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -267,7 +267,7 @@ /area/shaded_hills/outside/downlands) "hJ" = ( /obj/item/stool/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "hU" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -280,7 +280,7 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "id" = ( /obj/structure/table/wood/ebony, @@ -313,6 +313,12 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) +"iJ" = ( +/obj/structure/wall_sconce/lantern{ + dir = 4 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine) "iK" = ( /turf/wall/brick/basalt{ unique_merge_identifier = "shrine wall" @@ -329,17 +335,17 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jk" = ( /obj/structure/bed/chair/bench/pew/mahogany{ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/cleric, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "js" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jx" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -357,7 +363,7 @@ "jA" = ( /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jI" = ( /obj/structure/wall_sconce/lantern{ @@ -381,11 +387,11 @@ /obj/structure/banner_frame/wall/ebony/green{ pixel_y = 32 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "kE" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "kI" = ( /obj/structure/bed/chair/bench/pew/ebony{ @@ -405,7 +411,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "lE" = ( /obj/abstract/level_data_spawner/shaded_hills_downlands, @@ -419,7 +425,7 @@ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "me" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -438,13 +444,13 @@ "ml" = ( /obj/structure/table/wood/ebony, /obj/item/shears, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "mG" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "mJ" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -454,8 +460,14 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) +"mK" = ( +/obj/structure/door/walnut{ + dir = 4 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "nn" = ( /turf/wall/log/walnut, /area/shaded_hills/stable) @@ -507,7 +519,7 @@ /obj/structure/bed/chair/bench/pew/mahogany{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "pi" = ( /obj/structure/table/wood/ebony, @@ -522,13 +534,13 @@ /obj/structure/bed/simple/ebony, /obj/abstract/landmark/start/shaded_hills/shrine_attendant, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "qf" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "qG" = ( /turf/wall/brick/basalt, @@ -556,7 +568,7 @@ /obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "rc" = ( /obj/structure/railing/mapped/wooden/walnut, @@ -596,7 +608,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "rC" = ( /obj/structure/table/marble, @@ -614,7 +626,7 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "rY" = ( /obj/effect/floor_decal/spline/fancy/wood/corner/walnut, @@ -625,6 +637,10 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) +"sz" = ( +/obj/structure/door/walnut, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine) "sJ" = ( /obj/structure/closet/cabinet/wooden/ebony, /turf/floor/wood/walnut, @@ -672,7 +688,7 @@ /obj/structure/bed/chair/rustic{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "uk" = ( /obj/structure/bed/chair/bench/pew/ebony{ @@ -710,13 +726,13 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "vz" = ( /obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/baking_dish/earthenware, /obj/item/chems/cooking_vessel/baking_dish/earthenware, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "vA" = ( /obj/structure/table/marble, @@ -764,7 +780,7 @@ /obj/item/chems/condiment/large/salt, /obj/item/chems/condiment/flour, /obj/item/chems/condiment/sugar, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "xk" = ( /obj/structure/flora/tree/dead/mahogany, @@ -789,7 +805,7 @@ /area/shaded_hills/outside/downlands) "ya" = ( /obj/structure/reagent_dispensers/barrel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yn" = ( /obj/structure/door/walnut, @@ -807,7 +823,7 @@ /obj/item/seeds/extracted/cabbage, /obj/item/seeds/extracted/cabbage, /obj/item/seeds/extracted/cabbage, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "yx" = ( /obj/structure/table/marble, @@ -822,11 +838,11 @@ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yN" = ( /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yY" = ( /turf/floor/grass, @@ -866,7 +882,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "zQ" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "Ak" = ( /turf/floor/path/basalt, @@ -878,7 +894,8 @@ /area/shaded_hills/inn) "Aq" = ( /obj/structure/working/loom/ebony, -/turf/floor/wood/walnut, +/obj/structure/wall_sconce/lantern, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "Aw" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -907,7 +924,7 @@ "AG" = ( /obj/structure/table/wood/ebony, /obj/item/bag/sack, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "AW" = ( /obj/structure/railing/mapped/wooden/walnut, @@ -918,11 +935,11 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "Bp" = ( /obj/structure/working/butter_churn/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "Br" = ( /turf/floor/path/basalt, @@ -952,7 +969,7 @@ /area/shaded_hills/general_store) "BX" = ( /obj/structure/wall_sconce/lantern, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "Cj" = ( /obj/item/stack/material/log/mapped/walnut/twenty, @@ -964,10 +981,13 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine/kitchen) "CR" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, +/area/shaded_hills/shrine) +"CV" = ( +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Dl" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "Dn" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -979,7 +999,7 @@ /obj/item/seeds/extracted/wheat, /obj/item/seeds/extracted/wheat, /obj/item/seeds/extracted/wheat, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "Dr" = ( /obj/structure/bed/simple/ebony/cloth, @@ -990,7 +1010,7 @@ /obj/structure/bed/simple/ebony/cloth, /obj/abstract/landmark/start/shaded_hills/shrine_keeper, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Ee" = ( /turf/wall/log/walnut, @@ -1045,7 +1065,7 @@ /obj/structure/wall_sconce/lantern{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "FD" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -1093,7 +1113,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "Gu" = ( /obj/structure/table/marble, @@ -1153,7 +1173,7 @@ /area/shaded_hills/stable) "HF" = ( /obj/structure/working/spinning_wheel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "HI" = ( /turf/floor/grass, @@ -1175,7 +1195,7 @@ /obj/item/flame/candle/handmade{ pixel_y = 12 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "Ic" = ( /turf/floor/path/running_bond/basalt, @@ -1184,7 +1204,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Im" = ( /obj/structure/wall_sconce/lantern{ @@ -1199,7 +1219,7 @@ "IB" = ( /obj/structure/door/walnut, /obj/abstract/landmark/lock_preset/shaded_hills/shrine, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "IC" = ( /obj/structure/bookcase/ebony, @@ -1209,7 +1229,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "IQ" = ( /turf/wall/log/walnut/shutter/open, @@ -1246,11 +1266,11 @@ /area/shaded_hills/inn) "Jt" = ( /obj/structure/closet/cabinet/wooden/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Jw" = ( /obj/structure/bed/chair/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Jz" = ( /obj/structure/door/walnut{ @@ -1268,11 +1288,12 @@ /obj/structure/table/wood/ebony, /obj/item/ancient_surgery/cautery, /obj/item/ancient_surgery/scalpel, +/obj/structure/wall_sconce/lantern, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) "JU" = ( /obj/structure/railing/mapped/wooden/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Ka" = ( /mob/living/simple_animal/cow, @@ -1317,7 +1338,7 @@ "LH" = ( /obj/structure/table/wood/ebony, /obj/item/chems/glass/bucket/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "LK" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1392,7 +1413,7 @@ "Ot" = ( /obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/pot/iron, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "ON" = ( /obj/structure/table/marble, @@ -1424,7 +1445,7 @@ /area/shaded_hills/stable) "PG" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "PQ" = ( /obj/item/food/butchery/meat/beef, @@ -1436,7 +1457,7 @@ /area/shaded_hills/slaughterhouse) "PS" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "Qb" = ( /turf/floor/carpet, @@ -1464,7 +1485,7 @@ dir = 8; start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "QQ" = ( /turf/wall/log/walnut, @@ -1473,7 +1494,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "QW" = ( /turf/floor/path/herringbone/basalt, @@ -1536,11 +1557,11 @@ /obj/structure/bed/chair/rustic{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Sy" = ( /obj/structure/working/spinning_wheel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "SB" = ( /obj/structure/door/walnut{ @@ -1614,7 +1635,7 @@ /obj/item/food/grown/carrot, /obj/item/food/grown/carrot, /obj/item/food/grown/cabbage, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "TR" = ( /turf/floor/dirt, @@ -1624,10 +1645,15 @@ /obj/abstract/landmark/lock_preset/shaded_hills/shrine, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) +"Ue" = ( +/obj/structure/door/walnut, +/obj/abstract/landmark/lock_preset/shaded_hills/farmhouse, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "UD" = ( /obj/item/flame/candle/handmade, /obj/structure/table/end/alt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "US" = ( /obj/structure/bed/chair/rustic{ @@ -1649,7 +1675,7 @@ /area/shaded_hills/shrine) "VE" = ( /obj/structure/cask_rack/large/mapped, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "VM" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1657,11 +1683,14 @@ }, /turf/floor/dirt, /area/shaded_hills/outside/shrine) +"VO" = ( +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "VU" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "VW" = ( /obj/structure/table/marble, @@ -1680,7 +1709,7 @@ /obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "Wk" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1704,7 +1733,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "WE" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -1762,7 +1791,7 @@ pixel_y = 10; start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "XM" = ( /turf/floor/carpet/red, @@ -1774,7 +1803,7 @@ /turf/wall/brick/basalt, /area/shaded_hills/shrine) "Yg" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Yj" = ( /obj/structure/meat_hook, @@ -13289,8 +13318,8 @@ EV TR LN cl -qP -qP +VO +VO yN LN TR @@ -13442,7 +13471,7 @@ TR IQ LH yJ -qP +VO yN LN TR @@ -13593,8 +13622,8 @@ EV TR LN ml -qP -qP +VO +VO gB LN TR @@ -13745,8 +13774,8 @@ EV TR LN AG -qP -qP +VO +VO ya LN zH @@ -13897,7 +13926,7 @@ VU VU LN LN -Ti +mK LN LN LN @@ -14048,8 +14077,8 @@ Ic Dl BX LN -qP -qP +VO +VO hJ Bp IQ @@ -14199,12 +14228,12 @@ EV EV Dl Dl -WO -qP -qP -qP -qP -WO +Ue +VO +VO +VO +VO +Ue TR Rl GW @@ -14353,9 +14382,9 @@ Dl lL LN hJ -qP -qP -qP +VO +VO +VO LN xW Rl @@ -18706,7 +18735,7 @@ By iK QB Dt -CR +CV QB QB QB @@ -18858,13 +18887,13 @@ By iK QB Jt -CR -PG -CR -CR -AX -CR -CR +CV +sz +CV +CV +iJ +CV +CV IB CR CR @@ -19164,10 +19193,10 @@ iK kv kv Kh -CR +CV rS QB -CR +CV rS QB CR diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index 0ac1cb7ad186..bbd09a8b2284 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -3,7 +3,7 @@ /turf/wall/log/walnut/shutter/open, /area/shaded_hills/witch_hut) "bg" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "cE" = ( /turf/floor/mud/water, @@ -12,7 +12,7 @@ /obj/structure/bed/chair/wood/ebony{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "fG" = ( /obj/item/seeds/extracted/aloe, @@ -27,7 +27,7 @@ /obj/item/seeds/extracted/yarrow, /obj/item/seeds/extracted/yarrow, /obj/item/seeds/extracted/yarrow, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "hT" = ( /turf/floor/mud/water/deep, @@ -55,7 +55,7 @@ /obj/structure/closet/crate/chest/ebony, /obj/item/rock/hematite, /obj/item/rock/flint, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "oF" = ( /turf/unsimulated/dark_filler, @@ -65,7 +65,7 @@ /area/shaded_hills/caves/swamp) "pl" = ( /obj/structure/drying_rack/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "rP" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, @@ -86,7 +86,7 @@ start_lit = 1 }, /obj/structure/table/end/alt/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "vZ" = ( /turf/floor/mud/water, @@ -110,7 +110,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/path/basalt, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "BY" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, @@ -118,7 +118,7 @@ /area/shaded_hills/outside/swamp) "Dh" = ( /obj/item/stool/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Do" = ( /turf/unsimulated/dark_filler, @@ -135,14 +135,14 @@ /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/bucket/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Ic" = ( /turf/floor/clay, /area/shaded_hills/outside/river/swamp) "KA" = ( /obj/abstract/landmark/start/shaded_hills/herbalist, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "LF" = ( /turf/wall/natural/basalt/shaded_hills, @@ -156,7 +156,7 @@ /area/shaded_hills/outside/swamp) "SE" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Ty" = ( /obj/abstract/landmark/start/shaded_hills/traveller, @@ -172,7 +172,7 @@ /obj/structure/table/desk/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Vl" = ( /obj/structure/wall_sconce/lantern{ @@ -180,7 +180,7 @@ start_lit = 1 }, /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "VA" = ( /turf/wall/brick/basalt, @@ -198,7 +198,7 @@ /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, /obj/abstract/landmark/start/shaded_hills/herbalist, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) (1,1,1) = {" diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 569bfe9a2d1e..66168daa63f0 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -9,7 +9,7 @@ /area/shaded_hills/outside/woods) "cN" = ( /obj/item/bladed/knife, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "dp" = ( /turf/wall/log/walnut, @@ -41,7 +41,7 @@ /turf/wall/natural/basalt/shaded_hills, /area/shaded_hills/caves/river/woods) "lb" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "lC" = ( /turf/unsimulated/dark_filler, @@ -54,7 +54,7 @@ /area/shaded_hills/outside/river/lake) "mo" = ( /obj/structure/door/walnut, -/turf/floor/path/basalt, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "nl" = ( /turf/wall/natural/basalt/shaded_hills, @@ -80,7 +80,7 @@ "wD" = ( /obj/item/fishing_rod, /obj/structure/table/end/alt/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "xn" = ( /turf/unsimulated/mask, @@ -99,7 +99,7 @@ /area/shaded_hills/caves/unexplored/woods) "AN" = ( /obj/structure/railing/mapped/wooden/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river/woods) "Co" = ( /obj/abstract/landmark/start/shaded_hills/traveller/learned, @@ -124,7 +124,7 @@ "Fz" = ( /obj/structure/fire_source/stove, /obj/item/stack/material/log/mapped/walnut/ten, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "GB" = ( /turf/floor/carpet/rustic, @@ -139,17 +139,17 @@ /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, /obj/abstract/landmark/start/shaded_hills/forester, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "JI" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river/woods) "JJ" = ( /obj/structure/meat_hook, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "LJ" = ( /turf/floor/path/running_bond/basalt, @@ -159,7 +159,7 @@ /obj/item/stack/material/bundle/grass/dry{ amount = 5 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "My" = ( /turf/floor/grass, @@ -168,14 +168,14 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "MU" = ( /turf/wall/log/walnut/shutter/open, /area/shaded_hills/forester_hut) "Oi" = ( /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "PO" = ( /turf/floor/mud/water/deep, @@ -185,7 +185,7 @@ /area/shaded_hills/forester_hut) "TP" = ( /obj/structure/table/desk/dresser/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "Uz" = ( /obj/effect/departure_signpost/north, diff --git a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm b/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm index d5bf78ffb075..fa4f65d3fd71 100644 --- a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm +++ b/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm @@ -4,7 +4,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "h" = ( /obj/abstract/exterior_marker/inside, @@ -40,12 +40,12 @@ /obj/item/chems/cooking_vessel/pot/iron, /obj/item/chems/glass/handmade/teapot, /obj/abstract/landmark/organize/vertical, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "m" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/oil, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "n" = ( /obj/structure/wall_sconce/lantern{ @@ -59,7 +59,7 @@ /obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "q" = ( /obj/structure/drying_rack/ebony, @@ -80,7 +80,7 @@ "C" = ( /obj/abstract/exterior_marker/inside, /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "F" = ( /obj/abstract/exterior_marker/inside, @@ -93,17 +93,17 @@ "I" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/water, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "J" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "K" = ( /obj/abstract/exterior_marker/inside, /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "L" = ( /obj/abstract/exterior_marker/inside, @@ -114,12 +114,12 @@ /obj/item/food/grown/carrot, /obj/item/food/grown/carrot, /obj/item/kitchen/rollingpin, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "M" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/wine, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "N" = ( /obj/abstract/exterior_marker/inside, @@ -129,7 +129,7 @@ /obj/abstract/exterior_marker/inside, /obj/structure/closet/crate/chest/ebony, /obj/random/jewelry, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "U" = ( /obj/abstract/exterior_marker/inside, @@ -160,7 +160,7 @@ "Y" = ( /obj/abstract/exterior_marker/inside, /obj/structure/fire_source/stove, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) (1,1,1) = {" diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm index e6b329c0e900..84ac9a1af5e2 100644 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm @@ -2,12 +2,12 @@ "a" = ( /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "g" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/end, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "h" = ( /turf/template_noop, @@ -18,17 +18,17 @@ "k" = ( /obj/structure/closet/crate/chest/ebony, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "o" = ( /obj/structure/drying_rack/ebony, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "u" = ( /obj/structure/reagent_dispensers/barrel/ebony/beer, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "x" = ( /obj/structure/table/wood/ebony, @@ -37,7 +37,7 @@ /obj/item/rock/flint, /obj/item/rock/hematite, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "z" = ( /obj/effect/spider/spiderling/mundane, @@ -47,19 +47,19 @@ pixel_y = 24 }, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "B" = ( /obj/effect/decal/cleanable/blood, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "D" = ( /obj/effect/spider/spiderling/mundane, /obj/structure/table/wood/ebony, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "G" = ( /obj/abstract/exterior_marker/inside, @@ -72,16 +72,16 @@ /obj/item/food/grown/potato, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "I" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "L" = ( /obj/effect/spider/spiderling/mundane, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "M" = ( /obj/abstract/exterior_marker/inside, @@ -90,12 +90,12 @@ "N" = ( /obj/abstract/exterior_marker/inside, /obj/structure/coatrack/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "T" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/desk/dresser, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "W" = ( /obj/structure/wall_sconce/torch{ @@ -111,7 +111,7 @@ /obj/effect/decal/cleanable/blood, /obj/random/jewelry, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) (1,1,1) = {" From 44b370dc6b35641426cf1cb332744fa94c76235f Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:18:21 -0500 Subject: [PATCH 03/82] Add new mud turf sprite and dirt color --- code/game/turfs/flooring/_flooring.dm | 2 +- code/game/turfs/flooring/flooring_mud.dm | 3 ++- .../turfs/floors/subtypes/floor_natural.dm | 3 ++- icons/turf/flooring/mud.dmi | Bin 1839 -> 2654 bytes 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 9d3ce2f33cfd..a02efe3cb841 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -78,7 +78,7 @@ var/global/list/flooring_cache = list() var/render_trenches = TRUE var/floor_layer = TURF_LAYER var/holographic = FALSE - var/dirt_color = "#7c5e42" + var/dirt_color = /decl/material/solid/soil::color var/list/burned_states var/list/broken_states diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 59be34fdfad7..fd4866144b90 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -3,6 +3,7 @@ desc = "A stretch of thick, waterlogged mud." icon = 'icons/turf/flooring/mud.dmi' icon_base = "mud" + color = null // autoset from material icon_edge_layer = FLOOR_EDGE_MUD footstep_type = /decl/footsteps/mud turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID @@ -45,7 +46,7 @@ icon = 'icons/turf/flooring/dirt.dmi' icon_base = "dirt" icon_edge_layer = FLOOR_EDGE_DIRT - color = "#41311b" + color = null // autoset from material footstep_type = /decl/footsteps/asteroid turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/soil diff --git a/code/game/turfs/floors/subtypes/floor_natural.dm b/code/game/turfs/floors/subtypes/floor_natural.dm index 4b2ddd092f9a..09fbbcc07d27 100644 --- a/code/game/turfs/floors/subtypes/floor_natural.dm +++ b/code/game/turfs/floors/subtypes/floor_natural.dm @@ -8,7 +8,7 @@ name = "dirt" icon = 'icons/turf/flooring/dirt.dmi' icon_state = "dirt" - color = "#41311b" + color = /decl/material/solid/soil::color // preview color _base_flooring = /decl/flooring/dirt /turf/floor/chlorine_sand @@ -72,6 +72,7 @@ name = "mud" icon = 'icons/turf/flooring/mud.dmi' icon_state = "mud" + color = /decl/material/solid/soil::color // preview color _base_flooring = /decl/flooring/mud /turf/floor/mud/water diff --git a/icons/turf/flooring/mud.dmi b/icons/turf/flooring/mud.dmi index 738ae2dd4ef287787827d846b22df139c8df4f26..b73fcd5c76fb0a6a3f18208eac7011e49859c9b2 100644 GIT binary patch delta 2482 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 delta 1661 zcmV-@27>wC6t51DB!4VWOjJd{z`#a1C`mgmL^dKkFC0KKA3rl6LNp;kG$2PgB}O?U zNIE4&HzPtdAwe@BIWZr2u zG9E=YB1=3deQQ&5VMAJFdj@jDMBf!Iwnm&DrQzcR75X5FdaE78ALZFQA9OQKr3-#QC(3( zTTM1pMKE<_O*dpzJy}XLM>-{9Q#^2AM_WuaU{E@JZB&79R#HMOZe2xOPBuC&8&yUy zZCpiZSV6$Rz!)!=9g|Q2rhf$*Nkl5SFP9Pm^yprH8WWbb-!Q$<@^=s=0#gH5nW*7jAjR=f9%K`Gu{D1n5#O5jBk4Yi# zw{ZqjU;&q|uN5u;5P@;11}6GuZ7_z&ZP{&nS!wyD3Gd9_+$r&UhQhXojS#<%H_iH$ zq!R$+HL!&edGmbrT0sB+8!5d#_Ymf{UfsP7P%K_cU_3sPlV4rtzcnBl7awq!Vuvrx$1Nbl7v zx=+IaG}`yqsI>`$Kmak+u=nQ8x88n-ynt*mqyVqP7Qq0v*nj9}=|`|QCwFdZlI3uo zCRGOSZsvpw3b0B5oJ5~%)xcMZPQUJipCOa78C6i$J zi`>Hp?=R-KSE$Axr0Jv5i%uSuLo~w9fd&A>wSX1jyf@&jsKr5A=TN7QpNu~oKY9H0 zqwHe_@X3gr!GC@l>u7*CEYc+zvH}3(oPfvY{QuD6vvhi_0H8^He04qyjeieCUyNw?bFgF727W%rknr{S zi!T)bG&U!za{)TD1NlHsWv7XIfEy>(xlHiY*WmzI=j`>)J6@9x7(hYAhX}uB#h|=@ zr^YI@@&LX`GywQ6#56JB+X4h6#b};=o08Oc2*)!jjx#QX_~fM2a6*=Cq$GOvb5Ry2 z#B^63y?^+QBQW0PZLeAjSdA!P(ar|}M+8M=+Y^$U#qRegsu*Ae^xiP@J%Ls=6wULU zD zfBXr%f|&vUBcUhR$oRtCcEzITf--?5qMC}stbevYzx-t%TO<_#J`uI~n3cewoNG+Z zj?Y@3|0;#yXCK`gDBAN0DFvO*786;B?K+oZTF)6r zd4ENjEkB88{$_;_m}-_hY)QTVE%9Eq`Dfg*#!s{$KuE05*tQp(hLjFb)S0RL?Z#127F>)|d~3 zRdj{eDWKx00D=l|}^8uI}>|95BB zm=ECjKY&}I7KDYeLKv1I@-^lIL3_}c4`5>%z^pJI!1I3q0EPJg9d$Z0Ys?4e{NI^b zV?Gdc#@DEZc>eFstT7)*!vKWO2Lf9%jbaqStZzxmdg`gCo_gx(e^37aEo*5sNIp!O00000NkvXX Hu0mjf+`rD^ From debc2e8634b5a945a22343f9b4b1de603b359727 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:18:47 -0500 Subject: [PATCH 04/82] Adjust wood floor color ramp --- icons/turf/flooring/wood.dmi | Bin 2723 -> 2723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/turf/flooring/wood.dmi b/icons/turf/flooring/wood.dmi index a93de0fefca62d4bc74c33f7ab8ee31f21eaa3a4..9e17d5cbeb4095a698d99cba5288022eae738b33 100644 GIT binary patch delta 48 zcmV-00MGxU6{8i9G977Qa=*H&r=y>#q@i0|Tb7oVa(RQOsHmHpo6gRWPc8()kJQ1j Gfg%b^x)_20 delta 48 zcmV-00MGxU6{8i9G96)Oa=)#rr=y>#q@i0|Tb7oVa(RQOsHmHpo6f|MPc8)cpFah$ Gfg%b+{TE*V From d4020b99553c372460a5a2353b77610f145da485 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:19:43 -0500 Subject: [PATCH 05/82] Add temperature requirements to cooking recipes --- code/modules/food/cooking/recipes/recipe_baked.dm | 3 +++ code/modules/food/cooking/recipes/recipe_boiled.dm | 2 +- code/modules/food/cooking/recipes/recipe_fried.dm | 3 +++ code/modules/food/cooking/recipes/recipe_grilled.dm | 3 +++ code/modules/food/cooking/recipes/recipe_steamed.dm | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/food/cooking/recipes/recipe_baked.dm b/code/modules/food/cooking/recipes/recipe_baked.dm index 90bb8ad590d9..a549e1b3f8a8 100644 --- a/code/modules/food/cooking/recipes/recipe_baked.dm +++ b/code/modules/food/cooking/recipes/recipe_baked.dm @@ -4,6 +4,9 @@ RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_BAKING_DISH ) + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS //cooking_heat_type = COOKING_HEAT_INDIRECT /decl/recipe/baked/pizzamargherita diff --git a/code/modules/food/cooking/recipes/recipe_boiled.dm b/code/modules/food/cooking/recipes/recipe_boiled.dm index d1f8f74207fc..031bd5a164ab 100644 --- a/code/modules/food/cooking/recipes/recipe_boiled.dm +++ b/code/modules/food/cooking/recipes/recipe_boiled.dm @@ -1,6 +1,6 @@ /decl/recipe/boiled abstract_type = /decl/recipe/boiled - //minimum_temperature = T100C + minimum_temperature = 80 CELSIUS // increase to /decl/material/liquid/water::boiling_point once microwaves are reworked //cooking_heat_type = COOKING_HEAT_INDIRECT //cooking_medium_type = /decl/material/liquid/water //cooking_medium_amount = 20 diff --git a/code/modules/food/cooking/recipes/recipe_fried.dm b/code/modules/food/cooking/recipes/recipe_fried.dm index 784b619335ed..3d4af90fc98d 100644 --- a/code/modules/food/cooking/recipes/recipe_fried.dm +++ b/code/modules/food/cooking/recipes/recipe_fried.dm @@ -1,5 +1,8 @@ /decl/recipe/fried abstract_type = /decl/recipe/fried + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS //cooking_heat_type = COOKING_HEAT_DIRECT //cooking_medium_type = /decl/material/liquid/oil container_categories = list( diff --git a/code/modules/food/cooking/recipes/recipe_grilled.dm b/code/modules/food/cooking/recipes/recipe_grilled.dm index d2e4e2340902..cf6896a827c3 100644 --- a/code/modules/food/cooking/recipes/recipe_grilled.dm +++ b/code/modules/food/cooking/recipes/recipe_grilled.dm @@ -5,6 +5,9 @@ RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_SKILLET ) + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS completion_message = "The meat sizzles as it is cooked through." /decl/recipe/grilled/plainsteak diff --git a/code/modules/food/cooking/recipes/recipe_steamed.dm b/code/modules/food/cooking/recipes/recipe_steamed.dm index dacac34bed15..746439f6ac28 100644 --- a/code/modules/food/cooking/recipes/recipe_steamed.dm +++ b/code/modules/food/cooking/recipes/recipe_steamed.dm @@ -1,5 +1,8 @@ /decl/recipe/steamed abstract_type = /decl/recipe/steamed + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS /decl/recipe/steamed/chawanmushi fruit = list("mushroom" = 1) From 2ac7a44f1ced45e587b81d4fd2c4ac11d8afd22b Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:20:55 -0500 Subject: [PATCH 06/82] Add doc comments to lighting_turf.dm --- code/modules/lighting/lighting_turf.dm | 28 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index de8134d5e519..d4008f536a20 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -1,16 +1,22 @@ /turf var/dynamic_lighting = TRUE - var/ambient_light // If non-null, a hex RGB light color that should be applied to this turf. - var/ambient_light_multiplier = 0.3 // The power of the above is multiplied by this. Setting too high may drown out normal lights on the same turf. + /// If non-null, a hex RGB light color that should be applied to this turf. + var/ambient_light + /// The power of the above is multiplied by this. Setting too high may drown out normal lights on the same turf. + var/ambient_light_multiplier = 0.3 luminosity = 1 var/tmp/lighting_corners_initialised = FALSE - var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf. - var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay. + /// List of light sources affecting this turf. + var/tmp/list/datum/light_source/affecting_lights + /// Our lighting overlay, used to apply multiplicative lighting to the tile and its contents. + var/tmp/atom/movable/lighting_overlay/lighting_overlay var/tmp/list/datum/lighting_corner/corners - var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. - var/tmp/ambient_has_indirect = FALSE // If this is TRUE, an above turf's ambient light is affecting this turf. + /// Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. + var/tmp/has_opaque_atom = FALSE + /// If this is TRUE, an above turf's ambient light is affecting this turf. + var/tmp/ambient_has_indirect = FALSE // Record-keeping, do not touch -- that means you, admins. var/tmp/ambient_light_old @@ -92,14 +98,14 @@ ambient_light_old = ambient_light -// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. +/// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() var/datum/light_source/L for (var/thing in affecting_lights) L = thing L.vis_update() -// Forces a lighting update. Reconsider lights is preferred when possible. +/// Forces a lighting update. Reconsider lights is preferred when possible. /turf/proc/force_update_lights() var/datum/light_source/L for (var/thing in affecting_lights) @@ -137,7 +143,7 @@ C.active = TRUE -// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. +/// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. /turf/proc/get_avg_color() if (!lighting_overlay) return null @@ -159,7 +165,7 @@ #define SCALE(targ,min,max) (targ - min) / (max - min) -// Used to get a scaled lumcount. +/// Returns a lumcount (average intensity of color channels) scaled between minlum and maxlum. /turf/proc/get_lumcount(minlum = 0, maxlum = 1) if (!lighting_overlay) return 0.5 @@ -176,7 +182,7 @@ #undef SCALE -// Can't think of a good name, this proc will recalculate the has_opaque_atom variable. +/// Can't think of a good name, this proc will recalculate the has_opaque_atom variable. /turf/proc/recalc_atom_opacity() #ifdef AO_USE_LIGHTING_OPACITY var/old = has_opaque_atom From cc76d55872dcb2ab23aaf4e456932dd67a1dc27e Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 18 Dec 2024 19:28:27 -0500 Subject: [PATCH 07/82] Add Doe's new chest sprites --- .../structures/crates_lockers/crates.dm | 23 ++++++++++++++++++ icons/obj/closets/bases/chest.dmi | Bin 1415 -> 1872 bytes 2 files changed, 23 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f9a8de10bf38..6df0fd7eb1cb 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -324,6 +324,29 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/wood/oak color = /decl/material/solid/organic/wood/oak::color + var/icon/overlay_icon = 'icons/obj/closets/bases/chest.dmi' + // TODO: Rework chest crafting so that this can use reinf_material instead. + /// The material used for the opacity and color of the trim overlay. + 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) + desc = "[desc] It has a trim made of [overlay_material.solid_name]." + +/obj/structure/closet/crate/chest/on_update_icon() + . = ..() + if(istype(overlay_material)) + var/overlay_state = opened ? "open-overlay" : "base-overlay" + var/image/trim = overlay_image(overlay_icon, overlay_state, overlay_material.color, RESET_COLOR|RESET_ALPHA) + trim.alpha = clamp((50 + overlay_material.opacity * 255), 0, 255) + add_overlay(trim) /obj/structure/closet/crate/chest/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/icons/obj/closets/bases/chest.dmi b/icons/obj/closets/bases/chest.dmi index 491dcbd62c0485d89f2339333860f3722b42ccbe..bef40525584deb2103b95053b0fbaabd9801ca3b 100644 GIT binary patch delta 1796 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 R()0iT002ovPDHLkV1m>hruYB= From 9c958bf5831ce9a29e3566c914bb7d2b8ac7963e Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 19 Dec 2024 01:09:45 -0500 Subject: [PATCH 08/82] Add recipes for rough wooden tiles --- .../crafting/stack_recipes/recipes_stacks.dm | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/code/modules/crafting/stack_recipes/recipes_stacks.dm b/code/modules/crafting/stack_recipes/recipes_stacks.dm index c78160e09fc0..06c19604fbfc 100644 --- a/code/modules/crafting/stack_recipes/recipes_stacks.dm +++ b/code/modules/crafting/stack_recipes/recipes_stacks.dm @@ -26,6 +26,26 @@ result_type = /obj/item/stack/tile/wood/walnut required_material = /decl/material/solid/organic/wood/walnut +/decl/stack_recipe/tile/wood/mahogany/rough + crafting_extra_cost_factor = 2 // wasteful but easy + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/mahogany + +/decl/stack_recipe/tile/wood/maple/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/maple + +/decl/stack_recipe/tile/wood/ebony/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_HARD_DIY + result_type = /obj/item/stack/tile/wood/rough/ebony + +/decl/stack_recipe/tile/wood/walnut/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/walnut + /decl/stack_recipe/tile/wood/oak_laminate result_type = /obj/item/stack/tile/wood/laminate/oak required_material = /decl/material/solid/organic/wood/chipboard From ce03e41897c03892818414c61e60f7bc88a83371 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 30 May 2024 18:13:22 -0400 Subject: [PATCH 09/82] Add heights to mob inventory slots --- code/datums/inventory_slots/_inventory_slot.dm | 2 ++ code/datums/inventory_slots/slots/slot_back.dm | 1 + code/datums/inventory_slots/slots/slot_ears.dm | 1 + code/datums/inventory_slots/slots/slot_glasses.dm | 1 + code/datums/inventory_slots/slots/slot_head.dm | 1 + code/datums/inventory_slots/slots/slot_id.dm | 1 + code/datums/inventory_slots/slots/slot_mask.dm | 1 + code/datums/inventory_slots/slots/slot_shoes.dm | 1 + code/datums/inventory_slots/slots/slot_suit_storage.dm | 1 + 9 files changed, 10 insertions(+) diff --git a/code/datums/inventory_slots/_inventory_slot.dm b/code/datums/inventory_slots/_inventory_slot.dm index 204284e6f2cc..cc8aa6ad420c 100644 --- a/code/datums/inventory_slots/_inventory_slot.dm +++ b/code/datums/inventory_slots/_inventory_slot.dm @@ -19,6 +19,8 @@ var/requires_slot_flags var/requires_organ_tag var/quick_equip_priority = 0 // Higher priority means it will be checked first. If null, will not be considered for quick equip. + /// What depth of fluid is necessary for an item in this slot to be considered submerged? + var/fluid_height = FLUID_SHALLOW var/mob_overlay_layer var/alt_mob_overlay_layer diff --git a/code/datums/inventory_slots/slots/slot_back.dm b/code/datums/inventory_slots/slots/slot_back.dm index cc65742561b3..7c2496867edf 100644 --- a/code/datums/inventory_slots/slots/slot_back.dm +++ b/code/datums/inventory_slots/slots/slot_back.dm @@ -7,6 +7,7 @@ requires_slot_flags = SLOT_BACK mob_overlay_layer = HO_BACK_LAYER quick_equip_priority = 14 + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/back/simple requires_organ_tag = null diff --git a/code/datums/inventory_slots/slots/slot_ears.dm b/code/datums/inventory_slots/slots/slot_ears.dm index 295c24a5a89d..1e905433cfc3 100644 --- a/code/datums/inventory_slots/slots/slot_ears.dm +++ b/code/datums/inventory_slots/slots/slot_ears.dm @@ -10,6 +10,7 @@ requires_slot_flags = SLOT_EARS mob_overlay_layer = HO_L_EAR_LAYER quick_equip_priority = 7 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /datum/inventory_slot/ear/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) for(var/slot in global.airtight_slots) diff --git a/code/datums/inventory_slots/slots/slot_glasses.dm b/code/datums/inventory_slots/slots/slot_glasses.dm index 0068fac4a1ed..d686ac93edb9 100644 --- a/code/datums/inventory_slots/slots/slot_glasses.dm +++ b/code/datums/inventory_slots/slots/slot_glasses.dm @@ -11,6 +11,7 @@ mob_overlay_layer = HO_GLASSES_LAYER alt_mob_overlay_layer = HO_GOGGLES_LAYER quick_equip_priority = 5 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /datum/inventory_slot/glasses/get_examined_string(mob/owner, mob/user, distance, hideflags, decl/pronouns/pronouns) if(_holding && !(hideflags & HIDEEYES)) diff --git a/code/datums/inventory_slots/slots/slot_head.dm b/code/datums/inventory_slots/slots/slot_head.dm index dce1c5e4ab64..6c31459f016e 100644 --- a/code/datums/inventory_slots/slots/slot_head.dm +++ b/code/datums/inventory_slots/slots/slot_head.dm @@ -9,6 +9,7 @@ requires_slot_flags = SLOT_HEAD mob_overlay_layer = HO_HEAD_LAYER quick_equip_priority = 9 + fluid_height = FLUID_OVER_MOB_HEAD /datum/inventory_slot/head/simple requires_organ_tag = null diff --git a/code/datums/inventory_slots/slots/slot_id.dm b/code/datums/inventory_slots/slots/slot_id.dm index 35d80c2c5a47..67b759c682ca 100644 --- a/code/datums/inventory_slots/slots/slot_id.dm +++ b/code/datums/inventory_slots/slots/slot_id.dm @@ -6,6 +6,7 @@ requires_slot_flags = SLOT_ID mob_overlay_layer = HO_ID_LAYER quick_equip_priority = 13 + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/id/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/clothing/clothes = user.get_equipped_item(slot_w_uniform_str) diff --git a/code/datums/inventory_slots/slots/slot_mask.dm b/code/datums/inventory_slots/slots/slot_mask.dm index 33f44fa90444..53fa82f64213 100644 --- a/code/datums/inventory_slots/slots/slot_mask.dm +++ b/code/datums/inventory_slots/slots/slot_mask.dm @@ -10,6 +10,7 @@ can_be_hidden = TRUE mob_overlay_layer = HO_FACEMASK_LAYER quick_equip_priority = 10 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /datum/inventory_slot/mask/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) if(prop?.flags_inv & BLOCK_ALL_HAIR) diff --git a/code/datums/inventory_slots/slots/slot_shoes.dm b/code/datums/inventory_slots/slots/slot_shoes.dm index 02c47d26787c..6fc4889be0bd 100644 --- a/code/datums/inventory_slots/slots/slot_shoes.dm +++ b/code/datums/inventory_slots/slots/slot_shoes.dm @@ -10,6 +10,7 @@ ) requires_slot_flags = SLOT_FEET quick_equip_priority = 3 + fluid_height = 3 /datum/inventory_slot/shoes/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/suit = user.get_equipped_item(slot_wear_suit_str) diff --git a/code/datums/inventory_slots/slots/slot_suit_storage.dm b/code/datums/inventory_slots/slots/slot_suit_storage.dm index 91a03c4610d8..832a72563294 100644 --- a/code/datums/inventory_slots/slots/slot_suit_storage.dm +++ b/code/datums/inventory_slots/slots/slot_suit_storage.dm @@ -5,6 +5,7 @@ slot_id = slot_s_store_str requires_organ_tag = BP_CHEST mob_overlay_layer = HO_SUIT_STORE_LAYER + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/suit_storage/can_equip_to_slot(var/mob/user, var/obj/item/prop, var/disable_warning, var/ignore_equipped) . = ..() From 14ba304d8d7d468fd1de5aa778d8a8b98097f08f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 30 May 2024 18:13:34 -0400 Subject: [PATCH 10/82] Add more slot helpers to items --- code/modules/mob/inventory.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3dddd78acedb..89f590dcecda 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -271,6 +271,9 @@ return 1 //already unequipped, so success return I.mob_can_unequip(src, slot) +/obj/item/proc/get_any_equipped_slot() + return get_equipped_slot() || get_held_slot() + /obj/item/proc/get_equipped_slot() if(!ismob(loc)) return null @@ -285,6 +288,12 @@ if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I return slot_str +/obj/item/proc/get_held_slot() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_held_slot_for_item(src) + /mob/proc/get_held_slot_for_item(obj/item/I) var/list/slots = get_held_item_slots() if(!length(slots)) From dfa2dcbd1bdbe0173f842c1e2546dae52da91405 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 00:48:03 -0500 Subject: [PATCH 11/82] Make fluids check tables, floating/throwing, and turf height --- .../datums/inventory_slots/_inventory_slot.dm | 2 +- code/game/atoms_fluids.dm | 48 ++++++++++++++++++- code/game/turfs/turf_fluids.dm | 5 ++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/code/datums/inventory_slots/_inventory_slot.dm b/code/datums/inventory_slots/_inventory_slot.dm index cc8aa6ad420c..6f23b1b51a10 100644 --- a/code/datums/inventory_slots/_inventory_slot.dm +++ b/code/datums/inventory_slots/_inventory_slot.dm @@ -20,7 +20,7 @@ var/requires_organ_tag var/quick_equip_priority = 0 // Higher priority means it will be checked first. If null, will not be considered for quick equip. /// What depth of fluid is necessary for an item in this slot to be considered submerged? - var/fluid_height = FLUID_SHALLOW + var/fluid_height = FLUID_SHALLOW // we're treating FLUID_SHALLOW as waist level, basically var/mob_overlay_layer var/alt_mob_overlay_layer diff --git a/code/game/atoms_fluids.dm b/code/game/atoms_fluids.dm index e69ed3bbfc30..d25bb595df6d 100644 --- a/code/game/atoms_fluids.dm +++ b/code/game/atoms_fluids.dm @@ -23,19 +23,63 @@ var/turf/T = get_turf(src) return T?.is_flooded(lying_mob, absolute) -/atom/proc/submerged(depth) +/atom/proc/submerged(depth, above_turf) if(isnull(depth)) var/turf/T = get_turf(src) if(!istype(T)) return FALSE depth = T.get_fluid_depth() + var/turf_height = T.get_physical_height() + // If we're not on the surface of the turf (floating, leaping, or other sources) + // then we add the turf height to the depth, so you can jump over a water-filled pit + // or throw something over it + if(turf_height < 0 && above_turf) + depth += turf_height if(ismob(loc)) return depth >= FLUID_SHALLOW if(isturf(loc)) + if(locate(/obj/structure/table)) + return depth >= FLUID_SHALLOW return depth >= 3 return depth >= FLUID_OVER_MOB_HEAD -/turf/submerged(depth) +// This override exists purely because throwing is movable-level and not atom-level, +// for obvious reasons (that being that non-movable atoms cannot move). +/atom/movable/submerged(depth, above_turf) + above_turf ||= !!throwing + return ..() + +/obj/item/submerged(depth, above_turf) + var/datum/inventory_slot/slot = get_any_equipped_slot() + // we're in a mob and have a slot, so we bail early + if(istype(slot)) + var/mob/owner = loc // get_any_equipped_slot checks istype already + if(owner.current_posture.prone) + return ..() // treat us like an atom sitting on the ground (or table), really + if(isnull(depth)) // copied from base proc, since we aren't calling parent in this block + var/turf/T = get_turf(src) + if(!istype(T)) + return FALSE + depth = T.get_fluid_depth() + return depth >= slot.fluid_height + return ..() + +/mob/submerged(depth, above_turf) + above_turf ||= is_floating || !!throwing // check throwing here because of the table check coming before parent call + var/obj/structure/table/standing_on = locate(/obj/structure/table) in loc + // can't stand on a table if we're floating + if(!above_turf && standing_on && standing_on.mob_offset > 0) // standing atop a table that is a meaningful amount above the ground (not a bench) + if(isnull(depth)) // duplicated from atom because we don't call parent in this block + var/turf/T = get_turf(src) + if(!istype(T)) + return FALSE + depth = T.get_fluid_depth() + // assuming default tables are at waist height, this is a simple adjustment to scale it for taller/shorter ones + return depth >= floor(FLUID_SHALLOW * (standing_on.mob_offset / /obj/structure/table::mob_offset)) + return ..() + +// above_turf is nonsensical for turfs but I don't want the linter to complain +/turf/submerged(depth, above_turf) if(isnull(depth)) depth = get_fluid_depth() return depth >= FLUID_OVER_MOB_HEAD diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index e377ec4b32fa..42220adc739b 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -117,7 +117,12 @@ ..() if(!QDELETED(src) && fluids?.total_volume) fluids.touch_turf(src) + // technically, fluids might not be our own reagent holder + // so we factor in height ourselves + var/fluid_height = fluids.total_volume + get_physical_height() for(var/atom/movable/AM as anything in get_contained_external_atoms()) + if(!AM.submerged(fluid_height)) + continue AM.fluid_act(fluids) /turf/proc/remove_fluids(var/amount, var/defer_update) From fb4f7ac17a6f717d44bb563e4c1135d696c7c290 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 16:49:14 +1100 Subject: [PATCH 12/82] Bowls cannot be lidded. --- code/modules/crafting/handmade_items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index d870d9ecf31c..6a03aba8f7dc 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -5,6 +5,9 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME presentation_flags = PRESENTATION_FLAG_NAME +/obj/item/chems/glass/handmade/can_lid() + return FALSE + /obj/item/chems/glass/handmade/on_reagent_change() if((. = ..())) update_icon() From fa74516b0d567673e36f43e3853b56205dc69870 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 16:49:56 +1100 Subject: [PATCH 13/82] Basic hammers can also be used as crowbars. --- code/modules/tools/subtypes/hammers.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/tools/subtypes/hammers.dm b/code/modules/tools/subtypes/hammers.dm index 20304b690e56..bb1c9ee58cd5 100644 --- a/code/modules/tools/subtypes/hammers.dm +++ b/code/modules/tools/subtypes/hammers.dm @@ -29,7 +29,10 @@ return tool_properties /obj/item/tool/hammer/get_initial_tool_qualities() - var/static/list/tool_qualities = list(TOOL_HAMMER = TOOL_QUALITY_DEFAULT) + var/static/list/tool_qualities = list( + TOOL_HAMMER = TOOL_QUALITY_DEFAULT, + TOOL_CROWBAR = TOOL_QUALITY_WORST + ) return tool_qualities /obj/item/tool/hammer/sledge From 9cac761d303c1ed39942cdd3f689b42eb5d8089d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 17:09:33 +1100 Subject: [PATCH 14/82] Hammers now function as wrenches/crowbars for unanchoring/dismantling structures. --- code/game/objects/structures/__structure.dm | 8 ++-- .../structures/_structure_construction.dm | 39 +++++++++++++++++++ code/game/objects/structures/barrel.dm | 1 + code/game/objects/structures/tables.dm | 3 ++ code/game/objects/structures/window.dm | 3 ++ code/modules/multiz/ladder.dm | 6 +++ code/modules/reagents/reagent_dispenser.dm | 4 +- 7 files changed, 58 insertions(+), 6 deletions(-) diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index b65b704b302f..b498045253d7 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -88,19 +88,19 @@ if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) - to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench, and moved around.")) + to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench or hammer, and moved around.")) else - to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench.")) + to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench or hammer.")) if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) - var/removed_with = "a crowbar" + var/removed_with = "a crowbar or hammer" if(material && material.removed_by_welder) removed_with = "a welding torch" if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) else - to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench first.")) + to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench or hammer first.")) else to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index c367f6f1bf8b..52816dad8a5f 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -2,6 +2,43 @@ var/wired var/tool_interaction_flags +/obj/structure/proc/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + + // Resolve ambiguous interactions. + var/can_deconstruct = (tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user) + var/can_unanchor = (tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user) + if(can_deconstruct && can_unanchor) + var/choice = alert(user, "Do you wish to [anchored ? "unanchor" : "anchor"] or dismantle this structure?", "Tool Choice", (anchored ? "Unanchor" : "Anchor"), "Deconstruct", "Cancel") + if(!choice || choice == "Cancel" || QDELETED(src) || QDELETED(user) || QDELETED(hammer) || !CanPhysicallyInteract(user) || user.get_active_held_item() != hammer) + return TRUE + if(choice == "Deconstruct") + can_unanchor = FALSE + else + can_deconstruct = FALSE + + if(can_unanchor) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 100, 1) + visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unanchoring [src]" : "anchoring [src] in place"] with \the [hammer].")) + if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(src.loc, 'sound/items/Deconstruct.ogg', 100, 1) + anchored = !anchored + visible_message(SPAN_NOTICE("\The [user] has [anchored ? "anchored" : "unanchored"] \the [src] with \the [hammer].")) + update_icon() + return TRUE + + if(can_deconstruct) + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + visible_message(SPAN_NOTICE("\The [user] starts knocking apart \the [src] with \the [hammer].")) + if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [hammer].")) + dismantle_structure(user) + return TRUE + + return FALSE + /obj/structure/proc/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) if((tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) @@ -122,6 +159,8 @@ take_damage(force, used_item.atom_damage_type) . = TRUE + else if(IS_HAMMER(used_item)) + . = handle_default_hammer_attackby(user, used_item) else if(IS_WRENCH(used_item)) . = handle_default_wrench_attackby(user, used_item) else if(IS_SCREWDRIVER(used_item)) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 20d0c9d6eb23..25597a77ae7a 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -16,6 +16,7 @@ volume = 7500 movable_flags = MOVABLE_FLAG_WHEELED throwpass = TRUE + tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT /obj/structure/reagent_dispensers/barrel/Initialize() ..() diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index a03268a81467..3299e142a705 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -636,6 +636,9 @@ return TRUE return FALSE +/obj/structure/table/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + return !reinf_material && ..() + /obj/structure/table/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) return !reinf_material && ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4ad6358add5e..00e0d27d24f3 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -207,6 +207,9 @@ playsound(loc, crowbar.get_tool_sound(TOOL_CROWBAR) || 'sound/items/Crowbar.ogg', 75, 1) return TRUE +/obj/structure/window/handle_default_hammer_attackby(mob/user, obj/item/hammer) + return FALSE + /obj/structure/window/handle_default_wrench_attackby(mob/user, obj/item/wrench) if(anchored || (reinf_material && construction_state > CONSTRUCTION_STATE_NO_FRAME)) return FALSE // ineligible, allow other interactions to proceed diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm index e737b9164543..10fc3c5a59a0 100644 --- a/code/modules/multiz/ladder.dm +++ b/code/modules/multiz/ladder.dm @@ -23,6 +23,12 @@ var/static/list/radial_options = list("up" = radial_ladder_up, "down" = radial_ladder_down) +/obj/structure/ladder/handle_default_hammer_attackby() + var/last_anchored = anchored + . = ..() + if(anchored != last_anchored) + find_connections() + /obj/structure/ladder/handle_default_wrench_attackby() var/last_anchored = anchored . = ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 149d3b453de0..196b1d55f7ee 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -37,9 +37,9 @@ if(!(. = ..())) return if(reagents?.total_volume > 0) - tool_interaction_flags = 0 + tool_interaction_flags &= ~TOOL_INTERACTION_DECONSTRUCT else - tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT /obj/structure/reagent_dispensers/initialize_reagents(populate = TRUE) if(!reagents) From de42c733d04baefeab70c7c7730aebd0ab7b9f9a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:00:31 +1100 Subject: [PATCH 15/82] Structure parts_type does not get applied to non-main materials. --- .../structures/_structure_materials.dm | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 3245a10faa26..f3c619b1f61b 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -65,19 +65,25 @@ if(parts_type && !ispath(parts_type, /obj/item/stack)) for(var/i = 1 to max(parts_amount, 1)) LAZYADD(., create_dismantled_part(T)) - else - for(var/mat in matter) - var/decl/material/M = GET_DECL(mat) - var/placing - if(isnull(parts_amount)) - placing = (matter[mat] / SHEET_MATERIAL_AMOUNT) * 0.75 - if(parts_type) - placing *= atom_info_repository.get_matter_multiplier_for(parts_type, mat, placing) - placing = floor(placing) - else - placing = parts_amount - if(placing > 0) + return + + for(var/mat in matter) + + var/decl/material/M = GET_DECL(mat) + var/placing + if(isnull(parts_amount)) + placing = (matter[mat] / SHEET_MATERIAL_AMOUNT) * 0.75 + if(material == M && parts_type) + placing *= atom_info_repository.get_matter_multiplier_for(parts_type, mat, placing) + placing = floor(placing) + else + placing = parts_amount + + if(placing > 0) + if(material == M) LAZYADD(., M.place_dismantled_product(T, FALSE, placing, parts_type)) + else + LAZYADD(., M.place_dismantled_product(T, FALSE, placing)) /obj/structure/proc/clear_materials() matter = null From 2f862843bbfef3974d2a2c420d09fdae1eb30e06 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:11:18 +1100 Subject: [PATCH 16/82] Garlic oil can be used as a weaker antibiotic. --- code/modules/materials/_materials.dm | 10 ++++++++++ code/modules/organs/organ.dm | 6 +++--- code/modules/reagents/chems/chems_drinks.dm | 9 +++++---- code/modules/reagents/chems/chems_medicines.dm | 11 +---------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 01aa188e0cc5..0c2dbc287b5a 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -261,6 +261,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/cocktail_ingredient var/defoliant var/fruit_descriptor // String added to fruit desc if this chemical is present. + /// Does this reagent have an antibiotic effect (helping with infections)? + var/antibiotic_strength = 0 var/dirtiness = DIRTINESS_NEUTRAL // How dirty turfs are after being exposed to this material. Negative values cause a cleaning/sterilizing effect. var/decontamination_dose = 0 // Amount required for a decontamination effect, if any. @@ -825,6 +827,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(M.status_flags & GODMODE) return + if(antibiotic_strength) + M.adjust_immunity(-0.1 * antibiotic_strength) + M.add_chemical_effect(CE_ANTIBIOTIC, antibiotic_strength) + if(REAGENT_VOLUME(holder, type) > 10) + M.adjust_immunity(-0.3 * antibiotic_strength) + if(LAZYACCESS(M.chem_doses, type) > 15) + M.adjust_immunity(-0.25 * antibiotic_strength) + if(nutriment_factor || hydration_factor) if(injectable_nutrition) adjust_mob_nutrition(M, removed, holder, CHEM_INJECT) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 4f6094ae0f9a..644368591096 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -372,11 +372,11 @@ if (germ_level < INFECTION_LEVEL_ONE) germ_level = 0 //cure instantly else if (germ_level < INFECTION_LEVEL_TWO) - germ_level -= 5 //at germ_level == 500, this should cure the infection in 5 minutes + germ_level -= round(5 * antibiotics) //at germ_level == 500, this should cure the infection in 5 minutes else - germ_level -= 3 //at germ_level == 1000, this will cure the infection in 10 minutes + germ_level -= round(3 * antibiotics) //at germ_level == 1000, this will cure the infection in 10 minutes if(owner && owner.current_posture.prone) - germ_level -= 2 + germ_level -= round(2 * antibiotics) germ_level = max(0, germ_level) /obj/item/organ/proc/take_general_damage(var/amount, var/silent = FALSE) diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index ba069e72a232..e7ec3f1b2414 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -178,15 +178,16 @@ allergen_flags = ALLERGEN_VEGETABLE /decl/material/liquid/drink/juice/garlic - name = "garlic juice" - lore_text = "Who would even drink this?" + name = "garlic oil" + lore_text = "A strong-smelling, pungent oil pressed from garlic cloves. It has some antibiotic properties, and can help with infections." taste_description = "bad breath" nutriment_factor = 1 color = "#eeddcc" uid = "chem_drink_garlic" + antibiotic_strength = 0.65 - glass_name = "garlic juice" - glass_desc = "Who would even drink juice from garlic?" + glass_name = "garlic oil" + glass_desc = "A potion of guaranteed bad breath." allergen_flags = ALLERGEN_ALLIUM /decl/material/liquid/drink/juice/onion diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 5724175fbce5..701d2f1d4763 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -236,19 +236,10 @@ overdose = REAGENTS_OVERDOSE/2 scannable = 1 value = 1.5 + antibiotic_strength = 1 exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_antibiotics" -/decl/material/liquid/antibiotics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, type) - . = ..() - M.adjust_immunity(-0.1) - M.add_chemical_effect(CE_ANTIBIOTIC, 1) - if(volume > 10) - M.adjust_immunity(-0.3) - if(LAZYACCESS(M.chem_doses, type) > 15) - M.adjust_immunity(-0.25) - /decl/material/liquid/antibiotics/affect_overdose(mob/living/M, total_dose) ..() M.adjust_immunity(-0.5) From 34eda11872b7a15269231732043c48f4e93ebba7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:26:31 +1100 Subject: [PATCH 17/82] Ethanol is now an abstract type. --- .../integrated_electronics/passive/power.dm | 12 ++--- code/modules/materials/_materials.dm | 2 - .../liquids/materials_liquid_toxins.dm | 6 +-- .../definitions/solids/materials_solid_ice.dm | 6 +-- code/modules/organs/internal/stomach.dm | 3 +- code/modules/reagents/Chemistry-Holder.dm | 4 +- code/modules/reagents/chems/chems_ethanol.dm | 44 ++++++++++--------- .../reagents/dispenser/cartridge_presets.dm | 2 +- .../reagents/reactions/reaction_alcohol.dm | 2 +- .../reagents/reactions/reaction_compounds.dm | 2 +- .../reagents/reactions/reaction_drugs.dm | 12 ++--- .../reagents/reactions/reaction_herbal.dm | 10 ++--- .../reagents/reactions/reaction_recipe.dm | 2 +- .../reagents/reagent_containers/food/lunch.dm | 10 ++--- code/modules/surgery/other.dm | 2 +- code/modules/vehicles/engine.dm | 2 +- .../finds/find_types/chem_containers.dm | 20 ++++----- 17 files changed, 72 insertions(+), 69 deletions(-) diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 8a5e9a6ccbea..7741451973fc 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -98,13 +98,13 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH var/volume = 60 var/list/fuel = list( - /decl/material/gas/hydrogen = 50000, + /decl/material/gas/hydrogen = 50000, /decl/material/gas/hydrogen/deuterium = 50000, - /decl/material/gas/hydrogen/tritium = 50000, - /decl/material/liquid/fuel = 15000, - /decl/material/solid/carbon = 10000, - /decl/material/liquid/ethanol = 10000, - /decl/material/liquid/nutriment = 8000 + /decl/material/gas/hydrogen/tritium = 50000, + /decl/material/liquid/fuel = 15000, + /decl/material/solid/carbon = 10000, + /decl/material/liquid/ethanol/spirits = 10000, + /decl/material/liquid/nutriment = 8000 ) var/multi = 1 diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 0c2dbc287b5a..20195de9055b 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -288,13 +288,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/chilling_message = "crackles and freezes!" var/chilling_sound = 'sound/effects/bubbles.ogg' var/list/chilling_products - var/bypass_chilling_products_for_root_type var/heating_point var/heating_message = "begins to boil!" var/heating_sound = 'sound/effects/bubbles.ogg' var/list/heating_products - var/bypass_heating_products_for_root_type var/accelerant_value = FUEL_VALUE_NONE var/burn_temperature = 100 CELSIUS var/burn_product diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 2b8f8eca63cd..081d8dacd23d 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -218,9 +218,9 @@ color = "#140b30" toxicity = 4 heating_products = list( - /decl/material/liquid/acetone = 0.4, - /decl/material/solid/carbon = 0.4, - /decl/material/liquid/ethanol = 0.2 + /decl/material/liquid/acetone = 0.4, + /decl/material/solid/carbon = 0.4, + /decl/material/liquid/ethanol/spirits = 0.2 ) heating_point = 145 CELSIUS heating_message = "separates." diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index dd69df88531d..badd55eb76ab 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -117,9 +117,9 @@ liquid_name = null gas_name = null heating_products = list( - /decl/material/gas/ammonia = 0.05, - /decl/material/liquid/water = 0.55, - /decl/material/liquid/ethanol = 0.4 + /decl/material/gas/ammonia = 0.05, + /decl/material/liquid/water = 0.55, + /decl/material/liquid/ethanol/spirits = 0.4 ) uid = "solid_ice_ediroite" value = 0.2 diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index cdc7df2fe4f8..b1023677490d 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -115,7 +115,8 @@ next_cramp = world.time + rand(200,800) owner.custom_pain("Your stomach cramps agonizingly!",1) - var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol) + // TODO: check if this even works - it won't be picking up alcohol subtypes. + var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol/spirits) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index d35715d884ad..f2b3f484adab 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -199,12 +199,12 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/replace_sound if(!(check_flags & ATOM_FLAG_NO_PHASE_CHANGE)) - if(!isnull(R.chilling_point) && R.type != R.bypass_chilling_products_for_root_type && LAZYLEN(R.chilling_products) && temperature <= R.chilling_point) + if(!isnull(R.chilling_point) && LAZYLEN(R.chilling_products) && temperature <= R.chilling_point) replace_self_with = R.chilling_products if(R.chilling_message) replace_message = "\The [R.get_reagent_name(src)] [R.chilling_message]" replace_sound = R.chilling_sound - else if(!isnull(R.heating_point) && R.type != R.bypass_heating_products_for_root_type && LAZYLEN(R.heating_products) && temperature >= R.heating_point) + else if(!isnull(R.heating_point) && LAZYLEN(R.heating_products) && temperature >= R.heating_point) replace_self_with = R.heating_products if(R.heating_message) replace_message = "\The [R.get_reagent_name(src)] [R.heating_message]" diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index f7deadf14c9c..09950f337c76 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -1,4 +1,5 @@ /decl/material/liquid/ethanol + abstract_type = /decl/material/liquid/ethanol name = "ethanol" //Parent class for all alcoholic reagents. lore_text = "A well-known alcohol with a variety of applications." taste_description = "pure alcohol" @@ -7,29 +8,28 @@ ignition_point = T0C+150 accelerant_value = FUEL_VALUE_ACCELERANT solvent_power = MAT_SOLVENT_MODERATE - uid = "chem_ethanol" - boiling_point = T0C + 78.37 + boiling_point = null // Pure ethanol boils, the rest has to separate first. heating_message = "boils away its ethanol content, leaving pure water." heating_point = T0C + 78.37 heating_products = list( - /decl/material/liquid/ethanol = 0.75, - /decl/material/liquid/water = 0.25 + /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/liquid/water = 0.25 ) - bypass_heating_products_for_root_type = /decl/material/liquid/ethanol chilling_message = "separates as its water content freezes, leaving pure ethanol." chilling_point = T0C chilling_products = list( - /decl/material/liquid/ethanol = 0.75, - /decl/material/solid/ice = 0.25 + /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/solid/ice = 0.25 ) - bypass_chilling_products_for_root_type = /decl/material/liquid/ethanol affect_blood_on_ingest = FALSE // prevents automatic toxins/inebriation as though injected affect_blood_on_inhale = FALSE - can_boil_to_gas = TRUE - temperature_burn_milestone_material = /decl/material/liquid/ethanol + + glass_name = "ethanol" + glass_desc = "A well-known alcohol with a variety of applications." + value = 1.2 var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. var/alcohol_toxicity = 1 @@ -37,16 +37,6 @@ var/targ_temp = 310 var/halluci = 0 - glass_name = "ethanol" - glass_desc = "A well-known alcohol with a variety of applications." - value = 1.2 - -/decl/material/liquid/ethanol/Initialize() - . = ..() - // Impure ethanol doesn't boil, it has to separate first. - if(type != bypass_heating_products_for_root_type) - boiling_point = null - /decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.take_damage(removed * 2 * alcohol_toxicity, TOX) @@ -99,6 +89,20 @@ if(halluci) M.adjust_hallucination(halluci, halluci) +// Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. +/decl/material/liquid/ethanol/spirits + dirtiness = DIRTINESS_STERILE + boiling_point = T0C + 78.37 + uid = "chem_ethanol" + can_boil_to_gas = TRUE + temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits + + // Pure ethanol does not separate. + heating_point = null + heating_products = null + chilling_point = null + chilling_products = null + /decl/material/liquid/ethanol/absinthe name = "absinthe" lore_text = "Watch out that the Green Fairy doesn't come for you!" diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index fc67bea1606c..d90e71023fa0 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -32,7 +32,7 @@ DEFINE_CARTRIDGE_FOR_CHEM(iron, /decl/material/solid/metal/iron) DEFINE_CARTRIDGE_FOR_CHEM(copper, /decl/material/solid/metal/copper) DEFINE_CARTRIDGE_FOR_CHEM(mercury, /decl/material/liquid/mercury) DEFINE_CARTRIDGE_FOR_CHEM(radium, /decl/material/solid/metal/radium) -DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol) +DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol/spirits) DEFINE_CARTRIDGE_FOR_CHEM(sacid, /decl/material/liquid/acid) DEFINE_CARTRIDGE_FOR_CHEM(tungsten, /decl/material/solid/metal/tungsten) diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 87ac55aaceff..015448f51a75 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -108,7 +108,7 @@ /decl/chemical_reaction/recipe/hooch name = "Hooch" result = /decl/material/liquid/ethanol/hooch - required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol = 2, /decl/material/liquid/fuel = 1) + required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/spirits = 2, /decl/material/liquid/fuel = 1) minimum_temperature = 30 CELSIUS maximum_temperature = (30 CELSIUS) + 100 result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2126b561d77..a2a21280d675 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -48,7 +48,7 @@ name = "Methyl Bromide" required_reagents = list( /decl/material/liquid/bromide = 1, - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/fuel/hydrazine = 1 ) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index 97cfaafade61..e46935f7cc87 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -22,16 +22,16 @@ name = "Strong Painkillers" result = /decl/material/liquid/painkillers/strong required_reagents = list( - /decl/material/liquid/stabilizer = 1, - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/acetone = 1 + /decl/material/liquid/stabilizer = 1, + /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/acetone = 1 ) result_amount = 3 /decl/chemical_reaction/drug/antiseptic name = "Antiseptic" result = /decl/material/liquid/antiseptic - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) + required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 /decl/chemical_reaction/drug/mutagenics @@ -136,7 +136,7 @@ /decl/chemical_reaction/drug/sedatives name = "Sedatives" result = /decl/material/liquid/sedatives - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/nutriment/sugar = 4 + required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/nutriment/sugar = 4 ) inhibitors = list( /decl/material/solid/phosphorus @@ -146,7 +146,7 @@ /decl/chemical_reaction/drug/paralytics name = "Paralytics" result = /decl/material/liquid/paralytics - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) + required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) result_amount = 1 /decl/chemical_reaction/drug/zombiepowder diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index f0f6bc441f42..7a580bcfba1e 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -44,7 +44,7 @@ /decl/chemical_reaction/drug/herbal/yarrow_tincture name = "tincture of yarrow" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/brute_meds/yarrow = 3 ) result = /decl/material/liquid/brute_meds/yarrow/tincture @@ -52,15 +52,15 @@ /decl/chemical_reaction/drug/herbal/aloe_tincture name = "tincture of aloe" required_reagents = list( - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/burn_meds/aloe = 3 + /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/burn_meds/aloe = 3 ) result = /decl/material/liquid/burn_meds/aloe/tincture /decl/chemical_reaction/drug/herbal/ginseng_tincture name = "tincture of ginseng" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/antitoxins/ginseng = 3 ) result = /decl/material/liquid/antitoxins/ginseng/tincture @@ -68,7 +68,7 @@ /decl/chemical_reaction/drug/herbal/valerian_tincture name = "tincture of valerian" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/sedatives/valerian = 3 ) result = /decl/material/liquid/sedatives/valerian/tincture diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index f8a9797da156..369f3ea68b29 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -79,7 +79,7 @@ /decl/chemical_reaction/recipe/vinegar2 name = "Clear Vinegar" result = /decl/material/liquid/nutriment/vinegar - required_reagents = list(/decl/material/liquid/ethanol = 10) + required_reagents = list(/decl/material/liquid/ethanol/spirits = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a sharp-smelling liquid." diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index b027e451e05e..34698bd2a878 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -107,11 +107,11 @@ var/global/list/lunchables_ethanol_reagents_ = list( .[initial(O.name)] = lunch return sortTim(., /proc/cmp_text_asc) -/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_types) +/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_type) . = list() - for(var/reagent_type in subtypesof(reagent_types)) - if(reagent_type in banned_reagents) + for(var/reagent_subtype in decls_repository.get_decls_of_subtype(reagent_type)) + if(reagent_subtype in banned_reagents) continue - var/decl/material/reagent = reagent_type - .[initial(reagent.name)] = reagent_type + var/decl/material/reagent = reagent_subtype + .[initial(reagent.name)] = reagent_subtype return sortTim(., /proc/cmp_text_asc) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 06fe754e5dea..fc8c21ab6971 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -181,7 +181,7 @@ /decl/surgery_step/sterilize/Initialize() . = ..() - for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_type_unassociated(/decl/material/liquid/ethanol)) + for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/ethanol)) if(booze.strength <= 40) sterilizing_reagents |= booze.type diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index d431fc0f15ff..e518456b0580 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -110,7 +110,7 @@ for(var/rtype in temp_reagents_holder.reagents.reagent_volumes) var/new_multiplier = 1 var/decl/material/R = GET_DECL(rtype) - if(istype(R,/decl/material/liquid/ethanol)) + if(istype(R, /decl/material/liquid/ethanol)) var/decl/material/liquid/ethanol/E = R new_multiplier = (10/E.strength) actually_flameable = 1 diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 9cd5a4e78ae3..8bd35650d54a 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -29,16 +29,16 @@ /obj/item/chems/glass/replenishing/Initialize() . = ..() - spawning_id = pick( - /decl/material/liquid/blood, \ - /decl/material/liquid/lube, \ - /decl/material/liquid/sedatives, \ - /decl/material/liquid/ethanol, \ - /decl/material/liquid/water, \ - /decl/material/solid/ice, \ - /decl/material/liquid/fuel, \ - /decl/material/liquid/cleaner \ - ) + spawning_id = pick(list( + /decl/material/liquid/blood, + /decl/material/liquid/lube, + /decl/material/liquid/sedatives, + /decl/material/liquid/ethanol/spirits, + /decl/material/liquid/water, + /decl/material/solid/ice, + /decl/material/liquid/fuel, + /decl/material/liquid/cleaner + )) START_PROCESSING(SSobj, src) /obj/item/chems/glass/replenishing/Process() From 7051ae2ed6a2c4083143678dfe01c0be52e18e53 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:50:24 +1100 Subject: [PATCH 18/82] Dirt/clay/sand items cannot hold reagents. --- code/game/objects/{objs.dm => __objs.dm} | 13 +++++++++++++ .../objects/{obj_edibility.dm => _obj_edibility.dm} | 0 .../objects/{objs_damage.dm => _objs_damage.dm} | 0 .../{objs_interactions.dm => _objs_interactions.dm} | 0 code/game/objects/items/__item.dm | 9 +++++++++ code/game/objects/items/_item_materials.dm | 2 +- code/game/objects/structures/__structure.dm | 2 +- code/game/objects/structures/barrel.dm | 6 +++--- code/modules/reagents/Chemistry-Holder.dm | 2 ++ code/modules/reagents/reagent_dispenser.dm | 5 ----- nebula.dme | 8 ++++---- 11 files changed, 33 insertions(+), 14 deletions(-) rename code/game/objects/{objs.dm => __objs.dm} (95%) rename code/game/objects/{obj_edibility.dm => _obj_edibility.dm} (100%) rename code/game/objects/{objs_damage.dm => _objs_damage.dm} (100%) rename code/game/objects/{objs_interactions.dm => _objs_interactions.dm} (100%) diff --git a/code/game/objects/objs.dm b/code/game/objects/__objs.dm similarity index 95% rename from code/game/objects/objs.dm rename to code/game/objects/__objs.dm index b9966cf27e9d..3fc47332062e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/__objs.dm @@ -404,3 +404,16 @@ // Stub, used by /item and /structure /obj/proc/refresh_color() return + +// Slightly convoluted reagent logic to avoid fluid_act() putting reagents straight back into the destroyed /obj. +/obj/physically_destroyed(skip_qdel) + var/dumped_reagents = FALSE + var/atom/last_loc = loc + if(last_loc && reagents?.total_volume) + reagents.trans_to(loc, reagents.total_volume, defer_update = TRUE) + dumped_reagents = TRUE + reagents.clear_reagents() // We are qdeling, don't bother with a more nuanced update. + . = ..() + if(dumped_reagents && last_loc && !QDELETED(last_loc) && last_loc.reagents?.total_volume) + last_loc.reagents.handle_update() + HANDLE_REACTIONS(last_loc.reagents) diff --git a/code/game/objects/obj_edibility.dm b/code/game/objects/_obj_edibility.dm similarity index 100% rename from code/game/objects/obj_edibility.dm rename to code/game/objects/_obj_edibility.dm diff --git a/code/game/objects/objs_damage.dm b/code/game/objects/_objs_damage.dm similarity index 100% rename from code/game/objects/objs_damage.dm rename to code/game/objects/_objs_damage.dm diff --git a/code/game/objects/objs_interactions.dm b/code/game/objects/_objs_interactions.dm similarity index 100% rename from code/game/objects/objs_interactions.dm rename to code/game/objects/_objs_interactions.dm diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index f55744e50eb0..f5b5cc7eff21 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -1244,3 +1244,12 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. continue reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_overlay_color(reagents), RESET_COLOR | RESET_ALPHA) return reagent_overlay + +/obj/item/on_reagent_change() + . = ..() + // You can't put liquids in clay/sand/dirt vessels, sorry. + if(reagents?.total_liquid_volume > 0 && material && material.hardness <= MAT_VALUE_MALLEABLE && !QDELETED(src)) + visible_message(SPAN_DANGER("\The [src] falls apart!")) + squash_item() + if(!QDELETED(src)) + physically_destroyed() diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 95bc6402777c..1a80c8c3bd58 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -104,7 +104,7 @@ queue_icon_update() /obj/item/proc/update_name() - if(material_alteration & MAT_FLAG_ALTERATION_NAME) + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_NAME)) SetName("[material.adjective_name] [base_name || initial(name)]") else SetName(base_name || initial(name)) diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index b498045253d7..724a01372c5c 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -159,7 +159,7 @@ last_damage_message = 0.75 /obj/structure/physically_destroyed(var/skip_qdel) - if(..(TRUE)) + if((. = ..(TRUE))) return dismantle_structure() /obj/structure/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 25597a77ae7a..59f42c5e67bc 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -39,7 +39,7 @@ storage.handle_item_insertion(null, thing) /obj/structure/reagent_dispensers/barrel/on_reagent_change() - if(!(. = ..())) + if(!(. = ..()) || QDELETED(src)) return var/primary_mat = reagents?.get_primary_reagent_name() if(primary_mat) @@ -55,9 +55,9 @@ var/overlay_amount = NONUNIT_CEILING(reagents.total_liquid_volume / reagents.maximum_volume * 100, 10) var/image/filling_overlay = overlay_image(icon, "[icon_state]-[overlay_amount]", reagents.get_color(), RESET_COLOR | RESET_ALPHA) add_overlay(filling_overlay) - add_overlay(overlay_image(icon, "[icon_state]-lidopen", material.color, RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lidopen", material?.color, RESET_COLOR)) else - add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material.color, RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material?.color, RESET_COLOR)) /obj/structure/reagent_dispensers/barrel/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f2b3f484adab..08d3c9323c91 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -579,6 +579,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(transferred_phases & MAT_PHASE_LIQUID) var/liquid_transferred = min(amount_to_transfer, CHEMS_QUANTIZE(LIQUID_VOLUME(src, rtype))) target.add_reagent(rtype, liquid_transferred * multiplier, REAGENT_DATA(src, rtype), TRUE, TRUE, MAT_PHASE_LIQUID) // We don't react until everything is in place + . += liquid_transferred amount_to_transfer -= liquid_transferred @@ -885,6 +886,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(!target.reagents) target.create_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. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 196b1d55f7ee..077d8abfa2ec 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -118,11 +118,6 @@ if (N) amount_dispensed = N -/obj/structure/reagent_dispensers/physically_destroyed(var/skip_qdel) - if(reagents?.total_volume) - reagents.trans_to_turf(get_turf(src), reagents.total_volume) - . = ..() - /obj/structure/reagent_dispensers/explosion_act(severity) . = ..() if(. && (severity == 1) || (severity == 2 && prob(50)) || (severity == 3 && prob(5))) diff --git a/nebula.dme b/nebula.dme index f8b13ec706bb..2f0f7c3a13b9 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1003,15 +1003,15 @@ #include "code\game\machinery\vending\misc.dm" #include "code\game\machinery\vending\security.dm" #include "code\game\machinery\vending\toxins.dm" +#include "code\game\objects\__objs.dm" +#include "code\game\objects\_obj_edibility.dm" +#include "code\game\objects\_objs_damage.dm" +#include "code\game\objects\_objs_interactions.dm" #include "code\game\objects\alien_props.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\item_mob_overlay.dm" #include "code\game\objects\munition.dm" -#include "code\game\objects\obj_edibility.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\objs_damage.dm" -#include "code\game\objects\objs_interactions.dm" #include "code\game\objects\topic.dm" #include "code\game\objects\auras\aura.dm" #include "code\game\objects\auras\blueforge_aura.dm" From 32e096a4c6690c56072e79b5aaf4d3e1f1286228 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:29:31 +1100 Subject: [PATCH 19/82] Disables ethanol boiling. --- code/modules/reagents/chems/chems_ethanol.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 09950f337c76..8dc07f2273a9 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -92,10 +92,12 @@ // Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. /decl/material/liquid/ethanol/spirits dirtiness = DIRTINESS_STERILE - boiling_point = T0C + 78.37 uid = "chem_ethanol" - can_boil_to_gas = TRUE - temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits + + // Uncomment when refining spirits is less annoying + // boiling_point = T0C + 78.37 + // can_boil_to_gas = TRUE + // temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits // Pure ethanol does not separate. heating_point = null From 19f193b956b426cca60168e6bf220d0a9d808704 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:42:22 +1100 Subject: [PATCH 20/82] Moved spoon handling code to /glass. --- code/game/objects/items/weapons/paint.dm | 6 ++ code/modules/detectivework/tools/rag.dm | 10 +++- code/modules/paperwork/pen/quill_and_ink.dm | 6 ++ .../{glass.dm => _glass.dm} | 57 ++++++++++++++++++- ...glass_edibility.dm => _glass_edibility.dm} | 0 .../reagents/reagent_containers/bowl.dm | 51 ----------------- .../reagents/reagent_containers/bucket.dm | 6 ++ nebula.dme | 4 +- 8 files changed, 84 insertions(+), 56 deletions(-) rename code/modules/reagents/reagent_containers/{glass.dm => _glass.dm} (60%) rename code/modules/reagents/reagent_containers/{glass_edibility.dm => _glass_edibility.dm} (100%) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 0b2da5f210ae..37304ae49fcc 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -22,6 +22,12 @@ add_to_reagents(pigment, amt) add_to_reagents(/decl/material/liquid/paint, amt) +/obj/item/chems/glass/paint/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/paint/get_utensil_food_type() + return null + /obj/item/chems/glass/paint/on_update_icon() . = ..() if(reagents?.total_volume) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 1097f54f9bc5..ca9b832689fc 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -7,7 +7,6 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[5]" volume = 10 - can_be_placed_into = null item_flags = ITEM_FLAG_NO_BLUDGEON atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/organic/cloth @@ -16,6 +15,15 @@ var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes +/obj/item/chems/glass/rag/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/rag/get_utensil_food_type() + return null + +/obj/item/chems/glass/rag/get_atoms_can_be_placed_into() + return null + /obj/item/chems/glass/rag/Initialize() . = ..() update_name() diff --git a/code/modules/paperwork/pen/quill_and_ink.dm b/code/modules/paperwork/pen/quill_and_ink.dm index c9cdf1af9270..4944165f4e5b 100644 --- a/code/modules/paperwork/pen/quill_and_ink.dm +++ b/code/modules/paperwork/pen/quill_and_ink.dm @@ -62,6 +62,12 @@ /// The maximum amount of ink in the inkwell when populating reagents. var/starting_volume_high = 30 +/obj/item/chems/glass/inkwell/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/inkwell/get_utensil_food_type() + return null + /obj/item/chems/glass/inkwell/can_lid() return FALSE diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/_glass.dm similarity index 60% rename from code/modules/reagents/reagent_containers/glass.dm rename to code/modules/reagents/reagent_containers/_glass.dm index 64473fa95308..a7fda97e0150 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -19,7 +19,8 @@ pickup_sound = 'sound/foley/bottlepickup1.ogg' watertight = FALSE // /glass uses the open container flag for this - var/list/can_be_placed_into = list( +/obj/item/chems/glass/proc/get_atoms_can_be_placed_into() + var/static/list/_can_be_placed_into = list( /obj/machinery/chem_master/, /obj/machinery/chemical_dispenser, /obj/machinery/reagentgrinder, @@ -40,6 +41,7 @@ /obj/machinery/radiocarbon_spectrometer, /obj/machinery/material_processing/extractor ) + return _can_be_placed_into /obj/item/chems/glass/examine(mob/user, distance) . = ..() @@ -77,7 +79,7 @@ return FALSE //If not, do nothing. if(target?.storage) return TRUE - for(var/type in can_be_placed_into) //Is it something it can be placed into? + for(var/type in get_atoms_can_be_placed_into()) //Is it something it can be placed into? if(istype(target, type)) return TRUE if(standard_dispenser_refill(user, target)) //Are they clicking a water tank/some dispenser? @@ -98,3 +100,54 @@ reagents.splash(target, min(reagents.total_volume, 5)) return TRUE . = ..() + +// Drinking out of bowls. +/obj/item/chems/glass/attack_self(mob/user) + if(is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) + return TRUE + return ..() + +/obj/item/chems/glass/can_lid() + return FALSE + +/obj/item/chems/glass/get_food_default_transfer_amount(mob/eater) + return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) + +/obj/item/chems/glass/get_food_consumption_method(mob/eater) + return EATING_METHOD_DRINK + +/obj/item/chems/glass/get_edible_material_amount(mob/eater) + return reagents?.total_volume + +/obj/item/chems/glass/get_utensil_food_type() + return /obj/item/food/lump + +// Interaction code borrowed from /food. +// Should we consider moving this down to /chems for any open container? Medicine from a bottle using a spoon, etc. +/obj/item/chems/glass/attackby(obj/item/used_item, mob/living/user) + + if(ATOM_IS_OPEN_CONTAINER(src)) + if(istype(used_item, /obj/item/food)) + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) + return TRUE + var/transferring = min(get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(used_item.reagents)) + if(!transferring) + to_chat(user, SPAN_WARNING("You cannot dip \the [used_item] in \the [src].")) + return TRUE + reagents.trans_to_holder(used_item.reagents, transferring) + user.visible_message(SPAN_NOTICE("\The [user] dunks \the [used_item] in \the [src].")) + return TRUE + var/obj/item/utensil/utensil = used_item + if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) + if(utensil.loaded_food) + to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) + return TRUE + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) + return TRUE + seperate_food_chunk(utensil, user) + if(utensil.loaded_food?.reagents?.total_volume) + to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) + return TRUE + return ..() diff --git a/code/modules/reagents/reagent_containers/glass_edibility.dm b/code/modules/reagents/reagent_containers/_glass_edibility.dm similarity index 100% rename from code/modules/reagents/reagent_containers/glass_edibility.dm rename to code/modules/reagents/reagent_containers/_glass_edibility.dm diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index 62e34795c237..7c69241f516b 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -9,57 +9,6 @@ volume = 30 amount_per_transfer_from_this = 5 -// Drinking out of bowls. -/obj/item/chems/glass/bowl/attack_self(mob/user) - if(is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) - return TRUE - return ..() - -/obj/item/chems/glass/bowl/can_lid() - return FALSE - -/obj/item/chems/glass/bowl/get_food_default_transfer_amount(mob/eater) - return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) - -/obj/item/chems/glass/bowl/get_edible_material_amount(mob/eater) - return reagents?.total_volume - -/obj/item/chems/glass/bowl/get_food_consumption_method(mob/eater) - return EATING_METHOD_DRINK - -/obj/item/chems/glass/bowl/get_utensil_food_type() - return /obj/item/food/lump - -// Interaction code borrowed from /food. -/obj/item/chems/glass/bowl/attackby(obj/item/W, mob/living/user) - - if(istype(W, /obj/item/food)) - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - var/transferring = min(get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(W.reagents)) - if(!transferring) - to_chat(user, SPAN_WARNING("You cannot dip \the [W] in \the [src].")) - return TRUE - reagents.trans_to_holder(W.reagents, transferring) - user.visible_message(SPAN_NOTICE("\The [user] dunks \the [W] in \the [src].")) - return TRUE - - var/obj/item/utensil/utensil = W - if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) - if(utensil.loaded_food) - to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) - return TRUE - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - seperate_food_chunk(utensil, user) - if(utensil.loaded_food?.reagents?.total_volume) - to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) - return TRUE - - return ..() - // Predefined soup types for mapping. /obj/item/chems/glass/bowl/mapped abstract_type = /obj/item/chems/glass/bowl/mapped diff --git a/code/modules/reagents/reagent_containers/bucket.dm b/code/modules/reagents/reagent_containers/bucket.dm index 1e072a63217d..bf25af27044d 100644 --- a/code/modules/reagents/reagent_containers/bucket.dm +++ b/code/modules/reagents/reagent_containers/bucket.dm @@ -15,6 +15,12 @@ drop_sound = 'sound/foley/donk1.ogg' pickup_sound = 'sound/foley/pickup2.ogg' +/obj/item/chems/glass/bucket/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/bucket/get_utensil_food_type() + return null + /obj/item/chems/glass/bucket/attackby(var/obj/D, mob/user) if(istype(D, /obj/item/mop)) if(reagents.total_volume < 1) diff --git a/nebula.dme b/nebula.dme index 2f0f7c3a13b9..0aa34c70b865 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3601,6 +3601,8 @@ #include "code\modules\reagents\reactions\reaction_recipe.dm" #include "code\modules\reagents\reactions\reaction_recipe_food.dm" #include "code\modules\reagents\reactions\reaction_synthesis.dm" +#include "code\modules\reagents\reagent_containers\_glass.dm" +#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" @@ -3611,8 +3613,6 @@ #include "code\modules\reagents\reagent_containers\food.dm" #include "code\modules\reagents\reagent_containers\food_cooking.dm" #include "code\modules\reagents\reagent_containers\food_edibility.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\glass_edibility.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" #include "code\modules\reagents\reagent_containers\inhaler.dm" #include "code\modules\reagents\reagent_containers\mortar.dm" From 794afebc971ddbf0924d12b95537806c4207b507 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:50:35 +1100 Subject: [PATCH 21/82] Should prevent 'You can taste .' --- code/modules/mob/living/living_taste.dm | 2 +- code/modules/reagents/Chemistry-Taste.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living_taste.dm b/code/modules/mob/living/living_taste.dm index 03845380c3e3..9beeb47e2fbb 100644 --- a/code/modules/mob/living/living_taste.dm +++ b/code/modules/mob/living/living_taste.dm @@ -9,7 +9,7 @@ var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. from.trans_to_holder(temp, amount, multiplier, 1) var/text_output = temp.generate_taste_message(src, from) - if(text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + if(text_output && (text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time)) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. last_taste_time = world.time last_taste_text = text_output diff --git a/code/modules/reagents/Chemistry-Taste.dm b/code/modules/reagents/Chemistry-Taste.dm index 468897579942..73b25e51cd5c 100644 --- a/code/modules/reagents/Chemistry-Taste.dm +++ b/code/modules/reagents/Chemistry-Taste.dm @@ -72,4 +72,4 @@ calculate text size per text. for(var/taste_desc in cocktail.tastes) var/taste_power = cocktail.tastes[taste_desc] * cocktail_volume tastes[taste_desc] += taste_power - return tastes \ No newline at end of file + return tastes From 01e1be60f3e770ec46df94894dd660f98b197dfe Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:58:19 +1100 Subject: [PATCH 22/82] Cherrypicking reagent holder interactions from dev for quick-fixing barrel/well interactions. --- code/game/atoms.dm | 3 + code/game/objects/items/_item_interactions.dm | 91 ------------ code/game/objects/items/_item_reagents.dm | 4 +- .../items/weapons/tools/weldingtool.dm | 2 +- code/game/objects/structures/barrel.dm | 20 ++- code/game/objects/structures/well.dm | 17 +++ code/game/turfs/turf.dm | 4 + .../interactions/interactions_reagents.dm | 138 ++++++++++++++++++ .../reagents/reagent_containers/_glass.dm | 8 + .../reagents/reagent_containers/drinks.dm | 2 +- nebula.dme | 1 + 11 files changed, 190 insertions(+), 100 deletions(-) create mode 100644 code/modules/interactions/interactions_reagents.dm diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 01856eb77733..5dd985c6064c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -994,3 +994,6 @@ /atom/proc/is_watertight() return ATOM_IS_OPEN_CONTAINER(src) + +/atom/proc/can_drink_from(mob/user) + return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index e3e6a83045f3..b9efb6e61dc8 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -40,94 +40,3 @@ /decl/interaction_handler/storage_open/invoked(atom/target, mob/user, obj/item/prop) target?.storage?.open(user) - -/decl/interaction_handler/wash_hands - name = "Wash Hands" - expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC - -/decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) - if(.) - for(var/hand_slot in user.get_held_item_slots()) - var/obj/item/organ/external/organ = user.get_organ(hand_slot) - if(istype(organ) && organ.is_washable) - return TRUE - -/decl/interaction_handler/wash_hands/invoked(atom/target, mob/user, obj/item/prop) - - // Probably needs debounce and do_after() but showers and wading into water don't, so whatever. - if(!target?.reagents?.has_reagent(/decl/material/liquid/water, 150)) // To avoid washing your hands in beakers. - to_chat(user, SPAN_WARNING("\The [src] doesn't have enough water in it to wash your hands.")) - return - - var/found_hand = FALSE - for(var/hand_slot in user.get_held_item_slots()) - var/obj/item/organ/external/organ = user.get_organ(hand_slot) - if(istype(organ) && organ.is_washable) - found_hand = TRUE - break - - if(!found_hand) - return - - var/decl/pronouns/pronouns = user.get_pronouns() - if(isturf(target)) - var/turf/turf = target - var/fluid = turf.get_fluid_name() - user.visible_message( - SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [fluid]."), - SPAN_NOTICE("You wash your hands in \the [fluid].") - ) - else - user.visible_message( - SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [target]."), - SPAN_NOTICE("You wash your hands in \the [target].") - ) - - user.clean() - playsound(user.loc, 'sound/effects/slosh.ogg', 25, 1) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - -/decl/interaction_handler/drink - name = "Drink" - expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC - -/decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && ATOM_IS_OPEN_CONTAINER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) - -/decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) - - // Items can be picked up and drunk from, this interaction is for turfs and structures. - if(istype(target, /obj/item)) - return - - if(!user.check_has_mouth()) - target.show_food_no_mouth_message(user, user) - return - - if(!target?.reagents?.total_volume) - target.show_food_empty_message(user, EATING_METHOD_DRINK) - return - - if(!user.can_eat_food_currently(null, user, EATING_METHOD_DRINK)) - return - - var/blocked = user.check_mouth_coverage() - if(blocked) - to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) - return - - var/fluid_name = "\the [target]" - if(isturf(target)) - var/turf/target_turf = target - fluid_name = "\the [target_turf.get_fluid_name()]" - - user.visible_message( - SPAN_NOTICE("\The [user] drinks from [fluid_name]."), - SPAN_NOTICE("You drink from [fluid_name].") - ) - target.reagents.trans_to_mob(user, 5, CHEM_INGEST) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index c4de45769dc3..7f28940eb259 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(var/mob/user, var/obj/structure/reagent_dispensers/target) // This goes into afterattack - if(!istype(target) || (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER)) +/obj/item/proc/standard_dispenser_refill(var/mob/user, var/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))) return FALSE if(!target.reagents || !target.reagents.total_volume) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 6cc583631c2a..0ba2ab36135b 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -432,7 +432,7 @@ return TRUE return ..() -/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target) +/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) if(!can_refuel) to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port.")) return FALSE diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 59f42c5e67bc..7c525ba3fcbd 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -22,12 +22,22 @@ ..() return INITIALIZE_HINT_LATELOAD -/obj/structure/reagent_dispensers/barrel/attackby(obj/item/W, mob/user) +// 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) +/obj/structure/reagent_dispensers/barrel/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +// Override to skip open container check. +/obj/structure/reagent_dispensers/barrel/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + +/obj/structure/reagent_dispensers/barrel/get_alt_interactions(mob/user) . = ..() - if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) /obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) ..() diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index cb0c2006285b..3da3c4eb2e77 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -18,6 +18,23 @@ can_toggle_open = FALSE var/auto_refill +/obj/structure/reagent_dispensers/well/get_alt_interactions(mob/user) + . = ..() + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) + +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/well/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/well/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +// Override to skip open container check. +/obj/structure/reagent_dispensers/well/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + /obj/structure/reagent_dispensers/well/populate_reagents() . = ..() if(auto_refill) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a25d818697fb..c7fef097926b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -807,6 +807,10 @@ if(user) var/obj/item/held = user.get_active_held_item() if(istype(held)) + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + LAZYADD(., /decl/interaction_handler/empty_into) if(IS_SHOVEL(held)) if(can_dig_pit(held.material?.hardness)) LAZYDISTINCTADD(., /decl/interaction_handler/dig/pit) diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm new file mode 100644 index 000000000000..c99ffad81ab7 --- /dev/null +++ b/code/modules/interactions/interactions_reagents.dm @@ -0,0 +1,138 @@ +/decl/interaction_handler/dip_item + name = "Dip Into" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && target.reagents?.total_volume >= FLUID_PUDDLE && istype(prop) && target.can_be_poured_from(user, prop) + +/decl/interaction_handler/dip_item/invoked(atom/target, mob/user, obj/item/prop) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [prop] into \the [target.reagents.get_primary_reagent_name()].")) + prop.fluid_act(target.reagents) + return TRUE + +/decl/interaction_handler/fill_from + name = "Fill From" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/fill_from/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + if(target.reagents?.total_volume < FLUID_PUDDLE) + return FALSE + if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers))) + return FALSE + 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)) + // 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 + +/decl/interaction_handler/empty_into + name = "Pour Into" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/empty_into/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + if(!istype(prop) || prop.reagents?.total_volume <= 0) + return FALSE + return target.can_be_poured_into(user, prop) && prop.can_be_poured_from(user, target) + +/decl/interaction_handler/empty_into/invoked(atom/target, mob/user, obj/item/prop) + prop.standard_pour_into(user, target) + return TRUE + +/decl/interaction_handler/wash_hands + name = "Wash Hands" + expected_target_type = /atom + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() && !istype(prop) && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) + if(.) + for(var/hand_slot in user.get_held_item_slots()) + var/obj/item/organ/external/organ = user.get_organ(hand_slot) + if(istype(organ) && organ.is_washable) + return TRUE + +/decl/interaction_handler/wash_hands/invoked(atom/target, mob/user, obj/item/prop) + + // Probably needs debounce and do_after() but showers and wading into water don't, so whatever. + if(!target?.reagents?.has_reagent(/decl/material/liquid/water, 150)) // To avoid washing your hands in beakers. + to_chat(user, SPAN_WARNING("\The [src] doesn't have enough water in it to wash your hands.")) + return + + var/found_hand = FALSE + for(var/hand_slot in user.get_held_item_slots()) + var/obj/item/organ/external/organ = user.get_organ(hand_slot) + if(istype(organ) && organ.is_washable) + found_hand = TRUE + break + + if(!found_hand) + return FALSE + + var/decl/pronouns/pronouns = user.get_pronouns() + if(isturf(target)) + var/turf/turf = target + var/fluid = turf.get_fluid_name() + user.visible_message( + SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [fluid]."), + SPAN_NOTICE("You wash your hands in \the [fluid].") + ) + else + user.visible_message( + SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [target]."), + SPAN_NOTICE("You wash your hands in \the [target].") + ) + + user.clean() + playsound(user.loc, 'sound/effects/slosh.ogg', 25, 1) + return TRUE + +/decl/interaction_handler/drink + name = "Drink" + expected_target_type = /atom + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && !istype(prop) && target.can_drink_from(user) + +/decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) + + // Items can be picked up and drunk from, this interaction is for turfs and structures. + if(istype(target, /obj/item)) + return + + if(!user.check_has_mouth()) + target.show_food_no_mouth_message(user, user) + return + + if(!target?.reagents?.total_volume) + target.show_food_empty_message(user, EATING_METHOD_DRINK) + return + + if(!user.can_eat_food_currently(null, user, EATING_METHOD_DRINK)) + return + + var/blocked = user.check_mouth_coverage() + if(blocked) + to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) + return + + var/fluid_name = "\the [target]" + if(isturf(target)) + var/turf/target_turf = target + fluid_name = "\the [target_turf.get_fluid_name()]" + + user.visible_message( + SPAN_NOTICE("\The [user] drinks from [fluid_name]."), + SPAN_NOTICE("You drink from [fluid_name].") + ) + target.reagents.trans_to_mob(user, 5, CHEM_INGEST) + playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index a7fda97e0150..3df7ca1144fb 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -151,3 +151,11 @@ to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) return TRUE return ..() + +/obj/structure/glass/get_alt_interactions(mob/user) + . = ..() + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index d1f01780b6ea..46c56514eee4 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -57,7 +57,7 @@ return return ..() -/obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) +/obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target, skip_container_check = FALSE) return do_open_check(user) && ..() /obj/item/chems/drinks/standard_pour_into(var/mob/user, var/atom/target) diff --git a/nebula.dme b/nebula.dme index 0aa34c70b865..259798993145 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2611,6 +2611,7 @@ #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\interactions\_interactions.dm" #include "code\modules\interactions\interactions_atom.dm" +#include "code\modules\interactions\interactions_reagents.dm" #include "code\modules\interactions\interactions_shared.dm" #include "code\modules\item_effects\_item_effect.dm" #include "code\modules\item_effects\item_effect_aura.dm" From 3e4d4c134de0521b417fee59d402735effcbb0e1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 20:32:53 +1100 Subject: [PATCH 23/82] Repathing waterskins to /glass. --- code/game/objects/items/waterskin.dm | 42 ++++++++++--------- code/modules/butchery/butchery_products.dm | 4 +- .../stack_recipes/recipes_textiles.dm | 2 +- maps/shaded_hills/outfits/visitors.dm | 2 +- .../fantasy/items/clothing/_loadout.dm | 6 +-- tools/map_migrations/4662_waterskin.txt | 2 + 6 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 tools/map_migrations/4662_waterskin.txt diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 298388f36ecd..3463c646e25e 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -1,4 +1,4 @@ -/obj/item/chems/waterskin +/obj/item/chems/glass/waterskin name = "waterskin" desc = "A water-carrying vessel made from the dried stomach of some unfortunate animal." icon = 'icons/obj/items/waterskin.dmi' @@ -10,38 +10,40 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME var/decl/material/stopper_material = /decl/material/solid/organic/cloth/hemp -/obj/item/chems/waterskin/proc/get_stopper_message() +/obj/item/chems/glass/waterskin/can_lid() + return FALSE // We handle it in attack_self(). + +/obj/item/chems/glass/waterskin/proc/get_stopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You tie the neck of \the [src] closed with \a [stopper_material_instance.adjective_name] cord." -/obj/item/chems/waterskin/proc/get_unstopper_message() +/obj/item/chems/glass/waterskin/proc/get_unstopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You untie \the [stopper_material_instance.adjective_name] cord from around the neck of \the [src]." -/obj/item/chems/waterskin/proc/get_stopper_overlay() +/obj/item/chems/glass/waterskin/proc/get_stopper_overlay() if(ATOM_IS_OPEN_CONTAINER(src)) return null var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return overlay_image(icon, "[icon_state]-stopper", stopper_material_instance.color, RESET_COLOR | RESET_ALPHA) -/obj/item/chems/waterskin/attack_self() - . = ..() - if(!.) - if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE(get_stopper_message())) - atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER - else - to_chat(usr, SPAN_NOTICE(get_unstopper_message())) - atom_flags |= ATOM_FLAG_OPEN_CONTAINER - update_icon() +/obj/item/chems/glass/waterskin/attack_self() + if(ATOM_IS_OPEN_CONTAINER(src)) + to_chat(usr, SPAN_NOTICE(get_stopper_message())) + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + else + to_chat(usr, SPAN_NOTICE(get_unstopper_message())) + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + update_icon() + return TRUE -/obj/item/chems/waterskin/on_update_icon() // TODO: filled/empty sprites +/obj/item/chems/glass/waterskin/on_update_icon() // TODO: filled/empty sprites . = ..() // cuts overlays var/image/stopper_overlay = get_stopper_overlay() if(stopper_overlay) add_overlay(stopper_overlay) -/obj/item/chems/waterskin/crafted +/obj/item/chems/glass/waterskin/crafted desc = "A long and rather unwieldly water-carrying vessel." icon = 'icons/obj/items/waterskin_crafted.dmi' material = /decl/material/solid/organic/leather @@ -49,17 +51,17 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC stopper_material = /decl/material/solid/organic/wood/maple -/obj/item/chems/waterskin/crafted/get_stopper_message() +/obj/item/chems/glass/waterskin/crafted/get_stopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You insert \a [stopper_material_instance.adjective_name] stopper in the neck of \the [src]." -/obj/item/chems/waterskin/crafted/get_unstopper_message() +/obj/item/chems/glass/waterskin/crafted/get_unstopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You remove \the [stopper_material_instance.adjective_name] stopper from the neck of \the [src]." -/obj/item/chems/waterskin/crafted/wine +/obj/item/chems/glass/waterskin/crafted/wine name = "wineskin" -/obj/item/chems/waterskin/crafted/wine/populate_reagents() +/obj/item/chems/glass/waterskin/crafted/wine/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.maximum_volume) diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 23f9dc4858c9..184a9a87504c 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -263,12 +263,12 @@ icon = 'icons/obj/food/butchery/ruminant_stomach.dmi' material = /decl/material/solid/organic/meat/gut nutriment_amt = 8 - dried_type = /obj/item/chems/waterskin + dried_type = /obj/item/chems/glass/waterskin w_class = ITEM_SIZE_SMALL var/stomach_reagent = /decl/material/liquid/acid/stomach /obj/item/food/butchery/stomach/get_dried_product() - var/obj/item/chems/waterskin/result = ..() + var/obj/item/chems/glass/waterskin/result = ..() if(istype(result) && reagents?.total_volume) reagents.trans_to_holder(result.reagents, reagents.total_volume) return result diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index ee608b17555b..c68b69f4e493 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -61,7 +61,7 @@ difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. /decl/stack_recipe/textiles/leather/waterskin - result_type = /obj/item/chems/waterskin/crafted + result_type = /obj/item/chems/glass/waterskin/crafted required_material = /decl/material/solid/organic/leather category = null diff --git a/maps/shaded_hills/outfits/visitors.dm b/maps/shaded_hills/outfits/visitors.dm index 5d89949bbff9..ca0204ce1a76 100644 --- a/maps/shaded_hills/outfits/visitors.dm +++ b/maps/shaded_hills/outfits/visitors.dm @@ -8,7 +8,7 @@ backpack_contents = list( /obj/item/stack/medical/bandage/crafted/five = 1, /obj/item/stack/medical/ointment/crafted/five = 1, - /obj/item/chems/waterskin/crafted/wine = 1 + /obj/item/chems/glass/waterskin/crafted/wine = 1 ) /decl/outfit/job/shaded_hills/traveller/scholar diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 28468c549413..1bb06b8926fb 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -265,7 +265,7 @@ /decl/loadout_option/fantasy/utility/waterskin name = "waterskin selection" - path = /obj/item/chems/waterskin + path = /obj/item/chems/glass/waterskin available_materials = null apply_to_existing_if_possible = TRUE // overwrite beggar knight's wineskin uid = "gear_fantasy_waterskin" @@ -273,8 +273,8 @@ /decl/loadout_option/fantasy/utility/waterskin/get_gear_tweak_options() . = ..() LAZYDISTINCTADD(.[/datum/gear_tweak/path], list( - "crafted leather waterskin" = /obj/item/chems/waterskin/crafted, - "dried stomach waterskin" = /obj/item/chems/waterskin, + "crafted leather waterskin" = /obj/item/chems/glass/waterskin/crafted, + "dried stomach waterskin" = /obj/item/chems/glass/waterskin, )) LAZYDISTINCTADD(.[/datum/gear_tweak/reagents], list( "ale" = /decl/material/liquid/ethanol/ale, diff --git a/tools/map_migrations/4662_waterskin.txt b/tools/map_migrations/4662_waterskin.txt new file mode 100644 index 000000000000..8fa91607ee8f --- /dev/null +++ b/tools/map_migrations/4662_waterskin.txt @@ -0,0 +1,2 @@ +/obj/item/chems/waterskin/@SUBTYPES : /obj/item/chems/glass/waterskin/@SUBTYPES{@OLD} + From 8cb6b6d0705b2c5939973e609aa115420d6baaa8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 20:38:30 +1100 Subject: [PATCH 24/82] Fixes slings requiring a sling that they cannot take. --- .../projectiles/guns/launcher/bows/sling.dm | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/projectiles/guns/launcher/bows/sling.dm b/code/modules/projectiles/guns/launcher/bows/sling.dm index 25a4b6e6d9c0..c3f3822d4d84 100644 --- a/code/modules/projectiles/guns/launcher/bows/sling.dm +++ b/code/modules/projectiles/guns/launcher/bows/sling.dm @@ -1,14 +1,15 @@ /obj/item/gun/launcher/bow/sling - name = "sling" - desc = "A simple strip of leather with a cup in the center, used to hurl stones with great speed." - slot_flags = 0 - draw_time = 0.5 SECONDS - icon = 'icons/obj/guns/launcher/sling.dmi' - material = /decl/material/solid/organic/leather - color = /decl/material/solid/organic/leather::color - string = null - max_tension = 1 - bow_ammo_type = null + name = "sling" + desc = "A simple strip of leather with a cup in the center, used to hurl stones with great speed." + slot_flags = 0 + draw_time = 0.5 SECONDS + icon = 'icons/obj/guns/launcher/sling.dmi' + material = /decl/material/solid/organic/leather + color = /decl/material/solid/organic/leather::color + string = null + requires_string = FALSE + max_tension = 1 + bow_ammo_type = null /obj/item/gun/launcher/bow/sling/try_string(mob/user, obj/item/bowstring/new_string) return FALSE From 3efa978cd3a304fcbc82f051fe1dffeba2b37d9f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 02:12:03 -0500 Subject: [PATCH 25/82] Fix items being affected by fluids when they shouldn't be --- .../inventory_slots/inventory_gripper.dm | 1 + code/game/atoms_fluids.dm | 5 ++- code/game/atoms_movable.dm | 2 +- code/game/objects/items/flame/_flame.dm | 9 +---- code/game/turfs/turf_fluids.dm | 5 +-- code/modules/mob/inventory.dm | 38 ++++++++++++++++++- code/modules/mob/living/living.dm | 5 +++ 7 files changed, 49 insertions(+), 16 deletions(-) diff --git a/code/datums/inventory_slots/inventory_gripper.dm b/code/datums/inventory_slots/inventory_gripper.dm index c11a09eed720..334be51e15c7 100644 --- a/code/datums/inventory_slots/inventory_gripper.dm +++ b/code/datums/inventory_slots/inventory_gripper.dm @@ -5,6 +5,7 @@ /// If set, use this icon_state for the hand slot overlay; otherwise, use slot_id. var/hand_overlay quick_equip_priority = null // you quick-equip stuff by holding it in a gripper, so this ought to be skipped + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level, reasoning that you can just hold it up out of the water // For reference, grippers do not use ui_loc, they have it set dynamically during /datum/hud/proc/rebuild_hands() diff --git a/code/game/atoms_fluids.dm b/code/game/atoms_fluids.dm index d25bb595df6d..2984d5393f27 100644 --- a/code/game/atoms_fluids.dm +++ b/code/game/atoms_fluids.dm @@ -24,11 +24,12 @@ return T?.is_flooded(lying_mob, absolute) /atom/proc/submerged(depth, above_turf) + var/turf/T = get_turf(src) if(isnull(depth)) - var/turf/T = get_turf(src) if(!istype(T)) return FALSE depth = T.get_fluid_depth() + if(istype(T)) var/turf_height = T.get_physical_height() // If we're not on the surface of the turf (floating, leaping, or other sources) // then we add the turf height to the depth, so you can jump over a water-filled pit @@ -50,7 +51,7 @@ return ..() /obj/item/submerged(depth, above_turf) - var/datum/inventory_slot/slot = get_any_equipped_slot() + var/datum/inventory_slot/slot = get_any_equipped_slot_datum() // we're in a mob and have a slot, so we bail early if(istype(slot)) var/mob/owner = loc // get_any_equipped_slot checks istype already diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 477e9d25c5df..4b0049e92f2c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -272,7 +272,7 @@ if(isturf(loc)) var/turf/T = loc - if(T.reagents) + if(T.reagents?.total_volume && submerged()) fluid_act(T.reagents) for(var/mob/viewer in storage?.storage_ui?.is_seeing) diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index bee61f2c54c6..645e04d1c719 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -167,14 +167,7 @@ if(waterproof) return - var/check_depth = FLUID_PUDDLE - if(ismob(loc)) - var/mob/holder = loc - if(!holder.current_posture?.prone) - check_depth = FLUID_OVER_MOB_HEAD - else - check_depth = FLUID_SHALLOW - if(fluids.total_volume >= check_depth) + if(fluids.total_volume >= FLUID_PUDDLE) snuff_out(no_message = TRUE) /obj/item/flame/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index 42220adc739b..0ea31b04c6f3 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -117,11 +117,8 @@ ..() if(!QDELETED(src) && fluids?.total_volume) fluids.touch_turf(src) - // technically, fluids might not be our own reagent holder - // so we factor in height ourselves - var/fluid_height = fluids.total_volume + get_physical_height() for(var/atom/movable/AM as anything in get_contained_external_atoms()) - if(!AM.submerged(fluid_height)) + if(!AM.submerged()) continue AM.fluid_act(fluids) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 89f590dcecda..62329f27692f 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -271,15 +271,49 @@ return 1 //already unequipped, so success return I.mob_can_unequip(src, slot) +/// Gets the inventory slot string ID for the mob whose contents we're in, if any. +/// Checks both equipped and held item slots. /obj/item/proc/get_any_equipped_slot() - return get_equipped_slot() || get_held_slot() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_any_equipped_slot_for_item(src) + +/// Gets the inventory slot string ID for an item that may be in our inventory. +/// Checks both equipped and held item slots. +/mob/proc/get_any_equipped_slot_for_item(obj/item/I) + var/list/slots = get_inventory_slots() + get_held_item_slots() + if(!length(slots)) + return + for(var/slot_str in slots) + if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I + return slot_str +/// A counterpart to get_any_equipped_slot_for_item that returns the slot datum rather than the slot name. +/// Checks both equipped and held item slots. +/obj/item/proc/get_any_equipped_slot_datum() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_inventory_slot_datum(mob.get_any_equipped_slot_for_item(src)) + +/// Gets the equipment (worn) slot string ID for the mob whose contents we're in, if any. Does not include held slots. /obj/item/proc/get_equipped_slot() if(!ismob(loc)) return null var/mob/mob = loc return mob.get_equipped_slot_for_item(src) +/// A helper that returns the slot datum rather than the slot name. +/// Does not include held slots. +/// Saves unnecessary duplicate ismob checks and loc casts. +/obj/item/proc/get_equipped_slot_datum() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_inventory_slot_datum(mob.get_equipped_slot_for_item(src)) + +/// Gets the equipment (worn) slot string ID for an item we may be wearing. Does not include held slots. /mob/proc/get_equipped_slot_for_item(obj/item/I) var/list/slots = get_inventory_slots() if(!length(slots)) @@ -288,12 +322,14 @@ if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I return slot_str +/// Gets the held item slot string ID for the mob whose contents we're in, if any. Does not include worn slots. /obj/item/proc/get_held_slot() if(!ismob(loc)) return null var/mob/mob = loc return mob.get_held_slot_for_item(src) +/// Gets the held item slot string ID for an item we may be holding. Does not include worn slots. /mob/proc/get_held_slot_for_item(obj/item/I) var/list/slots = get_held_item_slots() if(!length(slots)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index df4f9b1c97d3..e76e323abea1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -853,9 +853,14 @@ default behaviour is: fluids.touch_mob(src) if(QDELETED(src) || !fluids.total_volume) return + var/on_turf = fluids.my_atom == get_turf(src) for(var/atom/movable/A as anything in get_equipped_items(TRUE)) if(!A.simulated) continue + // if we're being affected by reagent fluids, items check if they're submerged + // todo: i don't like how this works, it feels hacky. maybe separate coating and submersion somehow and make this only checked for submersion + if(on_turf && !A.submerged()) + continue A.fluid_act(fluids) if(QDELETED(src) || !fluids.total_volume) return From 234373b11f72fbe4804a9e0bebaea5c59bcc8015 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 17:53:09 -0500 Subject: [PATCH 26/82] Fix ticks2readable giving a blank output --- code/_helpers/time.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index eea2b9b3833f..464860a2392e 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -89,7 +89,7 @@ var/global/round_start_time = 0 out += "[seconds] second\s" if(length(out)) return english_list(out) - return null + return "less than a second" /proc/roundduration2text() if(!round_start_time) From 5d164620b2076b95cd918f1971116c2d253938f5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:18:46 -0500 Subject: [PATCH 27/82] Fix flame sources not updating held icon when extinguished --- code/game/objects/items/flame/_flame.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index 4527a2b6bc11..1ad11f3fa142 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -125,6 +125,9 @@ update_attack_force() update_icon() + if(ismob(loc)) // not very robust for things like accessories... + update_held_icon() + update_clothing_icon() if(istype(loc, /obj/structure/wall_sconce)) loc.update_icon() From 5036372023d4c59408717fd544f0e6aaee969678 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:18:57 -0500 Subject: [PATCH 28/82] Fix torch color breaking in water/tall grass --- code/game/objects/items/flame/flame_torch.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 66aac1847d65..edfc55688568 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -76,11 +76,11 @@ if(head_material) var/decl/material/head_mat = GET_DECL(head_material) if(burnt) - add_overlay(overlay_image(icon, "[icon_state]-burnt", head_mat.color, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-burnt", head_mat.color, flags = RESET_COLOR|KEEP_APART)) else - add_overlay(overlay_image(icon, "[icon_state]-head", head_mat.color, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-head", head_mat.color, flags = RESET_COLOR|KEEP_APART)) if(lit) - add_overlay(overlay_image(icon, "[icon_state]-lit", flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lit", flags = RESET_COLOR|KEEP_APART)) /obj/item/flame/torch/get_sconce_overlay() . = list(overlay_image(icon, "[icon_state]-sconce", color = color, flags = RESET_COLOR)) From c229bb582259e04dc8ad476f7413d83e1409ce72 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:19:11 -0500 Subject: [PATCH 29/82] Fix filter removal using the wrong return value --- code/_helpers/visual_filters.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index deb7162f1964..13bdaa2d6beb 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -55,8 +55,8 @@ LAZYREMOVE(filter_data, filter_name) filters -= thing update_filters() - return FALSE - return TRUE + return TRUE + return FALSE /// Animate a given filter on this atom. All params after the first are passed to animate(). /atom/movable/proc/animate_filter(filter_name, list/params) From b45e854adf435287e63116e1d373651b5b37aee7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:21:47 -0500 Subject: [PATCH 30/82] Fix standing in fluid causing layer flickering --- code/modules/fluids/_fluid.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/fluids/_fluid.dm b/code/modules/fluids/_fluid.dm index ef00dac2cea6..ef3d0259a0d3 100644 --- a/code/modules/fluids/_fluid.dm +++ b/code/modules/fluids/_fluid.dm @@ -22,8 +22,7 @@ // Update layer. var/new_layer var/turf/T = get_turf(src) - var/effective_depth = T?.get_physical_height() + reagent_volume - if(effective_depth < 0) + if(T.pixel_z < 0) new_layer = T.layer + 0.2 else if(reagent_volume > FLUID_DEEP) new_layer = DEEP_FLUID_LAYER From 5756ca6e7c290c982760b9db2e360b54e9b886fc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 10:31:58 +1100 Subject: [PATCH 31/82] Repaths ethanol to alcohol. --- code/game/machinery/kitchen/icecream.dm | 2 +- code/game/objects/items/waterskin.dm | 2 +- code/game/objects/structures/barrel.dm | 4 +- .../codex/categories/category_recipes.dm | 2 +- code/modules/crafting/handmade_items.dm | 6 +- .../food/cooking/recipes/recipe_assembled.dm | 2 +- .../hydroponics/plant_types/seeds_misc.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 6 +- .../integrated_electronics/passive/power.dm | 2 +- .../liquids/materials_liquid_toxins.dm | 2 +- .../definitions/solids/materials_solid_ice.dm | 2 +- .../silicon/robot/modules/module_clerical.dm | 4 +- code/modules/organs/internal/stomach.dm | 2 +- code/modules/power/port_gen.dm | 6 +- .../{chems_ethanol.dm => chems_alcohol.dm} | 106 +++++------ .../reagents/chems/chems_painkillers.dm | 2 +- .../reagents/chems/random/chems_random.dm | 2 +- code/modules/reagents/cocktails.dm | 172 +++++++++--------- .../reagents/dispenser/cartridge_presets.dm | 26 +-- .../reagents/reactions/reaction_alcohol.dm | 40 ++-- .../reagents/reactions/reaction_compounds.dm | 2 +- .../reagents/reactions/reaction_drugs.dm | 8 +- .../reagents/reactions/reaction_herbal.dm | 8 +- .../reagents/reactions/reaction_recipe.dm | 2 +- .../reactions/reaction_recipe_food.dm | 4 +- .../reagents/reagent_containers/borghydro.dm | 28 +-- .../reagent_containers/drinks/bottle.dm | 48 ++--- .../reagent_containers/drinks/cans.dm | 6 +- .../reagents/reagent_containers/food/lunch.dm | 12 +- code/modules/reagents/reagent_dispenser.dm | 2 +- code/modules/surgery/other.dm | 2 +- code/modules/vehicles/engine.dm | 4 +- .../finds/find_types/chem_containers.dm | 2 +- .../fantasy/items/clothing/_loadout.dm | 16 +- .../fantasy/items/material_overrides.dm | 2 +- nebula.dme | 2 +- 36 files changed, 270 insertions(+), 270 deletions(-) rename code/modules/reagents/chems/{chems_ethanol.dm => chems_alcohol.dm} (87%) diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 2a893f6e61b4..cd751f4d64af 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -33,7 +33,7 @@ if(ICECREAM_STRAWBERRY) return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/drink/juice/berry) if(ICECREAM_BLUE) - return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/ethanol/bluecuracao) + return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/alcohol/bluecuracao) if(ICECREAM_CHERRY) return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/nutriment/cherryjelly) if(ICECREAM_BANANA) diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 3463c646e25e..73852feaef06 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -64,4 +64,4 @@ /obj/item/chems/glass/waterskin/crafted/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents?.maximum_volume) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 7c525ba3fcbd..a8f9c376102d 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -79,11 +79,11 @@ /obj/structure/reagent_dispensers/barrel/ebony/beer/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/structure/reagent_dispensers/barrel/ebony/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() . = ..() diff --git a/code/modules/codex/categories/category_recipes.dm b/code/modules/codex/categories/category_recipes.dm index 292eca017613..caf8064f577f 100644 --- a/code/modules/codex/categories/category_recipes.dm +++ b/code/modules/codex/categories/category_recipes.dm @@ -40,7 +40,7 @@ if(!product) continue lore_text = initial(product.lore_text) - if(ispath(food.result, /decl/material/liquid/drink) || ispath(food.result, /decl/material/liquid/ethanol)) + if(ispath(food.result, /decl/material/liquid/drink) || ispath(food.result, /decl/material/liquid/alcohol)) category_name = "drink recipe" mechanics_text = "This recipe produces [food.result_amount]u [product.name].
It should be performed in a glass or shaker, and requires the following ingredients:" else diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 6a03aba8f7dc..1135a26cc8bd 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -83,12 +83,12 @@ /obj/item/chems/glass/handmade/bottle/beer/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/item/chems/glass/handmade/bottle/tall/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/item/chems/glass/handmade/bottle/wide/whiskey/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/whiskey, reagents.maximum_volume) diff --git a/code/modules/food/cooking/recipes/recipe_assembled.dm b/code/modules/food/cooking/recipes/recipe_assembled.dm index db38ad62101d..863129f6f12f 100644 --- a/code/modules/food/cooking/recipes/recipe_assembled.dm +++ b/code/modules/food/cooking/recipes/recipe_assembled.dm @@ -30,7 +30,7 @@ result = /obj/item/food/superbiteburger /decl/recipe/twobread - reagents = list(/decl/material/liquid/ethanol/wine = 5) + reagents = list(/decl/material/liquid/alcohol/wine = 5) items = list( /obj/item/food/slice/bread = 2, ) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index 34650444cd01..3f57470752fc 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -288,7 +288,7 @@ mutants = null chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/ethanol/bluecuracao = list(10,5) + /decl/material/liquid/alcohol/bluecuracao = list(10,5) ) /datum/seed/tomato/blue/teleport/New() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 3092b5c73e55..0456bff2302b 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -59,7 +59,7 @@ ) var/static/list/nutrient_reagents = list( /decl/material/liquid/drink/milk = 0.1, - /decl/material/liquid/ethanol/beer = 0.25, + /decl/material/liquid/alcohol/beer = 0.25, /decl/material/solid/phosphorus = 0.1, /decl/material/liquid/nutriment/sugar = 0.1, /decl/material/liquid/drink/sodawater = 0.1, @@ -89,7 +89,7 @@ /decl/material/liquid/water = 1, /decl/material/liquid/adminordrazine = 1, /decl/material/liquid/drink/milk = 0.9, - /decl/material/liquid/ethanol/beer = 0.7, + /decl/material/liquid/alcohol/beer = 0.7, /decl/material/liquid/fuel/hydrazine = -2, /decl/material/solid/phosphorus = -0.5, /decl/material/liquid/water = 1, @@ -98,7 +98,7 @@ // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order). var/static/list/beneficial_reagents = list( - /decl/material/liquid/ethanol/beer = list( -0.05, 0, 0 ), + /decl/material/liquid/alcohol/beer = list( -0.05, 0, 0 ), /decl/material/liquid/fuel/hydrazine = list( -2, 0, 0 ), /decl/material/solid/phosphorus = list( -0.75, 0, 0 ), /decl/material/liquid/drink/sodawater = list( 0.1, 0, 0 ), diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 7741451973fc..69ae5bae034c 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -103,7 +103,7 @@ /decl/material/gas/hydrogen/tritium = 50000, /decl/material/liquid/fuel = 15000, /decl/material/solid/carbon = 10000, - /decl/material/liquid/ethanol/spirits = 10000, + /decl/material/liquid/alcohol/ethanol = 10000, /decl/material/liquid/nutriment = 8000 ) var/multi = 1 diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 081d8dacd23d..6b76cad038a8 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -220,7 +220,7 @@ heating_products = list( /decl/material/liquid/acetone = 0.4, /decl/material/solid/carbon = 0.4, - /decl/material/liquid/ethanol/spirits = 0.2 + /decl/material/liquid/alcohol/ethanol = 0.2 ) heating_point = 145 CELSIUS heating_message = "separates." diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index badd55eb76ab..c90937ccd3be 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -119,7 +119,7 @@ heating_products = list( /decl/material/gas/ammonia = 0.05, /decl/material/liquid/water = 0.55, - /decl/material/liquid/ethanol/spirits = 0.4 + /decl/material/liquid/alcohol/ethanol = 0.4 ) uid = "solid_ice_ediroite" value = 0.2 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 d052194f847f..94f73f0d6370 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm @@ -65,7 +65,7 @@ var/datum/reagents/R = emag.create_reagents(50) R.add_reagent(/decl/material/liquid/paralytics, 10) R.add_reagent(/decl/material/liquid/sedatives, 15) - R.add_reagent(/decl/material/liquid/ethanol/beer, 20) + R.add_reagent(/decl/material/liquid/alcohol/beer, 20) R.add_reagent(/decl/material/solid/ice, 5) emag.SetName("Mickey Finn's Special Brew") @@ -75,7 +75,7 @@ E.add_to_reagents(/decl/material/liquid/enzyme, 2 * amount) if(emag) var/obj/item/chems/drinks/bottle/small/beer/B = emag - B.add_to_reagents(/decl/material/liquid/ethanol/beer, amount * 0.4) + B.add_to_reagents(/decl/material/liquid/alcohol/beer, amount * 0.4) B.add_to_reagents(/decl/material/solid/ice, amount * 0.1) B.add_to_reagents(/decl/material/liquid/paralytics, amount * 0.2) B.add_to_reagents(/decl/material/liquid/sedatives, amount * 0.3) diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index b1023677490d..cf870f3b64b0 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -116,7 +116,7 @@ owner.custom_pain("Your stomach cramps agonizingly!",1) // TODO: check if this even works - it won't be picking up alcohol subtypes. - var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol/spirits) + var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/alcohol/ethanol) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index ae7a1bc6e423..4bba7b7f5639 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -466,7 +466,7 @@ to_chat(user, "Auxilary tank shows [reagents.total_volume]u of liquid in it.") /obj/machinery/port_gen/pacman/super/potato/UseFuel() - if(reagents.has_reagent(/decl/material/liquid/ethanol/vodka)) + if(reagents.has_reagent(/decl/material/liquid/alcohol/vodka)) rad_power = 4 temperature_gain = 60 remove_any_reagents(1) @@ -486,9 +486,9 @@ /obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/hit_with, var/mob/user) if(istype(hit_with, /obj/item/chems)) var/obj/item/chems/chem_container = hit_with - var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) + var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/alcohol/vodka) if(chem_container.standard_pour_into(src,user)) - if(REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) > old_vodka_amount) // yay, booze! + if(REAGENT_VOLUME(reagents, /decl/material/liquid/alcohol/vodka) > old_vodka_amount) // yay, booze! audible_message(SPAN_NOTICE("[src] blips happily!")) playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, FALSE) else // you didn't add any more than we already had diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_alcohol.dm similarity index 87% rename from code/modules/reagents/chems/chems_ethanol.dm rename to code/modules/reagents/chems/chems_alcohol.dm index 8dc07f2273a9..aa7ca92f847b 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_alcohol.dm @@ -1,8 +1,5 @@ -/decl/material/liquid/ethanol - abstract_type = /decl/material/liquid/ethanol - name = "ethanol" //Parent class for all alcoholic reagents. - lore_text = "A well-known alcohol with a variety of applications." - taste_description = "pure alcohol" +/decl/material/liquid/alcohol + abstract_type = /decl/material/liquid/alcohol color = "#404030" touch_met = 5 ignition_point = T0C+150 @@ -11,24 +8,22 @@ boiling_point = null // Pure ethanol boils, the rest has to separate first. - heating_message = "boils away its ethanol content, leaving pure water." + heating_message = "boils away its water content, leaving pure alcohol." heating_point = T0C + 78.37 heating_products = list( - /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/liquid/alcohol/ethanol = 0.75, /decl/material/liquid/water = 0.25 ) - chilling_message = "separates as its water content freezes, leaving pure ethanol." + chilling_message = "separates as its water content freezes, leaving pure alcohol." chilling_point = T0C chilling_products = list( - /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/liquid/alcohol/ethanol = 0.75, /decl/material/solid/ice = 0.25 ) affect_blood_on_ingest = FALSE // prevents automatic toxins/inebriation as though injected affect_blood_on_inhale = FALSE - glass_name = "ethanol" - glass_desc = "A well-known alcohol with a variety of applications." value = 1.2 var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. @@ -37,18 +32,18 @@ var/targ_temp = 310 var/halluci = 0 -/decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.take_damage(removed * 2 * alcohol_toxicity, TOX) M.add_chemical_effect(CE_ALCOHOL_TOXIC, alcohol_toxicity) -/decl/material/liquid/ethanol/affect_inhale(mob/living/M, removed, datum/reagents/holder) +/decl/material/liquid/alcohol/affect_inhale(mob/living/M, removed, datum/reagents/holder) if(M.has_trait(/decl/trait/metabolically_inert)) return ..() affect_ingest(M, removed, holder) // a bit of a hack, but it avoids code duplication -/decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.has_trait(/decl/trait/metabolically_inert)) return @@ -90,14 +85,19 @@ M.adjust_hallucination(halluci, halluci) // Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. -/decl/material/liquid/ethanol/spirits +/decl/material/liquid/alcohol/ethanol + name = "ethanol" + lore_text = "A well-known alcohol with a variety of applications." + taste_description = "pure alcohol" + glass_name = "ethanol" + glass_desc = "A well-known alcohol with a variety of applications." dirtiness = DIRTINESS_STERILE uid = "chem_ethanol" - // Uncomment when refining spirits is less annoying + // Uncomment when refining spirits is less annoying, specifically when we have more precise temperature control. // boiling_point = T0C + 78.37 // can_boil_to_gas = TRUE - // temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits + // temperature_burn_milestone_material = /decl/material/liquid/alcohol/ethanol // Pure ethanol does not separate. heating_point = null @@ -105,7 +105,7 @@ chilling_point = null chilling_products = null -/decl/material/liquid/ethanol/absinthe +/decl/material/liquid/alcohol/absinthe name = "absinthe" lore_text = "Watch out that the Green Fairy doesn't come for you!" taste_description = "death and licorice" @@ -119,7 +119,7 @@ glass_desc = "Wormwood, anise, oh my." uid = "chem_ethanol_absinthe" -/decl/material/liquid/ethanol/ale +/decl/material/liquid/alcohol/ale name = "ale" lore_text = "A dark alchoholic beverage made by malted barley and yeast." taste_description = "hearty barley ale" @@ -132,7 +132,7 @@ glass_desc = "A freezing container of delicious ale" uid = "chem_ethanol_ale" -/decl/material/liquid/ethanol/beer +/decl/material/liquid/alcohol/beer name = "beer" codex_name = "plain beer" lore_text = "An alcoholic beverage made from malted grains, hops, yeast, and water." @@ -147,18 +147,18 @@ glass_desc = "A freezing container of beer" uid = "chem_ethanol_beer" -/decl/material/liquid/ethanol/beer/good +/decl/material/liquid/alcohol/beer/good uid = "chem_ethanol_beer_good" codex_name = "premium beer" taste_description = "beer" -/decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_JITTER, -3) -/decl/material/liquid/ethanol/bluecuracao +/decl/material/liquid/alcohol/bluecuracao name = "blue curacao" lore_text = "Exotically blue, fruity drink, distilled from oranges." taste_description = "oranges" @@ -172,7 +172,7 @@ glass_name = "blue curacao" glass_desc = "Exotically blue, fruity drink, distilled from oranges." -/decl/material/liquid/ethanol/cognac +/decl/material/liquid/alcohol/cognac name = "cognac" lore_text = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." taste_description = "rich and smooth alcohol" @@ -186,7 +186,7 @@ glass_name = "cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." -/decl/material/liquid/ethanol/gin +/decl/material/liquid/alcohol/gin name = "gin" lore_text = "It's gin. In space. I say, good sir." taste_description = "an alcoholic christmas tree" @@ -200,7 +200,7 @@ glass_desc = "A crystal clear glass of Griffeater gin." //Base type for alchoholic drinks containing coffee -/decl/material/liquid/ethanol/coffee +/decl/material/liquid/alcohol/coffee name = "coffee liqueur" lore_text = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" taste_description = "spiked coffee" @@ -214,7 +214,7 @@ glass_desc = "Guaranteed to perk you up." overdose = 45 -/decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -226,10 +226,10 @@ if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) -/decl/material/liquid/ethanol/coffee/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/alcohol/coffee/affect_overdose(mob/living/M, total_dose) ADJ_STATUS(M, STAT_JITTER, 5) -/decl/material/liquid/ethanol/melonliquor +/decl/material/liquid/alcohol/melonliquor name = "melon liqueur" lore_text = "A relatively sweet and fruity 46 proof liqueur." taste_description = "fruity alcohol" @@ -242,7 +242,7 @@ glass_name = "melon liqueur" glass_desc = "A relatively sweet and fruity 46 proof liquor." -/decl/material/liquid/ethanol/rum +/decl/material/liquid/alcohol/rum name = "dark rum" lore_text = "Yohoho and all that." taste_description = "spiked butterscotch" @@ -256,7 +256,7 @@ glass_name = "rum" glass_desc = "Now you want to Pray for a pirate suit, don't you?" -/decl/material/liquid/ethanol/sake +/decl/material/liquid/alcohol/sake name = "sake" lore_text = "Anime's favorite drink." taste_description = "dry alcohol" @@ -269,7 +269,7 @@ glass_name = "sake" glass_desc = "A glass of sake." -/decl/material/liquid/ethanol/tequila +/decl/material/liquid/alcohol/tequila name = "tequila" lore_text = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" taste_description = "paint stripper" @@ -282,7 +282,7 @@ glass_name = "tequila" glass_desc = "Now all that's missing is the weird colored shades!" -/decl/material/liquid/ethanol/thirteenloko +/decl/material/liquid/alcohol/thirteenloko name = "Thirteen Loko" lore_text = "A potent mixture of caffeine and alcohol." taste_description = "jitters and death" @@ -296,7 +296,7 @@ glass_name = "Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." -/decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -308,7 +308,7 @@ ADJ_STATUS(M, STAT_JITTER, 5) M.add_chemical_effect(CE_PULSE, 2) -/decl/material/liquid/ethanol/vermouth +/decl/material/liquid/alcohol/vermouth name = "vermouth" lore_text = "You suddenly feel a craving for a martini..." taste_description = "dry alcohol" @@ -322,7 +322,7 @@ glass_name = "vermouth" glass_desc = "You wonder why you're even drinking this straight." -/decl/material/liquid/ethanol/vodka +/decl/material/liquid/alcohol/vodka name = "vodka" codex_name = "plain vodka" lore_text = "Number one drink AND fueling choice for Independents around the galaxy." @@ -336,7 +336,7 @@ glass_name = "vodka" glass_desc = "The glass contain wodka. Xynta." -/decl/material/liquid/ethanol/vodka/premium +/decl/material/liquid/alcohol/vodka/premium name = "premium vodka" codex_name = null lore_text = "Premium distilled vodka imported directly from the Gilgamesh Colonial Confederation." @@ -347,7 +347,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_premiumvodka" -/decl/material/liquid/ethanol/whiskey +/decl/material/liquid/alcohol/whiskey name = "malt whiskey" lore_text = "A superb and well-aged single-malt whiskey. Damn." taste_description = "molasses" @@ -360,7 +360,7 @@ glass_name = "whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." -/decl/material/liquid/ethanol/wine +/decl/material/liquid/alcohol/wine name = "red wine" lore_text = "An premium alchoholic beverage made from distilled grape juice." taste_description = "bitter sweetness" @@ -373,7 +373,7 @@ glass_name = "red wine" glass_desc = "A very classy looking drink." -/decl/material/liquid/ethanol/wine/premium +/decl/material/liquid/alcohol/wine/premium name = "white wine" lore_text = "An exceptionally expensive alchoholic beverage made from distilled white grapes." taste_description = "white velvet" @@ -383,7 +383,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_whitewine" -/decl/material/liquid/ethanol/herbal +/decl/material/liquid/alcohol/herbal name = "herbal liquor" lore_text = "A complex blend of herbs, spices and roots mingle in this old Earth classic." taste_description = "a sweet summer garden" @@ -396,7 +396,7 @@ glass_name = "herbal liquor" glass_desc = "It's definitely green. Or is it yellow?" -/decl/material/liquid/ethanol/hooch +/decl/material/liquid/alcohol/hooch name = "hooch" lore_text = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" taste_description = "pure resignation" @@ -410,7 +410,7 @@ glass_name = "Hooch" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." -/decl/material/liquid/ethanol/irish_cream +/decl/material/liquid/alcohol/irish_cream name = "Irish cream" lore_text = "Whiskey-imbued cream." taste_description = "creamy alcohol" @@ -423,7 +423,7 @@ glass_name = "Irish cream" glass_desc = "It's cream, mixed with whiskey." -/decl/material/liquid/ethanol/mead +/decl/material/liquid/alcohol/mead name = "mead" lore_text = "A Viking's drink, though a cheap one." taste_description = "sweet, sweet alcohol" @@ -437,7 +437,7 @@ glass_name = "mead" glass_desc = "A Viking's beverage, though a cheap one." -/decl/material/liquid/ethanol/moonshine +/decl/material/liquid/alcohol/moonshine name = "moonshine" lore_text = "You've really hit rock bottom now... your liver packed its bags and left last night." taste_description = "bitterness" @@ -451,7 +451,7 @@ glass_name = "moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." -/decl/material/liquid/ethanol/pwine +/decl/material/liquid/alcohol/pwine name = "poison wine" lore_text = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" taste_description = "purified alcoholic death" @@ -465,7 +465,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_poisonwine" -/decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -483,7 +483,7 @@ else heart.take_internal_damage(100, 0) -/decl/material/liquid/ethanol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now +/decl/material/liquid/alcohol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now name = "aged whiskey" lore_text = "A well-aged whiskey of high quality. Probably imported. Just a sip'll do it, but that burn will leave you wanting more." color = "#523600" @@ -495,7 +495,7 @@ glass_name = "aged whiskey" glass_desc = "A well-aged whiskey of high quality. Probably imported." -/decl/material/liquid/ethanol/cider_apple +/decl/material/liquid/alcohol/cider_apple name = "apple cider" lore_text = "A refreshing glass of apple cider." taste_description = "cool apple cider" @@ -508,7 +508,7 @@ glass_name = "apple cider" glass_desc = "A refreshing glass of apple cider." -/decl/material/liquid/ethanol/cider_pear +/decl/material/liquid/alcohol/cider_pear name = "pear cider" lore_text = "A refreshing glass of pear cider." taste_description = "cool pear cider" @@ -521,7 +521,7 @@ glass_name = "pear cider" glass_desc = "A refreshing glass of pear cider." -/decl/material/liquid/ethanol/champagne +/decl/material/liquid/alcohol/champagne name = "champagne" lore_text = "Smooth sparkling wine, produced in the same region of France as it has been for centuries." taste_description = "bitterness and fizz" @@ -535,7 +535,7 @@ glass_desc = "Sparkling white wine, produced in the same region of France as it has been for centuries." glass_special = list(DRINK_FIZZ) -/decl/material/liquid/ethanol/jagermeister +/decl/material/liquid/alcohol/jagermeister name = "Jagermeister" lore_text = "A special blend of alcohol, herbs, and spices. It has remained a popular Earther drink." taste_description = "herbs, spices, and alcohol" @@ -548,7 +548,7 @@ glass_name = "jagermeister" glass_desc = "A special blend of alcohol, herbs, and spices. It has remained a popular Earther drink." -/decl/material/liquid/ethanol/kvass +/decl/material/liquid/alcohol/kvass name = "kvass" lore_text = "An alcoholic drink commonly made from bread." taste_description = "vkusnyy kvas, ypa!" diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index dc75c84c4ad4..6647c2afed2d 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -132,7 +132,7 @@ if(ingested) var/list/pool = M.reagents.reagent_volumes | ingested.reagent_volumes for(var/rtype in pool) - var/decl/material/liquid/ethanol/booze = GET_DECL(rtype) + var/decl/material/liquid/alcohol/booze = GET_DECL(rtype) if(!istype(booze) ||LAZYACCESS(M.chem_doses, rtype) < 2) //let them experience false security at first continue . = 1 diff --git a/code/modules/reagents/chems/random/chems_random.dm b/code/modules/reagents/chems/random/chems_random.dm index 5327c213c049..2f67984c0097 100644 --- a/code/modules/reagents/chems/random/chems_random.dm +++ b/code/modules/reagents/chems/random/chems_random.dm @@ -6,7 +6,7 @@ var/global/list/random_chem_interaction_blacklist = list( /decl/material/solid/tobacco, /decl/material/liquid/drink, /decl/material/liquid/random, - /decl/material/liquid/ethanol // Includes alcoholic beverages + /decl/material/liquid/alcohol // Includes alcoholic beverages ) #define FOR_ALL_EFFECTS \ diff --git a/code/modules/reagents/cocktails.dm b/code/modules/reagents/cocktails.dm index 8bfe4705a959..166d689541b1 100644 --- a/code/modules/reagents/cocktails.dm +++ b/code/modules/reagents/cocktails.dm @@ -104,7 +104,7 @@ description = "Watered-down rum. Pirate approved!" ratios = list( /decl/material/liquid/water = 1, - /decl/material/liquid/ethanol/rum = 1 + /decl/material/liquid/alcohol/rum = 1 ) /decl/cocktail/screwdriver @@ -112,7 +112,7 @@ description = "A classic mixture of vodka and orange juice. Just the thing for the tired engineer." ratios = list( /decl/material/liquid/drink/juice/orange = 4, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/tequila_sunrise @@ -120,39 +120,39 @@ description = "A simple cocktail of tequila and orange juice. Much like a screwdriver." ratios = list( /decl/material/liquid/drink/juice/orange = 4, - /decl/material/liquid/ethanol/tequila = 1 + /decl/material/liquid/alcohol/tequila = 1 ) /decl/cocktail/classic_martini name = "gin martini" description = "Vermouth with gin. The classiest of all cocktails." ratios = list( - /decl/material/liquid/ethanol/gin = 4, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/gin = 4, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/vodka_martini name = "vodka martini" description = "A bastardisation of the classic martini. Still great." ratios = list( - /decl/material/liquid/ethanol/vodka = 4, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/vodka = 4, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/allies_cocktail name = "Allies Cocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." ratios = list( - /decl/material/liquid/ethanol/vermouth = 2, - /decl/material/liquid/ethanol/vodka = 2, - /decl/material/liquid/ethanol/gin = 2 + /decl/material/liquid/alcohol/vermouth = 2, + /decl/material/liquid/alcohol/vodka = 2, + /decl/material/liquid/alcohol/gin = 2 ) /decl/cocktail/bilk name = "bilk" description = "A foul brew of milk and beer. For alcoholics who fear osteoporosis." ratios = list( - /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/alcohol/beer = 1, /decl/material/liquid/drink/milk = 1 ) @@ -161,7 +161,7 @@ description = "A mild cocktail, widely considered an all-time classic." ratios = list( /decl/material/liquid/drink/tonic = 4, - /decl/material/liquid/ethanol/gin = 1 + /decl/material/liquid/alcohol/gin = 1 ) /decl/cocktail/cuba_libre @@ -169,24 +169,24 @@ description = "A classic mix of rum and cola." ratios = list( /decl/material/liquid/drink/cola = 4, - /decl/material/liquid/ethanol/rum = 1 + /decl/material/liquid/alcohol/rum = 1 ) /decl/cocktail/black_russian name = "black Russian" description = "Similar to a white Russian, but fit for the lactose-intolerant." ratios = list( - /decl/material/liquid/ethanol/vodka = 2, - /decl/material/liquid/ethanol/coffee = 1 + /decl/material/liquid/alcohol/vodka = 2, + /decl/material/liquid/alcohol/coffee = 1 ) /decl/cocktail/white_russian name = "white Russian" description = "A straightforward cocktail of coffee liqueur and vodka. Popular in a lot of places, but that's just, like, an opinion, man." ratios = list( - /decl/material/liquid/ethanol/coffee = 2, + /decl/material/liquid/alcohol/coffee = 2, /decl/material/liquid/drink/milk/cream, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/whiskey_cola @@ -194,7 +194,7 @@ description = "Whiskey mixed with cola. Quite refreshing." ratios = list( /decl/material/liquid/drink/cola = 4, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) /decl/cocktail/bloody_mary @@ -202,7 +202,7 @@ description = "A cocktail of vodka, tomato and lime juice. Celery stalk optional." ratios = list( /decl/material/liquid/drink/juice/tomato = 3, - /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/alcohol/vodka = 1, /decl/material/liquid/drink/juice/lime = 1 ) @@ -210,10 +210,10 @@ name = "The Livergeist" description = "A cocktail pioneered by a small cabal with a vendetta against the liver. Drink very carefully." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1 ) @@ -221,16 +221,16 @@ name = "Brave Bull" description = "A strong cocktail of tequila and coffee liquor." ratios = list( - /decl/material/liquid/ethanol/tequila = 2, - /decl/material/liquid/ethanol/coffee = 1 + /decl/material/liquid/alcohol/tequila = 2, + /decl/material/liquid/alcohol/coffee = 1 ) /decl/cocktail/toxins_special name = "H2 Special" description = "Raise a glass to the bomb technicians of yesteryear, wherever their ashes now reside." ratios = list( - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vermouth = 1, + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vermouth = 1, /decl/material/solid/metallic_hydrogen ) @@ -238,7 +238,7 @@ name = "Beepsky Smash" description = "A cocktail originating with stationside security forces. Rumoured to take the edge off being stunned with your own baton." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, + /decl/material/liquid/alcohol/whiskey = 2, /decl/material/liquid/drink/juice/lime = 1, /decl/material/solid/metal/iron ) @@ -258,8 +258,8 @@ name = "The Manly Dorf" description = "A cocktail of old that claims to be for manly men, but is mostly for people who can't tell beer and ale apart." ratios = list( - /decl/material/liquid/ethanol/ale = 1, - /decl/material/liquid/ethanol/beer = 1 + /decl/material/liquid/alcohol/ale = 1, + /decl/material/liquid/alcohol/beer = 1 ) /decl/cocktail/irish_coffee @@ -267,16 +267,16 @@ description = "A cocktail of coffee, whiskey and cream, just the thing to kick you awake while also dulling the pain of existence." ratios = list( /decl/material/liquid/drink/coffee = 4, - /decl/material/liquid/ethanol/irish_cream = 1 + /decl/material/liquid/alcohol/irish_cream = 1 ) /decl/cocktail/b52 name = "B-52" description = "A semi-modern spin on an Irish coffee, featuring a dash of cognac. It will get you bombed." ratios = list( - /decl/material/liquid/ethanol/coffee = 1, - /decl/material/liquid/ethanol/irish_cream = 1, - /decl/material/liquid/ethanol/cognac = 1 + /decl/material/liquid/alcohol/coffee = 1, + /decl/material/liquid/alcohol/irish_cream = 1, + /decl/material/liquid/alcohol/cognac = 1 ) order_specific = TRUE // layered cocktail @@ -284,9 +284,9 @@ name = "Atomic Bomb" description = "A radioactive take on a B-52, popularized by asteroid miners with prosthetic organs and something to prove." ratios = list( - /decl/material/liquid/ethanol/coffee = 1, - /decl/material/liquid/ethanol/irish_cream = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/coffee = 1, + /decl/material/liquid/alcohol/irish_cream = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/solid/metal/uranium ) order_specific = TRUE // layered cocktail @@ -296,7 +296,7 @@ name = "margarita" description = "A classic cocktail of antiquity." ratios = list( - /decl/material/liquid/ethanol/tequila = 3, + /decl/material/liquid/alcohol/tequila = 3, /decl/material/liquid/drink/juice/lime = 1 ) @@ -305,10 +305,10 @@ description = "Most of the liquor cabinet, brought together in a delicious mix. Designed for middle-aged alcoholics." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/tequila = 1 + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/tequila = 1 ) /decl/cocktail/threemileisland @@ -316,10 +316,10 @@ description = "Much like the Atomic Bomb, this cocktail was adapted by asteroid miners who couldn't enjoy a drink without a dose of radiation poisoning." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/tequila = 1, + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/tequila = 1, /decl/material/solid/metal/uranium ) @@ -328,23 +328,23 @@ description = "A simple cocktail, considered to be cultured and refined." ratios = list( /decl/material/liquid/drink/sodawater = 4, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) /decl/cocktail/manhattan name = "Manhattan" description = "Another classic cocktail of antiquity. Popular with private investigators." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/whiskey = 2, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/manhattan_proj name = "Manhattan Project" description = "A classic cocktail with a spicy twist, pioneered by a robot detective." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, - /decl/material/liquid/ethanol/vermouth = 1, + /decl/material/liquid/alcohol/whiskey = 2, + /decl/material/liquid/alcohol/vermouth = 1, /decl/material/solid/metal/uranium ) @@ -353,14 +353,14 @@ description = "A simple, refreshing cocktail with a kick to it." ratios = list( /decl/material/liquid/drink/tonic = 4, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/gin_fizz name = "gin fizz" description = "A dry, refreshing cocktail with a tang of lime." ratios = list( - /decl/material/liquid/ethanol/gin = 2, + /decl/material/liquid/alcohol/gin = 2, /decl/material/liquid/drink/sodawater = 2, /decl/material/liquid/drink/juice/lime = 1 ) @@ -369,7 +369,7 @@ name = "Bahama Mama" description = "A sweet tropical cocktail that is deceptively strong." ratios = list( - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/juice/orange = 2, /decl/material/liquid/drink/juice/lime = 2, /decl/material/liquid/drink/grenadine = 1 @@ -379,8 +379,8 @@ name = "Singulo" description = "Traditionally thrown together from maintenance stills and used to treat singularity exposure in engineers who forgot their meson goggles." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/wine = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/wine = 1, /decl/material/solid/metal/radium ) @@ -388,7 +388,7 @@ name = "Demon's Blood" description = "A ghoulish cocktail that originated as a practical joke in a fringe habitat." ratios = list( - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/citrussoda = 2, /decl/material/liquid/drink/cherrycola = 2, /decl/material/liquid/blood = 1 @@ -399,7 +399,7 @@ description = "A thick and creamy cocktail." ratios = list( /decl/material/liquid/drink/milk/cream = 2, - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/juice/banana = 1, /decl/material/liquid/drink/juice/watermelon = 1 ) @@ -408,7 +408,7 @@ name = "Anti-freeze" description = "A chilled cocktail invented and popularized by corona miners." ratios = list( - /decl/material/liquid/ethanol/vodka = 3, + /decl/material/liquid/alcohol/vodka = 3, /decl/material/liquid/drink/milk/cream = 2, /decl/material/solid/ice = 2 ) @@ -417,7 +417,7 @@ name = "Barefoot" description = "A smooth cocktail that will take your mind off the broken glass you stepped on." ratios = list( - /decl/material/liquid/ethanol/vermouth = 4, + /decl/material/liquid/alcohol/vermouth = 4, /decl/material/liquid/drink/juice/berry = 2, /decl/material/liquid/drink/milk/cream = 1 ) @@ -426,7 +426,7 @@ name = "sbiten" description = "A form of spiced mead that will bring tears to the eyes of the most hardened drinker." ratios = list( - /decl/material/liquid/ethanol/mead = 9, + /decl/material/liquid/alcohol/mead = 9, /decl/material/liquid/capsaicin = 1 ) @@ -434,7 +434,7 @@ name = "red mead" description = "Supposedly a traditional drink amongst mercenary groups prior to dangerous missions." ratios = list( - /decl/material/liquid/ethanol/mead = 1, + /decl/material/liquid/alcohol/mead = 1, /decl/material/liquid/blood = 1 ) @@ -442,7 +442,7 @@ name = "Acid Spit" description = "A cocktail inspired by monsters of legend, popular with college students daring their friends to drink one." ratios = list( - /decl/material/liquid/ethanol/wine = 1, + /decl/material/liquid/alcohol/wine = 1, /decl/material/liquid/acid ) @@ -454,17 +454,17 @@ /decl/material/liquid/drink/juice/orange = 2, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/drink/juice/lemon = 1, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/neurotoxin name = "Neurotoxin" description = "A cocktail primarily intended for people with a grudge against their own brain." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/sedatives ) @@ -474,16 +474,16 @@ description = "A tangy, fizzy twist on beer." ratios = list( /decl/material/liquid/drink/lemon_lime = 3, - /decl/material/liquid/ethanol/beer = 1 + /decl/material/liquid/alcohol/beer = 1 ) /decl/cocktail/irishslammer name = "Irish Slammer" description = "A rich cocktail of whiskey, stout and cream that was performed using a shot glass before glass-interleaving technology was lost." ratios = list( - /decl/material/liquid/ethanol/ale = 5, - /decl/material/liquid/ethanol/whiskey = 1, - /decl/material/liquid/ethanol/irish_cream = 1 + /decl/material/liquid/alcohol/ale = 5, + /decl/material/liquid/alcohol/whiskey = 1, + /decl/material/liquid/alcohol/irish_cream = 1 ) // A whiskey cola with added beer. @@ -491,8 +491,8 @@ name = "Syndicate Bomb" description = "A murky cocktail reputed to have originated in criminal circles. It will definitely get you bombed." ratios = list( - /decl/material/liquid/ethanol/whiskey = 1, - /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/alcohol/whiskey = 1, + /decl/material/liquid/alcohol/beer = 1, /decl/material/liquid/drink/cola = 4 ) @@ -500,19 +500,19 @@ name = "Devil's Kiss" description = "A ghoulish cocktail popular in some of the weirder dive bars on the system fringe." ratios = list( - /decl/material/liquid/ethanol/rum = 4, + /decl/material/liquid/alcohol/rum = 4, /decl/material/liquid/blood = 1, - /decl/material/liquid/ethanol/coffee = 2 + /decl/material/liquid/alcohol/coffee = 2 ) /decl/cocktail/hippiesdelight name = "Hippy's Delight" description = "A complex cocktail that just might open your third eye." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/psychotropics = 2 ) @@ -531,7 +531,7 @@ description = "A smooth, steady cocktail supposedly ordered by sawbones and surgeons of legend." ratios = list( /decl/material/liquid/drink/cherrycola = 4, - /decl/material/liquid/ethanol/rum = 2 + /decl/material/liquid/alcohol/rum = 2 ) /decl/cocktail/vodkacola @@ -539,14 +539,14 @@ description = "A simple mix of cola and vodka, combining sweetness, fizz and a kick in the teeth." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/sawbonesdismay name = "Sawbones' Dismay" description = "Legally, we are required to inform you that drinking this cocktail may invalidate your health insurance." ratios = list( - /decl/material/liquid/ethanol/jagermeister = 1, + /decl/material/liquid/alcohol/jagermeister = 1, /decl/material/liquid/drink/beastenergy = 1 ) @@ -554,7 +554,7 @@ name = "Patron" description = "Tequila mixed with flaked silver, for those with moderate expensive tastes." ratios = list( - /decl/material/liquid/ethanol/tequila = 1, + /decl/material/liquid/alcohol/tequila = 1, /decl/material/solid/metal/silver ) @@ -571,7 +571,7 @@ name = "Goldschlager" description = "Schnapps mixed with flaked gold, for those with very expensive tastes." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/alcohol/vodka = 1, /decl/material/solid/metal/gold ) @@ -597,5 +597,5 @@ description = "Watered-down whiskey. Essentially grog, but without the pirates." ratios = list( /decl/material/liquid/water = 1, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index d90e71023fa0..fadf1e191872 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -32,24 +32,24 @@ DEFINE_CARTRIDGE_FOR_CHEM(iron, /decl/material/solid/metal/iron) DEFINE_CARTRIDGE_FOR_CHEM(copper, /decl/material/solid/metal/copper) DEFINE_CARTRIDGE_FOR_CHEM(mercury, /decl/material/liquid/mercury) DEFINE_CARTRIDGE_FOR_CHEM(radium, /decl/material/solid/metal/radium) -DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol/spirits) +DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/alcohol/ethanol) DEFINE_CARTRIDGE_FOR_CHEM(sacid, /decl/material/liquid/acid) DEFINE_CARTRIDGE_FOR_CHEM(tungsten, /decl/material/solid/metal/tungsten) // Bar, alcoholic -DEFINE_CARTRIDGE_FOR_CHEM(beer, /decl/material/liquid/ethanol/beer) -DEFINE_CARTRIDGE_FOR_CHEM(kahlua, /decl/material/liquid/ethanol/coffee) -DEFINE_CARTRIDGE_FOR_CHEM(whiskey, /decl/material/liquid/ethanol/whiskey) -DEFINE_CARTRIDGE_FOR_CHEM(wine, /decl/material/liquid/ethanol/wine) -DEFINE_CARTRIDGE_FOR_CHEM(vodka, /decl/material/liquid/ethanol/vodka) -DEFINE_CARTRIDGE_FOR_CHEM(gin, /decl/material/liquid/ethanol/gin) -DEFINE_CARTRIDGE_FOR_CHEM(rum, /decl/material/liquid/ethanol/rum) -DEFINE_CARTRIDGE_FOR_CHEM(tequila, /decl/material/liquid/ethanol/tequila) -DEFINE_CARTRIDGE_FOR_CHEM(vermouth, /decl/material/liquid/ethanol/vermouth) -DEFINE_CARTRIDGE_FOR_CHEM(cognac, /decl/material/liquid/ethanol/cognac) -DEFINE_CARTRIDGE_FOR_CHEM(ale, /decl/material/liquid/ethanol/ale) -DEFINE_CARTRIDGE_FOR_CHEM(mead, /decl/material/liquid/ethanol/mead) +DEFINE_CARTRIDGE_FOR_CHEM(beer, /decl/material/liquid/alcohol/beer) +DEFINE_CARTRIDGE_FOR_CHEM(kahlua, /decl/material/liquid/alcohol/coffee) +DEFINE_CARTRIDGE_FOR_CHEM(whiskey, /decl/material/liquid/alcohol/whiskey) +DEFINE_CARTRIDGE_FOR_CHEM(wine, /decl/material/liquid/alcohol/wine) +DEFINE_CARTRIDGE_FOR_CHEM(vodka, /decl/material/liquid/alcohol/vodka) +DEFINE_CARTRIDGE_FOR_CHEM(gin, /decl/material/liquid/alcohol/gin) +DEFINE_CARTRIDGE_FOR_CHEM(rum, /decl/material/liquid/alcohol/rum) +DEFINE_CARTRIDGE_FOR_CHEM(tequila, /decl/material/liquid/alcohol/tequila) +DEFINE_CARTRIDGE_FOR_CHEM(vermouth, /decl/material/liquid/alcohol/vermouth) +DEFINE_CARTRIDGE_FOR_CHEM(cognac, /decl/material/liquid/alcohol/cognac) +DEFINE_CARTRIDGE_FOR_CHEM(ale, /decl/material/liquid/alcohol/ale) +DEFINE_CARTRIDGE_FOR_CHEM(mead, /decl/material/liquid/alcohol/mead) // Bar, soft DEFINE_CARTRIDGE_FOR_CHEM(ice, /decl/material/solid/ice) diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 015448f51a75..121c4a9bf2f3 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -14,7 +14,7 @@ /decl/chemical_reaction/recipe/moonshine name = "Moonshine" - result = /decl/material/liquid/ethanol/moonshine + result = /decl/material/liquid/alcohol/moonshine required_reagents = list(/decl/material/liquid/nutriment = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -29,7 +29,7 @@ /decl/chemical_reaction/recipe/wine name = "Red Wine" - result = /decl/material/liquid/ethanol/wine + result = /decl/material/liquid/alcohol/wine required_reagents = list(/decl/material/liquid/drink/juice/grape = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -37,7 +37,7 @@ /decl/chemical_reaction/recipe/pwine name = "Poison Wine" - result = /decl/material/liquid/ethanol/pwine + result = /decl/material/liquid/alcohol/pwine required_reagents = list(/decl/material/liquid/poisonberryjuice = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -45,7 +45,7 @@ /decl/chemical_reaction/recipe/melonliquor name = "Melon Liquor" - result = /decl/material/liquid/ethanol/melonliquor + result = /decl/material/liquid/alcohol/melonliquor required_reagents = list(/decl/material/liquid/drink/juice/watermelon = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -53,7 +53,7 @@ /decl/chemical_reaction/recipe/bluecuracao name = "Blue Curacao" - result = /decl/material/liquid/ethanol/bluecuracao + result = /decl/material/liquid/alcohol/bluecuracao required_reagents = list(/decl/material/liquid/drink/juice/orange = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -61,7 +61,7 @@ /decl/chemical_reaction/recipe/beer name = "Plain Beer" - result = /decl/material/liquid/ethanol/beer + result = /decl/material/liquid/alcohol/beer required_reagents = list(/decl/material/liquid/nutriment/cornoil = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -69,7 +69,7 @@ /decl/chemical_reaction/recipe/vodka name = "Potato Vodka" - result = /decl/material/liquid/ethanol/vodka + result = /decl/material/liquid/alcohol/vodka required_reagents = list(/decl/material/liquid/drink/juice/potato = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -77,7 +77,7 @@ /decl/chemical_reaction/recipe/vodka2 name = "Turnip Vodka" - result = /decl/material/liquid/ethanol/vodka + result = /decl/material/liquid/alcohol/vodka required_reagents = list(/decl/material/liquid/drink/juice/turnip = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -85,7 +85,7 @@ /decl/chemical_reaction/recipe/sake name = "Sake" - result = /decl/material/liquid/ethanol/sake + result = /decl/material/liquid/alcohol/sake required_reagents = list(/decl/material/liquid/nutriment/rice = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -93,7 +93,7 @@ /decl/chemical_reaction/recipe/kahlua name = "Kahlua" - result = /decl/material/liquid/ethanol/coffee + result = /decl/material/liquid/alcohol/coffee required_reagents = list(/decl/material/liquid/drink/coffee = 5, /decl/material/liquid/nutriment/sugar = 5) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 5 @@ -101,28 +101,28 @@ /decl/chemical_reaction/recipe/irish_cream name = "Irish Cream" - result = /decl/material/liquid/ethanol/irish_cream - required_reagents = list(/decl/material/liquid/ethanol/whiskey = 2, /decl/material/liquid/drink/milk/cream = 1) + result = /decl/material/liquid/alcohol/irish_cream + required_reagents = list(/decl/material/liquid/alcohol/whiskey = 2, /decl/material/liquid/drink/milk/cream = 1) result_amount = 3 /decl/chemical_reaction/recipe/hooch name = "Hooch" - result = /decl/material/liquid/ethanol/hooch - required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/spirits = 2, /decl/material/liquid/fuel = 1) + result = /decl/material/liquid/alcohol/hooch + required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/alcohol/ethanol = 2, /decl/material/liquid/fuel = 1) minimum_temperature = 30 CELSIUS maximum_temperature = (30 CELSIUS) + 100 result_amount = 3 /decl/chemical_reaction/recipe/mead name = "Mead" - result = /decl/material/liquid/ethanol/mead + result = /decl/material/liquid/alcohol/mead required_reagents = list(/decl/material/liquid/nutriment/honey = 1, /decl/material/liquid/water = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 2 /decl/chemical_reaction/recipe/rum name = "Dark Rum" - result = /decl/material/liquid/ethanol/rum + result = /decl/material/liquid/alcohol/rum required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/water = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 2 @@ -130,21 +130,21 @@ /decl/chemical_reaction/recipe/cider_apple name = "Apple Cider" - result = /decl/material/liquid/ethanol/cider_apple + result = /decl/material/liquid/alcohol/cider_apple required_reagents = list(/decl/material/liquid/drink/juice/apple = 2, /decl/material/liquid/nutriment/sugar = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 /decl/chemical_reaction/recipe/cider_pear name = "Pear Cider" - result = /decl/material/liquid/ethanol/cider_pear + result = /decl/material/liquid/alcohol/cider_pear required_reagents = list(/decl/material/liquid/drink/juice/pear = 2, /decl/material/liquid/nutriment/sugar = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 /decl/chemical_reaction/recipe/kvass name = "Kvass" - result = /decl/material/liquid/ethanol/kvass - required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/beer = 1) + result = /decl/material/liquid/alcohol/kvass + required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/alcohol/beer = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2a21280d675..bbd642509004 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -48,7 +48,7 @@ name = "Methyl Bromide" required_reagents = list( /decl/material/liquid/bromide = 1, - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/fuel/hydrazine = 1 ) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index e46935f7cc87..8f10b625a3c2 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -23,7 +23,7 @@ result = /decl/material/liquid/painkillers/strong required_reagents = list( /decl/material/liquid/stabilizer = 1, - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/acetone = 1 ) result_amount = 3 @@ -31,7 +31,7 @@ /decl/chemical_reaction/drug/antiseptic name = "Antiseptic" result = /decl/material/liquid/antiseptic - required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 /decl/chemical_reaction/drug/mutagenics @@ -136,7 +136,7 @@ /decl/chemical_reaction/drug/sedatives name = "Sedatives" result = /decl/material/liquid/sedatives - required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/nutriment/sugar = 4 + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/nutriment/sugar = 4 ) inhibitors = list( /decl/material/solid/phosphorus @@ -146,7 +146,7 @@ /decl/chemical_reaction/drug/paralytics name = "Paralytics" result = /decl/material/liquid/paralytics - required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) result_amount = 1 /decl/chemical_reaction/drug/zombiepowder diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index 7a580bcfba1e..b8a02ca07fec 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -44,7 +44,7 @@ /decl/chemical_reaction/drug/herbal/yarrow_tincture name = "tincture of yarrow" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/brute_meds/yarrow = 3 ) result = /decl/material/liquid/brute_meds/yarrow/tincture @@ -52,7 +52,7 @@ /decl/chemical_reaction/drug/herbal/aloe_tincture name = "tincture of aloe" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/burn_meds/aloe = 3 ) result = /decl/material/liquid/burn_meds/aloe/tincture @@ -60,7 +60,7 @@ /decl/chemical_reaction/drug/herbal/ginseng_tincture name = "tincture of ginseng" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/antitoxins/ginseng = 3 ) result = /decl/material/liquid/antitoxins/ginseng/tincture @@ -68,7 +68,7 @@ /decl/chemical_reaction/drug/herbal/valerian_tincture name = "tincture of valerian" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/sedatives/valerian = 3 ) result = /decl/material/liquid/sedatives/valerian/tincture diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index 369f3ea68b29..bcd93c0e8af8 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -79,7 +79,7 @@ /decl/chemical_reaction/recipe/vinegar2 name = "Clear Vinegar" result = /decl/material/liquid/nutriment/vinegar - required_reagents = list(/decl/material/liquid/ethanol/spirits = 10) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a sharp-smelling liquid." diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index 29ba82a01db1..0900c6d5c2e6 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -210,7 +210,7 @@ name = "Space Liberty Duff" required_reagents = list( /decl/material/liquid/water = 10, - /decl/material/liquid/ethanol/vodka = 5, + /decl/material/liquid/alcohol/vodka = 5, /decl/material/liquid/psychotropics = 5 ) obj_result = /obj/item/food/spacylibertyduff @@ -219,7 +219,7 @@ name = "Amanita Jelly" required_reagents = list( /decl/material/liquid/water = 10, - /decl/material/liquid/ethanol/vodka = 5, + /decl/material/liquid/alcohol/vodka = 5, /decl/material/liquid/amatoxin = 5 ) obj_result = /obj/item/food/amanitajelly diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 6e69142d458c..feee64d330b4 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -128,18 +128,18 @@ volume = 60 possible_transfer_amounts = @"[5,10,20,30]" reagent_ids = list( - /decl/material/liquid/ethanol/beer, - /decl/material/liquid/ethanol/coffee, - /decl/material/liquid/ethanol/whiskey, - /decl/material/liquid/ethanol/wine, - /decl/material/liquid/ethanol/vodka, - /decl/material/liquid/ethanol/gin, - /decl/material/liquid/ethanol/rum, - /decl/material/liquid/ethanol/tequila, - /decl/material/liquid/ethanol/vermouth, - /decl/material/liquid/ethanol/cognac, - /decl/material/liquid/ethanol/ale, - /decl/material/liquid/ethanol/mead, + /decl/material/liquid/alcohol/beer, + /decl/material/liquid/alcohol/coffee, + /decl/material/liquid/alcohol/whiskey, + /decl/material/liquid/alcohol/wine, + /decl/material/liquid/alcohol/vodka, + /decl/material/liquid/alcohol/gin, + /decl/material/liquid/alcohol/rum, + /decl/material/liquid/alcohol/tequila, + /decl/material/liquid/alcohol/vermouth, + /decl/material/liquid/alcohol/cognac, + /decl/material/liquid/alcohol/ale, + /decl/material/liquid/alcohol/mead, /decl/material/liquid/water, /decl/material/liquid/nutriment/sugar, /decl/material/solid/ice, @@ -158,8 +158,8 @@ /decl/material/liquid/drink/hot_coco, /decl/material/liquid/drink/tea/green, /decl/material/liquid/drink/citrussoda, - /decl/material/liquid/ethanol/beer, - /decl/material/liquid/ethanol/coffee + /decl/material/liquid/alcohol/beer, + /decl/material/liquid/alcohol/coffee ) /obj/item/chems/borghypo/service/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 6d5bebfe3ef9..bd6c5d8bfc29 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -251,7 +251,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/gin/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/gin, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/gin, reagents.maximum_volume) /obj/item/chems/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" @@ -260,7 +260,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/whiskey/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/whiskey, reagents.maximum_volume) /obj/item/chems/drinks/bottle/agedwhiskey name = "aged whiskey" @@ -269,7 +269,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/agedwhiskey/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/aged_whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/aged_whiskey, reagents.maximum_volume) /obj/item/chems/drinks/bottle/vodka name = "Tunguska Triple Distilled" @@ -278,7 +278,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vodka/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vodka, reagents.maximum_volume) /obj/item/chems/drinks/bottle/tequila name = "Caccavo Guaranteed Quality tequila" @@ -287,7 +287,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/tequila/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/tequila, reagents.maximum_volume) /obj/item/chems/drinks/bottle/patron name = "Wrapp Artiste Patron" @@ -296,7 +296,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/patron/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume - 5) + add_to_reagents(/decl/material/liquid/alcohol/tequila, reagents.maximum_volume - 5) add_to_reagents(/decl/material/solid/metal/silver, 5) /obj/item/chems/drinks/bottle/rum @@ -306,7 +306,7 @@ center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/bottle/rum/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/rum, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/rum, reagents.maximum_volume) /obj/item/chems/drinks/bottle/holywater name = "Flask of Holy Water" @@ -324,7 +324,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vermouth/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vermouth, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vermouth, reagents.maximum_volume) /obj/item/chems/drinks/bottle/kahlua name = "Robert Robust's Coffee Liqueur" @@ -333,7 +333,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/kahlua/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/coffee, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/coffee, reagents.maximum_volume) /obj/item/chems/drinks/bottle/goldschlager name = "College Girl Goldschlager" @@ -342,7 +342,7 @@ center_of_mass = @'{"x":15,"y":3}' /obj/item/chems/drinks/bottle/goldschlager/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume - 5) + add_to_reagents(/decl/material/liquid/alcohol/vodka, reagents.maximum_volume - 5) add_to_reagents(/decl/material/solid/metal/gold, 5) /obj/item/chems/drinks/bottle/cognac @@ -352,7 +352,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/cognac/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/cognac, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/cognac, reagents.maximum_volume) /obj/item/chems/drinks/bottle/wine name = "Doublebeard Bearded Special Wine" @@ -361,7 +361,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/wine/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/item/chems/drinks/bottle/absinthe name = "Jailbreaker Verte" @@ -370,7 +370,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/absinthe/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/absinthe, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/absinthe, reagents.maximum_volume) /obj/item/chems/drinks/bottle/melonliquor name = "Emeraldine Melon Liquor" @@ -379,7 +379,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/melonliquor/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/melonliquor, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/melonliquor, reagents.maximum_volume) /obj/item/chems/drinks/bottle/bluecuracao name = "Miss Blue Curacao" @@ -388,7 +388,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/bluecuracao/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/bluecuracao, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/bluecuracao, reagents.maximum_volume) /obj/item/chems/drinks/bottle/herbal name = "Liqueur d'Herbe" @@ -397,7 +397,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/herbal/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/herbal, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/herbal, reagents.maximum_volume) /obj/item/chems/drinks/bottle/grenadine name = "Briar Rose Grenadine Syrup" @@ -442,7 +442,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/pwine/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/pwine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/pwine, reagents.maximum_volume) /obj/item/chems/drinks/bottle/sake name = "Takeo Sadow's Combined Sake" @@ -451,7 +451,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/sake/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/sake, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/sake, reagents.maximum_volume) /obj/item/chems/drinks/bottle/champagne @@ -463,7 +463,7 @@ var/opening /obj/item/chems/drinks/bottle/champagne/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/champagne, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/champagne, reagents.maximum_volume) /obj/item/chems/drinks/bottle/champagne/open(mob/user) if(ATOM_IS_OPEN_CONTAINER(src)) @@ -498,7 +498,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/jagermeister/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/jagermeister, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/jagermeister, reagents.maximum_volume) //////////////////////////PREMIUM ALCOHOL /////////////////////// /obj/item/chems/drinks/bottle/premiumvodka @@ -511,7 +511,7 @@ var/namepick = pick("Four Stripes","Gilgamesh","Novaya Zemlya","Indie","STS-35") var/typepick = pick("Absolut","Gold","Quadruple Distilled","Platinum","Standard") name = "[namepick] [typepick]" - add_to_reagents(/decl/material/liquid/ethanol/vodka/premium, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vodka/premium, reagents.maximum_volume) /obj/item/chems/drinks/bottle/premiumwine name = "Uve De Blanc" @@ -529,7 +529,7 @@ var/agedyear = rand(global.using_map.game_year - aged_max, global.using_map.game_year - aged_min) set_custom_name(make_random_name()) desc += " This bottle is marked as [agedyear] Vintage." - add_to_reagents(/decl/material/liquid/ethanol/wine/premium, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine/premium, reagents.maximum_volume) //////////////////////////JUICES AND STUFF /////////////////////// @@ -612,7 +612,7 @@ center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/bottle/small/beer/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/item/chems/drinks/bottle/small/ale name = "\improper Magm-Ale" @@ -622,7 +622,7 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/bottle/small/ale/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/ale, reagents.maximum_volume) /obj/item/chems/drinks/bottle/small/gingerbeer name = "Ginger Beer" diff --git a/code/modules/reagents/reagent_containers/drinks/cans.dm b/code/modules/reagents/reagent_containers/drinks/cans.dm index 4caf4c5fa412..7c2dbb14dd63 100644 --- a/code/modules/reagents/reagent_containers/drinks/cans.dm +++ b/code/modules/reagents/reagent_containers/drinks/cans.dm @@ -50,7 +50,7 @@ center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/cans/thirteenloko/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/thirteenloko, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/thirteenloko, reagents.maximum_volume) /obj/item/chems/drinks/cans/dr_gibb name = "\improper Dr. Gibb" @@ -202,7 +202,7 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/speer/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer/good, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer/good, reagents.maximum_volume) /obj/item/chems/drinks/cans/ale name = "\improper Magm-Ale" @@ -211,4 +211,4 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/ale/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/ale, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 34698bd2a878..fc4f92672c18 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -69,10 +69,10 @@ var/global/list/lunchables_drink_reagents_ = list( // This default list is a bit different, it contains items we don't want var/global/list/lunchables_ethanol_reagents_ = list( - /decl/material/liquid/ethanol/coffee, - /decl/material/liquid/ethanol/hooch, - /decl/material/liquid/ethanol/thirteenloko, - /decl/material/liquid/ethanol/pwine + /decl/material/liquid/alcohol/coffee, + /decl/material/liquid/alcohol/hooch, + /decl/material/liquid/alcohol/thirteenloko, + /decl/material/liquid/alcohol/pwine ) /proc/lunchables_lunches() @@ -97,7 +97,7 @@ var/global/list/lunchables_ethanol_reagents_ = list( /proc/lunchables_ethanol_reagents() if(!(lunchables_ethanol_reagents_[lunchables_ethanol_reagents_[1]])) - lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /decl/material/liquid/ethanol) + lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /decl/material/liquid/alcohol) return lunchables_ethanol_reagents_ /proc/init_lunchable_list(var/list/lunches) @@ -109,7 +109,7 @@ var/global/list/lunchables_ethanol_reagents_ = list( /proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_type) . = list() - for(var/reagent_subtype in decls_repository.get_decls_of_subtype(reagent_type)) + for(var/reagent_subtype in decls_repository.get_decls_of_type(reagent_type)) if(reagent_subtype in banned_reagents) continue var/decl/material/reagent = reagent_subtype diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 077d8abfa2ec..235e6b2b6586 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -314,7 +314,7 @@ matter = list(/decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_TRACE) /obj/structure/reagent_dispensers/beerkeg/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/structure/reagent_dispensers/acid name = "sulphuric acid dispenser" diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index fc8c21ab6971..ca8806692a16 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -181,7 +181,7 @@ /decl/surgery_step/sterilize/Initialize() . = ..() - for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/ethanol)) + for(var/decl/material/liquid/alcohol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/alcohol)) if(booze.strength <= 40) sterilizing_reagents |= booze.type diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index e518456b0580..b9dbc2f8f5a2 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -110,8 +110,8 @@ for(var/rtype in temp_reagents_holder.reagents.reagent_volumes) var/new_multiplier = 1 var/decl/material/R = GET_DECL(rtype) - if(istype(R, /decl/material/liquid/ethanol)) - var/decl/material/liquid/ethanol/E = R + if(istype(R, /decl/material/liquid/alcohol)) + var/decl/material/liquid/alcohol/E = R new_multiplier = (10/E.strength) actually_flameable = 1 else if(istype(R,/decl/material/liquid/fuel/hydrazine)) diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 8bd35650d54a..957c9204a4d0 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -33,7 +33,7 @@ /decl/material/liquid/blood, /decl/material/liquid/lube, /decl/material/liquid/sedatives, - /decl/material/liquid/ethanol/spirits, + /decl/material/liquid/alcohol/ethanol, /decl/material/liquid/water, /decl/material/solid/ice, /decl/material/liquid/fuel, diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 1bb06b8926fb..12f0c4fd9d1d 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -277,15 +277,15 @@ "dried stomach waterskin" = /obj/item/chems/glass/waterskin, )) LAZYDISTINCTADD(.[/datum/gear_tweak/reagents], list( - "ale" = /decl/material/liquid/ethanol/ale, - "apple cider" = /decl/material/liquid/ethanol/cider_apple, - "beer" = /decl/material/liquid/ethanol/beer, - "kvass" = /decl/material/liquid/ethanol/kvass, - "pear cider" = /decl/material/liquid/ethanol/cider_pear, - "red wine" = /decl/material/liquid/ethanol/wine, - "sake" = /decl/material/liquid/ethanol/sake, + "ale" = /decl/material/liquid/alcohol/ale, + "apple cider" = /decl/material/liquid/alcohol/cider_apple, + "beer" = /decl/material/liquid/alcohol/beer, + "kvass" = /decl/material/liquid/alcohol/kvass, + "pear cider" = /decl/material/liquid/alcohol/cider_pear, + "red wine" = /decl/material/liquid/alcohol/wine, + "sake" = /decl/material/liquid/alcohol/sake, "water" = /decl/material/liquid/water, - "white wine" = /decl/material/liquid/ethanol/wine/premium, + "white wine" = /decl/material/liquid/alcohol/wine/premium, )) /decl/loadout_option/fantasy/eyes diff --git a/mods/content/fantasy/items/material_overrides.dm b/mods/content/fantasy/items/material_overrides.dm index 7b9b3a8b8514..cd5699e37b41 100644 --- a/mods/content/fantasy/items/material_overrides.dm +++ b/mods/content/fantasy/items/material_overrides.dm @@ -10,7 +10,7 @@ /obj/item/chems/drinks/bottle/champagne name = "sparkling wine bottle" -/decl/material/liquid/ethanol/champagne +/decl/material/liquid/alcohol/champagne name = "sparkling wine" glass_name = "sparkling wine" glass_desc = "Sparkling white wine, a favourite at noble and merchant parties." diff --git a/nebula.dme b/nebula.dme index 259798993145..3547855884ae 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3565,12 +3565,12 @@ #include "code\modules\reagents\reagent_container_edibility.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\chems\chems_alcohol.dm" #include "code\modules\reagents\chems\chems_blood.dm" #include "code\modules\reagents\chems\chems_cleaner.dm" #include "code\modules\reagents\chems\chems_compounds.dm" #include "code\modules\reagents\chems\chems_drinks.dm" #include "code\modules\reagents\chems\chems_drugs.dm" -#include "code\modules\reagents\chems\chems_ethanol.dm" #include "code\modules\reagents\chems\chems_explosives.dm" #include "code\modules\reagents\chems\chems_fuel.dm" #include "code\modules\reagents\chems\chems_herbal.dm" From 11bd76fbcf21af2f79c2595d6d4d0bbe10038355 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 13:49:38 +1100 Subject: [PATCH 32/82] Various drake fixes. --- mods/species/drakes/drake_attacks.dm | 10 ++++++++-- mods/species/drakes/icons/damage.dmi | Bin 0 -> 14343 bytes mods/species/drakes/species_bodytypes.dm | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 mods/species/drakes/icons/damage.dmi diff --git a/mods/species/drakes/drake_attacks.dm b/mods/species/drakes/drake_attacks.dm index df214d9fc54c..53d3fe7addc0 100644 --- a/mods/species/drakes/drake_attacks.dm +++ b/mods/species/drakes/drake_attacks.dm @@ -16,25 +16,31 @@ wound.disinfected = FALSE // 50% damage bonus on prone, stunned or confused enemies. +/decl/natural_attack/bite/sharp/drake + damage = 12 // chomp + /decl/natural_attack/bite/sharp/drake/get_unarmed_damage(mob/living/user, mob/living/victim) . = ..() if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN)) . = max(1, round(. * 1.5)) +/decl/natural_attack/claws/strong/drake + damage = 8 // chonky for digging + /decl/natural_attack/claws/strong/drake/get_unarmed_damage(mob/living/user, mob/living/victim) . = ..() if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN)) . = max(1, round(. * 1.5)) // Raises germ level of wounds on attack. -/decl/natural_attack/bite/sharp/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/bite/sharp/drake/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(. && drake_spend_sap(user, 5)) var/obj/item/organ/external/bit = target.get_organ(zone) if(bit) drake_infect_wounds(bit) -/decl/natural_attack/claws/strong/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/claws/strong/drake/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(. && drake_spend_sap(user, 5)) var/obj/item/organ/external/bit = target.get_organ(zone) diff --git a/mods/species/drakes/icons/damage.dmi b/mods/species/drakes/icons/damage.dmi new file mode 100644 index 0000000000000000000000000000000000000000..189ce8a346cd48bd7abcd39cbd2e854f8197dcf9 GIT binary patch literal 14343 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 aIDSvCxFos|V*Y!Fr6{NNzFNlo+y4in4J-`+ literal 0 HcmV?d00001 diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea067..0330ca9c4564 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -28,6 +28,7 @@ eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' + damage_overlays = 'mods/species/drakes/icons/damage.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY From 5cb77d0a48b6e4bcdc9365bf1eb86329358952f9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 13:50:34 +1100 Subject: [PATCH 33/82] Adding cooldowns to unarmed attacks. --- .../mob/living/human/human_attackhand.dm | 5 ++++- .../mob/living/human/unarmed_attack.dm | 21 ++++++++++--------- code/modules/mob/living/living.dm | 4 ++-- code/modules/mob/living/living_attackhand.dm | 1 + .../modules/mob/living/silicon/robot/robot.dm | 1 + .../living/simple_animal/_simple_animal.dm | 1 + code/modules/species/species_attack.dm | 2 +- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index cc45f1c3fc34..3ad1462e59a1 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -230,9 +230,12 @@ rand_damage *= damage_multiplier real_damage = max(1, real_damage) // Apply additional unarmed effects. - attack.apply_effects(H, src, rand_damage, hit_zone) + attack.apply_attack_effects(H, src, rand_damage, hit_zone) // Finally, apply damage to target apply_damage(real_damage, attack.get_damage_type(), hit_zone, damage_flags=attack.damage_flags()) + if(attack.apply_cooldown) + H.setClickCooldown(attack.apply_cooldown) + if(istype(ai)) ai.retaliate(user) return TRUE diff --git a/code/modules/mob/living/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm index 39fc3fee25f5..f1740242c4fd 100644 --- a/code/modules/mob/living/human/unarmed_attack.dm +++ b/code/modules/mob/living/human/unarmed_attack.dm @@ -18,6 +18,7 @@ var/eye_attack_text_victim var/list/usable_with_limbs = list(BP_L_HAND, BP_R_HAND) var/is_starting_default = FALSE + var/apply_cooldown = DEFAULT_ATTACK_COOLDOWN /decl/natural_attack/proc/summarize() var/list/usable_limbs = list() @@ -74,7 +75,7 @@ return damage // Returns TRUE if further affects should be applied. -/decl/natural_attack/proc/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/proc/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) if(target.stat == DEAD) return FALSE @@ -161,16 +162,16 @@ return (src.sharp? DAM_SHARP : 0)|(src.edge? DAM_EDGE : 0) /decl/natural_attack/bite - name = "bite" + name = "bite" selector_icon_state = "attack_bite" - attack_verb = list("bit") - attack_noun = list("mouth") - attack_sound = 'sound/weapons/bite.ogg' - shredding = 0 - damage = 0 - sharp = 0 - edge = 0 - usable_with_limbs = list(BP_HEAD) + attack_verb = list("bit") + attack_noun = list("mouth") + attack_sound = 'sound/weapons/bite.ogg' + shredding = 0 + damage = 5 + sharp = 0 + edge = 0 + usable_with_limbs = list(BP_HEAD) /decl/natural_attack/bite/sharp attack_verb = list("bit", "chomped") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6889922700ef..699518c3d30f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -406,7 +406,7 @@ default behaviour is: /mob/living/proc/update_damage_overlays(update_icons = TRUE) // first check whether something actually changed about damage appearance - var/damage_appearance = "" + var/damage_appearance = get_overlay_state_modifier() || "" for(var/obj/item/organ/external/O in get_external_organs()) damage_appearance += O.damage_state || "00" @@ -426,7 +426,7 @@ default behaviour is: continue var/icon/DI var/use_colour = (BP_IS_PROSTHETIC(O) ? SYNTH_BLOOD_COLOR : O.species.get_species_blood_color(src)) - var/cache_index = "[O.damage_state]/[O.bodytype.type]/[O.icon_state]/[use_colour]/[O.species.name]" + var/cache_index = "[O.damage_state]/[O.bodytype.uid]/[O.icon_state]/[use_colour]/[O.species.name]" if(!(cache_index in damage_icon_parts)) var/damage_overlay_icon = O.bodytype.get_damage_overlays(src) if(check_state_in_icon(O.damage_state, damage_overlay_icon)) diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index af16a0e793bc..1e2840284c9a 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -29,6 +29,7 @@ attackby(attacking_with, predator) else attack_animal(predator) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e588fc13400c..3b206f6f5ec9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -653,6 +653,7 @@ var/decl/species/user_species = user.get_species() if(user_species?.can_shred(user)) attack_generic(user, rand(30,50), "slashed") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE . = ..() diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 95b6c06bb8b4..699bc5752857 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -333,6 +333,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() take_damage(dealt_damage, damage_type, damage_flags = damage_flags, inflicter = user) user.visible_message(SPAN_DANGER("\The [user] [harm_verb] \the [src]!")) user.do_attack_animation(src) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE /mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) diff --git a/code/modules/species/species_attack.dm b/code/modules/species/species_attack.dm index 0c1fe901f76c..d2daf2daa062 100644 --- a/code/modules/species/species_attack.dm +++ b/code/modules/species/species_attack.dm @@ -90,7 +90,7 @@ damage = 2 usable_with_limbs = list(BP_CHEST, BP_GROIN) -/decl/natural_attack/slime_glomp/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/slime_glomp/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(.) user.apply_stored_shock_to(target) From 3f657ed73c5b223fb565fe2fcf850f2cc99efa18 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 15:05:05 +1100 Subject: [PATCH 34/82] Drakes now have natural armor. --- code/modules/mob/living/human/human.dm | 3 --- code/modules/species/species.dm | 1 - code/modules/species/species_bodytype.dm | 16 +++++++++++----- mods/species/drakes/species_bodytypes.dm | 10 ++++++++++ mods/species/serpentid/datum/species.dm | 7 ------- .../species/serpentid/datum/species_bodytypes.dm | 8 ++++++++ 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 7902a3391e6c..5f1ec5dc359f 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -511,9 +511,6 @@ if(species.holder_type) holder_type = species.holder_type set_max_health(species.total_health, skip_health_update = TRUE) // Health update is handled later. - remove_extension(src, /datum/extension/armor) - if(species.natural_armour_values) - set_extension(src, /datum/extension/armor, species.natural_armour_values) apply_species_appearance() var/decl/pronouns/new_pronouns = get_pronouns_by_gender(get_gender()) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 2318bf539aff..85df8623e439 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -87,7 +87,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 /decl/natural_attack/bite ) - var/list/natural_armour_values // Armour values used if naked. var/brute_mod = 1 // Physical damage multiplier. var/burn_mod = 1 // Burn damage multiplier. var/toxins_mod = 1 // Toxloss modifier diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 95394d64551c..af7756ddebb7 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -326,6 +326,8 @@ var/global/list/bodytypes_by_category = list() ) /// Set to FALSE if the mob will update prone icon based on state rather than transform. var/rotate_on_prone = TRUE + /// Armour values used if naked. + var/list/natural_armour_values /decl/bodytype/Initialize() . = ..() @@ -570,11 +572,15 @@ var/global/list/bodytypes_by_category = list() return 220 /decl/bodytype/proc/apply_bodytype_organ_modifications(obj/item/organ/org) - if(istype(org, /obj/item/organ/external)) - var/obj/item/organ/external/E = org - E.arterial_bleed_severity *= arterial_bleed_multiplier - if(islist(apply_encased)) - E.encased = apply_encased[E.organ_tag] + if(!istype(org, /obj/item/organ/external)) + return + var/obj/item/organ/external/limb = org + limb.arterial_bleed_severity *= arterial_bleed_multiplier + if(islist(apply_encased)) + limb.encased = apply_encased[limb.organ_tag] + if(LAZYLEN(natural_armour_values)) + remove_extension(limb, /datum/extension/armor) + set_extension(limb, /datum/extension/armor, natural_armour_values) //fully_replace: If true, all existing organs will be discarded. Useful when doing mob transformations, and not caring about the existing organs /decl/bodytype/proc/create_missing_organs(mob/living/human/H, fully_replace = FALSE) diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index 0330ca9c4564..4d97ff61bb9b 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -119,6 +119,16 @@ eye_low_light_vision_adjustment_speed = 0.3 eye_darksight_range = 7 + // Copied from riot armor, as drakes cannot wear equipment + // or hold shields. May need to be toned down at some point. + natural_armour_values = list( + ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, + ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED + ) + var/list/sitting_equip_adjust var/list/lying_equip_adjust diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index e58789252fc0..aec8b4d04853 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -49,13 +49,6 @@ brute_mod = 0.9 burn_mod = 1.35 - natural_armour_values = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = 0.5*ARMOR_RAD_MINOR - ) gluttonous = GLUT_SMALLER strength = STR_HIGH breath_pressure = 25 diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm index 8e9bd1be3b45..de0c77e659f4 100644 --- a/mods/species/serpentid/datum/species_bodytypes.dm +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -56,6 +56,14 @@ heat_level_2 = 440 //Default 400 heat_level_3 = 800 //Default 1000 + natural_armour_values = list( + ARMOR_MELEE = ARMOR_MELEE_KNIVES, + ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_SHIELDED, + ARMOR_RAD = 0.5*ARMOR_RAD_MINOR + ) + /decl/bodytype/serpentid/Initialize() equip_adjust = list( BP_L_HAND_UPPER = list("[NORTH]" = list( 0, 8), "[EAST]" = list(0, 8), "[SOUTH]" = list(-0, 8), "[WEST]" = list( 0, 8)), From af964e47137865e9c62ae43bce45ce9233fcafae Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 22 Dec 2024 15:33:40 +1100 Subject: [PATCH 35/82] Automatic changelog generation for PR #4653 [ci skip] --- html/changelogs/AutoChangeLog-pr-4653.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4653.yml diff --git a/html/changelogs/AutoChangeLog-pr-4653.yml b/html/changelogs/AutoChangeLog-pr-4653.yml new file mode 100644 index 000000000000..2fd019eea5a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4653.yml @@ -0,0 +1,6 @@ +author: ophelia v0.8 +changes: + - {imageadd: added new dirt and mud tile sprites} + - {imageadd: 'added new wooden chest sprites, by Doe'} + - {tweak: mud and soil plots are now properly greyscaled to soil material color} +delete-after: true From e23cf8a6d0df84324c7561ced2e452207739b220 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 16:25:23 +1100 Subject: [PATCH 36/82] Drakes can dig. :D --- .../abilities/abilities_predator.dm | 16 +++++++- code/game/turfs/turf.dm | 5 ++- code/modules/mob/mob.dm | 8 ++++ mods/species/drakes/drake_abilities.dm | 4 +- mods/species/drakes/species_bodytypes.dm | 39 ++++++++++++++++++- 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/code/datums/extensions/abilities/abilities_predator.dm b/code/datums/extensions/abilities/abilities_predator.dm index c6cfa9542c6a..739909b81c27 100644 --- a/code/datums/extensions/abilities/abilities_predator.dm +++ b/code/datums/extensions/abilities/abilities_predator.dm @@ -5,12 +5,26 @@ return istype(user) && !user.incapacitated() && isatom(target) && target.Adjacent(user) /datum/ability_handler/predator/do_melee_invocation(mob/user, atom/target) - // Nibbles + + // Nibbles! if(user.a_intent == I_HURT) if(isliving(target)) return handle_dismemberment(user, target) if(istype(target, /obj/item/organ)) return handle_organ_destruction(user, target) + + // Digging! + var/static/list/diggable_types = list( + /turf/floor, + /turf/wall, + /obj/structure/pit, + /obj/machinery/portable_atmospherics/hydroponics/soil + ) + if(is_type_in_list(target, diggable_types)) + var/obj/item/organ/external/paw = user.get_usable_hand_slot_organ() + if(paw) + return target.attackby(paw, user) + return FALSE /datum/ability_handler/predator/proc/handle_organ_destruction(mob/user, obj/item/organ/chewtoy) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a25d818697fb..aaae07cfb0ca 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -805,7 +805,7 @@ . = ..() LAZYADD(., /decl/interaction_handler/show_turf_contents) if(user) - var/obj/item/held = user.get_active_held_item() + var/obj/item/held = user.get_active_held_item() || user.get_usable_hand_slot_organ() if(istype(held)) if(IS_SHOVEL(held)) if(can_dig_pit(held.material?.hardness)) @@ -835,6 +835,7 @@ name = "Dig Trench" /decl/interaction_handler/dig/trench/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(IS_SHOVEL(prop)) if(T.can_dig_trench(prop?.material?.hardness)) @@ -848,6 +849,7 @@ name = "Dig Pit" /decl/interaction_handler/dig/pit/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(T.can_dig_pit(prop?.material?.hardness)) T.try_dig_pit(user, prop) @@ -856,6 +858,7 @@ name = "Dig Farm Plot" /decl/interaction_handler/dig/farm/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(T.can_dig_farm(prop?.material?.hardness)) T.try_dig_farm(user, prop) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7554d0e91f55..0a301a3ea548 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1398,3 +1398,11 @@ /mob/proc/can_twohand_item(obj/item/item) return FALSE + +/// THIS DOES NOT RELATE TO HELD ITEM SLOTS. It is very specifically a functional BP_L_HAND or BP_R_HAND organ, not necessarily a gripper. +/mob/proc/get_usable_hand_slot_organ() + var/obj/item/organ/external/paw = GET_EXTERNAL_ORGAN(src, BP_L_HAND) + if(!istype(paw) && !paw.is_usable()) + paw = GET_EXTERNAL_ORGAN(src, BP_R_HAND) + if(istype(paw) && paw.is_usable()) + return paw diff --git a/mods/species/drakes/drake_abilities.dm b/mods/species/drakes/drake_abilities.dm index dcd67a13ef74..4ba5da0ccaeb 100644 --- a/mods/species/drakes/drake_abilities.dm +++ b/mods/species/drakes/drake_abilities.dm @@ -24,8 +24,8 @@ return TRUE /datum/ability_handler/predator/grafadreka/do_melee_invocation(mob/user, atom/target) - if(user.a_intent == I_HURT) - return ..() // Handled by predator ability handler. + if((. = ..())) + return // Healing if(user.a_intent == I_HELP && isliving(target)) return handle_wound_cleaning(user, target) diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea067..b2c021f950e1 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -33,7 +33,11 @@ limb_blend = ICON_MULTIPLY appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR mob_size = MOB_SIZE_LARGE - override_limb_types = list(BP_TAIL = /obj/item/organ/external/tail/grafadreka) + override_limb_types = list( + BP_TAIL = /obj/item/organ/external/tail/grafadreka, + BP_L_HAND = /obj/item/organ/external/hand/quadruped/grafadreka, + BP_R_HAND = /obj/item/organ/external/hand/right/quadruped/grafadreka + ) base_color = "#608894" base_eye_color = COLOR_SILVER pixel_offset_x = -16 @@ -274,3 +278,36 @@ /obj/item/organ/external/tail/grafadreka/hatchling tail_icon = 'mods/species/drakes/icons/hatchling_body.dmi' + +// Technically means that severed drake paws can be used as shovels, but whatever. +/obj/item/organ/external/hand/quadruped/grafadreka + _base_attack_force = 8 + needs_attack_dexterity = DEXTERITY_NONE + +/obj/item/organ/external/hand/quadruped/grafadreka/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + . = ..() + item_flags |= ITEM_FLAG_NO_BLUDGEON + set_extension(src, /datum/extension/tool, list( + TOOL_SHOVEL = TOOL_QUALITY_GOOD, + TOOL_HOE = TOOL_QUALITY_GOOD + )) + +/obj/item/organ/external/hand/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) + override_material = /decl/material/solid/organic/bone + . = ..() + +/obj/item/organ/external/hand/right/quadruped/grafadreka + _base_attack_force = 8 + needs_attack_dexterity = DEXTERITY_NONE + +/obj/item/organ/external/hand/right/quadruped/grafadreka/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + . = ..() + item_flags |= ITEM_FLAG_NO_BLUDGEON + set_extension(src, /datum/extension/tool, list( + TOOL_SHOVEL = TOOL_QUALITY_GOOD, + TOOL_HOE = TOOL_QUALITY_GOOD + )) + +/obj/item/organ/external/hand/right/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) + override_material = /decl/material/solid/organic/bone + . = ..() From e52ea37843817936063812bfa7298754a50fa459 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 17:28:31 +1100 Subject: [PATCH 37/82] Adjusting how fire sources work with atoms. --- .../objects/effects/decals/Cleanable/misc.dm | 157 +++++++++--------- code/game/objects/effects/decals/cleanable.dm | 6 + code/game/objects/items/saddle.dm | 2 +- code/game/objects/structures/fires.dm | 1 - code/modules/materials/_materials.dm | 4 +- .../solids/materials_solid_organic.dm | 1 + code/modules/mob/living/living_defense.dm | 6 +- code/modules/organs/external/_external.dm | 5 +- 8 files changed, 94 insertions(+), 88 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 4abf329fd599..2a22a171886e 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -1,19 +1,20 @@ /obj/effect/decal/cleanable/generic - name = "clutter" - desc = "Someone should clean that up." - gender = PLURAL - icon = 'icons/obj/objects.dmi' - icon_state = "shards" - sweepable = TRUE + name = "clutter" + desc = "Someone should clean that up." + gender = PLURAL + icon = 'icons/obj/objects.dmi' + icon_state = "shards" + sweepable = TRUE /obj/effect/decal/cleanable/ash - name = "ashes" - desc = "Ashes to ashes, dust to dust, and into space." - gender = PLURAL - icon = 'icons/obj/objects.dmi' - icon_state = "ash" - weather_sensitive = FALSE - sweepable = TRUE + name = "ashes" + desc = "Ashes to ashes, dust to dust, and into space." + gender = PLURAL + icon = 'icons/obj/objects.dmi' + icon_state = "ash" + weather_sensitive = FALSE + sweepable = TRUE + burnable = FALSE /obj/effect/decal/cleanable/ash/attackby(obj/item/I, mob/user) if(ATOM_IS_OPEN_CONTAINER(I)) @@ -36,50 +37,50 @@ return TRUE /obj/effect/decal/cleanable/flour - name = "flour" - desc = "It's still good. Four second rule!" - gender = PLURAL - icon = 'icons/effects/effects.dmi' - icon_state = "flour" - persistent = TRUE - sweepable = TRUE + name = "flour" + desc = "It's still good. Four second rule!" + gender = PLURAL + icon = 'icons/effects/effects.dmi' + icon_state = "flour" + persistent = TRUE + sweepable = TRUE /obj/effect/decal/cleanable/cobweb - name = "cobweb" - desc = "Somebody should remove that." - layer = ABOVE_HUMAN_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "cobweb1" - weather_sensitive = FALSE - sweepable = TRUE + name = "cobweb" + desc = "Somebody should remove that." + layer = ABOVE_HUMAN_LAYER + icon = 'icons/effects/effects.dmi' + icon_state = "cobweb1" + weather_sensitive = FALSE + sweepable = TRUE /obj/effect/decal/cleanable/molten_item - name = "gooey grey mass" - desc = "It looks like a melted... something." - icon = 'icons/effects/molten_item.dmi' - icon_state = "molten" - persistent = TRUE - generic_filth = TRUE - weather_sensitive = FALSE + name = "gooey grey mass" + desc = "It looks like a melted... something." + icon = 'icons/effects/molten_item.dmi' + icon_state = "molten" + persistent = TRUE + generic_filth = TRUE + weather_sensitive = FALSE /obj/effect/decal/cleanable/cobweb2 - name = "cobweb" - desc = "Somebody should remove that." - layer = ABOVE_HUMAN_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "cobweb2" - weather_sensitive = FALSE - sweepable = TRUE + name = "cobweb" + desc = "Somebody should remove that." + layer = ABOVE_HUMAN_LAYER + icon = 'icons/effects/effects.dmi' + icon_state = "cobweb2" + weather_sensitive = FALSE + sweepable = TRUE //Vomit (sorry) /obj/effect/decal/cleanable/vomit - name = "vomit" - desc = "Gosh, how unpleasant." - gender = PLURAL - icon = 'icons/effects/vomit.dmi' - icon_state = "vomit_1" - persistent = TRUE - generic_filth = TRUE + name = "vomit" + desc = "Gosh, how unpleasant." + gender = PLURAL + icon = 'icons/effects/vomit.dmi' + icon_state = "vomit_1" + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/vomit/Initialize(ml, _age) random_icon_states = icon_states(icon) @@ -94,46 +95,46 @@ color = reagents.get_color() /obj/effect/decal/cleanable/tomato_smudge - name = "tomato smudge" - desc = "It's red." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "tomato_floor1" + name = "tomato smudge" + desc = "It's red." + icon = 'icons/effects/tomatodecal.dmi' + icon_state = "tomato_floor1" random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/egg_smudge - name = "smashed egg" - desc = "Seems like this one won't hatch." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "smashed_egg1" + name = "smashed egg" + desc = "Seems like this one won't hatch." + icon = 'icons/effects/tomatodecal.dmi' + icon_state = "smashed_egg1" random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/pie_smudge //honk - name = "smashed pie" - desc = "It's pie cream from a cream pie." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "smashed_pie" + name = "smashed pie" + desc = "It's pie cream from a cream pie." + icon = 'icons/effects/tomatodecal.dmi' + icon_state = "smashed_pie" random_icon_states = list("smashed_pie") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/fruit_smudge - name = "smudge" - desc = "Some kind of fruit smear." - icon = 'icons/effects/blood.dmi' - icon_state = "mfloor1" + name = "smudge" + desc = "Some kind of fruit smear." + icon = 'icons/effects/blood.dmi' + icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/champagne - name = "champagne" - desc = "Someone got a bit too excited." - gender = PLURAL - icon = 'icons/effects/effects.dmi' - icon_state = "fchampagne1" - color = COLOR_BRASS + name = "champagne" + desc = "Someone got a bit too excited." + gender = PLURAL + icon = 'icons/effects/effects.dmi' + icon_state = "fchampagne1" + color = COLOR_BRASS random_icon_states = list("fchampagne1", "fchampagne2", "fchampagne3", "fchampagne4") diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 6c7d9ec89e07..66319d3ee89b 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -3,6 +3,7 @@ anchored = TRUE abstract_type = /obj/effect/decal/cleanable + var/burnable = TRUE var/sweepable = FALSE var/weather_sensitive = TRUE var/persistent = FALSE @@ -46,6 +47,11 @@ SSpersistence.forget_value(src, /decl/persistence_handler/filth) . = ..() +/obj/effect/decal/cleanable/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + . = ..() + if(burnable && !QDELETED(src)) + qdel(src) + /obj/effect/decal/cleanable/process_weather(obj/abstract/weather_system/weather, decl/state/weather/weather_state) if(!weather_sensitive) return PROCESS_KILL diff --git a/code/game/objects/items/saddle.dm b/code/game/objects/items/saddle.dm index cf7d51f0a3c5..2fb35ce01a44 100644 --- a/code/game/objects/items/saddle.dm +++ b/code/game/objects/items/saddle.dm @@ -9,7 +9,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL /obj/item/saddle/mob_can_equip(mob/user, slot, disable_warning, force, ignore_equipped) - if(!istype(user, /mob/living/simple_animal/passive/horse)) + if(!istype(user) || !istype(user.get_bodytype(), /decl/bodytype/quadruped)) return FALSE return ..() diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index 428c0b8bf9ef..f035bdf9be09 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -441,7 +441,6 @@ removed.add_thermal_energy(heat_transfer) environment.merge(removed) - queue_icon_update() /obj/structure/fire_source/proc/has_fuel() diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 01aa188e0cc5..c32e48cd3818 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -439,7 +439,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) else if(isnull(temperature_damage_threshold)) var/new_temperature_damage_threshold = max(melting_point, boiling_point, heating_point) // Don't let the threshold be lower than the ignition point. - if(!isnull(new_temperature_damage_threshold) && (isnull(ignition_point) || (new_temperature_damage_threshold > ignition_point))) + if(isnull(new_temperature_damage_threshold) && !isnull(ignition_point)) + temperature_damage_threshold = ignition_point + else if(isnull(ignition_point) || (new_temperature_damage_threshold > ignition_point)) temperature_damage_threshold = new_temperature_damage_threshold if(!shard_icon) diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index b410f85be58f..26d720a8814d 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -3,6 +3,7 @@ ignition_point = T0C+500 // Based on loose ignition temperature of plastic accelerant_value = 0.1 burn_product = /decl/material/gas/carbon_monoxide + boiling_point = null melting_point = null compost_value = 1 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 97fe9281e2c3..d162c1c0543b 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -330,13 +330,13 @@ fire_stacks = max(0, fire_stacks - 0.2) //I guess the fire runs out of fuel eventually - var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) + var/datum/gas_mixture/G = loc?.return_air() // Check if we're standing in an oxygenless environment + if(G?.get_by_flag(XGM_GAS_OXIDIZER) < 1) ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) - location.hotspot_expose(fire_burn_temperature(), 50, 1) + location?.hotspot_expose(fire_burn_temperature(), 50, 1) var/burn_temperature = fire_burn_temperature() var/thermal_protection = get_heat_protection(burn_temperature) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 57bf6892044a..4518ef328871 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -1588,14 +1588,11 @@ Note that amputating the affected organ does in fact remove the infection from t butchery_decl.place_products(owner, butchery_decl.bone_material, 1, butchery_decl.bone_type) return ..() -// This likely seems excessive, but refer to organ explosion_act() to see how it should be handled before reaching this point. /obj/item/organ/external/physically_destroyed(skip_qdel) if(!owner) return ..() if(limb_flags & ORGAN_FLAG_CAN_AMPUTATE) - dismember(FALSE, DISMEMBER_METHOD_BLUNT) - else - owner.gib() + dismember(FALSE, DISMEMBER_METHOD_BLUNT) // This will also destroy the mob if it removes the last non-core limb. /obj/item/organ/external/is_vital_to_owner() if(isnull(vital_to_owner)) From 96c6cb7a9a403290e75e26120634099fa654f05e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 18:46:09 +1100 Subject: [PATCH 38/82] Allowed prone or clientless mobs to be pushed into fires. --- code/game/objects/structures/fires.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index f035bdf9be09..d214c690a43a 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -494,7 +494,7 @@ . = ..() if(. && lit && ismob(mover)) var/mob/M = mover - if(!MOVING_QUICKLY(M)) + if(M.client && !M.current_posture?.prone && !MOVING_QUICKLY(M)) to_chat(M, SPAN_WARNING("You refrain from stepping into \the [src].")) return FALSE return ..() From 5c96abc8bfa38fc541dd301e0efba23bad8feb74 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 19:12:51 +1100 Subject: [PATCH 39/82] Fixes some grass issues. --- code/game/turfs/flooring/flooring_grass.dm | 5 +++-- code/modules/crafting/stack_recipes/_recipe.dm | 3 ++- code/modules/crafting/stack_recipes/recipes_grass.dm | 7 ++++--- code/modules/crafting/stack_recipes/recipes_soft.dm | 6 +++++- code/modules/materials/material_stack_misc.dm | 4 ++++ 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 802c509f5738..4ed237772fe5 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -34,9 +34,10 @@ . = ..() || "mask_grass" /decl/flooring/grass/wild/handle_item_interaction(turf/floor/floor, mob/user, obj/item/item) - if(IS_KNIFE(item) && harvestable) + var/decl/material/floor_material = floor.get_material() + if(IS_KNIFE(item) && harvestable && istype(floor_material) && floor_material.dug_drop_type) if(item.do_tool_interaction(TOOL_KNIFE, user, floor, 3 SECONDS, start_message = "harvesting", success_message = "harvesting") && !QDELETED(floor) && floor.get_topmost_flooring() == src) - new /obj/item/stack/material/bundle/grass(floor, rand(2,5)) + new floor_material.dug_drop_type(floor, rand(2,5)) floor.set_flooring(/decl/flooring/grass) return TRUE return ..() diff --git a/code/modules/crafting/stack_recipes/_recipe.dm b/code/modules/crafting/stack_recipes/_recipe.dm index a73dbc0298f1..a5a28c6e6a55 100644 --- a/code/modules/crafting/stack_recipes/_recipe.dm +++ b/code/modules/crafting/stack_recipes/_recipe.dm @@ -61,7 +61,8 @@ /obj/item/stack/material/ore, /obj/item/stack/material/log, /obj/item/stack/material/lump, - /obj/item/stack/material/slab + /obj/item/stack/material/slab, + /obj/item/stack/material/bundle ) /// If set, will group recipes under a stack recipe list. var/category diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index d6f262e90bc2..a2a88b86d5c4 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -1,7 +1,8 @@ /decl/stack_recipe/woven - abstract_type = /decl/stack_recipe/woven - craft_stack_types = /obj/item/stack/material/bundle - category = "woven items" + abstract_type = /decl/stack_recipe/woven + craft_stack_types = /obj/item/stack/material/bundle + category = "woven items" + forbidden_craft_stack_types = null /decl/stack_recipe/woven/can_be_made_from(stack_type, tool_type, decl/material/mat, decl/material/reinf_mat) if((istype(mat) ? mat.type : mat) == /decl/material/solid/organic/plantmatter/grass) diff --git a/code/modules/crafting/stack_recipes/recipes_soft.dm b/code/modules/crafting/stack_recipes/recipes_soft.dm index 00a0e650a456..9672f23017e6 100644 --- a/code/modules/crafting/stack_recipes/recipes_soft.dm +++ b/code/modules/crafting/stack_recipes/recipes_soft.dm @@ -2,7 +2,11 @@ time = 1 SECOND abstract_type = /decl/stack_recipe/soft craft_stack_types = null - forbidden_craft_stack_types = null + forbidden_craft_stack_types = list( + /obj/item/stack/material/bundle, + /obj/item/stack/material/thread, + /obj/item/stack/material/bolt + ) required_min_hardness = 0 required_max_hardness = MAT_VALUE_SOFT crafting_extra_cost_factor = 1 // No wastage for just resculpting materials. diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index cf8ddd36474d..9ed1861aab88 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -147,9 +147,13 @@ /obj/item/stack/material/bundle/grass material = /decl/material/solid/organic/plantmatter/grass + drying_wetness = 50 + dried_type = /obj/item/stack/material/bundle/grass/dry /obj/item/stack/material/bundle/grass/dry material = /decl/material/solid/organic/plantmatter/grass/dry + drying_wetness = null + dried_type = null /obj/item/stack/material/strut name = "struts" From dba692cd3ddabb0ed0a82b3f90d7540ac62c7226 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 19:59:07 +1100 Subject: [PATCH 40/82] Sit and Rest verb only prompts when appropriate. --- code/modules/mob/living/living.dm | 13 +++++++++++-- code/modules/mob/living/silicon/ai/ai.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/simple_animal/friendly/possum.dm | 2 +- mods/species/drakes/species.dm | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 699518c3d30f..11dbe82ed4a3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -639,9 +639,9 @@ default behaviour is: /mob/living/verb/rest_verb() set name = "Rest" set category = "IC" - lay_down() + lay_down(block_posture = /decl/posture/sitting) -/mob/living/verb/lay_down() +/mob/living/verb/lay_down(block_posture as null) set name = "Change Posture" set category = "IC" @@ -650,6 +650,15 @@ default behaviour is: return var/list/selectable_postures = get_selectable_postures() + + if(block_posture) + for(var/decl/posture/selectable_posture in selectable_postures) + if(islist(block_posture)) + if(is_type_in_list(selectable_posture, block_posture)) + selectable_postures -= selectable_posture + else if(istype(selectable_posture, block_posture)) + selectable_postures -= selectable_posture + if(!length(selectable_postures)) return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index feec39924e9f..e9920873353f 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -659,7 +659,7 @@ var/global/list/custom_ai_icons_by_ckey_and_name = list() set_light(1, 1, selected_sprite.alive_light) // Pass lying down or getting up to our pet human, if we're in a rig. -/mob/living/silicon/ai/lay_down() +/mob/living/silicon/ai/lay_down(block_posture as null) var/obj/item/rig/rig = src.get_rig() if(rig) rig.force_rest(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 742c03a9c490..e1ec033940ba 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -251,7 +251,7 @@ var/global/list/possible_say_verbs = list( if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.") -/mob/living/silicon/pai/lay_down() +/mob/living/silicon/pai/lay_down(block_posture as null) // Pass lying down or getting up to our pet human, if we're in a rig. if(istype(loc, /obj/item/paicard)) set_posture(/decl/posture/standing) diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 1aefcb1e0fd7..69f4f9973215 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -72,7 +72,7 @@ if(damage >= 3) respond_to_damage() -/mob/living/simple_animal/opossum/lay_down() +/mob/living/simple_animal/opossum/lay_down(block_posture as null) . = ..() update_icon() diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 12b6b2109d0d..a1a0c4bf6c7e 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -77,7 +77,7 @@ set name = "Sit" set category = "IC" set src = usr - lay_down() + lay_down(block_posture = /decl/posture/lying) /datum/hud_data/grafadreka inventory_slots = list( From 35ea53ac0dfaa249515f71aab2e73b0d6ad99ca6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 20:52:48 +1100 Subject: [PATCH 41/82] Ginseng will now restore blood. --- code/modules/reagents/chems/chems_herbal.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chems/chems_herbal.dm b/code/modules/reagents/chems/chems_herbal.dm index f9f7d7bb4807..676142113fb2 100644 --- a/code/modules/reagents/chems/chems_herbal.dm +++ b/code/modules/reagents/chems/chems_herbal.dm @@ -15,10 +15,16 @@ /decl/material/liquid/antitoxins/ginseng name = "powdered ginseng" uid = "chem_antitoxins_herbal" - lore_text = "Ginseng root has curative properties and encourages organ recovery after poisoning." + lore_text = "Ginseng root has curative properties and encourages organ recovery and restoration of blood volume after poisoning or blood loss." taste_description = "bitter herbs" antitoxin_strength = 0.35 +/decl/material/liquid/antitoxins/ginseng/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + if(M.has_trait(/decl/trait/metabolically_inert)) + return + M.add_chemical_effect(CE_BLOODRESTORE, 8 * removed) + /decl/material/liquid/sedatives/valerian name = "powdered valerian flower" uid = "chem_sedatives_herbal" From 2c4a22e592d30e07508673a4a351fd1568378551 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 23 Dec 2024 00:51:49 +0000 Subject: [PATCH 42/82] Automatic changelog generation [ci skip] --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-4653.yml | 6 ------ 3 files changed, 13 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4653.yml diff --git a/html/changelog.html b/html/changelog.html index d152fc178400..7ec0db885cb9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,14 @@ -->
+

23 December 2024

+

ophelia v0.8 updated:

+
    +
  • added new dirt and mud tile sprites
  • +
  • added new wooden chest sprites, by Doe
  • +
  • mud and soil plots are now properly greyscaled to soil material color
  • +
+

21 December 2024

Penelope Haze updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 09a36ad22649..9e2102536fb4 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14936,3 +14936,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2024-12-21: Penelope Haze: - tweak: Makes weather effects slightly more transparent. +2024-12-23: + ophelia v0.8: + - imageadd: added new dirt and mud tile sprites + - imageadd: added new wooden chest sprites, by Doe + - tweak: mud and soil plots are now properly greyscaled to soil material color diff --git a/html/changelogs/AutoChangeLog-pr-4653.yml b/html/changelogs/AutoChangeLog-pr-4653.yml deleted file mode 100644 index 2fd019eea5a2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4653.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: ophelia v0.8 -changes: - - {imageadd: added new dirt and mud tile sprites} - - {imageadd: 'added new wooden chest sprites, by Doe'} - - {tweak: mud and soil plots are now properly greyscaled to soil material color} -delete-after: true From 591ffc760fd1449f1ee25c01d92994456f8b05d4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 24 Dec 2024 09:42:48 +1100 Subject: [PATCH 43/82] Tweaks to burning PR. --- code/modules/materials/_material_stack.dm | 5 +++++ code/modules/organs/external/_external.dm | 2 ++ 2 files changed, 7 insertions(+) diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 0d6f7161dea5..05b8d2392d92 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -219,3 +219,8 @@ . += " [singular_name]" return indefinite_article ? "[indefinite_article] [.]" : ADD_ARTICLE(.) return "[amount] [.] [plural_name]" + +// Horrible solution to heat damage for atoms causing logs and +// fuel to vanish. Replace this when the atom fire system exists. +/obj/item/stack/material/should_take_heat_damage(datum/gas_mixture/air, exposed_temperature) + return istype(loc, /obj/structure/fire_source) ? FALSE : ..() diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 4518ef328871..1c6f8997cc3a 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -1593,6 +1593,8 @@ Note that amputating the affected organ does in fact remove the infection from t return ..() if(limb_flags & ORGAN_FLAG_CAN_AMPUTATE) dismember(FALSE, DISMEMBER_METHOD_BLUNT) // This will also destroy the mob if it removes the last non-core limb. + else + owner.physically_destroyed() // Previously gib(), but that caused blood and guts to fly everywhere. /obj/item/organ/external/is_vital_to_owner() if(isnull(vital_to_owner)) From 4c1de0d3e19ec8cf8a3b42dc05970b13778b87c0 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 25 Dec 2024 00:49:05 +0000 Subject: [PATCH 44/82] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 7ec0db885cb9..b64a9c790dac 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -106,13 +106,6 @@

    MistakeNot4892 updated:

    • Curries, soups and stews have been rewritten, please refer to the codex for recipes.
    - -

    23 October 2024

    -

    MistakeNot4892 updated:

    -
      -
    • Dough now requires a 60C temperature and does not use egg.
    • -
    • Flatbread now uses unleavened dough, made without yeast, while pies use pie crust. Check the codex for updated recipes.
    • -
From 85b234d9517377e45c7edf2bcbfa89254907538d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 26 Dec 2024 18:23:56 +1100 Subject: [PATCH 45/82] Milking cows/goats will also give cream, which can be skimmed off the top of the milk with an empty container. --- code/datums/extensions/milkable/milkable.dm | 19 +++++++++++--- .../crafting/metalwork/metalwork_items.dm | 26 +++++++++---------- code/modules/materials/_materials.dm | 2 ++ code/modules/reagents/Chemistry-Holder.dm | 8 +++++- code/modules/reagents/chems/chems_drinks.dm | 1 + code/modules/reagents/reagent_containers.dm | 15 +++++++++++ 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/code/datums/extensions/milkable/milkable.dm b/code/datums/extensions/milkable/milkable.dm index debc42f48536..523a37e3e533 100644 --- a/code/datums/extensions/milkable/milkable.dm +++ b/code/datums/extensions/milkable/milkable.dm @@ -8,6 +8,10 @@ var/milk_min = 5 var/milk_max = 10 + var/cream_type = /decl/material/liquid/drink/milk/cream + var/cream_min = 2 + var/cream_max = 5 + var/impatience = 0 var/decl/skill/milking_skill = SKILL_BOTANY var/milking_skill_req = SKILL_BASIC @@ -42,9 +46,16 @@ create_milk() /datum/extension/milkable/proc/create_milk() - var/create_milk = min(rand(milk_min, milk_max), REAGENTS_FREE_SPACE(udder)) - if(create_milk > 0) - udder.add_reagent(milk_type, create_milk, get_milk_data()) + + var/create_milk = min(rand(milk_min, milk_max), REAGENTS_FREE_SPACE(udder)) + var/create_cream = min(rand(cream_min, cream_max), REAGENTS_FREE_SPACE(udder) - create_milk) + + if(create_milk <= 0 && create_cream <= 0) + return + + var/list/milk_data = get_milk_data() + udder.add_reagent(milk_type, create_milk, milk_data) + udder.add_reagent(cream_type, create_cream, milk_data) /datum/extension/milkable/proc/get_milk_data() var/static/list/milk_data = list( @@ -113,7 +124,7 @@ SPAN_NOTICE("\The [user] milks \the [critter] into \the [container]."), SPAN_NOTICE("You milk \the [critter] into \the [container].") ) - udder.trans_type_to(container, milk_type, min(REAGENTS_FREE_SPACE(container.reagents), rand(15, 20))) + udder.trans_to(container, min(REAGENTS_FREE_SPACE(container.reagents), rand(15, 20))) return TRUE /datum/extension/milkable/proc/handle_milking_failure(mob/user, mob/living/critter) diff --git a/code/modules/crafting/metalwork/metalwork_items.dm b/code/modules/crafting/metalwork/metalwork_items.dm index 5815340c135a..5278aaf343ec 100644 --- a/code/modules/crafting/metalwork/metalwork_items.dm +++ b/code/modules/crafting/metalwork/metalwork_items.dm @@ -19,37 +19,37 @@ obj_flags = OBJ_FLAG_NO_STORAGE var/max_held = 10 -/obj/item/chems/crucible/attackby(obj/item/W, mob/user) +/obj/item/chems/crucible/attackby(obj/item/used_item, mob/user) // Fill a mould. - if(istype(W, /obj/item/chems/mould)) - if(W.material?.hardness <= MAT_VALUE_MALLEABLE) - to_chat(user, SPAN_WARNING("\The [W] is currently too soft to be used as a mould.")) + if(istype(used_item, /obj/item/chems/mould)) + if(used_item.material?.hardness <= MAT_VALUE_MALLEABLE) + to_chat(user, SPAN_WARNING("\The [used_item] is currently too soft to be used as a mould.")) return TRUE - if(standard_pour_into(user, W)) + if(standard_pour_into(user, used_item)) return TRUE // Skim off any slag. - if(istype(W, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(W) && W.reagents) + if(istype(used_item, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(used_item) && used_item.reagents) // Pour contents into the crucible. - if(W.reagents.total_volume) - var/obj/item/chems/pouring = W + if(used_item.reagents.total_volume) + var/obj/item/chems/pouring = used_item if(pouring.standard_pour_into(user, src)) return TRUE // Attempting to skim off slag. // TODO: check for appropriate vessel material? Check melting point against temperature of crucible? if(reagents?.total_volume && length(reagents.reagent_volumes) > 1) - var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(W.reagents)) + var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(used_item.reagents)) if(removing < length(reagents.reagent_volumes)-1) - to_chat(user, SPAN_WARNING("\The [W] is full.")) + to_chat(user, SPAN_WARNING("\The [used_item] is full.")) return TRUE // Remove a portion, excepting the primary reagent. - var/old_amt = W.reagents.total_volume + var/old_amt = used_item.reagents.total_volume var/decl/material/primary_mat = reagents.get_primary_reagent_decl() - reagents.trans_to_holder(W.reagents, removing, skip_reagents = list(primary_mat.type)) - to_chat(user, SPAN_NOTICE("You skim [W.reagents.total_volume-old_amt] unit\s of slag from the top of \the [primary_mat].")) + reagents.trans_to_holder(used_item.reagents, removing, skip_reagents = list(primary_mat.type)) + to_chat(user, SPAN_NOTICE("You skim [used_item.reagents.total_volume-old_amt] unit\s of slag from the top of \the [primary_mat].")) return TRUE return ..() diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index f4a057dd4115..5a88f901d296 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -141,6 +141,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/list/stack_origin_tech = @'{"materials":1}' // Research level for stacks. // Attributes + /// Does this material float to the top of liquids, allowing it to be skimmed off? Specific to cream at time of writing. + var/skimmable = FALSE /// How rare is this material in exoplanet xenoflora? var/exoplanet_rarity_plant = MAT_RARITY_MUNDANE /// How rare is this material in exoplanet atmospheres? diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index d35715d884ad..e67584ef67c1 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -907,6 +907,12 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /* Atom reagent creation - use it all the time */ +/datum/reagents/proc/get_skimmable_reagents() + for(var/mat in reagent_volumes) + var/decl/material/reagent = GET_DECL(mat) + if(reagent.skimmable) + LAZYADD(., mat) + /atom/proc/create_reagents(var/max_vol) if(reagents) log_debug("Attempted to create a new reagents holder when already referencing one: [log_info_line(src)]") @@ -926,4 +932,4 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/decl/material/newreagent = GET_DECL(reagent_type) if(!istype(newreagent)) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index ba069e72a232..c8f1650d7f5a 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -308,6 +308,7 @@ taste_description = "creamy milk" color = "#dfd7af" uid = "chem_drink_cream" + skimmable = TRUE glass_name = "cream" glass_desc = "Ewwww..." diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a39da55a863c..1d82ec12a025 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -100,6 +100,21 @@ return /obj/item/chems/attackby(obj/item/used_item, mob/user) + + // Skimming off cream, repurposed from crucibles. + // TODO: potentially make this an alt interaction and unify with slag skimming. + if(istype(used_item, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(used_item) && used_item.reagents?.maximum_volume && reagents?.total_volume && length(reagents.reagent_volumes) > 1) + var/list/skimmable_reagents = reagents.get_skimmable_reagents() + if(length(skimmable_reagents)) + var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(used_item.reagents)) + if(removing <= 0) + to_chat(user, SPAN_WARNING("\The [used_item] is full.")) + else + var/old_amt = used_item.reagents.total_volume + reagents.trans_to_holder(used_item.reagents, removing, skip_reagents = (reagents.reagent_volumes - skimmable_reagents)) + to_chat(user, SPAN_NOTICE("You skim [used_item.reagents.total_volume-old_amt] unit\s of [used_item.reagents.get_primary_reagent_name()] from the top of \the [reagents.get_primary_reagent_name()].")) + return TRUE + if(used_item.user_can_attack_with(user, silent = TRUE)) if(IS_PEN(used_item)) var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) From 14cd7d0f3d229f9c4fcc5f961fed3ef8f0690926 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 22 Dec 2024 19:44:07 -0500 Subject: [PATCH 46/82] Add covered wells --- code/game/objects/structures/well.dm | 7 +++++++ icons/obj/structures/well.dmi | Bin 1279 -> 2021 bytes 2 files changed, 7 insertions(+) diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 10c34059fea6..1b2039aa77e0 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -32,6 +32,10 @@ . = ..() if(reagents?.total_volume) add_overlay(overlay_image(icon, "[icon_state]-fluid", reagents.get_color(), (RESET_COLOR | RESET_ALPHA))) + if(istype(reinf_material)) // reinf_material -> roof and posts, at this point in time + var/image/roof_image = overlay_image(icon, "[icon_state]-roof", reinf_material.color, RESET_COLOR | RESET_ALPHA | KEEP_APART) + roof_image.pixel_y = 16 // we have to use 32x32 sprites but want this to be, effectively, 48x32 + add_overlay(roof_image) /obj/structure/reagent_dispensers/well/on_reagent_change() if(!(. = ..())) @@ -64,6 +68,9 @@ /obj/structure/reagent_dispensers/well/mapped auto_refill = /decl/material/liquid/water +/obj/structure/reagent_dispensers/well/mapped/covered + reinf_material = /decl/material/solid/organic/wood/walnut + /obj/structure/reagent_dispensers/well/wall_fountain name = "wall fountain" desc = "An intricately-constructed fountain set into a wall." diff --git a/icons/obj/structures/well.dmi b/icons/obj/structures/well.dmi index 33a27086c184cfaa2fdc1555d80edb09aada4c59..9a6402de82652553c919d3ce3359b4ca0239161c 100644 GIT binary patch delta 2020 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 iDny;IjIjiG8}T Date: Thu, 26 Dec 2024 12:21:14 -0500 Subject: [PATCH 47/82] Replace Shaded Hills well with covered well --- maps/shaded_hills/shaded_hills-inn.dmm | 39 ++++++++++---------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 62e2a71efb30..7dc097ab79b6 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -771,10 +771,6 @@ /obj/structure/closet/crate/chest/ebony, /turf/floor/path/basalt, /area/shaded_hills/general_store) -"wA" = ( -/obj/abstract/exterior_marker/inside, -/turf/floor/dirt, -/area/shaded_hills/outside/downlands) "xh" = ( /obj/structure/table/wood/ebony, /obj/item/chems/condiment/large/salt, @@ -1212,10 +1208,6 @@ }, /turf/floor/wood/walnut, /area/shaded_hills/inn) -"Iz" = ( -/obj/abstract/exterior_marker/inside, -/turf/wall/brick/basalt, -/area/shaded_hills/outside/downlands) "IB" = ( /obj/structure/door/walnut, /obj/abstract/landmark/lock_preset/shaded_hills/shrine, @@ -1324,8 +1316,7 @@ /turf/floor/path/basalt, /area/shaded_hills/outside/downlands) "Lj" = ( -/obj/structure/reagent_dispensers/well/mapped, -/obj/abstract/exterior_marker/inside, +/obj/structure/reagent_dispensers/well/mapped/covered, /turf/floor/dirt, /area/shaded_hills/outside/downlands) "Ly" = ( @@ -7835,9 +7826,9 @@ HI HI HI TR -Iz -Iz -Iz +TR +TR +TR TR TR EV @@ -7987,9 +7978,9 @@ HI HI TR TR -wA -wA -wA +TR +TR +TR TR TR EV @@ -8139,9 +8130,9 @@ HI HI TR TR -wA +TR Lj -wA +TR TR TR EV @@ -8291,9 +8282,9 @@ HI HI TR TR -wA -wA -wA +TR +TR +TR TR TR TR @@ -8443,9 +8434,9 @@ HI HI HI TR -Iz -Iz -Iz +TR +TR +TR TR TR EV From ee71c8b2bf319dbecb6f5bbec6802c6898b240b0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 10:46:24 +1100 Subject: [PATCH 48/82] Enforcing UID on skill decls. --- code/modules/mob/skills/skill.dm | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index 8a464067a3aa..cd0d2ec8927a 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -1,14 +1,24 @@ /decl/skill - - abstract_type = /decl/skill // Don't mess with this without changing how Initialize works. - var/name = "None" // Name of the skill. This is what the player sees. - var/decl/skill_category/category // Category this skill belongs to. - var/desc = "Placeholder skill" // Generic description of this skill. - var/difficulty = SKILL_AVERAGE //Used to compute how expensive the skill is - var/default_max = SKILL_ADEPT //Makes the skill capped at this value in selection unless overriden at job level. - var/default_value // The specific default value used for this skill. If null, uses the skillset's default. - var/prerequisites // A list of skill prerequisites, if needed. - var/fallback_key // If the skill UID is not found in the savefile, this is the fallback key to use for migrating old savefiles. + // UID is required for saving in prefs. + decl_flags = DECL_FLAG_MANDATORY_UID + /// Don't mess with this without changing how Initialize works. + abstract_type = /decl/skill + /// Name of the skill. This is what the player sees. + var/name = "None" + /// Generic description of this skill. + var/desc = "Placeholder skill" + /// Used to compute how expensive the skill is + var/difficulty = SKILL_AVERAGE + /// Makes the skill capped at this value in selection unless overriden at job level. + var/default_max = SKILL_ADEPT + /// The specific default value used for this skill. If null, uses the skillset's default. + var/default_value + /// A list of skill prerequisites, if needed. + var/prerequisites + /// If the skill UID is not found in the savefile, this is the fallback key to use for migrating old savefiles. + var/fallback_key + /// Category this skill belongs to. + var/decl/skill_category/category // Names for different skill values, in order from 1 up. var/list/levels = list( From a81848708d06027d9b20643ccd4cf637acf781de Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 10:48:44 +1100 Subject: [PATCH 49/82] Adding UID to skills missing it. --- mods/content/fantasy/datum/skills.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/content/fantasy/datum/skills.dm b/mods/content/fantasy/datum/skills.dm index 2fb92c6f9e16..badad3428e72 100644 --- a/mods/content/fantasy/datum/skills.dm +++ b/mods/content/fantasy/datum/skills.dm @@ -220,6 +220,7 @@ /decl/skill/service/husbandry name = "Animal Husbandry" + uid = "skill_husbandry" desc = "Your ability to raise and care for animals." levels = list( "Unskilled" = "You know next to nothing about animals. You can feed and clean up after them, but you know nothing about their biology, their behavior, or raising their young.", From 27e82d507e634634fd103059a81267287aa7afea Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 11:15:33 +1100 Subject: [PATCH 50/82] Fish and chips use the right icon. --- code/modules/reagents/reagent_containers/food/meat/fish.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/food/meat/fish.dm b/code/modules/reagents/reagent_containers/food/meat/fish.dm index 80b15eae9fbd..4036cb4efe70 100644 --- a/code/modules/reagents/reagent_containers/food/meat/fish.dm +++ b/code/modules/reagents/reagent_containers/food/meat/fish.dm @@ -29,7 +29,7 @@ /obj/item/food/fishandchips name = "fish and chips" desc = "Best enjoyed wrapped in a newspaper on a cold wet day." - icon = 'icons/obj/food/fried/fishfingers.dmi' + icon = 'icons/obj/food/fried/fishandchips.dmi' filling_color = "#e3d796" center_of_mass = @'{"x":16,"y":16}' nutriment_desc = list("salt" = 1, "chips" = 2, "fish" = 2) From b485b3ec68ebc62deefd48e8c95a8d4481d5c128 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:17:59 -0500 Subject: [PATCH 51/82] Combine unnecessary duplicate proc overrides in core code --- code/_helpers/unsorted.dm | 5 +-- code/datums/datum.dm | 7 ---- .../machinery/_machines_base/machinery.dm | 7 +--- code/game/machinery/doors/airlock.dm | 3 -- code/game/machinery/hologram.dm | 10 ++--- code/game/machinery/vending/_vending.dm | 5 --- code/game/objects/items/__item.dm | 5 +-- code/game/objects/items/devices/tvcamera.dm | 1 + code/game/objects/items/flame/flame_torch.dm | 5 +-- code/game/objects/items/trash.dm | 7 +--- code/game/objects/items/weapons/RCD.dm | 5 +-- .../objects/items/weapons/material/shards.dm | 7 +--- .../items/weapons/melee/energy_sword.dm | 3 -- .../objects/items/weapons/storage/backpack.dm | 7 +--- code/game/objects/random/subtypes/clothing.dm | 16 -------- code/game/objects/random/subtypes/misc.dm | 10 ----- .../game/objects/random/subtypes/paperwork.dm | 3 +- code/game/objects/structures/fires.dm | 5 +-- code/game/objects/structures/girders.dm | 11 ++---- code/game/objects/structures/target_stake.dm | 7 +--- code/game/objects/structures/watercloset.dm | 38 +++++++++---------- code/modules/butchery/butchery_products.dm | 6 --- .../clothing/spacesuits/rig/modules/combat.dm | 4 -- code/modules/events/meteors.dm | 7 +--- .../designs/general/designs_general.dm | 11 +----- code/modules/games/cards.dm | 5 +-- code/modules/mechs/components/body.dm | 33 ++++++++-------- code/modules/mechs/premade/heavy.dm | 4 -- code/modules/mechs/premade/misc.dm | 4 -- code/modules/mob/living/brain/brain.dm | 11 ++---- .../modules/mob/living/human/human_species.dm | 3 -- code/modules/mob/living/living.dm | 17 ++++----- .../robot/modules/module_maintenance_drone.dm | 7 +--- code/modules/mob/living/silicon/silicon.dm | 3 -- code/modules/mob/mob.dm | 5 --- code/modules/organs/internal/_internal.dm | 14 +++---- .../overmap/contacts/contact_sensors.dm | 9 ++--- code/modules/persistence/persistence_datum.dm | 6 +-- code/modules/projectiles/gun.dm | 7 +--- code/modules/projectiles/projectile.dm | 5 +-- code/modules/reagents/reagent_containers.dm | 7 +--- .../reagents/reagent_containers/borghydro.dm | 3 -- .../drinkingglass/drinkingglass.dm | 25 ++++-------- .../reagents/reagent_containers/hypospray.dm | 5 +-- .../tools/ano_device_battery.dm | 5 +-- 45 files changed, 99 insertions(+), 274 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 45dc05bd2c83..32eac707ce72 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -719,11 +719,8 @@ Turf and target are seperate in case you want to teleport some distance from a t /obj/item/weldingtool/can_puncture() return 1 -/obj/item/screwdriver/can_puncture() - return 1 - /obj/item/clothing/mask/smokable/cigarette/can_puncture() - return src.lit + return ..() || lit // in case someone has a sharp cigarette for some reason /* Checks if that loc and dir has a item on the wall diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 0fbfeaf0232b..a0aeed07808d 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -111,10 +111,3 @@ */ /datum/proc/PopulateClone(var/datum/clone) return clone - -///////////////////////////////////////////////////////////// -//Common implementations -///////////////////////////////////////////////////////////// - -/image/GetCloneArgs() - return list(icon, loc, icon_state, layer, dir) \ No newline at end of file diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 6736ad221bbe..d6fafc99f1e5 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -234,6 +234,8 @@ Class Procs: /obj/machinery/CouldUseTopic(var/mob/user) ..() user.set_machine(src) + if(clicksound && isliving(user)) + playsound(src, clicksound, clickvol) /obj/machinery/CouldNotUseTopic(var/mob/user) user.unset_machine() @@ -391,11 +393,6 @@ Class Procs: /datum/proc/remove_visual(mob/M) return -/obj/machinery/CouldUseTopic(var/mob/user) - ..() - if(clicksound && isliving(user)) - playsound(src, clicksound, clickvol) - /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") for(var/obj/item/C in component_parts) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c9149697a668..aa341461f1c8 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -141,9 +141,6 @@ About the new airlock wires panel: return ..(user) -/obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) - ..(user) - /obj/machinery/door/airlock/proc/isElectrified() if(src.electrified_until != 0) return 1 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 9d871d3e2b56..ce3c79b45d88 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -80,6 +80,9 @@ var/global/list/holopads = list() /obj/machinery/hologram/holopad/Destroy() global.listening_objects -= src + global.holopads -= src + for (var/mob/living/master in masters) + clear_holo(master) return ..() /obj/machinery/hologram/holopad/interface_interact(var/mob/living/human/user) //Carn: Hologram requests. @@ -387,13 +390,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ idle_power_usage = 5 active_power_usage = 100 -//Destruction procs. -/obj/machinery/hologram/holopad/Destroy() - global.holopads -= src - for (var/mob/living/master in masters) - clear_holo(master) - return ..() - /* * Other Stuff: Is this even used? */ diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index 2bc56a9c1051..866062f2a54b 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -195,11 +195,6 @@ . = ..() SSnano.update_uis(src) -/obj/machinery/vending/receive_mouse_drop(atom/dropping, mob/user, params) - . = ..() - if(!. && dropping.loc == user && attempt_to_stock(dropping, user)) - return TRUE - /obj/machinery/vending/proc/attempt_to_stock(var/obj/item/I, var/mob/user) for(var/datum/stored_items/vending_products/R in product_records) if(I.type == R.item_path) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 5081ba6b45d8..e2e71c3653ec 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -378,7 +378,7 @@ return ..(user, distance, "", jointext(desc_comp, "
")) /obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen/inventory)) || ..() + . = (loc == user && istype(over, /obj/screen)) || ..() /obj/item/handle_mouse_drop(atom/over, mob/user, params) @@ -1115,9 +1115,6 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. step_towards(src,S) else ..() -/obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen)) || ..() - // Supplied during loadout gear tweaking. /obj/item/proc/set_custom_name(var/new_name) base_name = new_name diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index bbcbc43e4889..272de8433723 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -96,6 +96,7 @@ update_held_icon() /* Assembly by a roboticist */ +// TODO: Make this slapcrafting or remove tvcamera/tvassembly entirely /obj/item/robot_parts/head/attackby(var/obj/item/assembly/S, mob/user) if (!istype(S, /obj/item/assembly/infra)) return ..() diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 26f616a4a47c..7f0edbe8dd3e 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -13,10 +13,6 @@ var/head_material = /decl/material/solid/organic/cloth var/burnt = FALSE -/obj/item/flame/torch/Initialize() - . = ..() - set_color(null) // clear our scent color - /obj/item/flame/torch/get_available_scents() var/static/list/available_scents = list( /decl/scent_type/woodsmoke @@ -34,6 +30,7 @@ /obj/item/flame/torch/Initialize(var/ml, var/material_key, var/_head_material) . = ..() + set_color(null) // clear our scent color. TODO: allow flame items to disable scent color setting in the first place if(_head_material) head_material = _head_material diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index bf4bfab6f1be..8c88b8edc0df 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -10,15 +10,12 @@ var/age = 0 /obj/item/trash/Initialize(mapload, var/_age) + if(!mapload) + SSpersistence.track_value(src, /decl/persistence_handler/filth/trash) . = ..(mapload) if(!isnull(_age)) age = _age -/obj/item/trash/Initialize(var/ml) - if(!ml) - SSpersistence.track_value(src, /decl/persistence_handler/filth/trash) - . = ..() - /obj/item/trash/Destroy() SSpersistence.forget_value(src, /decl/persistence_handler/filth/trash) . = ..() diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 8e40d1f38f80..f48b28762d0e 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -32,6 +32,7 @@ var/decl/hierarchy/h = GET_DECL(/decl/hierarchy/rcd_mode) work_modes = h.children work_mode = work_modes[1] + update_icon() //Initializes the ammo counter /obj/item/rcd/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) return FALSE @@ -45,10 +46,6 @@ to_chat(user, "The current mode is '[work_mode]'.") to_chat(user, "It currently holds [stored_matter]/[max_stored_matter] matter-units.") -/obj/item/rcd/Initialize() - . = ..() - update_icon() //Initializes the ammo counter - /obj/item/rcd/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/rcd_ammo)) var/obj/item/rcd_ammo/cartridge = W diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index dd248df7bb77..7ff92bf32ad2 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -53,6 +53,8 @@ . = ..() // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity alpha = 255 * (material ? (1 - (1 - material.opacity)**2) : 1) + if(has_handle) + add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) /obj/item/shard/attackby(obj/item/W, mob/user) if(IS_WELDER(W) && material.shard_can_repair) @@ -80,11 +82,6 @@ return TRUE return ..() -/obj/item/shard/on_update_icon() - . = ..() - if(has_handle) - add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) - /obj/item/shard/Crossed(atom/movable/AM) ..() if(!isliving(AM)) diff --git a/code/game/objects/items/weapons/melee/energy_sword.dm b/code/game/objects/items/weapons/melee/energy_sword.dm index 3d20dd638d3e..045040acb762 100644 --- a/code/game/objects/items/weapons/melee/energy_sword.dm +++ b/code/game/objects/items/weapons/melee/energy_sword.dm @@ -20,9 +20,6 @@ if(!lighting_color) lighting_color = blade_color . = ..() - -/obj/item/energy_blade/sword/Initialize() - . = ..() set_extension(src, /datum/extension/demolisher/energy) /obj/item/energy_blade/sword/is_special_cutting_tool(var/high_power) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 14a20b4125c1..fb4d2bb67566 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -17,17 +17,14 @@ /obj/item/backpack/can_contaminate() return FALSE -/obj/item/backpack/equipped() - if(!has_extension(src, /datum/extension/appearance)) - set_extension(src, /datum/extension/appearance/cardborg) - ..() - /obj/item/backpack/attackby(obj/item/W, mob/user) if (storage?.use_sound) playsound(src.loc, storage.use_sound, 50, 1, -5) return ..() /obj/item/backpack/equipped(var/mob/user, var/slot) + if(!has_extension(src, /datum/extension/appearance)) + set_extension(src, /datum/extension/appearance/cardborg) if (slot == slot_back_str && storage?.use_sound) playsound(loc, storage.use_sound, 50, 1, -5) return ..(user, slot) diff --git a/code/game/objects/random/subtypes/clothing.dm b/code/game/objects/random/subtypes/clothing.dm index f9bac2fd1c41..8524aff474c2 100644 --- a/code/game/objects/random/subtypes/clothing.dm +++ b/code/game/objects/random/subtypes/clothing.dm @@ -238,19 +238,3 @@ /obj/item/clothing/suit/space/void/medical/alt ) return spawnable_choices - -/obj/random/hardsuit - name = "Random Hardsuit" - desc = "This is a random hardsuit control module." - icon = 'icons/obj/rig_modules.dmi' - icon_state = "generic" - -/obj/random/hardsuit/spawn_choices() - var/static/list/spawnable_choices = list( - /obj/item/rig/industrial, - /obj/item/rig/eva, - /obj/item/rig/light/hacker, - /obj/item/rig/light/stealth, - /obj/item/rig/light - ) - return spawnable_choices diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index b5206b950d30..4ccde91270d2 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -465,16 +465,6 @@ ) return spawnable_choices -/obj/random/crayon - name = "random crayon" - desc = "This is a random crayon." - icon = 'icons/obj/items/crayons.dmi' - icon_state = "crayonred" - -/obj/random/crayon/spawn_choices() - var/static/list/spawnable_choices = subtypesof(/obj/item/pen/crayon) - return spawnable_choices - /obj/random/umbrella name = "Random Umbrella" desc = "This is a random umbrella." diff --git a/code/game/objects/random/subtypes/paperwork.dm b/code/game/objects/random/subtypes/paperwork.dm index 061b4944609a..a073a9d95067 100644 --- a/code/game/objects/random/subtypes/paperwork.dm +++ b/code/game/objects/random/subtypes/paperwork.dm @@ -12,7 +12,8 @@ icon_state = "crayonred" /obj/random/crayon/spawn_choices() - return subtypesof(/obj/item/pen/crayon) + var/static/list/spawnable_choices = subtypesof(/obj/item/pen/crayon) + return spawnable_choices /obj/random/clipboard name = "random clipboard" diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index cdb416489e39..56dca65f9b5a 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -244,9 +244,6 @@ /obj/structure/fire_source/isflamesource() return (lit == FIRE_LIT) -/obj/structure/fire_source/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return ..() || (istype(mover) && mover.checkpass(PASS_FLAG_TABLE)) - /obj/structure/fire_source/proc/burn_material(var/decl/material/mat, var/amount) var/effective_burn_temperature = get_effective_burn_temperature() . = mat.get_burn_products(amount, effective_burn_temperature) @@ -492,7 +489,7 @@ try_light(1000) /obj/structure/fire_source/CanPass(atom/movable/mover, turf/target, height, air_group) - . = ..() + . = ..() || mover?.checkpass(PASS_FLAG_TABLE) if(. && lit && ismob(mover)) var/mob/M = mover if(!MOVING_QUICKLY(M)) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index c508eb305f99..a82c4c7733da 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -19,13 +19,6 @@ set_extension(src, /datum/extension/penetration/simple, 100) . = ..() -/obj/structure/girder/can_unanchor(var/mob/user) - . = ..() - var/turf/T = loc - if(!anchored && . && (!istype(T) || T.is_open())) - to_chat(user, SPAN_WARNING("You can only secure \the [src] to solid ground.")) - return FALSE - /obj/structure/girder/handle_default_screwdriver_attackby(var/mob/user, var/obj/item/screwdriver) if(reinf_material) @@ -88,6 +81,10 @@ to_chat(user, SPAN_WARNING("You must remove the support rods before you can dislodge \the [src].")) return FALSE . = ..() + var/turf/T = loc + if(!anchored && . && (!istype(T) || T.is_open())) + to_chat(user, SPAN_WARNING("You can only secure \the [src] to solid ground.")) + return FALSE /obj/structure/girder/can_dismantle(var/mob/user) if(reinf_material) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 0dc8afefce6a..38feb74fd25d 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -15,11 +15,6 @@ dummy = null . = ..() -/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) - if(dummy?.repair_target_dummy(used_item, user)) - return TRUE - return ..() - /obj/structure/target_stake/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) if(dummy) . = dummy.take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) @@ -42,6 +37,8 @@ return ..() /obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(dummy?.repair_target_dummy(used_item, user)) + return TRUE if(istype(used_item, /obj/item/training_dummy) && can_hold_dummy(user, used_item)) if(dummy) to_chat(user, SPAN_WARNING("\The [src] is already holding \the [dummy].")) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 454e6e9b6b53..549d7d913abd 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -49,6 +49,23 @@ var/global/list/hygiene_props = list() if(clogged <= 0) unclog() return TRUE + //toilet paper interaction for clogging toilets and other facilities + if (istype(thing, /obj/item/stack/tape_roll/barricade_tape/toilet)) + if (clogged == -1) + to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [thing].")) + return TRUE + if (clogged) + to_chat(user, SPAN_WARNING("\The [src] is already clogged.")) + return TRUE + if (!do_after(user, 3 SECONDS, src)) + to_chat(user, SPAN_WARNING("You must stay still to clog \the [src].")) + return TRUE + if (clogged || QDELETED(thing) || !user.try_unequip(thing)) + return TRUE + to_chat(user, SPAN_NOTICE("You unceremoniously jam \the [src] with \the [thing]. What a rebel.")) + clog(1) + qdel(thing) + return TRUE . = ..() /obj/structure/hygiene/examine(mob/user) @@ -474,27 +491,6 @@ var/global/list/hygiene_props = list() . = ..() icon_state = "puddle" -//toilet paper interaction for clogging toilets and other facilities - -/obj/structure/hygiene/attackby(obj/item/I, mob/user) - if (!istype(I, /obj/item/stack/tape_roll/barricade_tape/toilet)) - return ..() - if (clogged == -1) - to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [I].")) - return TRUE - if (clogged) - to_chat(user, SPAN_WARNING("\The [src] is already clogged.")) - return TRUE - if (!do_after(user, 3 SECONDS, src)) - to_chat(user, SPAN_WARNING("You must stay still to clog \the [src].")) - return TRUE - if (clogged || QDELETED(I) || !user.try_unequip(I)) - return TRUE - to_chat(user, SPAN_NOTICE("You unceremoniously jam \the [src] with \the [I]. What a rebel.")) - clog(1) - qdel(I) - return TRUE - //////////////////////////////////////////////////// // Toilet Paper Roll //////////////////////////////////////////////////// diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 23f9dc4858c9..075345d3e337 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -63,12 +63,6 @@ else return ..() -/obj/item/food/butchery/get_dried_product() - . = ..() - if(meat_name && istype(., /obj/item/food/jerky)) - var/obj/item/food/jerky/jerk = . - jerk.set_meat_name(meat_name) - /obj/item/food/butchery/get_drying_state(var/obj/rack) return "meat" diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 5f16eca89002..0386948c6020 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -215,10 +215,6 @@ var/obj/item/gun/gun -/obj/item/rig_module/mounted/Destroy() - QDEL_NULL(gun) - . = ..() - /obj/item/rig_module/mounted/Initialize() . = ..() if(ispath(gun)) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index f291cda35f54..b39f3c9da047 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -243,6 +243,8 @@ var/global/list/meteors_major = list( . = ..() z_original = z global.meteor_list += src + if(!ismissile) + SpinAnimation() /obj/effect/meteor/Move() . = ..() //process movement... @@ -259,11 +261,6 @@ var/global/list/meteors_major = list( global.meteor_list -= src . = ..() -/obj/effect/meteor/Initialize() - . = ..() - if(!ismissile) - SpinAnimation() - /obj/effect/meteor/Bump(atom/A) ..() if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 69b99bda0b9f..fda6ce15bad0 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -188,7 +188,7 @@ /datum/fabricator_recipe/fishing_line_high_quality path = /obj/item/fishing_line/high_quality -/datum/fabricator_recipe/chipboard +/datum/fabricator_recipe/chipboard // base type is for oak path = /obj/item/stack/material/sheet/mapped/chipboard_oak category = "Textiles" fabricator_types = list( @@ -202,15 +202,6 @@ /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) ) -/datum/fabricator_recipe/chipboard - path = /obj/item/stack/material/sheet/mapped/chipboard_oak - -/datum/fabricator_recipe/chipboard/get_resources() - resources = list( - /decl/material/solid/organic/wood/oak = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), - /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) - ) - /datum/fabricator_recipe/chipboard/maple path = /obj/item/stack/material/sheet/mapped/chipboard_maple diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index c4351b213e2b..8084a66d09df 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -27,6 +27,7 @@ var/global/list/card_decks = list() /obj/item/deck/Initialize() . = ..() global.card_decks += src + generate_cards() /obj/item/deck/Destroy() . = ..() @@ -70,10 +71,6 @@ var/global/list/card_decks = list() desc = "A simple deck of playing cards." icon_state = "deck" -/obj/item/deck/Initialize() - . = ..() - generate_cards() - /obj/item/deck/proc/generate_cards() return diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index 4d8016e71384..e60ba0724037 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -50,6 +50,21 @@ "[WEST]" = list("x" = 8, "y" = 0) ) ) + if(pilot_coverage >= 100) //Open cockpits dont get to have air + cockpit = new + cockpit.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.temperature = air.temperature + cockpit.update_values() + + air_supply = new /obj/machinery/portable_atmospherics/canister/air(src) + storage_compartment = new(src) /obj/item/mech_component/chassis/Destroy() QDEL_NULL(cell) @@ -74,24 +89,6 @@ if(!m_armour) to_chat(user, SPAN_WARNING("It is missing exosuit armour plating.")) -/obj/item/mech_component/chassis/Initialize() - . = ..() - if(pilot_coverage >= 100) //Open cockpits dont get to have air - cockpit = new - cockpit.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.temperature = air.temperature - cockpit.update_values() - - air_supply = new /obj/machinery/portable_atmospherics/canister/air(src) - storage_compartment = new(src) - /obj/item/mech_component/chassis/proc/update_air(var/take_from_supply) var/changed diff --git a/code/modules/mechs/premade/heavy.dm b/code/modules/mechs/premade/heavy.dm index a81ce89533f6..e1dfd62d77f5 100644 --- a/code/modules/mechs/premade/heavy.dm +++ b/code/modules/mechs/premade/heavy.dm @@ -90,10 +90,6 @@ "[WEST]" = list("x" = 12, "y" = 8) ) ) - - . = ..() - -/obj/item/mech_component/chassis/heavy/prebuild() . = ..() m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat(src) diff --git a/code/modules/mechs/premade/misc.dm b/code/modules/mechs/premade/misc.dm index 4d150377c327..dafb3bc44d58 100644 --- a/code/modules/mechs/premade/misc.dm +++ b/code/modules/mechs/premade/misc.dm @@ -53,7 +53,3 @@ ) ) . = ..() - -/obj/item/mech_component/chassis/pod/prebuild() - . = ..() - m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/radproof(src) \ No newline at end of file diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 35b97e4880b8..b80dfb8f85db 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -26,11 +26,6 @@ ) return default_emotes -/mob/living/brain/handle_regular_status_updates() - . = ..() - if(emp_damage || stat == DEAD || !is_in_interface()) - SET_STATUS_MAX(src, STAT_SILENCE, 2) - /mob/living/brain/is_deaf() return emp_damage || stat == DEAD || !is_in_interface() @@ -99,8 +94,10 @@ emp_damage += rand(0,10) emp_damage = clamp(emp_damage, 0, max_emp_damage) -/mob/living/brain/handle_regular_status_updates() // Status & health update, are we dead or alive etc. +/mob/living/brain/handle_regular_status_updates() // Status & health update, are we dead or alive, can we communicate, etc. . = ..() + if(emp_damage || stat == DEAD || !is_in_interface()) + SET_STATUS_MAX(src, STAT_SILENCE, 2) if(stat == DEAD || !isSynthetic()) emp_damage = 0 return @@ -114,4 +111,4 @@ if(emp_damage <= 0) last_emp_message = 0 emp_damage = 0 - to_chat(src, SPAN_NOTICE("All systems restored.")) + to_chat(src, SPAN_NOTICE("All systems restored.")) \ No newline at end of file diff --git a/code/modules/mob/living/human/human_species.dm b/code/modules/mob/living/human/human_species.dm index 6988a940bed6..c499bbb2da2e 100644 --- a/code/modules/mob/living/human/human_species.dm +++ b/code/modules/mob/living/human/human_species.dm @@ -37,9 +37,6 @@ corpse.equip_corpse_outfit(src) return INITIALIZE_HINT_LATELOAD -/mob/living/human/corpse/get_death_message(gibbed) - return SKIP_DEATH_MESSAGE - /mob/living/human/corpse/LateInitialize() ..() var/current_max_health = get_max_health() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e76e323abea1..1ac5dbe15c4b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1524,6 +1524,13 @@ default behaviour is: qdel(grab) if(istype(ai)) ai.on_buckled(M) + reset_layer() + update_icon() + +/mob/living/unbuckle_mob() + . = ..() + reset_layer() + update_icon() /mob/living/try_make_grab(mob/living/user, defer_hand = FALSE) . = ..() @@ -1891,16 +1898,6 @@ default behaviour is: return TRUE return FALSE -/mob/living/buckle_mob(mob/living/M) - . = ..() - reset_layer() - update_icon() - -/mob/living/unbuckle_mob() - . = ..() - reset_layer() - update_icon() - /mob/living/proc/flee(atom/target, upset = FALSE) var/static/datum/automove_metadata/_flee_automove_metadata = new( _move_delay = null, diff --git a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm index fe58498a36e8..b9456bc2050c 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm @@ -115,6 +115,8 @@ ..() var/obj/item/chems/spray/cleaner/drone/SC = locate() in equipment SC.add_to_reagents(/decl/material/liquid/cleaner, 8 * amount) + var/obj/item/lightreplacer/LR = locate() in equipment + LR.Charge(R, amount) /obj/item/robot_module/drone/construction name = "construction drone module" @@ -126,8 +128,3 @@ /obj/item/robot_module/drone/construction/Initialize() equipment += /obj/item/rcd/borg . = ..() - -/obj/item/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/lightreplacer/LR = locate() in equipment - LR.Charge(R, amount) - ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 768dc1c0d513..52457ceb078c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -68,9 +68,6 @@ QDEL_NULL_LIST(stock_parts) return ..() -/mob/living/silicon/get_dexterity(silent) - return dexterity - /mob/living/silicon/fully_replace_character_name(new_name) ..() create_or_update_account(new_name) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5ed9d75db534..dfb7852c5288 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1297,11 +1297,6 @@ /mob/proc/get_blood_type() return -// Gets the ID card of a mob, but will not check types in the exceptions list -/mob/GetIdCard(exceptions = null) - RETURN_TYPE(/obj/item/card/id) - return LAZYACCESS(GetIdCards(exceptions), 1) - /mob/get_overhead_text_x_offset() return offset_overhead_text_x diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index ac00fcf30e58..d891023e600d 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -56,6 +56,12 @@ affected.cavity_max_w_class = max(affected.cavity_max_w_class, w_class) affected.update_internal_organs_cost() + // This might need revisiting to stop people successfully implanting brains in groins and transferring minds. + if(transfer_brainmob_with_organ && istype(owner)) + var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) + if(brainmob?.key) + transfer_key_from_mob_to_mob(brainmob, owner) + /obj/item/organ/internal/do_uninstall(in_place, detach, ignore_children, update_icon) var/mob/living/victim = owner // cleared in parent proc @@ -289,11 +295,3 @@ /obj/item/organ/internal/preserve_in_cryopod(var/obj/machinery/cryopod/pod) var/mob/living/brainmob = get_brainmob() return brainmob?.key - -// This might need revisiting to stop people successfully implanting brains in groins and transferring minds. -/obj/item/organ/internal/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) - . = ..() - if(transfer_brainmob_with_organ && istype(owner)) - var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) - if(brainmob?.key) - transfer_key_from_mob_to_mob(brainmob, owner) diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm index f6dee900ce47..fcdd349fb077 100644 --- a/code/modules/overmap/contacts/contact_sensors.dm +++ b/code/modules/overmap/contacts/contact_sensors.dm @@ -16,6 +16,9 @@ var/obj/effect/overmap/overmap_location = loc if(overmap_location.requires_contact) new /datum/overmap_contact(src, overmap_location) + if(!contact_datums[linked]) + var/datum/overmap_contact/record = new(src, linked) + record.marker.alpha = 255 /obj/machinery/computer/ship/sensors/Destroy() objects_in_view.Cut() @@ -23,12 +26,6 @@ trackers.Cut() . = ..() -/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector) - . = ..() - if(. && linked && !contact_datums[linked]) - var/datum/overmap_contact/record = new(src, linked) - record.marker.alpha = 255 - /obj/machinery/computer/ship/sensors/proc/reveal_contacts(var/mob/user) if(user && user.client) for(var/key in contact_datums) diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index 0c9e0aedca6b..557ae252b88a 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -12,10 +12,6 @@ var/ignore_area_flags = FALSE // Set to TRUE to skip area flag checks such as nonpersistent areas. var/ignore_invalid_loc = FALSE // Set to TRUE to skip checking for a non-null station turf for the entry. -/decl/persistence_handler/Initialize() - SetFilename() - . = ..() - /decl/persistence_handler/proc/SetFilename() if(name) filename = "data/persistent/[ckey(global.using_map.name)]-[ckey(name)].json" @@ -95,6 +91,8 @@ /decl/persistence_handler/Initialize() + SetFilename() + . = ..() if(!fexists(filename)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 83ee026551b2..4de22aa06166 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -259,7 +259,8 @@ /obj/item/gun/dropped(var/mob/living/user) check_accidents(user) update_icon() - return ..() + . = ..() + clear_autofire() /obj/item/gun/proc/Fire(atom/target, atom/movable/firer, clickparams, pointblank = FALSE, reflex = FALSE, set_click_cooldown = TRUE, target_zone = BP_CHEST) if(!firer || !target) @@ -708,10 +709,6 @@ afterattack(shoot_to,target) return 1 -/obj/item/gun/dropped(mob/living/user) - . = ..() - clear_autofire() - /obj/item/gun/proc/can_autofire() return (autofire_enabled && world.time >= next_fire_time) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index fbf7adf743f3..07ad3c6c6865 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -97,7 +97,7 @@ else animate_movement = NO_STEPS . = ..() -/obj/item/projectile/CanPass() +/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return TRUE /obj/item/projectile/damage_flags() @@ -315,9 +315,6 @@ SHOULD_CALL_PARENT(FALSE) return -/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return 1 - /obj/item/projectile/proc/before_move() return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a39da55a863c..615e68c3be99 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -30,6 +30,8 @@ var/image/contents_overlay = get_reagents_overlay(use_single_icon ? icon_state : null) if(contents_overlay) add_overlay(contents_overlay) + if(detail_state) + add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) /obj/item/chems/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) var/image/reagents_overlay = get_reagents_overlay(overlay.icon_state) @@ -50,11 +52,6 @@ return TRUE return FALSE -/obj/item/chems/on_update_icon() - . = ..() - if(detail_state) - add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) - /obj/item/chems/update_name() . = ..() // handles material, etc var/newname = name diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 06147c369b40..0098dd2a9b81 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -37,9 +37,6 @@ reagent_volumes[T] = volume var/decl/material/R = T reagent_names += initial(R.name) - -/obj/item/chems/borghypo/Initialize() - . = ..() START_PROCESSING(SSobj, src) /obj/item/chems/borghypo/Destroy() diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 1dc986fb81be..386ad49b09a5 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -39,23 +39,6 @@ var/global/const/DRINK_ICON_NOISY = "noise" if(obj_flags & OBJ_FLAG_HOLLOW) . /= HOLLOW_OBJECT_MATTER_MULTIPLIER -/obj/item/chems/drinks/glass2/examine(mob/M) - . = ..() - - for(var/I in extras) - if(istype(I, /obj/item/glass_extra)) - to_chat(M, "There is \a [I] in \the [src].") - else if(istype(I, /obj/item/food/processed_grown/slice)) - to_chat(M, "There is \a [I] on the rim.") - else - to_chat(M, "There is \a [I] somewhere on the glass. Somehow.") - - if(has_ice()) - to_chat(M, "There is some ice floating in the drink.") - - if(has_fizz()) - to_chat(M, "It is fizzing slightly.") - /obj/item/chems/drinks/glass2/proc/has_ice() if(LAZYLEN(reagents.reagent_volumes)) var/decl/material/R = reagents.get_primary_reagent_decl() @@ -113,7 +96,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" /obj/item/chems/drinks/glass2/examine(mob/user, distance) . = ..() - if(!istype(user) || distance > 1) + if(!istype(user)) return var/list/extra_text for(var/extra in extras) @@ -122,8 +105,14 @@ var/global/const/DRINK_ICON_NOISY = "noise" LAZYADD(extra_text, GE.glass_desc) else if(istype(extra, /obj/item/food/processed_grown/slice)) LAZYADD(extra_text, "There is \a [extra] on the rim.") + else + to_chat(user, "There is \a [extra] somewhere on the glass. Somehow.") if(length(extra_text)) to_chat(user, SPAN_NOTICE(jointext(extra_text," "))) + if(has_ice()) + to_chat(user, "There is some ice floating in the drink.") + if(has_fizz()) + to_chat(user, "It is fizzing slightly.") /obj/item/chems/drinks/glass2/proc/get_filling_overlay(amount, overlay) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index af8367645f71..be5659ebba4e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -185,6 +185,7 @@ . = ..() if(label_text) update_name() + update_icon() /obj/item/chems/hypospray/autoinjector/populate_reagents() SHOULD_CALL_PARENT(TRUE) @@ -192,10 +193,6 @@ if(reagents?.total_volume > 0 && autolabel && !label_text) // don't override preset labels label_text = "[reagents.get_primary_reagent_name()], [reagents.total_volume]u" -/obj/item/chems/hypospray/autoinjector/Initialize() - . = ..() - update_icon() - /obj/item/chems/hypospray/autoinjector/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(.) diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 0ac71ec22783..86f037fd0f88 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -57,6 +57,7 @@ /obj/item/anodevice/Destroy() inserted_battery = null + STOP_PROCESSING(SSobj, src) . = ..() /obj/item/anodevice/attackby(var/obj/I, var/mob/user) @@ -188,10 +189,6 @@ else icon_state = "anodev_empty" -/obj/item/anodevice/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - /obj/item/anodevice/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if (!istype(target)) return ..() From 762711c04c4404b7364c19ecab15be8ec91c5428 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:41:53 -0500 Subject: [PATCH 52/82] Condense assembly and timer side-overrides into definitions --- code/modules/assembly/assembly.dm | 70 ++++++++++-------------------- code/modules/assembly/holder.dm | 52 ++++++++++------------ code/modules/assembly/proximity.dm | 35 +++++++-------- code/modules/assembly/timer.dm | 5 +-- 4 files changed, 61 insertions(+), 101 deletions(-) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index e583f5664cec..a4cf742c410f 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -35,53 +35,49 @@ /// What the device does when turned on /obj/item/assembly/proc/activate() - return - -/// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs -/obj/item/assembly/proc/pulsed(var/radio = 0) - return - -/// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct -/obj/item/assembly/proc/pulse_device(var/radio = 0) - return + if(!secured || (cooldown > 0)) return 0 + cooldown = 2 + spawn(10) + process_cooldown() + return 1 /// Code that has to happen when the assembly is un\secured goes here /obj/item/assembly/proc/toggle_secure() - return + secured = !secured + update_icon() + return secured /// Called when an assembly is attacked by another -/obj/item/assembly/proc/attach_assembly(var/obj/A, var/mob/user) - return - -/// Called via spawn(10) to have it count down the cooldown var -/obj/item/assembly/proc/process_cooldown() - return +/obj/item/assembly/proc/attach_assembly(var/obj/item/A, var/mob/user) + holder = new/obj/item/assembly_holder(get_turf(src)) + if(holder.attach(A,src,user)) + to_chat(user, "You attach \the [A] to \the [src]!") + return 1 + return 0 /// Called when the holder is moved /obj/item/assembly/proc/holder_movement() return -/// Called when attack_self is called -/obj/item/assembly/interact(mob/user) - return - -/obj/item/assembly/process_cooldown() +/// Called via spawn(10) to have it count down the cooldown var +/// This is really bad. Please just make it process... +/obj/item/assembly/proc/process_cooldown() cooldown-- if(cooldown <= 0) return 0 spawn(10) process_cooldown() return 1 - -/obj/item/assembly/pulsed(var/radio = 0) +/// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs +/obj/item/assembly/proc/pulsed(var/radio = 0) if(holder && (wires & WIRE_RECEIVE)) activate() if(radio && (wires & WIRE_RADIO_RECEIVE)) activate() return 1 - -/obj/item/assembly/pulse_device(var/radio = 0) +/// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct +/obj/item/assembly/proc/pulse_device(var/radio = 0) if(holder && (wires & WIRE_PULSE)) holder.process_activation(src, 1, 0) if(holder && (wires & WIRE_PULSE_SPECIAL)) @@ -90,29 +86,6 @@ //Not sure what goes here quite yet send signal? return 1 - -/obj/item/assembly/activate() - if(!secured || (cooldown > 0)) return 0 - cooldown = 2 - spawn(10) - process_cooldown() - return 1 - - -/obj/item/assembly/toggle_secure() - secured = !secured - update_icon() - return secured - - -/obj/item/assembly/attach_assembly(var/obj/item/assembly/A, var/mob/user) - holder = new/obj/item/assembly_holder(get_turf(src)) - if(holder.attach(A,src,user)) - to_chat(user, "You attach \the [A] to \the [src]!") - return 1 - return 0 - - /obj/item/assembly/attackby(obj/item/component, mob/user) if(!user_can_attack_with(user) || !component.user_can_attack_with(user)) return TRUE @@ -152,6 +125,7 @@ interact(user) return TRUE +/// Called when attack_self is called /obj/item/assembly/interact(mob/user) return //HTML MENU FOR WIRES GOES HERE diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index c4ef0fcdbfa7..dba32a26eb25 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -36,20 +36,11 @@ special_assembly = null return ..() -/obj/item/assembly_holder/proc/attach(var/obj/item/left, var/obj/item/right, var/mob/user) - return - -/obj/item/assembly_holder/proc/process_activation(var/atom/activator) - return - -/obj/item/assembly_holder/proc/detached() - return - -/obj/item/assembly_holder/attach(var/obj/item/assembly/left, var/obj/item/assembly/right, var/mob/user) - if((!left)||(!right)) - return 0 - if((!istype(left))||(!istype(right))) +/obj/item/assembly_holder/proc/attach(var/obj/item/left_item, var/obj/item/right_item, var/mob/user) + if(!istype(left_item) || !istype(right_item)) return 0 + var/obj/item/assembly/left = left_item + var/obj/item/assembly/right = right_item if((left.secured)||(right.secured)) return 0 if(user) @@ -67,6 +58,24 @@ return 1 +/obj/item/assembly_holder/proc/process_activation(var/atom/activator, var/normal = 1, var/special = 1) + if(!activator) return 0 + if(!secured) + visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") + if((normal) && (a_right) && (a_left)) + if(a_right != activator) + a_right.pulsed(0) + if(a_left != activator) + a_left.pulsed(0) + if(master) + master.receive_signal() +// if(special && special_assembly) +// if(!special_assembly == activator) +// special_assembly.dothings() + return 1 + +/obj/item/assembly_holder/proc/detached() + return /obj/item/assembly_holder/HasProximity(atom/movable/AM) . = ..() @@ -154,23 +163,6 @@ qdel(src) return - -/obj/item/assembly_holder/process_activation(var/atom/activator, var/normal = 1, var/special = 1) - if(!activator) return 0 - if(!secured) - visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") - if((normal) && (a_right) && (a_left)) - if(a_right != activator) - a_right.pulsed(0) - if(a_left != activator) - a_left.pulsed(0) - if(master) - master.receive_signal() -// if(special && special_assembly) -// if(!special_assembly == activator) -// special_assembly.dothings() - return 1 - /obj/item/assembly_holder/hear_talk(mob/living/M, msg, verb, decl/language/speaking) if(a_right) a_right.hear_talk(M,msg,verb,speaking) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index aee7624c0f7a..a451bcffec1e 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -20,7 +20,23 @@ var/range = 2 /obj/item/assembly/prox_sensor/proc/toggle_scan() + if(!secured) return 0 + scanning = !scanning + update_icon() + return + /obj/item/assembly/prox_sensor/proc/sense() + var/turf/mainloc = get_turf(src) +// if(scanning && cooldown <= 0) +// mainloc.visible_message("[html_icon(src)] *boop* *boop*", "*boop* *boop*") + if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 + pulse_device(0) + if(!holder) + mainloc.visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") + cooldown = 2 + spawn(10) + process_cooldown() + return /obj/item/assembly/prox_sensor/activate() @@ -46,19 +62,6 @@ if(. && !istype(AM, /obj/effect/ir_beam) && AM.move_speed < 12) sense() -/obj/item/assembly/prox_sensor/sense() - var/turf/mainloc = get_turf(src) -// if(scanning && cooldown <= 0) -// mainloc.visible_message("[html_icon(src)] *boop* *boop*", "*boop* *boop*") - if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 - pulse_device(0) - if(!holder) - mainloc.visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - /obj/item/assembly/prox_sensor/Process() if(scanning) @@ -80,12 +83,6 @@ . = ..() addtimer(CALLBACK(src, PROC_REF(sense)), 0) -/obj/item/assembly/prox_sensor/toggle_scan() - if(!secured) return 0 - scanning = !scanning - update_icon() - return - /obj/item/assembly/prox_sensor/on_update_icon() . = ..() diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index aeb57facd843..bac9d7ec0796 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -16,9 +16,6 @@ var/timing = 0 var/time = 10 -/obj/item/assembly/timer/proc/timer_end() - - /obj/item/assembly/timer/activate() if(!..()) return 0//Cooldown check @@ -39,7 +36,7 @@ return secured -/obj/item/assembly/timer/timer_end() +/obj/item/assembly/timer/proc/timer_end() if(!secured) return 0 pulse_device(0) if(!holder) From 4f98b9ced282a8ecff11227e5538b8321d9f2bfa Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:42:23 -0500 Subject: [PATCH 53/82] Make smokable extinguishing code more consistent --- code/modules/clothing/masks/smokable.dm | 45 +++++++++---------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 9d5c9cf1a9f6..3612df6f7183 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -158,6 +158,19 @@ STOP_PROCESSING(SSobj, src) set_light(0) update_icon() + remove_extension(src, /datum/extension/scent) + if (type_butt) + var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) + transfer_fingerprints_to(butt) + if(istype(butt) && butt.use_color) + butt.color = color + if(brand) + butt.desc += " This one is a [brand]." + if(ismob(loc)) + var/mob/living/M = loc + if (!no_message) + to_chat(M, SPAN_NOTICE("Your [name] goes out.")) + qdel(src) /obj/item/clothing/mask/smokable/attackby(var/obj/item/W, var/mob/user) if(W.isflamesource() || W.get_heat() >= T100C) @@ -221,22 +234,6 @@ if(is_processing) set_scent_by_reagents(src) -/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) - ..() - remove_extension(src, /datum/extension/scent) - if (type_butt) - var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) - transfer_fingerprints_to(butt) - if(istype(butt) && butt.use_color) - butt.color = color - if(brand) - butt.desc += " This one is a [brand]." - if(ismob(loc)) - var/mob/living/M = loc - if (!no_message) - to_chat(M, SPAN_NOTICE("Your [name] goes out.")) - qdel(src) - /obj/item/clothing/mask/smokable/cigarette/menthol name = "menthol cigarette" desc = "A cigarette with a little minty kick. Well, minty in theory." @@ -530,22 +527,10 @@ set_scent_by_reagents(src) update_icon() -/obj/item/clothing/mask/smokable/pipe/extinguish_fire(mob/user, no_message) - ..() - new /obj/effect/decal/cleanable/ash(get_turf(src)) - if(ismob(loc)) - var/mob/living/M = loc - if (!no_message) - to_chat(M, SPAN_NOTICE("Your [name] goes out, and you empty the ash.")) - remove_extension(src, /datum/extension/scent) - /obj/item/clothing/mask/smokable/pipe/attack_self(var/mob/user) - if(lit == 1) + if(lit) user.visible_message(SPAN_NOTICE("[user] puts out [src]."), SPAN_NOTICE("You put out [src].")) - lit = FALSE - update_icon() - STOP_PROCESSING(SSobj, src) - remove_extension(src, /datum/extension/scent) + extinguish_fire(user, no_message = TRUE) else if (smoketime) var/turf/location = get_turf(user) user.visible_message(SPAN_NOTICE("[user] empties out [src]."), SPAN_NOTICE("You empty out [src].")) From 3a5aaf766f43cf7128d9499799a5245f9cc881d8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:43:51 -0500 Subject: [PATCH 54/82] Condense clothing OnDisguise overrides --- code/modules/clothing/_clothing_accessories.dm | 4 +++- code/modules/clothing/chameleon.dm | 11 ----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/code/modules/clothing/_clothing_accessories.dm b/code/modules/clothing/_clothing_accessories.dm index 81e9d41a80aa..0469f605d014 100644 --- a/code/modules/clothing/_clothing_accessories.dm +++ b/code/modules/clothing/_clothing_accessories.dm @@ -216,7 +216,8 @@ accessory_visibility = clothes.accessory_visibility accessory_slowdown = clothes.accessory_slowdown mimicking_state_modifiers = TRUE - clothing_state_modifiers = clothes.clothing_state_modifiers?.Copy() + clothing_state_modifiers = clothes.clothing_state_modifiers?.Copy() + bodytype_equip_flags = clothes.bodytype_equip_flags else accessory_hide_on_states = get_initial_accessory_hide_on_states() accessory_slot = initial(accessory_slot) @@ -225,5 +226,6 @@ accessory_slowdown = initial(accessory_slowdown) mimicking_state_modifiers = FALSE clothing_state_modifiers = null + bodytype_equip_flags = initial(bodytype_equip_flags) update_clothing_state_toggles() diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 5132c8e2bc9f..4a85cb47cef1 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -22,17 +22,6 @@ flags_inv = copy.flags_inv set_gender(copy.gender) -/obj/item/clothing/OnDisguise(obj/item/copy, mob/user) - . = ..() - if(. && istype(copy, /obj/item/clothing)) - var/obj/item/clothing/clothing_copy = copy - bodytype_equip_flags = clothing_copy.bodytype_equip_flags - accessory_slot = clothing_copy.accessory_slot - accessory_removable = clothing_copy.accessory_removable - accessory_visibility = clothing_copy.accessory_visibility - accessory_slowdown = clothing_copy.accessory_slowdown - accessory_hide_on_states = clothing_copy.accessory_hide_on_states?.Copy() - /proc/generate_chameleon_choices(var/basetype) . = list() From 6e9683efb6dd3cfe74fdd4a0f86ce63fde1225eb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:44:18 -0500 Subject: [PATCH 55/82] Fix non-chest lung organ subtypes not showing ruptures on scan --- code/modules/organs/external/diagnostics.dm | 3 +++ code/modules/organs/external/standard.dm | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/code/modules/organs/external/diagnostics.dm b/code/modules/organs/external/diagnostics.dm index 2bc96bfa3fc2..973c506b9fcd 100644 --- a/code/modules/organs/external/diagnostics.dm +++ b/code/modules/organs/external/diagnostics.dm @@ -110,6 +110,9 @@ for(var/obj/item/organ/internal/augment/aug in internal_organs) if(istype(aug) && aug.known) . += "[capitalize(aug.name)] implanted" + var/obj/item/organ/internal/lungs/L = locate() in src + if( L && L.is_bruised()) + . += "Lung ruptured" /obj/item/organ/external/proc/inspect(mob/user) diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm index d3ec8d68e7f4..2beef64083b1 100644 --- a/code/modules/organs/external/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -23,12 +23,6 @@ /obj/item/organ/external/chest/proc/get_current_skin() return -/obj/item/organ/external/get_scan_results() - . = ..() - var/obj/item/organ/internal/lungs/L = locate() in src - if( L && L.is_bruised()) - . += "Lung ruptured" - /obj/item/organ/external/chest/die() //Special handling for synthetics if(BP_IS_PROSTHETIC(src) || BP_IS_CRYSTAL(src)) From 4bdf373dfd479c00a828933ff5e510bb1d14ff2e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 11:39:14 +1100 Subject: [PATCH 56/82] Adding lantern fish and cave fish. --- .../game/objects/structures/barrels/barrel.dm | 2 +- code/game/objects/structures/barrels/cask.dm | 2 +- code/modules/butchery/butchery_data_fish.dm | 3 ++ .../butchery/butchery_products_meat_fish.dm | 11 ++++++++ .../hydroponics/plant_types/seeds_misc.dm | 12 ++++---- code/modules/hydroponics/seed_packets.dm | 2 +- .../simple_animal/aquatic/aquatic_fish.dm | 14 ++++++++++ code/modules/organs/internal/_internal.dm | 2 +- code/modules/organs/internal/brain.dm | 4 +-- .../modules/reagents/chems/chems_nutriment.dm | 13 --------- code/modules/reagents/chems/chems_oil.dm | 28 +++++++++++++++++++ .../reactions/reaction_recipe_food.dm | 2 +- .../reagents/reactions/reaction_synthesis.dm | 2 +- maps/shaded_hills/areas/grassland.dm | 10 +++++++ maps/shaded_hills/shaded_hills_map.dm | 2 +- nebula.dme | 1 + 16 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 code/modules/reagents/chems/chems_oil.dm diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 2f92b82e1636..4b7f0d2e87c4 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -110,4 +110,4 @@ /obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm index 20acd0490234..8a704ad55cf7 100644 --- a/code/game/objects/structures/barrels/cask.dm +++ b/code/game/objects/structures/barrels/cask.dm @@ -39,4 +39,4 @@ /obj/structure/reagent_dispensers/barrel/cask/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) diff --git a/code/modules/butchery/butchery_data_fish.dm b/code/modules/butchery/butchery_data_fish.dm index 1facebe1a93a..f7f37c31878f 100644 --- a/code/modules/butchery/butchery_data_fish.dm +++ b/code/modules/butchery/butchery_data_fish.dm @@ -11,6 +11,9 @@ gut_type = /obj/item/food/butchery/offal/small meat_flags = ALLERGEN_FISH +/decl/butchery_data/animal/fish/oily + meat_type = /obj/item/food/butchery/meat/fish/oily + /decl/butchery_data/animal/fish/small bone_amount = 1 skin_amount = 2 diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index f1e06223d09a..8361c4af74cf 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -16,6 +16,17 @@ slice_num = 3 butchery_data = /decl/butchery_data/animal/fish allergen_flags = ALLERGEN_FISH + var/oil_type = /decl/material/liquid/nutriment/oil/fish + var/oil_amount = 2 + +/obj/item/food/butchery/meat/fish/oily + nutriment_amt = 4 + oil_amount = 4 + +/obj/item/food/butchery/meat/fish/populate_reagents() + . = ..() + if(oil_type && oil_amount > 0) + add_to_reagents(oil_type, oil_amount) /obj/item/food/butchery/meat/fish/get_meat_icons() var/static/list/meat_icons = list( diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index b44099d34122..db5d4739d6d9 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -4,7 +4,7 @@ display_name = "cotton patch" product_material = /decl/material/solid/organic/plantmatter/pith/husk chems = list( - /decl/material/liquid/nutriment/plant_oil = list(3,10), + /decl/material/liquid/nutriment/oil/plant = list(3,10), /decl/material/solid/organic/cloth = list(10,1) ) slice_product = null @@ -28,7 +28,7 @@ display_name = "flax patch" // Do we want linseed oil at some point? chems = list( - /decl/material/liquid/nutriment/plant_oil = list(5,12), + /decl/material/liquid/nutriment/oil/plant = list(5,12), /decl/material/solid/organic/cloth/linen = list(8,1) ) @@ -400,7 +400,7 @@ display_name = "hemp patch" mutants = null chems = list( - /decl/material/liquid/nutriment/plant_oil = list(3,10), + /decl/material/liquid/nutriment/oil/plant = list(3,10), /decl/material/solid/organic/cloth/hemp = list(8,1), /decl/material/liquid/nutriment = list(1) ) @@ -725,7 +725,7 @@ product_name = "sunflower" display_name = "sunflower patch" chems = list( - /decl/material/liquid/nutriment/plant_oil = list(10,10) + /decl/material/liquid/nutriment/oil/plant = list(10,10) ) /datum/seed/flower/sunflower/New() @@ -800,7 +800,7 @@ display_name = "peanut vine" chems = list( /decl/material/liquid/nutriment = list(1,10), - /decl/material/liquid/nutriment/plant_oil = list(1,10) + /decl/material/liquid/nutriment/oil/plant = list(1,10) ) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -987,7 +987,7 @@ display_name = "soybean patch" chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/nutriment/plant_oil = list(3,20), + /decl/material/liquid/nutriment/oil/plant = list(3,20), /decl/material/liquid/drink/milk/soymilk = list(7,20) ) grown_tag = "soybeans" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index aca1014088d5..d9033c86f84a 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -26,7 +26,7 @@ /obj/item/seeds/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, 3) + add_to_reagents(/decl/material/liquid/nutriment/oil/plant, 3) /obj/item/seeds/get_single_monetary_worth() . = seed ? seed.get_monetary_value() : ..() diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index 7b8f5b5f1782..7de69b839449 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -16,6 +16,20 @@ name = "small fish" icon = 'icons/mob/simple_animal/fish_grump.dmi' +/mob/living/simple_animal/aquatic/fish/lantern + name = "lantern-fish" + desc = "An oily, glowing fish sometimes caught in cave rivers, rumoured to have cousins in the deep ocean." + // TODO: icon = 'icons/mob/simple_animal/fish_lantern.dmi' + butchery_data = /decl/butchery_data/animal/fish/oily + +/mob/living/simple_animal/aquatic/fish/cave + name = "blind cave fish" + desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." + // TODO: icon = 'icons/mob/simple_animal/fish_cave.dmi' + +/mob/living/simple_animal/aquatic/fish/cave/is_blind() + return TRUE + /mob/living/simple_animal/aquatic/fish/large name = "smallmouth bass" icon = 'icons/mob/simple_animal/fish_judge.dmi' diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index ac00fcf30e58..e8e076a057c6 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -171,7 +171,7 @@ // We clamp/round here so that we don't accidentally heal past the threshold and // cheat our way into a full second threshold of healing. - damage = clamp(damage-get_organ_heal_amount(), min_heal_val, absolute_max_damage) + damage = clamp(damage - max(0, get_organ_heal_amount() * GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)), min_heal_val, absolute_max_damage) // If we're within 1 damage of the nearest threshold (such as 0), round us down. // This should be removed when float-aware modulo comes in in 515, but for now is needed diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 32a4b6e1c2de..a26e424aba86 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -99,10 +99,10 @@ alert(owner, "You have taken massive brain damage! You will not be able to remember the events leading up to your injury.", "Brain Damaged") /obj/item/organ/internal/brain/organ_can_heal() - return (damage && owner && GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)) || ..() + return (damage && owner && GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) > 0) || ..() /obj/item/organ/internal/brain/has_limited_healing() - return (!owner || !GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)) && ..() + return (!owner || GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) <= 0) && ..() /obj/item/organ/internal/brain/get_organ_heal_amount() return 1 diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 3ac879172e79..3b5567d3f362 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -62,19 +62,6 @@ uid = "chem_nutriment_plant" allergen_flags = ALLERGEN_VEGETABLE -/decl/material/liquid/nutriment/plant_oil - name = "plant oil" - lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." - uid = "chem_nutriment_plant_oil" - melting_point = 273 - boiling_point = 373 - taste_description = "oily blandness" - burn_product = /decl/material/gas/carbon_monoxide - ignition_point = T0C+150 - accelerant_value = FUEL_VALUE_ACCELERANT - gas_flags = XGM_GAS_FUEL - allergen_flags = ALLERGEN_VEGETABLE - /decl/material/liquid/nutriment/honey name = "honey" lore_text = "A golden yellow syrup, loaded with sugary sweetness." diff --git a/code/modules/reagents/chems/chems_oil.dm b/code/modules/reagents/chems/chems_oil.dm new file mode 100644 index 000000000000..5395daacc11c --- /dev/null +++ b/code/modules/reagents/chems/chems_oil.dm @@ -0,0 +1,28 @@ +/decl/material/liquid/nutriment/oil + abstract_type = /decl/material/liquid/nutriment/oil + burn_product = /decl/material/gas/carbon_monoxide + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT + gas_flags = XGM_GAS_FUEL + melting_point = 273 + boiling_point = 373 + +/decl/material/liquid/nutriment/oil/plant + name = "plant oil" + lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." + uid = "chem_nutriment_plant_oil" + taste_description = "oily blandness" + allergen_flags = ALLERGEN_VEGETABLE + +/decl/material/liquid/nutriment/oil/fish + name = "fish oil" + lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." + uid = "chem_nutriment_fish_oil" + taste_description = "pungent, oily fish" + allergen_flags = ALLERGEN_FISH + +// Copied from neuroannealer; yes, it's silly, but we need a way to treat brain damage on the medieval map. +// Should possibly be an ingredient rather than the be-all end-all medication. +/decl/material/liquid/nutriment/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + M.add_chemical_effect(CE_BRAIN_REGEN, 0.5) // Half as effective as neuroannealer, without the side-effects. diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index 0900c6d5c2e6..ef99755711d6 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -58,7 +58,7 @@ name = "Enzyme Margarine" required_reagents = list( /decl/material/solid/sodiumchloride = 1, - /decl/material/liquid/nutriment/plant_oil = 20 + /decl/material/liquid/nutriment/oil/plant = 20 ) catalysts = list(/decl/material/liquid/enzyme = 5) mix_message = "The solution thickens and curdles into a pale yellow solid." diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index c70444faff81..d12783c8f7ad 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -130,7 +130,7 @@ required_reagents = list( /decl/material/solid/carbon/ashes = 5, /decl/material/liquid/water = 5, - /decl/material/liquid/nutriment/plant_oil = 10 + /decl/material/liquid/nutriment/oil/plant = 10 ) result_amount = 1 mix_message = "The solution thickens and solidifies." diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 46c253326445..3fa264b43926 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -53,6 +53,16 @@ area_blurb_category = /area/shaded_hills/caves sound_env = CAVE area_flags = AREA_FLAG_IS_BACKGROUND + fishing_results = list( + /mob/living/simple_animal/aquatic/fish/cave = 13 + /mob/living/simple_animal/aquatic/fish/lantern = 7 + /obj/item/mollusc = 5, + /obj/item/mollusc/barnacle/fished = 5, + /obj/item/mollusc/clam/fished/pearl = 3, + /obj/item/trash/mollusc_shell/clam = 1, + /obj/item/trash/mollusc_shell/barnacle = 1, + /obj/item/trash/mollusc_shell = 1 + ) /area/shaded_hills/caves/deep name = "\improper Deep Caverns" diff --git a/maps/shaded_hills/shaded_hills_map.dm b/maps/shaded_hills/shaded_hills_map.dm index 5e3cda3b8bc6..0b545c07a61c 100644 --- a/maps/shaded_hills/shaded_hills_map.dm +++ b/maps/shaded_hills/shaded_hills_map.dm @@ -1,5 +1,5 @@ /datum/map/shaded_hills - default_liquid_fuel_type = /decl/material/liquid/nutriment/plant_oil + default_liquid_fuel_type = /decl/material/liquid/nutriment/oil/plant default_species = SPECIES_KOBALOI loadout_categories = list( /decl/loadout_category/fantasy/clothing, diff --git a/nebula.dme b/nebula.dme index c08cae0b5a94..dcafae477c0b 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3605,6 +3605,7 @@ #include "code\modules\reagents\chems\chems_herbal.dm" #include "code\modules\reagents\chems\chems_medicines.dm" #include "code\modules\reagents\chems\chems_nutriment.dm" +#include "code\modules\reagents\chems\chems_oil.dm" #include "code\modules\reagents\chems\chems_painkillers.dm" #include "code\modules\reagents\chems\chems_pigments.dm" #include "code\modules\reagents\chems\chems_poisons.dm" From 3863d0886a65a602734e1cbadf56684b0634edb3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:10:50 -0500 Subject: [PATCH 57/82] Move oldpod ruin into corporate modpack --- mods/content/corporate/_corporate.dme | 1 + .../corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dm | 3 +-- .../corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm | 0 nebula.dme | 1 - 4 files changed, 2 insertions(+), 3 deletions(-) rename {maps => mods/content/corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dm (87%) rename {maps => mods/content/corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm (100%) diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 3a62ba3a912c..5a30646d2641 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -43,6 +43,7 @@ #include "items\stamps.dm" #include "items\wristcomp.dm" #include "machines\machines.dm" +#include "random_ruins\exoplanet_ruins\oldpod\oldpod.dm" #include "structures\lockers.dm" // END_INCLUDE #endif diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm similarity index 87% rename from maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm rename to mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm index 0ea139fdbc79..4175cd8f17c1 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm +++ b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm @@ -1,8 +1,7 @@ -#include "../../../../mods/content/corporate/_corporate.dme" - /datum/map_template/ruin/exoplanet/oldpod name = "old pod" description = "A now unused, crashed escape pod." + prefix = "mods/content/corporate/random_ruins/exoplanet_ruins/" suffixes = list("oldpod/oldpod.dmm") cost = 0.5 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm similarity index 100% rename from maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm rename to mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm diff --git a/nebula.dme b/nebula.dme index 3547855884ae..85539f1a37f4 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4129,7 +4129,6 @@ #include "maps\random_ruins\exoplanet_ruins\marooned\marooned.dm" #include "maps\random_ruins\exoplanet_ruins\monoliths\monoliths.dm" #include "maps\random_ruins\exoplanet_ruins\oasis\oasis.dm" -#include "maps\random_ruins\exoplanet_ruins\oldpod\oldpod.dm" #include "maps\random_ruins\exoplanet_ruins\radshrine\radshrine.dm" #include "maps\random_ruins\exoplanet_ruins\spider_nest\spider_nest.dm" #include "maps\random_ruins\exoplanet_ruins\tar_anomaly\tar_anomaly.dm" From d5bee9b4dea38890490664fbf6b020bca9b3cf42 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:33:03 -0500 Subject: [PATCH 58/82] Make the game compile without the corporate modpack included --- .../objects/items/devices/radio/headsets_shared.dm | 12 ++++++++++++ code/game/objects/random/subtypes/maintenance.dm | 5 ----- .../crates_lockers/closets/secure/scientist.dm | 4 +++- maps/example/example_unit_testing.dm | 8 ++++++++ maps/ministation/ministation_define.dm | 2 -- maps/ministation/ministation_overrides.dm | 4 ++++ mods/content/corporate/_corporate.dme | 1 + mods/content/corporate/datum/antagonists/commando.dm | 12 ------------ mods/content/corporate/items/random.dm | 10 ++++++++++ mods/content/corporate/structures/lockers.dm | 3 +++ 10 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 mods/content/corporate/items/random.dm diff --git a/code/game/objects/items/devices/radio/headsets_shared.dm b/code/game/objects/items/devices/radio/headsets_shared.dm index c591cb4a83ac..6c5551ea9839 100644 --- a/code/game/objects/items/devices/radio/headsets_shared.dm +++ b/code/game/objects/items/devices/radio/headsets_shared.dm @@ -221,6 +221,18 @@ encryption_keys = list(/obj/item/encryptionkey/raider) analog_secured = list((access_raider) = TRUE) +/obj/item/encryptionkey/hacked + can_decrypt = list(access_hacked) + origin_tech = @'{"esoteric":3}' + +/obj/item/encryptionkey/hacked/Initialize(ml, material_key) + . = ..() + can_decrypt |= get_all_station_access() + +/obj/item/radio/headset/hacked + origin_tech = @'{"esoteric":3}' + encryption_keys = list(/obj/item/encryptionkey/hacked) + // Bowman alts /obj/item/radio/headset/headset_mining/bowman name = "mining bowman radio headset" diff --git a/code/game/objects/random/subtypes/maintenance.dm b/code/game/objects/random/subtypes/maintenance.dm index 0df746fd50a8..b141867e7e15 100644 --- a/code/game/objects/random/subtypes/maintenance.dm +++ b/code/game/objects/random/subtypes/maintenance.dm @@ -209,14 +209,10 @@ something, make sure it's not in one of the other lists.*/ var/static/list/spawnable_choices = list( /obj/random/maintenance/clean = 320, /obj/item/clothing/head/soft/sec = 4, - /obj/item/clothing/head/soft/sec/corp = 4, /obj/item/backpack/security = 3, /obj/item/backpack/satchel/sec = 3, /obj/item/clothing/shoes/jackboots = 3, /obj/item/clothing/suit/armor/vest = 3, - /obj/item/clothing/head/beret/corp/sec = 3, - /obj/item/clothing/head/beret/corp/sec/corporate/hos = 3, - /obj/item/clothing/head/beret/corp/sec/navy/officer = 3, /obj/item/flashlight/maglight = 2, /obj/item/flash = 2, /obj/item/clothing/mask/balaclava = 2, @@ -226,7 +222,6 @@ something, make sure it's not in one of the other lists.*/ /obj/item/belt/security = 2, /obj/item/clothing/glasses/hud/security = 2, /obj/item/clothing/head/helmet = 2, - /obj/item/clothing/suit/armor/vest/security = 2, /obj/item/clothing/webbing/drop_pouches/black = 2, /obj/item/clothing/head/earmuffs = 2, /obj/item/handcuffs = 2, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 710f7d92d059..806048ba7a13 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -64,12 +64,14 @@ /obj/structure/closet/secure_closet/pilot name = "pilot locker" req_access = list(access_xenobiology) + /// The jumpsuit type spawned for this locker. Exists to be overridden by the corporate modpack, which adds pilot jumpsuits. + var/jumpsuit_type = /obj/item/clothing/jumpsuit/white /obj/structure/closet/secure_closet/pilot/WillContain() return list( /obj/item/backpack/parachute, /obj/item/knife/utility, - /obj/item/clothing/jumpsuit/pilot, + jumpsuit_type, /obj/item/clothing/suit/jacket/bomber, /obj/item/clothing/mask/gas/half, /obj/item/clothing/shoes/color/black, diff --git a/maps/example/example_unit_testing.dm b/maps/example/example_unit_testing.dm index 6c4c9380ab32..df857c78a41c 100644 --- a/maps/example/example_unit_testing.dm +++ b/maps/example/example_unit_testing.dm @@ -9,3 +9,11 @@ /obj/abstract/map_data/example height = 3 + +// Enforce that this map must not have any modpacks, to ensure core code compiles on its own. +// I'd do this in setup_map on the example map datum but that happens before modpack init. +// This catches any modpacks accidentally included by core code, default away sites, space/planet ruin maps, etc. +/datum/controller/subsystem/modpacks/Initialize() + . = ..() + if(length(loaded_modpacks)) + CRASH("Example map had the following modpacks loaded: [json_encode(loaded_modpacks)]") \ No newline at end of file diff --git a/maps/ministation/ministation_define.dm b/maps/ministation/ministation_define.dm index d415969ed0be..b47a6b470241 100644 --- a/maps/ministation/ministation_define.dm +++ b/maps/ministation/ministation_define.dm @@ -13,8 +13,6 @@ company_name = "Tradehouse Administration" company_short = "Admin" - default_law_type = /datum/ai_laws/nanotrasen - lobby_screens = list('maps/ministation/ministation_lobby.png') overmap_ids = list(OVERMAP_ID_SPACE) diff --git a/maps/ministation/ministation_overrides.dm b/maps/ministation/ministation_overrides.dm index 508fbdaab311..709065f74aa6 100644 --- a/maps/ministation/ministation_overrides.dm +++ b/maps/ministation/ministation_overrides.dm @@ -8,3 +8,7 @@ /datum/computer_file/program/wordprocessor, /datum/computer_file/program/supply ) + +// This has to be here rather than ministation_define.dm because it's from a modpack. +/datum/map/ministation + default_law_type = /datum/ai_laws/nanotrasen \ No newline at end of file diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 5a30646d2641..75a782ae63c0 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -40,6 +40,7 @@ #include "items\cups.dm" #include "items\documents.dm" #include "items\medals.dm" +#include "items\random.dm" #include "items\stamps.dm" #include "items\wristcomp.dm" #include "machines\machines.dm" diff --git a/mods/content/corporate/datum/antagonists/commando.dm b/mods/content/corporate/datum/antagonists/commando.dm index f36ce0697862..3aac5874e4b6 100644 --- a/mods/content/corporate/datum/antagonists/commando.dm +++ b/mods/content/corporate/datum/antagonists/commando.dm @@ -26,15 +26,3 @@ /obj/item/gun/energy/laser, /obj/item/energy_blade/sword ) - -/obj/item/encryptionkey/hacked - can_decrypt = list(access_hacked) - origin_tech = @'{"esoteric":3}' - -/obj/item/encryptionkey/hacked/Initialize(ml, material_key) - . = ..() - can_decrypt |= get_all_station_access() - -/obj/item/radio/headset/hacked - origin_tech = @'{"esoteric":3}' - encryption_keys = list(/obj/item/encryptionkey/hacked) diff --git a/mods/content/corporate/items/random.dm b/mods/content/corporate/items/random.dm new file mode 100644 index 000000000000..54dde92f9ce0 --- /dev/null +++ b/mods/content/corporate/items/random.dm @@ -0,0 +1,10 @@ +/obj/random/maintenance/security/spawn_choices() + var/static/injected = FALSE + . = ..() + if(!injected) + .[/obj/item/clothing/head/soft/sec/corp] = 4 + .[/obj/item/clothing/head/beret/corp/sec] = 3 + .[/obj/item/clothing/head/beret/corp/sec/corporate/hos] = 3 + .[/obj/item/clothing/head/beret/corp/sec/navy/officer] = 3 + .[/obj/item/clothing/suit/armor/vest/security] = 2 + injected = TRUE \ No newline at end of file diff --git a/mods/content/corporate/structures/lockers.dm b/mods/content/corporate/structures/lockers.dm index 33c3cbf1eabe..5116f72e02ce 100644 --- a/mods/content/corporate/structures/lockers.dm +++ b/mods/content/corporate/structures/lockers.dm @@ -51,3 +51,6 @@ /obj/structure/closet/secure_closet/hop/WillContain() . = ..() + /obj/item/clothing/suit/armor/vest/nt + +/obj/structure/closet/secure_closet/pilot + jumpsuit_type = /obj/item/clothing/jumpsuit/pilot \ No newline at end of file From c97f7bcd82bd82fc4e5d94bf115bba5681ed13c3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:39:54 -0500 Subject: [PATCH 59/82] Fix mispathed proc overrides --- .../admin/secrets/fun_secrets/waddle.dm | 2 +- code/modules/augment/passive/boost/shooting.dm | 6 +++--- .../butchery/butchery_products_meat_fish.dm | 2 +- code/modules/clothing/suits/jackets/hoodies.dm | 7 ------- code/modules/detectivework/tools/storage.dm | 6 +++--- .../planet_themes/ruined_city.dm | 2 +- .../solids/materials_solid_mineral.dm | 2 +- .../mob/living/simple_animal/hostile/leech.dm | 2 +- code/modules/overmap/ships/landable.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 4 ++-- code/modules/random_map/drop/drop_types.dm | 18 +++--------------- .../reagents/chems/random/random_effects.dm | 4 ++-- .../reagents/reagent_containers/spray.dm | 2 +- code/modules/vehicles/engine.dm | 2 +- code/modules/weather/weather_fsm_states.dm | 2 +- .../finds/find_types/weapons.dm | 4 ++-- 16 files changed, 24 insertions(+), 43 deletions(-) diff --git a/code/modules/admin/secrets/fun_secrets/waddle.dm b/code/modules/admin/secrets/fun_secrets/waddle.dm index ea7bbd588895..90c663b5a82a 100644 --- a/code/modules/admin/secrets/fun_secrets/waddle.dm +++ b/code/modules/admin/secrets/fun_secrets/waddle.dm @@ -35,7 +35,7 @@ events_repository.register(/decl/observ/moved, holder, src, PROC_REF(waddle)) events_repository.register(/decl/observ/destroyed, holder, src, PROC_REF(qdel_self)) -/datum/extension/event_registration/Destroy() +/datum/extension/waddle/Destroy() events_repository.unregister(/decl/observ/destroyed, holder, src) events_repository.unregister(/decl/observ/moved, holder, src) return ..() diff --git a/code/modules/augment/passive/boost/shooting.dm b/code/modules/augment/passive/boost/shooting.dm index 59ca29796cb7..33306ef9f56b 100644 --- a/code/modules/augment/passive/boost/shooting.dm +++ b/code/modules/augment/passive/boost/shooting.dm @@ -6,16 +6,16 @@ material = /decl/material/solid/metal/steel origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' -/obj/item/organ/internal/augment/boost/reflex/reset_matter() +/obj/item/organ/internal/augment/boost/shooting/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) -/obj/item/organ/internal/augment/boost/reflex/buff() +/obj/item/organ/internal/augment/boost/shooting/buff() if((. = ..())) to_chat(owner, SPAN_NOTICE("Notice: AIM-4 finished reboot.")) -/obj/item/organ/internal/augment/boost/reflex/debuff() +/obj/item/organ/internal/augment/boost/shooting/debuff() if((. = ..())) to_chat(owner, SPAN_WARNING("Catastrophic damage detected: AIM-4 shutting down.")) \ No newline at end of file diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index f1e06223d09a..a802907bdc6a 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -52,7 +52,7 @@ . = ..() SetName("grilled [name]") -/obj/item/food/butchery/meat/fish/get_meat_icons() +/obj/item/food/butchery/meat/fish/grilled/get_meat_icons() var/static/list/meat_icons = list( 'icons/obj/food/butchery/fish_grilled.dmi' ) diff --git a/code/modules/clothing/suits/jackets/hoodies.dm b/code/modules/clothing/suits/jackets/hoodies.dm index fcbd38712c8e..adfd915c60ac 100644 --- a/code/modules/clothing/suits/jackets/hoodies.dm +++ b/code/modules/clothing/suits/jackets/hoodies.dm @@ -18,13 +18,6 @@ desc = "A warm, black sweatshirt." color = COLOR_DARK_GRAY -/obj/item/clothing/suit/jacket/hoodie/get_assumed_clothing_state_modifiers() - var/static/list/expected_state_modifiers = list( - GET_DECL(/decl/clothing_state_modifier/buttons), - GET_DECL(/decl/clothing_state_modifier/hood) - ) - return expected_state_modifiers - /obj/item/clothing/head/hoodiehood name = "hoodie hood" desc = "A hood attached to a warm sweatshirt." diff --git a/code/modules/detectivework/tools/storage.dm b/code/modules/detectivework/tools/storage.dm index de56ab7d3dea..30e553fef614 100644 --- a/code/modules/detectivework/tools/storage.dm +++ b/code/modules/detectivework/tools/storage.dm @@ -3,7 +3,7 @@ desc = "Sterilized equipment within. Do not contaminate." icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" - + /obj/item/box/swabs/WillContain() return list(/obj/item/forensics/sample/swab = DEFAULT_BOX_STORAGE) @@ -11,7 +11,7 @@ name = "evidence bag box" desc = "A box claiming to contain evidence bags." -/obj/item/box/swabs/WillContain() +/obj/item/box/evidence/WillContain() return list(/obj/item/evidencebag = 7) /obj/item/box/fingerprints @@ -20,5 +20,5 @@ icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" -/obj/item/box/swabs/WillContain() +/obj/item/box/fingerprints/WillContain() return list(/obj/item/forensics/sample/print = DEFAULT_BOX_STORAGE) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm index b8e70d839d6e..221ee935055c 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm @@ -15,7 +15,7 @@ 'sound/ambience/ominous3.ogg' ) -/datum/exoplanet_theme/robotic_guardians/modify_template_whitelist(whitelist_flags) +/datum/exoplanet_theme/ruined_city/modify_template_whitelist(whitelist_flags) return whitelist_flags | TEMPLATE_TAG_ALIEN /datum/exoplanet_theme/ruined_city/get_map_generators(/datum/planetoid_data/E) diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 2be84c6c5df9..8302ac13a99e 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -181,7 +181,7 @@ /decl/material/solid/potassium = 1 ) -/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/solid/potash/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() var/volume = REAGENT_VOLUME(holder, type) if(volume > 3) diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index ea81aa10124a..c8f7259babca 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -17,7 +17,7 @@ /datum/mob_controller/aggressive/leech break_stuff_probability = 5 -/mob/living/simple_animal/hostile/can_pry_door() +/mob/living/simple_animal/hostile/leech/can_pry_door() return FALSE /mob/living/simple_animal/hostile/leech/exoplanet/Initialize() diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index e2d698ecdb7a..375e4253ec21 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -324,7 +324,7 @@ port_tag = new_port_tag . = ..() -/obj/abstract/local_dock/automatic/modify_mapped_vars(map_hash) +/obj/abstract/local_dock/modify_mapped_vars(map_hash) . = ..() ADJUST_TAG_VAR(port_tag, map_hash) ADJUST_TAG_VAR(dock_target, map_hash) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index e6014e8f4f70..077717829360 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -120,11 +120,11 @@ . += "Details: [record.get_medical_record()]" return jointext(., "
") -/obj/structure/filing_cabinet/records/medical +/obj/structure/filing_cabinet/records/employment name = "employment record archive" archive_name = "employment record" -/obj/structure/filing_cabinet/records/medical/collate_data(var/datum/computer_file/report/crew_record/record) +/obj/structure/filing_cabinet/records/employment/collate_data(var/datum/computer_file/report/crew_record/record) . = list() . += "Name: [record.get_name()]" . += "Gender: [record.get_gender()]" diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index d517a2170175..a9f290a0aa65 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -51,18 +51,6 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/gun/projectile/automatic/smg, /obj/item/gun/projectile/automatic/assault_rifle) -/datum/supply_drop_loot/ballistics - name = "Ballistics" - container = /obj/structure/largecrate -/datum/supply_drop_loot/ballistics/New() - ..() - contents = list( - /obj/item/gun/projectile/pistol, - /obj/item/gun/projectile/shotgun/doublebarrel, - /obj/item/gun/projectile/shotgun/pump, - /obj/item/gun/projectile/automatic/smg, - /obj/item/gun/projectile/automatic/assault_rifle) - /datum/supply_drop_loot/seeds name = "Seeds" container = /obj/structure/closet/crate @@ -158,10 +146,10 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/box/syringes, /obj/item/box/autoinjectors) -/datum/supply_drop_loot/power - name = "Power" +/datum/supply_drop_loot/materials + name = "Materials" container = /obj/structure/largecrate -/datum/supply_drop_loot/power/New() +/datum/supply_drop_loot/materials/New() ..() contents = list( /obj/item/stack/material/sheet/mapped/steel, diff --git a/code/modules/reagents/chems/random/random_effects.dm b/code/modules/reagents/chems/random/random_effects.dm index af118872c971..0ef001eb16ad 100644 --- a/code/modules/reagents/chems/random/random_effects.dm +++ b/code/modules/reagents/chems/random/random_effects.dm @@ -227,7 +227,7 @@ mode = RANDOM_CHEM_EFFECT_INT desc = "acute toxicity" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) +/decl/random_chem_effect/random_properties/tox_damage/affect_blood(var/mob/living/M, var/removed, var/value) M.take_damage(value * removed, TOX) /decl/random_chem_effect/random_properties/heal_brute @@ -243,7 +243,7 @@ maximum = 10 desc = "burn repair" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) +/decl/random_chem_effect/random_properties/heal_burns/affect_blood(var/mob/living/M, var/removed, var/value) M.heal_organ_damage(0, removed * value) #undef RANDOM_CHEM_EFFECT_TRUE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 2df686595f83..f2079ac42140 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -109,7 +109,7 @@ if(has_safety() && distance <= 1) to_chat(user, "The safety is [safety ? "on" : "off"].") -/obj/item/chems/get_alt_interactions(mob/user) +/obj/item/chems/spray/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/empty/chems) LAZYADD(., /decl/interaction_handler/next_spray_amount) diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index b9dbc2f8f5a2..564779030194 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -137,5 +137,5 @@ /obj/item/engine/thermal/rev_engine(var/atom/movable/M) M.audible_message("\The [M] rumbles to life.") -/obj/item/engine/electric/putter(var/atom/movable/M) +/obj/item/engine/thermal/putter(var/atom/movable/M) M.audible_message("\The [M] putters before turning off.") \ No newline at end of file diff --git a/code/modules/weather/weather_fsm_states.dm b/code/modules/weather/weather_fsm_states.dm index 6c80309d3574..ca38c75279ac 100644 --- a/code/modules/weather/weather_fsm_states.dm +++ b/code/modules/weather/weather_fsm_states.dm @@ -129,7 +129,7 @@ /decl/state_transition/weather/snow_heavy ) -/decl/state/weather/snow/heavy/adjust_temperature(initial_temperature) +/decl/state/weather/snow/medium/adjust_temperature(initial_temperature) return min(initial_temperature - 25, T0C) /decl/state/weather/snow/heavy diff --git a/code/modules/xenoarcheaology/finds/find_types/weapons.dm b/code/modules/xenoarcheaology/finds/find_types/weapons.dm index 73db85aeca5e..b593cece25d5 100644 --- a/code/modules/xenoarcheaology/finds/find_types/weapons.dm +++ b/code/modules/xenoarcheaology/finds/find_types/weapons.dm @@ -18,7 +18,7 @@ "It doesn't look safe.", "It looks wickedly jagged.", "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges.") - + /decl/archaeological_find/knife/new_icon() return pick(knife_icons) @@ -46,7 +46,7 @@ modification_flags = XENOFIND_APPLY_DECOR possible_types = list(/obj/item/beartrap) -/decl/archaeological_find/knife/generate_name() +/decl/archaeological_find/trap/generate_name() return "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]" /decl/archaeological_find/trap/get_additional_description() From dea3f36ba359f47e4edabb7acc3caa5229a4c699 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:41:18 -0500 Subject: [PATCH 60/82] Remove accidental duplicate proc overrides --- .../reagents/reactions/reaction_synthesis.dm | 3 --- code/modules/recycling/disposalpipe.dm | 23 ------------------- .../real_instruments/Violin/violin.dm | 3 --- 3 files changed, 29 deletions(-) diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 90f7a0e19577..1c8182d7a492 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -28,9 +28,6 @@ var/decl/material/mat = GET_DECL(/decl/material/solid/fiberglass) mat.create_object(location, created_volume) -/decl/chemical_reaction/synthesis/crystalization/can_happen(datum/reagents/holder) - . = ..() && length(holder.reagent_volumes) > 1 - /decl/chemical_reaction/synthesis/crystalization name = "Crystalization" required_reagents = list(/decl/material/liquid/crystal_agent = 1) diff --git a/code/modules/recycling/disposalpipe.dm b/code/modules/recycling/disposalpipe.dm index 60401186373b..e035da8b8254 100644 --- a/code/modules/recycling/disposalpipe.dm +++ b/code/modules/recycling/disposalpipe.dm @@ -232,29 +232,6 @@ qdel(src) -// pipe is deleted -// ensure if holder is present, it is expelled -/obj/structure/disposalpipe/Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // deleting pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.forceMove(T) - AM.pipe_eject(0) - qdel(H) - return ..() - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - . = ..() - /obj/structure/disposalpipe/hides_under_flooring() return 1 diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index d73ee46400af..fe47cd2d560b 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -10,6 +10,3 @@ path = /datum/instrument/obsolete/violin material = /decl/material/solid/organic/wood matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - -/obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) - return !(src && in_range(src, user)) \ No newline at end of file From dc8f1400ef6830eaa63395d337b9041058f0062c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 27 Dec 2024 02:17:43 -0500 Subject: [PATCH 61/82] Move ERT RIGs out of corporate modpack --- .../rigs/ert}/asset_protection/boots.dmi | Bin .../rigs/ert}/asset_protection/chest.dmi | Bin .../rigs/ert}/asset_protection/gloves.dmi | Bin .../rigs/ert}/asset_protection/helmet.dmi | Bin .../rigs/ert}/asset_protection/rig.dmi | Bin .../clothing/rigs/ert}/commander/boots.dmi | Bin .../clothing/rigs/ert}/commander/chest.dmi | Bin .../clothing/rigs/ert}/commander/gloves.dmi | Bin .../clothing/rigs/ert}/commander/helmet.dmi | Bin .../clothing/rigs/ert}/commander/rig.dmi | Bin .../clothing/rigs/ert}/engineer/boots.dmi | Bin .../clothing/rigs/ert}/engineer/chest.dmi | Bin .../clothing/rigs/ert}/engineer/gloves.dmi | Bin .../clothing/rigs/ert}/engineer/helmet.dmi | Bin .../clothing/rigs/ert}/engineer/rig.dmi | Bin .../clothing/rigs/ert}/janitor/boots.dmi | Bin .../clothing/rigs/ert}/janitor/chest.dmi | Bin .../clothing/rigs/ert}/janitor/gloves.dmi | Bin .../clothing/rigs/ert}/janitor/helmet.dmi | Bin .../clothing/rigs/ert}/janitor/rig.dmi | Bin .../clothing/rigs/ert}/medic/boots.dmi | Bin .../clothing/rigs/ert}/medic/chest.dmi | Bin .../clothing/rigs/ert}/medic/gloves.dmi | Bin .../clothing/rigs/ert}/medic/helmet.dmi | Bin .../clothing/rigs/ert}/medic/rig.dmi | Bin .../clothing/rigs/ert}/security/boots.dmi | Bin .../clothing/rigs/ert}/security/chest.dmi | Bin .../clothing/rigs/ert}/security/gloves.dmi | Bin .../clothing/rigs/ert}/security/helmet.dmi | Bin .../clothing/rigs/ert}/security/rig.dmi | Bin maps/antag_spawn/ert/ert.dm | 5 +- maps/antag_spawn/ert/ert_base.dmm | 54 ++++++---------- .../ert.dm => maps/antag_spawn/ert/rig.dm | 60 +++++++++--------- mods/content/corporate/_corporate.dme | 1 - 34 files changed, 53 insertions(+), 67 deletions(-) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/rig.dmi (100%) rename mods/content/corporate/clothing/rigs/ert.dm => maps/antag_spawn/ert/rig.dm (78%) diff --git a/mods/content/corporate/icons/rigs/asset_protection/boots.dmi b/icons/clothing/rigs/ert/asset_protection/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/boots.dmi rename to icons/clothing/rigs/ert/asset_protection/boots.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/chest.dmi b/icons/clothing/rigs/ert/asset_protection/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/chest.dmi rename to icons/clothing/rigs/ert/asset_protection/chest.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/gloves.dmi b/icons/clothing/rigs/ert/asset_protection/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/gloves.dmi rename to icons/clothing/rigs/ert/asset_protection/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi b/icons/clothing/rigs/ert/asset_protection/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/helmet.dmi rename to icons/clothing/rigs/ert/asset_protection/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/rig.dmi b/icons/clothing/rigs/ert/asset_protection/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/rig.dmi rename to icons/clothing/rigs/ert/asset_protection/rig.dmi diff --git a/mods/content/corporate/icons/rigs/commander/boots.dmi b/icons/clothing/rigs/ert/commander/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/boots.dmi rename to icons/clothing/rigs/ert/commander/boots.dmi diff --git a/mods/content/corporate/icons/rigs/commander/chest.dmi b/icons/clothing/rigs/ert/commander/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/chest.dmi rename to icons/clothing/rigs/ert/commander/chest.dmi diff --git a/mods/content/corporate/icons/rigs/commander/gloves.dmi b/icons/clothing/rigs/ert/commander/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/gloves.dmi rename to icons/clothing/rigs/ert/commander/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/commander/helmet.dmi b/icons/clothing/rigs/ert/commander/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/helmet.dmi rename to icons/clothing/rigs/ert/commander/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/commander/rig.dmi b/icons/clothing/rigs/ert/commander/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/rig.dmi rename to icons/clothing/rigs/ert/commander/rig.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/boots.dmi b/icons/clothing/rigs/ert/engineer/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/boots.dmi rename to icons/clothing/rigs/ert/engineer/boots.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/chest.dmi b/icons/clothing/rigs/ert/engineer/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/chest.dmi rename to icons/clothing/rigs/ert/engineer/chest.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/gloves.dmi b/icons/clothing/rigs/ert/engineer/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/gloves.dmi rename to icons/clothing/rigs/ert/engineer/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/helmet.dmi b/icons/clothing/rigs/ert/engineer/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/helmet.dmi rename to icons/clothing/rigs/ert/engineer/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/rig.dmi b/icons/clothing/rigs/ert/engineer/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/rig.dmi rename to icons/clothing/rigs/ert/engineer/rig.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/boots.dmi b/icons/clothing/rigs/ert/janitor/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/boots.dmi rename to icons/clothing/rigs/ert/janitor/boots.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/chest.dmi b/icons/clothing/rigs/ert/janitor/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/chest.dmi rename to icons/clothing/rigs/ert/janitor/chest.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/gloves.dmi b/icons/clothing/rigs/ert/janitor/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/gloves.dmi rename to icons/clothing/rigs/ert/janitor/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/helmet.dmi b/icons/clothing/rigs/ert/janitor/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/helmet.dmi rename to icons/clothing/rigs/ert/janitor/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/rig.dmi b/icons/clothing/rigs/ert/janitor/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/rig.dmi rename to icons/clothing/rigs/ert/janitor/rig.dmi diff --git a/mods/content/corporate/icons/rigs/medic/boots.dmi b/icons/clothing/rigs/ert/medic/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/boots.dmi rename to icons/clothing/rigs/ert/medic/boots.dmi diff --git a/mods/content/corporate/icons/rigs/medic/chest.dmi b/icons/clothing/rigs/ert/medic/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/chest.dmi rename to icons/clothing/rigs/ert/medic/chest.dmi diff --git a/mods/content/corporate/icons/rigs/medic/gloves.dmi b/icons/clothing/rigs/ert/medic/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/gloves.dmi rename to icons/clothing/rigs/ert/medic/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/medic/helmet.dmi b/icons/clothing/rigs/ert/medic/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/helmet.dmi rename to icons/clothing/rigs/ert/medic/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/medic/rig.dmi b/icons/clothing/rigs/ert/medic/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/rig.dmi rename to icons/clothing/rigs/ert/medic/rig.dmi diff --git a/mods/content/corporate/icons/rigs/security/boots.dmi b/icons/clothing/rigs/ert/security/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/boots.dmi rename to icons/clothing/rigs/ert/security/boots.dmi diff --git a/mods/content/corporate/icons/rigs/security/chest.dmi b/icons/clothing/rigs/ert/security/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/chest.dmi rename to icons/clothing/rigs/ert/security/chest.dmi diff --git a/mods/content/corporate/icons/rigs/security/gloves.dmi b/icons/clothing/rigs/ert/security/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/gloves.dmi rename to icons/clothing/rigs/ert/security/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/security/helmet.dmi b/icons/clothing/rigs/ert/security/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/helmet.dmi rename to icons/clothing/rigs/ert/security/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/security/rig.dmi b/icons/clothing/rigs/ert/security/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/rig.dmi rename to icons/clothing/rigs/ert/security/rig.dmi diff --git a/maps/antag_spawn/ert/ert.dm b/maps/antag_spawn/ert/ert.dm index 0d16a0f2a8df..0422dfdada69 100644 --- a/maps/antag_spawn/ert/ert.dm +++ b/maps/antag_spawn/ert/ert.dm @@ -59,4 +59,7 @@ /area/map_template/rescue_base/start name = "\improper Response Team Base" icon_state = "shuttlered" - base_turf = /turf/unsimulated/floor/rescue_base \ No newline at end of file + base_turf = /turf/unsimulated/floor/rescue_base + +// Separated in preparation for making ERTs into a modpack. +#include "rig.dm" \ No newline at end of file diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 30c9701f6a83..6cc0037f9d85 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -415,9 +415,6 @@ /obj/item/flash, /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) -"bs" = ( -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "bt" = ( /obj/machinery/door/airlock/centcom{ name = "Cell 2" @@ -1396,9 +1393,6 @@ /obj/structure/bed/chair/office/dark, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) -"dP" = ( -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "dQ" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/door/airlock/external/shuttle{ @@ -1466,10 +1460,6 @@ }, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) -"ec" = ( -/obj/structure/table/reinforced, -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "ed" = ( /obj/structure/table/reinforced, /obj/item/radio/intercom{ @@ -1547,7 +1537,7 @@ "et" = ( /obj/structure/rack, /obj/item/secure_storage/briefcase, -/obj/item/clothing/head/beret/corp/centcom/captain, +/obj/item/clothing/head/beret, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "eu" = ( @@ -1833,8 +1823,7 @@ "eV" = ( /obj/machinery/door/blast/regular/open{ id_tag = "rescuebridge"; - name = "Cockpit Blast Shutters"; - + name = "Cockpit Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -1843,8 +1832,7 @@ "eW" = ( /obj/machinery/door/blast/regular/open{ id_tag = "rescuedock"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2075,8 +2063,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescuebridge"; - name = "Cockpit Blast Shutters"; - + name = "Cockpit Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2135,8 +2122,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescueeva"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2539,8 +2525,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescuebridge"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/paint/blue, /turf/floor/plating, @@ -2590,8 +2575,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescueinfirm"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/paint/blue, /turf/floor/plating, @@ -3513,7 +3497,7 @@ ao ao dU ao -dP +ao ad ac ac @@ -4680,7 +4664,7 @@ ao ao ad cR -dP +ao dY dY eu @@ -4988,11 +4972,11 @@ ar ar ad ar -bs +ao ar ar ar -bs +ao ar ad cq @@ -5011,7 +4995,7 @@ ao ao ao ao -ec +de ad bB eN @@ -5076,7 +5060,7 @@ ao ao ao ao -ec +de ad bC eN @@ -5136,12 +5120,12 @@ ao ad ad ad -ec +de ao ao ao ao -ec +de ad bA eO @@ -5206,7 +5190,7 @@ ao ao ao ao -ec +de ad bA bB @@ -5271,7 +5255,7 @@ eq eq eq ao -ec +de ad bB bC @@ -5464,9 +5448,9 @@ ac ac ac ad -ec +de eq -ec +de ad ac ac diff --git a/mods/content/corporate/clothing/rigs/ert.dm b/maps/antag_spawn/ert/rig.dm similarity index 78% rename from mods/content/corporate/clothing/rigs/ert.dm rename to maps/antag_spawn/ert/rig.dm index 650d93c48814..353590e005f4 100644 --- a/mods/content/corporate/clothing/rigs/ert.dm +++ b/maps/antag_spawn/ert/rig.dm @@ -2,7 +2,7 @@ name = "emergency response command hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has blue highlights. Armoured and space ready." suit_type = "emergency response command" - icon = 'mods/content/corporate/icons/rigs/commander/rig.dmi' + icon = 'icons/clothing/rigs/ert/commander/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert helmet = /obj/item/clothing/head/helmet/space/rig/ert @@ -53,20 +53,20 @@ /obj/item/clothing/head/helmet/space/rig/ert camera = /obj/machinery/camera/network/ert - icon = 'mods/content/corporate/icons/rigs/commander/helmet.dmi' + icon = 'icons/clothing/rigs/ert/commander/helmet.dmi' /obj/item/clothing/suit/space/rig/ert - icon = 'mods/content/corporate/icons/rigs/commander/chest.dmi' + icon = 'icons/clothing/rigs/ert/commander/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert - icon = 'mods/content/corporate/icons/rigs/commander/boots.dmi' + icon = 'icons/clothing/rigs/ert/commander/boots.dmi' /obj/item/clothing/gloves/rig/ert item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS - icon = 'mods/content/corporate/icons/rigs/commander/gloves.dmi' + icon = 'icons/clothing/rigs/ert/commander/gloves.dmi' /obj/item/rig/ert/engineer name = "emergency response engineering hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has orange highlights. Armoured and space ready." suit_type = "emergency response engineer" - icon = 'mods/content/corporate/icons/rigs/engineer/rig.dmi' + icon = 'icons/clothing/rigs/ert/engineer/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/engineer helmet = /obj/item/clothing/head/helmet/space/rig/ert/engineer @@ -82,20 +82,20 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/helmet.dmi' + icon = 'icons/clothing/rigs/ert/engineer/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/chest.dmi' + icon = 'icons/clothing/rigs/ert/engineer/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/boots.dmi' + icon = 'icons/clothing/rigs/ert/engineer/boots.dmi' /obj/item/clothing/gloves/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/gloves.dmi' + icon = 'icons/clothing/rigs/ert/engineer/gloves.dmi' siemens_coefficient = 0 /obj/item/rig/ert/janitor name = "emergency response sanitation hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has purple highlights. Armoured and space ready." suit_type = "emergency response sanitation" - icon = 'mods/content/corporate/icons/rigs/janitor/rig.dmi' + icon = 'icons/clothing/rigs/ert/janitor/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/janitor helmet = /obj/item/clothing/head/helmet/space/rig/ert/janitor @@ -112,19 +112,19 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/helmet.dmi' + icon = 'icons/clothing/rigs/ert/janitor/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/chest.dmi' + icon = 'icons/clothing/rigs/ert/janitor/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/boots.dmi' + icon = 'icons/clothing/rigs/ert/janitor/boots.dmi' /obj/item/clothing/gloves/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/gloves.dmi' + icon = 'icons/clothing/rigs/ert/janitor/gloves.dmi' /obj/item/rig/ert/medical name = "emergency response medical hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has white highlights. Armoured and space ready." suit_type = "emergency response medic" - icon = 'mods/content/corporate/icons/rigs/medic/rig.dmi' + icon = 'icons/clothing/rigs/ert/medic/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/medical helmet = /obj/item/clothing/head/helmet/space/rig/ert/medical @@ -140,19 +140,19 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/helmet.dmi' + icon = 'icons/clothing/rigs/ert/medic/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/chest.dmi' + icon = 'icons/clothing/rigs/ert/medic/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/boots.dmi' + icon = 'icons/clothing/rigs/ert/medic/boots.dmi' /obj/item/clothing/gloves/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/gloves.dmi' + icon = 'icons/clothing/rigs/ert/medic/gloves.dmi' /obj/item/rig/ert/security name = "emergency response security hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has red highlights. Armoured and space ready." suit_type = "emergency response security" - icon = 'mods/content/corporate/icons/rigs/security/rig.dmi' + icon = 'icons/clothing/rigs/ert/security/rig.dmi' initial_modules = list( /obj/item/rig_module/ai_container, /obj/item/rig_module/maneuvering_jets, @@ -167,19 +167,19 @@ gloves = /obj/item/clothing/gloves/rig/ert/security /obj/item/clothing/head/helmet/space/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/helmet.dmi' + icon = 'icons/clothing/rigs/ert/security/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/chest.dmi' + icon = 'icons/clothing/rigs/ert/security/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/boots.dmi' + icon = 'icons/clothing/rigs/ert/security/boots.dmi' /obj/item/clothing/gloves/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/gloves.dmi' + icon = 'icons/clothing/rigs/ert/security/gloves.dmi' /obj/item/rig/ert/assetprotection name = "heavy emergency response suit control module" desc = "A heavy, modified version of a common emergency response hardsuit. Has blood red highlights. Armoured and space ready." suit_type = "heavy emergency response" - icon = 'mods/content/corporate/icons/rigs/asset_protection/rig.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/rig.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, ARMOR_BULLET = ARMOR_BALLISTIC_RESISTANT, @@ -209,11 +209,11 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/helmet.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/chest.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/boots.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/boots.dmi' /obj/item/clothing/gloves/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/gloves.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/gloves.dmi' siemens_coefficient = 0 diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 75a782ae63c0..390348d3603d 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -15,7 +15,6 @@ #include "clothing\head\ert.dm" #include "clothing\head\helmets.dm" #include "clothing\masks\rubber.dm" -#include "clothing\rigs\ert.dm" #include "clothing\suit\armour.dm" #include "clothing\suit\captain.dm" #include "clothing\suit\hoodies.dm" From f0923877b5f2cd99277e5d0b6c2237a555693e2c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 27 Dec 2024 18:17:30 -0500 Subject: [PATCH 62/82] Remove mind.original --- code/datums/communication/dsay.dm | 6 +----- code/datums/mind/mind.dm | 8 -------- code/game/antagonist/antagonist_update.dm | 1 - code/game/gamemodes/game_mode.dm | 2 +- code/game/machinery/computer/message.dm | 4 ++-- code/game/machinery/computer/robot.dm | 8 ++++---- code/game/objects/items/robot/robot_frame.dm | 1 + code/modules/mob/living/silicon/robot/laws.dm | 7 +++++-- code/modules/mob/mob_helpers.dm | 2 -- code/modules/mob/new_player/new_player.dm | 1 - code/modules/mob/transform_procs.dm | 2 -- mods/gamemodes/traitor/overrides.dm | 10 ++-------- mods/species/vox/datum/heist_compatibility.dm | 2 +- 13 files changed, 17 insertions(+), 37 deletions(-) diff --git a/code/datums/communication/dsay.dm b/code/datums/communication/dsay.dm index c21705a672eb..273f17a36b74 100644 --- a/code/datums/communication/dsay.dm +++ b/code/datums/communication/dsay.dm @@ -61,12 +61,8 @@ keyname = C.key if(C.mob) //Most of the time this is the dead/observer mob; we can totally use him if there is no better name - var/mindname + var/mindname = C.mob.mind?.name // the mind's "original name" var/realname = C.mob.real_name - if(C.mob.mind) - mindname = C.mob.mind.name - if(C.mob.mind.original && C.mob.mind.original.real_name) - realname = C.mob.mind.original.real_name if(mindname && mindname != realname) name = "[realname] died as [mindname]" else diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 34bad84cb65d..cb9ad6c9539e 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -33,7 +33,6 @@ var/key var/name //replaces mob/var/original_name var/mob/living/current - var/mob/living/original //TODO: remove.not used in any meaningful way ~Carn. First I'll need to tweak the way silicon-mobs handle minds. var/active = 0 var/gen_relations_info @@ -71,18 +70,12 @@ if(current?.mind == src) current.mind = null current = null - if(original?.mind == src) - original.mind = null - original = null . = ..() /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) current = null - if (original == deleted_mob) - original = null - /datum/mind/proc/transfer_to(mob/living/new_character) if(!istype(new_character)) to_world_log("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn") @@ -505,7 +498,6 @@ mind.key = key else mind = new /datum/mind(key) - mind.original = src SSticker.minds += mind if(!mind.name) mind.name = real_name mind.current = src diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index be03efcadfd8..642141255657 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -13,7 +13,6 @@ player.current = new mob_path(get_turf(player.current)) player.transfer_to(player.current) if(holder) qdel(holder) - player.original = player.current if(!preserve_appearance && (flags & ANTAG_SET_APPEARANCE)) spawn(3) var/mob/living/human/H = player.current diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 9bfdd9791429..be38f8871efc 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -550,7 +550,7 @@ var/global/list/additional_antag_types = list() continue //Happy connected client for(var/mob/observer/ghost/D in SSmobs.mob_list) - if(D.mind && (D.mind.original == L || D.mind.current == L)) + if(D.mind && D.mind.current == L) if(L.stat == DEAD) msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" continue //Dead mob, ghost abandoned diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 16503b09fe95..0c145faa9de9 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -120,7 +120,7 @@ dat += "
[++i]. Set Custom Key
" else dat += "

Please authenticate with the server in order to show additional options." - if((isAI(user) || isrobot(user)) && (user.mind.assigned_special_role && user.mind.original == user)) + if((isAI(user) || isrobot(user)) && player_is_antag(user.mind)) //Malf/Traitor AIs can bruteforce into the system to gain the Key. dat += "
*&@#. Bruteforce Key
" @@ -283,7 +283,7 @@ //Hack the Console to get the password if (href_list["hack"]) - if((isAI(usr) || isrobot(usr)) && usr.mind.assigned_special_role && usr.mind.original == usr) + if((isAI(usr) || isrobot(usr)) && player_is_antag(usr.mind)) src.hacking = 1 src.screen = 2 update_icon() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 524f6a358899..4b1d38034e52 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -68,7 +68,7 @@ return TOPIC_HANDLED // Antag AI checks - if(!isAI(user) || !(user.mind.assigned_special_role && user.mind.original == user)) + if(!isAI(user) || !player_is_antag(user.mind)) to_chat(user, "Access Denied") return TOPIC_HANDLED @@ -103,9 +103,9 @@ . = TOPIC_REFRESH // Proc: get_cyborgs() -// Parameters: 1 (operator - mob which is operating the console.) +// Parameters: 1 (user - mob which is operating the console.) // Description: Returns NanoUI-friendly list of accessible cyborgs. -/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator) +/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/user) var/list/robots = list() for(var/mob/living/silicon/robot/R in global.silicon_mob_list) @@ -145,7 +145,7 @@ robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None" robot["hackable"] = 0 // Antag AIs know whether linked cyborgs are hacked or not. - if(operator && isAI(operator) && (R.connected_ai == operator) && (operator.mind.assigned_special_role && operator.mind.original == operator)) + if(user && isAI(user) && (R.connected_ai == user) && player_is_antag(user.mind)) robot["hacked"] = R.emagged ? 1 : 0 robot["hackable"] = R.emagged? 0 : 1 robots.Add(list(robot)) diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index bd8f71787b83..24f7474aa6e1 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -111,6 +111,7 @@ O.custom_name = created_name O.updatename("Default") + clear_antag_roles(brainmob.mind, implanted = TRUE) // some antag roles persist brainmob.mind.transfer_to(O) if(O.mind && O.mind.assigned_role) O.job = O.mind.assigned_role diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 22ecbf50f91f..991631baa850 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -42,8 +42,11 @@ var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null if (master) master.sync(src) - ..() - return + . = ..() + // if we aren't malfunctioning and we have a law 0, it's presumably shared + // if we are malfunctioning and we don't have a law 0, we don't need to worry about this + if(connected_ai && is_malfunctioning() && has_zeroth_law()) + to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) /mob/living/silicon/robot/proc/robot_checklaws() set category = "Silicon Commands" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6751c0ad7f2e..67e363adcb0c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -294,8 +294,6 @@ var/global/list/global/organ_rel_size = list( var/datum/mind/M = O if(M.current && M.current.client) C = M.current.client - else if(M.original && M.original.client) - C = M.original.client if(C) if(C.get_preference_value(/datum/client_preference/anon_say) == PREF_YES) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index caa16d854fb7..d81eaccd530a 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -392,7 +392,6 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(mind) mind.active = 0 //we wish to transfer the key manually - mind.original = new_character var/memory = client.prefs.records[PREF_MEM_RECORD] if(memory) mind.StoreMemory(memory) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e0c1d4468761..866c96a62c6e 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -70,7 +70,6 @@ O.aiRestorePowerRoutine = 0 if(mind) mind.transfer_to(O) - O.mind.original = O else O.key = key @@ -128,7 +127,6 @@ mind.active = TRUE mind.transfer_to(O) if(O.mind && O.mind.assigned_role == ASSIGNMENT_ROBOT) - O.mind.original = O var/mmi_type = SSrobots.get_brain_type_by_title(O.mind.role_alt_title ? O.mind.role_alt_title : O.mind.assigned_role) if(mmi_type) O.central_processor = new mmi_type(O) diff --git a/mods/gamemodes/traitor/overrides.dm b/mods/gamemodes/traitor/overrides.dm index 122c6cf5daa3..0f8142a16352 100644 --- a/mods/gamemodes/traitor/overrides.dm +++ b/mods/gamemodes/traitor/overrides.dm @@ -3,18 +3,12 @@ return mind && traitors.is_antagonist(mind) /mob/living/silicon/robot/show_master(mob/who) - // TODO: Update to new antagonist system. - if (mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src && connected_ai) + var/decl/special_role/traitor/traitor_role = IMPLIED_DECL + if(traitor_role.is_antagonist(mind) && connected_ai) to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") return return ..() -/mob/living/silicon/robot/lawsync() - . = ..() - // TODO: Update to new antagonist system. - if(mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src) - to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) - /mob/living/silicon/robot/handle_regular_hud_updates() . = ..() if(!.) diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/species/vox/datum/heist_compatibility.dm index a34c7d79244a..776057948c06 100644 --- a/mods/species/vox/datum/heist_compatibility.dm +++ b/mods/species/vox/datum/heist_compatibility.dm @@ -16,7 +16,7 @@ var/decl/species/my_species = user?.get_species() var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) + if(!istype(user) || !user.mind || !raiders.is_antagonist(user.mind) || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) return ..() var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") From 7c0d3eaadc3fe1408f3a254eb6fec2de3c12daa9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Feb 2023 09:39:22 +1100 Subject: [PATCH 63/82] Compiled tweaks from old codex dump branch. --- code/game/objects/items/weapons/policetape.dm | 11 ++++++----- code/modules/mob/new_player/new_player.dm | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 7800b0131cd6..81ae83daba05 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -250,7 +250,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar /obj/structure/tape_barricade/proc/update_neighbors(var/location = loc) for (var/look_dir in global.cardinal) var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir)) - if(B && !QDELETED(B)) + if(!QDELETED(B)) B.update_icon() if(!QDELETED(src)) @@ -261,10 +261,11 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar neighbors = 0 for (var/look_dir in global.cardinal) var/turf/target_turf = get_step(src, look_dir) - var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, target_turf) - //We connect to walls and other tape_barricades - if((B && !QDELETED(B)) || (!B && target_turf?.is_wall())) - neighbors |= look_dir + if(target_turf) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf + //We connect to walls and other tape_barricades + if((B && !QDELETED(B)) || (!B && target_turf.is_wall())) + neighbors |= look_dir /**Allow sutypes to override with their own forced icon state name.*/ /obj/structure/tape_barricade/proc/icon_name_override() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index caa16d854fb7..c0e255949e21 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -2,6 +2,7 @@ universal_speak = TRUE mob_sort_value = 10 invisibility = INVISIBILITY_ABSTRACT + is_spawnable_type = FALSE simulated = FALSE density = FALSE stat = DEAD From 253a241f9bf5e7046b177c94cf1a414680d477dd Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 28 Dec 2024 13:13:09 +1100 Subject: [PATCH 64/82] Fixed copypaste error with liddables. --- code/modules/reagents/reagent_containers/_glass.dm | 3 --- code/modules/reagents/reagent_containers/beaker.dm | 3 +++ code/modules/reagents/reagent_containers/bowl.dm | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index 3df7ca1144fb..ddaa812b4df4 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -107,9 +107,6 @@ return TRUE return ..() -/obj/item/chems/glass/can_lid() - return FALSE - /obj/item/chems/glass/get_food_default_transfer_amount(mob/eater) return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 258146c77c42..d89ac9acff10 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -89,6 +89,9 @@ atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/metal/steel +/obj/item/chems/glass/beaker/bowl/can_lid() + return FALSE + /obj/item/chems/glass/beaker/bowl/pottery material = /decl/material/solid/stone/pottery diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index 7c69241f516b..bc54aadbaa47 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -9,6 +9,9 @@ volume = 30 amount_per_transfer_from_this = 5 +/obj/item/chems/glass/bowl/can_lid() + return FALSE + // Predefined soup types for mapping. /obj/item/chems/glass/bowl/mapped abstract_type = /obj/item/chems/glass/bowl/mapped From 8ef8f6857f5231d0dd7c5b162175edea1f57e3b2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 12:42:28 +1100 Subject: [PATCH 65/82] Cleaning up attack_hand interactions. --- code/_onclick/click.dm | 19 +----- code/_onclick/other_mobs.dm | 6 ++ code/datums/ai/aggressive.dm | 60 +++++++++++-------- code/game/objects/items/__item.dm | 3 +- .../mob/living/human/human_attackhand.dm | 4 -- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 7e4d29c799a6..c2d4cfb5862f 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -118,7 +118,7 @@ if(holding) // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!do_attack_windup_checking(A) || holding != get_active_held_item())) + if(a_intent == I_HURT && istype(A) && (!(A) || holding != get_active_held_item())) return TRUE var/resolved = holding.resolve_attackby(A, src, params) @@ -143,10 +143,6 @@ if(A.Adjacent(src)) // see adjacent.dm if(holding) - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!do_attack_windup_checking(A) || holding != get_active_held_item())) - return TRUE - // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) @@ -217,18 +213,7 @@ if(istype(G) && G.Touch(A,1)) return TRUE - // Pick up items. - if(check_dexterity(DEXTERITY_HOLD_ITEM, silent = TRUE)) - return A.attack_hand(src) - - // TODO: some way to check if we SHOULD be doing an attack windup here; - // corgis attacking a tree, for example, will do the windup animation despite - // having no interaction or message shown at the end of it. - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && !do_attack_windup_checking(A)) - return TRUE - - return FALSE + return A.attack_hand(src) /* Ranged unarmed attack: diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 77c594dd3750..49bf7f7047f3 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -8,9 +8,15 @@ /atom/proc/can_interact_with_storage(user, strict = FALSE) return isliving(user) +/atom/proc/get_required_interaction_dexterity() + return DEXTERITY_NONE + /atom/proc/attack_hand(mob/user) SHOULD_CALL_PARENT(TRUE) + if(!user.check_dexterity(get_required_interaction_dexterity(), silent = TRUE)) + return FALSE + if(can_interact_with_storage(user, strict = TRUE) && storage && user.check_dexterity((DEXTERITY_HOLD_ITEM|DEXTERITY_EQUIP_ITEM), TRUE)) add_fingerprint(user) storage.open(user) diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index 9335610bcdeb..84296f856bf9 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -92,10 +92,14 @@ return TRUE /datum/mob_controller/aggressive/proc/attack_target() + + set waitfor = FALSE + var/atom/target = get_target() if(!istype(target)) lose_target() return + if(isliving(target) && body.buckled_mob == target && (!body.faction || body.buckled_mob.faction != body.faction)) body.visible_message(SPAN_DANGER("\The [body] attempts to unseat \the [body.buckled_mob]!")) body.set_dir(pick(global.cardinal)) @@ -107,11 +111,21 @@ var/mob/living/victim = target SET_STATUS_MAX(victim, STAT_WEAK, 3) return target - if(body.Adjacent(target)) - body.a_intent = I_HURT - body.ClickOn(target) + + if(!body.Adjacent(target)) + return target + + // AI-driven mobs have a melee telegraph that needs to be handled here. + if(!body.do_attack_windup_checking(target)) + return target + + if(QDELETED(body) || body.incapacitated() || QDELETED(target)) return target + body.a_intent = I_HURT + body.ClickOn(target) + return target + /datum/mob_controller/aggressive/destroy_surroundings() if(!body.can_act()) @@ -174,27 +188,25 @@ if(!(. = ..())) return - if(!only_attack_enemies) - if(source) - set_target(source) - move_to_target(move_only = TRUE) - return - - var/list/allies - var/list/around = view(body, 7) - for(var/atom/movable/A in around) - if(A == body || !isliving(A)) - continue - var/mob/living/M = A - if(attack_same_faction || M.faction != body.faction) - add_enemy(M) - else if(istype(M.ai)) - LAZYADD(allies, M.ai) - - var/list/enemies = get_enemies() - if(LAZYLEN(enemies) && LAZYLEN(allies)) - for(var/datum/mob_controller/ally as anything in allies) - ally.add_enemies(enemies) + if(only_attack_enemies) + var/list/allies + var/list/around = view(body, 7) + for(var/atom/movable/A in around) + if(A == body || !isliving(A)) + continue + var/mob/living/M = A + if(attack_same_faction || M.faction != body.faction) + add_enemy(M) + else if(istype(M.ai)) + LAZYADD(allies, M.ai) + var/list/enemies = get_enemies() + if(LAZYLEN(enemies) && LAZYLEN(allies)) + for(var/datum/mob_controller/ally as anything in allies) + ally.add_enemies(enemies) + + if(source) + set_target(source) + move_to_target(move_only = TRUE) /datum/mob_controller/aggressive/move_to_target(var/move_only = FALSE) if(!body.can_act()) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index f5b5cc7eff21..e86feb7173b6 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -96,7 +96,8 @@ var/paint_verb /// What dexterity is required to attack with this item? - var/needs_attack_dexterity = DEXTERITY_WIELD_ITEM + var/needs_attack_dexterity = DEXTERITY_WIELD_ITEM + var/needs_interaction_dexterity = DEXTERITY_HOLD_ITEM /// Vars relating to wielding the item with two or more hands. var/can_be_twohanded = FALSE diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index 3ad1462e59a1..68fd260a1613 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -125,10 +125,6 @@ to_chat(user, SPAN_WARNING("You can't attack while incapacitated.")) return TRUE - // AI driven mobs have a melee telegraph that needs to be handled here. - if(user.a_intent == I_HURT && !user.do_attack_windup_checking(src)) - return TRUE - if(!ishuman(user)) attack_generic(user, rand(1,3), "punched") return TRUE From b88309ea111b2f1a7c96d9e40b4b46d26132d0a8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 13:33:39 +1100 Subject: [PATCH 66/82] Buffs hook hand dexterity. --- .../organs/prosthetics/prosthetics_manufacturer_models.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm index ad3b2c5e9ea0..14f0e7bdac2f 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm @@ -10,7 +10,7 @@ icon_base = 'icons/mob/human_races/cyberlimbs/morgan/morgan_main.dmi' modifier_string = "wooden" hardiness = 0.75 - manual_dexterity = DEXTERITY_SIMPLE_MACHINES + manual_dexterity = DEXTERITY_SIMPLE_MACHINES | DEXTERITY_HOLD_ITEM | DEXTERITY_EQUIP_ITEM | DEXTERITY_KEYBOARDS | DEXTERITY_GRAPPLE movement_slowdown = 1 is_robotic = FALSE modular_limb_tier = MODULAR_BODYPART_ANYWHERE From d8924ed40dbbd361365a5deea0986a0e64934a7c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 13:38:39 +1100 Subject: [PATCH 67/82] Attempts to fix cleanbots becoming fixated on 1 bit of dirt they can't reach. --- code/modules/mob/living/bot/bot.dm | 8 ++-- code/modules/mob/living/bot/cleanbot.dm | 41 +++++++++--------- code/modules/mob/living/bot/farmbot.dm | 10 ++--- code/modules/mob/living/bot/floorbot.dm | 12 +++--- code/modules/mob/living/bot/medibot.dm | 57 +++++++++++++------------ code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 4 +- 7 files changed, 69 insertions(+), 65 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index fab8219c1698..933e58b3afbb 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -283,12 +283,12 @@ /mob/living/bot/proc/lookForTargets() return -/mob/living/bot/proc/confirmTarget(var/atom/A) - if(A.invisibility >= INVISIBILITY_LEVEL_ONE) +/mob/living/bot/proc/confirmTarget(atom/target) + if(target.invisibility >= INVISIBILITY_LEVEL_ONE) return 0 - if(A in ignore_list) + if(target in ignore_list) return 0 - if(!A.loc) + if(!target.loc) return 0 return 1 diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index e989ba53b320..95fac4ce948e 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -1,5 +1,5 @@ /mob/living/bot/cleanbot - name = "Cleanbot" + name = "cleanbot" desc = "A little cleaning robot, he looks so excited!" icon = 'icons/mob/bot/cleanbot.dmi' icon_state = "cleanbot0" @@ -35,44 +35,47 @@ ignore_list -= g /mob/living/bot/cleanbot/lookForTargets() - for(var/obj/effect/decal/cleanable/D in view(world.view + 1, src)) - if(confirmTarget(D)) - target = D + for(var/obj/effect/decal/cleanable/decal in view(world.view + 1, src)) + if(confirmTarget(decal)) + target = decal playsound(src, 'sound/machines/boop1.ogg', 30) return -/mob/living/bot/cleanbot/confirmTarget(var/obj/effect/decal/cleanable/D) - if(!..()) - return 0 - for(var/T in target_types) - if(istype(D, T)) - return 1 - return 0 +/mob/living/bot/cleanbot/confirmTarget(atom/target) + . = ..() + if(.) + var/turf/decal_turf = get_turf(target) + if(!istype(decal_turf) || decal_turf.contains_dense_objects()) + return FALSE // Stop trying to clean under full-tile windows. + if(istype(target, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = target + return dirt.dirt_amount >= 50 // Stop trying to clean invisible dirt. + return is_type_in_list(target, target_types) /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) UnarmedAttack(target, TRUE) -/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) +/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/decal, var/proximity) . = ..() if(.) return - if(!istype(D)) + if(!istype(decal)) return TRUE - if(D.loc != loc) + if(decal.loc != loc) return FALSE busy = 1 - visible_message("\The [src] begins to clean up \the [D].") + visible_message("\The [src] begins to clean up \the [decal].") update_icon() - var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 - if(do_after(src, cleantime, progress = 0) && !QDELETED(D)) - if(D == target) + var/cleantime = istype(decal, /obj/effect/decal/cleanable/dirt) ? 10 : 50 + if(do_after(src, cleantime, progress = 0) && !QDELETED(decal)) + if(decal == target) target = null - qdel(D) + qdel(decal) playsound(src, 'sound/machines/boop2.ogg', 30) busy = 0 update_icon() diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 86a8a9411890..5244a343d741 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -240,21 +240,21 @@ if(prob(50)) new /obj/item/robot_parts/l_arm(my_turf) -/mob/living/bot/farmbot/confirmTarget(var/atom/targ) +/mob/living/bot/farmbot/confirmTarget(atom/target) if(!..()) return 0 - if(emagged && ishuman(targ)) - if(targ in view(world.view, src)) + if(emagged && ishuman(target)) + if(target in view(world.view, src)) return 1 return 0 - if(istype(targ, /obj/structure/hygiene/sink)) + if(istype(target, /obj/structure/hygiene/sink)) if(!tank || tank.reagents.total_volume >= tank.reagents.maximum_volume) return 0 return 1 - var/obj/machinery/portable_atmospherics/hydroponics/tray = targ + var/obj/machinery/portable_atmospherics/hydroponics/tray = target if(!istype(tray)) return 0 diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index b772273fd66a..23125250d07b 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -109,23 +109,23 @@ target = S return -/mob/living/bot/floorbot/confirmTarget(var/atom/A) // The fact that we do some checks twice may seem confusing but remember that the bot's settings may be toggled while it's moving and we want them to stop in that case +/mob/living/bot/floorbot/confirmTarget(atom/target) // The fact that we do some checks twice may seem confusing but remember that the bot's settings may be toggled while it's moving and we want them to stop in that case anchored = FALSE if(!..()) return 0 - if(istype(A, /obj/item/stack/tile/floor)) + if(istype(target, /obj/item/stack/tile/floor)) return (amount < maxAmount && eattiles) - if(istype(A, /obj/item/stack/material)) - var/obj/item/stack/material/S = A + if(istype(target, /obj/item/stack/material)) + var/obj/item/stack/material/S = target if(S.material?.type == /decl/material/solid/metal/steel) return (amount < maxAmount && maketiles) - if(A.loc.name == "Space") + if(target.loc.name == "Space") return 0 - var/turf/floor/T = A + var/turf/floor/T = target if(istype(T)) if(emagged) return 1 diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 8084e5eaaebd..8ba09af58d39 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -78,35 +78,35 @@ /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! return - for(var/mob/living/human/H in view(7, src)) // Time to find a patient! - if(confirmTarget(H)) - target = H + for(var/mob/living/human/patient in view(7, src)) // Time to find a patient! + if(confirmTarget(patient)) + target = patient if(last_newpatient_speak + 300 < world.time && vocal) if(vocal) var/message_options = list( - "Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/mcoming.ogg', - "Wait [H.name]! I want to help!" = 'sound/voice/medbot/mhelp.ogg', - "[H.name], you appear to be injured!" = 'sound/voice/medbot/minjured.ogg' + "Hey, [patient.name]! Hold on, I'm coming." = 'sound/voice/medbot/mcoming.ogg', + "Wait [patient.name]! I want to help!" = 'sound/voice/medbot/mhelp.ogg', + "[patient.name], you appear to be injured!" = 'sound/voice/medbot/minjured.ogg' ) var/message = pick(message_options) say(message) playsound(src, message_options[message], 50, 0) - custom_emote(1, "points at [H.name].") + custom_emote(1, "points at [patient.name].") last_newpatient_speak = world.time break -/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/H, var/proximity) +/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/target, var/proximity) . = ..() if(.) return - if(!on || !istype(H)) + if(!on || !istype(target)) return FALSE if(busy) return TRUE - if(H.stat == DEAD) + if(target.stat == DEAD) if(vocal) var/static/death_messages = list( "No! Stay with me!" = 'sound/voice/medbot/mno.ogg', @@ -117,7 +117,7 @@ say(message) playsound(src, death_messages[message], 50, 0) - var/t = confirmTarget(H) + var/t = confirmTarget(target) if(!t) if(vocal) var/static/possible_messages = list( @@ -130,18 +130,18 @@ playsound(src, possible_messages[message], 50, 0) icon_state = "medibots" - visible_message("[src] is trying to inject [H]!") + visible_message("[src] is trying to inject [target]!") if(declare_treatment) var/area/location = get_area(src) - broadcast_medical_hud_message("[src] is treating [H] in [location.proper_name]", src) + broadcast_medical_hud_message("[src] is treating [target] in [location.proper_name]", src) busy = 1 update_icon() - if(do_mob(src, H, 30)) + if(do_mob(src, target, 30)) if(t == 1) - reagent_glass.reagents.trans_to_mob(H, injection_amount, CHEM_INJECT) + reagent_glass.reagents.trans_to_mob(target, injection_amount, CHEM_INJECT) else - H.add_to_reagents(t, injection_amount) - visible_message("[src] injects [H] with the syringe!") + target.add_to_reagents(t, injection_amount) + visible_message("[src] injects [target] with the syringe!") busy = 0 update_icon() return TRUE @@ -297,33 +297,34 @@ reagent_glass.forceMove(my_turf) reagent_glass = null -/mob/living/bot/medbot/confirmTarget(var/mob/living/human/H) - if(!..()) - return 0 +/mob/living/bot/medbot/confirmTarget(atom/target) + if(!(. = ..())) + return - if(H.stat == DEAD) // He's dead, Jim - return 0 + var/mob/living/human/patient = target + if(!istype(patient) || patient.stat == DEAD) // He's dead, Jim + return FALSE if(emagged) return treatment_emag // If they're injured, we're using a beaker, and they don't have on of the chems in the beaker - if(reagent_glass && use_beaker && ((H.get_damage(BRUTE) >= heal_threshold) || (H.get_damage(TOX) >= heal_threshold) || (H.get_damage(TOX) >= heal_threshold) || (H.get_damage(OXY) >= (heal_threshold + 15)))) + if(reagent_glass && use_beaker && ((patient.get_damage(BRUTE) >= heal_threshold) || (patient.get_damage(TOX) >= heal_threshold) || (patient.get_damage(TOX) >= heal_threshold) || (patient.get_damage(OXY) >= (heal_threshold + 15)))) for(var/R in reagent_glass.reagents.reagent_volumes) - if(!H.reagents.has_reagent(R)) + if(!patient.reagents.has_reagent(R)) return 1 continue - if((H.get_damage(BRUTE) >= heal_threshold) && (!H.reagents.has_reagent(treatment_brute))) + if((patient.get_damage(BRUTE) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_brute))) return treatment_brute //If they're already medicated don't bother! - if((H.get_damage(OXY) >= (15 + heal_threshold)) && (!H.reagents.has_reagent(treatment_oxy))) + if((patient.get_damage(OXY) >= (15 + heal_threshold)) && (!patient.reagents.has_reagent(treatment_oxy))) return treatment_oxy - if((H.get_damage(BURN) >= heal_threshold) && (!H.reagents.has_reagent(treatment_fire))) + if((patient.get_damage(BURN) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_fire))) return treatment_fire - if((H.get_damage(TOX) >= heal_threshold) && (!H.reagents.has_reagent(treatment_tox))) + if((patient.get_damage(TOX) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_tox))) return treatment_tox /mob/living/bot/medbot/proc/tip_over(mob/user) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index bb9cf31e58e4..c70a617e2c1c 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -178,7 +178,7 @@ target = home targetName = "Home" -/mob/living/bot/mulebot/confirmTarget() +/mob/living/bot/mulebot/confirmTarget(atom/target) return 1 /mob/living/bot/mulebot/calcTargetPath() diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 2e47d627b53a..8d6737b9347a 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -157,10 +157,10 @@ return ..() -/mob/living/bot/secbot/confirmTarget(var/atom/A) +/mob/living/bot/secbot/confirmTarget(atom/target) if(!..()) return 0 - return (check_threat(A) >= SECBOT_THREAT_ARREST) + return (check_threat(target) >= SECBOT_THREAT_ARREST) /mob/living/bot/secbot/lookForTargets() for(var/mob/living/M in view(src)) From bda2770399c4ffc61f5c05a2af3262f95be27016 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 13:50:10 +1100 Subject: [PATCH 68/82] Enables melting of items inside stomachs. --- code/_onclick/click.dm | 5 ----- code/game/objects/items/_item_melting.dm | 26 +++++++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c2d4cfb5862f..4c2f9a9c03b7 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -116,11 +116,6 @@ var/sdepth = A.storage_depth(src) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) if(holding) - - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!(A) || holding != get_active_held_item())) - return TRUE - var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency diff --git a/code/game/objects/items/_item_melting.dm b/code/game/objects/items/_item_melting.dm index d835d7d1c7de..318d8f288231 100644 --- a/code/game/objects/items/_item_melting.dm +++ b/code/game/objects/items/_item_melting.dm @@ -16,16 +16,22 @@ try_burn_wearer(holder, holder.get_equipped_slot_for_item(src)) // Temp gate until generalized temperature-based melting works properly. - if(istype(loc, /obj/item/chems/crucible)) - // Check if this is meltable at all. - var/list/meltable_materials - for(var/mat in matter) - var/decl/material/melt_material = GET_DECL(mat) - if(!isnull(melt_material.melting_point) && temperature >= melt_material.melting_point) - LAZYDISTINCTADD(meltable_materials, melt_material) - if(length(meltable_materials)) - . = null // Don't return PROCESS_KILL here. - handle_melting(meltable_materials) + var/static/list/_melting_containers = list( + /obj/item/chems/crucible, + /obj/item/organ/internal/stomach + ) + if(!is_type_in_list(loc, _melting_containers)) + return + + // Check if this is meltable at all. + var/list/meltable_materials + for(var/mat in matter) + var/decl/material/melt_material = GET_DECL(mat) + if(!isnull(melt_material.melting_point) && temperature >= melt_material.melting_point) + LAZYDISTINCTADD(meltable_materials, melt_material) + if(length(meltable_materials)) + . = null // Don't return PROCESS_KILL here. + handle_melting(meltable_materials) /obj/item/place_melted_product(list/meltable_materials) From e6bc4446f4c1a187edfba2e31fbca319f9d0b672 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 30 Dec 2024 14:46:44 +1100 Subject: [PATCH 69/82] Cleaning up floorbot logic. --- code/modules/mob/living/bot/floorbot.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 23125250d07b..7f0e4f675410 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -122,15 +122,11 @@ if(S.material?.type == /decl/material/solid/metal/steel) return (amount < maxAmount && maketiles) - if(target.loc.name == "Space") - return 0 + var/turf/floor/my_turf = target + if(!istype(my_turf) || (isturf(my_turf) && my_turf.is_open())) + return FALSE - var/turf/floor/T = target - if(istype(T)) - if(emagged) - return 1 - else - return (amount && (T.is_floor_damaged() || (improvefloors && !T.has_flooring()))) + return emagged || (amount && (my_turf.is_floor_damaged() || (improvefloors && !my_turf.has_flooring()))) /mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity) From 07fabaa68293217a8f46130b2c63cf624a99004d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 11:08:30 +1100 Subject: [PATCH 70/82] Ported chicken nuggets from Polaris. --- code/datums/supplypacks/galley.dm | 6 ++ .../objects/items/weapons/storage/nuggets.dm | 63 ++++++++++++++++++ code/modules/food/nuggets.dm | 24 +++++++ icons/obj/food/nuggets/nugget.dmi | Bin 0 -> 313 bytes icons/obj/food/nuggets/nugget_corgi.dmi | Bin 0 -> 318 bytes icons/obj/food/nuggets/nugget_lizard.dmi | Bin 0 -> 319 bytes icons/obj/food/nuggets/nugget_star.dmi | Bin 0 -> 317 bytes icons/obj/items/storage/nugget_box.dmi | Bin 0 -> 818 bytes nebula.dme | 2 + 9 files changed, 95 insertions(+) create mode 100644 code/game/objects/items/weapons/storage/nuggets.dm create mode 100644 code/modules/food/nuggets.dm create mode 100644 icons/obj/food/nuggets/nugget.dmi create mode 100644 icons/obj/food/nuggets/nugget_corgi.dmi create mode 100644 icons/obj/food/nuggets/nugget_lizard.dmi create mode 100644 icons/obj/food/nuggets/nugget_star.dmi create mode 100644 icons/obj/items/storage/nugget_box.dmi diff --git a/code/datums/supplypacks/galley.dm b/code/datums/supplypacks/galley.dm index 5eb7cc9f071e..45c2c05ea161 100644 --- a/code/datums/supplypacks/galley.dm +++ b/code/datums/supplypacks/galley.dm @@ -72,6 +72,12 @@ containername = "pizza crate" supply_method = /decl/supply_method/randomized +/decl/hierarchy/supply_pack/galley/nuggets + name = "Emergency - Nugget crate" + contains = list(/obj/item/box/nuggets = 2) + containertype = /obj/structure/closet/crate/freezer + containername = "nugget crate" + /decl/hierarchy/supply_pack/galley/rations num_contained = 6 name = "Emergency - MREs" diff --git a/code/game/objects/items/weapons/storage/nuggets.dm b/code/game/objects/items/weapons/storage/nuggets.dm new file mode 100644 index 000000000000..3ecc72ce2270 --- /dev/null +++ b/code/game/objects/items/weapons/storage/nuggets.dm @@ -0,0 +1,63 @@ +/datum/storage/box/nuggets + can_hold = list(/obj/item/food/nugget) + var/expected_nugget_count = 10 + +/datum/storage/box/nuggets/New() + max_storage_space = /obj/item/food/nugget::w_class * expected_nugget_count + ..() + +/datum/storage/box/nuggets/twenty + expected_nugget_count = 20 + +/datum/storage/box/nuggets/forty + expected_nugget_count = 40 + +/obj/item/box/nuggets + name = "10-piece nuggets box" + icon = 'icons/obj/items/storage/nugget_box.dmi' + icon_state = "nuggetbox_ten" + desc = "A share pack of golden chicken nuggets in various fun shapes. Rumours of the rare and deadly 'fifth nugget shape' remain unsubstantiated." + storage = /datum/storage/box/nuggets + center_of_mass = @'{"x":16,"y":9}' + +/obj/item/box/nuggets/Initialize(ml, material_key) + . = ..() + update_icon() + +/obj/item/box/nuggets/WillContain() + . = list() + if(istype(storage, /datum/storage/box/nuggets)) + var/datum/storage/box/nuggets/nugget_box = storage + for(var/i = 1 to nugget_box.expected_nugget_count) + . += /obj/item/food/nugget + +/obj/item/box/nuggets/on_update_icon() + var/datum/storage/box/nuggets/nugget_box = storage + if(length(contents) == 0 || !istype(nugget_box)) + icon_state = "[initial(icon_state)]_empty" + else if(length(contents) >= nugget_box.expected_nugget_count) + icon_state = "[initial(icon_state)]_full" + else + icon_state = initial(icon_state) + +// Subtypes below. +/obj/item/box/nuggets/twenty + name = "20-piece nuggets box" + icon_state = "nuggetbox_twenty" + storage = /datum/storage/box/nuggets/twenty + +/obj/item/box/nuggets/twenty/WillContain() + . = list() + for(var/i = 1 to 20) + . += /obj/item/food/nugget + +/obj/item/box/nuggets/twenty/empty/WillContain() + return + +/obj/item/box/nuggets/forty + name = "40-piece nuggets box" + icon_state = "nuggetbox_forty" + storage = /datum/storage/box/nuggets/forty + +/obj/item/box/nuggets/forty/empty/WillContain() + return diff --git a/code/modules/food/nuggets.dm b/code/modules/food/nuggets.dm new file mode 100644 index 000000000000..c2171198fa13 --- /dev/null +++ b/code/modules/food/nuggets.dm @@ -0,0 +1,24 @@ +/obj/item/food/nugget + name = "chicken nugget" + icon = 'icons/obj/food/nuggets/nugget.dmi' + icon_state = ICON_STATE_WORLD + nutriment_desc = "mild battered chicken" + nutriment_amt = 6 + nutriment_type = /decl/material/solid/organic/meat/chicken + material = /decl/material/solid/organic/meat/chicken + bitesize = 3 + var/shape = null + var/static/list/nugget_icons = list( + "lump" = 'icons/obj/food/nuggets/nugget.dmi', + "star" = 'icons/obj/food/nuggets/nugget_star.dmi', + "lizard" = 'icons/obj/food/nuggets/nugget_lizard.dmi', + "corgi" = 'icons/obj/food/nuggets/nugget_corgi.dmi' + ) + +/obj/item/food/nugget/Initialize() + . = ..() + if(isnull(shape)) + shape = pick(nugget_icons) + set_icon(nugget_icons[shape]) + desc = "A chicken nugget vaguely shaped like a [shape]." + add_allergen_flags(ALLERGEN_GLUTEN) // flour diff --git a/icons/obj/food/nuggets/nugget.dmi b/icons/obj/food/nuggets/nugget.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6022a38314e4f5b4f265c566cd2c8a7bb453ad5e GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*JZNKhIfLQlWTlVu z7%o>bJf5v|FpnYL=-ynQ8pe_!zhDN3XE)M-oXo0_h!U67;^d;tf|AVqJO+k}Il*BC zMWx@r1Q&e#`b5iHSL@uF^T8WJ4K5l#c%*aQNAn~@QBUs<3*#W;%f?;`a~@4PGATqM zc%{vL4RzPfZe!KWDsKY8S%?RCbtb;DHAn7=UxjxjMmLC@hd@G@Nnucss0)Y0&K(x4S}T=U4#muAsG7qi zkhX-Ox1i9O!(hX7ZY|BuMHWi}0t`g1X1;mK%Hu4L*JZNKhIfLQjJcfgL z3@;}uoy%eYN-{8(1o;IsI6S+N2IOQ`g+!FNq!uR^WfqiV=I1dmRLltuD<~@c{w28J zc*Y}^>MK*4FYfX9&=91B|l0}O5i+>E%$ zsP{-ige#;;MPbE~B_cU3i=12o0yq=dE(k1GqOd7CreVg>#zYTBhV8q!?T=hP>mdKI;Vst045H0+yDRo literal 0 HcmV?d00001 diff --git a/icons/obj/food/nuggets/nugget_lizard.dmi b/icons/obj/food/nuggets/nugget_lizard.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7eb06bd525ed141241b0779e7e7facefd7e9775f GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*JZNKhIfLQjJcfgL z3`MQJ+ksMyB|(0{3=Yq3qyagZRUr{2E~&-IMVSR9nfZAP3>9;N!wQN@zkdlX`1tjS zmbb3fxija3H-s8oG=A_%=e&>RNrs}H-W?XkLB^Mjy%gp=nsj7Rh(hp6oBbNL*T&`qz(8h2ukKyHH zrI#}pKF(vflo4tSRKQpgeukTAW;zSx}OhpU1#ZF(){zps4iw zm*9erU!Q1s>uQ}lb3S-OsKG_!2aj~l`)HnIDC+6mVPPC(eA(DbVa}sTM<#_R1h2H& zuc7YR*=?-4d4wXA0N{oI+S=Ox|NpCE0EtcjemH(+GiEcH0RPMYmUGIX00001 zbW%=J06^y0W&i*Hn|f4ObVOxyV{&P5bZKvH004NLQ&wU+WT!!Nk?Oj%{36oTlj=5z zCcI8lR&e!m0Y^Uow*R9KN8+mg0006BNklu!TE425x%KnT#i|J%;2>*m`Q zWk!`I`OxyCCw3q}`<+fxC=_~`KH%IK2kggszvJtUOJFtd`BOfQ_3aH`xHB6#eLMnsljO_&367)Uc6?sN z%YFHnT<(WLp-?FF5=rhG{Z;DM3;G@=_gU)@xA_(_x;y3_WC?OSPh&$&kt4ur_b|)ahrR6ksox1 z@cPz+eyJY{g+ihKAPf6OzR~;j27C|kd%xab;~{?U)|&$c_`O@-TSc#rN6^jfy%FNN{9-Jkeoe>#Ck2e>uo1dQLIiFB|m8|81aKlQEt zlpR$%5CH*cT#5U}LqI1`bPpWxy}qV||U>Hf+0yn)l#bgz!k=f7Zr w9j}tOP&A@=eIuXnh~o8s_%6K84~2Ys2i96Vq}~T{D*ylh07*qoM6N<$g38g1nE(I) literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index 1c258d2fd94e..611d89830580 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1369,6 +1369,7 @@ #include "code\game\objects\items\weapons\storage\med_pouch.dm" #include "code\game\objects\items\weapons\storage\misc.dm" #include "code\game\objects\items\weapons\storage\mre.dm" +#include "code\game\objects\items\weapons\storage\nuggets.dm" #include "code\game\objects\items\weapons\storage\parachute.dm" #include "code\game\objects\items\weapons\storage\picnic_basket.dm" #include "code\game\objects\items\weapons\storage\secure.dm" @@ -2439,6 +2440,7 @@ #include "code\modules\fluids\fluid_flood.dm" #include "code\modules\fluids\fluid_mapped.dm" #include "code\modules\food\assembled.dm" +#include "code\modules\food\nuggets.dm" #include "code\modules\food\cooking\_recipe.dm" #include "code\modules\food\cooking\cooking_vessels\_cooking_vessel.dm" #include "code\modules\food\cooking\cooking_vessels\baking_dish.dm" From 5d7c35fa699e9c0fc61359546188eea80d491fb9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 11:53:33 +1100 Subject: [PATCH 71/82] Reworking oil subtypes and lantern fuel. --- code/_helpers/emissive.dm | 3 +- .../game/objects/structures/barrels/barrel.dm | 2 +- code/game/objects/structures/barrels/cask.dm | 2 +- .../butchery/butchery_products_meat_fish.dm | 2 +- .../hydroponics/plant_types/seeds_misc.dm | 14 ++-- code/modules/hydroponics/seed_packets.dm | 2 +- .../living/simple_animal/_simple_animal.dm | 9 ++- .../simple_animal/aquatic/aquatic_fish.dm | 22 +++--- .../aquatic/aquatic_fish_lantern.dm | 26 +++++++ code/modules/mob_holder/_holder.dm | 7 ++ code/modules/organs/internal/_internal.dm | 2 +- code/modules/organs/internal/brain.dm | 4 +- .../modules/reagents/chems/chems_nutriment.dm | 13 ---- code/modules/reagents/chems/chems_oil.dm | 66 ++++++++++++------ .../reagents/reactions/reaction_alcohol.dm | 2 +- .../reagents/reactions/reaction_compounds.dm | 24 +++++++ .../reagents/reactions/reaction_recipe.dm | 2 +- .../reactions/reaction_recipe_food.dm | 2 +- .../reagents/reactions/reaction_synthesis.dm | 16 +++-- .../condiments/condiment_appearance.dm | 2 +- .../real_instruments/Violin/violin.dm | 2 +- icons/mob/simple_animal/fish_cave.dmi | Bin 0 -> 4028 bytes icons/mob/simple_animal/fish_lantern.dmi | Bin 0 -> 5654 bytes maps/shaded_hills/areas/grassland.dm | 4 +- maps/shaded_hills/shaded_hills_map.dm | 2 +- nebula.dme | 1 + 26 files changed, 156 insertions(+), 75 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm create mode 100644 icons/mob/simple_animal/fish_cave.dmi create mode 100644 icons/mob/simple_animal/fish_lantern.dmi diff --git a/code/_helpers/emissive.dm b/code/_helpers/emissive.dm index 4ea0ca7e7cf3..98cde2aadb31 100644 --- a/code/_helpers/emissive.dm +++ b/code/_helpers/emissive.dm @@ -1,5 +1,6 @@ -/proc/emissive_overlay(var/icon, var/icon_state, var/loc, var/dir, var/color) +/proc/emissive_overlay(icon, icon_state, loc, dir, color, flags) var/image/I = image(icon, loc, icon_state, EMISSIVE_LAYER, dir) I.plane = EMISSIVE_PLANE I.color = color + I.appearance_flags |= flags return I diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 4b7f0d2e87c4..b28986d55923 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -110,4 +110,4 @@ /obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/oil, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm index 8a704ad55cf7..d3755dfe55e6 100644 --- a/code/game/objects/structures/barrels/cask.dm +++ b/code/game/objects/structures/barrels/cask.dm @@ -39,4 +39,4 @@ /obj/structure/reagent_dispensers/barrel/cask/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/oil, reagents.maximum_volume) diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index 8361c4af74cf..2ea9678087d0 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -16,7 +16,7 @@ slice_num = 3 butchery_data = /decl/butchery_data/animal/fish allergen_flags = ALLERGEN_FISH - var/oil_type = /decl/material/liquid/nutriment/oil/fish + var/oil_type = /decl/material/liquid/oil/fish var/oil_amount = 2 /obj/item/food/butchery/meat/fish/oily diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index db5d4739d6d9..e98328e4b399 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -4,7 +4,7 @@ display_name = "cotton patch" product_material = /decl/material/solid/organic/plantmatter/pith/husk chems = list( - /decl/material/liquid/nutriment/oil/plant = list(3,10), + /decl/material/liquid/oil/plant = list(3,10), /decl/material/solid/organic/cloth = list(10,1) ) slice_product = null @@ -28,7 +28,7 @@ display_name = "flax patch" // Do we want linseed oil at some point? chems = list( - /decl/material/liquid/nutriment/oil/plant = list(5,12), + /decl/material/liquid/oil/plant = list(5,12), /decl/material/solid/organic/cloth/linen = list(8,1) ) @@ -400,7 +400,7 @@ display_name = "hemp patch" mutants = null chems = list( - /decl/material/liquid/nutriment/oil/plant = list(3,10), + /decl/material/liquid/oil/plant = list(3,10), /decl/material/solid/organic/cloth/hemp = list(8,1), /decl/material/liquid/nutriment = list(1) ) @@ -725,7 +725,7 @@ product_name = "sunflower" display_name = "sunflower patch" chems = list( - /decl/material/liquid/nutriment/oil/plant = list(10,10) + /decl/material/liquid/oil/plant = list(10,10) ) /datum/seed/flower/sunflower/New() @@ -800,7 +800,7 @@ display_name = "peanut vine" chems = list( /decl/material/liquid/nutriment = list(1,10), - /decl/material/liquid/nutriment/oil/plant = list(1,10) + /decl/material/liquid/oil/plant = list(1,10) ) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -890,7 +890,7 @@ name = "corn" product_name = "corn" display_name = "ears of corn" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/nutriment/cornoil = list(1,10)) + 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 @@ -987,7 +987,7 @@ display_name = "soybean patch" chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/nutriment/oil/plant = list(3,20), + /decl/material/liquid/oil/plant = list(3,20), /decl/material/liquid/drink/milk/soymilk = list(7,20) ) grown_tag = "soybeans" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index d9033c86f84a..21efe8deead6 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -26,7 +26,7 @@ /obj/item/seeds/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/oil/plant, 3) + add_to_reagents(/decl/material/liquid/oil/plant, 3) /obj/item/seeds/get_single_monetary_worth() . = seed ? seed.get_monetary_value() : ..() diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 2e1b6d8e3b46..77c479915f82 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -164,16 +164,23 @@ var/global/list/simplemob_icon_bitflag_cache = list() mob_icon_state_flags |= MOB_ICON_HAS_PARALYZED_STATE global.simplemob_icon_bitflag_cache[type] = mob_icon_state_flags +/mob/living/simple_animal/proc/add_additional_visible_overlays(list/accumulator) + return + /mob/living/simple_animal/refresh_visible_overlays() + var/list/add_overlays = list() if(length(draw_visible_overlays)) - var/list/add_overlays = list() for(var/overlay_state in draw_visible_overlays) var/overlay_color = draw_visible_overlays[overlay_state] if(overlay_state == "base") add_overlays += overlay_image(icon, icon_state, overlay_color, RESET_COLOR) else add_overlays += overlay_image(icon, "[icon_state]-[overlay_state]", overlay_color, RESET_COLOR) + + add_additional_visible_overlays(add_overlays) + + if(length(add_overlays)) set_current_mob_overlay(HO_SKIN_LAYER, add_overlays) else set_current_mob_overlay(HO_SKIN_LAYER, null) diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index 7de69b839449..bbd6b916d820 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -16,26 +16,20 @@ name = "small fish" icon = 'icons/mob/simple_animal/fish_grump.dmi' -/mob/living/simple_animal/aquatic/fish/lantern - name = "lantern-fish" - desc = "An oily, glowing fish sometimes caught in cave rivers, rumoured to have cousins in the deep ocean." - // TODO: icon = 'icons/mob/simple_animal/fish_lantern.dmi' - butchery_data = /decl/butchery_data/animal/fish/oily - -/mob/living/simple_animal/aquatic/fish/cave - name = "blind cave fish" - desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." - // TODO: icon = 'icons/mob/simple_animal/fish_cave.dmi' - -/mob/living/simple_animal/aquatic/fish/cave/is_blind() - return TRUE - /mob/living/simple_animal/aquatic/fish/large name = "smallmouth bass" icon = 'icons/mob/simple_animal/fish_judge.dmi' butchery_data = /decl/butchery_data/animal/fish/medium mob_size = MOB_SIZE_SMALL +/mob/living/simple_animal/aquatic/fish/large/cave + name = "blind cave fish" + desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." + icon = 'icons/mob/simple_animal/fish_cave.dmi' + +/mob/living/simple_animal/aquatic/fish/large/cave/is_blind() + return TRUE + /mob/living/simple_animal/aquatic/fish/large/bass name = "largemouth bass" icon = 'icons/mob/simple_animal/fish_bass.dmi' diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm new file mode 100644 index 000000000000..179605c12c9d --- /dev/null +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm @@ -0,0 +1,26 @@ +/mob/living/simple_animal/aquatic/fish/large/lantern + name = "lantern fish" + desc = "An oily, glowing fish. They are sometimes caught in cave rivers, and are rumoured to have cousins in the deep ocean." + icon = 'icons/mob/simple_animal/fish_lantern.dmi' + butchery_data = /decl/butchery_data/animal/fish/oily + holder_type = /obj/item/holder/lanternfish + var/glow_color = COLOR_LIME + var/glow_power = 0.5 + var/glow_range = 2 + +/mob/living/simple_animal/aquatic/fish/large/lantern/Initialize() + . = ..() + set_light(glow_range, glow_power, glow_color) + refresh_visible_overlays() + +/mob/living/simple_animal/aquatic/fish/large/lantern/add_additional_visible_overlays(list/accumulator) + var/glow_state = "[icon_state]-glow" + if(check_state_in_icon(glow_state, icon)) + accumulator += emissive_overlay(icon, glow_state, color = light_color, flags = RESET_COLOR) + +/obj/item/holder/lanternfish/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && (slot in global.all_hand_slots)) + var/glow_state = "[overlay.icon_state]-glow" + if(check_state_in_icon(glow_state, overlay.icon)) + overlay.overlays += emissive_overlay(overlay.icon, glow_state, color = light_color, flags = RESET_COLOR) + return ..() diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index ec0dcd39482f..002814c0c09a 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -132,8 +132,15 @@ return ..() /obj/item/holder/proc/sync(var/mob/living/M) + SetName(M.name) desc = M.desc + + if(QDELETED(src) || QDELETED(M) || !istype(M)) + set_light(0) + else + set_light(M.light_range, M.light_power, M.light_color) + var/mob/living/human/H = loc if(istype(H)) last_holder = H diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index e8e076a057c6..a62006b938d3 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -171,7 +171,7 @@ // We clamp/round here so that we don't accidentally heal past the threshold and // cheat our way into a full second threshold of healing. - damage = clamp(damage - max(0, get_organ_heal_amount() * GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)), min_heal_val, absolute_max_damage) + damage = clamp(damage - max(0, get_organ_heal_amount()), min_heal_val, absolute_max_damage) // If we're within 1 damage of the nearest threshold (such as 0), round us down. // This should be removed when float-aware modulo comes in in 515, but for now is needed diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index a26e424aba86..c4980c3a3034 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -105,7 +105,9 @@ return (!owner || GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) <= 0) && ..() /obj/item/organ/internal/brain/get_organ_heal_amount() - return 1 + if(!has_limited_healing()) + . = 1 // We have full healing, so we always heal at least 1 unit of damage. + . += (owner ? GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) : 0) /obj/item/organ/internal/brain/Process() if(owner) diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 3b5567d3f362..d96d2b840d70 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -296,19 +296,6 @@ boiling_point = 373 allergen_flags = ALLERGEN_FRUIT -/decl/material/liquid/nutriment/cornoil - name = "corn oil" - lore_text = "An oil derived from various types of corn." - taste_description = "slime" - taste_mult = 0.1 - nutriment_factor = 20 - color = "#302000" - slipperiness = 8 - uid = "chem_nutriment_cornoil" - melting_point = 273 - boiling_point = 373 - allergen_flags = ALLERGEN_VEGETABLE - /decl/material/liquid/nutriment/sprinkles name = "sprinkles" lore_text = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." diff --git a/code/modules/reagents/chems/chems_oil.dm b/code/modules/reagents/chems/chems_oil.dm index 5395daacc11c..ad359dd61ca4 100644 --- a/code/modules/reagents/chems/chems_oil.dm +++ b/code/modules/reagents/chems/chems_oil.dm @@ -1,28 +1,52 @@ -/decl/material/liquid/nutriment/oil - abstract_type = /decl/material/liquid/nutriment/oil - burn_product = /decl/material/gas/carbon_monoxide - ignition_point = T0C+150 - accelerant_value = FUEL_VALUE_ACCELERANT - gas_flags = XGM_GAS_FUEL - melting_point = 273 - boiling_point = 373 +/decl/material/liquid/oil + name = "fuel oil" // paraffin etc + lore_text = "Clarified fuel oil, perfect for fuelling a lantern." + burn_product = /decl/material/gas/carbon_monoxide + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT + gas_flags = XGM_GAS_FUEL + melting_point = 273 + boiling_point = 373 + uid = "chem_oil_lamp" + color = "#664330" + value = 1.5 + fishing_bait_value = 0 + taste_mult = 4 + metabolism = REM * 4 + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 + slipperiness = 8 -/decl/material/liquid/nutriment/oil/plant - name = "plant oil" - lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." - uid = "chem_nutriment_plant_oil" - taste_description = "oily blandness" - allergen_flags = ALLERGEN_VEGETABLE +/decl/material/liquid/oil/plant + name = "plant oil" + lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." + uid = "chem_oil_plant" + taste_description = "oily blandness" + allergen_flags = ALLERGEN_VEGETABLE + compost_value = 1 + nutriment_factor = 8 -/decl/material/liquid/nutriment/oil/fish - name = "fish oil" - lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." - uid = "chem_nutriment_fish_oil" - taste_description = "pungent, oily fish" - allergen_flags = ALLERGEN_FISH +/decl/material/liquid/oil/plant/corn + name = "corn oil" + lore_text = "An oil derived from various types of corn." + taste_description = "slime" + nutriment_factor = 20 + color = "#302000" + uid = "chem_oil_corn" + taste_mult = 0.1 + +/decl/material/liquid/oil/fish + name = "fish oil" + lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." + uid = "chem_oil_fish" + taste_description = "pungent, oily fish" + allergen_flags = ALLERGEN_FISH + compost_value = 1 + nutriment_factor = 6 // Copied from neuroannealer; yes, it's silly, but we need a way to treat brain damage on the medieval map. // Should possibly be an ingredient rather than the be-all end-all medication. -/decl/material/liquid/nutriment/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() M.add_chemical_effect(CE_BRAIN_REGEN, 0.5) // Half as effective as neuroannealer, without the side-effects. diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 121c4a9bf2f3..4d96bdb5d128 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -62,7 +62,7 @@ /decl/chemical_reaction/recipe/beer name = "Plain Beer" result = /decl/material/liquid/alcohol/beer - required_reagents = list(/decl/material/liquid/nutriment/cornoil = 10) + required_reagents = list(/decl/material/liquid/oil/plant/corn = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a foaming amber liquid." diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index ea0b51142156..8e530dacaa58 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -158,3 +158,27 @@ /decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) + +// This is a bit silly, but we need a way to unify oil types until someone rewrites lanterns. +/decl/chemical_reaction/compound/fuel_oil + name = "Plant Fuel Oil" + result = /decl/material/liquid/oil + result_amount = 3 + required_reagents = list( + /decl/material/liquid/oil/plant = 2, + /decl/material/solid/graphite = 1 + ) + +/decl/chemical_reaction/compound/fuel_oil/corn + name = "Corn Fuel Oil" + required_reagents = list( + /decl/material/liquid/oil/plant/corn = 2, + /decl/material/solid/graphite = 1 + ) + +/decl/chemical_reaction/compound/fuel_oil/fish + name = "Fish Fuel Oil" + required_reagents = list( + /decl/material/liquid/oil/fish = 2, + /decl/material/solid/graphite = 1 + ) diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index bcd93c0e8af8..a113d821cc58 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -37,7 +37,7 @@ /decl/chemical_reaction/recipe/garlicsauce name = "Garlic Sauce" result = /decl/material/liquid/nutriment/garlicsauce - required_reagents = list(/decl/material/liquid/drink/juice/garlic = 1, /decl/material/liquid/nutriment/cornoil = 1) + required_reagents = list(/decl/material/liquid/drink/juice/garlic = 1, /decl/material/liquid/oil/plant/corn = 1) result_amount = 2 mix_message = "The solution thickens into a creamy white oil." diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index ef99755711d6..bc052960e913 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -58,7 +58,7 @@ name = "Enzyme Margarine" required_reagents = list( /decl/material/solid/sodiumchloride = 1, - /decl/material/liquid/nutriment/oil/plant = 20 + /decl/material/liquid/oil/plant = 20 ) catalysts = list(/decl/material/liquid/enzyme = 5) mix_message = "The solution thickens and curdles into a pale yellow solid." diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index d12783c8f7ad..5c4f5b710f4c 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -126,11 +126,11 @@ new /obj/item/stack/medical/resin/crafted(T, create_stacks) /decl/chemical_reaction/synthesis/soap - name = "Handmade Soap" + name = "Handmade Plant Soap" required_reagents = list( - /decl/material/solid/carbon/ashes = 5, - /decl/material/liquid/water = 5, - /decl/material/liquid/nutriment/oil/plant = 10 + /decl/material/solid/carbon/ashes = 5, + /decl/material/liquid/water = 5, + /decl/material/liquid/oil/plant = 10 ) result_amount = 1 mix_message = "The solution thickens and solidifies." @@ -147,6 +147,14 @@ for(var/i = 1 to create_soap) new /obj/item/soap/crafted(T) +/decl/chemical_reaction/synthesis/soap/corn + name = "Handmade Corn Soap" + required_reagents = list( + /decl/material/solid/carbon/ashes = 5, + /decl/material/liquid/water = 5, + /decl/material/liquid/oil/plant/corn = 10 + ) + // Making chipboard out of wood scraps/recycled wood. /decl/chemical_reaction/synthesis/chipboard name = "Oak Chipboard" diff --git a/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm b/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm index b534f6bc812c..4236c1867544 100644 --- a/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm +++ b/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm @@ -75,7 +75,7 @@ condiment_center_of_mass = @'{"x":16,"y":8}' /decl/condiment_appearance/cornoil - condiment_type = /decl/material/liquid/nutriment/cornoil + condiment_type = /decl/material/liquid/oil/plant/corn condiment_name = "corn oil" condiment_desc = "A delicious oil used in cooking. Made from corn." condiment_icon = 'icons/obj/food/condiments/cornoil.dmi' diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index f3baab9aa07c..0e08f5bfd164 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -12,4 +12,4 @@ matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) /obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) - return !(src && in_range(src, user)) \ No newline at end of file + return !(src && in_range(src, user)) diff --git a/icons/mob/simple_animal/fish_cave.dmi b/icons/mob/simple_animal/fish_cave.dmi new file mode 100644 index 0000000000000000000000000000000000000000..40e1f162f86382302d12e99368da340644ca121f GIT binary patch literal 4028 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 a3CU{Ct)kTBgn`#_kcR40NV$q-*uMZdFNsJ1 literal 0 HcmV?d00001 diff --git a/icons/mob/simple_animal/fish_lantern.dmi b/icons/mob/simple_animal/fish_lantern.dmi new file mode 100644 index 0000000000000000000000000000000000000000..eea9923c6d45211bedfbf06a955ac40695f270a2 GIT binary patch literal 5654 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 B+V21W literal 0 HcmV?d00001 diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 3fa264b43926..9b7de6659e1b 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -54,8 +54,8 @@ sound_env = CAVE area_flags = AREA_FLAG_IS_BACKGROUND fishing_results = list( - /mob/living/simple_animal/aquatic/fish/cave = 13 - /mob/living/simple_animal/aquatic/fish/lantern = 7 + /mob/living/simple_animal/aquatic/fish/large/cave = 13, + /mob/living/simple_animal/aquatic/fish/large/lantern = 7, /obj/item/mollusc = 5, /obj/item/mollusc/barnacle/fished = 5, /obj/item/mollusc/clam/fished/pearl = 3, diff --git a/maps/shaded_hills/shaded_hills_map.dm b/maps/shaded_hills/shaded_hills_map.dm index 0b545c07a61c..09bf988942e0 100644 --- a/maps/shaded_hills/shaded_hills_map.dm +++ b/maps/shaded_hills/shaded_hills_map.dm @@ -1,5 +1,5 @@ /datum/map/shaded_hills - default_liquid_fuel_type = /decl/material/liquid/nutriment/oil/plant + default_liquid_fuel_type = /decl/material/liquid/oil default_species = SPECIES_KOBALOI loadout_categories = list( /decl/loadout_category/fantasy/clothing, diff --git a/nebula.dme b/nebula.dme index dcafae477c0b..d2e41d9119a2 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3024,6 +3024,7 @@ #include "code\modules\mob\living\simple_animal\aquatic\_aquatic_retaliate.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_carp.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" +#include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish_lantern.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" From 37dcd2ca5760bf9beb9502cb37986c923342d422 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 15:28:57 -0500 Subject: [PATCH 72/82] Rename code files with spaces in their name --- .../uplink/{devices and tools.dm => devices_and_tools.dm} | 0 .../ZAS/{Variable Settings.dm => VariableSettings.dm} | 0 .../keycard_authentication.dm | 0 nebula.dme | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename code/datums/uplink/{devices and tools.dm => devices_and_tools.dm} (100%) rename code/modules/ZAS/{Variable Settings.dm => VariableSettings.dm} (100%) rename code/modules/{security levels => security_levels}/keycard_authentication.dm (100%) diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices_and_tools.dm similarity index 100% rename from code/datums/uplink/devices and tools.dm rename to code/datums/uplink/devices_and_tools.dm diff --git a/code/modules/ZAS/Variable Settings.dm b/code/modules/ZAS/VariableSettings.dm similarity index 100% rename from code/modules/ZAS/Variable Settings.dm rename to code/modules/ZAS/VariableSettings.dm diff --git a/code/modules/security levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm similarity index 100% rename from code/modules/security levels/keycard_authentication.dm rename to code/modules/security_levels/keycard_authentication.dm diff --git a/nebula.dme b/nebula.dme index c08cae0b5a94..2c7c6835f1d0 100644 --- a/nebula.dme +++ b/nebula.dme @@ -693,7 +693,7 @@ #include "code\datums\underwear\underwear.dm" #include "code\datums\uplink\ammunition.dm" #include "code\datums\uplink\badassery.dm" -#include "code\datums\uplink\devices and tools.dm" +#include "code\datums\uplink\devices_and_tools.dm" #include "code\datums\uplink\grenades.dm" #include "code\datums\uplink\hardsuit_modules.dm" #include "code\datums\uplink\highly_visible_and_dangerous_weapons.dm" @@ -3738,7 +3738,7 @@ #include "code\modules\sealant_gun\sealant_injector.dm" #include "code\modules\sealant_gun\sealant_rack.dm" #include "code\modules\sealant_gun\sealant_tank.dm" -#include "code\modules\security levels\keycard_authentication.dm" +#include "code\modules\security_levels\keycard_authentication.dm" #include "code\modules\shield_generators\floor_diffuser.dm" #include "code\modules\shield_generators\handheld_diffuser.dm" #include "code\modules\shield_generators\modes.dm" @@ -4002,7 +4002,7 @@ #include "code\modules\ZAS\Diagnostic.dm" #include "code\modules\ZAS\Fire.dm" #include "code\modules\ZAS\Turf.dm" -#include "code\modules\ZAS\Variable Settings.dm" +#include "code\modules\ZAS\VariableSettings.dm" #include "code\modules\ZAS\Zone.dm" #include "code\procs\announce.dm" #include "code\procs\dbcore.dm" From 75945001df749d15895e349117e5269a09f477e6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 15:31:08 -0500 Subject: [PATCH 73/82] Rename asset files with spaces in their path --- code/datums/music_tracks/europa.dm | 2 +- .../{Martian Cowboy.ogg => MartianCowboy.ogg} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename sound/music/europa/{Martian Cowboy.ogg => MartianCowboy.ogg} (100%) diff --git a/code/datums/music_tracks/europa.dm b/code/datums/music_tracks/europa.dm index ccbc948eda00..b1b050118ba0 100644 --- a/code/datums/music_tracks/europa.dm +++ b/code/datums/music_tracks/europa.dm @@ -8,7 +8,7 @@ /decl/music_track/martiancowboy artist = "Kevin MacLeod" title = "Martian Cowboy" - song = 'sound/music/europa/Martian Cowboy.ogg' + song = 'sound/music/europa/MartianCowboy.ogg' license = /decl/license/cc_by_3_0 url = "https://incompetech.com/music/royalty-free/index.html?isrc=usuan1100349" diff --git a/sound/music/europa/Martian Cowboy.ogg b/sound/music/europa/MartianCowboy.ogg similarity index 100% rename from sound/music/europa/Martian Cowboy.ogg rename to sound/music/europa/MartianCowboy.ogg From 570908975268471779955f45a8d8df346af19042 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 15:32:26 -0500 Subject: [PATCH 74/82] Move security levels into security levels module folder --- code/datums/security_state.dm | 335 ------------------ .../security_levels/_security_level.dm | 48 +++ .../security_levels/alarm_appearance.dm | 61 ++++ .../security_levels/security_levels.dm | 93 +++++ .../modules/security_levels/security_state.dm | 134 +++++++ nebula.dme | 5 +- 6 files changed, 340 insertions(+), 336 deletions(-) delete mode 100644 code/datums/security_state.dm create mode 100644 code/modules/security_levels/_security_level.dm create mode 100644 code/modules/security_levels/alarm_appearance.dm create mode 100644 code/modules/security_levels/security_levels.dm create mode 100644 code/modules/security_levels/security_state.dm diff --git a/code/datums/security_state.dm b/code/datums/security_state.dm deleted file mode 100644 index 1863d4ae8601..000000000000 --- a/code/datums/security_state.dm +++ /dev/null @@ -1,335 +0,0 @@ -/decl/security_state - abstract_type = /decl/security_state - // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() - - var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. - var/decl/security_level/high_security_level // At which security level (and higher) transfer votes are disabled, ERT may be requested, and other similar high alert implications. Defaults to the second to last entry in all_security_levels if unset. - // All security levels within the above convention: Low, Guarded, Elevated, High, Severe - - - // Under normal conditions the crew may not raise the current security level higher than the highest_standard_security_level - // The crew may also not adjust the security level once it is above the highest_standard_security_level. - // Defaults to the second to last entry in all_security_levels if unset/null. - // Set to FALSE/0 if there should be no restrictions. - var/decl/security_level/highest_standard_security_level - - var/decl/security_level/current_security_level // The current security level. Defaults to the first entry in all_security_levels if unset. - var/decl/security_level/stored_security_level // The security level that we are escalating to high security from - we will return to this level once we choose to revert. - var/list/all_security_levels // List of all available security levels - var/list/standard_security_levels // List of all normally selectable security levels - var/list/comm_console_security_levels // List of all selectable security levels for the command and communication console - basically standard_security_levels - 1 - -/decl/security_state/Initialize() - - . = ..() - - // Setup the severe security level - if(!(severe_security_level in all_security_levels)) - severe_security_level = all_security_levels[all_security_levels.len] - severe_security_level = GET_DECL(severe_security_level) - - // Setup the high security level - if(!(high_security_level in all_security_levels)) - high_security_level = all_security_levels[all_security_levels.len - 1] - high_security_level = GET_DECL(high_security_level) - - // Setup the highest standard security level - if(highest_standard_security_level || isnull(highest_standard_security_level)) - if(!(highest_standard_security_level in all_security_levels)) - highest_standard_security_level = all_security_levels[all_security_levels.len - 1] - highest_standard_security_level = GET_DECL(highest_standard_security_level) - else - highest_standard_security_level = null - - // Setup the current security level - if(current_security_level in all_security_levels) - current_security_level = GET_DECL(current_security_level) - else - current_security_level = GET_DECL(all_security_levels[1]) - - // Setup the full list of available security levels now that we no longer need to use "x in all_security_levels" - var/list/security_level_instances = list() - for(var/security_level_type in all_security_levels) - security_level_instances += GET_DECL(security_level_type) - all_security_levels = security_level_instances - - standard_security_levels = list() - // Setup the list of normally selectable security levels - for(var/security_level in all_security_levels) - standard_security_levels += security_level - if(security_level == highest_standard_security_level) - break - - comm_console_security_levels = list() - // Setup the list of selectable security levels available in the comm. console - for(var/security_level in all_security_levels) - if(security_level == highest_standard_security_level) - break - comm_console_security_levels += security_level - - // Now we ensure the high security level is not above the severe one (but we allow them to be equal) - var/severe_index = all_security_levels.Find(severe_security_level) - var/high_index = all_security_levels.Find(high_security_level) - if(high_index > severe_index) - high_security_level = severe_security_level - - // Finally switch up to the default starting security level. - current_security_level.switching_up_to() - -/decl/security_state/proc/can_change_security_level() - return current_security_level in standard_security_levels - -/decl/security_state/proc/can_switch_to(var/given_security_level) - if(!can_change_security_level()) - return FALSE - return given_security_level in standard_security_levels - -/decl/security_state/proc/current_security_level_is_lower_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index < given_index - -/decl/security_state/proc/current_security_level_is_same_or_higher_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index >= given_index - -/decl/security_state/proc/current_security_level_is_higher_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index > given_index - -/decl/security_state/proc/set_security_level(var/decl/security_level/new_security_level, var/force_change = FALSE) - if(new_security_level == current_security_level) - return FALSE - if(!(new_security_level in all_security_levels)) - return FALSE - if(!force_change && !can_switch_to(new_security_level)) - return FALSE - - var/decl/security_level/previous_security_level = current_security_level - current_security_level = new_security_level - - var/previous_index = all_security_levels.Find(previous_security_level) - var/new_index = all_security_levels.Find(new_security_level) - - if(new_index > previous_index) - previous_security_level.switching_up_from() - new_security_level.switching_up_to() - else - previous_security_level.switching_down_from() - new_security_level.switching_down_to() - - log_and_message_admins("has changed the security level from [previous_security_level.name] to [new_security_level.name].") - return TRUE - -// This proc decreases the current security level, if possible -/decl/security_state/proc/decrease_security_level(var/force_change = FALSE) - var/current_index = all_security_levels.Find(current_security_level) - if(current_index == 1) - return FALSE - return set_security_level(all_security_levels[current_index - 1], force_change) - -/decl/security_level - var/icon - var/name - - // These values are primarily for station alarms and status displays, and which light colors and overlays to use - var/light_range - var/light_power - var/light_color_alarm - var/light_color_class - var/light_color_status_display - - var/up_description - var/down_description - - var/datum/alarm_appearance/alarm_appearance - - abstract_type = /decl/security_level - -/decl/security_level/Initialize() - . = ..() - if(ispath(alarm_appearance, /datum/alarm_appearance)) - alarm_appearance = new alarm_appearance - -/decl/security_level/validate() - . = ..() - var/initial_appearance = initial(alarm_appearance) - if(!initial_appearance) - . += "alarm_appearance was not set" - else if(!ispath(initial_appearance)) - . += "alarm_appearance was not set to a /datum/alarm_appearance subpath" - else if(!istype(alarm_appearance, /datum/alarm_appearance)) - . += "alarm_appearance creation failed (check runtimes?)" - -// Called when we're switching from a lower security level to this one. -/decl/security_level/proc/switching_up_to() - return - -// Called when we're switching from a higher security level to this one. -/decl/security_level/proc/switching_down_to() - return - -// Called when we're switching from this security level to a higher one. -/decl/security_level/proc/switching_up_from() - return - -// Called when we're switching from this security level to a lower one. -/decl/security_level/proc/switching_down_from() - return - -/* -* The default security state and levels setup -*/ -/decl/security_state/default - all_security_levels = list(/decl/security_level/default/code_green, /decl/security_level/default/code_blue, /decl/security_level/default/code_red, /decl/security_level/default/code_delta) - -/decl/security_level/default - abstract_type = /decl/security_level/default - icon = 'icons/misc/security_state.dmi' - - var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) - var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) - -/decl/security_level/default/switching_up_to() - if(up_description) - security_announcement_up.Announce(up_description, "Attention! Alert level elevated to [name]!") - notify_station() - -/decl/security_level/default/switching_down_to() - if(down_description) - security_announcement_down.Announce(down_description, "Attention! Alert level changed to [name]!") - notify_station() - -/decl/security_level/default/proc/notify_station() - for(var/obj/machinery/firealarm/FA in SSmachines.machinery) - if(isContactLevel(FA.z)) - FA.update_icon() - post_status("alert") - -/decl/security_level/default/code_green - name = "code green" - - light_range = 2 - light_power = 1 - - light_color_alarm = COLOR_GREEN - light_color_class = "font_green" - light_color_status_display = COLOR_GREEN - - - alarm_appearance = /datum/alarm_appearance/green - - down_description = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - -/decl/security_level/default/code_blue - name = "code blue" - - light_range = 2 - light_power = 1 - light_color_alarm = COLOR_BLUE - light_color_class = "font_blue" - light_color_status_display = COLOR_BLUE - - alarm_appearance = /datum/alarm_appearance/blue - - up_description = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." - down_description = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." - -/decl/security_level/default/code_red - name = "code red" - - light_range = 4 - light_power = 2 - light_color_alarm = COLOR_RED - light_color_class = "font_red" - light_color_status_display = COLOR_RED - - alarm_appearance = /datum/alarm_appearance/red - - up_description = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - down_description = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - -/decl/security_level/default/code_delta - name = "code delta" - - light_range = 4 - light_power = 2 - light_color_alarm = COLOR_RED - light_color_class = "font_red" - light_color_status_display = COLOR_RED - - alarm_appearance = /datum/alarm_appearance/delta - - - var/static/datum/announcement/priority/security/security_announcement_delta = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/effects/siren.ogg')) - -/decl/security_level/default/code_delta/switching_up_to() - security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") - notify_station() - -/datum/alarm_appearance - var/display_icon //The icon_state for the displays. Normally only one is used, unless uses_twotone_displays is TRUE. - var/display_icon_color //The color for the display icon. - - var/display_icon_twotone //Used for two-tone displays. - var/display_icon_twotone_color //The color for the display icon. - - var/display_emblem //The icon_state for the emblem, i.e for delta, a radstorm, alerts. - var/display_emblem_color //The color for the emblem. - - var/alarm_icon //The icon_state for the alarms - var/alarm_icon_color //the color for the icon_state - - var/alarm_icon_twotone //Used for two-tone alarms (i.e delta). - var/alarm_icon_twotone_color //The color for the secondary tone icon. - -/datum/alarm_appearance/green - display_icon = "status_display_lines" - display_icon_color = PIPE_COLOR_GREEN - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_normal" - alarm_icon_color = PIPE_COLOR_GREEN - -/datum/alarm_appearance/blue - display_icon = "status_display_lines" - display_icon_color = COLOR_BLUE - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_normal" - alarm_icon_color = COLOR_BLUE - -/datum/alarm_appearance/red - display_icon = "status_display_lines" - display_icon_color = COLOR_RED - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_blinking" - alarm_icon_color = COLOR_RED - -/datum/alarm_appearance/delta - display_icon = "status_display_twotone1" - display_icon_color = COLOR_RED - - display_icon_twotone = "status_display_twotone2" - display_icon_twotone_color = COLOR_YELLOW - - display_emblem = "delta" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_blinking_twotone1" - alarm_icon_color = COLOR_RED - - alarm_icon_twotone = "alarm_blinking_twotone2" - alarm_icon_twotone_color = PIPE_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/security_levels/_security_level.dm b/code/modules/security_levels/_security_level.dm new file mode 100644 index 000000000000..ea9d88b442a4 --- /dev/null +++ b/code/modules/security_levels/_security_level.dm @@ -0,0 +1,48 @@ +/decl/security_level + var/icon + var/name + + // These values are primarily for station alarms and status displays, and which light colors and overlays to use + var/light_range + var/light_power + var/light_color_alarm + var/light_color_class + var/light_color_status_display + + var/up_description + var/down_description + + var/datum/alarm_appearance/alarm_appearance + + abstract_type = /decl/security_level + +/decl/security_level/Initialize() + . = ..() + if(ispath(alarm_appearance, /datum/alarm_appearance)) + alarm_appearance = new alarm_appearance + +/decl/security_level/validate() + . = ..() + var/initial_appearance = initial(alarm_appearance) + if(!initial_appearance) + . += "alarm_appearance was not set" + else if(!ispath(initial_appearance)) + . += "alarm_appearance was not set to a /datum/alarm_appearance subpath" + else if(!istype(alarm_appearance, /datum/alarm_appearance)) + . += "alarm_appearance creation failed (check runtimes?)" + +// Called when we're switching from a lower security level to this one. +/decl/security_level/proc/switching_up_to() + return + +// Called when we're switching from a higher security level to this one. +/decl/security_level/proc/switching_down_to() + return + +// Called when we're switching from this security level to a higher one. +/decl/security_level/proc/switching_up_from() + return + +// Called when we're switching from this security level to a lower one. +/decl/security_level/proc/switching_down_from() + return \ No newline at end of file diff --git a/code/modules/security_levels/alarm_appearance.dm b/code/modules/security_levels/alarm_appearance.dm new file mode 100644 index 000000000000..494158a60393 --- /dev/null +++ b/code/modules/security_levels/alarm_appearance.dm @@ -0,0 +1,61 @@ +/datum/alarm_appearance + var/display_icon //The icon_state for the displays. Normally only one is used, unless uses_twotone_displays is TRUE. + var/display_icon_color //The color for the display icon. + + var/display_icon_twotone //Used for two-tone displays. + var/display_icon_twotone_color //The color for the display icon. + + var/display_emblem //The icon_state for the emblem, i.e for delta, a radstorm, alerts. + var/display_emblem_color //The color for the emblem. + + var/alarm_icon //The icon_state for the alarms + var/alarm_icon_color //the color for the icon_state + + var/alarm_icon_twotone //Used for two-tone alarms (i.e delta). + var/alarm_icon_twotone_color //The color for the secondary tone icon. + +/datum/alarm_appearance/green + display_icon = "status_display_lines" + display_icon_color = PIPE_COLOR_GREEN + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_normal" + alarm_icon_color = PIPE_COLOR_GREEN + +/datum/alarm_appearance/blue + display_icon = "status_display_lines" + display_icon_color = COLOR_BLUE + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_normal" + alarm_icon_color = COLOR_BLUE + +/datum/alarm_appearance/red + display_icon = "status_display_lines" + display_icon_color = COLOR_RED + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_blinking" + alarm_icon_color = COLOR_RED + +/datum/alarm_appearance/delta + display_icon = "status_display_twotone1" + display_icon_color = COLOR_RED + + display_icon_twotone = "status_display_twotone2" + display_icon_twotone_color = COLOR_YELLOW + + display_emblem = "delta" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_blinking_twotone1" + alarm_icon_color = COLOR_RED + + alarm_icon_twotone = "alarm_blinking_twotone2" + alarm_icon_twotone_color = PIPE_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm new file mode 100644 index 000000000000..a1825bd9be85 --- /dev/null +++ b/code/modules/security_levels/security_levels.dm @@ -0,0 +1,93 @@ +/// The default security state used on most space maps. +/decl/security_state/default + all_security_levels = list( + /decl/security_level/default/code_green, + /decl/security_level/default/code_blue, + /decl/security_level/default/code_red, + /decl/security_level/default/code_delta + ) + +/// An abstract security level type that supports announcements on level change. +/decl/security_level/default + abstract_type = /decl/security_level/default + icon = 'icons/misc/security_state.dmi' + + var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) + var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) + +/decl/security_level/default/switching_up_to() + if(up_description) + security_announcement_up.Announce(up_description, "Attention! Alert level elevated to [name]!") + notify_station() + +/decl/security_level/default/switching_down_to() + if(down_description) + security_announcement_down.Announce(down_description, "Attention! Alert level changed to [name]!") + notify_station() + +/decl/security_level/default/proc/notify_station() + for(var/obj/machinery/firealarm/FA in SSmachines.machinery) + if(isContactLevel(FA.z)) + FA.update_icon() + post_status("alert") + +/decl/security_level/default/code_green + name = "code green" + + light_range = 2 + light_power = 1 + + light_color_alarm = COLOR_GREEN + light_color_class = "font_green" + light_color_status_display = COLOR_GREEN + + + alarm_appearance = /datum/alarm_appearance/green + + down_description = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + +/decl/security_level/default/code_blue + name = "code blue" + + light_range = 2 + light_power = 1 + light_color_alarm = COLOR_BLUE + light_color_class = "font_blue" + light_color_status_display = COLOR_BLUE + + alarm_appearance = /datum/alarm_appearance/blue + + up_description = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." + down_description = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." + +/decl/security_level/default/code_red + name = "code red" + + light_range = 4 + light_power = 2 + light_color_alarm = COLOR_RED + light_color_class = "font_red" + light_color_status_display = COLOR_RED + + alarm_appearance = /datum/alarm_appearance/red + + up_description = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + down_description = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + +/decl/security_level/default/code_delta + name = "code delta" + + light_range = 4 + light_power = 2 + light_color_alarm = COLOR_RED + light_color_class = "font_red" + light_color_status_display = COLOR_RED + + alarm_appearance = /datum/alarm_appearance/delta + + + var/static/datum/announcement/priority/security/security_announcement_delta = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/effects/siren.ogg')) + +/decl/security_level/default/code_delta/switching_up_to() + security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") + notify_station() \ No newline at end of file diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm new file mode 100644 index 000000000000..0f115f8c57b6 --- /dev/null +++ b/code/modules/security_levels/security_state.dm @@ -0,0 +1,134 @@ +/decl/security_state + abstract_type = /decl/security_state + // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() + + var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. + var/decl/security_level/high_security_level // At which security level (and higher) transfer votes are disabled, ERT may be requested, and other similar high alert implications. Defaults to the second to last entry in all_security_levels if unset. + // All security levels within the above convention: Low, Guarded, Elevated, High, Severe + + + // Under normal conditions the crew may not raise the current security level higher than the highest_standard_security_level + // The crew may also not adjust the security level once it is above the highest_standard_security_level. + // Defaults to the second to last entry in all_security_levels if unset/null. + // Set to FALSE/0 if there should be no restrictions. + var/decl/security_level/highest_standard_security_level + + var/decl/security_level/current_security_level // The current security level. Defaults to the first entry in all_security_levels if unset. + var/decl/security_level/stored_security_level // The security level that we are escalating to high security from - we will return to this level once we choose to revert. + var/list/all_security_levels // List of all available security levels + var/list/standard_security_levels // List of all normally selectable security levels + var/list/comm_console_security_levels // List of all selectable security levels for the command and communication console - basically standard_security_levels - 1 + +/decl/security_state/Initialize() + + . = ..() + + // Setup the severe security level + if(!(severe_security_level in all_security_levels)) + severe_security_level = all_security_levels[all_security_levels.len] + severe_security_level = GET_DECL(severe_security_level) + + // Setup the high security level + if(!(high_security_level in all_security_levels)) + high_security_level = all_security_levels[all_security_levels.len - 1] + high_security_level = GET_DECL(high_security_level) + + // Setup the highest standard security level + if(highest_standard_security_level || isnull(highest_standard_security_level)) + if(!(highest_standard_security_level in all_security_levels)) + highest_standard_security_level = all_security_levels[all_security_levels.len - 1] + highest_standard_security_level = GET_DECL(highest_standard_security_level) + else + highest_standard_security_level = null + + // Setup the current security level + if(current_security_level in all_security_levels) + current_security_level = GET_DECL(current_security_level) + else + current_security_level = GET_DECL(all_security_levels[1]) + + // Setup the full list of available security levels now that we no longer need to use "x in all_security_levels" + var/list/security_level_instances = list() + for(var/security_level_type in all_security_levels) + security_level_instances += GET_DECL(security_level_type) + all_security_levels = security_level_instances + + standard_security_levels = list() + // Setup the list of normally selectable security levels + for(var/security_level in all_security_levels) + standard_security_levels += security_level + if(security_level == highest_standard_security_level) + break + + comm_console_security_levels = list() + // Setup the list of selectable security levels available in the comm. console + for(var/security_level in all_security_levels) + if(security_level == highest_standard_security_level) + break + comm_console_security_levels += security_level + + // Now we ensure the high security level is not above the severe one (but we allow them to be equal) + var/severe_index = all_security_levels.Find(severe_security_level) + var/high_index = all_security_levels.Find(high_security_level) + if(high_index > severe_index) + high_security_level = severe_security_level + + // Finally switch up to the default starting security level. + current_security_level.switching_up_to() + +/decl/security_state/proc/can_change_security_level() + return current_security_level in standard_security_levels + +/decl/security_state/proc/can_switch_to(var/given_security_level) + if(!can_change_security_level()) + return FALSE + return given_security_level in standard_security_levels + +/decl/security_state/proc/current_security_level_is_lower_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index < given_index + +/decl/security_state/proc/current_security_level_is_same_or_higher_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index >= given_index + +/decl/security_state/proc/current_security_level_is_higher_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index > given_index + +/decl/security_state/proc/set_security_level(var/decl/security_level/new_security_level, var/force_change = FALSE) + if(new_security_level == current_security_level) + return FALSE + if(!(new_security_level in all_security_levels)) + return FALSE + if(!force_change && !can_switch_to(new_security_level)) + return FALSE + + var/decl/security_level/previous_security_level = current_security_level + current_security_level = new_security_level + + var/previous_index = all_security_levels.Find(previous_security_level) + var/new_index = all_security_levels.Find(new_security_level) + + if(new_index > previous_index) + previous_security_level.switching_up_from() + new_security_level.switching_up_to() + else + previous_security_level.switching_down_from() + new_security_level.switching_down_to() + + log_and_message_admins("has changed the security level from [previous_security_level.name] to [new_security_level.name].") + return TRUE + +// This proc decreases the current security level, if possible +/decl/security_state/proc/decrease_security_level(var/force_change = FALSE) + var/current_index = all_security_levels.Find(current_security_level) + if(current_index == 1) + return FALSE + return set_security_level(all_security_levels[current_index - 1], force_change) diff --git a/nebula.dme b/nebula.dme index 2c7c6835f1d0..324850fd28f7 100644 --- a/nebula.dme +++ b/nebula.dme @@ -349,7 +349,6 @@ #include "code\datums\mutable_appearance.dm" #include "code\datums\position_point_vector.dm" #include "code\datums\progressbar.dm" -#include "code\datums\security_state.dm" #include "code\datums\sound_player.dm" #include "code\datums\suit_sensor_jammer_method.dm" #include "code\datums\sun.dm" @@ -3738,7 +3737,11 @@ #include "code\modules\sealant_gun\sealant_injector.dm" #include "code\modules\sealant_gun\sealant_rack.dm" #include "code\modules\sealant_gun\sealant_tank.dm" +#include "code\modules\security_levels\_security_level.dm" +#include "code\modules\security_levels\alarm_appearance.dm" #include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" +#include "code\modules\security_levels\security_state.dm" #include "code\modules\shield_generators\floor_diffuser.dm" #include "code\modules\shield_generators\handheld_diffuser.dm" #include "code\modules\shield_generators\modes.dm" From 62365c50efa42f0ea827451b37984ca6ac6228de Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 19:22:27 -0500 Subject: [PATCH 75/82] Disable security state on Shaded Hills --- code/modules/mob/new_player/login.dm | 11 +++++------ code/modules/security_levels/_security_level.dm | 2 +- code/modules/security_levels/security_levels.dm | 16 ++++++++++++++-- code/modules/security_levels/security_state.dm | 2 ++ maps/shaded_hills/shaded_hills_define.dm | 1 + 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 6951ec383e30..6c3a0d04adaf 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -36,12 +36,11 @@ show_lobby_menu(TRUE) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) - var/decl/security_level/SL = security_state.current_security_level - var/alert_desc = "" - if(SL.up_description) - alert_desc = SL.up_description - - to_chat(src, SPAN_NOTICE("The alert level on the [station_name()] is currently: [SL.name]. [alert_desc]")) + if(security_state?.show_on_login) + var/decl/security_level/SL = security_state.current_security_level + // todo: allow maps to oevrride this string for things like the fantasy map being on high alert? + // eg "The alert level *in* Karzerfeste Keep is currently high alert." or "Karzerfeste Keep is currently on high alert." + to_chat(src, SPAN_NOTICE("The alert level on the [station_name()] is currently: [SL.name]. [SL?.up_description]")) // bolds the changelog button on the interface so we know there are updates. if(client.prefs?.lastchangelog != global.changelog_hash) diff --git a/code/modules/security_levels/_security_level.dm b/code/modules/security_levels/_security_level.dm index ea9d88b442a4..ca4ba811c82f 100644 --- a/code/modules/security_levels/_security_level.dm +++ b/code/modules/security_levels/_security_level.dm @@ -1,5 +1,5 @@ /decl/security_level - var/icon + var/icon = 'icons/misc/security_state.dmi' var/name // These values are primarily for station alarms and status displays, and which light colors and overlays to use diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index a1825bd9be85..186fd37fbbe7 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -10,7 +10,6 @@ /// An abstract security level type that supports announcements on level change. /decl/security_level/default abstract_type = /decl/security_level/default - icon = 'icons/misc/security_state.dmi' var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) @@ -90,4 +89,17 @@ /decl/security_level/default/code_delta/switching_up_to() security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") - notify_station() \ No newline at end of file + notify_station() + +// The following are dummy states and levels to soft-disable security levels on some maps. +/// A security state used for maps that don't have security levels exposed to players. +/decl/security_state/none + all_security_levels = list( + /decl/security_level/none + ) + +/// A dummy security level with no effects. +/decl/security_level/none + name = "none" + // Since currently we're required to have an alarm_appearance, we just use a blank one. + alarm_appearance = /datum/alarm_appearance \ No newline at end of file diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm index 0f115f8c57b6..dfc0c78a94c2 100644 --- a/code/modules/security_levels/security_state.dm +++ b/code/modules/security_levels/security_state.dm @@ -1,5 +1,7 @@ /decl/security_state abstract_type = /decl/security_state + /// Whether or not security level information should be shown to new players on login. + var/show_on_login = TRUE // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. diff --git a/maps/shaded_hills/shaded_hills_define.dm b/maps/shaded_hills/shaded_hills_define.dm index 757f99488262..6266ab2a09e4 100644 --- a/maps/shaded_hills/shaded_hills_define.dm +++ b/maps/shaded_hills/shaded_hills_define.dm @@ -31,6 +31,7 @@ 'sound/music/Miris-Magic-Dance.ogg' ) game_year = -914 // in 2024, the year should be 1110, roughly a century after the fall of the Imperial Aegis + security_state = /decl/security_state/none char_preview_bgstate_options = list( "000", From 8be56cccfa49f3810e4571435ccd64ddeeea0d49 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 19:44:04 -0500 Subject: [PATCH 76/82] Move inertial dampener into a modpack --- code/datums/supplypacks/engineering.dm | 7 --- code/modules/events/event_container.dm | 1 - .../imprinter/designs_misc_circuits.dm | 3 -- .../overmap/ships/computers/engine_control.dm | 23 ++++++--- code/modules/overmap/ships/ship.dm | 19 -------- maps/modpack_testing/modpack_testing.dm | 1 + mods/content/inertia/_inertia.dm | 3 ++ mods/content/inertia/_inertia.dme | 13 ++++++ .../content/inertia/fabrication.dm | 5 +- .../inertia/icons}/inertial_damper.dmi | Bin mods/content/inertia/inertia_controller.dm | 24 ++++++++++ .../content/inertia/inertia_failure.dm | 11 +++++ .../content/inertia}/inertial_damper.dm | 35 ++++---------- mods/content/inertia/ship_inertia.dm | 44 ++++++++++++++++++ mods/content/inertia/supplies.dm | 6 +++ .../content/inertia/wires.dm | 9 ++-- nebula.dme | 4 -- 17 files changed, 135 insertions(+), 73 deletions(-) create mode 100644 mods/content/inertia/_inertia.dm create mode 100644 mods/content/inertia/_inertia.dme rename code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm => mods/content/inertia/fabrication.dm (80%) rename {icons/obj/machines => mods/content/inertia/icons}/inertial_damper.dmi (100%) create mode 100644 mods/content/inertia/inertia_controller.dm rename code/modules/events/inertial_damper.dm => mods/content/inertia/inertia_failure.dm (78%) rename {code/modules/inertial_damper => mods/content/inertia}/inertial_damper.dm (88%) create mode 100644 mods/content/inertia/ship_inertia.dm create mode 100644 mods/content/inertia/supplies.dm rename code/datums/wires/inertial_damper.dm => mods/content/inertia/wires.dm (71%) diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index 91b8006a1945..3c771acd1e42 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -155,13 +155,6 @@ containername = "shield generator construction kit crate" access = access_engine -/decl/hierarchy/supply_pack/engineering/inertial_damper - name = "Equipment - inertial damper construction kit" - contains = list(/obj/item/stock_parts/circuitboard/inertial_damper, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/console_screen) - containertype = /obj/structure/closet/crate/secure - containername = "inertial damper construction kit crate" - access = access_engine - /decl/hierarchy/supply_pack/engineering/smbig name = "Power - Supermatter core" contains = list(/obj/machinery/power/supermatter) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 97dc8f97f3ff..2e0256a4706b 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -157,7 +157,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 10, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 10)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 10)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Inertial Damper Recalibration", /datum/event/inertial_damper, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_COMPUTER = 50, ASSIGNMENT_ROBOT = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)), new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 20)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)), diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index c817352197fe..44f481a550c0 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -467,9 +467,6 @@ /datum/fabricator_recipe/imprinter/circuit/long_range_relay path = /obj/item/stock_parts/circuitboard/relay/long_range -/datum/fabricator_recipe/imprinter/circuit/inertial_damper - path = /obj/item/stock_parts/circuitboard/inertial_damper - /datum/fabricator_recipe/imprinter/circuit/docking_beacon path = /obj/item/stock_parts/circuitboard/docking_beacon diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index a62b7258705a..f7f37fcb3467 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -6,6 +6,21 @@ icon_screen = "engines" var/display_state = "status" +/// A stub used for modpacks to modify per-ship readout information. +/// This mutates the UI data list, so it can be used to mask or remove features +/// as well as to add entirely new ones. +/// It does not return a value. +/// While it can access per-engine data, it should be dispreferred for that compared to modify_engine_ui_data(). +/obj/machinery/computer/ship/engines/proc/modify_ship_ui_data(list/ui_data) + return + +/// A stub used for modpacks to modify per-engine readout information. +/// This mutates the engine's data list, so it can be used to mask or remove features +/// as well as to add entirely new ones. +/// It does not return a value. +/obj/machinery/computer/ship/engines/proc/modify_engine_ui_data(datum/extension/ship_engine/engine, list/engine_data) + return + /obj/machinery/computer/ship/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!linked) display_reconnect_dialog(user, "ship control systems") @@ -29,17 +44,13 @@ var/thrust = E.get_exhaust_velocity() total_thrust += thrust rdata["eng_thrust"] = "[thrust] m/s" + modify_engine_ui_data(E, rdata) enginfo.Add(list(rdata)) data["engines_info"] = enginfo data["total_thrust"] = "[total_thrust] m/s" - var/damping_strength = 0 - for(var/datum/ship_inertial_damper/I in linked.inertial_dampers) - var/obj/machinery/inertial_damper/ID = I.holder - damping_strength += ID.get_damping_strength(FALSE) - data["damping_strength"] = damping_strength - data["needs_dampers"] = linked.needs_dampers + modify_ship_ui_data(data) ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index f4f1a734c884..133c506ffa63 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -19,9 +19,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) var/skill_needed = SKILL_ADEPT //piloting skill needed to steer it without going in random dir var/operator_skill - var/needs_dampers = FALSE - var/list/inertial_dampers = list() - var/damping_strength = null var/vessel_size = SHIP_SIZE_LARGE // arbitrary number, affects how likely are we to evade meteors var/list/navigation_viewers // list of weakrefs to people viewing the overmap via this ship @@ -85,15 +82,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) /obj/effect/overmap/visitable/ship/adjust_speed(n_x, n_y) . = ..() - var/magnitude = norm(n_x, n_y) - var/inertia_dir = magnitude >= 0 ? turn(fore_dir, 180) : fore_dir - var/inertia_strength = magnitude * 1e3 - if(needs_dampers && damping_strength < inertia_strength) - var/list/areas_by_name = area_repository.get_areas_by_z_level() - for(var/area_name in areas_by_name) - var/area/A = areas_by_name[area_name] - if(area_belongs_to_zlevels(A, map_z)) - A.throw_unbuckled_occupants(inertia_strength+2, inertia_strength, inertia_dir) for(var/zz in map_z) if(is_still()) toggle_move_stars(zz) @@ -119,10 +107,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) return round(num_burns / burns_per_grid) /obj/effect/overmap/visitable/ship/Process(wait, tick) - damping_strength = 0 - for(var/datum/ship_inertial_damper/I in inertial_dampers) - var/obj/machinery/inertial_damper/ID = I.holder - damping_strength += ID.get_damping_strength(TRUE) sensor_visibility = min(round(base_sensor_visibility + get_speed_sensor_increase(), 1), 100) /obj/effect/overmap/visitable/ship/on_update_icon() @@ -181,9 +165,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) for(var/datum/extension/ship_engine/E in global.ship_engines) if(check_ownership(E.holder)) engines |= E - for(var/datum/ship_inertial_damper/I in global.ship_inertial_dampers) - if(check_ownership(I.holder)) - inertial_dampers |= I var/v_mass = recalculate_vessel_mass() if(v_mass) vessel_mass = v_mass diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index de68e49bc7bd..f94fbbc844c8 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -29,6 +29,7 @@ #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/content/inertia/_inertia.dme" #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" diff --git a/mods/content/inertia/_inertia.dm b/mods/content/inertia/_inertia.dm new file mode 100644 index 000000000000..97bee4de9a0f --- /dev/null +++ b/mods/content/inertia/_inertia.dm @@ -0,0 +1,3 @@ +/decl/modpack/inertia + name = "Ship Inertia Content" + desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." \ No newline at end of file diff --git a/mods/content/inertia/_inertia.dme b/mods/content/inertia/_inertia.dme new file mode 100644 index 000000000000..2407851eca30 --- /dev/null +++ b/mods/content/inertia/_inertia.dme @@ -0,0 +1,13 @@ +#ifndef MODPACK_SHIP_INERTIA +#define MODPACK_SHIP_INERTIA +// BEGIN_INCLUDE +#include "_inertia.dm" +#include "fabrication.dm" +#include "inertia_controller.dm" +#include "inertia_failure.dm" +#include "inertial_damper.dm" +#include "ship_inertia.dm" +#include "supplies.dm" +#include "wires.dm" +// END_INCLUDE +#endif diff --git a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm b/mods/content/inertia/fabrication.dm similarity index 80% rename from code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm rename to mods/content/inertia/fabrication.dm index 3bf3f65219e2..72a1837b5137 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm +++ b/mods/content/inertia/fabrication.dm @@ -10,4 +10,7 @@ /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1, /obj/item/stock_parts/power/apc/buildable = 1 - ) \ No newline at end of file + ) + +/datum/fabricator_recipe/imprinter/circuit/inertial_damper + path = /obj/item/stock_parts/circuitboard/inertial_damper diff --git a/icons/obj/machines/inertial_damper.dmi b/mods/content/inertia/icons/inertial_damper.dmi similarity index 100% rename from icons/obj/machines/inertial_damper.dmi rename to mods/content/inertia/icons/inertial_damper.dmi diff --git a/mods/content/inertia/inertia_controller.dm b/mods/content/inertia/inertia_controller.dm new file mode 100644 index 000000000000..6b020a67b60c --- /dev/null +++ b/mods/content/inertia/inertia_controller.dm @@ -0,0 +1,24 @@ +/// A list of all inertial dampers in existence. This is only used for assigning them to ships at roundstart. +var/global/list/ship_inertial_dampers = list() + +/datum/ship_inertial_damper + var/name = "ship inertial damper" + var/obj/machinery/holder + +/datum/ship_inertial_damper/proc/get_damping_strength(var/reliable) + return 0 + +/datum/ship_inertial_damper/New(var/obj/machinery/_holder) + ..() + holder = _holder + global.ship_inertial_dampers += src + +/datum/ship_inertial_damper/Destroy() + global.ship_inertial_dampers -= src + // This may need some future optimization for servers with lots of ships. + // Just track what ship we're assigned to somehow, and then use that here. + // You'd also have to register it to clear that ref if/when the ship object is destroyed. + for(var/obj/effect/overmap/visitable/ship/S in SSshuttle.ships) + S.inertial_dampers -= src + holder = null + . = ..() \ No newline at end of file diff --git a/code/modules/events/inertial_damper.dm b/mods/content/inertia/inertia_failure.dm similarity index 78% rename from code/modules/events/inertial_damper.dm rename to mods/content/inertia/inertia_failure.dm index e8d145859674..ce7d147f7709 100644 --- a/code/modules/events/inertial_damper.dm +++ b/mods/content/inertia/inertia_failure.dm @@ -1,7 +1,18 @@ +// TODO: This should either be removed, or reworked to announce to specifically only the affected ship or its associated map. /datum/event/inertial_damper announceWhen = 5 check_proc = /proc/inertial_dampener_event_can_fire +/datum/event_container/moderate/New() + ..() + available_events += new /datum/event_meta( + EVENT_LEVEL_MODERATE, + "Inertial Damper Recalibration", + /datum/event/inertial_damper, + 75, + list(ASSIGNMENT_ENGINEER = 25) + ) + /datum/event/inertial_damper/setup() endWhen = rand(45, 120) diff --git a/code/modules/inertial_damper/inertial_damper.dm b/mods/content/inertia/inertial_damper.dm similarity index 88% rename from code/modules/inertial_damper/inertial_damper.dm rename to mods/content/inertia/inertial_damper.dm index 60eea5160441..4cb9905a95ce 100644 --- a/code/modules/inertial_damper/inertial_damper.dm +++ b/mods/content/inertia/inertial_damper.dm @@ -1,28 +1,6 @@ -#define WARNING_DELAY 80 //seconds between warnings. -var/global/list/ship_inertial_dampers = list() - -/datum/ship_inertial_damper - var/name = "ship inertial damper" - var/obj/machinery/holder - -/datum/ship_inertial_damper/proc/get_damping_strength(var/reliable) - return 0 - -/datum/ship_inertial_damper/New(var/obj/machinery/_holder) - ..() - holder = _holder - global.ship_inertial_dampers += src - -/datum/ship_inertial_damper/Destroy() - global.ship_inertial_dampers -= src - for(var/obj/effect/overmap/visitable/ship/S in SSshuttle.ships) - S.inertial_dampers -= src - holder = null - . = ..() - /obj/machinery/inertial_damper name = "inertial damper" - icon = 'icons/obj/machines/inertial_damper.dmi' + icon = 'mods/content/inertia/icons/inertial_damper.dmi' desc = "An inertial damper, a very large machine that balances against engine thrust to prevent harm to the crew." density = TRUE icon_state = "damper_on" @@ -67,6 +45,9 @@ var/global/list/ship_inertial_dampers = list() var/width = 3 var/height = 2 + /// The cooldown between announcements that the inertial damping system is off. + var/const/WARNING_DELAY = 8 SECONDS + /obj/machinery/inertial_damper/Initialize() . = ..() SetBounds() @@ -117,8 +98,10 @@ var/global/list/ship_inertial_dampers = list() /obj/machinery/inertial_damper/proc/is_on() return active -/obj/machinery/inertial_damper/proc/get_damping_strength(var/reliable) - if(hacked && !reliable) +/// Returns either the true damping strength including modifiers (include_modifiers == TRUE), +/// or just the value the damper is set to (include_modifiers == FALSE). +/obj/machinery/inertial_damper/proc/get_damping_strength(var/include_modifiers) + if(hacked && !include_modifiers) return initial(damping_strength) return damping_strength + damping_modifier @@ -203,5 +186,3 @@ var/global/list/ship_inertial_dampers = list() /obj/machinery/inertial_damper/dismantle() if((. = ..())) update_nearby_tiles(locs) - -#undef WARNING_DELAY \ No newline at end of file diff --git a/mods/content/inertia/ship_inertia.dm b/mods/content/inertia/ship_inertia.dm new file mode 100644 index 000000000000..d903ef02aa14 --- /dev/null +++ b/mods/content/inertia/ship_inertia.dm @@ -0,0 +1,44 @@ +/obj/effect/overmap/visitable/ship + /// Whether or not this ship throws mobs on acceleration if dampers are inactive. + var/needs_dampers = FALSE + /// A list of inertial damping controller datums associated with this ship. + var/list/datum/ship_inertial_damper/inertial_dampers = list() + /// The current damping strength from all inertial dampers, recalculated every tick in the ship's Process(). + var/tmp/damping_strength = null + +/obj/effect/overmap/visitable/ship/populate_sector_objects() + ..() + for(var/datum/ship_inertial_damper/I in global.ship_inertial_dampers) + if(check_ownership(I.holder)) + inertial_dampers |= I + +// Theoretically there's no need to recalculate this every tick, +// instead it should be recalculated any time damping strength changes +// based only on the damper that changed. +/obj/effect/overmap/visitable/ship/Process(wait, tick) + . = ..() + damping_strength = 0 + for(var/datum/ship_inertial_damper/I in inertial_dampers) + var/obj/machinery/inertial_damper/ID = I.holder + damping_strength += ID.get_damping_strength(TRUE) + +/obj/effect/overmap/visitable/ship/adjust_speed(n_x, n_y) + . = ..() + var/magnitude = norm(n_x, n_y) + var/inertia_dir = magnitude >= 0 ? turn(fore_dir, 180) : fore_dir + var/inertia_strength = magnitude * 1e3 + if(needs_dampers && damping_strength < inertia_strength) + var/list/areas_by_name = area_repository.get_areas_by_z_level() + for(var/area_name in areas_by_name) + var/area/A = areas_by_name[area_name] + if(area_belongs_to_zlevels(A, map_z)) + A.throw_unbuckled_occupants(inertia_strength+2, inertia_strength, inertia_dir) + +// Add additional data to the engine console. +/obj/machinery/computer/ship/engines/modify_ship_ui_data(list/ui_data) + var/damping_strength = 0 + for(var/datum/ship_inertial_damper/inertia_controller in linked.inertial_dampers) + var/obj/machinery/inertial_damper/damper = inertia_controller.holder + damping_strength += damper.get_damping_strength(FALSE) // get only the level it's set to, not the actual level + ui_data["damping_strength"] = damping_strength + ui_data["needs_dampers"] = linked.needs_dampers \ No newline at end of file diff --git a/mods/content/inertia/supplies.dm b/mods/content/inertia/supplies.dm new file mode 100644 index 000000000000..fbe975ab7cb9 --- /dev/null +++ b/mods/content/inertia/supplies.dm @@ -0,0 +1,6 @@ +/decl/hierarchy/supply_pack/engineering/inertial_damper + name = "Equipment - inertial damper construction kit" + contains = list(/obj/item/stock_parts/circuitboard/inertial_damper, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/console_screen) + containertype = /obj/structure/closet/crate/secure + containername = "inertial damper construction kit crate" + access = access_engine \ No newline at end of file diff --git a/code/datums/wires/inertial_damper.dm b/mods/content/inertia/wires.dm similarity index 71% rename from code/datums/wires/inertial_damper.dm rename to mods/content/inertia/wires.dm index 4ea708f73bec..4cc74f8bc941 100644 --- a/code/datums/wires/inertial_damper.dm +++ b/mods/content/inertia/wires.dm @@ -7,11 +7,10 @@ new /datum/wire_description(DAMPER_WIRE_CONTROL, "This wire connects to the main control panel."), new /datum/wire_description(DAMPER_WIRE_AICONTROL, "This wire connects to automated control systems.") ) - -var/global/const/DAMPER_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore. -var/global/const/DAMPER_WIRE_HACK = 2 // Pulse to hack the dampener, causing false display on engine consoles. Cut to unhack. Mend does nothing. -var/global/const/DAMPER_WIRE_CONTROL = 4 // Cut to lock controls. Mend to unlock them. Pulse does nothing. -var/global/const/DAMPER_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore. + var/const/DAMPER_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore. + var/const/DAMPER_WIRE_HACK = 2 // Pulse to hack the dampener, causing false display on engine consoles. Cut to unhack. Mend does nothing. + var/const/DAMPER_WIRE_CONTROL = 4 // Cut to lock controls. Mend to unlock them. Pulse does nothing. + var/const/DAMPER_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore. /datum/wires/inertial_damper/CanUse() var/obj/machinery/inertial_damper/I = holder diff --git a/nebula.dme b/nebula.dme index 324850fd28f7..5272f7674a01 100644 --- a/nebula.dme +++ b/nebula.dme @@ -720,7 +720,6 @@ #include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\fabricator.dm" -#include "code\datums\wires\inertial_damper.dm" #include "code\datums\wires\nuclearbomb.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\radio.dm" @@ -1286,7 +1285,6 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\forensic.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\holomap.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\household.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\inertial_damper.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\medical.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining.dm" @@ -2336,7 +2334,6 @@ #include "code\modules\events\event_dynamic.dm" #include "code\modules\events\gravity.dm" #include "code\modules\events\grid_check.dm" -#include "code\modules\events\inertial_damper.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\location_event.dm" @@ -2599,7 +2596,6 @@ #include "code\modules\hydroponics\trays\tray_soil.dm" #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\inertial_damper\inertial_damper.dm" #include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\_electronics.dm" #include "code\modules\integrated_electronics\core\analyzer.dm" From 20f95d633b5bd10464bbff91b270828746d79395 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 19:46:00 -0500 Subject: [PATCH 77/82] Allow modpacks to include NanoUI template folders --- .../subsystems/initialization/modpacks.dm | 1 + code/modules/client/asset_cache.dm | 41 +++++++++++++------ mods/_modpack.dm | 11 +++++ mods/content/inertia/_inertia.dm | 3 +- .../nano_templates}/inertial_damper.tmpl | 0 nano/templates/engines_control.tmpl | 2 + scripts/server.sh | 2 +- 7 files changed, 46 insertions(+), 14 deletions(-) rename {nano/templates => mods/content/inertia/nano_templates}/inertial_damper.tmpl (100%) diff --git a/code/controllers/subsystems/initialization/modpacks.dm b/code/controllers/subsystems/initialization/modpacks.dm index 5fad4ec549cb..f2f6c65a2e69 100644 --- a/code/controllers/subsystems/initialization/modpacks.dm +++ b/code/controllers/subsystems/initialization/modpacks.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(modpacks) // Compiled modpack information. var/list/default_submap_whitelisted_species = list() var/list/default_submap_blacklisted_species = list(SPECIES_ALIEN, SPECIES_GOLEM) + var/list/modpack_nanoui_directories = list() /datum/controller/subsystem/modpacks/Initialize() var/list/all_modpacks = decls_repository.get_decls_of_subtype(/decl/modpack) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 8e8c90860c46..d582783e0912 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -185,7 +185,7 @@ var/global/template_file_name = "all_templates.json" if(fexists(path + filename)) register_asset(filename, fcopy_rsc(path + filename)) - merge_and_register_templates() + merge_and_register_all_templates() var/list/mapnames = list() for(var/z in SSmapping.map_levels) @@ -199,13 +199,18 @@ var/global/template_file_name = "all_templates.json" common[filename] = fcopy_rsc(file_path) register_asset(filename, common[filename]) -/datum/asset/nanoui/proc/merge_and_register_templates() - var/list/templates = flist(template_dir) - for(var/filename in templates) - if(copytext(filename, length(filename)) != "/") - templates[filename] = replacetext(replacetext(file2text(template_dir + filename), "\n", ""), "\t", "") - else - templates -= filename +/datum/asset/nanoui/proc/merge_and_register_all_templates() + . = merge_templates(template_dir) + . += merge_modpack_templates() + register_templates(.) + +/datum/asset/nanoui/proc/merge_modpack_templates() + PRIVATE_PROC(TRUE) + . = list() + for(var/mod_template_dir in SSmodpacks.modpack_nanoui_directories) + . += merge_templates(mod_template_dir) + +/datum/asset/nanoui/proc/register_templates(templates) var/full_file_name = template_temp_dir + global.template_file_name if(fexists(full_file_name)) fdel(file(full_file_name)) @@ -213,6 +218,17 @@ var/global/template_file_name = "all_templates.json" to_file(template_file, json_encode(templates)) register_asset(global.template_file_name, fcopy_rsc(template_file)) +/// Handles adding a directory's templates to the compiled templates list. +/datum/asset/nanoui/proc/merge_templates(use_dir) + PRIVATE_PROC(TRUE) + var/list/templates = flist(use_dir) + for(var/filename in templates) + if(copytext(filename, length(filename)) != "/") + templates[filename] = replacetext(replacetext(file2text(use_dir + filename), "\n", ""), "\t", "") + else + templates -= filename + return templates + /datum/asset/nanoui/send(client, uncommon) if(!islist(uncommon)) uncommon = list(uncommon) @@ -223,11 +239,12 @@ var/global/template_file_name = "all_templates.json" // Note: this is intended for dev work, and is unsafe. Do not use outside of that. /datum/asset/nanoui/proc/recompute_and_resend_templates() - merge_and_register_templates() + merge_and_register_all_templates() for(var/client/C in clients) - if(C) // there are sleeps here, potentially - send_asset(C, global.template_file_name, FALSE, FALSE) - to_chat(C, SPAN_WARNING("Nanoui templates have been updated. Please close and reopen any browser windows.")) + spawn() // there are sleeps here, potentially + if(C) + send_asset(C, global.template_file_name, FALSE, FALSE) + to_chat(C, SPAN_WARNING("Nanoui templates have been updated. Please close and reopen any browser windows.")) /client/proc/resend_nanoui_templates() set category = "Debug" diff --git a/mods/_modpack.dm b/mods/_modpack.dm index 1e8accdf3061..81c16e69f7a0 100644 --- a/mods/_modpack.dm +++ b/mods/_modpack.dm @@ -6,6 +6,8 @@ /// A string with authors of this modpack. var/author var/secrets_directory + /// The folder to load additional NanoUI templates from. Must be relative to the DME's location (root game folder). + var/nanoui_directory var/list/dreams //! A list of strings to be added to the random dream proc. var/list/credits_other //! A list of strings that are used by the end of round credits roll. @@ -32,6 +34,15 @@ if(!fexists(secrets_directory)) return "Modpack secrets_directory does not exist." SSsecrets.load_directories |= secrets_directory + if(nanoui_directory) + nanoui_directory = trim(lowertext(nanoui_directory)) + if(!length(nanoui_directory)) + return "Modpack nanoui_directory is zero length after trim." + if(copytext(nanoui_directory, -1) != "/") + nanoui_directory = "[nanoui_directory]/" + if(!fexists(nanoui_directory)) + return "Modpack nanoui_directory does not exist." + SSmodpacks.modpack_nanoui_directories |= nanoui_directory /decl/modpack/proc/initialize() return diff --git a/mods/content/inertia/_inertia.dm b/mods/content/inertia/_inertia.dm index 97bee4de9a0f..585525241f16 100644 --- a/mods/content/inertia/_inertia.dm +++ b/mods/content/inertia/_inertia.dm @@ -1,3 +1,4 @@ /decl/modpack/inertia name = "Ship Inertia Content" - desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." \ No newline at end of file + desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." + nanoui_directory = "mods/content/inertia/nano_templates/" \ No newline at end of file diff --git a/nano/templates/inertial_damper.tmpl b/mods/content/inertia/nano_templates/inertial_damper.tmpl similarity index 100% rename from nano/templates/inertial_damper.tmpl rename to mods/content/inertia/nano_templates/inertial_damper.tmpl diff --git a/nano/templates/engines_control.tmpl b/nano/templates/engines_control.tmpl index 4df88e86014b..c9ec27c77c73 100644 --- a/nano/templates/engines_control.tmpl +++ b/nano/templates/engines_control.tmpl @@ -29,6 +29,8 @@ {{:data.total_thrust}} + + {{if data.needs_dampers}}
diff --git a/scripts/server.sh b/scripts/server.sh index b65b6b33d166..bc89d45b7c41 100755 --- a/scripts/server.sh +++ b/scripts/server.sh @@ -63,7 +63,7 @@ while [[ ! -e stopserver ]]; do cp "$GITDIR/$DME.rsc" . cp -r "$GITDIR/nano" . # Necessary for NanoUI cp -r "$GITDIR/maps" . # Necessary for runtime submap loading - cp -r "$GITDIR/mods" . # Also necessary for runtime submap loading. TODO: a better solution + cp -r "$GITDIR/mods" . # Also necessary for runtime submap and NanoUI loading. TODO: a better solution? [[ ! -e btime.so && -e "$GITDIR/btime.so" ]] && cp "$GITDIR/btime.so" . [[ ! -e .git/logs ]] && mkdir -p .git/logs cp "$GITDIR/.git/HEAD" ./.git/HEAD From ae35726b6f8356bffad45908c7026bdccbc0466b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 1 Jan 2025 00:51:08 -0500 Subject: [PATCH 78/82] Fix runtime from security states with fewer than two levels --- code/modules/security_levels/security_state.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm index dfc0c78a94c2..2e997845d411 100644 --- a/code/modules/security_levels/security_state.dm +++ b/code/modules/security_levels/security_state.dm @@ -32,13 +32,13 @@ // Setup the high security level if(!(high_security_level in all_security_levels)) - high_security_level = all_security_levels[all_security_levels.len - 1] + high_security_level = all_security_levels[max(1, all_security_levels.len - 1)] high_security_level = GET_DECL(high_security_level) // Setup the highest standard security level if(highest_standard_security_level || isnull(highest_standard_security_level)) if(!(highest_standard_security_level in all_security_levels)) - highest_standard_security_level = all_security_levels[all_security_levels.len - 1] + highest_standard_security_level = all_security_levels[max(1, all_security_levels.len - 1)] highest_standard_security_level = GET_DECL(highest_standard_security_level) else highest_standard_security_level = null From 15239692021c8a7430db9d49235e0ec3cd48d055 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 2 Jan 2025 12:33:14 +1100 Subject: [PATCH 79/82] Automatic changelog generation for PR #4677 [ci skip] --- html/changelogs/AutoChangeLog-pr-4677.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4677.yml diff --git a/html/changelogs/AutoChangeLog-pr-4677.yml b/html/changelogs/AutoChangeLog-pr-4677.yml new file mode 100644 index 000000000000..81f376b535af --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4677.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered + graphite first.} +delete-after: true From 8dec28a7db45109a2088e19d8577ae91a1c479e5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 31 May 2024 19:47:54 -0400 Subject: [PATCH 80/82] Add a hack for interior ambience and multiz daycycle --- code/controllers/subsystems/ambience.dm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/ambience.dm b/code/controllers/subsystems/ambience.dm index ad9d2a1c52b4..757f846c6402 100644 --- a/code/controllers/subsystems/ambience.dm +++ b/code/controllers/subsystems/ambience.dm @@ -63,10 +63,23 @@ SUBSYSTEM_DEF(ambience) // Grab what we need to set ambient light from our level handler. var/datum/level_data/level_data = SSmapping.levels_by_z[z] + var/daycycle_id = level_data.daycycle_id + // if we don't have a daycycle ourselves, and we're indoors because of a turf blocking us + // find the first daycycle above us to use + if(!outsideness && !daycycle_id && HasAbove(z)) + var/turf/above = src + var/datum/level_data/above_level_data + while ((above = GetAbove(above))) + if((above.z_flags & ZM_TERMINATOR) || !HasAbove(above.z)) + break + above_level_data = SSmapping.levels_by_z[above.z] + if(above_level_data.daycycle_id) + daycycle_id = above_level_data.daycycle_id + break // Check for daycycle ambience. - if(level_data.daycycle_id) - var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(level_data.daycycle_id) + if(daycycle_id) + var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(daycycle_id) var/new_power = daycycle?.current_period?.power if(!isnull(new_power)) if(new_power > 0) From 7e1d5459952c5747e7264a1c644d0c917ba2133c Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 3 Jan 2025 00:50:18 +0000 Subject: [PATCH 81/82] Automatic changelog generation [ci skip] --- html/changelog.html | 12 ++++++------ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-4677.yml | 5 ----- 3 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4677.yml diff --git a/html/changelog.html b/html/changelog.html index b64a9c790dac..e3ca34984821 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

03 January 2025

+

MistakeNot4892 updated:

+
    +
  • Raw plant oil no longer works as lantern fuel; it must be mixed with powdered graphite first.
  • +
+

23 December 2024

ophelia v0.8 updated:

    @@ -100,12 +106,6 @@

    Neerti updated:

  • Microlasers added to mining drills no longer multiply ore out of the ground, but make the drill mine faster, proportionally increasing the energy usage.
  • Capacitors added to mining drills are less powerful.
- -

01 November 2024

-

MistakeNot4892 updated:

-
    -
  • Curries, soups and stews have been rewritten, please refer to the codex for recipes.
  • -
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9e2102536fb4..894f308ccdbc 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14941,3 +14941,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - imageadd: added new dirt and mud tile sprites - imageadd: added new wooden chest sprites, by Doe - tweak: mud and soil plots are now properly greyscaled to soil material color +2025-01-03: + MistakeNot4892: + - tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered + graphite first. diff --git a/html/changelogs/AutoChangeLog-pr-4677.yml b/html/changelogs/AutoChangeLog-pr-4677.yml deleted file mode 100644 index 81f376b535af..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4677.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered - graphite first.} -delete-after: true From 832bb325f4394038f5c5880379883ad57c56bc03 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 00:44:27 +1100 Subject: [PATCH 82/82] Updating karzerfeste oil type. --- maps/karzerfeste/karzerfeste_map.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps/karzerfeste/karzerfeste_map.dm b/maps/karzerfeste/karzerfeste_map.dm index 463853f3e3d5..b4aeefa3f615 100644 --- a/maps/karzerfeste/karzerfeste_map.dm +++ b/maps/karzerfeste/karzerfeste_map.dm @@ -1,5 +1,5 @@ /datum/map/karzerfeste - default_liquid_fuel_type = /decl/material/liquid/nutriment/plant_oil + default_liquid_fuel_type = /decl/material/liquid/oil loadout_categories = list( /decl/loadout_category/fantasy/clothing, /decl/loadout_category/fantasy/utility