diff --git a/.github/workflows/build_rust.yml b/.github/workflows/build_rust.yml index ea3cf500eab5..de2c3208b0f8 100644 --- a/.github/workflows/build_rust.yml +++ b/.github/workflows/build_rust.yml @@ -83,7 +83,7 @@ jobs: cp target/i686-pc-windows-gnu/release/rustlibs.dll ../rustlibs.dll # Build the para-specific version - RUSTFLAGS='-C target-cpu=raptorlake' cargo build --release --target=i686-pc-windows-gnu + RUSTFLAGS='-C target-cpu=znver5' cargo build --release --target=i686-pc-windows-gnu cp target/i686-pc-windows-gnu/release/rustlibs.dll ../rustlibs_prod.dll git commit -a -m "Build Rust library" --allow-empty diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c726084c96da..e1e76bf8a3ae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: python -m tools.maplint.source --github - name: Setup .NET SDK - uses: actions/setup-dotnet@v4.2.0 + uses: actions/setup-dotnet@v4.3.0 with: dotnet-version: 9.x @@ -75,7 +75,7 @@ jobs: run: | bash tools/ci/setup_od.sh - name: Setup .NET SDK - uses: actions/setup-dotnet@v4.2.0 + uses: actions/setup-dotnet@v4.3.0 with: dotnet-version: 9.x - name: Run OD diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 38ab7a7b2951..a31a5d9d7580 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -33,7 +33,7 @@ /turf/simulated/floor/wood/lavaland_air, /area/ruin/powered/pizza_party) "j" = ( -/obj/item/food/mushroompizzaslice, +/obj/item/food/sliced/mushroom_pizza, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating/lavaland_air, /area/ruin/powered/pizza_party) @@ -144,13 +144,13 @@ /area/ruin/powered/pizza_party) "D" = ( /obj/structure/table/wood, -/obj/item/food/margheritapizzaslice, +/obj/item/food/sliced/margherita_pizza, /obj/item/trash/plate, /turf/simulated/floor/wood/lavaland_air, /area/ruin/powered/pizza_party) "E" = ( /obj/structure/table/wood, -/obj/item/food/meatpizzaslice, +/obj/item/food/sliced/meat_pizza, /turf/simulated/floor/wood/lavaland_air, /area/ruin/powered/pizza_party) "F" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_engi_sat.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_engi_sat.dmm index 4f68f3035fe6..9fcd2da8a0cc 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_engi_sat.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_engi_sat.dmm @@ -194,6 +194,10 @@ /obj/effect/mapping_helpers/turfs/burn, /turf/simulated/floor/plating, /area/ruin/space/abandoned_engi_sat) +"fs" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord, +/turf/simulated/floor/wood/airless, +/area/ruin/space/abandoned_engi_sat) "fA" = ( /turf/simulated/floor/plasteel, /area/ruin/space/abandoned_engi_sat) @@ -364,6 +368,7 @@ name = "torn sign"; pixel_x = -1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/abandoned_engi_sat) "kT" = ( @@ -503,6 +508,7 @@ pixel_y = -24; name = "south bump" }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel, /area/ruin/space/abandoned_engi_sat) "oL" = ( @@ -546,6 +552,7 @@ /area/ruin/space/abandoned_engi_sat) "pX" = ( /obj/structure/closet/secure_closet/engineering_personal/empty, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/wood/airless, /area/ruin/space/abandoned_engi_sat) "qu" = ( @@ -711,6 +718,7 @@ pixel_y = 32 }, /obj/structure/closet/crate/internals, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "bot"; dir = 1 @@ -931,6 +939,7 @@ /obj/machinery/light{ dir = 1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "vault"; dir = 5 @@ -950,6 +959,10 @@ name = "floor" }, /area/ruin/space/abandoned_engi_sat) +"FN" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord, +/turf/simulated/floor/carpet/airless, +/area/ruin/space/abandoned_engi_sat) "FQ" = ( /obj/machinery/door/airlock/engineering{ name = "Construction Area" @@ -1259,6 +1272,11 @@ dir = 5 }, /area/ruin/space/abandoned_engi_sat) +"RV" = ( +/obj/effect/mapping_helpers/turfs/damage, +/mob/living/simple_animal/hostile/asteroid/hivelord, +/turf/simulated/floor/plasteel, +/area/ruin/space/abandoned_engi_sat) "Sa" = ( /obj/structure/table, /turf/simulated/floor/plasteel{ @@ -1340,6 +1358,10 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/space/abandoned_engi_sat) +"Ye" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord, +/turf/simulated/floor/plasteel, +/area/ruin/space/abandoned_engi_sat) "Yz" = ( /obj/structure/closet/emcloset, /turf/simulated/floor/plasteel{ @@ -2089,7 +2111,7 @@ Ux Vx mQ DO -DO +fs DO DO bi @@ -2159,7 +2181,7 @@ kI mG pX hB -nH +FN pX EU EU @@ -2286,9 +2308,9 @@ oL xp gL fA -kd -fA +RV fA +Ye fA eG iV diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm index 7012a0b2be79..d972e10bdc6f 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm @@ -115,6 +115,7 @@ /obj/item/gun/projectile/automatic/pistol/enforcer, /obj/item/grenade/flashbang, /obj/item/storage/firstaid/regular, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating/airless, /area/ruin/space/sec_shuttle) "F" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm index f7a004b86b90..316003f265a5 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm @@ -90,6 +90,7 @@ /area/ruin/space/abandtele) "w" = ( /obj/structure/closet, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating/airless, /area/ruin/space/abandtele) "x" = ( @@ -106,6 +107,7 @@ /obj/item/weldingtool, /obj/item/wrench, /obj/item/circuitboard/teleporter, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating/airless, /area/ruin/space/abandtele) "z" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm index 95312902c673..d6bb7eeb8078 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -216,7 +216,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/item/gun/energy/floragun, +/obj/effect/spawner/random/pool/spaceloot/zoo, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -376,7 +376,7 @@ /area/ruin/space/unpowered) "aY" = ( /obj/structure/table/reinforced, -/obj/item/gun/energy/temperature, +/obj/effect/spawner/random/pool/spaceloot/zoo, /turf/simulated/floor/plasteel{ icon_state = "dark" }, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm index 5ff86b1f4066..9ecd90646cbd 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm @@ -9,6 +9,10 @@ "c" = ( /turf/simulated/mineral/random/high_chance, /area/ruin/space/unpowered) +"l" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/asteroid/airless, +/area/ruin/space/unpowered) "V" = ( /turf/template_noop, /area/template_noop) @@ -149,7 +153,7 @@ V V V b -b +l V V V diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm index 521e6b492c4e..5f438bb56c40 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm @@ -15,6 +15,10 @@ /obj/structure/spawner/mining/basilisk, /turf/simulated/floor/plating/asteroid/airless, /area/ruin/space/unpowered) +"C" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/asteroid/airless, +/area/ruin/space/unpowered) "R" = ( /obj/structure/spawner/mining/goliath, /turf/simulated/floor/plating/asteroid/airless, @@ -220,7 +224,7 @@ c d c c -c +C c c c @@ -337,7 +341,7 @@ c c c c -c +C c c c diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm index e48592dc2358..3b700b3b0ff5 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm @@ -22,6 +22,10 @@ "q" = ( /turf/simulated/mineral/random/low_chance, /area/ruin/space/unpowered) +"r" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/asteroid/airless, +/area/ruin/space/unpowered) "v" = ( /obj/structure/spawner/mining/basilisk, /turf/simulated/floor/plating/asteroid/airless, @@ -175,7 +179,7 @@ q c c c -b +r c c q diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm index 2ac460ad24c3..13a16bcd6425 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm @@ -50,6 +50,10 @@ }, /turf/simulated/floor/mineral/titanium/blue, /area/ruin/space/unpowered) +"p" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating, +/area/ruin/space/unpowered) "Q" = ( /turf/simulated/mineral/random/low_chance, /area/ruin/space/unpowered) @@ -354,7 +358,7 @@ a c c b -f +p f i i diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm index 313a25539d57..32bbba92f3e4 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm @@ -15,6 +15,10 @@ /obj/structure/spawner/mining/goliath, /turf/simulated/floor/plating/asteroid/airless, /area/ruin/space/unpowered) +"o" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/asteroid/airless, +/area/ruin/space/unpowered) "A" = ( /turf/simulated/mineral/random/low_chance, /area/ruin/space/unpowered) @@ -606,7 +610,7 @@ d c c b -d +o d c d diff --git a/_maps/map_files/RandomRuins/SpaceRuins/blowntcommsat.dmm b/_maps/map_files/RandomRuins/SpaceRuins/blowntcommsat.dmm index b7c699afbf25..f8be6a5fcccd 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/blowntcommsat.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/blowntcommsat.dmm @@ -51,6 +51,13 @@ }, /turf/simulated/floor/plating/airless, /area/ruin/space/tcommsat) +"cl" = ( +/obj/structure/rack, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel/airless{ + icon_state = "dark" + }, +/area/ruin/space/tcommsat) "cM" = ( /obj/effect/decal/cleanable/blood/writing{ dir = 8 @@ -207,7 +214,7 @@ }, /area/ruin/space/tcommsat) "lq" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib, +/obj/effect/spawner/random/pool/spaceloot/modsuit_syndie, /turf/simulated/floor/plating/airless, /area/ruin/space/tcommsat) "my" = ( @@ -481,6 +488,7 @@ /area/ruin/space/tcommsat) "Go" = ( /obj/structure/table, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating/airless, /area/ruin/space/tcommsat) "GG" = ( @@ -585,11 +593,15 @@ /turf/simulated/wall/r_wall, /area/space/nearstation) "Nw" = ( -/obj/item/food/xenomeatbreadslice{ +/obj/item/food/sliced/xeno_meat_bread{ name = "green mold bread slice" }, /turf/simulated/floor/plating/airless, /area/ruin/space/tcommsat) +"NC" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/airless, +/area/ruin/space/tcommsat) "NJ" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -632,6 +644,7 @@ dir = 8 }, /obj/structure/closet/firecloset, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel, /area/ruin/space/tcommsat) "PZ" = ( @@ -1241,7 +1254,7 @@ Wc Is ot UK -fS +cl Wr kx Jr @@ -2082,7 +2095,7 @@ Wc Wc Wc Is -Wc +NC Wr kx Jr @@ -2862,7 +2875,7 @@ au Wc ot bc -Wc +NC Wr bc Wc diff --git a/_maps/map_files/RandomRuins/SpaceRuins/casino.dmm b/_maps/map_files/RandomRuins/SpaceRuins/casino.dmm index edea8014ad6b..89f31d70ff7a 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/casino.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/casino.dmm @@ -214,7 +214,7 @@ /turf/simulated/floor/mineral/plastitanium, /area/ruin/space/powered/casino/security) "fT" = ( -/obj/item/kirbyplants/plant1, +/obj/item/kirbyplants/medium/medium2, /turf/simulated/floor/plasteel/dark, /area/ruin/space/powered/casino/arrivals) "fV" = ( @@ -293,6 +293,7 @@ /area/ruin/space/powered/casino/security) "hv" = ( /obj/structure/table/reinforced, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/carpet/black, /area/ruin/space/powered/casino/floor) "hJ" = ( @@ -323,6 +324,8 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/plastitanium, /area/ruin/space/powered/casino/security) "in" = ( @@ -382,6 +385,7 @@ /area/ruin/space/powered/casino/arrivals) "jz" = ( /obj/structure/closet/cabinet, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/powered/casino/floor) "jJ" = ( @@ -428,7 +432,7 @@ /turf/simulated/floor/plating, /area/ruin/space/powered/casino/maints) "kC" = ( -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /turf/simulated/floor/mineral/silver, /area/ruin/space/powered/casino/hall) "kH" = ( @@ -660,6 +664,7 @@ "rh" = ( /obj/structure/grille/broken, /obj/structure/closet/crate/trashcart, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/powered/casino/maints) "rp" = ( @@ -802,6 +807,7 @@ dir = 8 }, /obj/effect/mob_spawn/human/corpse/random_species/gambler, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel/freezer, /area/ruin/space/powered/casino/hall) "wo" = ( @@ -1111,6 +1117,13 @@ }, /turf/simulated/floor/plasteel/dark, /area/ruin/space/powered/casino/arrivals) +"EK" = ( +/obj/structure/table, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered/casino/kitchen) "EZ" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/spawner/random/dirt/maybe, @@ -1310,6 +1323,7 @@ "Nh" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/oxygen, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/plastitanium/red, /area/ruin/space/powered/casino/docked_ships) "Nj" = ( @@ -1368,6 +1382,13 @@ }, /turf/simulated/floor/plating, /area/ruin/space/powered/casino/security) +"OZ" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel{ + icon_state = "showroomfloor" + }, +/area/ruin/space/powered/casino/kitchen) "Pz" = ( /obj/structure/chair/wood{ dir = 8 @@ -2222,7 +2243,7 @@ cc cc fT sO -UO +OZ RS Is Is @@ -2454,7 +2475,7 @@ An IS sO UW -DM +EK ql DM sO diff --git a/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm b/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm index c353cfd9ef06..65170fd4d134 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm @@ -73,6 +73,7 @@ /obj/structure/window/reinforced{ dir = 1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/tranquillite, /area/ruin/space/powered) "fS" = ( @@ -732,6 +733,13 @@ /obj/effect/mapping_helpers/turfs/burn, /turf/simulated/floor/mineral/titanium, /area/ruin/space/clown_mime_ruin) +"OZ" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/mapping_helpers/turfs/burn, +/obj/item/stack/sheet/wood, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/clown_mime_ruin) "Pt" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/maintenance, @@ -1079,7 +1087,7 @@ OK nX wP Bb -TC +OZ nX tN tN diff --git a/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm index 354deb775f47..fb4e77a195c7 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm @@ -149,6 +149,10 @@ }, /turf/simulated/floor/plating/burnt/airless, /area/template_noop) +"QL" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/burnt/airless, +/area/template_noop) (1,1,1) = {" aa @@ -359,7 +363,7 @@ aa ay ad ml -ay +QL aU aa aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm index ff51a70a0aa7..586ce7c912ac 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm @@ -129,6 +129,11 @@ /obj/machinery/computer/pandemic, /turf/simulated/floor/plasteel/airless, /area/template_noop) +"Di" = ( +/obj/effect/mapping_helpers/turfs/burn, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel/airless, +/area/template_noop) (1,1,1) = {" aa @@ -179,7 +184,7 @@ aa ad aG aA -aM +Di aF ad as diff --git a/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm index 419dbd23ad01..e8f94ba21d85 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm @@ -128,6 +128,10 @@ /obj/item/stack/sheet/metal, /turf/template_noop, /area/template_noop) +"P" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/damaged/airless, +/area/template_noop) "Q" = ( /obj/structure/girder, /turf/template_noop, @@ -529,7 +533,7 @@ U v a O -z +P z a a diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index b90406f23bdc..60c631ab8219 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -831,7 +831,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/deepstorage) "cP" = ( -/obj/item/kirbyplants/plant27, +/obj/item/kirbyplants/large/plant10, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "vault" @@ -845,7 +845,7 @@ /turf/simulated/floor/catwalk, /area/ruin/space/deepstorage) "cT" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -889,7 +889,7 @@ /area/ruin/space/deepstorage) "dg" = ( /obj/effect/decal/cleanable/cobweb, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 9; @@ -1294,7 +1294,7 @@ /area/ruin/space/deepstorage) "gC" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /turf/simulated/floor/plasteel{ icon_state = "black" }, @@ -1371,7 +1371,7 @@ }, /area/ruin/space/deepstorage) "hg" = ( -/obj/item/kirbyplants/plant27, +/obj/item/kirbyplants/large/plant10, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -2402,7 +2402,7 @@ }, /area/ruin/space/deepstorage) "nM" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small, /turf/simulated/floor/plasteel{ @@ -2875,7 +2875,7 @@ /turf/simulated/floor/engine/airless, /area/ruin/space/unpowered) "re" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 5; @@ -3364,7 +3364,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/structure/sign/biohazard{ pixel_x = -32 }, @@ -4508,7 +4508,7 @@ /area/ruin/space/deepstorage) "BF" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "white" @@ -5328,7 +5328,7 @@ }, /area/ruin/space/deepstorage) "Ha" = ( -/obj/item/kirbyplants/plant27, +/obj/item/kirbyplants/large/plant10, /obj/machinery/light/small{ dir = 8 }, @@ -5913,7 +5913,7 @@ /turf/simulated/floor/engine, /area/ruin/space/deepstorage) "LT" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -5997,9 +5997,9 @@ /area/ruin/space/deepstorage) "MR" = ( /obj/structure/rack, -/obj/item/paper/researchnotes, /obj/effect/turf_decal/delivery/hollow, -/obj/effect/spawner/random/deepstorage_reward/main, +/obj/effect/spawner/random/pool/spaceloot/deepstorage/main, +/obj/item/paper/researchnotes, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" @@ -6300,7 +6300,7 @@ }, /area/ruin/space/deepstorage) "Pq" = ( -/obj/item/kirbyplants/plant29, +/obj/item/kirbyplants/large/plant11, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -6721,7 +6721,7 @@ }, /area/ruin/space/deepstorage) "Sc" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -7348,7 +7348,7 @@ }, /area/ruin/space/deepstorage) "Ww" = ( -/obj/item/kirbyplants/plant27, +/obj/item/kirbyplants/large/plant10, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "vault" @@ -7485,7 +7485,7 @@ }, /area/ruin/space/deepstorage) "Xj" = ( -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -7545,7 +7545,7 @@ /area/ruin/space/deepstorage) "Xy" = ( /obj/structure/table/glass, -/obj/item/kirbyplants/plant15{ +/obj/item/kirbyplants/small/small4{ pixel_y = 13 }, /turf/simulated/floor/plasteel{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm index 69e8353e31ac..97cf1402ced1 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm @@ -94,6 +94,12 @@ /mob/living/simple_animal/hostile/alien, /turf/simulated/floor/plating/airless, /area/ruin/space/unpowered) +"I" = ( +/obj/structure/alien/weeds, +/obj/structure/table, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/airless, +/area/ruin/space/unpowered) "S" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -609,8 +615,8 @@ f G f c -m -m +I +I f c b diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm index 20fe6a14d08c..21868b544b64 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm @@ -47,6 +47,10 @@ /obj/effect/decal/remains/human, /turf/simulated/floor/plating/airless, /area/ruin/space/unpowered) +"H" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/airless, +/area/ruin/space/unpowered) "O" = ( /mob/living/simple_animal/hostile/carp, /turf/simulated/floor/plating/airless, @@ -852,7 +856,7 @@ d d b c -b +H b b b @@ -1090,7 +1094,7 @@ b b b c -b +H b b b diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm index 9d3a9e8bf61e..48208579bf65 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm @@ -61,6 +61,7 @@ /area/ruin/space/unpowered) "p" = ( /obj/structure/table, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/titanium/blue/airless, /area/ruin/space/unpowered) "q" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm index a57154509b6a..cae07a86a426 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm @@ -83,6 +83,10 @@ /obj/machinery/kitchen_machine/microwave, /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) +"lE" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel, +/area/ruin/space/unpowered) "mn" = ( /obj/structure/closet/crate, /obj/item/toy/plushie/nianplushie, @@ -150,7 +154,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) "sd" = ( -/obj/item/kirbyplants/dead, +/obj/item/kirbyplants/large/dead, /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) "vg" = ( @@ -241,6 +245,7 @@ /area/ruin/space/unpowered) "LA" = ( /obj/structure/table, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) "LD" = ( @@ -1324,7 +1329,7 @@ Qx Qx Qx Qx -zN +lE vE hG bO diff --git a/_maps/map_files/RandomRuins/SpaceRuins/dj.dmm b/_maps/map_files/RandomRuins/SpaceRuins/dj.dmm index 6894f69abde8..80a2a2786ca9 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/dj.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/dj.dmm @@ -525,6 +525,7 @@ "bt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/can, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -694,6 +695,7 @@ pixel_y = 2 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -905,7 +907,7 @@ }, /area/ruin/space/djstation) "yr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "north bump"; pixel_y = 30 diff --git a/_maps/map_files/RandomRuins/SpaceRuins/druglab.dmm b/_maps/map_files/RandomRuins/SpaceRuins/druglab.dmm index eacc7acf7711..a349099a7768 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/druglab.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/druglab.dmm @@ -13,6 +13,7 @@ /area/ruin/space/methlab) "d" = ( /obj/structure/closet/crate, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/methlab) "e" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm index 3a6699cffbc3..324ba02d8fc6 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm @@ -40,6 +40,10 @@ /mob/living/simple_animal/hostile/asteroid/hivelord, /turf/simulated/floor/plating, /area/ruin/space/unpowered) +"t" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating, +/area/ruin/space/unpowered) "T" = ( /obj/item/salvage/ruin/tablet, /turf/simulated/floor/plating, @@ -301,7 +305,7 @@ c c d d -d +t d d d diff --git a/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm b/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm index 4f1796e639a3..baf8278e10d0 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm @@ -153,7 +153,7 @@ /area/ruin/space/powered) "nq" = ( /obj/structure/closet/crate, -/obj/item/banhammer, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/plastitanium, /area/ruin/space/powered) "nD" = ( @@ -184,6 +184,7 @@ /area/ruin/space/powered) "rV" = ( /obj/structure/closet/crate/secure/loot, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/plastitanium, /area/ruin/space/powered) "st" = ( @@ -254,6 +255,7 @@ /obj/structure/safe, /obj/item/id_decal/gold, /obj/item/stack/spacecash/c200, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "caution" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index f13694d1e1d2..60ebb6538381 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -136,6 +136,11 @@ /obj/item/salvage/ruin/tablet, /turf/simulated/floor/mineral/titanium/purple, /area/ruin/space/powered) +"U" = ( +/obj/structure/closet, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/mineral/titanium/purple, +/area/ruin/space/powered) (1,1,1) = {" a @@ -322,7 +327,7 @@ a a a b -j +U r w Q diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index d068c1d38ffe..7d2518499e27 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -136,6 +136,10 @@ icon_state = "solarpanel" }, /area/ruin/space/syndicate_listening_station/asteroid) +"nk" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/mineral/silver, +/area/ruin/space/syndicate_listening_station) "oE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/floodlight, @@ -323,6 +327,7 @@ /obj/item/storage/box/tapes, /obj/item/taperecorder, /obj/item/clothing/glasses/regular, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel/dark, /area/ruin/space/syndicate_listening_station) "AT" = ( @@ -550,6 +555,7 @@ /obj/item/clothing/shoes/slippers, /obj/item/clothing/under/misc/pj/red, /obj/item/clothing/suit/jacket/bomber/syndicate, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/wood, /area/ruin/space/syndicate_listening_station) "RN" = ( @@ -1541,7 +1547,7 @@ yn yn kJ KM -Nd +nk kJ PH le diff --git a/_maps/map_files/RandomRuins/SpaceRuins/meatpackers.dmm b/_maps/map_files/RandomRuins/SpaceRuins/meatpackers.dmm index f63dd9362487..7b21d55fd076 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/meatpackers.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/meatpackers.dmm @@ -63,6 +63,7 @@ "ap" = ( /obj/item/restraints/handcuffs, /obj/structure/closet/crate, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating/airless, /area/ruin/unpowered/bmp_ship/delta) "aq" = ( @@ -193,6 +194,7 @@ "aP" = ( /obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c100, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/wood, /area/ruin/unpowered/bmp_ship/fore) "aQ" = ( @@ -211,6 +213,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/unpowered/bmp_ship/fore) "aT" = ( @@ -713,6 +716,7 @@ /obj/structure/closet/secure_closet/freezer/meat{ opened = 1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -2198,11 +2202,13 @@ /obj/structure/closet/crate/freezer, /obj/item/food/meat, /obj/item/food/hugemushroomslice, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plating, /area/ruin/unpowered/bmp_ship/delta) +"PE" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating, +/area/ruin/unpowered/bmp_ship/aft) "PP" = ( /obj/structure/computerframe{ dir = 4 @@ -4671,7 +4677,7 @@ cl cv eb ex -dG +PE dG dG fu diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index 393125e60ced..ec50ff2cecce 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm @@ -21,6 +21,7 @@ /area/ruin/space/mech_transport) "aZ" = ( /obj/structure/closet/crate/secure/loot, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel/dark, /area/ruin/space/mech_transport) "bk" = ( @@ -101,10 +102,10 @@ /area/ruin/space/mech_transport) "hm" = ( /obj/structure/table, -/obj/item/mecha_parts/core, /obj/structure/sign/poster/contraband/tools{ pixel_y = 32 }, +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage4, /turf/simulated/floor/plasteel/dark, /area/ruin/space/mech_transport) "hu" = ( @@ -121,12 +122,7 @@ /area/ruin/space/mech_transport) "hW" = ( /obj/structure/table, -/obj/item/mecha_parts/mecha_equipment/repair_droid, -/obj/item/mecha_parts/mecha_equipment/extinguisher, -/obj/item/mecha_modkit/voice/honk{ - pixel_y = 10; - pixel_x = 3 - }, +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage1, /turf/simulated/floor/plasteel/dark, /area/ruin/space/mech_transport) "iG" = ( @@ -164,6 +160,7 @@ }, /obj/machinery/door/window, /obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel/dark, /area/ruin/space/mech_transport) "od" = ( @@ -201,6 +198,7 @@ /area/ruin/space/mech_transport) "pJ" = ( /obj/structure/closet/firecloset, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/mineral/plastitanium/red/airless, /area/ruin/space/mech_transport) "qs" = ( @@ -212,7 +210,6 @@ "qE" = ( /obj/effect/turf_decal/delivery/hollow, /obj/structure/sign/nosmoking_1{ - pixel_y = 0; pixel_x = 32 }, /obj/effect/mapping_helpers/turfs/burn, @@ -248,7 +245,6 @@ "sr" = ( /obj/structure/rack, /obj/item/stack/sheet/glass/fifty{ - pixel_y = 0; pixel_x = -2 }, /obj/item/stack/sheet/metal/fifty{ @@ -263,6 +259,7 @@ /area/ruin/space/mech_transport) "sY" = ( /obj/structure/closet, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/mech_transport) "ta" = ( @@ -313,13 +310,7 @@ /area/ruin/space/mech_transport) "wo" = ( /obj/structure/table, -/obj/item/mecha_parts/mecha_equipment/drill, -/obj/item/mecha_parts/mecha_equipment/drill{ - pixel_y = 10 - }, -/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill{ - pixel_y = 4 - }, +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage2, /turf/simulated/floor/plasteel/dark, /area/ruin/space/mech_transport) "wz" = ( @@ -542,7 +533,7 @@ /area/ruin/space/mech_transport) "MK" = ( /obj/structure/table, -/obj/item/mecha_parts/mecha_equipment/medical/sleeper, +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage3, /turf/simulated/floor/plasteel/dark, /area/ruin/space/mech_transport) "Nc" = ( @@ -735,7 +726,7 @@ /turf/simulated/floor/redgrid, /area/ruin/space/mech_transport) "ZI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/mineral/plastitanium/red/airless, /area/ruin/space/mech_transport) "ZK" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm b/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm index 525d34dae908..0d000ab52059 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm @@ -357,7 +357,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "caution" @@ -574,7 +574,7 @@ /obj/structure/railing{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "dark" @@ -1440,7 +1440,7 @@ }, /area/ruin/space/moonbase19) "ey" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 1 }, @@ -1491,7 +1491,7 @@ /turf/simulated/floor/grass, /area/ruin/space/moonbase19) "eK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ c_tag = "West Lobby"; @@ -1725,7 +1725,7 @@ /turf/simulated/floor/plating/asteroid/airless, /area/ruin/space/moonbase19) "fC" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "black"; dir = 10 @@ -1978,7 +1978,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "gv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "caution" @@ -2001,7 +2001,7 @@ }, /area/ruin/space/moonbase19) "gy" = ( -/obj/item/food/xenomeatbreadslice{ +/obj/item/food/sliced/xeno_meat_bread{ pixel_y = 5 }, /obj/item/reagent_containers/drinks/coffee{ @@ -2108,7 +2108,7 @@ /turf/simulated/floor/mineral/titanium, /area/ruin/space/powered) "gP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "caution" @@ -2210,7 +2210,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "caution"; @@ -2298,7 +2298,7 @@ }, /area/ruin/space/moonbase19) "hs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "dark" @@ -2640,7 +2640,7 @@ }, /area/ruin/space/moonbase19) "io" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/directions/engineering{ pixel_x = -32; dir = 8 @@ -2972,7 +2972,7 @@ }, /area/ruin/space/moonbase19) "jj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "caution"; dir = 8 @@ -3022,7 +3022,7 @@ /area/ruin/space/moonbase19) "jp" = ( /obj/structure/railing, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "dark" @@ -3035,7 +3035,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "jr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "jt" = ( @@ -3130,7 +3130,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "caution" @@ -3298,7 +3298,7 @@ }, /area/ruin/space/moonbase19) "kg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/mapping_helpers/turfs/damage, /turf/simulated/floor/plasteel{ dir = 6; @@ -3431,7 +3431,7 @@ /turf/simulated/floor/plating, /area/ruin/space/moonbase19) "kB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/railing{ dir = 10 }, @@ -3458,7 +3458,7 @@ }, /area/ruin/space/moonbase19) "kG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/cobweb, /turf/simulated/floor/plasteel{ icon_state = "whitecorner" @@ -3481,7 +3481,7 @@ /turf/simulated/floor/grass, /area/ruin/space/moonbase19) "kN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -3644,7 +3644,7 @@ }, /area/ruin/space/moonbase19) "lD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -3681,7 +3681,7 @@ }, /area/ruin/space/moonbase19) "lI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "caution"; @@ -3869,7 +3869,7 @@ }, /area/ruin/space/moonbase19) "mv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "caution" @@ -4502,7 +4502,7 @@ }, /area/ruin/space/moonbase19) "oU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" @@ -4880,7 +4880,7 @@ /turf/simulated/floor/engine, /area/ruin/space/moonbase19) "qu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "escape" @@ -4992,7 +4992,7 @@ /obj/effect/decal/cleanable/cobweb2, /obj/effect/turf_decal/delivery/hollow, /obj/structure/rack, -/obj/item/paper/researchnotes, +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19/vault1, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -5187,7 +5187,7 @@ /turf/simulated/floor/plating/asteroid/ancient, /area/ruin/space/moonbase19) "rH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "escape" @@ -5413,7 +5413,7 @@ }, /area/ruin/space/moonbase19) "sp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/railing, /obj/structure/cable{ icon_state = "1-2" @@ -5498,7 +5498,7 @@ /obj/structure/railing{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) "td" = ( @@ -5921,9 +5921,8 @@ /area/ruin/space/moonbase19) "vh" = ( /obj/structure/rack, -/obj/item/mecha_parts/core, /obj/effect/turf_decal/delivery/hollow, -/obj/item/stock_parts/cell/infinite/abductor, +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19/vault3, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -5980,7 +5979,7 @@ }, /area/ruin/space/moonbase19) "vB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 4 }, @@ -6155,7 +6154,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "wp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "caution"; dir = 5 @@ -6176,7 +6175,7 @@ }, /area/ruin/space/moonbase19) "wv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkfull"; dir = 8 @@ -6703,12 +6702,12 @@ }, /area/ruin/space/moonbase19) "yR" = ( -/obj/item/food/xenomeatbreadslice, -/obj/item/food/xenomeatbreadslice{ +/obj/item/food/sliced/xeno_meat_bread, +/obj/item/food/sliced/xeno_meat_bread{ pixel_y = 7; pixel_x = 6 }, -/obj/item/food/xenomeatbreadslice{ +/obj/item/food/sliced/xeno_meat_bread{ pixel_y = 9; pixel_x = -5 }, @@ -6858,7 +6857,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "caution"; dir = 10 @@ -6871,7 +6870,7 @@ }, /area/ruin/space/moonbase19) "zK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/biohazard{ pixel_y = 32 }, @@ -7748,7 +7747,7 @@ }, /area/ruin/space/moonbase19) "Dy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/biohazard{ pixel_y = 32 }, @@ -7910,7 +7909,7 @@ /turf/simulated/floor/carpet/royalblue, /area/ruin/space/moonbase19) "Ep" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "escape"; @@ -8124,7 +8123,7 @@ }, /area/ruin/space/moonbase19) "Fk" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "caution"; dir = 4 @@ -8137,8 +8136,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery/hollow, -/obj/item/assembly/signaler/anomaly/random, -/obj/item/storage/lockbox/experimental_weapon, +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19/vault2, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -8240,7 +8238,7 @@ }, /area/ruin/space/moonbase19) "FO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/railing{ dir = 1 }, @@ -8268,7 +8266,7 @@ }, /area/ruin/space/moonbase19) "FV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/cobweb, /turf/simulated/floor/plasteel{ dir = 9; @@ -8623,7 +8621,7 @@ /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) "HA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "caution"; dir = 10 @@ -9230,7 +9228,7 @@ }, /area/ruin/space/moonbase19) "Kz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "escape"; dir = 4 @@ -9474,7 +9472,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitecorner"; dir = 4 @@ -9757,7 +9755,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "MY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/decal/cleanable/cobweb2, /turf/simulated/floor/plasteel{ @@ -10020,7 +10018,7 @@ }, /area/ruin/space/moonbase19) "Od" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/cobweb, /turf/simulated/floor/plasteel{ icon_state = "darkfull"; @@ -10097,7 +10095,7 @@ /turf/simulated/floor/carpet/royalblue, /area/ruin/space/moonbase19) "Oo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 1 }, @@ -10399,7 +10397,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "PQ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "caution" @@ -11650,7 +11648,7 @@ }, /area/ruin/space/moonbase19) "VG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "caution"; dir = 9 @@ -11803,7 +11801,7 @@ }, /area/ruin/space/moonbase19) "Wn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "caution" @@ -11898,7 +11896,7 @@ }, /area/ruin/space/moonbase19) "WJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/railing{ dir = 9 }, @@ -12154,7 +12152,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitecorner"; dir = 1 @@ -12231,7 +12229,7 @@ }, /area/ruin/space/moonbase19) "XY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitehall" }, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index d16c18e4fa5f..b78e61a500cc 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -2,9 +2,6 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ab" = ( -/turf/simulated/mineral/random, -/area/ruin/unpowered) "ac" = ( /turf/simulated/wall/r_wall, /area/ruin/ancientstation/hivebot) @@ -23,9 +20,12 @@ /turf/simulated/floor/plating/airless, /area/space/nearstation) "af" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/space/nearstation) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "ah" = ( /turf/simulated/floor/plasteel/dark, /area/ruin/ancientstation/hivebot) @@ -50,14 +50,29 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/ancientstation/hivebot) "al" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "am" = ( -/obj/structure/sign/poster/official/nanotrasen_logo, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/comm) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "an" = ( /obj/machinery/door/poddoor{ id_tag = "ancient" @@ -119,34 +134,35 @@ /obj/structure/shuttle/engine/large{ dir = 4 }, -/turf/simulated/wall, +/turf/simulated/wall/r_wall, /area/ruin/ancientstation/hivebot) "az" = ( /obj/effect/mapping_helpers/turfs/rust, /turf/simulated/wall, /area/ruin/ancientstation) "aA" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/machinery/door_control{ id = "ancient"; - name = "Charlie Station Lockdown Button" + name = "Charlie Station Lockdown Button"; + req_access = list(301) }, +/obj/structure/table/reinforced, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "aB" = ( +/obj/machinery/computer/nonfunctional, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1 +/turf/simulated/floor/plasteel{ + icon_state = "whiteyellowfull" }, -/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "aC" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/item/deck/cards, /obj/item/folder/blue, /obj/item/pen, +/obj/structure/table/reinforced, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "aD" = ( @@ -154,25 +170,25 @@ /turf/simulated/floor/plating, /area/ruin/ancientstation/hivebot) "aE" = ( -/obj/structure/cable, -/obj/machinery/power/apc/off_station/empty_charge/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 6 + }, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "aF" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/comm) +/turf/simulated/floor/engine/air, +/area/ruin/ancientstation/atmo) "aG" = ( +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "aH" = ( -/obj/item/solar_assembly, -/turf/template_noop, -/area/space/nearstation) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/portable/canister, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) "aI" = ( /obj/machinery/light/small{ dir = 8 @@ -191,12 +207,19 @@ /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation) "aK" = ( -/obj/structure/sign/poster/contraband/random, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation) +/obj/machinery/door/airlock/highsecurity{ + name = "Prototype Laboratory" + }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel{ + icon_state = "whitehall" + }, +/area/ruin/ancientstation/thetacorridor) "aL" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, @@ -204,24 +227,27 @@ /area/ruin/ancientstation) "aM" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "blue" +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, -/area/ruin/ancientstation/comm) +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "aN" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/megaphone, +/obj/structure/chair/office/dark, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "aO" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "arrivalcorner" +/obj/machinery/power/emitter, +/obj/machinery/light/small{ + dir = 1 }, -/area/ruin/ancientstation/comm) +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) "aP" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/white, @@ -241,30 +267,33 @@ "aR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/engineering/electrical, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, +/obj/item/apc_electronics, +/obj/item/apc_electronics, +/obj/item/airlock_electronics, +/obj/item/airlock_electronics, /turf/simulated/floor/plating, /area/ruin/ancientstation) "aS" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/lighter/zippo, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/comm) +/obj/structure/sign/poster/contraband/random, +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation) "aT" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/obj/item/coin/gold, -/turf/simulated/floor/plasteel, +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, /area/ruin/ancientstation/comm) "aU" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "aV" = ( /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/betanorth) @@ -274,38 +303,27 @@ /area/ruin/ancientstation/betanorth) "aX" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/engineering/electrical, -/obj/item/airlock_electronics, -/obj/item/airlock_electronics, -/obj/item/apc_electronics, -/obj/item/apc_electronics, +/obj/machinery/light/small{ + dir = 8 + }, /turf/simulated/floor/plating, /area/ruin/ancientstation) "aY" = ( +/obj/machinery/computer/nonfunctional, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "bluecorner" + icon_state = "bluefull" }, /area/ruin/ancientstation/comm) "aZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/obj/structure/showcase/machinery/oldpod, +/turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/comm) "ba" = ( -/obj/machinery/light/small{ - dir = 8; - pixel_y = -8 - }, /obj/effect/decal/cleanable/dirt, -/obj/structure/mirror{ - name = "dusty mirror"; - pixel_x = -26 - }, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation) +/obj/effect/decal/cleanable/vomit, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) "bb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/shower{ @@ -318,12 +336,7 @@ /area/ruin/ancientstation) "bc" = ( /obj/structure/closet/crate, -/obj/item/stack/sheet/metal{ - amount = 20 - }, -/obj/item/stack/sheet/metal{ - amount = 20 - }, +/obj/item/stack/sheet/metal/fifty, /turf/simulated/floor/plasteel/dark, /area/ruin/ancientstation/hivebot) "bd" = ( @@ -350,38 +363,31 @@ /area/ruin/ancientstation) "bh" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 5; - icon_state = "blue" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "bi" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/nonfunctional, /turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "blue" + icon_state = "bluefull" }, /area/ruin/ancientstation/comm) "bj" = ( +/obj/structure/rack, /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/nonfunctional, +/obj/item/stack/cable_coil/yellow, /turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "blue" + dir = 6; + icon_state = "yellow" }, -/area/ruin/ancientstation/comm) +/area/ruin/ancientstation/engi) "bk" = ( -/obj/machinery/light{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1 - }, +/obj/structure/chair/office/dark, /turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "blue" + icon_state = "whiteyellowfull" }, /area/ruin/ancientstation/comm) "bl" = ( @@ -409,64 +415,93 @@ /turf/simulated/floor/plating, /area/ruin/ancientstation/hivebot) "bo" = ( -/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/betanorth) "bp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/rack, +/obj/item/clothing/suit/space/nasavoid/old, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) "bq" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/ruin/ancientstation/comm) "br" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge" +/obj/structure/showcase/machinery/oldpod{ + dir = 1 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/comm) "bs" = ( -/obj/structure/sign/poster/official/cleanliness, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation) -"bt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/oldpod{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/comm) +"bt" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "4-8" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) -"bu" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/thetacorridor) +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) "bv" = ( -/turf/simulated/wall, -/area/ruin/ancientstation/thetacorridor) -"bw" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + name = "Artificial Program Core Room" + }, /turf/simulated/floor/plating, /area/ruin/ancientstation/hivebot) -"bx" = ( -/obj/effect/decal/cleanable/dirt, +"bw" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science{ + name = "Artificial Program Core Room" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/plating, /area/ruin/ancientstation/hivebot) +"bx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) "by" = ( -/obj/machinery/door/firedoor/closed, +/obj/machinery/atmospherics/pipe/manifold/visible/cyan, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/airless, -/area/ruin/ancientstation/betanorth) +/area/ruin/ancientstation/atmo) "bz" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating/airless, @@ -475,42 +510,34 @@ /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/ruin/ancientstation) -"bB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/engineering/electrical, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) "bC" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "bD" = ( /obj/structure/sign/greencross, -/obj/effect/mapping_helpers/turfs/rust, /turf/simulated/wall, /area/ruin/ancientstation) "bE" = ( /obj/structure/cable{ + d1 = 2; + d2 = 4; icon_state = "2-4" }, -/obj/item/kirbyplants/dead, /obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/large/dead, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "bF" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/obj/structure/table, +/obj/item/flashlight/flare/glowstick/used, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "bG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) @@ -521,24 +548,19 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "bI" = ( -/obj/machinery/light/small{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/mob/living/simple_animal/hostile/hivebot, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "whitecorner" + }, +/area/ruin/ancientstation/rnd) "bJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) -"bK" = ( -/obj/item/kirbyplants/dead, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) "bL" = ( /obj/structure/sign/science, /obj/effect/mapping_helpers/turfs/rust, @@ -550,9 +572,9 @@ /area/ruin/ancientstation/thetacorridor) "bN" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, /obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/stripes/line, +/obj/item/pickaxe, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) @@ -562,34 +584,31 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "bP" = ( -/obj/structure/sign/poster/official/science, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/thetacorridor) -"bQ" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/hivebot) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) "bR" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science{ - name = "Artificial Program Core Room" - }, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/hivebot) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "bS" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "bT" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/oldstation/surgery, +/obj/effect/spawner/random/cobweb/left/frequent, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "bU" = ( -/obj/machinery/door/airlock/command, -/turf/simulated/floor/plasteel/airless, +/obj/machinery/door/airlock/command{ + name = "Charlie Station Access" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/betanorth) "bV" = ( /obj/effect/decal/remains/human, @@ -598,7 +617,7 @@ "bW" = ( /obj/effect/spawner/window/reinforced/grilled, /obj/structure/transit_tube/horizontal, -/turf/simulated/floor/plating/airless, +/turf/simulated/floor/plating, /area/ruin/ancientstation/betanorth) "bX" = ( /obj/effect/spawner/window/reinforced/grilled, @@ -606,73 +625,66 @@ /turf/simulated/floor/plating, /area/ruin/ancientstation) "bY" = ( -/obj/structure/transit_tube_pod{ - dir = 4 - }, -/obj/structure/transit_tube/station/reverse{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/arrows/black{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/turf/simulated/floor/plasteel/airless, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/betanorth) "bZ" = ( -/obj/machinery/door/poddoor{ - id_tag = "ancient" - }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/command{ - name = "Beta Station Access" - }, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/powered) +/obj/structure/reagent_dispensers/watertank, +/obj/effect/spawner/random/cobweb/left/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) "ca" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "cb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/effect/decal/cleanable/generic, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "cc" = ( /obj/structure/girder, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) +/turf/simulated/floor/plating, +/area/ruin/ancientstation/betanorth) "cd" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "ce" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/area/ruin/ancientstation/hydroponics) "cf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/visible/green, +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) "cg" = ( /obj/effect/decal/cleanable/insectguts, /obj/effect/decal/cleanable/dirt, @@ -680,91 +692,81 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "ch" = ( -/obj/machinery/door/poddoor{ - id_tag = "ancient" +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, +/obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/command{ - name = "Theta Station Access" - }, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/powered) +/turf/simulated/floor/plating, +/area/ruin/ancientstation) "ci" = ( -/obj/structure/transit_tube/station/reverse{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/turf/simulated/floor/plasteel{ + icon_state = "redfull" + }, +/area/ruin/ancientstation/comm) "cj" = ( /obj/effect/spawner/window/reinforced/grilled, /obj/structure/transit_tube/horizontal, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "ck" = ( -/obj/structure/lattice/catwalk, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) -"cl" = ( -/obj/structure/transit_tube/station/reverse, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation) +"cl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/flour, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) "cm" = ( /obj/effect/decal/cleanable/dirt, /obj/item/stack/medical/bruise_pack, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "cn" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/command, -/obj/structure/barricade/wooden, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/obj/item/wrench, +/obj/item/wirecutters, +/obj/effect/spawner/random/cobweb/right/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/engi) "co" = ( /obj/effect/decal/cleanable/blood/oil, /mob/living/simple_animal/hostile/hivebot, /turf/simulated/floor/plasteel/dark, /area/ruin/ancientstation/hivebot) -"cp" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"cq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"cr" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) "cs" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/rnd) "ct" = ( -/obj/item/kirbyplants/dead, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/large/dead, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "cu" = ( @@ -785,54 +787,62 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/betanorth) "cx" = ( /obj/machinery/light/small{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/storage/box/lights/mixed, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "cy" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, +/obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "cz" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/structure/transit_tube/station/dispenser/reverse, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "cA" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/hydroponics) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "cautioncorner" + }, +/area/ruin/ancientstation/engi) "cB" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/ruin/ancientstation/hydroponics) "cC" = ( /obj/structure/cable/yellow{ + d2 = 4; icon_state = "0-4" }, -/turf/simulated/floor/plating/airless, +/obj/machinery/power/solar, +/turf/simulated/floor/plasteel/airless{ + icon_state = "solarpanel" + }, /area/space/nearstation) "cD" = ( /obj/structure/cable/yellow{ + d2 = 8; icon_state = "0-8" }, -/turf/simulated/floor/plating/airless, +/obj/machinery/power/solar, +/turf/simulated/floor/plasteel/airless{ + icon_state = "solarpanel" + }, /area/space/nearstation) "cE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -856,17 +866,14 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) -"cH" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/solar, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) "cI" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/pickaxe, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/remains/human, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "cJ" = ( @@ -889,32 +896,18 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/ancientstation/hivebot) "cM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, +/area/ruin/ancientstation/hivebot) "cN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/betanorth) "cO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/obj/machinery/atmospherics/portable/canister/air, +/turf/simulated/floor/engine/air, +/area/ruin/ancientstation/atmo) "cP" = ( /obj/effect/decal/cleanable/blood/oil, /mob/living/simple_animal/hostile/hivebot/strong, @@ -941,44 +934,47 @@ }, /area/ruin/ancientstation/betanorth) "cS" = ( -/obj/structure/sign/poster/official/nanomichi_ad, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/betanorth) -"cT" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/effect/spawner/random/cobweb/left/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"cT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/betanorth) "cU" = ( /obj/effect/mapping_helpers/turfs/rust, /turf/simulated/wall, /area/ruin/ancientstation/engi) -"cV" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/off_station/empty_charge/directional/north, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"cW" = ( -/obj/machinery/alarm/all_access/directional/north{ - report_danger_level = 0 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) "cX" = ( /obj/structure/transit_tube, /turf/template_noop, /area/space/nearstation) "cY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/hydroponics) +/area/ruin/ancientstation/thetacorridor) "cZ" = ( /obj/machinery/hydroponics/soil, /turf/simulated/floor/grass, @@ -991,102 +987,108 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/hydroponics) "db" = ( -/obj/item/solar_assembly, -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) "dc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/structure/chair{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/poddoor{ + id_tag = "prototype_vault_antechamber"; + name = "Theta prototype lab blast door" }, -/turf/simulated/floor/plasteel{ - dir = 10; - icon_state = "blue" +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/area/ruin/ancientstation/comm) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) "dd" = ( /obj/structure/cable, /obj/machinery/power/apc/off_station/empty_charge/directional/east, -/obj/structure/closet/crate, -/obj/item/storage/backpack/old, -/obj/item/storage/backpack/old, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation) "df" = ( -/obj/structure/cable/yellow, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/item/push_broom, +/obj/effect/spawner/random/cobweb/right/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) "dg" = ( /obj/effect/mapping_helpers/turfs/rust, /turf/simulated/wall, /area/ruin/ancientstation/sec) "dh" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "whitepurple" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/proto) "di" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"dj" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/rnd) +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) "dk" = ( /obj/structure/transit_tube_pod{ dir = 4 }, /turf/template_noop, /area/space/nearstation) -"dl" = ( -/obj/item/stack/cable_coil, -/turf/template_noop, -/area/template_noop) "dm" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/thetacorridor) "do" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 + dir = 4 }, +/obj/machinery/light, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "dp" = ( /obj/machinery/power/solar, /obj/structure/cable/yellow{ + d2 = 8; icon_state = "0-8" }, -/turf/simulated/floor/plating/airless, +/turf/simulated/floor/plasteel/airless{ + icon_state = "solarpanel" + }, /area/space/nearstation) "dq" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -1108,26 +1110,22 @@ /area/ruin/ancientstation/hivebot) "dt" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "bluecorner" - }, -/area/ruin/ancientstation/comm) +/obj/structure/transit_tube/station/dispenser/reverse/flipped, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "du" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "arrivalcorner" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "dv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/floor/plasteel{ - dir = 6; - icon_state = "blue" - }, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "dw" = ( /obj/effect/decal/cleanable/dirt, @@ -1135,42 +1133,47 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/hydroponics) "dx" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/soap/nanotrasen, -/turf/simulated/floor/plasteel{ - dir = 6; - icon_state = "blue" +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 }, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "dy" = ( -/obj/machinery/computer/nonfunctional, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) -"dz" = ( -/obj/structure/transit_tube/station/reverse, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/arrows/black, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) -"dA" = ( -/obj/structure/sign/poster/contraband/donut_corp, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/sec) -"dB" = ( -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 +"dz" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) +"dB" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "dC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, /area/ruin/ancientstation/thetacorridor) "dD" = ( /obj/effect/decal/cleanable/dirt, @@ -1204,41 +1207,58 @@ /obj/machinery/door/airlock/medical/glass{ name = "Medical Bay" }, +/obj/machinery/door/firedoor/closed, /turf/simulated/floor/plasteel/airless, /area/ruin/ancientstation/betanorth) "dJ" = ( -/obj/machinery/atmospherics/portable/canister, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/betanorth) -"dK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, /obj/structure/cable{ - icon_state = "2-4" + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/item/kirbyplants/dead, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"dK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/large/dead, /mob/living/simple_animal/hostile/hivebot/strong, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "dL" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 10; - icon_state = "blue" +/obj/item/cultivator, +/obj/item/cultivator, +/obj/item/shovel/spade{ + pixel_x = 4; + pixel_y = 4 }, -/area/ruin/ancientstation/comm) -"dM" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/dice/d6, -/turf/simulated/floor/plasteel{ - icon_state = "blue" +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/bag/plants/seed_sorting_tray, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/ruin/ancientstation/comm) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/hydroponics) +"dM" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/engi) "dN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/engi) "dO" = ( @@ -1248,20 +1268,46 @@ "dP" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/tank/internals/emergency_oxygen, -/turf/simulated/floor/plasteel{ - icon_state = "blue" - }, -/area/ruin/ancientstation/comm) +/obj/item/storage/toolbox/mechanical/old, +/obj/item/apc_electronics, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) "dQ" = ( +/turf/simulated/mineral/ancient/outer, +/area/ruin/ancientstation/thetacorridor) +"dR" = ( /obj/structure/cable{ - icon_state = "1-2" + d2 = 2; + icon_state = "0-2" }, -/obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"dR" = ( +/obj/machinery/power/apc/off_station/empty_charge/directional/east, +/obj/structure/closet/crate/secure/oldstation/rechargers, +/obj/effect/spawner/random/cobweb/right/frequent, +/obj/effect/spawner/random/cobweb/left/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/comm) +"dS" = ( +/obj/structure/sign/lifestar, +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, +/area/ruin/ancientstation/betanorth) +"dU" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/template_noop, +/area/space/nearstation) +"dV" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ name = "Hydroponics" @@ -1269,78 +1315,26 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/hydroponics) -"dS" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/item/cultivator, -/obj/item/cultivator, -/obj/item/shovel/spade{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/bag/plants/seed_sorting_tray, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/hydroponics) -"dT" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/hydroponics) -"dU" = ( -/obj/structure/table, -/obj/item/seeds/harebell, -/obj/item/seeds/carrot, -/obj/item/seeds/potato, -/obj/item/seeds/ambrosia, -/obj/item/seeds/poppy, -/obj/item/seeds/grape, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/hydroponics) -"dV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) "dW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "dX" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/off_station/empty_charge/directional/east, -/obj/structure/closet/crate/secure/oldstation/rechargers, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/comm) -"dY" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) -"dZ" = ( -/obj/machinery/computer/nonfunctional, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "red" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/ruin/ancientstation/sec) -"ea" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) +"dY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) "eb" = ( /obj/machinery/light{ dir = 8 @@ -1348,6 +1342,15 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/rnd) +"ed" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/off_station/empty_charge/directional/east, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) "ee" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/mecha_part_fabricator, @@ -1373,9 +1376,11 @@ "eh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/rnd) "ei" = ( /obj/item/circuitboard/sleeper, /obj/effect/decal/cleanable/dirt, @@ -1390,73 +1395,62 @@ }, /area/ruin/ancientstation/betanorth) "ek" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, -/area/ruin/ancientstation/betanorth) -"el" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 5; - icon_state = "red" - }, -/area/ruin/ancientstation/sec) -"em" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/item/kirbyplants/dead, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "green" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/area/ruin/ancientstation/hydroponics) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) "en" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "eo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/engi) -"ep" = ( -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "greencorner" + icon_state = "cafeteria" }, -/area/ruin/ancientstation/hydroponics) +/area/ruin/ancientstation/kitchen) "eq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/generic, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, /area/ruin/ancientstation) "er" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/hydroponics) +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall/r_wall, +/area/ruin/ancientstation/atmo) "es" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/all_access/directional/west{ + report_danger_level = 0 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/hydroponics) +/area/ruin/ancientstation/thetacorridor) "et" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -1468,24 +1462,16 @@ }, /area/ruin/ancientstation/engi) "eu" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/table/reinforced, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "red" }, /area/ruin/ancientstation/sec) -"ev" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) "ew" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1493,10 +1479,12 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "ex" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/rnd) +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/remains/robot{ + icon_state = "gib5" + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) "ey" = ( /obj/machinery/light/small{ dir = 4 @@ -1518,29 +1506,40 @@ }, /area/ruin/ancientstation/betanorth) "eB" = ( -/obj/item/solar_assembly, -/obj/item/tracker_electronics, -/turf/simulated/floor/plating/airless, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/cobweb/left/frequent, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc/off_station/empty_charge/directional/west, +/turf/simulated/floor/plating, /area/ruin/ancientstation/betanorth) "eC" = ( /obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "eD" = ( -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/power/terminal{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) -"eE" = ( -/obj/structure/cable{ - icon_state = "0-2" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemical Storage" }, -/obj/machinery/power/smes/engineering{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"eE" = ( +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/smes/engineering{ charge = 0 }, /obj/effect/decal/cleanable/dirt, @@ -1554,21 +1553,24 @@ }, /area/ruin/ancientstation/hydroponics) "eG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor, +/obj/machinery/light{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/blood/tracks/mapped{ + dir = 5 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/area/ruin/ancientstation/thetacorridor) "eH" = ( /obj/machinery/light/small{ dir = 4 }, -/obj/item/kirbyplants/dead, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 5; - icon_state = "green" - }, +/obj/machinery/hydroponics/soil, +/turf/simulated/floor/grass, /area/ruin/ancientstation/hydroponics) "eI" = ( /obj/effect/decal/cleanable/dirt, @@ -1578,40 +1580,19 @@ }, /area/ruin/ancientstation/sec) "eJ" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "yellow" - }, -/area/ruin/ancientstation/engi) -"eK" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/lattice/catwalk, +/obj/effect/mapping_helpers/turfs/damage, /turf/simulated/floor/plating/airless, /area/space/nearstation) +"eK" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) "eL" = ( -/obj/machinery/light{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 - }, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "blue" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/comm) "eM" = ( /obj/machinery/door/firedoor, @@ -1619,22 +1600,21 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "eN" = ( -/obj/structure/sign/poster/official/here_for_your_safety, -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/sec) -"eO" = ( -/obj/structure/table, -/obj/item/paper, +/obj/machinery/door/firedoor, +/mob/living/simple_animal/hostile/hivebot, +/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) +/area/ruin/ancientstation/thetacorridor) +"eO" = ( +/obj/structure/lattice, +/obj/item/solar_assembly, +/turf/template_noop, +/area/space/nearstation) "eP" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/nonfunctional, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/sec) "eQ" = ( @@ -1650,16 +1630,10 @@ }, /area/ruin/ancientstation/sec) "eS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/obj/machinery/computer/nonfunctional, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "eV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -1681,107 +1655,132 @@ /area/ruin/ancientstation/thetacorridor) "eY" = ( /obj/structure/cable/yellow{ - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/engi) "eZ" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "fa" = ( -/obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/dirt, +/obj/item/stack/tile/catwalk, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/engi) "fb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" }, -/obj/machinery/door/poddoor{ - id_tag = "ancient" +/obj/machinery/power/terminal{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/powered) +/turf/simulated/floor/catwalk, +/area/ruin/ancientstation/engi) "fc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/light/small{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"fd" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/maintenance_hatch, +/obj/item/stack/cable_coil{ + amount = 2 + }, /turf/simulated/floor/plating, +/area/ruin/ancientstation/engi) +"fd" = ( +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, /area/ruin/ancientstation/hydroponics) "fe" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/light/small{ - dir = 8 - }, +/obj/effect/decal/cleanable/cobweb2, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "ff" = ( -/obj/machinery/door/poddoor{ - id_tag = "ancient" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/public/glass{ + name = "Charlie Station Cryogenics Room" }, -/obj/machinery/door/firedoor/closed, -/obj/machinery/door/airlock/security, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) +/area/ruin/ancientstation) "fg" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, /obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 8 + }, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "red" }, /area/ruin/ancientstation/sec) "fh" = ( -/obj/structure/table, -/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) "fi" = ( -/obj/item/apc_electronics, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/obj/structure/table, +/obj/item/folder/red, +/obj/item/restraints/handcuffs, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "red" + }, /area/ruin/ancientstation/thetacorridor) "fj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/alarm/all_access/directional/west{ - report_danger_level = 0 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"fk" = ( +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"fl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/structure/cable{ - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"fl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, /area/ruin/ancientstation/thetacorridor) "fm" = ( /obj/machinery/light{ @@ -1822,409 +1821,293 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "fr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/betanorth) "fs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, -/area/ruin/ancientstation/betanorth) -"fu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ - icon_state = "4-8" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/betanorth) -"fv" = ( +"fu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/betanorth) -"fw" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, +"fv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation) "fx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, +/obj/structure/transit_tube/station/reverse, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "fy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/computer/nonfunctional{ + dir = 8 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/comm) "fz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/light{ + dir = 8 }, -/obj/machinery/light, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"fA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/chair/office/dark{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access" +/turf/simulated/floor/plasteel{ + icon_state = "redfull" }, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) +/area/ruin/ancientstation/comm) "fB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) "fC" = ( +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) "fD" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "fE" = ( /obj/structure/cable{ + d1 = 2; + d2 = 4; icon_state = "2-4" }, /obj/structure/cable{ + d1 = 1; + d2 = 4; icon_state = "1-4" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "fF" = ( -/obj/item/stack/cable_coil{ - amount = 2 +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "fG" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/engi) "fH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor{ - id_tag = "ancient" +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/powered) +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/catwalk, +/area/ruin/ancientstation/engi) "fI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "2-8" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/obj/item/stack/tile/catwalk, +/turf/simulated/floor/catwalk, +/area/ruin/ancientstation/engi) "fJ" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "fK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Staff Cryopods" }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"fL" = ( /obj/structure/cable{ - icon_state = "4-8" + d1 = 1; + d2 = 8; + icon_state = "1-8" }, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) -"fL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" + dir = 9 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation) "fM" = ( -/obj/machinery/light/small{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 - }, +/obj/machinery/door/airlock/command, +/obj/structure/barricade/wooden, +/obj/machinery/door/firedoor, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"fN" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) +/area/ruin/ancientstation/thetacorridor) "fO" = ( /obj/structure/cable{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, /turf/simulated/floor/plating, /area/ruin/ancientstation) "fP" = ( -/obj/structure/rack, -/obj/item/clothing/suit/space/nasavoid/old, -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 5; - icon_state = "yellow" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/area/ruin/ancientstation/engi) -"fQ" = ( +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"fR" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) -"fR" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, /obj/structure/cable{ - icon_state = "4-8" + d2 = 4; + icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"fS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/power/apc/off_station/empty_charge/directional/south, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/kitchen) +"fS" = ( /obj/structure/cable{ + d1 = 4; + d2 = 8; icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/plating, /area/ruin/ancientstation) "fT" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/rnd) +"fV" = ( +/obj/machinery/light{ + dir = 4 }, -/obj/machinery/door/poddoor{ - id_tag = "ancient" +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office/dark{ + dir = 1 }, -/obj/effect/spawner/window/reinforced, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/sec) -"fU" = ( +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "brownfull" + }, +/area/ruin/ancientstation/comm) +"fW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/spawner/window/reinforced/grilled, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"fY" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) -"fV" = ( +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"fZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" + dir = 10 }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) -"fW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" +/mob/living/simple_animal/hostile/hivebot/strong, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) -"fX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "red" - }, -/area/ruin/ancientstation/sec) -"fY" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/sec) -"fZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/spawner/window/reinforced/grilled, -/turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "ga" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "4-8" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) "gb" = ( +/obj/structure/chair, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" + dir = 9 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) "gc" = ( /mob/living/simple_animal/hostile/carp, /turf/template_noop, /area/template_noop) -"gd" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) "gf" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -2241,37 +2124,42 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "gh" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/mechanical/old, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/thetacorridor) "gi" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/folder/white, +/obj/item/reagent_containers/glass/beaker, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "gj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/thetacorridor) "gk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/turf/simulated/floor/plasteel{ + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) "gl" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -2292,30 +2180,57 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "gn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/betanorth) +/obj/structure/showcase/machinery/oldpod, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) "go" = ( -/obj/item/stack/cable_coil, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/airless, /area/ruin/ancientstation/betanorth) "gp" = ( /obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/engi) -"gq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) "gr" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -2325,64 +2240,83 @@ /turf/simulated/wall, /area/ruin/ancientstation/kitchen) "gt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/maintenance_hatch, -/turf/simulated/floor/plating, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/kitchen_machine/oven, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, /area/ruin/ancientstation/kitchen) "gu" = ( -/obj/structure/table, -/obj/item/reagent_containers/drinks/cans/cola, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) +/area/ruin/ancientstation) "gv" = ( -/obj/structure/table, -/obj/item/flash, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "red" +/obj/machinery/atmospherics/pipe/simple/visible/cyan, +/obj/machinery/atmospherics/pipe/simple/visible/yellow{ + dir = 4 }, -/area/ruin/ancientstation/sec) +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) "gw" = ( -/obj/structure/table, /obj/machinery/light/small, -/obj/item/trash/plate, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/obj/machinery/computer/nonfunctional{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "red" + }, /area/ruin/ancientstation/thetacorridor) "gx" = ( /obj/structure/chair{ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "red" + }, /area/ruin/ancientstation/thetacorridor) "gy" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/ruin/ancientstation/rnd) "gz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/obj/machinery/power/grounding_rod, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) "gA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/grounding_rod, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "gB" = ( -/obj/item/solar_assembly, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/betanorth) "gC" = ( -/obj/structure/cable/yellow, -/obj/machinery/power/terminal{ - dir = 4 +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/airlock/e_to_w, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "gD" = ( @@ -2390,6 +2324,7 @@ /obj/machinery/power/smes/engineering{ charge = 0 }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/engi) "gE" = ( @@ -2402,6 +2337,9 @@ "gF" = ( /obj/structure/closet/secure_closet/freezer/fridge, /obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/all_access/directional/north{ + report_danger_level = 0 + }, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, @@ -2412,85 +2350,76 @@ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) -"gH" = ( -/obj/machinery/light/small{ - dir = 1 +"gJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/showcase/machinery/oldpod, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/comm) +"gK" = ( +/obj/machinery/processor, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) -"gI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +"gL" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_y = 10 + }, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) -"gJ" = ( -/obj/structure/cable{ - icon_state = "1-2" +"gM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/alarm/all_access/directional/west{ - report_danger_level = 0 - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"gK" = ( -/obj/machinery/processor, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "cafeteria" +/area/ruin/ancientstation) +"gN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Dining Area" }, -/area/ruin/ancientstation/kitchen) -"gL" = ( -/obj/structure/table, -/obj/machinery/kitchen_machine/microwave, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) -"gM" = ( -/obj/structure/table, -/obj/item/folder/red, +"gO" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/sec) -"gN" = ( -/obj/machinery/light/small{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, /turf/simulated/floor/plasteel{ dir = 4; - icon_state = "red" - }, -/area/ruin/ancientstation/sec) -"gO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 8 + icon_state = "yellow" }, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/engi) "gP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor, +/obj/structure/cable/yellow, +/obj/machinery/power/terminal{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/turf/simulated/floor/catwalk, +/area/ruin/ancientstation/engi) "gQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -2526,64 +2455,49 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "gU" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "gV" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/plating/airless, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, /area/ruin/ancientstation/betanorth) "gW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot/strong, +/obj/item/dice/d6, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/comm) "gX" = ( -/obj/machinery/computer/nonfunctional, -/obj/item/card/id/away/old/apc, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "yellow" +/obj/machinery/shower{ + pixel_y = 20 }, -/area/ruin/ancientstation/engi) -"gY" = ( -/obj/item/clothing/head/welding, -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"gY" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "gZ" = ( -/obj/item/stock_parts/cell{ - charge = 100; - maxcharge = 15000 - }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "yellow" - }, -/area/ruin/ancientstation/engi) +/obj/machinery/firealarm/directional/south, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "ha" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/ruin/ancientstation/kitchen) -"hb" = ( -/obj/effect/decal/cleanable/flour, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "cafeteria" - }, -/area/ruin/ancientstation/kitchen) "hc" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -2591,41 +2505,41 @@ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) -"hd" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 +"he" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "cafeteria" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/area/ruin/ancientstation/kitchen) -"he" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "red" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/ruin/ancientstation/sec) +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) "hf" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/obj/structure/lattice/catwalk, +/obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating/airless, -/area/space/nearstation) +/area/ruin/ancientstation/betanorth) "hg" = ( +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/thetacorridor) "hh" = ( +/obj/structure/chair, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "whitecorner" - }, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "hi" = ( /obj/effect/decal/cleanable/dirt, @@ -2635,12 +2549,12 @@ }, /area/ruin/ancientstation/rnd) "hj" = ( +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 - }, -/mob/living/simple_animal/hostile/hivebot, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "hk" = ( @@ -2658,22 +2572,22 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "hl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/item/stack/cable_coil{ - amount = 2 - }, +/obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating/airless, -/area/space/nearstation) +/area/ruin/ancientstation/betanorth) "hm" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "yellow" +/obj/machinery/light/small{ + dir = 4 }, -/area/ruin/ancientstation/engi) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) "hn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -2681,154 +2595,127 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "ho" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "yellow" - }, -/area/ruin/ancientstation/engi) +/obj/structure/cable/yellow, +/obj/structure/lattice/catwalk, +/obj/machinery/power/tracker, +/turf/template_noop, +/area/space/nearstation) "hp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/light/small{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/portables_connector, +/obj/machinery/atmospherics/portable/canister/air, /turf/simulated/floor/plasteel{ - dir = 4; + dir = 9; icon_state = "yellow" }, /area/ruin/ancientstation/engi) "hq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/area/ruin/ancientstation/engi) "hr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Dining Area" - }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/nonfunctional, /turf/simulated/floor/plasteel{ - icon_state = "cafeteria" + icon_state = "whitepurplefull" }, -/area/ruin/ancientstation/kitchen) +/area/ruin/ancientstation/comm) "hs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/obj/structure/lattice/catwalk, +/obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating/airless, -/area/space/nearstation) +/area/ruin/ancientstation/betanorth) "ht" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/computer/general_air_control/large_tank_control{ + dir = 8; + inlet_injector_autolink_id = "theta_air_in"; + name = "Mixed Air Supply Control"; + outlet_vent_autolink_id = "theta_air_out"; + outlet_setting = 2000; + autolink_sensors = list("air_sensor"="Tank") }, -/obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) "hu" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/broken_bottle, -/obj/item/soap/nanotrasen, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/obj/structure/closet/crate/medical, +/obj/item/defibrillator, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) "hv" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/folder/white, -/obj/item/reagent_containers/glass/beaker, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "hw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/chem_master, -/obj/item/reagent_containers/glass/beaker, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/rnd) -"hx" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) -"hy" = ( +"hx" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemical Storage" +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) -"hz" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ +"hy" = ( +/obj/structure/window/plasmareinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) -"hA" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bottle/phosphorus{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/reagent_containers/glass/bottle/oxygen{ - pixel_x = 6; - pixel_y = 6 +/obj/machinery/atmospherics/unary/outlet_injector/on{ + dir = 8; + autolink_id = "theta_n2_in" }, -/obj/item/reagent_containers/glass/bottle/nitrogen{ - pixel_x = 6 +/turf/simulated/floor/engine/air, +/area/ruin/ancientstation/atmo) +"hz" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, -/obj/item/reagent_containers/glass/bottle/mercury{ - pixel_x = -5 +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" }, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/kitchen) "hB" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/item/reagent_containers/glass/bottle/lithium{ - pixel_y = 6 - }, -/obj/item/reagent_containers/glass/bottle/iron{ - pixel_x = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 }, -/obj/item/reagent_containers/glass/bottle/iodine{ - pixel_x = -3 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "hC" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, @@ -2838,40 +2725,46 @@ }, /area/ruin/ancientstation) "hD" = ( +/obj/machinery/seed_extractor, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "green" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, -/area/ruin/ancientstation/hydroponics) -"hE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 10 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/hydroponics) +"hE" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, -/obj/machinery/door/airlock/maintenance_hatch, -/turf/simulated/floor/plating, +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "hF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "green" - }, -/area/ruin/ancientstation/hydroponics) +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/probably, +/turf/simulated/wall, +/area/ruin/ancientstation/comm) "hG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light/small{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "cautioncorner" + dir = 8; + icon_state = "yellow" }, /area/ruin/ancientstation/engi) "hH" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/machinery/door/firedoor, @@ -2889,72 +2782,42 @@ }, /area/ruin/ancientstation/kitchen) "hJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/structure/lattice/catwalk, /obj/structure/cable/yellow{ - icon_state = "4-8" + d1 = 1; + d2 = 8; + icon_state = "1-8" }, -/obj/structure/lattice/catwalk, -/turf/simulated/floor/plating/airless, +/turf/template_noop, /area/space/nearstation) "hK" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"hN" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/salvage/ruin/nanotrasen, /turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "red" - }, -/area/ruin/ancientstation/sec) -"hL" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access" - }, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/engi) -"hM" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "green" + icon_state = "whitepurplefull" }, -/area/ruin/ancientstation/hydroponics) -"hN" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/toy/nuke, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/comm) "hO" = ( -/obj/structure/table, +/obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, -/obj/machinery/recharger, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/turf/simulated/floor/plating, +/area/ruin/ancientstation) "hP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/chem_heater, /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/rnd) "hQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "hR" = ( @@ -2990,16 +2853,11 @@ /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "hV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/particle_accelerator/particle_emitter/right, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) -"hW" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Dining Area" }, -/obj/machinery/firealarm/directional/west, -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -3007,6 +2865,13 @@ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) +"hW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "hX" = ( /obj/structure/table, /obj/item/kitchen/utensil/fork, @@ -3057,43 +2922,50 @@ }, /area/ruin/ancientstation/kitchen) "ic" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/chair{ - dir = 8 +/obj/machinery/power/apc/off_station/empty_charge/directional/north, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "cafeteria" - }, -/area/ruin/ancientstation/kitchen) +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) "id" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ - icon_state = "0-2" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/off_station/empty_charge/directional/north, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) "ie" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, /obj/structure/cable{ - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/machinery/light{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "if" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "ig" = ( @@ -3104,12 +2976,17 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "ih" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "whitecorner" +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/area/ruin/ancientstation/rnd) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "ii" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -3151,38 +3028,32 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "im" = ( -/obj/machinery/light{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "in" = ( /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "io" = ( -/obj/structure/closet/crate/medical, -/obj/item/defibrillator, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/atmo) -"ip" = ( -/obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall, -/area/ruin/ancientstation/atmo) -"iq" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"iq" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/structure/sign/poster/official/safety_internals, +/turf/simulated/wall, +/area/ruin/ancientstation/kitchen) "ir" = ( /obj/structure/cable{ + d2 = 2; icon_state = "0-2" }, /obj/machinery/power/smes/engineering{ @@ -3192,11 +3063,11 @@ /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "is" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/item/wrench, -/obj/item/wirecutters, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) "it" = ( /obj/structure/sign/biohazard{ icon_state = "radiation"; @@ -3206,72 +3077,70 @@ /turf/simulated/wall, /area/ruin/ancientstation/engi) "iu" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks/mapped, +/obj/effect/decal/remains/human, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "iv" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, +/obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/north, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "iw" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "ix" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "iy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation) "iz" = ( -/obj/machinery/atmospherics/unary/vent_pump{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "iB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/spawner/window/reinforced/grilled, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" }, -/obj/structure/cable/yellow{ - icon_state = "2-4" +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" }, -/obj/structure/cable/yellow{ - icon_state = "1-4" +/obj/machinery/door/poddoor{ + id_tag = "ancient" }, -/obj/structure/lattice/catwalk, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) -"iC" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/sign/engineering, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/atmo) +/turf/simulated/floor/plating, +/area/ruin/ancientstation/powered) "iD" = ( /obj/machinery/light/small{ dir = 8 @@ -3288,144 +3157,111 @@ /area/ruin/ancientstation/engi) "iF" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/engi) -"iG" = ( /obj/structure/cable{ + d2 = 4; icon_state = "0-4" }, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering{ - name = "Backup Generator Room" - }, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "iH" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics" }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ - icon_state = "1-8" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"iI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"iJ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"iJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "iK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) "iL" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) "iM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"iN" = ( -/obj/machinery/door/poddoor{ - id_tag = "ancient" - }, -/obj/machinery/door/airlock/command{ - name = "Theta Station Access" - }, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/powered) -"iQ" = ( -/obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "greencorner" +/obj/structure/showcase/machinery/oldpod{ + dir = 1 }, -/area/ruin/ancientstation/hydroponics) -"iR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/comm) +"iN" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/structure/girder, +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "iS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"iT" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) +"iT" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plasteel/dark, +/area/ruin/ancientstation/hivebot) "iU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, +/obj/structure/sign/restroom{ + pixel_y = 32 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation) "iV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1; - in_use = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"iW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/power/apc/off_station/empty_charge/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/hydroponics) -"iX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) +"iX" = ( +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, +/area/ruin/ancientstation/rnd) "iY" = ( /obj/effect/decal/cleanable/dirt, /obj/item/stack/cable_coil/random, @@ -3447,29 +3283,42 @@ /area/ruin/ancientstation/engi) "jb" = ( /obj/structure/table, -/obj/item/stack/cable_coil{ - amount = 15 - }, /obj/item/paper/fluff/ruins/oldstation/generator_manual, /obj/effect/decal/cleanable/dirt, +/obj/item/stack/cable_coil{ + amount = 2 + }, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) "jc" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/light/small{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/dead, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) "jd" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, /obj/structure/cable{ - icon_state = "2-8" + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) "je" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/oil, @@ -3482,243 +3331,173 @@ /area/ruin/ancientstation) "jg" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/dead, +/obj/item/kirbyplants/large/dead, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) -"jh" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, +"jm" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/dead, -/turf/simulated/floor/plasteel, +/obj/structure/particle_accelerator/particle_emitter/center, +/turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) -"ji" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +"jn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) +"jo" = ( /obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/large/dead, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) -"jj" = ( -/obj/structure/cable{ - icon_state = "4-8" +"jp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"jk" = ( +/obj/effect/spawner/window/reinforced/grilled, /obj/structure/cable{ - icon_state = "4-8" + d2 = 8; + icon_state = "0-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"jl" = ( /obj/structure/cable{ - icon_state = "2-8" + d2 = 4; + icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"jm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/particle_accelerator/particle_emitter/center, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) -"jn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/science, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"jo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/dead, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"jp" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/atmo) +/turf/simulated/floor/plating, +/area/ruin/ancientstation/sec) "jq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation) "jr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"js" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) -"jt" = ( -/obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/salvage/ruin/nanotrasen, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/comm) -"ju" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, -/obj/machinery/door/airlock/highsecurity{ - name = "Prototype Laboratory" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4 }, -/turf/simulated/floor/plasteel{ - icon_state = "whitehall" +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"js" = ( +/obj/machinery/door/poddoor{ + id_tag = "ancient" }, -/area/ruin/ancientstation/proto) -"jv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, -/obj/machinery/door/airlock/highsecurity{ - name = "Prototype Laboratory" +/obj/machinery/door/airlock/command{ + name = "Theta Station Access" }, -/turf/simulated/floor/plasteel{ - icon_state = "whitehall" +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/powered) +"jt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 }, -/area/ruin/ancientstation/proto) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "jw" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/obj/structure/lattice/catwalk, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "jx" = ( -/obj/effect/decal/cleanable/cobweb, +/obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ruin/ancientstation) +/area/ruin/ancientstation/thetacorridor) "jy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/meter, /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/cyan, /turf/simulated/floor/plating, /area/ruin/ancientstation) "jz" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/obj/machinery/atmospherics/trinary/mixer{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) "jA" = ( -/obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) -"jB" = ( -/obj/structure/table/reinforced, -/obj/item/mod/control/pre_equipped/prototype, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) "jC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor{ - id_tag = "proto" - }, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"jD" = ( /obj/machinery/light{ - dir = 1; - in_use = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/proto) -"jE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc/off_station/empty_charge/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/kitchen) "jF" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall/r_wall, +/area/ruin/ancientstation/thetacorridor) "jG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"jH" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/machinery/light/small{ dir = 4 }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc/off_station/empty_charge/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) -"jI" = ( -/obj/machinery/light{ - dir = 1; - in_use = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"jJ" = ( -/obj/structure/table/reinforced, -/obj/machinery/the_singularitygen/tesla, +/area/ruin/ancientstation) +"jH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) "jK" = ( -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 }, -/turf/simulated/floor/engine/vacuum, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "jL" = ( -/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "jM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/item/storage/backpack/old, +/obj/item/storage/backpack/old, /turf/simulated/floor/plating, /area/ruin/ancientstation) "jN" = ( @@ -3726,6 +3505,8 @@ dir = 1 }, /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, @@ -3733,102 +3514,121 @@ /turf/simulated/floor/plating, /area/ruin/ancientstation) "jO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "jP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/structure/showcase/machinery/oldpod{ + dir = 1 }, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/machinery/oldpod, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/plasteel/white, /area/ruin/ancientstation) "jQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/machinery/oldpod, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"jR" = ( -/obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"jS" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" }, -/obj/item/paper/fluff/ruins/oldstation/protosuit, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"jR" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"jT" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/structure/cable, +/obj/machinery/power/apc/off_station/empty_charge/directional/east, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "yellow" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor{ - id_tag = "proto" +/area/ruin/ancientstation/engi) +"jT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/proto) "jU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/table/reinforced, +/obj/item/mod/control/pre_equipped/prototype, +/obj/machinery/light{ + dir = 1; + in_use = 1 }, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"jV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"jW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/door/window/reinforced/reversed{ + name = "prototype display case"; + req_access = list(301) }, -/turf/simulated/floor/plasteel/white, +/turf/simulated/floor/engine, /area/ruin/ancientstation/proto) -"jX" = ( -/obj/structure/window/reinforced{ - dir = 8 +"jV" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor{ - id_tag = "proto" +/obj/machinery/door_control{ + name = "Theta prototype lab lockdown button"; + id = "prototype_vault_antechamber"; + pixel_y = 24; + req_access = list(301) }, /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/proto) -"jY" = ( +"jW" = ( /obj/structure/table/reinforced, +/obj/machinery/the_singularitygen/tesla, /obj/machinery/light{ - dir = 4 + dir = 1; + in_use = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/reinforced/normal{ + name = "prototype display case"; + req_access = list(301) + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"jX" = ( +/obj/structure/table/reinforced, /obj/item/salvage/ruin/nanotrasen, -/turf/simulated/floor/plasteel/white, +/obj/machinery/door/window/reinforced/reversed{ + name = "prototype display case"; + req_access = list(301) + }, +/turf/simulated/floor/engine, /area/ruin/ancientstation/proto) "jZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/atmo) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) "ka" = ( -/obj/structure/window/reinforced, -/turf/simulated/floor/engine/vacuum, -/area/ruin/ancientstation/atmo) +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "kb" = ( /obj/machinery/atmospherics/unary/tank/air{ dir = 4 @@ -3836,16 +3636,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/ancientstation) -"kc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) "kd" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -3860,69 +3650,40 @@ /area/ruin/ancientstation) "kf" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/nonfunctional, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/powered) -"kg" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/spray/weedspray, -/obj/item/reagent_containers/spray/pestspray, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/glass/bottle/nutrient/mut, -/turf/simulated/floor/plating, /area/ruin/ancientstation) "kh" = ( -/obj/structure/closet/crate/engineering/electrical, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/cobweb/left/frequent, /turf/simulated/floor/plating, /area/ruin/ancientstation) -"ki" = ( +"kk" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ +/obj/machinery/computer/nonfunctional{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"kj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"kk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/atmo) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/powered) "kl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/lattice/catwalk, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) -"km" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass{ - amount = 30 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation) "kn" = ( /obj/structure/table, @@ -3943,198 +3704,128 @@ /obj/item/paper/fluff/ruins/oldstation, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) -"kp" = ( -/obj/structure/closet/crate/engineering/electrical, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) -"kq" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/oldstation/protohealth, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"kr" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) "ks" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"kt" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, -/obj/item/paper/fluff/ruins/oldstation/protogun, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"ku" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 8 - }, /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) -"kw" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8 +"kt" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/structure/window/reinforced{ +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/template_noop, +/area/space/nearstation) +"ku" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"kw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/engine, -/area/ruin/ancientstation/atmo) -"kx" = ( -/obj/effect/decal/cleanable/egg_smudge, -/obj/machinery/alarm/all_access/directional/north{ - report_danger_level = 0 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"kx" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/egg_smudge, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, /area/ruin/ancientstation/kitchen) -"ky" = ( -/obj/structure/table/reinforced, -/obj/item/healthanalyzer/advanced{ - desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; - name = "prototype health analyzer" - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"kz" = ( -/obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) "kA" = ( -/obj/machinery/computer/nonfunctional{ - dir = 1 +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) -"kB" = ( -/obj/structure/table/reinforced, -/obj/item/gun/energy/e_gun/old, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/white, -/area/ruin/ancientstation/proto) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) "kC" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 1 +/obj/machinery/atmospherics/binary/pump{ + dir = 8; + name = "N2 to Pure" }, -/turf/simulated/floor/plating/airless, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, /area/ruin/ancientstation/atmo) "kD" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/portable/canister/air, -/turf/simulated/floor/engine, -/area/ruin/ancientstation/atmo) -"kE" = ( +/obj/structure/sign/poster/official/cleanliness, /obj/effect/mapping_helpers/turfs/rust, -/turf/simulated/wall/indestructible/riveted, -/area/ruin/ancientstation/proto) +/turf/simulated/wall, +/area/ruin/ancientstation) "kF" = ( -/obj/structure/transit_tube_pod{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 }, -/obj/structure/transit_tube/station/reverse{ - dir = 1 +/obj/machinery/light/small{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/arrows/black{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "kG" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ +/obj/machinery/atmospherics/unary/portables_connector{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/portable/canister/nitrogen, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) "kH" = ( /turf/simulated/mineral/random/high_chance, /area/ruin/unpowered) "kI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/human/alive/old/sec, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"kJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/human/alive/old/sci, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) -"kK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/closet/crate/secure/weapon, +/obj/item/melee/baton, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "red" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/human/alive/old/eng, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation) +/area/ruin/ancientstation/thetacorridor) "kL" = ( /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/hostile/hivebot/strong, /turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/rnd) "kM" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/hostile/hivebot, +/obj/machinery/door/firedoor, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "kN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation) "kO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4148,18 +3839,20 @@ /mob/living/simple_animal/hostile/hivebot/strong, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) -"kQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) "kR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "kS" = ( @@ -4195,10 +3888,11 @@ /area/ruin/ancientstation/rnd) "kX" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/rnd) +/area/ruin/ancientstation/comm) "kY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/particle_accelerator/power_box, @@ -4208,63 +3902,69 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/chem_master, +/obj/item/reagent_containers/glass/beaker, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/plasteel/white, /area/ruin/ancientstation/rnd) "lb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) "lc" = ( -/obj/structure/rack, -/obj/item/stack/cable_coil, -/obj/structure/cable, -/obj/machinery/power/apc/off_station/empty_charge/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 6; - icon_state = "yellow" - }, -/area/ruin/ancientstation/engi) +/turf/simulated/mineral/ancient/outer, +/area/ruin/ancientstation/hivebot) "ld" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"le" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"lf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light{ - dir = 1; - in_use = 1 - }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, -/turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"lg" = ( /obj/structure/cable{ - icon_state = "4-8" + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" }, +/area/ruin/ancientstation/sec) +"le" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge" + }, +/obj/machinery/door/firedoor, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/comm) +"lf" = ( +/turf/simulated/floor/engine/vacuum, +/area/ruin/ancientstation/atmo) "lh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, @@ -4272,30 +3972,11 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "li" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "green" - }, -/area/ruin/ancientstation/hydroponics) -"lj" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/alarm/directional/south, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "greencorner" - }, -/area/ruin/ancientstation/hydroponics) -"lk" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "green" - }, -/area/ruin/ancientstation/hydroponics) +/obj/structure/closet/crate/secure/oldstation/surgery, +/obj/effect/spawner/random/cobweb/right/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) "ll" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4305,85 +3986,68 @@ }, /area/ruin/ancientstation/sec) "lm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "red" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/ruin/ancientstation/sec) -"ln" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "red" - }, -/area/ruin/ancientstation/sec) -"lo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"ln" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen/hop, /turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "red" + dir = 6; + icon_state = "greenfull" }, -/area/ruin/ancientstation/sec) +/area/ruin/ancientstation/comm) "lp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - icon_state = "yellowcorner" + dir = 8; + icon_state = "yellow" }, -/area/ruin/ancientstation/engi) +/area/ruin/ancientstation) "lq" = ( /obj/structure/cable{ + d1 = 1; + d2 = 2; icon_state = "1-2" }, -/obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "cautioncorner" - }, -/area/ruin/ancientstation) +/turf/simulated/floor/catwalk, +/area/ruin/ancientstation/engi) "lr" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/airless, /area/ruin/ancientstation/atmo) -"ls" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/blood/oil, -/obj/machinery/firealarm/directional/west, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "yellow" - }, -/area/ruin/ancientstation/engi) -"lt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "yellow" - }, -/area/ruin/ancientstation/engi) -"lu" = ( +"lt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + in_use = 1 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"lu" = ( /obj/machinery/light/small{ dir = 8 }, @@ -4395,40 +4059,41 @@ }, /area/ruin/ancientstation/sec) "lv" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/obj/item/storage/backpack/old, /obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel{ - dir = 4; + dir = 8; icon_state = "red" }, /area/ruin/ancientstation/sec) "lw" = ( -/obj/structure/cable/yellow, -/obj/machinery/power/solar_control{ - name = "Station Solar Control Computer" +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" }, -/obj/item/paper/solar, -/turf/simulated/floor/plasteel{ - dir = 10; - icon_state = "yellow" +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" }, -/area/ruin/ancientstation/engi) +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) "lx" = ( -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass{ - amount = 30 +/obj/structure/cable/yellow, +/obj/machinery/power/solar_control{ + name = "Charlie-Beta Station Solar Control Computer"; + dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ + dir = 10; icon_state = "yellow" }, /area/ruin/ancientstation/engi) @@ -4440,26 +4105,23 @@ }, /area/ruin/ancientstation/engi) "lz" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/door/poddoor{ + id_tag = "ancient" }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "yellow" +/obj/machinery/door/airlock/command{ + name = "Theta Station Access" }, -/area/ruin/ancientstation/engi) +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/powered) "lA" = ( -/obj/machinery/alarm/all_access/directional/west{ - report_danger_level = 0 - }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/oldstation/security, -/turf/simulated/floor/plasteel{ - dir = 10; - icon_state = "red" - }, -/area/ruin/ancientstation/sec) +/obj/item/stack/cable_coil/yellow, +/obj/structure/table, +/obj/item/stock_parts/cell/high/plus, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) "lB" = ( /obj/structure/table, /obj/item/clothing/gloves/color/fyellow/old, @@ -4480,23 +4142,21 @@ }, /area/ruin/ancientstation/engi) "lD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/alarm/all_access/directional/west{ - report_danger_level = 0 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "lE" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/rpd, -/turf/simulated/floor/plasteel/airless, +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "lF" = ( /obj/effect/decal/cleanable/dirt, @@ -4513,6 +4173,8 @@ /area/ruin/ancientstation/sec) "lH" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/flash, /turf/simulated/floor/plasteel{ icon_state = "red" }, @@ -4528,18 +4190,17 @@ }, /area/ruin/ancientstation/sec) "lJ" = ( -/obj/machinery/atmospherics/binary/pump{ +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel/airless, +/turf/simulated/floor/plating/airless, /area/ruin/ancientstation/atmo) "lK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/alarm/all_access/directional/east{ - report_danger_level = 0 - }, /mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) "lL" = ( @@ -4570,86 +4231,3431 @@ /turf/simulated/floor/plasteel, /area/ruin/ancientstation) "lO" = ( -/obj/structure/transit_tube/station/reverse, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/arrows/black, +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, /turf/simulated/floor/plasteel, -/area/ruin/ancientstation/thetacorridor) -"rN" = ( -/obj/structure/closet/crate/secure/weapon, +/area/ruin/ancientstation) +"lY" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) -"uQ" = ( -/obj/structure/lattice, +/obj/effect/turf_decal/stripes/corner, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"mf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/transit_tube/station/dispenser/reverse/flipped{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"mm" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/soap/nanotrasen, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"my" = ( +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, +/area/template_noop) +"mB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/template_noop, /area/space/nearstation) -"AP" = ( -/obj/effect/spawner/window/reinforced/grilled, -/turf/simulated/floor/plating, -/area/ruin/ancientstation) -"AY" = ( -/obj/machinery/recharge_station, +"mM" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/probably, +/turf/simulated/wall, +/area/ruin/ancientstation/betanorth) +"mQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"nc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) -"CG" = ( +"nd" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/tesla_coil, -/turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) -"Hr" = ( -/obj/structure/table, -/obj/item/salvage/ruin/nanotrasen, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"ng" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "whitepurple" + }, +/area/ruin/ancientstation/proto) +"nh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ - icon_state = "0-2" + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/power/apc/off_station/empty_charge/directional/west, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "red" +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"ni" = ( +/obj/machinery/atmospherics/trinary/filter{ + dir = 4; + filter_type = 2; + name = "Gas filter (N2 tank)"; + on = 1 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"nw" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/area/ruin/ancientstation/sec) -"JF" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/oldstation/research, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"nz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, /turf/simulated/floor/plasteel, /area/ruin/ancientstation/rnd) -"Lu" = ( -/obj/structure/transit_tube/horizontal{ +"nF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/template_noop, -/area/space/nearstation) -"LD" = ( -/obj/machinery/light/small{ +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/poddoor{ + id_tag = "ancient" + }, +/obj/effect/spawner/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/ruin/ancientstation/thetacorridor) +/area/ruin/ancientstation/powered) +"nI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"nK" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"nZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/rnd) +"oe" = ( +/obj/effect/spawner/window/reinforced/grilled, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"op" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"oy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) +"oF" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"oJ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"oK" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"oV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"oZ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"pe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"po" = ( +/obj/machinery/computer/nonfunctional, +/turf/simulated/floor/plasteel{ + icon_state = "redfull" + }, +/area/ruin/ancientstation/comm) +"pr" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/template_noop, +/area/space/nearstation) +"ps" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/spawner/random/dirt/frequent, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/thetacorridor) +"pH" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 9 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"pO" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/alarm/all_access/directional/west{ + report_danger_level = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"qd" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/computerframe{ + dir = 8 + }, +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"qe" = ( +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/simulated/floor/engine/air, +/area/ruin/ancientstation/atmo) +"qj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"qk" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "greenfull" + }, +/area/ruin/ancientstation/comm) +"qm" = ( +/obj/machinery/door/poddoor{ + id_tag = "prototype_vault_antechamber"; + name = "Theta prototype lab blast door" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"qu" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation) +"qv" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"qz" = ( +/turf/simulated/wall/indestructible/riveted, +/area/ruin/ancientstation/proto) +"qJ" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/kitchen) +"qN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"qZ" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/e_gun/old, +/obj/machinery/light, +/obj/machinery/door/window/reinforced/normal{ + dir = 1; + name = "prototype display case"; + req_access = list(301) + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"rn" = ( +/obj/machinery/power/apc/off_station/empty_charge/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/hydroponics) +"ro" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/hydroponics) +"rC" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/effect/spawner/random/cobweb/right/frequent, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"rG" = ( +/obj/structure/table, +/obj/item/rpd, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"rI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"rN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/broken_bottle, +/obj/item/soap/nanotrasen, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"rQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow, +/turf/template_noop, +/area/space/nearstation) +"rU" = ( +/obj/machinery/door/poddoor/multi_tile/impassable/two_tile_hor{ + name = "prototype vault blast doors"; + desc = "A heavy duty blast door that opens mechanically. It was hermetically sealed when the crew went into cryostasis."; + id_tag = "prototype_vault" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/powered) +"rX" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"sa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/recharger/wallcharger{ + name = "old wall charger"; + pixel_y = 28; + pixel_x = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) +"sk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"sm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "whitepurple" + }, +/area/ruin/ancientstation/proto) +"sp" = ( +/obj/structure/girder, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"sq" = ( +/obj/structure/girder/reinforced, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"sx" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel{ + icon_state = "yellowcorner" + }, +/area/ruin/ancientstation/engi) +"sB" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/cobweb/left/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/engi) +"sH" = ( +/turf/simulated/wall, +/area/ruin/ancientstation/comm) +"sI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"sW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/all_access/directional/north{ + report_danger_level = 0 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"ta" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"ts" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/oldpod, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/comm) +"tC" = ( +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, +/area/ruin/ancientstation/atmo) +"tF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/binary/valve{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"tH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"tI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/template_noop, +/area/space/nearstation) +"tL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"tT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"tU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"tY" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protohealth, +/obj/machinery/door/window/reinforced/normal{ + dir = 1; + name = "prototype display case"; + req_access = list(301) + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"uk" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"ut" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/item/megaphone, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"uA" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/emergency_oxygen, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"uQ" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"uR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"uV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/tesla_coil, +/obj/machinery/light/small, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"ve" = ( +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8 + }, +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/simulated/floor/engine/vacuum, +/area/ruin/ancientstation/atmo) +"vf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"vg" = ( +/obj/effect/decal/cleanable/glass/plasma, +/obj/machinery/atmospherics/unary/outlet_injector{ + dir = 8 + }, +/turf/simulated/floor/engine/vacuum, +/area/ruin/ancientstation/atmo) +"vn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/template_noop, +/area/space/nearstation) +"vp" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/janitorialcart{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"vw" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall/r_wall, +/area/ruin/ancientstation/proto) +"vx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"vA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "bluefull" + }, +/area/ruin/ancientstation/comm) +"vD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"vE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id_tag = "ancient" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/engineering/glass{ + name = "Charlie Station Engineering Module" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/powered) +"vH" = ( +/obj/machinery/atmospherics/portable/canister/nitrogen, +/turf/simulated/floor/engine/vacuum, +/area/ruin/ancientstation/atmo) +"vJ" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"vN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/universal, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"vQ" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/structure/sign/poster/official/nanomichi_ad, +/turf/simulated/wall, +/area/ruin/ancientstation/betanorth) +"vV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/clothing/head/chefhat, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"vY" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/engi) +"vZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"wi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"wm" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"wp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"wq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks/mapped{ + dir = 10 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"wD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/human, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) +"wE" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/sec) +"wI" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/frequent, +/turf/simulated/wall, +/area/ruin/ancientstation/comm) +"xj" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/power/apc/off_station/empty_charge/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"xr" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/visible/green, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 4 + }, +/turf/template_noop, +/area/space/nearstation) +"xG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"xP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"xY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/nonfunctional{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"xZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"ya" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 9 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"yt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/showcase/machinery/oldpod{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) +"yw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"yz" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"yB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mob_spawn/human/alive/old/eng, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) +"yT" = ( +/obj/effect/mapping_helpers/turfs/rust/probably, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall/indestructible/riveted, +/area/ruin/ancientstation/proto) +"zg" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/air2{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"zi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"zp" = ( +/obj/machinery/kitchen_machine/grill, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"zC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"zD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"zJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/hydroponics) +"zK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"zR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/large/dead, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"zT" = ( +/obj/structure/table, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) +"zV" = ( +/obj/structure/sign/science, +/turf/simulated/wall, +/area/ruin/ancientstation) +"Ac" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Ak" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Ax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/coin/gold, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "brownfull" + }, +/area/ruin/ancientstation/comm) +"AB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"AI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"AM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 5 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"AO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"AP" = ( +/obj/effect/spawner/window/reinforced/grilled, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"AU" = ( +/obj/structure/table, +/obj/item/storage/backpack/old, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) +"AV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/airlock/highsecurity{ + name = "Prototype Laboratory" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel{ + icon_state = "whitehall" + }, +/area/ruin/ancientstation/thetacorridor) +"AY" = ( +/obj/machinery/door/poddoor{ + id_tag = "ancient" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/command{ + name = "Beta Station Access" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/powered) +"Bb" = ( +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/hivebot) +"Bh" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/sec) +"Bk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" + }, +/turf/template_noop, +/area/space/nearstation) +"Bp" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"BB" = ( +/obj/machinery/atmospherics/pipe/simple/visible{ + dir = 10 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"BC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"BH" = ( +/obj/item/clothing/head/welding, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) +"BM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"BU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"BX" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Cb" = ( +/obj/machinery/light/small{ + dir = 8; + pixel_y = -8 + }, +/obj/structure/mirror{ + name = "dusty mirror"; + pixel_x = -26 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) +"Ce" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"Cg" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"Ch" = ( +/obj/item/reagent_containers/drinks/cans/cola{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/cigpack_robust{ + pixel_x = 8; + pixel_y = 14 + }, +/obj/item/storage/fancy/matches, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"Ci" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/template_noop, +/area/space/nearstation) +"Co" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Cv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Cx" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"Cz" = ( +/obj/structure/lattice, +/obj/structure/closet/crate/engineering/electrical, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/obj/item/paper/solar, +/turf/template_noop, +/area/space/nearstation) +"CA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"CG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/tesla_coil, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"CK" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/structure/sign/poster/official/help_others, +/turf/simulated/wall, +/area/ruin/ancientstation/betanorth) +"CN" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"CS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"CT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"CW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/arrows, +/obj/effect/decal/cleanable/blood/tracks/mapped{ + dir = 9 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"De" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/pod, +/obj/item/bedsheet/red, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) +"Dg" = ( +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"Di" = ( +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "solarpanel" + }, +/area/space/nearstation) +"Dl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/lithium{ + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/bottle/iron{ + pixel_x = 5 + }, +/obj/item/reagent_containers/glass/bottle/iodine{ + pixel_x = -3 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"Dm" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/item/kirbyplants/large/dead, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"DG" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"DK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"DV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/effect/spawner/window/reinforced/grilled, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"Eb" = ( +/obj/structure/lattice, +/obj/machinery/power/solar, +/turf/template_noop, +/area/space/nearstation) +"Eg" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"Eh" = ( +/turf/simulated/mineral/ancient/outer, +/area/ruin/unpowered) +"Em" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"Es" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/flag/nt, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "greenfull" + }, +/area/ruin/ancientstation/comm) +"Et" = ( +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall/r_wall, +/area/ruin/ancientstation/proto) +"Eu" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks/mapped{ + dir = 9 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Ev" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"EK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "greencorner" + }, +/area/ruin/ancientstation/hydroponics) +"EM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Fg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/template_noop, +/area/space/nearstation) +"Fr" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 9 + }, +/obj/structure/showcase/machinery/server_broken, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"Ft" = ( +/obj/machinery/cooker/deepfryer, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"Fv" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/engi) +"FG" = ( +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/simulated/floor/engine/vacuum, +/area/ruin/ancientstation/atmo) +"FI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/toy/nuke, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"FP" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) +"FQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel{ + icon_state = "green" + }, +/area/ruin/ancientstation/hydroponics) +"FZ" = ( +/obj/effect/mob_spawn/human/alive/old/sec{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) +"Gi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Gq" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/nonfunctional{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"Gv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Gw" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/frequent, +/turf/simulated/wall, +/area/ruin/ancientstation/kitchen) +"GB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"GT" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) +"He" = ( +/obj/effect/mapping_helpers/turfs/rust/probably, +/turf/simulated/wall/indestructible/riveted, +/area/ruin/ancientstation/proto) +"Hj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/lightreplacer, +/obj/item/storage/box/lights/mixed, +/obj/item/caution, +/obj/item/caution, +/obj/item/caution, +/obj/item/caution, +/obj/item/storage/bag/trash, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"Hn" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/probably, +/turf/simulated/wall, +/area/ruin/ancientstation) +"Hw" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/betanorth) +"HO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/template_noop, +/area/space/nearstation) +"HQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/engineering/glass{ + name = "Beta Station Engineering Module" + }, +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Ii" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/firealarm/directional/north, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "whitepurple" + }, +/area/ruin/ancientstation/rnd) +"Ik" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks/mapped{ + dir = 5 + }, +/obj/effect/turf_decal/arrows, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Il" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/oldpod, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/comm) +"Im" = ( +/obj/structure/lattice/catwalk, +/obj/item/solar_assembly, +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" + }, +/turf/template_noop, +/area/space/nearstation) +"Iu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/engineering/electrical, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Iw" = ( +/obj/machinery/kitchen_machine/microwave{ + pixel_y = 6 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"IB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/security{ + name = "Theta Station security checkpoint" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"IL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"IP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen{ + pixel_y = 25 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"IQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"IX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/simulated/floor/plasteel{ + icon_state = "green" + }, +/area/ruin/ancientstation/hydroponics) +"Jd" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 9 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"Jh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Jn" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 5 + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"Jo" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"Jt" = ( +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "whitepurple" + }, +/area/ruin/ancientstation/proto) +"Jz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/secure/oldstation/security, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) +"JF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/secure/oldstation/research, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"JI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"JO" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/hydroponics/soil, +/turf/simulated/floor/grass, +/area/ruin/ancientstation/hydroponics) +"JV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Kf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Kj" = ( +/obj/structure/sign/poster/official/science, +/obj/effect/mapping_helpers/turfs/rust, +/turf/simulated/wall, +/area/ruin/ancientstation/thetacorridor) +"Kl" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/hydroponics/soil, +/turf/simulated/floor/grass, +/area/ruin/ancientstation/hydroponics) +"Kn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/alarm/directional/south, +/turf/simulated/floor/plasteel{ + icon_state = "green" + }, +/area/ruin/ancientstation/hydroponics) +"Ku" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"KA" = ( +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "solarpanel" + }, +/area/space/nearstation) +"KC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/alarm/all_access/directional/west{ + report_danger_level = 0 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"KQ" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/hivebot) +"Ld" = ( +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"Lg" = ( +/obj/machinery/atmospherics/pipe/simple/visible/green{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"Lj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Lk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Lm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table, +/obj/item/salvage/ruin/nanotrasen, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) +"Ln" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"Lr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/item/push_broom, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"Lu" = ( +/obj/structure/transit_tube/horizontal{ + dir = 4 + }, +/turf/template_noop, +/area/space/nearstation) +"Lz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"LB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"LC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"LD" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"LE" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"LG" = ( +/obj/machinery/computer/nonfunctional{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"LH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"LO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/template_noop, +/area/space/nearstation) +"LR" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "cautioncorner" + }, +/area/ruin/ancientstation) +"Mk" = ( +/obj/machinery/computer/nonfunctional, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "brownfull" + }, +/area/ruin/ancientstation/comm) +"Mw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"My" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/hydroponics) +"MI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"MK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/drinks/mug/ce{ + pixel_y = 7; + pixel_x = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "whiteyellowfull" + }, +/area/ruin/ancientstation/comm) +"ML" = ( +/obj/structure/table/reinforced, +/obj/machinery/door_control/no_emag{ + name = "Theta prototype storage vault lockdown"; + id = "prototype_vault"; + req_access = list(301) + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"MP" = ( +/mob/living/simple_animal/hostile/hivebot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/cobweb/right/frequent, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"MS" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/sec) +"Nb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Nh" = ( +/obj/effect/spawner/random/dirt/frequent, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/thetacorridor) +"Nj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "red" + }, +/area/ruin/ancientstation/sec) +"Nw" = ( +/obj/machinery/computer/nonfunctional, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "greenfull" + }, +/area/ruin/ancientstation/comm) +"NQ" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/engi) +"NS" = ( +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/siphon/on{ + dir = 8; + external_pressure_bound = 0; + autolink_id = "co2_out"; + internal_pressure_bound = 4000; + pressure_checks = 2 + }, +/turf/simulated/floor/engine/air, +/area/ruin/ancientstation/atmo) +"Oc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"Oi" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/frequent, +/turf/simulated/wall/r_wall, +/area/ruin/ancientstation/proto) +"Om" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/power/apc/off_station/empty_charge/directional/north, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"Os" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"OB" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction, +/obj/machinery/door/window/reinforced/normal{ + dir = 1; + name = "theta RnD server enclosure"; + req_access = 301 + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"OE" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/engineering{ + name = "Backup Generator Room" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/engi) +"OF" = ( +/obj/effect/spawner/random/fungus/probably, +/turf/simulated/wall, +/area/ruin/ancientstation/hivebot) +"ON" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/janitorialcart{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"OO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/nonfunctional, +/obj/item/card/id/away/old/apc, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) +"OW" = ( +/mob/living/simple_animal/hostile/hivebot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"OY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + in_use = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"OZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"Pa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/simulated/floor/plasteel{ + icon_state = "green" + }, +/area/ruin/ancientstation/hydroponics) +"Ph" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/purple{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"Pz" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"PE" = ( +/obj/machinery/power/solar, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/plasteel/airless{ + icon_state = "solarpanel" + }, +/area/space/nearstation) +"PF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/rnd) +"PG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/template_noop, +/area/space/nearstation) +"PL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/recharger, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"PM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"PO" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/rnd) +"PX" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/atmo) +"Qb" = ( +/obj/structure/table, +/obj/machinery/alarm/all_access/directional/east{ + report_danger_level = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"Qc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Qi" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"Qm" = ( +/obj/item/solar_assembly, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/engineering/electrical, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Qo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"QG" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "brownfull" + }, +/area/ruin/ancientstation/comm) +"QP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) "Rc" = ( +/obj/structure/showcase/machinery/oldpod, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/betanorth) +"Rd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "whitecorner" + }, +/area/ruin/ancientstation/rnd) +"Re" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/flag/nt, +/turf/simulated/floor/plasteel{ + icon_state = "whitepurplefull" + }, +/area/ruin/ancientstation/comm) +"Rj" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/structure/sign/poster/official/safety_report, +/turf/simulated/wall, +/area/ruin/ancientstation/sec) +"Ru" = ( +/mob/living/simple_animal/hostile/hivebot, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Rx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/flour, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"RD" = ( +/obj/machinery/atmospherics/pipe/manifold/visible{ + dir = 1 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"RH" = ( +/obj/structure/showcase/machinery/thermomachine_broken, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"RI" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"RR" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"RV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Sh" = ( +/obj/structure/table/reinforced, +/obj/item/healthanalyzer/advanced{ + desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; + name = "prototype health analyzer" + }, +/obj/machinery/light, +/obj/machinery/door/window/reinforced/reversed{ + name = "prototype display case"; + dir = 1; + req_access = list(301) + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"Sj" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/probably, +/turf/simulated/wall/r_wall, +/area/ruin/ancientstation/proto) +"Sm" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "whitepurplefull" + }, +/area/ruin/ancientstation/comm) +"Sv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/reinforced/normal{ + name = "Cell Door"; + dir = 1; + req_access = list(301) + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"Sx" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/comm) +"SC" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) +"SH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/particle_accelerator/particle_emitter/right, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"SK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/transit_tube/station/dispenser/reverse{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"SM" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "whiteyellowfull" + }, +/area/ruin/ancientstation/comm) +"SR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, +/obj/machinery/power/apc/off_station/empty_charge/directional/north, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/rnd) +"Tb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/lightreplacer, +/obj/item/storage/box/lights/mixed, +/obj/item/caution, +/obj/item/caution, +/obj/item/caution, +/obj/item/caution, +/obj/item/storage/bag/trash, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"Td" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Tm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"Tn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"To" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/thetacorridor) +"Tq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Tw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/obj/machinery/firealarm/directional/west, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"TE" = ( +/obj/effect/mob_spawn/human/alive/old/sci, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation) +"TF" = ( +/obj/effect/spawner/window/reinforced/grilled, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/betanorth) +"TK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"TO" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/catwalk, +/area/ruin/ancientstation/engi) +"TZ" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"Uk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"Ut" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/space/nearstation) +"UA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"UD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"UE" = ( +/obj/machinery/door_control{ + name = "Theta prototype lab lockdown button"; + id = "prototype_vault_antechamber"; + pixel_x = -24; + req_access = list(301) + }, +/obj/effect/spawner/random/dirt/maybe, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/thetacorridor) +"UR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"UV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id_tag = "ancient" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Charlie Station security office" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/powered) +"UW" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protosuit, +/obj/machinery/door/window/reinforced/normal{ + name = "prototype display case"; + req_access = list(301) + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"Va" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Vj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/spawner/random/dirt/maybe, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/thetacorridor) +"Vr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"VA" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"VC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"VJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/large/dead, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/comm) +"VM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"VR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/ancientstation/kitchen) +"VT" = ( +/obj/structure/transit_tube/horizontal, +/turf/template_noop, +/area/space/nearstation) +"VV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/hivebot, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/thetacorridor) +"Wc" = ( +/obj/effect/mapping_helpers/turfs/damage, +/obj/effect/decal/cleanable/generic, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"We" = ( +/obj/machinery/atmospherics/unary/portables_connector, +/obj/machinery/atmospherics/portable/canister/air, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Wk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/table, +/obj/item/ashtray/bronze{ + pixel_x = 8; + pixel_y = 10 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/sec) +"Wp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/rnd) +"Wt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"WC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/lighter/zippo, +/turf/simulated/floor/plasteel{ + icon_state = "redfull" + }, +/area/ruin/ancientstation/comm) +"WL" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/phosphorus{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/bottle/oxygen{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/bottle/nitrogen{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/mercury{ + pixel_x = -5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/rnd) +"Xa" = ( +/obj/structure/showcase/machinery/oldpod{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/betanorth) +"Xc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/effect/spawner/window/reinforced/grilled, +/obj/effect/spawner/airlock/w_to_e, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"Xq" = ( +/mob/living/simple_animal/hostile/hivebot, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/thetacorridor) +"Xw" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "bluefull" + }, +/area/ruin/ancientstation/comm) +"XA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/betanorth) +"XB" = ( /obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/ruin/ancientstation/betanorth) +"XM" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/oldstation/protogun, +/obj/machinery/door/window/reinforced/reversed{ + name = "prototype display case"; + dir = 1; + req_access = list(301) + }, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/proto) +"XS" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/structure/cable{ + d2 = 4; + icon_state = "0-4" + }, /turf/simulated/floor/plating, +/area/ruin/ancientstation/sec) +"XV" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/item/seeds/fungus, +/obj/item/seeds/poppy, +/obj/item/seeds/carrot, +/obj/item/seeds/potato, +/obj/item/seeds/pumpkin, +/obj/item/seeds/wheat, +/obj/item/seeds/ambrosia, +/obj/item/seeds/grape, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation/hydroponics) +"XY" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/frequent, +/turf/simulated/wall, /area/ruin/ancientstation/thetacorridor) -"TF" = ( -/obj/effect/spawner/window/reinforced/grilled, -/turf/simulated/floor/plating/airless, -/area/ruin/ancientstation/betanorth) -"VT" = ( -/obj/structure/transit_tube/horizontal, +"Yc" = ( +/obj/structure/lattice, +/obj/item/stack/cable_coil/yellow, /turf/template_noop, /area/space/nearstation) -"Xq" = ( -/mob/living/simple_animal/hostile/hivebot, +"Yk" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Ys" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel, /area/ruin/ancientstation/thetacorridor) +"Yu" = ( +/obj/machinery/door/firedoor, +/turf/simulated/floor/engine, +/area/ruin/ancientstation/powered) +"YH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"YP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass, +/obj/structure/grille/broken, +/turf/simulated/floor/plating/airless, +/area/ruin/ancientstation/betanorth) +"YQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel{ + icon_state = "green" + }, +/area/ruin/ancientstation/hydroponics) +"YX" = ( +/obj/effect/mapping_helpers/turfs/rust, +/obj/structure/sign/poster/official/pda_ad, +/turf/simulated/wall, +/area/ruin/ancientstation/betanorth) +"Zg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) +"Zh" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/turfs/damage, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/betanorth) +"Zi" = ( +/obj/structure/sign/poster/contraband/donut_corp, +/obj/effect/mapping_helpers/turfs/rust, +/obj/effect/spawner/random/fungus/maybe, +/turf/simulated/wall, +/area/ruin/ancientstation/sec) +"Zn" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel/airless, +/area/ruin/ancientstation/atmo) +"Zx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/bottle/nutrient/mut, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/pestspray, +/obj/item/reagent_containers/spray/weedspray, +/turf/simulated/floor/plating, +/area/ruin/ancientstation) +"ZH" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/blood/oil, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "yellow" + }, +/area/ruin/ancientstation/engi) +"ZR" = ( +/turf/simulated/floor/plasteel/white, +/area/ruin/ancientstation/proto) +"ZT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/ruin/ancientstation) (1,1,1) = {" aa aa +uQ +aa +aa +aa +aa +aa +aa +uQ +uQ +uQ +fr +oF +uQ +aV +uQ +uQ +aa +aa aa aa aa @@ -4661,98 +7667,263 @@ aa aa aa aa +aa +aa +aa +aa +uQ +uQ +uQ +aa +aa +uQ +ni +xr +aa +lE +aa +"} +(2,1,1) = {" +aa +aa +uQ +aa +aa +uQ +uQ +fr +ex +BC +Xa +Rc +fj +bz aV +fu +oF aV uQ aV -aV +fr +uQ +aa aa +aa +aa +aa +aa +uQ +uQ +aa +aa +aa +aa +vx +Ph +uQ +lJ +uQ +dB +cf +Jd +ks uQ +sp +aa +"} +(3,1,1) = {" +uQ +aa +aa +aa +aa +fr +fr +be +be +be +be +be +gZ +bf aV +fu +bz aV +be +be +ei +fr aa aa aa +eJ aa aa aa aa aa -aa -in +lE uQ +er +vD +jK +lE +lJ in -in -in +aE +gv +jz +pH +Lg +sq +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aW +bf +be +hK +JV +bF +be +bf +bf +cN +fC +bf +cR +dr +be +ej +eA +uQ +aa +aa +uQ +aa +aa +aa +aa +sp +jQ +db +iH +PX +jL lr -jZ -kk -ku +iL +lr +iL kC +iL +in +iK +sp aa -uQ +"} +(5,1,1) = {" aa aa aa aa aa -"} -(2,1,1) = {" +aa +bf +bf +bf +bf +bf +bf +Hw +CK +Qi +LC +Hw +dS +bz +dI +bz +bf +fr aa aa +uQ aa aa aa aa +tC +xP +lE +er +zg +lr +Zn +tF +ht +iL +fh +by +qd +uQ +aa +aa +"} +(6,1,1) = {" +aa aa aa aa aa aa aa -aV -be bf -by -by -bz -aV -be -be -ei -aV -uQ +eB +gV +gV +gV +gV +XB +id +xZ +Bp +ek +QP +bY +bY +AO +fs uQ +aa uQ -ae uQ uQ uQ uQ -io -lr -lr -jp -aE -lr -lr -in -lJ -lr -dB -ip -aa -aa -aa -aa +Pz +UD +hu +er +ic +aH +er +NS +qe +hy +er +ve +FG +vg +sq aa "} -(3,1,1) = {" -aa -aa -aa -aa -aa +(7,1,1) = {" aa aa aa @@ -4760,46 +7931,47 @@ aa aa aa aa -aW bf bf +cc +kH +kH +kH +mM +zR +Qi +Uk +cT +UA +Qi +Qi +wi be -be -bf -cR -dr -be -ej -eA -aa -aa +fr aa uQ +uQ aa aa aa -aa -ip +lE in lr -ip -ip -jK -ka -lE -kw -kD -ip -ip -aa -aa -aa -aa +er +rG +Qb +er +aF +cO +aF +er +lf +vH +lf +sq aa "} -(4,1,1) = {" -aa -aa +(8,1,1) = {" aa aa aa @@ -4809,47 +7981,45 @@ aa aa aa aa -uQ -aV -aV +kH +kH +kH +kH bf -be -be +vQ +bU bf -cS -bz -dI -bz bf -aW -aV -aa +bf +bf +bf +YX +HQ +YP +Wc uQ aa aa aa aa aa -iC -in -db -ip -jL -jL -jL -jL -jL -ip -aa -aa -aa -aa -aa +uQ +Dm +er +er +er +er +er +er +er +er +er +er +er +er aa "} -(5,1,1) = {" -aa -aa +(9,1,1) = {" aa aa aa @@ -4860,29 +8030,30 @@ aa aa aa aa -uQ -aV -bo -be -be -be -be -be -be -ek -be +kH +kH +kH +Hw +XA +Mw +cw +bf +Iu be -fr -gn -aV +wp +bR +bR +go +Zh +gB aa aa aa aa uQ -lr -in -in +uQ +uQ +sp aa aa aa @@ -4895,9 +8066,8 @@ aa aa aa aa -aa "} -(6,1,1) = {" +(10,1,1) = {" aa aa aa @@ -4908,38 +8078,36 @@ aa aa aa aa +uQ +kH aa -ab -ab -ab bf +Ln +mf +zD +bf +Qm be +Tq +Kf be -be -cT -be -be -ek -be -be -fs -be -aV -gV -uQ +he +bo +bo +aa uQ +eJ uQ uQ -lr -lr -in -in aa uQ +uQ +aa aa aa uQ aa +uQ aa aa aa @@ -4947,7 +8115,7 @@ aa aa aa "} -(7,1,1) = {" +(11,1,1) = {" aa aa aa @@ -4956,48 +8124,50 @@ aa aa aa aa +uQ +aa aa aa -ab -kH -kH -ab -bf -bf -bU -bf -bf -bf -bf -bf -bf -bz -fs -bz -bf -aW aa +bf +TF +bW +TF +bf +lA +be +fY +bo +bo +he +bo +bo +bo uQ +ae +eJ aa aa +uQ +uQ aa aa aa +uQ aa aa aa -uQ aa aa aa aa aa +"} +(12,1,1) = {" aa aa aa aa -"} -(8,1,1) = {" aa aa aa @@ -5009,26 +8179,24 @@ aa aa aa aa -ab -ab -ab +VT +aa bf -be -be -cw bf -aV -dJ -aV -be +eS be -fs +Tn +bo +mQ +bo +bo be -gB +bo +uQ aa aa -uQ aa +eJ aa aa aa @@ -5036,18 +8204,17 @@ aa aa aa aa -uQ aa aa aa aa aa aa +"} +(13,1,1) = {" aa aa aa -"} -(9,1,1) = {" aa aa aa @@ -5055,33 +8222,29 @@ aa aa aa aa +uQ aa aa aa aa -uQ -ab +VT +aa aa bf +We +ka +Lk +fJ +vZ +VC be -bY -be -bf -aV -uQ -aV -eB -aV -fu -go -aV -uQ -uQ -ae +Td +fr +aW aa aa aa -ae +uQ aa aa aa @@ -5095,50 +8258,46 @@ aa aa aa aa -aa "} -(10,1,1) = {" +(14,1,1) = {" aa aa -gc aa aa aa aa aa aa -uQ aa aa aa aa -bf -TF -bW -TF -bf -uQ -uQ aa -aV -aV -fv -aV -aV aa -uQ -ae +aa +VT aa aa +bf +bf +bf +oe +DV +Em +Xc +oe +bf +bf +bf aa -uQ aa aa +eO aa aa -uQ aa aa +uQ aa aa aa @@ -5146,10 +8305,11 @@ aa aa aa aa -"} -(11,1,1) = {" aa +"} +(15,1,1) = {" aa +gc aa aa aa @@ -5159,25 +8319,20 @@ aa aa aa aa -uQ aa aa aa aa VT -aH -bf -aW aa aa +eO aa -uQ -fv -uQ aa aa -af -cc +hl +wm +fW aa aa aa @@ -5190,17 +8345,17 @@ aa aa aa aa +uQ aa aa -gc aa aa aa -"} -(12,1,1) = {" aa aa aa +"} +(16,1,1) = {" aa aa aa @@ -5208,26 +8363,24 @@ aa aa aa aa -uQ aa aa -uQ aa aa -VT aa aa -uQ aa aa +VT aa aa uQ aa aa aa -aa -uQ +hs +jd +hf aa aa aa @@ -5235,19 +8388,22 @@ uQ aa aa aa +uQ aa aa aa +eO aa aa aa aa aa aa +gc aa aa "} -(13,1,1) = {" +(17,1,1) = {" aa aa aa @@ -5258,21 +8414,20 @@ aa aa aa uQ -uQ -aa aa aa +uQ aa aa VT aa -aa +uQ uQ aa aa aa aa -uQ +dU aa aa aa @@ -5282,14 +8437,13 @@ aa aa aa uQ +uQ aa aa aa aa aa aa -uQ -aa aa aa aa @@ -5297,9 +8451,7 @@ aa aa aa "} -(14,1,1) = {" -aa -aa +(18,1,1) = {" aa aa aa @@ -5314,24 +8466,26 @@ aa aa aa aa -VT aa +VT aa -ae -ae -ae +uQ +PE +PE +PE aa aa -hl +mB aa aa -cC -ae -ae +KA +KA +KA +eO +KA +KA +KA uQ -ae -ae -cH aa aa aa @@ -5340,15 +8494,12 @@ aa uQ aa aa -aa -aa -aa -aa +uQ +eJ aa aa "} -(15,1,1) = {" -aa +(19,1,1) = {" aa aa aa @@ -5359,46 +8510,44 @@ aa aa aa uQ +uQ aa aa aa aa -aa -Lu +VT aa uQ -ck -ck -hf -ck -ck -hs -hf -hf -jw -ck -kl -ck -hf -ck -jw +Ci +Oc +kt +rQ +Bk +HO +rQ +Bk +AI +AI +hJ +Bk +AI +AI +hJ uQ aa aa aa +aa uQ aa -aH -ab -ab aa aa aa +uQ aa aa "} -(16,1,1) = {" -aa +(20,1,1) = {" aa aa aa @@ -5414,41 +8563,39 @@ aa aa aa aa -VT -aa +Lu aa -ae -ae -cH +uQ +cC +cC +cC aa aa -hJ +mB aa aa -ae -cC -ae +KA +KA +KA +uQ +KA +KA +KA +uQ uQ -ae -ae -ae -aa aa aa +Yc aa -dl -ab -ab kH kH -ab +kH aa aa aa aa "} -(17,1,1) = {" -aa +(21,1,1) = {" aa aa aa @@ -5467,89 +8614,133 @@ aa VT aa uQ -ck -ck -eK -hf -hf -iB -hf -ck -ck -jw -ck -hf -ck -ck -ck -df +vn +Lz +qv +rQ +Bk +PG +rQ +Bk +Os +Os +LO +Bk +Os +Os +Os +ho +uQ +aa +aa +aa +kH +kH +kH +kH +kH +aa +aa +aa +"} +(22,1,1) = {" +aa aa aa aa -uQ -ab -ab -kH -kH -ab aa aa aa aa -"} -(18,1,1) = {" +aa +uQ aa aa aa aa aa +VT aa +uQ +cD +cD +cD aa aa +mB aa aa +Di +Di +Di +Cz +Di +Di +Di uQ +uQ +aa +aa +eO +kH +kH +kH +kH +kH +kH aa aa +"} +(23,1,1) = {" aa aa aa -VT aa aa -ae -ae -cD aa aa -hJ aa aa -ae -ae -ae uQ -ae -ae -ae aa aa aa -uQ aa aa -ab -ab -ab +VT aa +uQ +di +pr +Fg +rQ +Bk +HO +rQ +Bk +zC +zC +tI +Im +zC +zC +tI +uQ aa aa +eO aa aa -"} -(19,1,1) = {" +kH +kH +kH +kH +kH aa aa +"} +(24,1,1) = {" +aa aa aa aa @@ -5567,38 +8758,36 @@ aa VT aa uQ -eK -hf -ck -ck -ck -hs -hf -hf -hf -kl -hf -ck -hf -hf -kl -uQ -aa +dp +dp +dp aa aa +mB aa aa +Di +Di +Di +uQ +Di +Di +Di +uQ aa aa aa aa aa aa +kH +kH +kH +kH aa aa "} -(20,1,1) = {" -aa +(25,1,1) = {" aa aa aa @@ -5616,39 +8805,37 @@ aa aa VT aa +uQ +uQ aa -dp -ae -ae aa aa -hJ aa +mB aa -ae -cD -ae -uQ -ae -cD -cD aa aa aa +Eb aa -uQ aa +aa +uQ uQ aa aa aa +uQ aa +uQ aa aa +kH +aa aa -"} -(21,1,1) = {" aa +"} +(26,1,1) = {" aa aa aa @@ -5671,9 +8858,9 @@ uQ aa aa aa -eC -hL -eC +fD +eY +gC aa aa aa @@ -5695,10 +8882,8 @@ aa gc aa aa -aa "} -(22,1,1) = {" -aa +(27,1,1) = {" aa aa aa @@ -5721,9 +8906,9 @@ uQ aa aa aa -eC -fB -eC +vY +eZ +gY aa aa aa @@ -5740,15 +8925,13 @@ uQ aa aa aa -aa -aa +uQ aa aa aa aa "} -(23,1,1) = {" -aa +(28,1,1) = {" aa aa aa @@ -5771,9 +8954,9 @@ cU cU cU eC -eC -fA -eC +fF +en +dM eC cU cU @@ -5790,15 +8973,13 @@ uQ aa aa aa -aa -aa -aa +uQ +uQ aa aa aa "} -(24,1,1) = {" -aa +(29,1,1) = {" aa aa aa @@ -5818,20 +8999,20 @@ VT aa aa cU -gX -ho -dO -dO -fC -gp +hp +hG +dN +fG +gr +GT gp -ls -lw +ZH +lx cU aa aa aa -uQ +eO aa aa aa @@ -5840,15 +9021,13 @@ uQ aa aa aa -aa -aa +uQ aa aa aa aa "} -(25,1,1) = {" -aa +(30,1,1) = {" aa aa aa @@ -5867,17 +9046,17 @@ aa VT aa cU -cU -gZ +Fv +OO dO -eD -eY -fD -eY -gC -dO -lx -cU +fb +fH +TO +fH +gP +wD +gk +Fv cU cU cU @@ -5895,10 +9074,8 @@ aa aa aa aa -aa "} -(26,1,1) = {" -aa +(31,1,1) = {" aa aa aa @@ -5917,19 +9094,19 @@ AP bX AP cU -eJ -dN -en +zT +dO +NQ eE -eZ +fI fE -gq +lq gD -dO +hq ly lB cU -iq +sB iD iZ cU @@ -5945,10 +9122,8 @@ aa aa aa aa -aa "} -(27,1,1) = {" -aa +(32,1,1) = {" aa aa aa @@ -5963,19 +9138,19 @@ aa aa aa az -bB -dz -bC +EM +cz +AB cU et dO -eo +oy dO fa -fF +fc dO dO -gY +BH dO lC cU @@ -5995,10 +9170,8 @@ aa aa aa aa -aa "} -(28,1,1) = {" -aa +(33,1,1) = {" aa aa aa @@ -6013,23 +9186,23 @@ aa aa aa az -bC -bC +Qo +Wt cx cU -fP -hm -hp -hG -dN -fG -gr -lp -lt -lz -lc +bp +gO +dz +cA +bP +FP +kA +sx +SC +jR +bj cU -is +cn iF jb cU @@ -6045,10 +9218,8 @@ aa aa aa aa -aa "} -(29,1,1) = {" -aa +(34,1,1) = {" aa aa aa @@ -6064,23 +9235,23 @@ az az az bD -bZ +AY bD cU cU cU cU cU -fb -fH -fb +vE +iB +vE cU cU cU cU cU it -iG +OE it cU az @@ -6095,10 +9266,8 @@ aa aa aa aa -aa "} -(30,1,1) = {" -aa +(35,1,1) = {" aa aa aa @@ -6108,38 +9277,37 @@ aa aa az az -aK +aS aR aX bg az bE ca -cy -fj +oZ +pO +nw ca -dQ hC hH ca -fI -ca -lq -hC -hq -dQ -fj -cy -iH -jc +VA +bC +LR +lp +Tw +KC +bC +nK +Ak +jg az -jx +kh jM kb +qu az az -az -aa aa aa aa @@ -6147,8 +9315,7 @@ aa aa aa "} -(31,1,1) = {" -aa +(36,1,1) = {" aa aa aa @@ -6157,36 +9324,36 @@ aa aa aa az -dX +dR aL aL aL aL -bp -bF +ch +cd +cy +uk cb -cz -bJ -bJ -bJ -eq -eG -fc -fJ -fc -eG -dV -dV -dV -dV -iu -iI -jd -jq +tT +cb +ZT +fB +jG +op +MI +oV +kl +ck +nh +kl +iJ +Yk +ga +vN jy jN -kc -km +ya +aL dd az aa @@ -6195,42 +9362,40 @@ aa aa aa aa -aa "} -(32,1,1) = {" -aa -aa -aa -aa -aa +(37,1,1) = {" aa aa -al -al -al -al -al -al -al -az -bG -cd -cA -cA +aT +aT +aT +aT +aT +aT +aT +wI +aT +aT +aT +qu +bC +jO +fd +fd cB -dR +dV cB -cA -cA -fK -gs -gs +My +fd +tL +qJ +qJ ha -hr +hV ha gs -gs -iJ +iq +Ac je az az @@ -6238,102 +9403,98 @@ az az az az -az +qu az aa aa aa aa aa -aa "} -(33,1,1) = {" -aa -aa -aa -aa -aa +(38,1,1) = {" aa -al -al -aM -bi +aT +Sx +Es +po +fz +aB bk -bi -dc -al -al -bH -ce -cA -em -dw +aT +aT +aZ +tH +br +aT +eM +YH +fd +JO +EK dw -hD -hM -cA +cZ +fd +cS fL gs gE gG +eo gG -gG -hW +vJ gs -iK +Co eM +qu az -az -jO +Zg kd kn kd bC -az +qu az aa aa aa aa -aa "} -(34,1,1) = {" -aa -aa -aa -aa -aa +(39,1,1) = {" aa -am -aM -aO -jt -at -aS -dt -dL -am -bI -cd +aT +Nw +qk +WC +ci +MK +SM +aG +aT +gJ +du +iM +sH +bG +Ac cB -ep -dw +cZ dw dw cZ -cA -fL +fd +TK +Gw gs gF gG -gG +eo gG hX ha -iJ +Ac jf az -jz +iv bC bC bC @@ -6345,98 +9506,94 @@ aa aa aa aa -aa "} -(35,1,1) = {" -aa -aa -aa -aa -aa +(40,1,1) = {" aa an -aO +ln at -aG at +dx at at -dM +gW bq -bG -cd +at +at +xY +bq +bC +Ac cB cZ dw -dw -dw -cZ -cA -iW +ce +Pa +fd +Eg gs -gG -hb -gG +Ft +Rx +hc +hz hI hY ha -iJ +Ac bC bA bC jP -bC -kJ -bC +TE +UR jP +gn bC AP aa aa aa aa -aa "} -(36,1,1) = {" -aa -aa -aa -aa -aa +(41,1,1) = {" aa an au aA -aG -aG -aG -aG -dt +at +bh +at +at +VJ bq -bG -cd +at +dx +at +bq +bC +Ac cB cZ dw -dS -er -iQ -cA -fL +dL +YQ +fd +rn gs -gH -hc +Iw +gG +VR gG gG hZ ha -iJ +Ac bC bA bC bC bC -bC +RV bC bC bC @@ -6445,98 +9602,94 @@ aa aa aa aa -aa "} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -an -av -aB -aG -aN -aT -aZ -aZ -br -bJ -cf +(42,1,1) = {" +aa +an +av +aN +at +ut +Cx +eL +eL +le +dv +al +dv +fK +fv +sI cB da dw -dT -es -li -fd -fN +hD +FQ +ro +fO +gs gt -gI -hd +gG +VR gG gG ia ha -iL -dV -jr -dV -jQ -dV -kK -dV -jQ -kG +kN +fv +ff +jH +yt +yB +kf +jP +gn +bC AP aa aa aa aa -aa "} -(38,1,1) = {" -aa -aa -aa -aa -aa +(43,1,1) = {" bV an aw aC at -aG -aG -aG -du +kX +at +at +VJ bq -bG -bG +at +Ce +at +bq +bC +bC cB cZ dw -dU -dw -lj -cA -fO +XV +Kn +fd +fS gs +zp kx -hc -hb +vV +gG gG hY ha -iJ +Ac bC bA bC bC ke -bC +nd bC bC bC @@ -6545,95 +9698,91 @@ aa aa aa aa -aa "} -(39,1,1) = {" -aa -aa -aa -aa -aa +(44,1,1) = {" aa an -aY +hN at at +Ce at at +uA +bq +ba at -dP +fy bq -bG -bG +bC +bC cB cZ dw -dw -dw -cZ -cA -jE +zJ +IX +fd +fR gs +gK gG -gG -gG +VR +VM gG hZ ha -iJ +Ac bC bA bC -kI -bC -jP -bC +FZ +gn +jZ jP +gn bC AP aa aa aa aa -aa "} -(40,1,1) = {" -aa -aa -aa -aa -aa +(45,1,1) = {" aa -am -bh -aY -aF -at -aF +aT +hr +Sm +Ax +QG +Xw +bi +mm +aT +Il du -dx -am -bI +bs +aT +bG cg cB -eF -dw +cZ dw dw cZ -cA -fO +fd +fS +Gw gs -gK -gG +IP gG +cl gG ib ha -iJ +Ac jf az -bC +sW bC bC bC @@ -6645,110 +9794,104 @@ aa aa aa aa -aa "} -(41,1,1) = {" -aa -aa -aa -aa -aa +(46,1,1) = {" aa -al -al -bh -bj -eL -bj -dv -al -al +aT +Sx +Re +Mk +fV +aY +vA +aT +aT +ts +JI +br +aT bH bH -cA +fd eH -cY +eF dw -hF -lk -cA -fO +Kl +fd +rC +BU gs gL gG +Tm gG -gG -ic +Cg gs -iK +Co eM az az -jR -kf +fe +kk ko -kf +kk bC +qu az -az -aa aa aa aa aa "} -(42,1,1) = {" -aa -aa -aa -aa -aa +(47,1,1) = {" aa aa -al -al -al -al -al -al -al +aT +aT +aT +aT +aT +aT +aT +hF +aT +aT +aT az -bG -bG -cA -cA +iU +bC +My +fd cB -dR +dV cB -cA -cA -fQ -gs +My +fd +eq gs +qJ ha -hr +gN ha +qJ gs -gs -iJ +Ac bC +qu az az az az az +qu az -az -az -aa aa aa aa aa aa "} -(43,1,1) = {" -aa +(48,1,1) = {" aa aa aa @@ -6759,35 +9902,35 @@ aa az aI aP -aU -ba +jn +Cb bl -aU -bG -bG -cE -bJ -bJ -dV -dV -eG -fe -fR -fe -eG -dV -dV -dV -dV -iv -iM +jn bC -js +bC +cE +bJ +iy +fv +jH +fB +gM +gu +jq +fB +jH +CA +Cv +jH +kF +sI +bC +hO bg bg -kg -kp bg +Zx +Vr az aa aa @@ -6795,10 +9938,8 @@ aa aa aa aa -aa "} -(44,1,1) = {" -aa +(49,1,1) = {" aa aa aa @@ -6809,34 +9950,34 @@ aa az aJ aQ -az +Hn bb bm -bs -bK +kD +jg bC -cF -fM +hm +lN +bx bC -dW bC eM bC -fS +dy bC eM dW bC -bC +IQ lN cF bC jg az -jA -bg -kh -az +df +Tb +ON +Hn az az aa @@ -6845,10 +9986,8 @@ aa aa aa aa -aa "} -(45,1,1) = {" -aa +(50,1,1) = {" aa aa aa @@ -6863,24 +10002,24 @@ az az az az -bL -ch +zV +lz bL dg dg dg -dg -eN -ff -fT -ff +MS +Rj +UV +nF +UV dg dg dg dg dg -bL -iN +zV +js bL az az @@ -6895,10 +10034,8 @@ aa aa aa aa -aa "} -(46,1,1) = {" -aa +(51,1,1) = {" aa aa aa @@ -6913,25 +10050,25 @@ aa aa aa az -bC -bC +lY +xG cG dg -Hr -eu -fX +Nj eu +dg +sa gQ -fU +lm ll -ln +lv lu lF -lA +Jz dg -cG -bC -bC +Eu +iu +Nb az aa aa @@ -6945,10 +10082,8 @@ aa aa aa aa -aa "} -(47,1,1) = {" -aa +(52,1,1) = {" aa aa aa @@ -6963,25 +10098,25 @@ aa aa aa az -bC -ci -bC +EM +lO +AB dg -dZ +eR dY +Sv +dY +sk +Wk +Ch dY -eO -fh -fV -gu -gM eQ eQ lL dg -bC -kF -bC +Ik +SK +pe az aa aa @@ -6995,10 +10130,8 @@ aa aa aa aa -aa "} -(48,1,1) = {" -aa +(53,1,1) = {" aa aa aa @@ -7017,15 +10150,15 @@ AP bX AP dg -el +De eI -dY -eP -dy -fV -dy +XS +eK eP -eQ +oK +Gq +OZ +ku lG lM dg @@ -7045,10 +10178,8 @@ aa aa aa aa -aa "} -(49,1,1) = {" -aa +(54,1,1) = {" aa aa aa @@ -7067,17 +10198,17 @@ aa VT aa dg -dA +MS eR -dY +Bh eQ eQ -fW +RI eQ eQ eQ lH -dg +Zi dg aa VT @@ -7095,10 +10226,8 @@ aa aa aa aa -aa "} -(50,1,1) = {" -aa +(55,1,1) = {" aa aa aa @@ -7106,8 +10235,8 @@ aa aa aa aa -ab -ab +kH +kH aa aa aa @@ -7116,16 +10245,16 @@ aa VT aa aa -aa +dk dg fg -gv -gN -he -hK -lm -lo -lv +wE +Lm +bt +ld +ed +jc +AU lI dg aa @@ -7145,34 +10274,32 @@ aa aa gc aa -aa "} -(51,1,1) = {" -aa +(56,1,1) = {" aa aa aa aa aa aa -ab kH kH -ab +kH +kH aa aa aa aa aa -dk -cX aa +cX +bV dg dg dg dg dg -fY +jp dg dg dg @@ -7192,23 +10319,21 @@ aa aa aa aa -aa -aa -aa +kH +kH aa "} -(52,1,1) = {" -aa -aa +(57,1,1) = {" aa aa aa aa aa -ab kH kH -ab +kH +kH +kH cX aa aa @@ -7222,7 +10347,7 @@ aa aa aa uQ -bt +Ut uQ aa aa @@ -7240,24 +10365,22 @@ uQ aa aa aa -ab -aa -aa -aa -aa -aa +kH +kH +kH +kH +kH "} -(53,1,1) = {" -aa -aa +(58,1,1) = {" aa aa aa aa aa -ab -ab -ab +kH +kH +kH +kH aa aa aa @@ -7272,7 +10395,7 @@ VT aa aa uQ -bt +Ut uQ aa aa @@ -7289,17 +10412,14 @@ aa uQ aa aa -ab -ab -ab -ab -aa -aa -aa +kH +kH +kH +kH +kH +kH "} -(54,1,1) = {" -aa -aa +(59,1,1) = {" aa aa aa @@ -7310,6 +10430,7 @@ aa aa aa aa +uQ aa aa aa @@ -7317,12 +10438,12 @@ aa aa aa aa -ab -ab +kH +kH aa aa uQ -bt +Ut uQ aa aa @@ -7339,16 +10460,14 @@ aa uQ aa aa -ab -ab -ab -ab -ab -ab -aa +kH +kH +kH +kH +kH +kH "} -(55,1,1) = {" -aa +(60,1,1) = {" aa gc aa @@ -7358,7 +10477,7 @@ aa aa uQ aa -aa +uQ aa aa aa @@ -7367,12 +10486,12 @@ aa VT aa aa -ab -ab -ab +kH +kH +kH aa uQ -bt +Ut uQ aa aa @@ -7390,18 +10509,13 @@ uQ aa aa aa -ab kH kH -ab -ab -aa +kH +kH +kH "} -(56,1,1) = {" -aa -aa -aa -aa +(61,1,1) = {" aa aa aa @@ -7409,30 +10523,33 @@ aa aa aa uQ +iN +uQ +uQ +eJ +uQ aa -aa -aa -bu +dC bM cj bM -bu +dC aa -ab -ab -bu -bu -fZ -bu -bu +kH +kH +dC +dC +nc +dC +dC aa aa aa -bu +dC bM cj bM -bu +dC aa aa aa @@ -7440,17 +10557,13 @@ uQ aa aa aa -ab kH kH -ab -ab -aa -"} -(57,1,1) = {" -aa +kH aa aa +"} +(62,1,1) = {" aa aa aa @@ -7458,47 +10571,47 @@ aa aa aa aa +uQ aa aa +uQ aa aa -bu +dC bN -cl +fx cI -bu +dC aa aa aa -bu +dC fi -ga +fl gw -bu +dC aa aa aa -bu -fq -lO -fq -bu +dC +CW +dt +af +dC +aa aa aa +uQ +aa aa -uQ aa aa +kH aa aa -ab -ab -ab -ab aa "} -(58,1,1) = {" -aa +(63,1,1) = {" aa aa aa @@ -7508,31 +10621,31 @@ aa aa aa uQ +eJ aa aa aa -aa -bu -bO +dC +zi cm cJ -bu +dC aa aa aa -bu -id -gb +dC +kI +qN gx -bu +dC aa aa aa -bu -iw -fq -fq -bu +dC +eG +wq +vf +dC aa aa aa @@ -7545,10 +10658,8 @@ aa aa aa aa -aa "} -(59,1,1) = {" -aa +(64,1,1) = {" aa aa aa @@ -7557,37 +10668,36 @@ aa aa uQ uQ -aa -aa -aa -aa -aa -bu -bP -cn -bP -bu -bu -bu -bu -bu -bu -hE -bu -bu -bu -bu -bu -bu -bP -cn -bP -bu -aa -aa -aa +iN +iN uQ +eJ aa +dC +Kj +fM +Kj +dC +dC +dC +dC +dC +dC +IB +dC +dC +dC +dC +dC +dC +Kj +fM +Kj +dC +dC +dC +dC +dC aa aa aa @@ -7597,47 +10707,45 @@ aa aa aa "} -(60,1,1) = {" -aa -aa -aa -aa +(65,1,1) = {" aa aa -ab -ab -ab -ab -ab -ab -ab aa aa -bu +Eh +Eh +Eh +Eh +Eh +Eh +Eh +iN +eJ +XY dK -fw -dh -gJ -ea +ew +rX +es +BX +bO kM -eS -kQ -gd -fk -gO -fk -ht -lD -ie -fk -fk -jh -bu -aa -aa -aa -uQ -aa +bO +kS +qN +fq +gU +fq +fq +hg +es +Gv +fq +jo +dC +bZ +vp +Hj +dC aa aa aa @@ -7647,47 +10755,45 @@ aa aa gc "} -(61,1,1) = {" -aa -aa -aa +(66,1,1) = {" aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab aa -bu -cp -fx -di -dC -dC -kN +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +Eh +my dC -kR -jH -fl -gP -fl -fl -kR +bO +Qc +RR +iV +cY if -fl -iR -ji -bu -aa -aa -aa -uQ -aa +VV +jr +ih +xj +am +Gi +iV +iV +LB +aU +gh +ta +fq +jx +bS +bS +Lr +dC aa aa aa @@ -7697,12 +10803,10 @@ aa aa aa "} -(62,1,1) = {" -aa -aa +(67,1,1) = {" aa -ab -ab +Eh +Eh ac ac ac @@ -7711,47 +10815,45 @@ ac ac ac ac -ab -ab -bu -cq -cM -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -iS -jj -kE -kE -kE -kE -kE -kE -kE -aa -aa -aa -aa -aa -aa +Eh +Eh +dC +hW +zK +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +PO +ie +iw +jF +Oi +Sj +vw +Et +Et +Et +Et +Et +Et +Et +Et aa "} -(63,1,1) = {" -aa -aa +(68,1,1) = {" aa -ab +Eh ac ad ap @@ -7762,46 +10864,44 @@ co ap bc ac -ab -bu -ev -fy -dj +Eh +dC +ew +GB +iX dD eb -ex +dE dE fm JF -gy -dG -hg -hu -hN +iX +gX +gf +LH +rN +FI ig -dj -ld -lg -kE -jB -jS -kE -kq -ky -kE -aa -aa -aa -aa -aa -aa +iX +dJ +kS +jF +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +Et aa "} -(64,1,1) = {" -aa -aa +(69,1,1) = {" aa -ab +Eh ac ap co @@ -7812,46 +10912,44 @@ ap ap ap ac -bv -bu -cp -cN -dj -dE +dQ +dC +bO +Jh +iX +Wp dE dE dE dE gg -gy -dG -hg -hv -hO +iX +gX +gf +hh +gi +PL ig -dj -iU -jk -kE -jC -jT -kE -jT +iX +kR +gT +jF +qz +UW +rU +sm jC -kE -aa -aa -aa -aa -aa -aa +ZR +dh +rU +tY +qz +Et aa "} -(65,1,1) = {" -aa -aa -ab -ab +(70,1,1) = {" +Eh +Eh ac ac ac @@ -7862,46 +10960,44 @@ ac ac ac ac -bw -bQ -ev -fz -dj -dE -dE +lc +KQ +ew +Va +iX +SR dE +fT dE dE -gh +dP gy -kX -hh -gi -gf -ih -dj -iV -ji -kE -jD -jU -ki -jU +gf +rI +Rd +hw +CS +bI +iX +OY +fq +jF +qz jU -kE -aa -aa -aa -aa -aa -aa +Yu +jT +ZR +ZR +Ld +Yu +Sh +qz +Et aa "} -(66,1,1) = {" -aa -aa -ab -ab +(71,1,1) = {" +Eh +Eh ac ap cv @@ -7912,46 +11008,44 @@ ai co ds bn -bx -bR -cr -cN -dj -dF +Bb +cM +bO +Jh +iX +Ii kL -dE +PF dE fn -gi +gf gy -dG gf -hw +gf +gf +la hP gf -dj -ld -lg -kE -cV -jV -jV +iX +dJ +kS +jF +yT +qz +qz jV -kz -kE -aa -aa -aa -aa -aa -aa +TZ +RH +AM +qz +qz +qz +Et aa "} -(67,1,1) = {" -aa -aa -ab -ab +(72,1,1) = {" +Eh +Eh ac ap ap @@ -7962,46 +11056,44 @@ ah ap ap bn -bx -bR -ew -fy +Bb +bw dm +lw +io +nz dG -dG -dG +eh kP dG -gj dG dG +gf +gf hi -la +hx gf ii -dm -iT -jl -ju -jF -jV -jV -kr -kA -kE -aa -aa -aa -aa -aa -aa +ix +hv +fq +aK +Nh +UE +qm +ZR +nI +LG +RD +OB +Jn +qz +Et aa "} -(68,1,1) = {" -aa -aa -ab -ab +(73,1,1) = {" +Eh +Eh ac ac ac @@ -8012,48 +11104,46 @@ ac ac ac ac -bw -bQ +Bb +bv bO -cN -dm -dG -dG -dG +dX +ix dG dG -gk -gz -gz lb -hx hQ hQ -ix -le -kR -jv -jG -jG -jG -ks -kA -kE -aa -aa -aa -aa -aa -aa +tU +Ev +is +is +jA +LE +IL +is +PM +CN +qj +AV +ps +Vj +dc +DK +gb +LG +BB +kG +Fr +qz +Et aa "} -(69,1,1) = {" -aa -aa -ab -ab +(74,1,1) = {" +Eh +Eh ac -ai +OF ap ap ap @@ -8062,48 +11152,46 @@ ap ap ah ac -bv -bu +dQ +dC ew -fy -dj +iS +iX hT dE -dE +nZ kL fo gf -dj -dj -dj -hy -dj -dj -dj -iT +iX +iX +iX +iX +eD +iX +iX +PO +yw fq -kE -cW -jV -jV -jV -kz -kE -aa -aa -aa -aa -aa -aa +jF +He +qz +qz +Om +DG +ML +yz +qz +qz +qz +Et aa "} -(70,1,1) = {" -aa -aa -ab -ab +(75,1,1) = {" +Eh +Eh ac -ah +iT ap ap ds @@ -8112,46 +11200,44 @@ ai ap ah ac -ab -bu +Eh +dC bO -cO -dj +do +iX dE ee -dE +cs eV dE gl -dj +iX kW gf -hz +gf +kw hR ij -dj -lf +iX +lt lh -kE -jI -jW -kj -jW +jF +qz jW -kE -aa -aa -aa -aa -aa -aa +rU +jT +ZR +ZR +Ld +rU +qZ +qz +Et aa "} -(71,1,1) = {" -aa -aa -ab -ab +(76,1,1) = {" +Eh +Eh ac aj ap @@ -8162,49 +11248,47 @@ ah ap ao ac -ab -bu +Eh +To bO -cN -dj -dE +fP +iX +Wp ef dE eW dE gm -dj +iX gR gf -hA -gf +rI +hB +CS ik -dj -iT +iX +yw fq -kE -jC -jX -kE +jF +qz jX -jC -kE -aa -aa -aa -aa -aa -aa +Yu +ng +Jo +Dg +Jt +Yu +XM +qz +Et aa "} -(72,1,1) = {" -aa -aa -ab -ab +(77,1,1) = {" +Eh +Eh ac ah -ai +OF ap ap ap @@ -8212,48 +11296,46 @@ ap ai ah ac -ab -bu +Eh +dC ew -fy -dj +iS +iX dF eg dE dE fp gf -dj +iX gS hk -hB +WL +Dl hS il -dj -ld +iX +CT kS -kE -jJ -jY -kE -kt -kB -kE -aa -aa -aa -aa -aa -aa +jF +qz +qz +qz +qz +qz +qz +qz +qz +qz +qz +Et aa "} -(73,1,1) = {" -aa -aa -ab -ab +(78,1,1) = {" +Eh +Eh ac -ah +iT aq ah cL @@ -8262,48 +11344,46 @@ ah aj ah ac -ab -bu -cs -cM -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -iS -jn -kE -kE -kE -kE -kE -kE -kE -aa -aa -aa -aa -aa -aa +Eh +dC +hW +lD +PO +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +oJ +iw +jF +Sj +vw +Et +Et +Et +Et +Et +Et +Et +Et +Et aa "} -(74,1,1) = {" -aa -aa -ab -ab +(79,1,1) = {" +Eh +Eh ac -ai +OF ao cL ah @@ -8312,32 +11392,32 @@ cL ao ah ac -ab -bu -bO -gW -do -ew +Eh +dC bO -kO +fZ +Ys +dq +hj bO -kS -fq -kS -gT -kS +eN +jt +Ru fq -kS +OW +gU +Ru fq -iy -iX +lK +im +BM +jw fq -Rc +Ku Xq bS -rN -bu -aa +uR +dC aa aa aa @@ -8347,11 +11427,9 @@ aa aa aa "} -(75,1,1) = {" -aa -aa -ab -ab +(80,1,1) = {" +Eh +Eh ac ac ac @@ -8362,32 +11440,32 @@ ac ac ac ac -ab -bu +Eh +XY ct hn -dq -hj -eh +Lj +gj +aM +bO kO -cJ +bO kS fq kS -gU +gT kS fq -lK -im +hE +gj iz fq jo -bu -Xq +dC +MP LD -AY -bu -aa +bS +dC aa aa aa @@ -8397,11 +11475,9 @@ aa aa aa "} -(76,1,1) = {" -aa -aa +(81,1,1) = {" aa -ab +Eh ac ak ar @@ -8412,32 +11488,32 @@ cL ah bd ac -bu -bu +Eh +dC +dC cu -bu -bu -bu -bu -bu -bu -bu +dC +dC +dC +dC +dC +dC +dC cu -bu -bu -bu -bu -bu -bu -bu +dC +dC +dC +dC +dC +dC +dC cu -bu -bu -bu -bu -bu -bu -aa +XY +dC +dC +dC +dC +dC aa aa aa @@ -8447,12 +11523,10 @@ aa aa aa "} -(77,1,1) = {" -aa -aa +(82,1,1) = {" aa -ab -ab +Eh +Eh ac ai cL @@ -8461,27 +11535,28 @@ cL cL ao ac -ab -bu +Eh +Eh +To +bT dH dH -bS -bu +dC aa -bu +dC ez ez ez bS iY bS +hU bS -jm -kV +kT CG CG CG -bu +dC aa aa aa @@ -8495,44 +11570,41 @@ gc aa aa aa -aa "} -(78,1,1) = {" -aa -aa +(83,1,1) = {" aa -ab -ab -ab -ai +Eh +Eh +Eh +ac ay -ai +ac ay -ai +ac ay -ab -ab -bu -bT +Eh +Eh +Eh +dC +li ey cQ -bu +dC aa -bu -ez +dC +aO eX eX bS -gA -gA -hU -kT +bS +kV +kU kY +jm CG CG -CG -bu -aa +uV +dC aa aa aa @@ -8547,142 +11619,40 @@ aa aa aa "} -(79,1,1) = {" -aa +(84,1,1) = {" aa aa -aa -ab -ab +Eh +Eh as as as as as as -ab +Eh +Eh aa -bu -bu -bu -bu -bu +dC +dC +dC +dC +dC aa -bu -bu +dC +To eX eX eX gA +gz gA -hV -kU -bS +gA +SH CG CG CG -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(80,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -bu -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(81,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +dC aa aa aa @@ -8697,22 +11667,7 @@ aa aa aa "} -(82,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(85,1,1) = {" aa aa aa @@ -8733,6 +11688,19 @@ aa aa aa aa +dC +dC +dC +dC +dC +dC +dC +dC +dC +dC +dC +dC +dC aa aa aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm index af97fb7f18aa..0ffd2a49d583 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm @@ -1030,6 +1030,7 @@ /area/ruin/space/onehalf/abandonedbridge) "dd" = ( /obj/structure/closet/firecloset/full, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel, /area/ruin/space/onehalf/abandonedbridge) "de" = ( @@ -1122,6 +1123,11 @@ /mob/living/simple_animal/hostile/carp, /turf/template_noop, /area/template_noop) +"jI" = ( +/obj/structure/disposalpipe/trunk, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating/airless, +/area/ruin/space/onehalf/drone_bay) "jQ" = ( /obj/structure/cable{ icon_state = "0-8" @@ -1548,7 +1554,7 @@ aa aa aa as -aE +jI aM ba bo @@ -1680,7 +1686,7 @@ aa aa aa av -aE +jI aR by bo diff --git a/_maps/map_files/RandomRuins/SpaceRuins/rocky_motel.dmm b/_maps/map_files/RandomRuins/SpaceRuins/rocky_motel.dmm index 08a28a4cfd0d..c23f7567a650 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/rocky_motel.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/rocky_motel.dmm @@ -38,6 +38,7 @@ /obj/structure/toilet{ dir = 4 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -46,6 +47,7 @@ /obj/structure/closet/cabinet, /obj/item/clothing/under/color/random, /obj/item/clothing/under/dress/sundress, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/carpet/black, /area/ruin/space/powered) "fH" = ( @@ -74,6 +76,7 @@ "gP" = ( /obj/structure/table/wood, /obj/effect/mapping_helpers/turfs/damage, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/wood, /area/ruin/space/powered) "gY" = ( @@ -408,7 +411,7 @@ }, /area/ruin/space/powered) "SL" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/royalblack, /area/ruin/space/powered) "Tb" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index e72adf279475..e67ddd0b3b2b 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -127,6 +127,7 @@ /area/ruin/space/powered/bar) "aF" = ( /obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/wood, /area/ruin/space/powered/bar) "aG" = ( @@ -134,6 +135,7 @@ /area/ruin/space/powered) "aH" = ( /obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/wood, /area/ruin/space/powered/bar) "aI" = ( @@ -456,6 +458,7 @@ /obj/machinery/light{ dir = 8 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "dark" }, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/submaps/rocky_motel_submap.dmm b/_maps/map_files/RandomRuins/SpaceRuins/submaps/rocky_motel_submap.dmm index 8328a2a74ad7..cf5d136e5ccb 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/submaps/rocky_motel_submap.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/submaps/rocky_motel_submap.dmm @@ -446,7 +446,7 @@ /turf/simulated/floor/carpet/royalblack, /area/ruin/space/powered) "SN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/royalblack, /area/ruin/space/powered) "TR" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm index 096d63d14423..7cca9d8aac26 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm @@ -1,6 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "cq" = ( /obj/structure/table, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/pod/dark, /area/ruin/space/syndicate_druglab) "dL" = ( @@ -267,7 +268,7 @@ /area/ruin/space/syndicate_druglab) "Fq" = ( /obj/structure/closet/cabinet, -/obj/item/soap/syndie, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/carpet/black, /area/ruin/space/syndicate_druglab) "Fx" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm index 46ce3149055e..d2f4e5401074 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm @@ -1566,7 +1566,7 @@ /obj/effect/turf_decal/woodsiding{ dir = 5 }, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/carpet/grimey, /area/ruin/unpowered/syndicate_space_base/service) "iJ" = ( @@ -1955,6 +1955,9 @@ /obj/structure/cable/green{ icon_state = "1-2" }, +/obj/structure/cable/green{ + icon_state = "1-4" + }, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -2419,6 +2422,9 @@ }, /turf/simulated/floor/engine, /area/ruin/unpowered/syndicate_space_base/toxtest) +"nV" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_space_base/inner) "nW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -2813,11 +2819,18 @@ }, /area/ruin/unpowered/syndicate_space_base/genetics) "qf" = ( -/obj/machinery/economy/arcade/claw, -/turf/simulated/floor/plasteel{ - icon_state = "dark" +/obj/structure/cable/green, +/obj/machinery/power/apc/syndicate/directional/east, +/obj/machinery/light/small{ + dir = 8 }, -/area/ruin/unpowered/syndicate_space_base/arrivals) +/obj/item/toy/plushie/lizardplushie{ + name = "Forks-the-Outlet" + }, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/ruin/unpowered/syndicate_space_base/cave) "qj" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -2946,6 +2959,10 @@ icon_state = "yellow" }, /area/ruin/unpowered/syndicate_space_base/atmos) +"rd" = ( +/obj/structure/sign/electricshock, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_space_base/main) "rg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -3198,6 +3215,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, +/obj/structure/cable/green{ + icon_state = "2-8" + }, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -3442,6 +3462,9 @@ codes_txt = "patrol;next_patrol=SBW6"; location = "SBW5" }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -4042,6 +4065,12 @@ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/toxlaunch) +"xM" = ( +/obj/machinery/economy/arcade/claw/syndi, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/arrivals) "xO" = ( /obj/machinery/alarm/syndicate/directional/north, /turf/simulated/floor/plasteel{ @@ -4102,6 +4131,20 @@ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/arrivals) +"ye" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/arrivals) "yf" = ( /obj/effect/turf_decal/caution{ dir = 8 @@ -4187,7 +4230,7 @@ }, /area/ruin/unpowered/syndicate_space_base/arrivals) "yR" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/grass, /area/ruin/unpowered/syndicate_space_base/service) "za" = ( @@ -5295,6 +5338,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -7163,6 +7209,18 @@ icon_state = "darkpurple" }, /area/ruin/unpowered/syndicate_space_base/chemistry) +"RM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/arrivals) "RN" = ( /obj/machinery/reagentgrinder, /obj/item/stack/sheet/mineral/plasma{ @@ -7214,6 +7272,16 @@ }, /turf/simulated/floor/wood, /area/ruin/unpowered/syndicate_space_base/arrivals) +"RW" = ( +/obj/machinery/door/airlock/hatch/syndicate, +/obj/machinery/door/firedoor, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/main) "RX" = ( /turf/simulated/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_space_base/main) @@ -7593,6 +7661,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, +/obj/structure/cable/green{ + icon_state = "1-2" + }, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -7972,7 +8043,7 @@ /obj/effect/turf_decal/woodsiding{ dir = 9 }, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, @@ -9416,12 +9487,12 @@ xn xn xn xn -My +ye ma nZ kk ZI -My +RM xn xn xn @@ -9996,7 +10067,7 @@ xn xn xn xn -qf +xM xQ xQ My @@ -10069,7 +10140,7 @@ kE kE kE xn -qf +xM xQ vR nW @@ -11995,8 +12066,8 @@ wA PL sV TK -RX -kE +RW +qf kE kE kE @@ -12068,8 +12139,8 @@ hO PL am am -RX -kE +rd +nV kE kE kE diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm index 0fef45873213..2ab0ea1a3a99 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm @@ -371,11 +371,11 @@ /area/ruin/space/syndicakefactory) "qd" = ( /obj/structure/table/glass/reinforced/plastitanium, -/obj/item/food/breadslice, -/obj/item/food/breadslice{ +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread{ pixel_y = 4 }, -/obj/item/food/breadslice{ +/obj/item/food/sliced/bread{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -742,7 +742,7 @@ /area/template_noop) "CR" = ( /obj/structure/chair/office/dark, -/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib, +/obj/effect/spawner/random/pool/spaceloot/modsuit_syndie, /turf/simulated/floor/engine, /area/ruin/space/syndicakefactory) "CW" = ( @@ -908,6 +908,13 @@ /obj/item/stack/sheet/animalhide/corgi, /turf/simulated/floor/grass, /area/ruin/space/syndicakefactory) +"ID" = ( +/obj/structure/table/glass/reinforced/plastitanium, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel{ + icon_state = "floorgrime" + }, +/area/ruin/space/syndicakefactory) "IE" = ( /obj/item/flag/syndi{ anchored = 1 @@ -1069,7 +1076,7 @@ pixel_x = 8; pixel_y = 8 }, -/obj/item/food/birthdaycakeslice, +/obj/item/food/sliced/birthday_cake, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" }, @@ -1279,7 +1286,7 @@ /turf/simulated/floor/engine, /area/ruin/space/syndicakefactory) "YE" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/grass, /area/ruin/space/syndicakefactory) "YQ" = ( @@ -2747,7 +2754,7 @@ OK OK OK EJ -Wh +ID xO hq xO diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm index d30991749016..8d7650291303 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm @@ -146,13 +146,13 @@ dir = 1; on = 1 }, -/obj/effect/spawner/random/syndicate/loot/common, +/obj/effect/spawner/random/pool/spaceloot/syndicate/common/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, /area/syndicate_depot/core) "aB" = ( -/obj/effect/spawner/random/syndicate/loot/common, +/obj/effect/spawner/random/pool/spaceloot/syndicate/common/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -342,7 +342,7 @@ }, /area/syndicate_depot/core) "bc" = ( -/obj/effect/spawner/random/syndicate/loot/rare, +/obj/effect/spawner/random/pool/spaceloot/syndicate/rare/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -350,7 +350,7 @@ "bd" = ( /obj/item/lighter/zippo/black, /obj/structure/table, -/obj/effect/spawner/random/syndicate/loot/stetchkin, +/obj/effect/spawner/random/syndicate/stetchkin, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -367,7 +367,7 @@ dir = 1; on = 1 }, -/obj/effect/spawner/random/syndicate/loot/rare, +/obj/effect/spawner/random/pool/spaceloot/syndicate/rare/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -394,7 +394,7 @@ /area/syndicate_depot/outer) "bl" = ( /obj/structure/table, -/obj/effect/spawner/random/syndicate/loot/stetchkin, +/obj/effect/spawner/random/syndicate/stetchkin, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -409,20 +409,11 @@ icon_state = "dark" }, /area/syndicate_depot/outer) -"bn" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/spawner/random/syndicate/loot/common, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/syndicate_depot/core) "bo" = ( /obj/machinery/light{ dir = 4 }, -/obj/effect/spawner/random/syndicate/loot/common, +/obj/effect/spawner/random/pool/spaceloot/syndicate/common/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -532,7 +523,7 @@ }, /area/syndicate_depot/core) "bE" = ( -/obj/effect/spawner/random/syndicate/loot/officer, +/obj/effect/spawner/random/pool/spaceloot/syndicate/officer/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -652,7 +643,7 @@ /area/syndicate_depot/outer) "bU" = ( /obj/structure/table, -/obj/effect/spawner/random/syndicate/loot/stetchkin, +/obj/effect/spawner/random/syndicate/stetchkin, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -786,8 +777,8 @@ }, /area/syndicate_depot/core) "cm" = ( -/obj/effect/spawner/random/syndicate/loot/armory, /obj/machinery/atmospherics/pipe/simple/hidden, +/obj/effect/spawner/random/pool/spaceloot/syndicate/armory/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -797,13 +788,13 @@ dir = 1; on = 1 }, -/obj/effect/spawner/random/syndicate/loot/armory, +/obj/effect/spawner/random/pool/spaceloot/syndicate/armory/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, /area/syndicate_depot/core) "co" = ( -/obj/effect/spawner/random/syndicate/loot/armory, +/obj/effect/spawner/random/pool/spaceloot/syndicate/armory/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -1100,7 +1091,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/spawner/random/syndicate/loot/rare, +/obj/effect/spawner/random/pool/spaceloot/syndicate/rare/depot, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -1142,6 +1133,14 @@ }, /turf/simulated/floor/plating/asteroid/airless, /area/syndicate_depot/outer) +"Nh" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/syndicate_depot/core) "Te" = ( /turf/simulated/mineral/random/high_chance, /area/syndicate_depot/outer) @@ -1729,7 +1728,7 @@ aM at aD aD -bn +cW bu bz at @@ -1933,7 +1932,7 @@ aD aD aD aD -bo +Nh aD bv at @@ -2093,7 +2092,7 @@ aD aD aD aD -bE +aB at aD aD @@ -2452,7 +2451,7 @@ cl cz aD cQ -bE +aD aD aD at @@ -2488,11 +2487,11 @@ af at aw aD -aB +aD at aD aD -bc +aD bi aD aD @@ -2547,7 +2546,7 @@ aD at aD aD -bE +aD bE cb cn @@ -2558,7 +2557,7 @@ aD bC aD at -bh +aL aD at af @@ -2609,7 +2608,7 @@ cV aD aD at -bc +aD aD at at @@ -2746,7 +2745,7 @@ aD aD aE aD -bc +aD bc at aD @@ -2757,12 +2756,12 @@ at aD cD aD -bE +aD at aL aD bc -bc +aD aD aD at @@ -2894,7 +2893,7 @@ af af af at -aB +aD aD aK aR @@ -2965,7 +2964,7 @@ aD cW aD aD -aB +aD at af af diff --git a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm index 9263dfe5d4c7..a55559ca85b8 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm @@ -84,9 +84,9 @@ }, /area/ruin/space/telecomms/chamber) "bP" = ( -/obj/effect/spawner/random/telecomms_core_table, /obj/machinery/ai_slipper, /obj/structure/table/glass/reinforced/plastitanium, +/obj/effect/spawner/random/pool/spaceloot/dvorak_core_table, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "vault"; @@ -388,7 +388,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) "ia" = ( -/obj/effect/spawner/random/telecomms_emp_loot, +/obj/effect/spawner/random/pool/spaceloot/dvorak_emp_loot, /turf/simulated/floor/engine, /area/ruin/space/telecomms/computer) "ik" = ( @@ -1667,7 +1667,7 @@ }, /area/ruin/space/telecomms/chamber) "CI" = ( -/obj/structure/displaycase/dvoraks_treat, +/obj/effect/spawner/random/pool/spaceloot/dvorak_displaycase, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "vault"; diff --git a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm index 5e607e129113..833af7b41907 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -70,6 +70,7 @@ /area/ruin/space/unpowered) "q" = ( /obj/machinery/light, +/mob/living/simple_animal/hostile/syndicate/melee/autogib, /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) "r" = ( @@ -183,6 +184,7 @@ /area/ruin/space/unpowered) "H" = ( /obj/structure/chair, +/mob/living/simple_animal/hostile/syndicate/melee/autogib, /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) "I" = ( @@ -263,6 +265,22 @@ }, /turf/simulated/floor/plasteel, /area/ruin/space/unpowered) +"T" = ( +/obj/item/rack_parts, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "vault" + }, +/area/ruin/space/unpowered) +"Z" = ( +/obj/structure/rack, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "vault" + }, +/area/ruin/space/unpowered) (1,1,1) = {" a @@ -384,10 +402,10 @@ a l d d -s -r +T +Z F -r +Z d d l @@ -429,8 +447,8 @@ l d s x -r -r +Z +Z x s d diff --git a/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm b/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm index c9fb4b3c1206..b60a14413482 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm @@ -129,9 +129,7 @@ /area/ruin/space/unathi_breacher/hold) "kb" = ( /obj/structure/rack, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, -/obj/item/stack/sheet/mineral/gold, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/pod/dark, /area/ruin/space/unathi_breacher/hold) "kf" = ( @@ -146,6 +144,7 @@ "kt" = ( /obj/structure/table, /obj/item/screwdriver, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel/airless, /area/ruin/space/unathi_breacher/engineering) "li" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm index bcddd30bcfd6..6d1008f51330 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm @@ -214,7 +214,7 @@ /turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, /area/ruin/space/derelict/bridge) "aF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/ruin/space/derelict/bridge) "aG" = ( @@ -736,7 +736,7 @@ }, /area/ruin/space/derelict/bridge) "bZ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkblue" }, @@ -1116,7 +1116,7 @@ }, /area/ruin/space/derelict/bridge) "cW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 6; @@ -1167,7 +1167,7 @@ }, /area/ruin/space/derelict/crew_quarters) "dd" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 9; @@ -1284,6 +1284,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "darkred" @@ -1600,7 +1601,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "darkblue" @@ -2692,7 +2693,7 @@ }, /area/ruin/space/derelict/solar_control) "ha" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "darkred" @@ -2777,7 +2778,7 @@ }, /area/ruin/space/derelict/hallway/primary) "hm" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "hn" = ( @@ -3271,6 +3272,7 @@ /area/ruin/space/derelict/hallway/primary) "iI" = ( /obj/structure/closet/firecloset, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "caution" @@ -3506,7 +3508,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "jr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "brown" @@ -4893,6 +4895,7 @@ /obj/structure/window/reinforced{ dir = 1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitered" @@ -4939,6 +4942,7 @@ /area/ruin/space/derelict/crew_quarters) "nh" = ( /obj/structure/closet/athletic_mixed, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, @@ -5716,6 +5720,7 @@ /area/ruin/space/derelict/hallway/primary) "pt" = ( /obj/structure/closet/jcloset, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/crew_quarters) "pu" = ( @@ -6492,7 +6497,7 @@ }, /area/ruin/space/derelict/arrival) "rw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "redfull" }, @@ -6950,6 +6955,10 @@ /obj/effect/spawner/random/fungus/frequent, /turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, /area/ruin/space/derelict/arrival) +"Ae" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/simulated/floor/plasteel/dark, +/area/ruin/space/derelict/crew_quarters) "Bx" = ( /obj/machinery/door_control{ id = "ruslock"; @@ -7029,6 +7038,13 @@ icon_state = "white" }, /area/ruin/space/derelict/arrival) +"Za" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/mineral/plastitanium/red, +/area/ruin/space/derelict/arrival) (1,1,1) = {" ac @@ -7264,7 +7280,7 @@ ac ir iP ji -jQ +Za jQ lt lI @@ -12452,7 +12468,7 @@ ac aV pm pt -hU +Ae pM pY db @@ -12736,7 +12752,7 @@ pn pw pw db -db +qA db Mi aV diff --git a/_maps/map_files/RandomRuins/SpaceRuins/ussp_tele.dmm b/_maps/map_files/RandomRuins/SpaceRuins/ussp_tele.dmm index 70f2dca4ac04..9e1cd11edcdb 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/ussp_tele.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/ussp_tele.dmm @@ -218,7 +218,7 @@ /turf/simulated/floor/plating, /area/ruin/space/derelict/teleporter) "uD" = ( -/obj/item/kirbyplants/dead{ +/obj/item/kirbyplants/large/dead{ desc = "A dead potted plant. Must have died from lack of EVA equipment."; item_state = "plant-dead" }, @@ -230,6 +230,7 @@ /area/ruin/space/derelict/teleporter) "vr" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "darkblue" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index fe9aa407df24..eda3acc04835 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -315,6 +315,7 @@ /area/ruin/space/powered) "bk" = ( /obj/structure/rack, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "chapel" }, @@ -396,6 +397,7 @@ /area/ruin/space/powered) "bz" = ( /mob/living/simple_animal/hostile/mimic/crate, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/powered) "bA" = ( @@ -488,6 +490,10 @@ /obj/structure/table, /turf/simulated/floor/plating, /area/ruin/space/powered) +"EZ" = ( +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, +/turf/simulated/floor/plating, +/area/ruin/space/powered) "YM" = ( /obj/structure/table/wood, /obj/item/blank_tarot_card, @@ -577,7 +583,7 @@ aa bH ae aY -aS +EZ bl bq ae diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm index 0f6d16eea8e9..aaab3c391768 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm @@ -34,7 +34,7 @@ /area/space/nearstation) "ca" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "caution" @@ -224,8 +224,8 @@ /area/ruin/space/wreck_cargoship) "jm" = ( /obj/item/toy/plushie/ipcplushie, -/obj/item/food/breadslice, -/obj/item/food/breadslice, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, /obj/item/paper/crumpled{ name = "unintelligible scribbles"; info = "toast... i must... the plushie..." @@ -274,6 +274,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/structure/rack, /obj/item/stack/rods/fifty, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "titanium"; dir = 4 @@ -666,6 +667,7 @@ dir = 1 }, /obj/structure/closet/crate/secure/loot, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/pod/light, /area/ruin/space/wreck_cargoship) "AN" = ( @@ -770,7 +772,7 @@ dir = 4 }, /obj/effect/decal/cleanable/cobweb2, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "caution" @@ -783,6 +785,7 @@ "Fk" = ( /obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ icon_state = "yellowsiding"; dir = 1 @@ -820,7 +823,7 @@ /obj/structure/railing{ dir = 9 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/ruin/space/wreck_cargoship) "Ih" = ( @@ -1084,6 +1087,7 @@ pixel_y = -32 }, /obj/structure/closet/crate/secure/loot, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "blackcorner" @@ -1193,6 +1197,7 @@ "Vc" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "caution" @@ -1307,6 +1312,7 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed, /turf/simulated/floor/plating, /area/ruin/space/wreck_cargoship) "XX" = ( diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm index 0356b3cf14b1..db4ed427fc3d 100644 --- a/_maps/map_files/generic/Lavaland.dmm +++ b/_maps/map_files/generic/Lavaland.dmm @@ -173,7 +173,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /turf/simulated/floor/plasteel{ dir = 1; @@ -1502,7 +1502,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/kiddieplaque/remembrance/mining{ pixel_x = 32 }, @@ -2282,7 +2282,7 @@ dir = 8; pixel_y = -24 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkpurplecorners" @@ -5203,7 +5203,7 @@ /turf/simulated/floor/plating, /area/mine/outpost/mechbay) "ur" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkyellowcorners" @@ -6044,7 +6044,7 @@ dir = 1; network = list("Mining Outpost") }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = -31 }, @@ -9523,7 +9523,7 @@ /area/lavaland/surface/outdoors/targetable) "VV" = ( /obj/machinery/firealarm/directional/west, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/spawner/random/dirt/maybe, /obj/item/radio/intercom{ name = "north bump"; diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm index a576c611e907..e16ef3b9553e 100644 --- a/_maps/map_files/generic/centcomm.dmm +++ b/_maps/map_files/generic/centcomm.dmm @@ -1867,9 +1867,13 @@ /turf/simulated/floor/plating/abductor, /area/abductor_ship) "gY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/centcom/specops) +"gZ" = ( +/obj/machinery/light, +/turf/simulated/floor/backrooms_carpet, +/area/backrooms) "ha" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -2075,7 +2079,7 @@ /area/shuttle/administration) "hy" = ( /obj/effect/decal/cleanable/cobweb2, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/window/reinforced/clockwork{ dir = 4 }, @@ -3798,7 +3802,7 @@ /obj/item/radio/intercom/syndicate{ pixel_y = 25 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -3934,7 +3938,7 @@ /turf/simulated/floor/plasteel, /area/admin) "ni" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/tdome/tdomeadmin) "nj" = ( @@ -3982,7 +3986,7 @@ /obj/structure/mirror/magic/nuclear{ pixel_x = 28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/freezer, /area/syndicate_mothership) "np" = ( @@ -4227,7 +4231,7 @@ /turf/simulated/floor/plasteel/freezer, /area/admin) "nW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -4244,7 +4248,7 @@ /area/centcom/suppy) "nY" = ( /obj/structure/table/wood, -/obj/item/food/mushroompizzaslice{ +/obj/item/food/sliced/mushroom_pizza{ pixel_x = -5; pixel_y = 5 }, @@ -4350,6 +4354,9 @@ }, /turf/simulated/floor/plasteel/freezer, /area/admin) +"oy" = ( +/turf/simulated/wall/indestructible/backrooms, +/area/backrooms) "oz" = ( /obj/machinery/door/airlock/centcom{ aiControlDisabled = 1; @@ -4516,6 +4523,12 @@ icon_state = "cafeteria" }, /area/tdome/tdomeobserve) +"oZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/backrooms_carpet, +/area/backrooms) "pa" = ( /turf/simulated/floor/mineral/titanium, /area/shuttle/trade/sol) @@ -4803,7 +4816,7 @@ /turf/simulated/wall/indestructible/riveted, /area/ghost_bar) "qg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/storage/secure/safe{ pixel_x = 32 }, @@ -4944,7 +4957,7 @@ pixel_y = -2; req_access = list(151) }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -4992,7 +5005,7 @@ /turf/simulated/wall/indestructible, /area/ghost_bar) "qS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/centcom/control) "qT" = ( @@ -5122,7 +5135,7 @@ /area/ghost_bar) "rl" = ( /obj/structure/railing, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/centcom/evac) "rn" = ( @@ -5223,7 +5236,7 @@ /turf/simulated/floor/plasteel/freezer, /area/admin) "rx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/railing, /turf/simulated/floor/plasteel, /area/centcom/evac) @@ -5402,6 +5415,9 @@ /obj/effect/landmark/spawner/syndie, /turf/simulated/floor/wood, /area/syndicate_mothership) +"sd" = ( +/turf/simulated/floor/backrooms_carpet, +/area/backrooms) "se" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -5751,7 +5767,7 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) "tA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/trader_station/sol) "tB" = ( @@ -5782,6 +5798,10 @@ /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/trader_station/sol) +"tI" = ( +/obj/effect/landmark/spawner/backrooms, +/turf/simulated/floor/backrooms_carpet, +/area/backrooms) "tJ" = ( /obj/machinery/door/poddoor{ density = 0; @@ -6462,7 +6482,7 @@ /turf/simulated/floor/plasteel/freezer, /area/admin) "vQ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/tdome/tdomeobserve) "vT" = ( @@ -7398,7 +7418,7 @@ /turf/simulated/floor/carpet/green, /area/ghost_bar) "Ai" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/computer/cryopod{ pixel_y = 32 }, @@ -7614,7 +7634,7 @@ /turf/simulated/floor/plasteel/dark, /area/centcom/gamma) "AV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) "AX" = ( @@ -7861,6 +7881,12 @@ /obj/effect/landmark/spawner/tdomeobserve, /turf/simulated/floor/plasteel/dark, /area/tdome/tdomeobserve) +"BU" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/backrooms_carpet, +/area/backrooms) "BV" = ( /obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ @@ -8387,7 +8413,7 @@ /obj/structure/extinguisher_cabinet{ pixel_y = -32 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" @@ -10204,7 +10230,7 @@ /turf/simulated/floor/plasteel/dark, /area/centcom/control) "Ke" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/black, /area/centcom/evac) "Kg" = ( @@ -11073,7 +11099,7 @@ /turf/simulated/floor/wood, /area/wizard_station) "MV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/wizard_station) "MX" = ( @@ -11383,7 +11409,7 @@ /turf/simulated/floor/plasteel, /area/shuttle/escape) "Of" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "vault" @@ -11549,7 +11575,7 @@ /turf/simulated/floor/wood, /area/centcom/evac) "OF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "green" @@ -11621,7 +11647,7 @@ /turf/simulated/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "OO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "redcorner" @@ -11665,7 +11691,7 @@ /turf/simulated/floor/plasteel/freezer, /area/ghost_bar) "OV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/door_control/no_emag{ id = "CCDOCK2"; name = "Special Operations Secondary Dock"; @@ -11685,7 +11711,7 @@ /turf/simulated/floor/plasteel, /area/tdome/arena) "OX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ pixel_x = 28 }, @@ -11952,6 +11978,12 @@ /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) +"PV" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/backrooms_carpet, +/area/backrooms) "PW" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/light{ @@ -11964,7 +11996,7 @@ /turf/simulated/floor/transparent/glass, /area/tdome/tdomeobserve) "PY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/centcom/evac) "Qa" = ( @@ -12191,7 +12223,7 @@ }, /area/ghost_bar) "QN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "green" @@ -12564,7 +12596,7 @@ /turf/simulated/floor/plasteel/dark, /area/centcom/evac) "Sf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "red" @@ -12602,7 +12634,7 @@ /turf/simulated/floor/transparent/glass/reinforced, /area/centcom/specops) "Sn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "green" @@ -12686,7 +12718,7 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) "SF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -12699,7 +12731,7 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) "SJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/shuttle/escape) "SK" = ( @@ -13537,7 +13569,7 @@ /turf/simulated/floor/grass/jungle, /area/wizard_station) "Wl" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/door_control/no_emag{ id = "CCcustoms1"; name = "CentCom Outer Customs Shutters"; @@ -13836,14 +13868,14 @@ /turf/simulated/floor/wood, /area/centcom/control) "WW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" }, /area/centcom/specops) "WX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/transparent/glass/reinforced, /area/centcom/control) "WZ" = ( @@ -14126,7 +14158,7 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) "XY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/tdome/tdomeobserve) "XZ" = ( @@ -14503,7 +14535,7 @@ }, /area/centcom/specops) "Zl" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/mirror{ pixel_y = 30 }, @@ -54803,39 +54835,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy aN aN aN @@ -55060,39 +55092,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +oy +sd +BU +sd +sd +sd +sd +sd +BU +sd +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -55317,39 +55349,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +oy +oy +oy +sd +oy +sd +sd +sd +sd +oy +sd +oy +sd +oy +sd +sd +sd +sd +sd +sd +sd +oy +oy +oy +oy +oy +oy +oy aN aN aN @@ -55574,39 +55606,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +oy +sd +sd +sd +oy +sd +sd +tI +gZ +oy +sd +oy +sd +oy +sd +sd +sd +sd +sd +sd +sd +oy +sd +BU +sd +sd +sd +oy aN aN aN @@ -55831,39 +55863,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +BU +sd +sd +sd +oy +sd +sd +sd +sd +oy +sd +oy +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +oy aN aN aN @@ -56088,39 +56120,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +oy +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +oy aN aN aN @@ -56345,39 +56377,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +oy +sd +sd +sd +oy +oy +oy +oy +oy +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +oy aN aN aN @@ -56602,6 +56634,39 @@ aN aN aN aN +oy +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +tI +sd +sd +sd +sd +oy +sd +sd +oy +oy +oy +oy aN aN aN @@ -56614,58 +56679,25 @@ aN aN aN aN +"} +(164,1,1) = {" +aN +aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -"} -(164,1,1) = {" -aN -aN -aN -aN -aN -aN -aN -aN -fg -cG -cy -cz -cy -cy -eE -fe -fg +aN +aN +aN +fg +cG +cy +cz +cy +cy +eE +fe +fg aN aN aN @@ -56859,39 +56891,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +tI +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +oy +PV +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +sd +oy aN aN aN @@ -57116,39 +57148,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +oy +oy +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +gZ +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +gZ +oy +sd +sd +oy +sd +sd +oy aN aN aN @@ -57373,39 +57405,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +gZ +oy aN aN aN @@ -57630,39 +57662,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +oy +oy +sd +oy +sd +oy +PV +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +sd +oy aN aN aN @@ -57887,39 +57919,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +oZ +sd +sd +sd +oy +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +oy aN aN aN @@ -58144,39 +58176,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +sd +oy +oy +oy aN aN aN @@ -58401,39 +58433,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +BU +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +BU +sd +sd +oy +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -58658,39 +58690,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +oy +sd +sd +sd +sd +oy aN aN aN @@ -58915,39 +58947,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +PV +sd +sd +sd +sd +sd +sd +sd +sd +oy +oy +oy +oy +oy +oy +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +gZ +oy aN aN aN @@ -59172,39 +59204,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +gZ +oy +sd +sd +BU +sd +sd +oy +sd +sd +oy +oy +oy +sd +sd +sd +oy +PV +sd +sd +sd +sd +sd +oy aN aN aN @@ -59429,39 +59461,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -59686,39 +59718,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +tI +sd +sd +sd +sd +oy +sd +sd +tI +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +tI +sd +sd +sd +oy aN aN aN @@ -59943,39 +59975,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +oy +oy +PV +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -60200,39 +60232,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +PV +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +oy +PV +sd +oy +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -60457,39 +60489,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +gZ +oy +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +sd +sd +sd +sd +oy +PV +sd +sd +sd +sd +sd +oy aN aN aN @@ -60714,39 +60746,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +oy +oy +sd +sd +oy +oy +oy +sd +sd +sd +oy +sd +sd +sd +sd +sd +gZ +oy aN aN aN @@ -60971,39 +61003,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +oy +oy +sd +sd +sd +oy +oy +oy +oy +PV +sd +sd +oy +sd +sd +sd +oy +sd +sd +sd +sd +sd +oy +sd +oy +sd +sd +sd +sd +oy aN aN aN @@ -61228,39 +61260,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +oy +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +oy +sd +sd +oZ +sd +sd +oy +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -61485,39 +61517,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +PV +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy aN aN aN @@ -61742,39 +61774,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +sd +sd +sd +sd +sd +oy +sd +sd +sd +sd +BU +sd +sd +sd +sd +sd +oy aN aN aN @@ -61999,39 +62031,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +sd +tI +sd +sd +sd +gZ +oy +sd +sd +oy +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -62256,39 +62288,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +gZ +oy +PV +sd +sd +sd +sd +sd +sd +sd +sd +tI +sd +sd +sd +gZ +oy aN aN aN @@ -62513,39 +62545,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +oy +sd +sd +oy +sd +sd +oy +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +sd +oy aN aN aN @@ -62770,39 +62802,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +sd +oy +sd +sd +sd +oZ +sd +sd +sd +sd +oy +sd +sd +sd +sd +sd +oy +sd +sd +sd +oy +sd +sd +sd +sd +oZ +sd +sd +sd +sd +sd +oy aN aN aN @@ -63027,39 +63059,39 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy +oy aN aN aN diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index 44494f912be1..75d6d02e5fd9 100644 --- a/_maps/map_files/shuttles/emergency_bar.dmm +++ b/_maps/map_files/shuttles/emergency_bar.dmm @@ -101,7 +101,7 @@ /turf/simulated/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "az" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, @@ -112,7 +112,7 @@ }, /area/shuttle/escape) "aB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/royalblack, /area/shuttle/escape) "aC" = ( diff --git a/_maps/map_files/shuttles/emergency_cyb.dmm b/_maps/map_files/shuttles/emergency_cyb.dmm index 817c268bda3e..f7fed9efd781 100644 --- a/_maps/map_files/shuttles/emergency_cyb.dmm +++ b/_maps/map_files/shuttles/emergency_cyb.dmm @@ -414,7 +414,7 @@ /turf/simulated/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "br" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "redcorner" @@ -432,7 +432,7 @@ /turf/simulated/floor/plating/airless, /area/shuttle/escape) "bx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ pixel_x = 28 }, @@ -544,14 +544,14 @@ }, /area/shuttle/escape) "bJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "bK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 4 }, @@ -673,7 +673,7 @@ }, /area/shuttle/escape) "cb" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/shuttle/escape) "cc" = ( diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm index 65849d5452ed..c0d2de07ba70 100644 --- a/_maps/map_files/shuttles/emergency_dept.dmm +++ b/_maps/map_files/shuttles/emergency_dept.dmm @@ -289,7 +289,7 @@ }, /area/shuttle/escape) "aT" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/shuttle/escape) "aU" = ( @@ -1112,7 +1112,7 @@ }, /area/shuttle/escape) "PW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, diff --git a/_maps/map_files/shuttles/emergency_shadow.dmm b/_maps/map_files/shuttles/emergency_shadow.dmm index f5aa7fa5d8f9..7a969fbfbbc0 100644 --- a/_maps/map_files/shuttles/emergency_shadow.dmm +++ b/_maps/map_files/shuttles/emergency_shadow.dmm @@ -359,7 +359,7 @@ /obj/effect/turf_decal/stripes/white/line{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) "qk" = ( @@ -531,7 +531,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) "yg" = ( @@ -958,7 +958,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) "OL" = ( diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index 7f8762402c3a..c6f93349937c 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -5538,7 +5538,7 @@ /turf/simulated/floor/plasteel, /area/station/security/prisonershuttle) "auF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "red" @@ -5556,7 +5556,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore) "auL" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "red" @@ -8820,7 +8820,7 @@ name = "west bump"; pixel_x = -24 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -9191,7 +9191,7 @@ /turf/simulated/floor/wood, /area/station/legal/courtroom) "aGu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/requests_console/directional/east, /turf/simulated/floor/wood, /area/station/legal/courtroom) @@ -9514,7 +9514,7 @@ }, /area/station/legal/courtroom/gallery) "aHH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "redcorner" @@ -9997,7 +9997,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore) "aJu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "barber" }, @@ -10244,7 +10244,7 @@ }, /area/station/legal/lawoffice) "aKy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -11836,7 +11836,7 @@ }, /area/station/legal/courtroom/gallery) "aPH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "bluecorner" @@ -12031,7 +12031,7 @@ }, /area/station/public/dorms) "aQs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitecorner" @@ -17125,7 +17125,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/port/west) "bgs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Office Supplies"; dir = 4 @@ -18246,7 +18246,7 @@ /turf/simulated/floor/plating, /area/station/service/hydroponics) "bjD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -18260,7 +18260,7 @@ /turf/simulated/floor/wood, /area/station/service/library) "bjI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ name = "north bump"; pixel_y = 24 @@ -19524,7 +19524,7 @@ c_tag = "Bar East" }, /obj/machinery/newscaster/directional/north, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/bar) "bnm" = ( @@ -22646,7 +22646,7 @@ /area/station/service/chapel) "bxE" = ( /obj/machinery/economy/atm/directional/east, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/bar) "bxF" = ( @@ -23826,7 +23826,7 @@ /turf/simulated/floor/wood, /area/station/service/library) "bCR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/library) "bCS" = ( @@ -23907,7 +23907,7 @@ }, /area/station/medical/reception) "bDk" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/machinery/light_switch{ dir = 8; @@ -28322,7 +28322,7 @@ }, /area/station/hallway/primary/central/se) "bUH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" @@ -28641,7 +28641,7 @@ /turf/simulated/wall, /area/station/science/robotics/chargebay) "bWk" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" }, @@ -31538,7 +31538,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft) "chJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/random{ pixel_y = -32 }, @@ -33079,7 +33079,7 @@ /turf/simulated/floor/plating, /area/station/medical/patients_rooms1) "coa" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitebluefull" }, @@ -33106,7 +33106,7 @@ }, /area/station/medical/medbay) "coe" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/south, /obj/structure/cable, /turf/simulated/floor/plasteel{ @@ -33261,7 +33261,7 @@ /area/station/medical/patients_rooms_secondary) "cpb" = ( /obj/machinery/alarm/directional/east, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whiteblue" }, @@ -36486,7 +36486,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/controlroom) "cAS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurplecorner" @@ -36865,7 +36865,7 @@ /turf/simulated/floor/plating, /area/station/science/misc_lab) "cCf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitepurplecorner" @@ -37002,7 +37002,7 @@ }, /area/station/science/break_room) "cCV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ pixel_y = 24; name = "north bump" @@ -37555,7 +37555,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/ntrep) "cEL" = ( @@ -42682,7 +42682,7 @@ /turf/simulated/floor/plating, /area/station/engineering/secure_storage) "cYH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "west bump"; pixel_x = -28 @@ -42713,7 +42713,7 @@ /area/station/engineering/smes) "cYN" = ( /obj/machinery/alarm/directional/west, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/procedure/trainer_office) "cYO" = ( @@ -45001,7 +45001,7 @@ }, /area/station/hallway/primary/central/north) "dix" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/north, /obj/machinery/light{ dir = 1 @@ -45193,7 +45193,7 @@ /turf/space, /area/space/nearstation) "dje" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/north, /obj/structure/cable{ icon_state = "0-2" @@ -48501,7 +48501,7 @@ /turf/simulated/floor/engine, /area/station/engineering/control) "dQe" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "2-4" }, @@ -51328,7 +51328,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/controlroom) "fhe" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkred" @@ -54953,7 +54953,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/transmission_laser) "gXD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/requests_console/directional/north, /turf/simulated/floor/wood, /area/station/command/meeting_room) @@ -56687,7 +56687,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/aft) "hVU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/nanotrasen_logo{ pixel_x = 32 }, @@ -56983,7 +56983,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore) "ifH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/north, /obj/structure/cable{ icon_state = "0-2" @@ -59374,7 +59374,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/north) "jtP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/mapping_helpers/turfs/damage, /turf/simulated/floor/wood, /area/station/maintenance/asmaint) @@ -61685,7 +61685,7 @@ /turf/simulated/floor/plasteel, /area/station/command/teleporter) "kDY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 4 @@ -64613,7 +64613,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint2) "mdg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /turf/simulated/floor/plasteel{ icon_state = "barber" @@ -65351,7 +65351,7 @@ }, /area/station/maintenance/asmaint) "mxH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) @@ -66909,7 +66909,7 @@ }, /area/station/engineering/control) "ntz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/west, /turf/simulated/floor/wood, /area/station/command/office/captain) @@ -70125,7 +70125,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/asmaint) "oUv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "south bump"; pixel_y = -28 @@ -71257,7 +71257,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/asmaint) "pAp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "yellowcorner" }, @@ -73245,7 +73245,7 @@ }, /area/station/science/xenobiology) "qyq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/south, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -74054,7 +74054,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "1-8" }, @@ -74363,7 +74363,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "raH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/maintenance/asmaint) "raL" = ( @@ -74524,7 +74524,7 @@ }, /area/station/medical/reception) "rdL" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "west bump"; pixel_x = -27 @@ -75422,7 +75422,7 @@ /turf/simulated/floor/carpet/arcade, /area/station/public/arcade) "rCT" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -79714,9 +79714,9 @@ /area/station/science/test_chamber) "tWD" = ( /obj/structure/closet/crate, -/obj/item/food/breadslice, -/obj/item/food/breadslice, -/obj/item/food/breadslice, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/onion, @@ -80556,7 +80556,7 @@ }, /area/station/supply/qm) "uuo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "purplecorner" @@ -82660,7 +82660,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fpmaint) "vFk" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) @@ -82887,7 +82887,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "bluecorner" @@ -83012,7 +83012,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft) "vOq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/east, /turf/simulated/floor/plasteel{ dir = 6; diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index b9682eba79ca..f1dcb821649f 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -433,13 +433,13 @@ }, /area/station/hallway/primary/port/north) "acO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, /area/station/turret_protected/ai) "acR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/security/permabrig) "acV" = ( @@ -1404,7 +1404,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/flasher{ id = "AI"; pixel_y = 21 @@ -2215,7 +2215,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/disposal/northeast) "ata" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/north, /turf/simulated/floor/wood, /area/station/command/office/hos) @@ -2557,7 +2557,7 @@ }, /area/station/turret_protected/aisat/interior/secondary) "avv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/cobweb, /obj/structure/disposalpipe/segment/corner{ dir = 1 @@ -2763,7 +2763,7 @@ name = "east bump"; pixel_x = 30 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -3005,7 +3005,7 @@ /turf/simulated/wall, /area/station/command/office/hos) "azX" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/item/radio/intercom{ name = "south bump"; pixel_y = -28 @@ -3937,7 +3937,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, @@ -4666,7 +4666,7 @@ /area/station/security/lobby) "aPW" = ( /obj/machinery/light, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel{ icon_state = "redcorner" }, @@ -4806,7 +4806,7 @@ /area/station/public/toilet/lockerroom) "aSf" = ( /obj/machinery/light, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel{ icon_state = "darkblue" }, @@ -5985,7 +5985,7 @@ c_tag = "Rehabilitation Dome Lobby East"; dir = 8 }, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/north) "bbU" = ( @@ -6607,7 +6607,7 @@ /turf/simulated/floor/grass/jungle, /area/station/hallway/secondary/garden) "bfV" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/north) "bfW" = ( @@ -6801,7 +6801,7 @@ c_tag = "Dorm Commons North"; dir = 4 }, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/economy/vending/wallmed/directional/north, /turf/simulated/floor/plasteel, /area/station/public/locker) @@ -8571,7 +8571,7 @@ }, /area/station/aisat/atmos) "brs" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkblue" @@ -9784,7 +9784,7 @@ }, /area/station/engineering/break_room) "bxv" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkyellowcorners" @@ -9854,7 +9854,7 @@ /area/station/command/office/hop) "bxG" = ( /obj/structure/disposalpipe/segment, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -11516,7 +11516,7 @@ }, /area/station/engineering/control) "bFo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -12216,7 +12216,7 @@ name = "Atmospherics Desk Shutters"; pixel_x = 24 }, -/obj/item/kirbyplants/plant13, +/obj/item/kirbyplants/large/alien/alien5, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkyellow" @@ -13638,7 +13638,7 @@ /turf/simulated/floor/plasteel, /area/station/command/office/ce) "bPE" = ( -/obj/item/kirbyplants/plant25, +/obj/item/kirbyplants/large/plant7, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ @@ -14201,7 +14201,7 @@ /turf/simulated/wall/r_wall, /area/station/engineering/smes) "bSB" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/light, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -14324,6 +14324,25 @@ /turf/simulated/floor/plating, /area/station/engineering/smes) "bTk" = ( +/obj/structure/closet/crate{ + name = "solar pack crate" + }, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/circuitboard/solar_control, +/obj/item/tracker_electronics, +/obj/item/paper/solar, /turf/simulated/floor/plating, /area/station/engineering/smes) "bTl" = ( @@ -15538,7 +15557,7 @@ }, /area/station/command/bridge) "bYn" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -16293,7 +16312,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) "ceR" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/firealarm/directional/east, /turf/simulated/floor/plasteel{ icon_state = "bcircuit" @@ -21142,7 +21161,7 @@ /obj/structure/cable/orange{ icon_state = "2-8" }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutralfull" }, @@ -25081,7 +25100,7 @@ /turf/space, /area/station/engineering/solar/fore_port) "duc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" }, @@ -25263,7 +25282,7 @@ /turf/simulated/floor/wood, /area/station/service/library) "dvA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -31490,7 +31509,7 @@ /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/port) "eTJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -32600,9 +32619,9 @@ /area/station/security/permabrig) "flp" = ( /obj/structure/closet/crate, -/obj/item/food/breadslice, -/obj/item/food/breadslice, -/obj/item/food/breadslice, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/onion, @@ -32976,7 +32995,7 @@ }, /area/station/supply/lobby) "frn" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/machinery/firealarm/directional/north, /turf/simulated/floor/plasteel{ dir = 4; @@ -38163,7 +38182,7 @@ }, /area/station/maintenance/port) "gQP" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/machinery/light_switch{ dir = 1; pixel_y = -24; @@ -38305,7 +38324,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/disposal/external/southeast) "gTe" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" }, @@ -38929,7 +38948,7 @@ /obj/structure/cable/orange{ icon_state = "0-8" }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/blueshield) "hch" = ( @@ -39034,7 +39053,7 @@ /obj/structure/cable/orange{ icon_state = "0-4" }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/ntrep) "hdL" = ( @@ -40198,7 +40217,7 @@ /turf/simulated/floor/plating, /area/station/hallway/secondary/entry/north) "htq" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/structure/sign/xenobio{ pixel_x = 32 }, @@ -40913,7 +40932,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/fore/west) "hDf" = ( -/obj/item/kirbyplants/plant25, +/obj/item/kirbyplants/large/plant7, /turf/simulated/floor/plasteel{ icon_state = "arrival" }, @@ -44814,7 +44833,7 @@ }, /area/station/medical/medbay) "iAa" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -46895,7 +46914,7 @@ }, /area/station/hallway/secondary/entry/north) "jag" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 4 }, @@ -47370,7 +47389,7 @@ /obj/structure/disposalpipe/junction/reversed{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable/orange{ icon_state = "4-8" }, @@ -50206,7 +50225,7 @@ }, /area/station/security/prisonershuttle) "jMh" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/requests_console/directional/west, /turf/simulated/floor/carpet, /area/station/medical/psych) @@ -50472,7 +50491,7 @@ /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/port2) "jQl" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/alarm/directional/north, /obj/machinery/light_switch{ dir = 8; @@ -51367,7 +51386,7 @@ /area/station/hallway/primary/central/north) "kbw" = ( /obj/machinery/firealarm/directional/south, -/obj/item/kirbyplants/plant25, +/obj/item/kirbyplants/large/plant7, /turf/simulated/floor/plasteel{ icon_state = "darkpurple" }, @@ -51851,7 +51870,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/window/reinforced{ dir = 8 }, @@ -52213,7 +52232,7 @@ }, /area/station/hallway/primary/central/west) "knB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, @@ -54416,7 +54435,7 @@ /turf/simulated/floor/plasteel/freezer, /area/station/service/kitchen) "kPx" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/structure/cable/orange{ icon_state = "1-2" }, @@ -54468,7 +54487,7 @@ /turf/simulated/floor/carpet/royalblack, /area/station/command/office/ntrep) "kQz" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel{ icon_state = "darkgreen" }, @@ -55041,7 +55060,7 @@ }, /area/station/hallway/secondary/entry/north) "kYE" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /turf/simulated/floor/carpet, /area/station/medical/psych) @@ -57354,7 +57373,7 @@ /turf/simulated/floor/carpet, /area/station/service/bar) "lBJ" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel, /area/station/public/dorms) "lBW" = ( @@ -61695,7 +61714,7 @@ }, /area/station/hallway/primary/fore/north) "mHg" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/firealarm/directional/north, /turf/simulated/floor/wood, /area/station/service/library) @@ -64284,7 +64303,7 @@ }, /area/station/hallway/spacebridge/comeng) "nrh" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/structure/sign/securearea{ pixel_y = 32 }, @@ -65247,7 +65266,7 @@ "nEA" = ( /obj/structure/cable/orange, /obj/machinery/power/apc/directional/south, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "browncorner" }, @@ -66126,7 +66145,7 @@ /obj/structure/sign/nosmoking_2{ pixel_y = 32 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "whitepurple" @@ -66972,7 +66991,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -69838,7 +69857,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "bluecorner" @@ -74396,7 +74415,7 @@ name = "west bump"; pixel_x = -28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/black, /area/station/service/chapel/office) "pWf" = ( @@ -75288,7 +75307,7 @@ }, /area/station/hallway/spacebridge/serveng) "qhi" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel{ icon_state = "darkpurple" }, @@ -75399,7 +75418,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/fore2) "qjf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -78092,7 +78111,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore2) "qSJ" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/structure/cable/orange{ icon_state = "2-4" }, @@ -79767,7 +79786,7 @@ }, /area/station/engineering/break_room) "rsq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "neutralcorner" @@ -80693,7 +80712,7 @@ }, /area/station/maintenance/port2) "rGm" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/machinery/light_switch{ dir = 4; pixel_x = -24; @@ -80847,7 +80866,7 @@ }, /area/station/maintenance/asmaint) "rIq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -81428,7 +81447,7 @@ }, /area/station/command/office/cmo) "rOY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, @@ -85065,7 +85084,7 @@ /area/mine/unexplored/cere/orbiting) "sIP" = ( /obj/item/razor, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/west, /obj/structure/cable/orange{ icon_state = "0-4" @@ -86261,7 +86280,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/effect/spawner/random/dirt/often, /turf/simulated/floor/plasteel{ dir = 9; @@ -88650,7 +88669,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/window/reinforced{ dir = 4 }, @@ -89559,7 +89578,7 @@ }, /area/station/hallway/primary/fore/north) "tQD" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/item/radio/intercom{ name = "east bump"; pixel_x = 28 @@ -92789,7 +92808,7 @@ /turf/simulated/floor/plasteel, /area/station/public/fitness) "uAH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutralcorner" }, @@ -92856,7 +92875,7 @@ }, /area/station/science/xenobiology) "uBY" = ( -/obj/item/kirbyplants/plant25, +/obj/item/kirbyplants/large/plant7, /turf/simulated/floor/plasteel{ icon_state = "whitegreen" }, @@ -97433,7 +97452,7 @@ /area/station/maintenance/apmaint) "vIu" = ( /obj/machinery/alarm/directional/north, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/wood, /area/station/legal/magistrate) "vIz" = ( @@ -97640,7 +97659,7 @@ }, /area/station/public/storage/tools/auxiliary) "vLy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "bluecorner" @@ -102172,7 +102191,7 @@ }, /area/station/medical/medbay) "wOW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -103440,7 +103459,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/starboard) "xfK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/library) "xfM" = ( @@ -106697,7 +106716,7 @@ /turf/simulated/floor/engine, /area/station/medical/chemistry) "xVF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkyellowcorners" }, @@ -107113,7 +107132,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "ycw" = ( -/obj/item/kirbyplants/dead, +/obj/item/kirbyplants/large/dead, /obj/effect/mapping_helpers/turfs/burn, /obj/structure/sign/poster/contraband/random{ pixel_x = -32 diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index cec07877679f..d43a1124eb22 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -555,7 +555,7 @@ }, /area/station/hallway/secondary/entry/north) "afk" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "brown" @@ -1831,7 +1831,7 @@ }, /area/station/hallway/secondary/entry/east) "anz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 4 }, @@ -2064,7 +2064,7 @@ /turf/simulated/floor/wood, /area/station/legal/courtroom) "aow" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutralcorner" }, @@ -2082,7 +2082,7 @@ }, /area/station/maintenance/fore2) "aoA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "arrival" }, @@ -2185,7 +2185,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/public/vacant_office) "aoY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/north, /turf/simulated/floor/wood, /area/station/public/vacant_office) @@ -2245,7 +2245,7 @@ }, /area/station/command/customs) "apg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/north, /obj/machinery/light_switch{ dir = 8; @@ -2588,7 +2588,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/hallway/secondary/entry/lounge) "aqc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -2706,7 +2706,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/maintenance/electrical_shop) "aqw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/maintenance/electrical_shop) "aqx" = ( @@ -2724,7 +2724,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/electrical_shop) "aqz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/maintenance/electrical_shop) "aqA" = ( @@ -2753,7 +2753,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/electrical_shop) "aqD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 1 }, @@ -2982,7 +2982,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore2) "arh" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/dark, /area/station/maintenance/fore2) @@ -2996,7 +2996,7 @@ }, /area/station/maintenance/fore2) "arj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, @@ -3121,7 +3121,7 @@ /turf/simulated/floor/wood, /area/station/public/vacant_office) "arF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/public/vacant_office) "arG" = ( @@ -3535,7 +3535,7 @@ }, /area/station/security/checkpoint/secondary) "asI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/fore2) "asJ" = ( @@ -3857,7 +3857,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/hallway/secondary/entry/lounge) "atD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/south, /turf/simulated/floor/plasteel/grimy, /area/station/hallway/secondary/entry/lounge) @@ -3970,7 +3970,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/maintenance/fore2) "atS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/maintenance/fore2) "atU" = ( @@ -4114,7 +4114,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/electrical_shop) "auo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/south, /obj/structure/cable{ icon_state = "0-8" @@ -4163,7 +4163,7 @@ }, /area/station/maintenance/fore2) "auw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 8 }, @@ -4353,7 +4353,7 @@ }, /area/station/hallway/secondary/entry/lounge) "avc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "neutralcorner" @@ -4373,7 +4373,7 @@ }, /area/station/maintenance/fore2) "avg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "neutralcorner" @@ -5472,7 +5472,7 @@ }, /area/station/security/prisonershuttle) "axW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/nosmoking_2{ pixel_x = 32 }, @@ -5636,7 +5636,7 @@ /turf/simulated/wall, /area/station/supply/sorting) "ayB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/machinery/firealarm/directional/south, /turf/simulated/floor/plasteel{ @@ -6626,7 +6626,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/delivery/hollow, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/engine, /area/station/engineering/controlroom) "aBm" = ( @@ -7240,7 +7240,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/abandoned_garden) "aDl" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 1 }, @@ -7276,7 +7276,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/abandoned_garden) "aDq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_y = 32 }, @@ -8512,7 +8512,7 @@ /turf/simulated/floor/engine, /area/station/engineering/controlroom) "aHd" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, /area/station/maintenance/abandoned_garden) @@ -8946,7 +8946,7 @@ dir = 2 }, /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/maintenance/incinerator) "aIv" = ( @@ -9006,7 +9006,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/maintenance/incinerator) "aIB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -9246,7 +9246,7 @@ /turf/space, /area/space/nearstation) "aJD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -9259,7 +9259,7 @@ /turf/simulated/floor/plating, /area/station/supply/storage) "aJF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "south bump"; pixel_y = -28 @@ -10489,7 +10489,7 @@ }, /area/station/supply/storage) "aNl" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "brown" @@ -10618,7 +10618,7 @@ /turf/simulated/floor/plating, /area/station/security/permabrig) "aNL" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/plasteel{ icon_state = "darkred" @@ -10734,7 +10734,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/maintenance/gambling_den) "aOq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/grimy, /area/station/maintenance/gambling_den) "aOr" = ( @@ -10744,7 +10744,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/maintenance/gambling_den) "aOs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/gambling_den) "aOt" = ( @@ -10756,7 +10756,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/gambling_den) "aOu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/maintenance/gambling_den) "aOv" = ( @@ -10810,7 +10810,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_y = 32 }, @@ -11060,7 +11060,7 @@ }, /area/station/service/bar) "aPv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/security/permabrig) "aPw" = ( @@ -11255,7 +11255,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/grimy, /area/station/service/theatre) "aQb" = ( @@ -11582,7 +11582,7 @@ }, /area/station/engineering/atmos) "aQZ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -11868,7 +11868,7 @@ }, /area/station/supply/sorting) "aRO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/east, /turf/simulated/floor/plasteel{ dir = 6; @@ -12952,7 +12952,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "east bump"; pixel_x = 30 @@ -13005,7 +13005,7 @@ }, /area/station/supply/storage) "aVb" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, @@ -14354,7 +14354,7 @@ }, /area/station/engineering/atmos) "aZn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 4; name = "west bump"; @@ -14423,7 +14423,7 @@ /area/station/command/office/hos) "aZz" = ( /obj/machinery/light, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/south, /turf/simulated/floor/plasteel{ icon_state = "brown" @@ -14730,7 +14730,7 @@ /turf/simulated/floor/plasteel, /area/station/service/kitchen) "baR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/west, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -14800,7 +14800,7 @@ }, /area/station/supply/office) "baY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "brown" }, @@ -15663,7 +15663,7 @@ }, /area/station/supply/lobby) "bdW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "brown" @@ -16139,7 +16139,7 @@ }, /area/station/supply/miningdock) "bfC" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, /area/station/supply/miningdock) @@ -16481,7 +16481,7 @@ /turf/simulated/wall, /area/station/command/office/ce) "bgK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel{ dir = 8; @@ -16503,7 +16503,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/turret_protected/ai) "bgO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -16641,7 +16641,7 @@ /area/station/engineering/atmos) "bhv" = ( /obj/effect/turf_decal/delivery/hollow, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/service/hydroponics) "bhw" = ( @@ -17573,7 +17573,7 @@ }, /area/station/supply/miningdock) "bjK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ dir = 10; @@ -18306,7 +18306,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/transparent/glass, /area/station/aisat) "bmq" = ( @@ -18324,7 +18324,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/transparent/glass, /area/station/aisat) "bms" = ( @@ -18869,7 +18869,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "2-4" }, @@ -19427,7 +19427,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/service/library) "bpU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "yellowcorner" @@ -20672,7 +20672,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/atmos) "buA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 @@ -20923,7 +20923,7 @@ /turf/simulated/floor/plating, /area/station/engineering/control) "bvC" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/nosmoking_2{ pixel_y = 32 }, @@ -21405,7 +21405,7 @@ }, /area/station/engineering/atmos) "bxc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "caution" @@ -21761,7 +21761,7 @@ /turf/simulated/floor/greengrid, /area/station/turret_protected/ai) "byg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/turret_protected/ai) "byh" = ( @@ -22426,7 +22426,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/tech_storage) "bAi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, /area/station/engineering/tech_storage) @@ -22497,7 +22497,7 @@ }, /area/station/engineering/hardsuitstorage) "bAr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 1 }, @@ -22510,7 +22510,7 @@ }, /area/station/command/bridge) "bAt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/command/bridge) "bAw" = ( @@ -22811,7 +22811,7 @@ }, /area/station/engineering/break_room) "bBF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/north, /obj/machinery/light{ dir = 1 @@ -23103,7 +23103,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/command/bridge) "bCn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -23278,7 +23278,7 @@ pixel_y = 24; req_access = list(19) }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "4-8" }, @@ -23748,7 +23748,7 @@ }, /area/station/hallway/primary/port/north) "bDE" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_x = -32 }, @@ -23801,7 +23801,7 @@ }, /area/station/engineering/tech_storage) "bDI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/ai_status_display{ pixel_x = 32 }, @@ -23961,7 +23961,7 @@ }, /area/station/command/bridge) "bEd" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkblue" @@ -24004,7 +24004,7 @@ /turf/simulated/floor/carpet, /area/station/command/bridge) "bEj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkblue" @@ -24160,7 +24160,7 @@ }, /area/station/engineering/break_room) "bET" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel{ @@ -24169,7 +24169,7 @@ }, /area/station/engineering/break_room) "bEU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /obj/machinery/alarm/directional/south, /obj/effect/turf_decal/delivery, @@ -24402,7 +24402,7 @@ }, /area/station/public/storage/tools) "bFr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel, /area/station/public/storage/tools) @@ -24571,7 +24571,7 @@ }, /area/station/command/bridge) "bFR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small, /turf/simulated/floor/plasteel/dark, /area/station/command/bridge) @@ -25282,7 +25282,7 @@ }, /area/station/security/checkpoint) "bHS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "redcorner" @@ -25355,7 +25355,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/gravitygenerator) "bIq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) "bIr" = ( @@ -25386,7 +25386,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) "bIv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/north, /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) @@ -25612,7 +25612,7 @@ /turf/simulated/floor/wood, /area/station/command/meeting_room) "bJa" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -25714,7 +25714,7 @@ /turf/simulated/floor/wood, /area/station/command/office/captain) "bJr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/captain) "bJs" = ( @@ -25731,7 +25731,7 @@ }, /area/station/legal/courtroom/gallery) "bJC" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/west, /obj/structure/cable{ icon_state = "0-4" @@ -25931,7 +25931,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/engineering/ai_transit_tube) "bKc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /obj/machinery/door_control{ id = "transitlock"; @@ -25945,7 +25945,7 @@ }, /area/station/engineering/ai_transit_tube) "bKd" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -26089,7 +26089,7 @@ /turf/simulated/wall, /area/station/engineering/break_room) "bKy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/ai_status_display{ pixel_x = -32 }, @@ -26107,7 +26107,7 @@ /turf/simulated/floor/plasteel, /area/station/public/storage/tools) "bKB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_x = 32 }, @@ -26717,7 +26717,7 @@ }, /area/station/engineering/break_room) "bMw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "yellow" @@ -26731,7 +26731,7 @@ name = "east bump"; pixel_x = 28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "yellow" @@ -27322,7 +27322,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/engineering/tech_storage) "bOr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, @@ -27337,7 +27337,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/tech_storage) "bOt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 1; name = "south bump"; @@ -27386,7 +27386,7 @@ /turf/simulated/floor/plasteel, /area/station/public/storage/tools) "bOz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/public/storage/tools) "bOA" = ( @@ -27763,7 +27763,7 @@ }, /area/station/turret_protected/aisat) "bPJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -27777,7 +27777,7 @@ }, /area/station/turret_protected/aisat) "bPN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -27961,7 +27961,7 @@ }, /area/station/security/brig) "bQp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -28094,7 +28094,7 @@ /turf/simulated/floor/wood, /area/station/command/meeting_room) "bQG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/wood, /area/station/command/meeting_room) @@ -29135,7 +29135,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) "bUn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) @@ -29385,7 +29385,7 @@ /turf/simulated/floor/wood, /area/station/command/office/hop) "bUT" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/hop) "bUU" = ( @@ -29851,7 +29851,7 @@ pixel_x = 32 }, /obj/machinery/alarm/directional/south, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "yellow" @@ -30109,7 +30109,7 @@ }, /area/station/engineering/break_room) "bXH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/item/radio/intercom{ name = "south bump"; @@ -30136,7 +30136,7 @@ }, /area/station/turret_protected/aisat) "bXK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/machinery/alarm/directional/south, /turf/simulated/floor/plasteel{ @@ -30187,7 +30187,7 @@ }, /area/station/turret_protected/aisat) "bXP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "east bump"; pixel_x = 27 @@ -30235,7 +30235,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/control) "bYe" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "cautioncorner" @@ -30875,7 +30875,7 @@ /turf/simulated/floor/carpet/black, /area/station/command/office/captain/bedroom) "cat" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/security_unit/directional/east, /turf/simulated/floor/carpet/black, /area/station/command/office/captain/bedroom) @@ -30903,7 +30903,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/legal/courtroom/gallery) "cay" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/legal/courtroom/gallery) "caz" = ( @@ -30932,6 +30932,7 @@ c_tag = "Internal Affairs Office"; dir = 4 }, +/obj/machinery/firealarm/directional/north, /turf/simulated/floor/plasteel/grimy, /area/station/legal/lawoffice) "caH" = ( @@ -31007,7 +31008,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/command/office/hop) "caV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -31187,7 +31188,7 @@ }, /area/station/engineering/control) "cbu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Engine Room North"; network = list("Engineering","SS13") @@ -31373,7 +31374,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/control) "cbS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "4-8" }, @@ -31572,9 +31573,6 @@ /area/station/command/office/captain/bedroom) "cct" = ( /obj/structure/filingcabinet/chestdrawer, -/obj/structure/sign/poster/official/work_for_a_future{ - pixel_x = -32 - }, /turf/simulated/floor/plasteel/grimy, /area/station/legal/lawoffice) "ccu" = ( @@ -31847,7 +31845,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "cdx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -31867,7 +31865,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/service/library) "cdA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 4 }, @@ -32004,7 +32002,7 @@ /area/station/command/office/captain/bedroom) "cdX" = ( /obj/machinery/firealarm/directional/south, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Captain's Quarters"; dir = 1 @@ -32318,7 +32316,7 @@ /turf/simulated/floor/wood, /area/station/service/library) "cfs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/library) "cft" = ( @@ -32844,7 +32842,7 @@ }, /area/station/telecomms/chamber) "chX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -34117,7 +34115,7 @@ }, /area/station/hallway/primary/aft/south) "cmo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "cult" }, @@ -34441,7 +34439,7 @@ /turf/simulated/floor/wood, /area/station/command/office/hop) "cnt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 1; name = "south bump"; @@ -35036,7 +35034,7 @@ /turf/simulated/wall/r_wall, /area/station/engineering/control) "cpr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable/yellow{ icon_state = "1-4" }, @@ -35764,7 +35762,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/equipmentstorage) "crk" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Library South"; dir = 1 @@ -35784,7 +35782,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/service/library) "crm" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/machinery/light_switch{ dir = 1; @@ -35797,7 +35795,7 @@ /turf/simulated/floor/plasteel/grimy, /area/station/service/library) "cro" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/grimy, /area/station/service/library) "crp" = ( @@ -36076,7 +36074,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/transparent/glass, /area/station/aisat) "csl" = ( @@ -36084,7 +36082,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/transparent/glass, /area/station/aisat) "csm" = ( @@ -36157,7 +36155,7 @@ /turf/simulated/floor/plating, /area/station/engineering/control) "csw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery/hollow, /obj/machinery/firealarm/directional/east, @@ -36171,8 +36169,24 @@ /obj/structure/closet/crate{ name = "solar pack crate" }, -/obj/effect/turf_decal/delivery/hollow, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/circuitboard/solar_control, +/obj/item/tracker_electronics, +/obj/item/paper/solar, /obj/machinery/alarm/directional/south, +/obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel, /area/station/engineering/equipmentstorage) "csA" = ( @@ -36504,7 +36518,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/control) "ctH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/service/library) "ctK" = ( @@ -36649,7 +36663,7 @@ }, /area/station/hallway/primary/central) "cuf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "4-8" }, @@ -36750,7 +36764,7 @@ }, /area/station/hallway/primary/starboard/south) "cuv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, @@ -37222,7 +37236,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/ai_monitored/storage/eva) "cvz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -37401,7 +37415,7 @@ /turf/simulated/wall, /area/station/public/fitness) "cwq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel/white, /area/station/maintenance/port2) @@ -37442,7 +37456,7 @@ }, /area/station/engineering/control) "cwy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/electricshock{ pixel_y = 32 }, @@ -37717,7 +37731,7 @@ /area/station/supply/expedition) "cxl" = ( /obj/machinery/power/apc/directional/north, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -37970,7 +37984,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/port) "cxV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "west bump"; pixel_x = -30 @@ -38032,7 +38046,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/service/library) "cyb" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/east, /turf/simulated/floor/plasteel/dark, /area/station/service/library) @@ -38236,7 +38250,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/port2) "cyF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/public/toilet/lockerroom) "cyH" = ( @@ -38461,7 +38475,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/port) "czo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 @@ -39001,7 +39015,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/service/library) "cAU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "south bump"; pixel_y = -28 @@ -39101,7 +39115,7 @@ }, /area/station/hallway/primary/starboard/south) "cBi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -39545,7 +39559,7 @@ /turf/simulated/floor/carpet, /area/station/science/robotics/showroom) "cCN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /obj/machinery/light, /turf/simulated/floor/carpet, @@ -39570,7 +39584,7 @@ /turf/simulated/floor/carpet, /area/station/science/robotics/showroom) "cCR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/carpet, /area/station/science/robotics/showroom) @@ -39613,7 +39627,7 @@ }, /area/station/supply/expedition) "cCX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -39870,14 +39884,14 @@ /turf/simulated/floor/plasteel, /area/station/science/robotics/chargebay) "cDJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /turf/simulated/floor/plasteel, /area/station/engineering/control) "cDK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/electricshock{ pixel_y = -32 }, @@ -39917,7 +39931,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "cDQ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/port) "cDR" = ( @@ -39963,7 +39977,7 @@ }, /area/station/maintenance/port) "cEb" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "south bump"; pixel_y = -28 @@ -39996,7 +40010,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/ai_monitored/storage/eva) "cEs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/ai_monitored/storage/eva) "cEt" = ( @@ -40979,7 +40993,7 @@ }, /area/station/public/fitness) "cGT" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, @@ -41413,7 +41427,7 @@ }, /area/station/public/fitness) "cId" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutral" }, @@ -41932,7 +41946,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/electrical) "cJW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel, /area/station/maintenance/electrical) @@ -42065,7 +42079,7 @@ }, /area/station/science/lobby) "cKz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bluecorner" }, @@ -42148,7 +42162,7 @@ }, /area/station/medical/reception) "cKN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitebluecorner" @@ -42348,7 +42362,7 @@ }, /area/station/maintenance/electrical) "cLF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/electrical) "cLG" = ( @@ -42515,7 +42529,7 @@ /turf/simulated/floor/plasteel/white, /area/station/science/research) "cMn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whitepurplecorner" @@ -42542,7 +42556,7 @@ /turf/simulated/floor/plasteel/white, /area/station/medical/medbay) "cMt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whitebluecorner" @@ -42729,7 +42743,7 @@ /turf/space, /area/space/nearstation) "cND" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurplecorner" @@ -42928,6 +42942,10 @@ icon_state = "whitebluecorner" }, /area/station/medical/reception) +"cNX" = ( +/obj/machinery/firealarm/directional/west, +/turf/simulated/floor/wood, +/area/station/legal/courtroom) "cNY" = ( /obj/machinery/power/apc/directional/south, /obj/structure/cable{ @@ -43080,7 +43098,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/electrical) "cOz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_x = -32 }, @@ -43694,7 +43712,7 @@ }, /area/station/science/xenobiology) "cQO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -43763,7 +43781,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/south) "cRd" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitepurplecorner" @@ -43783,7 +43801,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/solar_maintenance/aft_starboard) "cRg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitepurplecorner" }, @@ -43794,7 +43812,7 @@ }, /area/station/hallway/primary/aft/north) "cRj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whitebluecorner" @@ -44416,7 +44434,7 @@ /turf/simulated/floor/plasteel/white, /area/station/science/xenobiology) "cTy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" @@ -44960,10 +44978,6 @@ /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) -"cVr" = ( -/obj/structure/sign/nosmoking_2, -/turf/simulated/wall, -/area/station/science/rnd) "cVs" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -44980,7 +44994,7 @@ }, /area/station/science/rnd) "cVu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_y = 32 }, @@ -45372,7 +45386,7 @@ }, /area/station/science/xenobiology) "cWV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" @@ -45477,7 +45491,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/starboard) "cXO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutralcorner" }, @@ -45935,7 +45949,7 @@ }, /area/station/maintenance/starboard) "cZY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitebluecorner" @@ -45962,12 +45976,12 @@ }, /area/station/maintenance/starboard) "dae" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/cobweb, /turf/simulated/floor/plating, /area/station/maintenance/abandonedbar) "daf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/maintenance/abandonedbar) "dag" = ( @@ -46209,7 +46223,7 @@ /turf/simulated/floor/plasteel/white, /area/station/science/rnd) "daM" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitepurplecorner" }, @@ -46229,7 +46243,7 @@ }, /area/station/maintenance/starboard) "daS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/starboard) "daT" = ( @@ -46375,7 +46389,7 @@ /turf/simulated/floor/grass, /area/station/medical/medbay) "dbG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/dark, /area/station/maintenance/abandonedbar) @@ -46401,7 +46415,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint) "dbJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/contraband/random{ pixel_x = 32 }, @@ -46443,7 +46457,7 @@ }, /area/station/hallway/secondary/exit) "dbV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel{ @@ -46754,7 +46768,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/maintenance/abandonedbar) "dcY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/port2) "dcZ" = ( @@ -46770,7 +46784,7 @@ /turf/simulated/floor/plasteel/white, /area/station/maintenance/port2) "ddc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 1 }, @@ -47002,7 +47016,7 @@ /turf/simulated/floor/plasteel/white, /area/station/maintenance/port2) "ddJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "purplefull" }, @@ -48578,7 +48592,7 @@ /turf/simulated/floor/plasteel/white, /area/station/maintenance/port2) "dky" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel/white, @@ -48931,7 +48945,7 @@ /area/station/engineering/controlroom) "dlV" = ( /obj/machinery/power/apc/directional/west, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -49109,7 +49123,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/abandonedbar) "dmR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 8; name = "east bump"; @@ -49995,7 +50009,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "drp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/ntrep) "drs" = ( @@ -50692,7 +50706,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port2) "duR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/random{ pixel_y = -32 }, @@ -51060,7 +51074,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/theatre) "dwW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/mapping_helpers/turfs/damage, /turf/simulated/floor/wood, /area/station/maintenance/theatre) @@ -51260,7 +51274,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/theatre) "dyl" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 8 }, @@ -51866,7 +51880,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/medical/morgue) "dCh" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 8 }, @@ -52264,11 +52278,11 @@ /turf/simulated/floor/plating, /area/station/maintenance/theatre) "dDJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/maintenance/theatre) "dDK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/south, /turf/simulated/floor/wood, /area/station/maintenance/theatre) @@ -52476,7 +52490,7 @@ dir = 4 }, /obj/machinery/alarm/directional/north, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/east, /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/south) @@ -52911,7 +52925,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/south) "dHO" = ( @@ -53166,7 +53180,7 @@ }, /area/station/hallway/secondary/exit) "dJH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) @@ -53243,7 +53257,7 @@ }, /area/station/service/chapel) "dKi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/service/chapel) "dKj" = ( @@ -53312,7 +53326,7 @@ /turf/space, /area/space/nearstation) "dKB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/mounted/frame/apc_frame, /obj/structure/cable{ icon_state = "0-2" @@ -53670,7 +53684,7 @@ /turf/simulated/floor/grass/no_creep, /area/station/hallway/secondary/exit) "dNa" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel{ icon_state = "neutralfull" @@ -53893,7 +53907,7 @@ }, /area/station/hallway/secondary/exit) "dOv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -54445,7 +54459,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "dQP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -55152,7 +55166,7 @@ }, /area/station/hallway/secondary/exit) "dTC" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/turf_decal/delivery, @@ -55256,7 +55270,7 @@ }, /area/station/service/chapel/office) "dUi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "1-2" }, @@ -55279,7 +55293,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint) "dUm" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, @@ -55550,7 +55564,7 @@ }, /area/station/engineering/solar/aft_port) "dVo" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "1-2" }, @@ -55642,7 +55656,7 @@ /turf/simulated/floor/plating, /area/station/engineering/control) "dWm" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel/white, /area/station/science/xenobiology) @@ -56147,13 +56161,13 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/port2) "dYG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/white, /area/station/maintenance/port2) "dYH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/random{ pixel_y = -32 }, @@ -56365,7 +56379,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "eas" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 4 }, @@ -56455,7 +56469,7 @@ name = "east bump"; pixel_x = 28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -56696,7 +56710,7 @@ /turf/simulated/floor/plasteel, /area/station/supply/sorting) "ejB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ name = "north bump"; pixel_y = 24 @@ -57035,6 +57049,12 @@ icon_state = "whiteblue" }, /area/station/medical/cryo) +"erJ" = ( +/obj/machinery/firealarm/directional/north, +/turf/simulated/floor/plasteel{ + icon_state = "cult" + }, +/area/station/legal/magistrate) "erP" = ( /obj/machinery/camera{ c_tag = "Secure Lab - Test Chamber"; @@ -57317,11 +57337,11 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/ne) "eyz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/engineering/control) "eyG" = ( @@ -57504,7 +57524,7 @@ /turf/simulated/floor/plasteel/white, /area/station/medical/sleeper) "eEh" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/engineering/controlroom) "eEq" = ( @@ -57738,7 +57758,7 @@ /turf/simulated/floor/engine, /area/station/science/testrange) "eLI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutralfull" }, @@ -59674,7 +59694,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/south) "fOy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery/hollow, /obj/item/radio/intercom{ name = "south bump"; @@ -60222,6 +60242,12 @@ }, /turf/simulated/floor/plating, /area/station/science/test_chamber) +"geq" = ( +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel{ + icon_state = "whitepurplecorner" + }, +/area/station/science/research) "get" = ( /obj/effect/turf_decal/stripes/white/line, /turf/simulated/floor/plasteel, @@ -64351,6 +64377,7 @@ name = "Toxins Launcher Bay Door"; protected = 0 }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/station/science/toxins/launch) "ixF" = ( @@ -64401,7 +64428,7 @@ /obj/structure/bed, /obj/item/bedsheet/orange, /obj/machinery/flasher{ - id = "Cell 1"; + id = "Cell 2"; pixel_y = 22 }, /turf/simulated/floor/plasteel{ @@ -64827,7 +64854,7 @@ }, /area/station/maintenance/starboard) "iPP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/critical/directional/east{ shock_proof = 1 }, @@ -65370,7 +65397,7 @@ }, /area/station/medical/virology) "jee" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "west bump"; pixel_x = -28 @@ -65397,7 +65424,7 @@ name = "west bump"; pixel_x = -28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/aisat) "jfB" = ( @@ -65960,7 +65987,7 @@ }, /area/station/hallway/primary/port/west) "jyW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitepurplecorner" }, @@ -66531,7 +66558,7 @@ /turf/simulated/floor/plating, /area/station/security/permabrig) "jQA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "whitegreen" @@ -67130,7 +67157,7 @@ /area/station/medical/medbay) "khC" = ( /obj/effect/turf_decal/delivery/hollow, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/engine, /area/station/engineering/controlroom) "khM" = ( @@ -67374,7 +67401,7 @@ }, /area/station/security/prisonershuttle) "koC" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 4 }, @@ -68071,7 +68098,7 @@ }, /area/station/hallway/primary/port/west) "kJg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "east bump"; pixel_x = 28 @@ -68416,7 +68443,7 @@ pixel_x = -24; req_access = list(39) }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "whitegreen" @@ -69007,7 +69034,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "llV" = ( -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ icon_state = "plant-22" }, /obj/structure/sign/nosmoking_1{ @@ -69614,8 +69641,8 @@ }, /area/station/medical/reception) "lBJ" = ( -/obj/item/kirbyplants, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -69699,7 +69726,7 @@ /area/station/security/armory/secure) "lEU" = ( /obj/machinery/flasher{ - id = "Cell 1"; + id = "Cell 3"; pixel_y = 22 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -69917,7 +69944,7 @@ /turf/simulated/floor/carpet, /area/station/legal/courtroom) "lLY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurplecorner" @@ -70753,7 +70780,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/grimey, /area/station/maintenance/theatre) "mod" = ( @@ -70940,7 +70967,7 @@ /turf/simulated/floor/plasteel, /area/station/public/fitness) "msD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "0-4" }, @@ -72050,6 +72077,13 @@ icon_state = "vault" }, /area/station/command/bridge) +"mXh" = ( +/obj/machinery/firealarm/directional/west, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "whitepurplecorner" + }, +/area/station/science/research) "mXA" = ( /turf/simulated/wall, /area/station/medical/sleeper) @@ -75727,7 +75761,7 @@ dir = 4 }, /obj/machinery/alarm/directional/west, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "barber" }, @@ -76159,7 +76193,7 @@ }, /area/station/science/toxins/mixing) "plz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/aisat) "plR" = ( @@ -76456,7 +76490,7 @@ /turf/simulated/floor/plasteel, /area/station/security/permabrig) "puH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "east bump"; pixel_x = 28 @@ -76668,7 +76702,7 @@ }, /area/station/medical/morgue) "pBe" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "neutralfull" }, @@ -76889,7 +76923,7 @@ pixel_x = 6; pixel_y = -4 }, -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ pixel_y = 7 }, /obj/structure/railing/corner{ @@ -76930,7 +76964,7 @@ /turf/simulated/floor/plating, /area/station/security/permabrig) "pHg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/mineral/titanium, /area/shuttle/arrival/station) "pHr" = ( @@ -79115,7 +79149,7 @@ /turf/simulated/floor/plating, /area/station/security/execution) "qVp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -79174,7 +79208,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/maintenance/fore2) "qWx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/north, /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) @@ -79224,7 +79258,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/engine, /area/station/engineering/controlroom) "qYf" = ( @@ -79639,7 +79673,7 @@ }, /area/station/engineering/atmos) "rgU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/west, /turf/simulated/floor/wood, /area/station/legal/courtroom) @@ -79738,7 +79772,7 @@ name = "south bump"; pixel_y = -28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -79831,7 +79865,7 @@ /turf/space, /area/space/nearstation) "rlI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plating, /area/station/maintenance/abandonedbar) "rlO" = ( @@ -80094,7 +80128,7 @@ }, /area/station/medical/reception) "rsX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/maintenance/library) "rsY" = ( @@ -80467,7 +80501,7 @@ /turf/simulated/floor/wood, /area/station/security/detective) "rCv" = ( -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ icon_state = "plant-18" }, /turf/simulated/floor/plasteel{ @@ -82193,7 +82227,7 @@ /area/station/engineering/transmission_laser) "ssh" = ( /obj/machinery/flasher{ - id = "Cell 2"; + id = "Cell 1"; pixel_y = -26 }, /obj/structure/closet/secure_closet/brig/temp/cell_1, @@ -82217,9 +82251,6 @@ icon_state = "neutralcorner" }, /area/station/hallway/primary/central/nw) -"ssx" = ( -/turf/simulated/floor/plasteel/dark, -/area/station/science/break_room) "ssy" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -82344,6 +82375,13 @@ icon_state = "whitegreen" }, /area/station/medical/virology) +"svR" = ( +/obj/machinery/firealarm/directional/north, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whitepurplecorner" + }, +/area/station/science/research) "svX" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -82378,7 +82416,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/legal/courtroom) "syt" = ( @@ -82503,10 +82541,10 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research, /obj/effect/mapping_helpers/airlock/autoname, -/obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/simulated/floor/plasteel/white, /area/station/science/robotics/chargebay) "sAB" = ( @@ -82975,7 +83013,7 @@ /area/station/medical/storage) "sMV" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/cobweb, /turf/simulated/floor/wood, /area/station/hallway/secondary/entry/east) @@ -83265,6 +83303,10 @@ /obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating, /area/station/engineering/tech_storage) +"sTy" = ( +/obj/machinery/firealarm/directional/east, +/turf/simulated/floor/plasteel/dark, +/area/station/legal/courtroom/gallery) "sUn" = ( /obj/machinery/economy/vending/cola, /turf/simulated/floor/plasteel/dark, @@ -84759,7 +84801,7 @@ }, /area/station/command/bridge) "tJc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/delivery/hollow, /obj/item/radio/intercom{ name = "north bump"; @@ -84870,6 +84912,10 @@ icon_state = "neutralfull" }, /area/station/engineering/atmos) +"tOx" = ( +/obj/machinery/firealarm/directional/west, +/turf/simulated/floor/plasteel/white, +/area/station/science/research) "tOF" = ( /obj/structure/grille, /obj/structure/lattice, @@ -84944,7 +84990,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/ai_monitored/storage/eva) "tQM" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel{ dir = 8; @@ -85726,12 +85772,12 @@ /area/station/security/permabrig) "ugy" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research, /obj/effect/mapping_helpers/airlock/autoname, -/obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/access/all/science/research, +/obj/machinery/door/airlock/research/glass, /turf/simulated/floor/plasteel/white, /area/station/science/robotics/chargebay) "ugz" = ( @@ -86123,9 +86169,9 @@ /area/station/hallway/secondary/entry/south) "urY" = ( /obj/structure/closet/crate, -/obj/item/food/breadslice, -/obj/item/food/breadslice, -/obj/item/food/breadslice, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/onion, @@ -86887,6 +86933,15 @@ /obj/structure/closet/firecloset, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) +"uND" = ( +/obj/structure/sign/nosmoking_2{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whitepurplecorner" + }, +/area/station/science/research) "uNJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -87555,7 +87610,7 @@ /obj/structure/bed, /obj/item/bedsheet/orange, /obj/machinery/flasher{ - id = "Cell 1"; + id = "Cell 4"; pixel_y = 22 }, /obj/structure/cable{ @@ -87619,7 +87674,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "vkn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "darkred" @@ -88705,9 +88760,7 @@ /area/station/medical/surgery/observation) "vPd" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research, /obj/effect/mapping_helpers/airlock/autoname, -/obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -88717,6 +88770,8 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/door/airlock/research/glass, +/obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/simulated/floor/plasteel/white, /area/station/science/robotics/chargebay) "vPo" = ( @@ -89078,7 +89133,7 @@ }, /area/station/hallway/secondary/entry/north) "vYF" = ( -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ icon_state = "plant-18" }, /turf/simulated/floor/wood, @@ -89800,7 +89855,7 @@ /turf/simulated/floor/plasteel, /area/station/command/teleporter) "wro" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitegreen" @@ -90128,7 +90183,7 @@ /turf/simulated/floor/plasteel, /area/station/science/testrange) "wyS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable, /obj/machinery/power/apc/important/directional/south, /turf/simulated/floor/plasteel{ @@ -91610,7 +91665,7 @@ /turf/simulated/floor/wood, /area/station/public/pet_store) "xoT" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "purplefull" }, @@ -92000,7 +92055,7 @@ pixel_x = -6; pixel_y = -4 }, -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ pixel_y = 7 }, /obj/structure/railing/corner{ @@ -92349,7 +92404,7 @@ }, /area/station/medical/cryo) "xIJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/requests_console/directional/west, /turf/simulated/floor/plasteel{ icon_state = "darkredfull" @@ -92962,6 +93017,13 @@ /obj/effect/spawner/random/blood/maybe, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) +"ydD" = ( +/obj/machinery/firealarm/directional/north, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whitebluecorner" + }, +/area/station/medical/medbay) "ydY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small, @@ -92971,7 +93033,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/abandonedbar) "yes" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkred" @@ -93132,7 +93194,7 @@ /area/station/security/brig) "yjA" = ( /obj/machinery/power/apc/directional/south, -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ icon_state = "plant-10" }, /obj/structure/cable, @@ -124731,7 +124793,7 @@ hdu hnH ojf lSc -cPn +mXh cRd cZt hHk @@ -126777,7 +126839,7 @@ fBk fBk fBk fBk -dau +svR yid cPn dFm @@ -128576,7 +128638,7 @@ aNa qJw vDT fBk -dau +uND yid cPn hkY @@ -128600,7 +128662,7 @@ dBe wJr oKa kxJ -ssx +ykJ ykJ hOr iqc @@ -129087,7 +129149,7 @@ tQM cSm cZt cTU -cMm +tOx cXb cZt dZb @@ -129873,7 +129935,7 @@ cSt cSt dIi dsu -cSt +geq cSt cSt dvj @@ -130371,7 +130433,7 @@ pGk xAc cSp cTQ -cVr +cTR cTR cTR cTR @@ -138313,7 +138375,7 @@ cax mRD ocx sxI -eYE +cNX ejT eYE rgU @@ -139849,7 +139911,7 @@ oMV iRk xPW caA -cax +sTy mlY qJc bsL @@ -139885,7 +139947,7 @@ cZN lQs uLc dwG -cKO +ydD hbt cSA cSA @@ -141395,7 +141457,7 @@ fjW xwN hTV hTV -bXW +erJ vjg bXW hTV diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm index aec95c77ab32..85282c0d292e 100644 --- a/_maps/map_files/stations/emeraldstation.dmm +++ b/_maps/map_files/stations/emeraldstation.dmm @@ -996,7 +996,7 @@ /obj/structure/railing/corner{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "cautioncorner" @@ -1969,7 +1969,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint2) "auh" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/random{ pixel_x = -32 }, @@ -3011,7 +3011,7 @@ }, /area/station/security/prisonlockers) "aGx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/north, /obj/structure/cable{ icon_state = "0-8" @@ -3217,7 +3217,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint2) "aIV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/maintenance/aft) @@ -3564,7 +3564,7 @@ /turf/simulated/floor/wood, /area/station/service/theatre) "aMI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whitebluecorner" }, @@ -4352,7 +4352,7 @@ /obj/structure/sign/nosmoking_2{ pixel_y = 32 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/library) "aUP" = ( @@ -5399,7 +5399,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/fpmaint) "beD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "whitegreen" @@ -7065,7 +7065,7 @@ }, /area/station/hallway/primary/starboard) "bvm" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "south bump"; pixel_y = -30 @@ -7116,7 +7116,7 @@ }, /area/station/public/dorms) "bvG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 4 }, @@ -7437,7 +7437,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/starboard) "byS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, @@ -8161,7 +8161,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/east) "bEV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/blueshield) "bEW" = ( @@ -8177,7 +8177,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/west) "bFa" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/security/permabrig) "bFc" = ( @@ -9085,7 +9085,7 @@ }, /area/station/hallway/secondary/exit) "bNT" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/random{ pixel_y = -32 }, @@ -10912,7 +10912,7 @@ }, /area/station/medical/surgery/observation) "cfy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/north, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -13561,7 +13561,7 @@ /turf/simulated/floor/carpet/grimey, /area/station/security/detective) "cIf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet/grimey, /area/station/service/chapel/funeral) "cIq" = ( @@ -14280,7 +14280,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft) "cQi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/power/apc/directional/north, /obj/structure/cable{ icon_state = "0-2" @@ -14781,7 +14781,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint) "cVs" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/south, /obj/machinery/camera{ c_tag = "Medbay Cloning"; @@ -17350,7 +17350,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/asmaint) "dwF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/north, /obj/structure/sign/poster/official/random{ pixel_x = -32 @@ -19022,7 +19022,7 @@ }, /area/station/security/lobby) "dNO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -19058,7 +19058,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/dorms/port) "dOt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/north) "dOx" = ( @@ -20057,7 +20057,7 @@ }, /area/station/security/permabrig) "ebg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkred" @@ -21687,7 +21687,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "esr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "west bump"; pixel_x = -30 @@ -21697,7 +21697,7 @@ }, /area/station/turret_protected/ai) "esx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkgreycheck" }, @@ -22746,7 +22746,7 @@ }, /area/station/medical/medbay2) "eDj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "4-8" }, @@ -23403,7 +23403,7 @@ }, /area/station/security/brig) "eJP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -23572,7 +23572,7 @@ /turf/simulated/floor/engine/xenobio, /area/station/science/xenobiology) "eLF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /obj/structure/extinguisher_cabinet{ name = "north bump"; @@ -24737,7 +24737,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "arrival" @@ -27688,7 +27688,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/electrical) "fyF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_y = 32 }, @@ -27763,7 +27763,7 @@ }, /area/station/medical/surgery/primary) "fzx" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "blackcorner" }, @@ -28677,7 +28677,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/abandoned_garden) "fIW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/random{ pixel_y = -32 }, @@ -28748,7 +28748,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 4 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "redcorner" @@ -29090,7 +29090,7 @@ /turf/simulated/floor/carpet/black, /area/station/service/chapel) "fMQ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -29212,7 +29212,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/storage) "fNG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/east, /turf/simulated/floor/plasteel, /area/station/ai_monitored/storage/eva) @@ -31408,7 +31408,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/security/fore) "gkE" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/security_unit/directional/north, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" @@ -32454,7 +32454,7 @@ icon_state = "xenobio2"; pixel_y = -32 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/structure/cable{ icon_state = "1-2" @@ -32926,7 +32926,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/security/fore) "gBN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/cmo) "gBS" = ( @@ -35352,6 +35352,16 @@ icon_state = "freezerfloor" }, /area/station/medical/cloning) +"haD" = ( +/obj/machinery/recharger/wallcharger{ + pixel_x = 30; + pixel_y = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "darkredcorners" + }, +/area/station/security/brig) "haF" = ( /obj/structure/table/wood, /obj/item/stack/tape_roll, @@ -35602,7 +35612,7 @@ }, /area/station/maintenance/apmaint) "hcU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "darkgreen" @@ -36073,7 +36083,7 @@ }, /area/station/security/permabrig) "hhW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /obj/machinery/light_switch{ dir = 4; @@ -36287,6 +36297,18 @@ pixel_x = -3; pixel_y = 5 }, +/obj/machinery/recharger/wallcharger{ + pixel_x = 30; + pixel_y = 5 + }, +/obj/machinery/recharger/wallcharger{ + pixel_x = 30; + pixel_y = -13 + }, +/obj/machinery/recharger/wallcharger{ + pixel_x = 30; + pixel_y = -4 + }, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkredcorners" @@ -36607,7 +36629,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/starboard) "hna" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Central Hallway North" }, @@ -36972,7 +36994,7 @@ /turf/simulated/floor/plating, /area/station/security/interrogation) "hqt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "whiteblue" @@ -38784,7 +38806,7 @@ /obj/item/food/grown/pumpkin{ pixel_y = 14 }, -/obj/item/food/pumpkinpieslice, +/obj/item/food/sliced/pumpkinpie, /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "hGX" = ( @@ -41246,7 +41268,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "ije" = ( -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ icon_state = "plant-10" }, /turf/simulated/floor/wood, @@ -41577,7 +41599,7 @@ }, /area/station/hallway/primary/fore/north) "imB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/south) "imE" = ( @@ -41647,7 +41669,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/break_room) "inj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/purple{ dir = 4 }, @@ -41707,7 +41729,7 @@ }, /area/station/engineering/ai_transit_tube) "inF" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "browncorner" @@ -41928,7 +41950,7 @@ /turf/simulated/floor/plasteel, /area/station/service/janitor) "iqw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -43216,7 +43238,7 @@ }, /area/station/science/xenobiology) "iDr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "yellowcorner" @@ -43870,7 +43892,7 @@ }, /area/station/science/lobby) "iJI" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 @@ -45006,7 +45028,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/starboard) "iUM" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel/dark, /area/station/legal/courtroom/gallery) "iUR" = ( @@ -46168,7 +46190,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft2) "jgh" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -48523,7 +48545,7 @@ /area/station/public/fitness) "jEW" = ( /obj/effect/turf_decal/stripes/line, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "cult" }, @@ -49777,7 +49799,7 @@ /turf/simulated/floor/plasteel, /area/station/command/bridge) "jQN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/hop) "jQP" = ( @@ -50057,7 +50079,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint) "jTf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/command/office/captain/bedroom) "jTg" = ( @@ -50112,7 +50134,7 @@ /obj/structure/railing{ dir = 5 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "darkblue" @@ -52341,7 +52363,7 @@ }, /area/station/public/sleep) "krM" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/station/maintenance/apmaint) @@ -54000,7 +54022,7 @@ }, /area/station/medical/storage) "kLi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/ai_monitored/storage/eva) "kLm" = ( @@ -54368,7 +54390,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint) "kNU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -55191,7 +55213,7 @@ /turf/simulated/floor/plasteel, /area/station/supply/storage) "kWH" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 @@ -55521,7 +55543,7 @@ }, /area/station/science/lobby) "laA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "2-8" }, @@ -58670,7 +58692,7 @@ }, /area/station/security/permabrig) "lGB" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "neutral" @@ -59957,7 +59979,7 @@ }, /area/station/security/range) "lWi" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "west bump"; pixel_x = -28 @@ -60581,7 +60603,7 @@ }, /area/station/turret_protected/aisat/interior) "mdw" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Brig Lobby East"; dir = 9 @@ -61402,7 +61424,7 @@ }, /area/station/security/range) "mmn" = ( -/obj/item/kirbyplants/dead, +/obj/item/kirbyplants/large/dead, /obj/machinery/light/small{ dir = 1 }, @@ -62063,7 +62085,7 @@ /turf/simulated/floor/plasteel, /area/station/ai_monitored/storage/eva) "msz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -62534,7 +62556,7 @@ }, /area/station/medical/cryo) "myc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkred" @@ -62582,7 +62604,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/starboard) "mzp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/public/dorms) "mzq" = ( @@ -63231,7 +63253,7 @@ /area/station/maintenance/starboard) "mGn" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/dead, +/obj/item/kirbyplants/large/dead, /obj/effect/spawner/random/cobweb/left/rare, /turf/simulated/floor/plating, /area/station/maintenance/electrical) @@ -63597,7 +63619,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint2) "mKR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/random{ pixel_y = 32 }, @@ -64529,7 +64551,7 @@ /turf/simulated/floor/engine/n20, /area/station/engineering/atmos) "mTP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "4-8" }, @@ -65151,7 +65173,7 @@ /obj/structure/railing{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "west bump"; pixel_x = -28 @@ -65332,7 +65354,7 @@ }, /area/station/supply/sorting) "nco" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay Treatment Center South-West"; @@ -65624,7 +65646,7 @@ }, /area/station/hallway/primary/central/se) "neL" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/purple, /turf/simulated/floor/plasteel{ dir = 6; @@ -66306,7 +66328,7 @@ }, /area/station/engineering/control) "nmD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -66804,7 +66826,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/abandoned_office) "nqj" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -68672,7 +68694,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/starboard) "nIR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "1-4" }, @@ -69397,7 +69419,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/starboard) "nPG" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/public/storage/office) "nPH" = ( @@ -69598,7 +69620,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/south) "nRn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" }, @@ -71539,7 +71561,7 @@ /turf/simulated/floor/wood, /area/station/maintenance/apmaint2) "okc" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = 30 }, @@ -72729,7 +72751,7 @@ c_tag = "Fore Primary Hall"; dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bluecorner" }, @@ -74738,7 +74760,7 @@ /turf/simulated/floor/grass, /area/station/public/dorms) "oQr" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 @@ -75023,7 +75045,7 @@ }, /area/station/engineering/engine) "oSZ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "arrival" @@ -76425,7 +76447,7 @@ /turf/simulated/floor/carpet, /area/station/medical/psych) "pfP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -76700,7 +76722,7 @@ /turf/simulated/floor/wood, /area/station/command/meeting_room) "phN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 1; name = "south bump"; @@ -77871,7 +77893,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/incinerator) "puS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light, /turf/simulated/floor/plasteel, /area/station/engineering/break_room) @@ -78185,7 +78207,7 @@ }, /area/station/security/lobby) "pyD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/bar) "pyL" = ( @@ -79991,7 +80013,7 @@ /turf/simulated/floor/wood, /area/station/public/fitness) "pQp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/extinguisher_cabinet{ name = "north bump"; pixel_y = 30 @@ -80423,7 +80445,7 @@ name = "west bump"; pixel_x = -28 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/legal/courtroom/gallery) "pVM" = ( @@ -80523,7 +80545,7 @@ }, /area/station/medical/reception) "pWN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/se) "pWQ" = ( @@ -80911,7 +80933,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft) "qbt" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Security Port Space Bridge"; dir = 1 @@ -82660,7 +82682,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/security/fore) "qvm" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/economy/vending/wallmed/directional/west, /turf/simulated/floor/plasteel{ dir = 9; @@ -83046,7 +83068,7 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint2) "qzu" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/south, /turf/simulated/floor/wood, /area/station/command/office/rd) @@ -85692,7 +85714,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/hardsuitstorage) "rao" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/status_display{ pixel_y = 32 }, @@ -86348,7 +86370,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/starboard/south) "rgV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -87087,7 +87109,7 @@ }, /area/station/supply/office) "rnl" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkredcorners" @@ -89524,7 +89546,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/starboard) "rLU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ pixel_y = 24; name = "north bump" @@ -90244,7 +90266,7 @@ /area/station/hallway/primary/aft) "rSk" = ( /obj/structure/window/reinforced, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/carpet, /area/station/service/bar) "rSp" = ( @@ -91666,7 +91688,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry) "sgn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/library) "sgr" = ( @@ -93519,7 +93541,7 @@ /obj/structure/railing{ dir = 5 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/hallway/secondary/exit) "szH" = ( @@ -93926,7 +93948,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/item/radio/intercom{ name = "west bump"; pixel_x = -28 @@ -94541,7 +94563,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/sw) "sJM" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 8 }, @@ -95519,7 +95541,7 @@ /turf/simulated/floor/wood, /area/station/legal/courtroom/gallery) "sUJ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 4; name = "west bump"; @@ -96005,7 +96027,7 @@ /turf/space, /area/space) "sYW" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 1; name = "south bump"; @@ -97182,7 +97204,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/apmaint2) "tkO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/ai_status_display{ pixel_x = -32; step_size = 0 @@ -98309,7 +98331,7 @@ }, /area/station/security/permabrig) "tuf" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "arrival" @@ -98402,7 +98424,7 @@ /turf/simulated/floor/plasteel, /area/station/supply/storage) "tvZ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkredcorners" @@ -99188,7 +99210,7 @@ /turf/simulated/floor/plating, /area/station/engineering/break_room/secondary) "tFg" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) "tFi" = ( @@ -101277,7 +101299,7 @@ }, /area/station/public/dorms) "uaA" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkgreycheck" }, @@ -101302,7 +101324,7 @@ pixel_x = 24; pixel_y = -5 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 4 }, @@ -102394,7 +102416,7 @@ }, /area/station/maintenance/apmaint) "umv" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/alarm/directional/east, /turf/simulated/floor/plasteel{ dir = 4; @@ -102665,7 +102687,7 @@ }, /area/station/security/brig) "upq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkredcorners" }, @@ -104174,7 +104196,7 @@ c_tag = "Central Hallway South" }, /obj/machinery/firealarm/directional/north, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "arrival" @@ -106013,7 +106035,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/dorms/starboard) "uWU" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkblue" }, @@ -108256,7 +108278,7 @@ }, /area/station/security/execution) "vuS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/sign/poster/official/religious{ pixel_x = 32 }, @@ -108387,7 +108409,7 @@ /turf/simulated/wall/r_wall, /area/station/command/office/cmo) "vwy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 5; icon_state = "whiteblue" @@ -108666,7 +108688,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft) "vzX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel/dark, /area/station/legal/courtroom/gallery) @@ -110953,7 +110975,7 @@ /obj/structure/railing/corner{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "cautioncorner" @@ -112477,7 +112499,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/driver_button{ id_tag = "chapelgun"; name = "Chapel Mass Driver"; @@ -112598,7 +112620,7 @@ }, /area/station/security/interrogation) "wmQ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -112636,7 +112658,7 @@ /turf/simulated/floor/plating, /area/station/command/bridge) "wnD" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -113876,7 +113898,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/starboard) "wBQ" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/engineering/break_room) "wBT" = ( @@ -113945,7 +113967,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft2) "wCX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -114198,7 +114220,7 @@ /turf/simulated/floor/engine, /area/station/engineering/engine) "wFV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "purplefull" }, @@ -121280,7 +121302,7 @@ /area/station/service/chapel/office) "ycZ" = ( /obj/machinery/power/apc/directional/north, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "0-2" }, @@ -121363,7 +121385,7 @@ /turf/simulated/wall/r_wall, /area/station/engineering/secure_storage) "ydY" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/camera{ c_tag = "Fore Primary Hall South"; dir = 6 @@ -121983,7 +122005,7 @@ /turf/simulated/floor/carpet/blue, /area/station/command/office/blueshield) "yjS" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/woodsiding{ dir = 5 }, @@ -173429,7 +173451,7 @@ upq jDu pXO snW -tZY +haD hjy jLZ ihH diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index 5ba6d87f6563..24a80307bf48 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -744,7 +744,7 @@ /turf/simulated/wall, /area/station/public/arcade) "ajb" = ( -/obj/item/kirbyplants/plant20, +/obj/item/kirbyplants/large/alien/alien6, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" }, @@ -885,7 +885,7 @@ }, /obj/effect/landmark/start/engineer, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "ajR" = ( /obj/machinery/alarm/directional/south, /turf/simulated/floor/plasteel, @@ -2932,7 +2932,7 @@ }, /area/station/public/fitness) "auV" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "bluefull" }, @@ -3253,7 +3253,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fpmaint) "awb" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel, /area/station/supply/office) "awe" = ( @@ -4541,7 +4541,7 @@ dir = 9 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aCe" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -4563,7 +4563,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aCg" = ( /turf/simulated/wall/r_wall, /area/station/engineering/control) @@ -4689,7 +4689,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/secure_closet/engineering_welding, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aCV" = ( /obj/structure/cable{ icon_state = "2-4" @@ -4751,7 +4751,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aDe" = ( /obj/machinery/power/grounding_rod{ anchored = 1 @@ -4814,7 +4814,7 @@ dir = 4 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aDx" = ( /obj/structure/closet/wardrobe/miner, /turf/simulated/floor/plasteel{ @@ -5020,7 +5020,7 @@ dir = 4 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aEp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5097,7 +5097,7 @@ "aEy" = ( /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aEz" = ( /obj/structure/window/reinforced{ dir = 1 @@ -5108,12 +5108,12 @@ }, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aEA" = ( /obj/effect/turf_decal/delivery, /obj/machinery/economy/vending/tool/free, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aEB" = ( /obj/structure/closet/crate, /obj/machinery/light/small{ @@ -5155,7 +5155,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aEH" = ( /obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/dirt, @@ -5392,7 +5392,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/firecloset, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aGb" = ( /obj/effect/turf_decal/delivery/hollow, /obj/item/storage/belt/utility, @@ -5403,14 +5403,14 @@ /obj/item/clothing/glasses/meson, /obj/structure/shelf/engineering, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aGc" = ( /obj/machinery/alarm/directional/west, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aGg" = ( /obj/effect/landmark/start/shaft_miner, /turf/simulated/floor/plasteel, @@ -5525,7 +5525,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aGE" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 1 @@ -5660,13 +5660,13 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aHg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aHh" = ( /obj/structure/window/reinforced{ dir = 1 @@ -5770,7 +5770,7 @@ "aHH" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/delivery/hollow, -/obj/item/kirbyplants/plant20, +/obj/item/kirbyplants/large/alien/alien6, /turf/simulated/floor/plasteel, /area/station/engineering/hardsuitstorage) "aHI" = ( @@ -5903,7 +5903,7 @@ /obj/effect/turf_decal/stripes/corner, /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aIk" = ( /obj/machinery/light{ dir = 8 @@ -6031,7 +6031,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aIB" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6041,7 +6041,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aID" = ( /obj/structure/cable{ icon_state = "2-4" @@ -6074,7 +6074,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aIH" = ( /obj/structure/cable{ icon_state = "0-8" @@ -7074,7 +7074,7 @@ /area/station/supply/qm) "aLW" = ( /obj/machinery/alarm/directional/west, -/obj/item/kirbyplants/plant25, +/obj/item/kirbyplants/large/plant7, /turf/simulated/floor/plasteel, /area/station/hallway/primary/fore/east) "aLY" = ( @@ -7362,7 +7362,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aMS" = ( /obj/structure/table, /obj/item/storage/belt/utility, @@ -7419,7 +7419,7 @@ dir = 4 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aMZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -7774,7 +7774,7 @@ pixel_x = 30 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aOk" = ( /obj/machinery/alarm/directional/west, /turf/simulated/floor/plasteel, @@ -7921,7 +7921,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aOZ" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -7997,7 +7997,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aPp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -8006,7 +8006,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aPq" = ( /obj/machinery/computer/arcade/battle, /turf/simulated/floor/carpet/arcade, @@ -8154,7 +8154,7 @@ }, /obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aPS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -8247,7 +8247,7 @@ /obj/structure/sign/kiddieplaque{ pixel_y = 32 }, -/obj/item/kirbyplants{ +/obj/item/kirbyplants/large{ pixel_y = 10 }, /obj/structure/table/wood/fancy/green, @@ -8420,7 +8420,7 @@ pixel_x = 24 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aQS" = ( /obj/machinery/power/emitter, /turf/simulated/floor/plating, @@ -8439,7 +8439,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aQW" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -8456,7 +8456,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aRa" = ( /obj/machinery/atmospherics/pipe/simple/visible/supply{ dir = 6 @@ -8499,7 +8499,7 @@ /turf/simulated/floor/plating, /area/station/supply/storage) "aRn" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" }, @@ -8804,7 +8804,7 @@ dir = 6 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aSo" = ( /turf/simulated/floor/engine, /area/station/engineering/engine/supermatter) @@ -8872,7 +8872,7 @@ /obj/item/stock_parts/cell/high, /obj/machinery/newscaster/directional/west, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aSF" = ( /obj/machinery/door_control{ id = "QMLoaddoor"; @@ -8983,7 +8983,7 @@ /area/station/legal/courtroom) "aTh" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/plant20, +/obj/item/kirbyplants/large/alien/alien6, /turf/simulated/floor/plating, /area/station/maintenance/fore) "aTi" = ( @@ -9271,7 +9271,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aUi" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge Access" @@ -9561,7 +9561,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aUT" = ( /obj/structure/table, /obj/machinery/camera{ @@ -9600,7 +9600,7 @@ /turf/simulated/floor/mineral/titanium/blue, /area/shuttle/pod_1) "aUX" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/structure/sign/botany{ pixel_x = 32 }, @@ -9646,7 +9646,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/economy/vending/engivend, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aVg" = ( /obj/structure/cable{ icon_state = "2-8" @@ -9654,7 +9654,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/economy/vending/engidrobe, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aVh" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -9663,7 +9663,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aVi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -9978,7 +9978,7 @@ name = "east bump"; pixel_x = 27 }, -/obj/item/kirbyplants/plant11, +/obj/item/kirbyplants/small/small3, /turf/simulated/floor/wood, /area/station/legal/courtroom) "aWj" = ( @@ -10008,7 +10008,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aWn" = ( /obj/structure/cable{ icon_state = "0-4" @@ -10016,9 +10016,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/power/apc/critical/directional/west, +/obj/machinery/power/apc/directional/west, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aWq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -10378,7 +10378,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aXz" = ( /obj/structure/disposalpipe/segment, /turf/simulated/wall, @@ -10513,7 +10513,7 @@ dir = 10 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aXR" = ( /obj/machinery/light{ dir = 8 @@ -10576,7 +10576,7 @@ name = "west bump"; pixel_x = -27 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "neutralcorner" @@ -10767,7 +10767,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aYS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -10777,7 +10777,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aYT" = ( /obj/structure/cable{ icon_state = "2-8" @@ -10834,7 +10834,7 @@ dir = 4 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aYX" = ( /obj/item/chair, /obj/machinery/firealarm/directional/north, @@ -10857,7 +10857,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aYZ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -10875,7 +10875,7 @@ dir = 5 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "aZe" = ( /obj/structure/sign/radiation/rad_area, /turf/simulated/wall/r_wall, @@ -11251,7 +11251,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bay" = ( /obj/machinery/hologram/holopad, /obj/structure/cable{ @@ -11264,7 +11264,7 @@ dir = 4 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "baC" = ( /obj/structure/table, /obj/item/folder/yellow{ @@ -11406,7 +11406,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "baV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -11490,7 +11490,7 @@ /area/station/turret_protected/ai_upload) "bbm" = ( /obj/machinery/alarm/directional/north, -/obj/item/kirbyplants/applebush, +/obj/item/kirbyplants/medium/medium8, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "neutral" @@ -11670,17 +11670,17 @@ }, /area/station/command/office/ce) "bbM" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /obj/structure/sign/electricshock{ pixel_x = -32 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bbO" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bbS" = ( /obj/machinery/light{ dir = 1 @@ -11860,7 +11860,7 @@ pixel_y = -24 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bcs" = ( /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel, @@ -12843,7 +12843,7 @@ }, /area/station/command/office/ce) "beP" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -12868,7 +12868,7 @@ name = "east bump"; pixel_x = 27 }, -/obj/item/kirbyplants/plant16, +/obj/item/kirbyplants/large/plant1, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 @@ -12982,7 +12982,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/south) "bfn" = ( @@ -13033,7 +13033,7 @@ dir = 5 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bfu" = ( /obj/structure/cable{ icon_state = "1-4" @@ -13070,7 +13070,7 @@ pixel_x = -27 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bfz" = ( /obj/structure/showcase{ density = 0; @@ -13581,7 +13581,7 @@ /turf/space, /area/space/nearstation) "bgV" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /obj/effect/spawner/random/cobweb/left/rare, /obj/effect/mapping_helpers/turfs/damage, /turf/simulated/floor/wood, @@ -13701,7 +13701,7 @@ pixel_y = 28 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bhp" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ @@ -14036,7 +14036,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bih" = ( /obj/machinery/power/terminal{ dir = 1 @@ -14074,7 +14074,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bil" = ( /obj/structure/cable{ icon_state = "1-2" @@ -14340,7 +14340,7 @@ /turf/simulated/floor/carpet, /area/station/procedure/trainer_office) "bja" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/effect/turf_decal/woodsiding{ dir = 5 }, @@ -14888,7 +14888,7 @@ dir = 10 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bku" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/autoname, @@ -14904,7 +14904,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bky" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -14998,7 +14998,7 @@ /obj/item/clothing/glasses/meson/engine, /obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bkU" = ( /obj/machinery/light/small{ dir = 8 @@ -15141,7 +15141,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "blu" = ( /obj/machinery/camera{ c_tag = "Medbay Main Hallway- Aft"; @@ -15494,7 +15494,7 @@ /obj/effect/turf_decal/delivery/hollow, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bmi" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/stripes/end{ @@ -17009,7 +17009,7 @@ pixel_x = -32; pixel_y = -32 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "4-8" }, @@ -17913,7 +17913,7 @@ }, /obj/machinery/economy/vending/wallmed/directional/north, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "btT" = ( /obj/item/storage/firstaid/regular{ pixel_x = 3; @@ -18969,7 +18969,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/north) "bwp" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/service/bar) "bwq" = ( @@ -19968,7 +19968,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/east) "bzA" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -20522,7 +20522,7 @@ }, /area/station/hallway/primary/port/east) "bBr" = ( -/obj/item/kirbyplants/plant20, +/obj/item/kirbyplants/large/alien/alien6, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -20852,7 +20852,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "bCk" = ( /obj/structure/table/wood, /obj/item/nullrod/fedora, @@ -22082,7 +22082,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/bridge) "bHx" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/wood, /area/station/service/library) "bHz" = ( @@ -22347,7 +22347,7 @@ /turf/simulated/floor/carpet/grimey, /area/station/telecomms/computer) "bIA" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/carpet/grimey, /area/station/telecomms/computer) "bIB" = ( @@ -25066,7 +25066,7 @@ icon_state = "map-right-MS"; pixel_y = -32 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -25723,7 +25723,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/item/kirbyplants/plant16, +/obj/item/kirbyplants/large/plant1, /obj/machinery/light{ dir = 4 }, @@ -26179,7 +26179,7 @@ /area/station/command/office/ntrep) "bXy" = ( /obj/machinery/newscaster/directional/west, -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /turf/simulated/floor/plasteel{ icon_state = "cult" }, @@ -26212,7 +26212,7 @@ /area/station/supply/office) "bXF" = ( /obj/effect/turf_decal/stripes/corner, -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /obj/machinery/door_control{ id = "mechbay"; name = "Mech Bay Shutters Control"; @@ -27489,7 +27489,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "ccB" = ( /obj/machinery/door/airlock{ name = "Maintenance Bathroom" @@ -27524,7 +27524,7 @@ /area/station/hallway/primary/central/sw) "ccH" = ( /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "ccI" = ( /obj/machinery/hologram/holopad, /obj/effect/turf_decal/delivery/blue/hollow, @@ -27873,7 +27873,7 @@ /area/station/hallway/primary/central/south) "cei" = ( /obj/machinery/firealarm/directional/east, -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /turf/simulated/floor/plasteel{ icon_state = "purplecorner" }, @@ -28118,7 +28118,7 @@ name = "west bump"; pixel_x = -27 }, -/obj/item/kirbyplants/applebush, +/obj/item/kirbyplants/medium/medium8, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "bluecorner" @@ -29160,7 +29160,7 @@ "ciW" = ( /obj/effect/landmark/start/engineer, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "cjh" = ( /obj/machinery/atmospherics/unary/thermomachine/freezer{ dir = 1 @@ -32021,7 +32021,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/south) "cvJ" = ( -/obj/item/kirbyplants/plant20, +/obj/item/kirbyplants/large/alien/alien6, /turf/simulated/floor/plasteel{ icon_state = "darkgreycheck" }, @@ -32304,7 +32304,7 @@ /area/station/science/research) "cwW" = ( /obj/machinery/firealarm/directional/west, -/obj/item/kirbyplants/plant11, +/obj/item/kirbyplants/small/small3, /obj/machinery/light{ dir = 8 }, @@ -32494,7 +32494,7 @@ }, /area/station/medical/medbay) "cxL" = ( -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "whiteblue" @@ -35668,7 +35668,7 @@ }, /area/station/medical/cloning) "cKA" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkgreencorners" @@ -37613,7 +37613,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/kirbyplants/plant24, +/obj/item/kirbyplants/large/plant14, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -37760,7 +37760,7 @@ name = "east bump"; pixel_x = 27 }, -/obj/item/kirbyplants/plant14, +/obj/item/kirbyplants/large/plant9, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -37791,7 +37791,7 @@ /turf/simulated/wall, /area/station/maintenance/solar_maintenance/aft_port) "cUq" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, @@ -40905,7 +40905,7 @@ pixel_y = 32 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "dxJ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/unary/outlet_injector/on, @@ -40952,11 +40952,11 @@ }, /area/station/medical/storage) "dzI" = ( -/obj/structure/table/reinforced, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/item/storage/firstaid/regular, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "yellow" @@ -41684,7 +41684,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "dTW" = ( /obj/machinery/atmospherics/pipe/simple/visible, /obj/machinery/atmospherics/meter{ @@ -42292,6 +42292,7 @@ c_tag = "Engineering - Desk"; dir = 1 }, +/obj/item/storage/firstaid/regular, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "yellow" @@ -42793,7 +42794,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/atmos) "etR" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel{ icon_state = "cult" }, @@ -43290,7 +43291,7 @@ /area/station/medical/exam_room) "eFH" = ( /obj/machinery/economy/vending/wallmed/directional/south, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ icon_state = "whiteblue" }, @@ -43736,7 +43737,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/emcloset, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "eSt" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -43851,7 +43852,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "eUb" = ( /obj/effect/spawner/window/reinforced/grilled, /obj/structure/cable, @@ -44317,7 +44318,7 @@ /turf/simulated/floor/plasteel, /area/station/security/brig) "fdz" = ( -/obj/item/kirbyplants/plant11, +/obj/item/kirbyplants/small/small3, /turf/simulated/floor/plasteel, /area/station/supply/office) "feu" = ( @@ -44477,7 +44478,7 @@ }, /area/station/engineering/atmos) "fhC" = ( -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "red" @@ -45919,7 +45920,7 @@ /turf/simulated/floor/plasteel, /area/station/security/brig) "fKW" = ( -/obj/item/kirbyplants/plant16, +/obj/item/kirbyplants/large/plant1, /obj/structure/cable{ icon_state = "1-2" }, @@ -45970,6 +45971,9 @@ icon_state = "browncorner" }, /area/station/hallway/primary/port/east) +"fMn" = ( +/turf/simulated/wall/r_wall, +/area/station/engineering/equipmentstorage) "fMZ" = ( /obj/machinery/atmospherics/pipe/simple/visible/purple{ dir = 4 @@ -46117,7 +46121,7 @@ }, /area/station/engineering/break_room) "fQl" = ( -/obj/item/kirbyplants/plant24, +/obj/item/kirbyplants/large/plant14, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" }, @@ -46352,7 +46356,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) "fVB" = ( @@ -46448,7 +46452,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "fWW" = ( /turf/simulated/floor/plasteel, /area/station/engineering/atmos) @@ -46598,7 +46602,7 @@ /turf/simulated/floor/wood, /area/station/public/mrchangs) "gbz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light_switch{ dir = 4; name = "custom placement"; @@ -47700,7 +47704,7 @@ }, /area/station/hallway/primary/central/ne) "gCX" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whitebluecorner" @@ -48889,7 +48893,7 @@ }, /area/station/medical/exam_room) "hcI" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/machinery/light/small{ dir = 1 }, @@ -49096,7 +49100,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "hgU" = ( /obj/machinery/power/tesla_coil{ anchored = 1 @@ -49215,7 +49219,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/item/kirbyplants/plant22, +/obj/item/kirbyplants/medium/medium6, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "brown" @@ -49615,7 +49619,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "hsg" = ( /obj/structure/table, /obj/item/cartridge/signal/toxins{ @@ -49652,7 +49656,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/starboard) "hty" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel, /area/station/maintenance/starboard2) "htP" = ( @@ -51777,7 +51781,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "iot" = ( /obj/effect/spawner/random/barrier/grille_maybe, /turf/simulated/floor/plating, @@ -52877,7 +52881,7 @@ "iOr" = ( /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "iOO" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/visible/green, @@ -53129,7 +53133,7 @@ }, /area/station/security/execution) "iTN" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light{ dir = 1 }, @@ -53562,7 +53566,7 @@ /turf/simulated/floor/plating, /area/station/security/permabrig) "jft" = ( -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /turf/simulated/floor/carpet/grimey, /area/station/hallway/secondary/entry/lounge) "jfN" = ( @@ -53621,7 +53625,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "jiR" = ( /obj/structure/closet/firecloset, /obj/effect/spawner/random/maintenance, @@ -53653,7 +53657,7 @@ "jke" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "jkg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -53800,7 +53804,7 @@ }, /area/station/procedure/trainer_office) "jnZ" = ( -/obj/item/kirbyplants/plant24, +/obj/item/kirbyplants/large/plant14, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/camera{ c_tag = "Brig Detective's Office"; @@ -55074,7 +55078,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "jPQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55891,7 +55895,7 @@ }, /area/station/science/research) "kiq" = ( -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, @@ -56256,7 +56260,7 @@ dir = 5 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "ksz" = ( /obj/machinery/light_construct/small{ dir = 4 @@ -56394,7 +56398,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "kxh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -56583,7 +56587,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /turf/simulated/floor/plasteel, /area/station/supply/storage) "kCc" = ( @@ -57167,6 +57171,9 @@ /obj/effect/spawner/random/maintenance, /turf/simulated/floor/plating, /area/station/maintenance/port) +"kOn" = ( +/turf/simulated/wall, +/area/station/engineering/engine_foyer) "kOw" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -57833,7 +57840,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants/applebush, +/obj/item/kirbyplants/medium/medium8, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -58275,7 +58282,7 @@ dir = 1 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "llW" = ( /obj/machinery/requests_console/directional/west, /turf/simulated/floor/plasteel{ @@ -58437,7 +58444,7 @@ }, /area/station/medical/medbay) "loz" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /obj/machinery/light/small{ dir = 8 }, @@ -58467,7 +58474,7 @@ pixel_x = -4; pixel_y = 8 }, -/obj/item/food/carrotcakeslice{ +/obj/item/food/sliced/carrot_cake{ pixel_x = 8; pixel_y = -2 }, @@ -58972,7 +58979,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/economy/vending/assist/free, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "lCc" = ( /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel{ @@ -60426,7 +60433,7 @@ }, /area/station/command/office/cmo) "mhA" = ( -/obj/item/kirbyplants/plant18, +/obj/item/kirbyplants/large/plant8, /obj/machinery/light/small{ dir = 4 }, @@ -63589,7 +63596,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "nzP" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ @@ -67238,7 +67245,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/item/kirbyplants/plant21, +/obj/item/kirbyplants/large/plant4, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -69874,9 +69881,9 @@ "qvp" = ( /obj/structure/closet/crate, /obj/effect/decal/cleanable/dirt, -/obj/item/food/breadslice, -/obj/item/food/breadslice, -/obj/item/food/breadslice, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, +/obj/item/food/sliced/bread, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/onion, @@ -70333,7 +70340,7 @@ /turf/simulated/floor/wood, /area/station/service/bar) "qFz" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/wood, /area/station/maintenance/apmaint) "qFI" = ( @@ -71509,7 +71516,7 @@ dir = 10 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "riN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -71869,6 +71876,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/power/apc/critical/directional/south, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/simulated/floor/engine, /area/station/engineering/control) "rqW" = ( @@ -72693,7 +72704,7 @@ /obj/item/geiger_counter, /obj/item/clothing/glasses/meson, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "rHl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -72970,7 +72981,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "rNy" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 @@ -73072,7 +73083,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/secure_closet/engineering_electrical, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "rOD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -73451,7 +73462,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore) "rWy" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/structure/cable{ icon_state = "2-4" }, @@ -75923,7 +75934,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "tdA" = ( /obj/machinery/atmospherics/portable/canister/sleeping_agent, /obj/machinery/atmospherics/pipe/simple/hidden/purple{ @@ -76083,7 +76094,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "thC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -76291,7 +76302,7 @@ /obj/effect/turf_decal/woodsiding{ dir = 1 }, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = -31 }, @@ -76317,7 +76328,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/requests_console/directional/south, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "tmZ" = ( /obj/machinery/door_timer/cell_2{ pixel_x = 32 @@ -76805,7 +76816,7 @@ }, /area/station/hallway/primary/central/north) "tyW" = ( -/obj/item/kirbyplants/applebush, +/obj/item/kirbyplants/medium/medium8, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -76961,7 +76972,7 @@ /area/station/engineering/break_room) "tDc" = ( /obj/machinery/firealarm/directional/south, -/obj/item/kirbyplants/plant30, +/obj/item/kirbyplants/large/plant3, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "red" @@ -77204,7 +77215,7 @@ }, /area/station/security/armory) "tKL" = ( -/obj/item/kirbyplants/plant24, +/obj/item/kirbyplants/large/plant14, /obj/machinery/light_switch{ dir = 4; name = "custom placement"; @@ -78670,7 +78681,7 @@ layer = 4; pixel_y = 32 }, -/obj/item/kirbyplants/plant24, +/obj/item/kirbyplants/large/plant14, /turf/simulated/floor/plasteel{ icon_state = "whitepurplecorner" }, @@ -78743,7 +78754,7 @@ "uyC" = ( /obj/effect/turf_decal/stripes/corner, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "uyN" = ( /obj/machinery/atmospherics/pipe/manifold4w/visible, /turf/simulated/floor/plasteel, @@ -78838,7 +78849,7 @@ }, /area/station/service/hydroponics) "uBK" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/light/small{ dir = 4 }, @@ -80401,7 +80412,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "vkL" = ( /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plating, @@ -81437,7 +81448,7 @@ }, /area/station/security/brig) "vMO" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, @@ -81623,7 +81634,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/secure_closet/engineering_personal, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "vSm" = ( /obj/structure/cable{ icon_state = "4-8" @@ -82599,7 +82610,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/atmos) "wsf" = ( -/obj/item/kirbyplants/plant10, +/obj/item/kirbyplants/large/plant12, /obj/structure/window/reinforced{ dir = 8 }, @@ -85298,7 +85309,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel, -/area/station/engineering/control) +/area/station/engineering/engine_foyer) "xCP" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/item/radio/intercom{ @@ -86283,7 +86294,7 @@ }, /area/station/medical/storage) "yah" = ( -/obj/item/kirbyplants/plant11, +/obj/item/kirbyplants/small/small3, /obj/machinery/alarm/directional/south, /obj/machinery/requests_console/directional/west, /turf/simulated/floor/wood, @@ -86496,7 +86507,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fore) "yeR" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /obj/machinery/newscaster/directional/north, /turf/simulated/floor/plasteel{ dir = 9; @@ -126924,12 +126935,12 @@ izY aJR izY bIf -aFR +kOn aPK aHc riM aSC -aFR +kOn aVf nzO aXy @@ -127191,7 +127202,7 @@ aIA aWm ccH tmI -aFR +kOn bam bam bam @@ -127449,12 +127460,12 @@ aYS ccH xCJ bbO -aFR +kOn bfy big bkt bkT -aFR +kOn knq xsF dVL @@ -127963,12 +127974,12 @@ aYW vkG aSn bcq -aFR +kOn bho bfs aSn bkT -aFR +kOn bmu ezm psV @@ -128220,7 +128231,7 @@ aZe aHi aHi aCg -aCg +fMn qpO tMS tMS diff --git a/_maps/map_files/stations/submaps/cerestation.dmm b/_maps/map_files/stations/submaps/cerestation.dmm index c2646c1413ff..5d91012a8a31 100644 --- a/_maps/map_files/stations/submaps/cerestation.dmm +++ b/_maps/map_files/stations/submaps/cerestation.dmm @@ -185,7 +185,7 @@ }, /area/station/hallway/spacebridge/scidock) "vM" = ( -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm index ee94a4669302..523447e8a9dc 100644 --- a/_maps/map_files/templates/shelter_2.dmm +++ b/_maps/map_files/templates/shelter_2.dmm @@ -112,7 +112,7 @@ /area/survivalpod) "u" = ( /obj/structure/tubes, -/obj/item/kirbyplants, +/obj/item/kirbyplants/large, /turf/simulated/floor/pod, /area/survivalpod) "v" = ( diff --git a/_maps/map_files/tests/test_attack_chain_machinery.dmm b/_maps/map_files/tests/test_attack_chain_machinery.dmm new file mode 100644 index 000000000000..24a783649a86 --- /dev/null +++ b/_maps/map_files/tests/test_attack_chain_machinery.dmm @@ -0,0 +1,617 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aE" = ( +/obj/machinery/doppler_array, +/turf/simulated/floor/plasteel, +/area/game_test) +"aZ" = ( +/obj/machinery/chem_heater, +/turf/simulated/floor/plasteel, +/area/game_test) +"cT" = ( +/obj/machinery/biogenerator, +/turf/simulated/floor/plasteel, +/area/game_test) +"dW" = ( +/obj/machinery/fishtank, +/turf/simulated/floor/plasteel, +/area/game_test) +"fc" = ( +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel, +/area/game_test) +"fj" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/floor/plasteel, +/area/game_test) +"fU" = ( +/obj/machinery/economy/vending/wallmed/directional/north, +/turf/simulated/floor/plasteel, +/area/game_test) +"gG" = ( +/turf/simulated/floor/mech_bay_recharge_floor, +/area/game_test) +"ht" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/blue{ + dir = 5 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"hL" = ( +/obj/machinery/bookbinder, +/turf/simulated/floor/plasteel, +/area/game_test) +"hU" = ( +/obj/machinery/economy/vending/atmosdrobe, +/turf/simulated/floor/plasteel, +/area/game_test) +"ic" = ( +/obj/machinery/door/airlock/external, +/turf/simulated/floor/plasteel, +/area/game_test) +"iC" = ( +/obj/machinery/bottler, +/turf/simulated/floor/plasteel, +/area/game_test) +"ja" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/turf/simulated/floor/plasteel, +/area/game_test) +"jW" = ( +/obj/machinery/optable, +/turf/simulated/floor/plasteel, +/area/game_test) +"kV" = ( +/obj/machinery/computer/emergency_shuttle, +/turf/simulated/floor/plasteel, +/area/game_test) +"lr" = ( +/obj/machinery/computer/aiupload, +/turf/simulated/floor/plasteel, +/area/game_test) +"lM" = ( +/obj/machinery/computer/guestpass{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"lO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/blue{ + dir = 6 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"mz" = ( +/obj/machinery/computer/med_data/laptop, +/obj/structure/table, +/turf/simulated/floor/plasteel, +/area/game_test) +"nt" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/blue{ + dir = 10 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"oh" = ( +/obj/machinery/atmospherics/unary/tank/oxygen, +/turf/simulated/floor/plasteel, +/area/game_test) +"px" = ( +/obj/machinery/atmospherics/portable/scrubber, +/turf/simulated/floor/plasteel, +/area/game_test) +"qc" = ( +/turf/simulated/floor/plasteel, +/area/game_test) +"qN" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"sj" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"so" = ( +/obj/machinery/dna_scannernew, +/turf/simulated/floor/plasteel, +/area/game_test) +"tn" = ( +/obj/machinery/computer/security/telescreen/rd{ + pixel_y = 32 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"to" = ( +/obj/machinery/door/airlock, +/turf/simulated/floor/plasteel, +/area/game_test) +"tL" = ( +/obj/machinery/economy/slot_machine, +/turf/simulated/floor/plasteel, +/area/game_test) +"ud" = ( +/obj/machinery/abductor/gland_dispenser, +/turf/simulated/floor/plasteel, +/area/game_test) +"vi" = ( +/obj/effect/landmark/game_test/top_right_corner, +/turf/simulated/floor/plasteel, +/area/game_test) +"vL" = ( +/obj/effect/landmark{ + icon = 'icons/effects/spawner_icons.dmi'; + icon_state = "spooky"; + name = "Observer-Start" + }, +/obj/effect/landmark/spawner/late/crew, +/obj/effect/landmark/game_test/bottom_left_corner, +/turf/simulated/floor/plasteel, +/area/game_test) +"ws" = ( +/obj/machinery/computer/library, +/turf/simulated/floor/plasteel, +/area/game_test) +"ye" = ( +/obj/machinery/computer/card, +/turf/simulated/floor/plasteel, +/area/game_test) +"zA" = ( +/obj/machinery/computer/communications, +/turf/simulated/floor/plasteel, +/area/game_test) +"Au" = ( +/turf/simulated/wall/r_wall, +/area/game_test) +"AM" = ( +/obj/machinery/conveyor_switch, +/turf/simulated/floor/plasteel, +/area/game_test) +"Bi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/blue{ + dir = 9 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"Bn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/blue{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"Bo" = ( +/obj/machinery/r_n_d/circuit_imprinter, +/turf/simulated/floor/plasteel, +/area/game_test) +"CH" = ( +/obj/machinery/clonepod, +/turf/simulated/floor/plasteel, +/area/game_test) +"EK" = ( +/obj/machinery/mech_bay_recharge_port, +/turf/simulated/floor/plasteel, +/area/game_test) +"Fl" = ( +/obj/machinery/compost_bin, +/turf/simulated/floor/plasteel, +/area/game_test) +"Ge" = ( +/obj/machinery/mecha_part_fabricator, +/turf/simulated/floor/plasteel, +/area/game_test) +"KW" = ( +/obj/machinery/nuclearbomb/undeployed, +/turf/simulated/floor/plasteel, +/area/game_test) +"KY" = ( +/obj/machinery/computer/mech_bay_power_console, +/turf/simulated/floor/plasteel, +/area/game_test) +"Lb" = ( +/obj/machinery/atmospherics/portable/pump, +/turf/simulated/floor/plasteel, +/area/game_test) +"LT" = ( +/obj/machinery/computer/cloning, +/turf/simulated/floor/plasteel, +/area/game_test) +"Mh" = ( +/obj/machinery/economy/atm/directional/north, +/turf/simulated/floor/plasteel, +/area/game_test) +"Mr" = ( +/obj/machinery/floodlight, +/turf/simulated/floor/plasteel, +/area/game_test) +"Ng" = ( +/obj/machinery/abductor/console, +/turf/simulated/floor/plasteel, +/area/game_test) +"NE" = ( +/obj/machinery/alarm/directional/north, +/turf/simulated/floor/plasteel, +/area/game_test) +"OG" = ( +/obj/machinery/cryopod/robot, +/turf/simulated/floor/plasteel, +/area/game_test) +"Qx" = ( +/obj/machinery/computer/arcade, +/turf/simulated/floor/plasteel, +/area/game_test) +"RD" = ( +/obj/machinery/r_n_d/protolathe, +/turf/simulated/floor/plasteel, +/area/game_test) +"RO" = ( +/obj/machinery/computer/operating, +/turf/simulated/floor/plasteel, +/area/game_test) +"RP" = ( +/obj/machinery/autolathe, +/turf/simulated/floor/plasteel, +/area/game_test) +"SZ" = ( +/obj/machinery/button/windowtint, +/turf/simulated/wall/r_wall, +/area/game_test) +"TH" = ( +/obj/machinery/computer/scan_consolenew, +/turf/simulated/floor/plasteel, +/area/game_test) +"Ua" = ( +/obj/machinery/conveyor{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"Uk" = ( +/obj/machinery/clonescanner, +/turf/simulated/floor/plasteel, +/area/game_test) +"VL" = ( +/obj/machinery/chem_master, +/turf/simulated/floor/plasteel, +/area/game_test) +"WF" = ( +/obj/machinery/camera, +/turf/simulated/floor/plasteel, +/area/game_test) +"Xs" = ( +/obj/machinery/bodyscanner{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/game_test) +"YO" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/blue, +/turf/simulated/floor/plasteel, +/area/game_test) +"Zk" = ( +/obj/machinery/door/firedoor/closed, +/turf/simulated/floor/plasteel, +/area/game_test) + +(1,1,1) = {" +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +"} +(2,1,1) = {" +Au +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +Au +"} +(3,1,1) = {" +Au +qc +qc +qc +oh +qc +SZ +qc +hL +qc +AM +qc +Qx +qc +dW +vL +qc +Au +"} +(4,1,1) = {" +Au +qc +qc +qc +iC +qc +Au +NE +ws +qc +Ua +qc +Fl +qc +Mr +qc +qc +Au +"} +(5,1,1) = {" +Au +qc +qc +mz +qc +qc +Au +tn +fj +qc +Ua +qc +aE +qc +tL +qc +qc +Au +"} +(6,1,1) = {" +Au +qc +qc +ja +qc +qc +Au +Mh +aZ +qc +lr +qc +hU +qc +qN +qc +qc +Au +"} +(7,1,1) = {" +Au +qc +qc +qc +qc +qc +Au +fU +CH +qc +to +qc +Zk +qc +Xs +qc +qc +Au +"} +(8,1,1) = {" +Au +qc +qc +qc +qc +qc +Au +lM +VL +qc +ic +qc +fc +qc +qc +qc +qc +Au +"} +(9,1,1) = {" +Au +qc +qc +qc +qc +qc +Au +qc +RO +qc +RD +qc +OG +qc +sj +qc +qc +Au +"} +(10,1,1) = {" +Au +qc +lO +YO +ht +qc +Au +WF +jW +qc +px +qc +Ge +qc +Ng +qc +qc +Au +"} +(11,1,1) = {" +Au +qc +Bn +qc +Bn +qc +cT +qc +Uk +qc +Lb +qc +KW +qc +ud +qc +qc +Au +"} +(12,1,1) = {" +Au +qc +nt +YO +Bi +qc +qc +qc +LT +qc +so +qc +EK +qc +ye +qc +qc +Au +"} +(13,1,1) = {" +Au +qc +qc +qc +qc +qc +qc +qc +RP +qc +TH +qc +gG +qc +zA +qc +qc +Au +"} +(14,1,1) = {" +Au +qc +vi +qc +qc +qc +qc +qc +Bo +qc +qc +qc +KY +qc +kV +qc +qc +Au +"} +(15,1,1) = {" +Au +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +qc +Au +"} +(16,1,1) = {" +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +Au +"} diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 05d92a11ee1f..641fcc941d38 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -95,3 +95,12 @@ }\ /datum/controller/subsystem/timer/##X/fire() {..() /*just so it shows up on the profiler*/} \ /datum/controller/subsystem/timer/##X + +#define MOVEMENT_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/movement/##X);\ +/datum/controller/subsystem/movement/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ + ss_id="movement_[#X]";\ +}\ +/datum/controller/subsystem/movement/##X/fire() {..() /*just so it shows up on the profiler*/} \ +/datum/controller/subsystem/movement/##X diff --git a/code/__DEFINES/color_defines.dm b/code/__DEFINES/color_defines.dm index 0e24a46e279b..558dd7d88c9e 100644 --- a/code/__DEFINES/color_defines.dm +++ b/code/__DEFINES/color_defines.dm @@ -111,6 +111,7 @@ #define COLOR_BLOOD_BASE "#A10808" #define COLOR_BLOOD_MACHINE "#1F181F" +#define COLOR_BLOOD_XENO "#05EE05" // Pipe colours #define PIPE_COLOR_GREY "#ffffff" //yes white is grey diff --git a/code/__DEFINES/dcs/datum_signals.dm b/code/__DEFINES/dcs/datum_signals.dm index 19682ccd80d9..fa475cfd2a2a 100644 --- a/code/__DEFINES/dcs/datum_signals.dm +++ b/code/__DEFINES/dcs/datum_signals.dm @@ -129,3 +129,8 @@ /// /datum/component/label /// Called when a handlabeler is used on an item when off #define COMSIG_LABEL_REMOVE "label_remove" + +// /datum/ruleset + +/// from base of /datum/ruleset/proc/can_apply() +#define COMSIG_RULESET_FAILED_SPECIES "failed_species" diff --git a/code/__DEFINES/dcs/mob_signals.dm b/code/__DEFINES/dcs/mob_signals.dm index e9b71bdc58b7..bcbdc4fbf73c 100644 --- a/code/__DEFINES/dcs/mob_signals.dm +++ b/code/__DEFINES/dcs/mob_signals.dm @@ -218,3 +218,12 @@ /// from remove_ventcrawler(): (mob/living/crawler) #define COMSIG_LIVING_EXIT_VENTCRAWL "living_exit_ventcrawl" + +/// From base of /client/Move(): (new_loc, direction) +#define COMSIG_MOB_CLIENT_PRE_MOVE "mob_client_pre_move" + /// Should always match COMPONENT_MOVABLE_BLOCK_PRE_MOVE as these are interchangeable and used to block movement. + #define COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE + /// The argument of move_args which corresponds to the loc we're moving to + #define MOVE_ARG_NEW_LOC 1 + /// The arugment of move_args which dictates our movement direction + #define MOVE_ARG_DIRECTION 2 diff --git a/code/__DEFINES/dcs/movable_signals.dm b/code/__DEFINES/dcs/movable_signals.dm index 7aa2beca9330..55df1faf213d 100644 --- a/code/__DEFINES/dcs/movable_signals.dm +++ b/code/__DEFINES/dcs/movable_signals.dm @@ -70,3 +70,19 @@ /// Called when blocking a teleport #define COMSIG_ATOM_INTERCEPT_TELEPORTED "intercept_teleported" #define COMPONENT_BLOCK_TELEPORT (1<<0) +///from base of atom/movable/newtonian_move(): (inertia_direction, start_delay) +#define COMSIG_MOVABLE_NEWTONIAN_MOVE "movable_newtonian_move" + #define COMPONENT_MOVABLE_NEWTONIAN_BLOCK (1<<0) + +///from datum/component/drift/apply_initial_visuals(): () +#define COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT "movable_drift_visual_attempt" + #define DRIFT_VISUAL_FAILED (1<<0) +///from datum/component/drift/allow_final_movement(): () +#define COMSIG_MOVABLE_DRIFT_BLOCK_INPUT "movable_drift_block_input" + #define DRIFT_ALLOW_INPUT (1<<0) + +///called after the movable's glide size is updated: (old_glide_size) +#define COMSIG_MOVABLE_UPDATED_GLIDE_SIZE "movable_glide_size" + +///signal sent out by an atom when it is no longer pulling something : (atom/pulling) +#define COMSIG_ATOM_NO_LONGER_PULLING "movable_no_longer_pulling" diff --git a/code/__DEFINES/dcs/moveloop_signals.dm b/code/__DEFINES/dcs/moveloop_signals.dm new file mode 100644 index 000000000000..c93d93251836 --- /dev/null +++ b/code/__DEFINES/dcs/moveloop_signals.dm @@ -0,0 +1,15 @@ +///from [/datum/move_loop/start_loop] (): +#define COMSIG_MOVELOOP_START "moveloop_start" +///from [/datum/move_loop/stop_loop] (): +#define COMSIG_MOVELOOP_STOP "moveloop_stop" +///from [/datum/move_loop/process] (): +#define COMSIG_MOVELOOP_PREPROCESS_CHECK "moveloop_preprocess_check" + #define MOVELOOP_SKIP_STEP (1<<0) +///from [/datum/move_loop/process] (succeeded, visual_delay): +#define COMSIG_MOVELOOP_POSTPROCESS "moveloop_postprocess" +//from [/datum/move_loop/has_target/jps/recalculate_path] (): +#define COMSIG_MOVELOOP_JPS_REPATH "moveloop_jps_repath" +///From base of /datum/move_loop/process() after attempting to move a movable: (datum/move_loop/loop, old_dir) +#define COMSIG_MOVABLE_MOVED_FROM_LOOP "movable_moved_from_loop" +///from [/datum/move_loop/has_target/jps/on_finish_pathing] +#define COMSIG_MOVELOOP_JPS_FINISHED_PATHING "moveloop_jps_finished_pathing" diff --git a/code/__DEFINES/dcs/obj_signals.dm b/code/__DEFINES/dcs/obj_signals.dm index 936667d709ff..4b138f7146a3 100644 --- a/code/__DEFINES/dcs/obj_signals.dm +++ b/code/__DEFINES/dcs/obj_signals.dm @@ -22,6 +22,14 @@ #define COMSIG_GLOB_CURSED_SLOT_MACHINE_WON "cursed_slot_machine_won" +// /obj/item/tank/jetpack + +/// from /obj/item/tank/jetpack/proc/turn_on() : () +#define COMSIG_JETPACK_ACTIVATED "jetpack_activated" + #define JETPACK_ACTIVATION_FAILED (1<<0) +/// from /obj/item/tank/jetpack/proc/turn_off() : () +#define COMSIG_JETPACK_DEACTIVATED "jetpack_deactivated" + // other subtypes /// from /datum/component/shelved/UnregisterFromParent(): (parent_uid) diff --git a/code/__DEFINES/directions.dm b/code/__DEFINES/directions.dm index b78423b7bcc2..702a6b9008bc 100644 --- a/code/__DEFINES/directions.dm +++ b/code/__DEFINES/directions.dm @@ -29,9 +29,25 @@ /// returns TRUE if direction is cardinal and false if not #define IS_DIR_CARDINAL(dir) (!IS_DIR_DIAGONAL(dir)) +///True if the dir is north or south, false therwise +#define NSCOMPONENT(d) (d&(NORTH|SOUTH)) +///True if the dir is east/west, false otherwise +#define EWCOMPONENT(d) (d&(EAST|WEST)) + /// Inverse direction, taking into account UP|DOWN if necessary. #define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) /// returns TRUE if the direction is EAST or WEST #define DIR_JUST_HORIZONTAL(dir) ((dir == EAST) || (dir == WEST)) /// returns TRUE if the direction is NORTH or SOUTH #define DIR_JUST_VERTICAL(dir) ((dir == NORTH) || (dir == SOUTH)) + +/// North direction as a string "[1]" +#define TEXT_NORTH "[NORTH]" +/// South direction as a string "[2]" +#define TEXT_SOUTH "[SOUTH]" +/// East direction as a string "[4]" +#define TEXT_EAST "[EAST]" +/// West direction as a string "[8]" +#define TEXT_WEST "[WEST]" + +#define EXCLUSIVE_OR(thing_one, thing_two) ((thing_one)^(thing_two)) diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index 2c9ef8563d63..76332f7fb738 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -71,3 +71,14 @@ #define NUKE_SITE_OFF_STATION_ZLEVEL 2 /// The bomb's location cannot be found. #define NUKE_SITE_INVALID 3 + +/** + * Dynamic Gamemode Defines + */ +#define DYNAMIC_RULESET_NORMAL "Normal" +#define DYNAMIC_RULESET_FORCED "Forced" +#define DYNAMIC_RULESET_BANNED "Banned" + +#define RULESET_FAILURE_BUDGET "Not enough budget" +#define RULESET_FAILURE_NO_PLAYERS "No drafted players" +#define RULESET_FAILURE_CHANGELING_SECONDARY_RULESET "Needs a secondary ruleset in rotation" diff --git a/code/__DEFINES/icon_smoothing_defines.dm b/code/__DEFINES/icon_smoothing_defines.dm index 3f916b25c61b..961c11e3fcba 100644 --- a/code/__DEFINES/icon_smoothing_defines.dm +++ b/code/__DEFINES/icon_smoothing_defines.dm @@ -102,6 +102,7 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_REGULAR_WALLS S_OBJ(17) ///turf/simulated/wall, /obj/structure/falsewall #define SMOOTH_GROUP_REINFORCED_WALLS S_OBJ(18) ///turf/simulated/wall/r_wall, /obj/structure/falsewall/reinforced #define SMOOTH_GROUP_CULT_WALLS S_OBJ(19) ///turf/simulated/wall/cult +#define SMOOTH_GROUP_BACKROOMS_WALLS S_OBJ(20) ///turf/simulated/wall/backrooms, /obj/structure/falsewall/backrooms #define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///turf/simulated/indestructible/fakeglass, /obj/structure/window/full/basic, /obj/structure/window/full/plasmabasic, /obj/structure/window/full/plasmareinforced, /obj/structure/window/full/reinforced #define SMOOTH_GROUP_WINDOW_FULLTILE_BRASS S_OBJ(22) ///obj/structure/window/brass/fulltile diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index e524369c4455..2e889278c1ea 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -62,6 +62,8 @@ #define isclothing(A) (istype(A, /obj/item/clothing)) +#define ismask(A) (istype(A, /obj/item/clothing/mask)) + #define isprojectile(A) (istype(A, /obj/item/projectile)) #define isgun(A) (istype(A, /obj/item/gun)) @@ -138,6 +140,7 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define ispill(A) istype(A, /obj/item/reagent_containers/pill) #define ispatch(A) istype(A, /obj/item/reagent_containers/patch) #define isfood(A) istype(A, /obj/item/food) +#define is_color_text(thing) (istext(thing) && GLOB.regex_rgb_text.Find(thing)) // Modsuits #define ismodcontrol(A) istype(A, /obj/item/mod/control) diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm index 60ec94d3dbf8..17d241fed8bf 100644 --- a/code/__DEFINES/misc_defines.dm +++ b/code/__DEFINES/misc_defines.dm @@ -732,3 +732,7 @@ do { \ #define LAVALAND_TENDRIL_COLLAPSE_RANGE 2 //! The radius of the chasm created by killed tendrils. #define ALPHA_VISIBLE 255 // the max alpha + +/// Economy account defines +#define BANK_PIN_MIN 10000 +#define BANK_PIN_MAX 99999 diff --git a/code/__DEFINES/mob_defines.dm b/code/__DEFINES/mob_defines.dm index d3eb93078ea4..81d6c5d61221 100644 --- a/code/__DEFINES/mob_defines.dm +++ b/code/__DEFINES/mob_defines.dm @@ -276,9 +276,6 @@ #define is_ai_eye(A) (istype((A), /mob/camera/eye)) #define isovermind(A) (istype((A), /mob/camera/blob)) -#define isSpirit(A) (istype((A), /mob/spirit)) -#define ismask(A) (istype((A), /mob/spirit/mask)) - #define isobserver(A) (istype((A), /mob/dead/observer)) #define isnewplayer(A) (istype((A), /mob/new_player)) @@ -383,3 +380,7 @@ #define BRAIN_DAMAGE_RATIO_MODERATE 6 / 12 #define BRAIN_DAMAGE_RATIO_SEVERE 8 / 12 #define BRAIN_DAMAGE_RATIO_CRITICAL 10 / 12 + +#define GRAB_PIXEL_SHIFT_PASSIVE 6 +#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 +#define GRAB_PIXEL_SHIFT_NECK 16 diff --git a/code/__DEFINES/movement_defines.dm b/code/__DEFINES/movement_defines.dm new file mode 100644 index 000000000000..cb76916dc0e8 --- /dev/null +++ b/code/__DEFINES/movement_defines.dm @@ -0,0 +1,71 @@ +/// The minimum for glide_size to be clamped to. +#define MIN_GLIDE_SIZE 1 +/// The maximum for glide_size to be clamped to. +/// This shouldn't be higher than the icon size, and generally you shouldn't be changing this, but it's here just in case. +#define MAX_GLIDE_SIZE 32 + +//Movement loop priority. Only one loop can run at a time, this dictates that +// Higher numbers beat lower numbers +///Standard, go lower then this if you want to override, higher otherwise +#define MOVEMENT_DEFAULT_PRIORITY 10 +///Very few things should override this +#define MOVEMENT_SPACE_PRIORITY 100 +///Higher then the heavens +#define MOVEMENT_ABOVE_SPACE_PRIORITY (MOVEMENT_SPACE_PRIORITY + 1) + +//Movement loop flags +///Should the loop act immediately following its addition? +#define MOVEMENT_LOOP_START_FAST (1<<0) +///Do we not use the priority system? +#define MOVEMENT_LOOP_IGNORE_PRIORITY (1<<1) +///Should we override the loop's glide? +#define MOVEMENT_LOOP_IGNORE_GLIDE (1<<2) +///Should we not update our movables dir on move? +#define MOVEMENT_LOOP_NO_DIR_UPDATE (1<<3) +///Is the loop moving the movable outside its control, like it's an external force? e.g. footsteps won't play if enabled. +#define MOVEMENT_LOOP_OUTSIDE_CONTROL (1<<4) + +// Movement loop status flags +/// Has the loop been paused, soon to be resumed? +#define MOVELOOP_STATUS_PAUSED (1<<0) +/// Is the loop running? (Is true even when paused) +#define MOVELOOP_STATUS_RUNNING (1<<1) +/// Is the loop queued in a subsystem? +#define MOVELOOP_STATUS_QUEUED (1<<2) + +/** + * Returns a bitfield containing flags both present in `flags` arg and the `processing_move_loop_flags` move_packet variable. + * Has no use outside of procs called within the movement proc chain. + */ +#define CHECK_MOVE_LOOP_FLAGS(movable, flags) (movable.move_packet ? (movable.move_packet.processing_move_loop_flags & (flags)) : NONE) + +//Index defines for movement bucket data packets +#define MOVEMENT_BUCKET_TIME 1 +#define MOVEMENT_BUCKET_LIST 2 + +///Return values for moveloop Move() +#define MOVELOOP_FAILURE 0 +#define MOVELOOP_SUCCESS 1 +#define MOVELOOP_NOT_READY 2 + +#define ACTIVE_MOVEMENT_OLDLOC 1 +#define ACTIVE_MOVEMENT_DIRECTION 2 +#define ACTIVE_MOVEMENT_FORCED 3 +#define ACTIVE_MOVEMENT_OLDLOCS 4 + +/// The arguments of this macro correspond directly to the argument order of /atom/movable/proc/Moved +#define SET_ACTIVE_MOVEMENT(_old_loc, _direction, _forced, _oldlocs) \ + active_movement = list( \ + _old_loc, \ + _direction, \ + _forced, \ + _oldlocs, \ + ) + +/// Finish any active movements +#define RESOLVE_ACTIVE_MOVEMENT \ + if(active_movement) { \ + var/__move_args = active_movement; \ + active_movement = null; \ + Moved(arglist(__move_args)); \ + } diff --git a/code/__DEFINES/movement_info.dm b/code/__DEFINES/movement_info.dm deleted file mode 100644 index 95c90f7a1fba..000000000000 --- a/code/__DEFINES/movement_info.dm +++ /dev/null @@ -1,16 +0,0 @@ -/// The arguments of this macro correspond directly to the argument order of /atom/movable/proc/Moved -#define SET_ACTIVE_MOVEMENT(_old_loc, _direction, _forced, _oldlocs) \ - active_movement = list( \ - _old_loc, \ - _direction, \ - _forced, \ - _oldlocs, \ - ) - -/// Finish any active movements -#define RESOLVE_ACTIVE_MOVEMENT \ - if(active_movement) { \ - var/__move_args = active_movement; \ - active_movement = null; \ - Moved(arglist(__move_args)); \ - } diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ff56ca0501d8..4b652b5265d8 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -200,6 +200,7 @@ #define STATUS_EFFECT_HIGHFIVE /datum/status_effect/high_five #define STATUS_EFFECT_DAP /datum/status_effect/high_five/dap +#define STATUS_EFFECT_OFFERING_EFTPOS /datum/status_effect/high_five/offering_eftpos #define STATUS_EFFECT_HANDSHAKE /datum/status_effect/high_five/handshake #define STATUS_EFFECT_RPS /datum/status_effect/high_five/rps diff --git a/code/__DEFINES/text_defines.dm b/code/__DEFINES/text_defines.dm index cd4b28b6d75d..e45e0787f0ec 100644 --- a/code/__DEFINES/text_defines.dm +++ b/code/__DEFINES/text_defines.dm @@ -6,6 +6,7 @@ #define MAX_CHARACTERS_PER_BOOKPAGE 5000 #define MAX_SUMMARY_LEN 1500 #define MAX_NAME_LEN 50 //diona names can get loooooooong +#define MAX_FLAVORTEXT_PRINT 400 //Amount of flavor text characters to print before cutting off. /// Removes characters incompatible with file names. #define SANITIZE_FILENAME(text) (GLOB.filename_forbidden_chars.Replace(text, "")) diff --git a/code/__DEFINES/time_defines.dm b/code/__DEFINES/time_defines.dm new file mode 100644 index 000000000000..d40f492be3a5 --- /dev/null +++ b/code/__DEFINES/time_defines.dm @@ -0,0 +1,18 @@ +#define MILLISECONDS *0.01 + +#define DECISECONDS *1 //the base unit all of these defines are scaled by, because byond uses that as a unit of measurement for some fucking reason + +// So you can be all 10 SECONDS +#define SECONDS *10 + +#define MINUTES *600 + +#define HOURS *36000 + +#define TICKS *world.tick_lag + +#define SECONDS_TO_LIFE_CYCLES /2 + +#define DS2TICKS(DS) ((DS)/world.tick_lag) + +#define TICKS2DS(T) ((T) TICKS) diff --git a/code/__DEFINES/tools_defines.dm b/code/__DEFINES/tools_defines.dm index 5cfb9c40ca6f..c2a7efed8bf9 100644 --- a/code/__DEFINES/tools_defines.dm +++ b/code/__DEFINES/tools_defines.dm @@ -6,6 +6,15 @@ #define TOOL_WRENCH "wrench" #define TOOL_WELDER "welder" +GLOBAL_LIST_INIT(construction_tool_behaviors, list( + TOOL_CROWBAR, + TOOL_MULTITOOL, + TOOL_SCREWDRIVER, + TOOL_WIRECUTTER, + TOOL_WRENCH, + TOOL_WELDER +)) + // Surgery tools #define TOOL_RETRACTOR "retractor" #define TOOL_HEMOSTAT "hemostat" diff --git a/code/__DEFINES/vehicle_defines.dm b/code/__DEFINES/vehicle_defines.dm index 4cd27e39aa69..be45aea5fac7 100644 --- a/code/__DEFINES/vehicle_defines.dm +++ b/code/__DEFINES/vehicle_defines.dm @@ -30,10 +30,16 @@ /// The vehicle being ridden requires pixel offsets for all directions #define RIDING_OFFSET_ALL "ALL" +/// Compensating for time dilation +GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) + ///Broken down, here's what this does: /// divides the world icon_size (32) by delay divided by ticklag to get the number of pixels something should be moving each tick. /// The division result is given a min value of 1 to prevent obscenely slow glide sizes from being set /// Then that's multiplied by the global glide size multiplier. 1.25 by default feels pretty close to spot on. This is just to try to get byond to behave. /// The whole result is then clamped to within the range above. /// Not very readable but it works -#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((world.icon_size / max((delay) / world.tick_lag, 1))), 1, 32)) +#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((world.icon_size / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) + +///Similar to DELAY_TO_GLIDE_SIZE, except without the clamping, and it supports piping in an unrelated scalar +#define MOVEMENT_ADJUSTED_GLIDE_SIZE(delay, movement_disparity) (world.icon_size / ((delay) / world.tick_lag) * movement_disparity * GLOB.glide_size_multiplier) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index a0e617657661..a53db2764deb 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -21,3 +21,6 @@ #define VV_MARKED_DATUM "Marked Datum" #define VV_BITFIELD "Bitfield" #define VV_REGEX "Regex" +#define VV_VISIBLE_ATOM "Visible Atom" +#define VV_INSIDE_VISIBLE_ATOM "Inside a Visible Atom" +#define VV_VISIBLE_TURF "Visible Turf" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index e6f5604890cb..490b714bf576 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -145,38 +145,33 @@ turfs += T return turfs - -//GLOBAL_VAR_INIT(debug_mob, 0) - -// Will recursively loop through an atom's contents and check for mobs, then it will loop through every atom in that atom's contents. -// It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects, -// being unable to hear people due to being in a box within a bag. - -/proc/recursive_mob_check(atom/O, list/L = list(), recursion_limit = 3, client_check = TRUE, sight_check = TRUE) - if(!recursion_limit) - return L - for(var/atom/A in O.contents) - if(ismob(A)) - var/mob/M = A - if(client_check && !M.client) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check) - continue - if(sight_check && !isInSight(A, O)) +/// Recursively loops through the contents of this atom looking for mobs, optionally requiring them to have a client. +/proc/collect_nested_mobs(atom/parent, list/mobs, recursion_limit = 3, client_check = TRUE) + var/list/next_layer = list(parent) + for(var/depth in 1 to recursion_limit) + var/list/layer = next_layer + next_layer = list() + for(var/thing in layer) + if(!ismob(thing)) continue - L |= M - for(var/mob/dead/observer/ghost in M.observers) - L |= ghost - //log_world("[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])") - - if(isobj(A) || ismob(A)) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check) - return L + var/mob/this_mob = thing + if(!client_check || this_mob.client) + mobs += this_mob + for(var/mob/dead/observer/ghost in this_mob.observers) + if(!client_check || ghost.client) + mobs += ghost + if(!length(next_layer)) + return // The old system would loop through lists for a total of 5000 per function call, in an empty server. // This new system will loop at around 1000 in an empty server. /proc/get_mobs_in_view(R, atom/source, include_clientless = FALSE) // Returns a list of mobs in range of R from source. Used in radio and say code. +#ifdef GAME_TESTS + // kind of feels cleaner clobbering here than changing the loop? + include_clientless = TRUE +#endif var/turf/T = get_turf(source) var/list/hear = list() @@ -185,13 +180,8 @@ return hear for(var/atom/A in hear(R, T)) - if(ismob(A)) - var/mob/M = A - if(M.client || include_clientless) - hear += M - if(isobj(A) || ismob(A)) - hear |= recursive_mob_check(A, hear, 3, TRUE, FALSE) + collect_nested_mobs(A, hear, 3, !include_clientless) return hear diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 959af27e822a..47947cb245f1 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -49,6 +49,44 @@ };\ } while(FALSE) +#define SORT_FIRST_INDEX(list) (list[1]) +#define SORT_COMPARE_DIRECTLY(thing) (thing) +#define SORT_VAR_NO_TYPE(varname) var/varname + +/**** + * Even more custom binary search sorted insert, using defines instead of vars + * INPUT: Item to be inserted + * LIST: List to insert INPUT into + * TYPECONT: A define setting the var to the typepath of the contents of the list + * COMPARE: The item to compare against, usualy the same as INPUT + * COMPARISON: A define that takes an item to compare as input, and returns their comparable value + * COMPTYPE: How should the list be compared? Either COMPARE_KEY or COMPARE_VALUE. + */ +#define BINARY_INSERT_DEFINE(INPUT, LIST, TYPECONT, COMPARE, COMPARISON, COMPTYPE) \ + do {\ + var/list/__BIN_LIST = LIST;\ + var/__BIN_CTTL = length(__BIN_LIST);\ + if(!__BIN_CTTL) {\ + __BIN_LIST += INPUT;\ + } else {\ + var/__BIN_LEFT = 1;\ + var/__BIN_RIGHT = __BIN_CTTL;\ + var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + ##TYPECONT(__BIN_ITEM);\ + while(__BIN_LEFT < __BIN_RIGHT) {\ + __BIN_ITEM = COMPTYPE;\ + if(##COMPARISON(__BIN_ITEM) <= ##COMPARISON(COMPARE)) {\ + __BIN_LEFT = __BIN_MID + 1;\ + } else {\ + __BIN_RIGHT = __BIN_MID;\ + };\ + __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + };\ + __BIN_ITEM = COMPTYPE;\ + __BIN_MID = ##COMPARISON(__BIN_ITEM) > ##COMPARISON(COMPARE) ? __BIN_MID : __BIN_MID + 1;\ + __BIN_LIST.Insert(__BIN_MID, INPUT);\ + };\ + } while(FALSE) // Generic listoflist safe add and removal macros: ///If value is a list, wrap it in a list so it can be used with list add/remove operations diff --git a/code/__HELPERS/mob_helpers.dm b/code/__HELPERS/mob_helpers.dm index 23e6df82eedd..d3732086582f 100644 --- a/code/__HELPERS/mob_helpers.dm +++ b/code/__HELPERS/mob_helpers.dm @@ -336,7 +336,7 @@ var/user_loc = user.loc var/drifting = 0 - if(!user.Process_Spacemove(0) && user.inertia_dir) + if(GLOB.move_manager.processing_on(user, SSspacedrift)) drifting = 1 var/target_loc = target.loc @@ -367,7 +367,7 @@ break continue - if(drifting && !user.inertia_dir) + if(drifting && !GLOB.move_manager.processing_on(user, SSspacedrift)) drifting = 0 user_loc = user.loc @@ -398,7 +398,7 @@ var/atom/Uloc = user.loc var/drifting = FALSE - if(!allow_moving && !user.Process_Spacemove(0) && user.inertia_dir) + if(!allow_moving && GLOB.move_manager.processing_on(user, SSspacedrift)) drifting = TRUE var/holding = user.get_active_hand() @@ -426,7 +426,7 @@ if(progress) progbar.update(world.time - starttime) if(!allow_moving) - if(drifting && !user.inertia_dir) + if(drifting && !GLOB.move_manager.processing_on(user, SSspacedrift)) drifting = FALSE Uloc = user.loc if(!drifting && user.loc != Uloc) diff --git a/code/__HELPERS/radiation_helpers.dm b/code/__HELPERS/radiation_helpers.dm index 5626d5a6f6a3..14c781de02b6 100644 --- a/code/__HELPERS/radiation_helpers.dm +++ b/code/__HELPERS/radiation_helpers.dm @@ -10,7 +10,9 @@ /obj/effect, /obj/docking_port, /atom/movable/lighting_object, - /obj/item/projectile)) + /obj/item/projectile, + /obj/structure/railing // uhhhh they're highly radiation resistant, or some shit (stops stupid exploits) + )) var/list/processing_list = list(location) . = list() while(length(processing_list)) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 033c410ba371..5b74b58db803 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,22 +1,3 @@ -#define MILLISECONDS *0.01 - -#define DECISECONDS *1 //the base unit all of these defines are scaled by, because byond uses that as a unit of measurement for some fucking reason - -// So you can be all 10 SECONDS -#define SECONDS *10 - -#define MINUTES *600 - -#define HOURS *36000 - -#define TICKS *world.tick_lag - -#define SECONDS_TO_LIFE_CYCLES /2 - -#define DS2TICKS(DS) ((DS)/world.tick_lag) - -#define TICKS2DS(T) ((T) TICKS) - /* This proc should only be used for world/Topic. * If you want to display the time for which dream daemon has been running ("round time") use worldtime2text. * If you want to display the canonical station "time" (aka the in-character time of the station) use station_time_timestamp diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index 5243e3473fda..e41cb2713498 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -314,6 +314,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Prevents seeing this item on examine when on a mob, or seeing it in the strip menu. It's like ABSTRACT, without making the item fail to interact in several ways. The item can still be stripped however, combine with no_strip unless you have a reason not to. #define TRAIT_SKIP_EXAMINE "skip_examine" +/// A general trait for tracking whether a zombie owned the organ or limb +#define TRAIT_I_WANT_BRAINS_ORGAN "zombie_organ" //****** OBJ TRAITS *****// ///An /obj that should not increase the "depth" of the search for adjacency, @@ -437,6 +439,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Causes the effect to go through a teleporter instead of being deleted by it. #define TRAIT_EFFECT_CAN_TELEPORT "trait_effect_can_teleport" +//***** MOVABLE ATOM TRAITS *****// +// Prevents the atom from being transitioned to another Z level when approaching the edge of the map. +#define TRAIT_NO_EDGE_TRANSITIONS "trait_no_edge_transitions" + //***** PROC WRAPPERS *****// /// Proc wrapper of add_trait. You should only use this for callback. Otherwise, use the macro. /proc/callback_add_trait(datum/target, trait, source) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 7a339ec82835..6e5ca9e91ba8 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1562,12 +1562,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(areas) . |= T.loc -/proc/turf_clear(turf/T) - for(var/atom/A in T) - if(A.simulated) - return FALSE - return TRUE - /proc/screen_loc2turf(scr_loc, turf/origin) var/tX = splittext(scr_loc, ",") var/tY = splittext(tX[2], ":") @@ -1748,6 +1742,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) matches[key] = value return matches +/proc/return_typenames(type) + return splittext("[type]", "/") + //Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm. //Increases delay as the server gets more overloaded, diff --git a/code/_globalvars/_regexes.dm b/code/_globalvars/_regexes.dm index af98089fe4e4..f81643367593 100644 --- a/code/_globalvars/_regexes.dm +++ b/code/_globalvars/_regexes.dm @@ -1,3 +1,4 @@ GLOBAL_DATUM_INIT(filename_forbidden_chars, /regex, regex(@{""|[\\\n\t/?%*:|<>]|\.\."}, "g")) GLOBAL_DATUM_INIT(is_color, /regex, regex("^#\[0-9a-fA-F]{6}$")) +GLOBAL_DATUM_INIT(regex_rgb_text, /regex, regex(@"^#?(([0-9a-fA-F]{8})|([0-9a-fA-F]{6})|([0-9a-fA-F]{3}))$")) GLOBAL_PROTECT(filename_forbidden_chars) diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 94b180be3c89..716ecf9d6152 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -10,7 +10,6 @@ GLOBAL_VAR_INIT(fakeblock, 0) GLOBAL_VAR_INIT(coughblock, 0) GLOBAL_VAR_INIT(glassesblock, 0) GLOBAL_VAR_INIT(epilepsyblock, 0) -GLOBAL_VAR_INIT(twitchblock, 0) GLOBAL_VAR_INIT(nervousblock, 0) GLOBAL_VAR_INIT(wingdingsblock, 0) GLOBAL_VAR_INIT(monkeyblock, DNA_SE_LENGTH) // Monkey block will always be the DNA_SE_LENGTH diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index f918fe47277f..efa225f48b7c 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(pandemics) GLOBAL_LIST_EMPTY(all_areas) GLOBAL_LIST_EMPTY(all_unique_areas) // List of all unique areas. AKA areas with there_can_be_many = FALSE GLOBAL_LIST_EMPTY(machines) +GLOBAL_LIST_EMPTY(telescreens) /// List of entertainment telescreens connected to the "news" cameranet GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices. GLOBAL_LIST_EMPTY(apcs) diff --git a/code/_globalvars/mapping_vars.dm b/code/_globalvars/mapping_vars.dm index dc095a33d16d..a78a017e735e 100644 --- a/code/_globalvars/mapping_vars.dm +++ b/code/_globalvars/mapping_vars.dm @@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY(latejoin) GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these GLOBAL_LIST_EMPTY(syndieprisonwarp) //contractor targets go to these +GLOBAL_LIST_EMPTY(backroomswarp) //backrooms hallucinators go to these GLOBAL_LIST_EMPTY(xeno_spawn)//Aliens spawn at these. GLOBAL_LIST_EMPTY(ertdirector) GLOBAL_LIST_EMPTY(emergencyresponseteamspawn) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 7e4d94bf4d13..1211797e7674 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -1,6 +1,6 @@ /* FUN ZONE OF ADMIN LISTINGS - Try to keep this in sync with __DEFINES/traits.dm + Try to keep this in sync with __HELPERS/trait_helpers.dm quirks have it's own panel so we don't need them here. */ GLOBAL_LIST_INIT(traits_by_type, list( @@ -140,7 +140,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HYPOSPRAY_IMMUNE" = TRAIT_HYPOSPRAY_IMMUNE, "TRAIT_ITEM_ACTIVE" = TRAIT_ITEM_ACTIVE, "TRAIT_NO_STRIP" = TRAIT_NO_STRIP, - "TRAIT_SKIP_EXAMINE" = TRAIT_SKIP_EXAMINE + "TRAIT_SKIP_EXAMINE" = TRAIT_SKIP_EXAMINE, + "TRAIT_I_WANT_BRAINS_ORGAN" = TRAIT_I_WANT_BRAINS_ORGAN ), /turf = list( @@ -150,6 +151,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/effect = list( "TRAIT_EFFECT_CAN_TELEPORT" = TRAIT_EFFECT_CAN_TELEPORT + ), + + /atom/movable = list( + "TRAIT_NO_EDGE_TRANSITIONS" = TRAIT_NO_EDGE_TRANSITIONS ) )) diff --git a/code/_onclick/ai_onclick.dm b/code/_onclick/ai_onclick.dm index 63a5da7c4d39..6085fba2a816 100644 --- a/code/_onclick/ai_onclick.dm +++ b/code/_onclick/ai_onclick.dm @@ -15,7 +15,10 @@ // But we return here since we don't want to do regular dblclick handling return - if(control_disabled || stat) return + if(control_disabled || stat) + return + if(ismecha(loc)) + return if(ismob(A)) ai_actual_track(A, TRUE) diff --git a/code/_onclick/observer_onclick.dm b/code/_onclick/observer_onclick.dm index 1b3955b5de94..71cf3b5037ad 100644 --- a/code/_onclick/observer_onclick.dm +++ b/code/_onclick/observer_onclick.dm @@ -83,7 +83,7 @@ if(!istype(user)) // Make sure user is actually an observer. Revenents also use attack_ghost, but do not have the health_scan var. return FALSE if(user.client) - if(user.gas_scan && atmos_scan(user=user, target=src, silent=TRUE)) + if(user.gas_scan && src.return_analyzable_air() && atmos_scan(user=user, target=src, silent=TRUE)) return TRUE // health + machine analyzer for ghosts diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 8bdf4ffe9920..cf8763b32b68 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -49,8 +49,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /// Did inits finish with no one logged in var/initializations_finished_with_no_players_logged_in - /// The type of the last subsystem to be fire()'d. - var/last_type_processed + /// The last subsystem to be fire()'d. + var/datum/controller/subsystem/last_processed /// Cache for the loading screen - cleared after var/list/ss_in_init_order = list() @@ -172,7 +172,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new msg += "\t [varname] = [varval]\n" log_world(msg) - var/datum/controller/subsystem/BadBoy = Master.last_type_processed + var/datum/controller/subsystem/BadBoy = Master.last_processed var/FireHim = FALSE if(istype(BadBoy)) msg = null @@ -431,8 +431,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new continue if(queue_head) - if(RunQueue() <= 0) //error running queue - stack_trace("MC: RunQueue failed. Current error_level is [round(error_level, 0.25)]") + if(!RunQueue()) + stack_trace("MC: RunQueue returned early during [last_processed.name] ([last_processed.last_task()]). Current error_level is [round(error_level, 0.25)].") if(error_level > 1) //skip the first error, if(!SoftReset(tickersubsystems, runlevel_sorted_subsystems)) error_level++ @@ -501,7 +501,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /// RunQueue - Run thru the queue of subsystems to run, running them while balancing out their allocated tick precentage /// Returns 0 if runtimed, a negitive number for logic errors, and a positive number if the operation completed without errors /datum/controller/master/proc/RunQueue() - . = 0 var/datum/controller/subsystem/queue_node var/queue_node_flags var/queue_node_priority @@ -537,9 +536,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new bg_calc = TRUE else if(bg_calc) //error state, do sane fallback behavior - if(. == 0) - log_world("MC: Queue logic failure, non-background subsystem queued to run after a background subsystem: [queue_node] queue_prev:[queue_node.queue_prev]") - . = -1 + var/message = "MC: Queue logic failure, non-background subsystem queued to run after a background subsystem: [queue_node] queue_prev:[queue_node.queue_prev]" + log_world(message) + stack_trace(message) current_tick_budget = queue_priority_count //this won't even be right, but is the best we have. bg_calc = FALSE @@ -551,9 +550,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new tick_precentage = tick_remaining * (queue_node_priority / current_tick_budget) else //error state - if(. == 0) - log_world("MC: tick_budget sync error. [json_encode(list(current_tick_budget, queue_priority_count, queue_priority_count_bg, bg_calc, queue_node, queue_node_priority))]") - . = -1 + var/message = "MC: tick_budget sync error. [json_encode(list(current_tick_budget, queue_priority_count, queue_priority_count_bg, bg_calc, queue_node, queue_node_priority))]" + log_world(message) + stack_trace(message) tick_precentage = tick_remaining //just because we lost track of priority calculations doesn't mean we can't try to finish off the run, if the error state persists, we don't want to stop ticks from happening tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun) @@ -563,7 +562,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new ran = TRUE queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING) - last_type_processed = queue_node + last_processed = queue_node queue_node.state = SS_RUNNING @@ -613,8 +612,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new queue_node = queue_node.queue_next - if(. == 0) - . = 1 + return TRUE //resets the queue, and all subsystems, while filtering out the subsystem lists // called if any mc's queue procs runtime or exit improperly. diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index a322747f0e57..c4ce828c8079 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -353,3 +353,7 @@ out["sleep_count"] = fire_sleep_count out["custom"] = list() // Override as needed on child return out + +/// Allows a subsystem to report what it was doing in case of a silent crash. +/datum/controller/subsystem/proc/last_task() + return "No task specified." diff --git a/code/controllers/subsystem/SSair.dm b/code/controllers/subsystem/SSair.dm index 5553f6d78d06..435c0766588d 100644 --- a/code/controllers/subsystem/SSair.dm +++ b/code/controllers/subsystem/SSair.dm @@ -12,12 +12,24 @@ SUBSYSTEM_DEF(air) name = "Atmospherics" init_order = INIT_ORDER_AIR priority = FIRE_PRIORITY_AIR - wait = 2 - flags = SS_BACKGROUND + // The MC really doesn't like it if we sleep (even though it's supposed to), and ends up running us continuously. Instead, we ask it to run us every tick, and "sleep" by skipping the current tick. + wait = 1 + flags = SS_BACKGROUND | SS_TICKER + /// How long we actually wait between ticks. Will round up to the next server tick. + var/self_wait = 0.15 SECONDS + /// MC seems to not be good at tracking whether SSair pauses, so track that ourselves. + var/was_paused = FALSE + /// And that means we also nee a replacement for times_fired. + var/milla_tick = 0 runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME offline_implications = "Turfs will no longer process atmos, and all atmospheric machines (including cryotubes) will no longer function. Shuttle call recommended." cpu_display = SS_CPUDISPLAY_HIGH + /// When did we last finish running a complete tick? + var/last_complete_tick = 0 + /// When did we last start a tick? + var/last_tick_start = 0 + /// How long we took for a full pass through the subsystem. Custom-tracked version of `cost`. var/datum/resumable_cost_counter/cost_full = new() /// How long we spent sleeping while waiting for MILLA to finish the last tick, shown in SS Info's C block as ZZZ. @@ -178,31 +190,31 @@ SUBSYSTEM_DEF(air) currentpart = SSair.currentpart milla_idle = SSair.milla_idle -#define SLEEPABLE_TIMER (world.time + world.tick_usage * world.tick_lag / 100) +/datum/controller/subsystem/air/pause() + was_paused = TRUE + return ..() + /datum/controller/subsystem/air/fire(resumed = 0) // All atmos stuff assumes MILLA is synchronous. Ensure it actually is. - if(!milla_idle || length(sleepers) > 0) - var/timer = SLEEPABLE_TIMER - - while(!milla_idle || length(sleepers) > 0) - // Sleep for 1ms. - sleep(0.01) - var/new_timer = SLEEPABLE_TIMER - time_slept.record_progress((new_timer - timer) * 100, FALSE) - timer = new_timer + var/now = world.timeofday + (world.tick_lag * world.tick_usage) / 100 + var/elapsed = now - last_complete_tick + if(!milla_idle || length(sleepers) || (elapsed >= 0 && elapsed < self_wait)) + return - time_slept.record_progress((SLEEPABLE_TIMER - timer) * 100, TRUE) + if(last_tick_start <= last_complete_tick) + last_tick_start = now + time_slept.record_progress(max(0, elapsed) * 100, TRUE) // Run the sleepless callbacks again in case more showed up since on_milla_tick_finished() run_sleepless_callbacks() - fire_sleepless(resumed) -#undef SLEEPABLE_TIMER + fire_sleepless(resumed || was_paused) /datum/controller/subsystem/air/proc/fire_sleepless(resumed) // Any proc that wants MILLA to be synchronous should not sleep. SHOULD_NOT_SLEEP(TRUE) in_milla_safe_code = TRUE + was_paused = FALSE var/timer = TICK_USAGE_REAL @@ -314,16 +326,19 @@ SUBSYSTEM_DEF(air) timer = TICK_USAGE_REAL spawn_milla_tick_thread() + milla_tick++ milla_idle = FALSE cost_milla_tick = MC_AVERAGE(cost_milla_tick, get_milla_tick_time()) - cost_full.record_progress(TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer), state != SS_PAUSED && state != SS_PAUSING) + cost_full.record_progress(TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer), FALSE) if(state == SS_PAUSED || state == SS_PAUSING) in_milla_safe_code = FALSE return resumed = 0 currentpart = SSAIR_DEFERREDPIPENETS + last_complete_tick = world.timeofday + (world.tick_lag * world.tick_usage) / 100 + cost_full.record_progress(0, TRUE) in_milla_safe_code = FALSE /datum/controller/subsystem/air/proc/build_pipenets(resumed = 0) @@ -410,9 +425,9 @@ SUBSYSTEM_DEF(air) // Bind the MILLA tile we got, if needed. if(isnull(T.bound_air)) bind_turf(T, milla_tile) - else if(T.bound_air.lastread < times_fired) + else if(T.bound_air.lastread < milla_tick) T.bound_air.copy_from_milla(milla_tile) - T.bound_air.lastread = times_fired + T.bound_air.lastread = milla_tick T.bound_air.readonly = null T.bound_air.dirty = FALSE T.bound_air.synchronized = FALSE @@ -441,7 +456,7 @@ SUBSYSTEM_DEF(air) if(isnull(S.wind_tick)) // Didn't have wind before, add it. windy_tiles += S - S.wind_tick = times_fired + S.wind_tick = milla_tick S.wind_x = x_flow S.wind_y = y_flow T.high_pressure_movements(x_flow, y_flow) @@ -458,15 +473,17 @@ SUBSYSTEM_DEF(air) var/list/currentrun = src.currentrun while(length(currentrun)) var/turf/simulated/S = currentrun[length(currentrun)] - currentrun.len-- if(!istype(S)) + currentrun.len-- continue if(S.update_hotspot()) // Is still a hotspot, keep it. new_hotspots += S + currentrun.len-- + if(MC_TICK_CHECK) return @@ -622,29 +639,11 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/setup_turfs(turf/low_corner = locate(1, 1, 1), turf/high_corner = locate(world.maxx, world.maxy, world.maxz)) for(var/turf/T as anything in block(low_corner, high_corner)) - T.Initialize_Atmos(times_fired) + T.Initialize_Atmos(milla_tick) milla_load_turfs(low_corner, high_corner) - -/datum/controller/subsystem/air/proc/setup_write_to_milla() - var/watch = start_watch() - log_startup_progress("Writing tiles to MILLA...") - - //cache for sanic speed (lists are references anyways) - var/list/cache = bound_mixtures - var/count = length(cache) - while(length(cache)) - var/datum/gas_mixture/bound_to_turf/mixture = cache[length(cache)] - cache.len-- - if(mixture.dirty) - in_milla_safe_code = TRUE - // This is one of two places expected to call this otherwise-unsafe method. - mixture.private_unsafe_write() - in_milla_safe_code = FALSE - mixture.bound_turf.bound_air = null - mixture.bound_turf = null - CHECK_TICK - - log_startup_progress("Wrote [count] tiles in [stop_watch(watch)]s.") + for(var/turf/T as anything in block(low_corner, high_corner)) + T.milla_data.len = 0 + T.milla_data = null /datum/controller/subsystem/air/proc/setup_atmos_machinery(list/machines_to_init) var/watch = start_watch() @@ -705,7 +704,7 @@ SUBSYSTEM_DEF(air) milla_tile = new/list(MILLA_TILE_SIZE) get_tile_atmos(T, milla_tile) B.copy_from_milla(milla_tile) - B.lastread = src.times_fired + B.lastread = src.milla_tick B.readonly = null B.dirty = FALSE B.synchronized = FALSE @@ -824,11 +823,11 @@ SUBSYSTEM_DEF(air) soft_assert_safe() // This is one of two intended places to call this otherwise-unsafe proc. var/datum/gas_mixture/bound_to_turf/air = T.private_unsafe_get_air() - if(air.lastread < SSair.times_fired) + if(air.lastread < SSair.milla_tick) var/list/milla_tile = new/list(MILLA_TILE_SIZE) get_tile_atmos(T, milla_tile) air.copy_from_milla(milla_tile) - air.lastread = SSair.times_fired + air.lastread = SSair.milla_tick air.readonly = null air.dirty = FALSE if(!air.synchronized) @@ -874,11 +873,11 @@ SUBSYSTEM_DEF(air) soft_assert_safe() // This is one of two intended places to call this otherwise-unsafe proc. var/datum/gas_mixture/bound_to_turf/air = T.private_unsafe_get_air() - if(air.lastread < SSair.times_fired) + if(air.lastread < SSair.milla_tick) var/list/milla_tile = new/list(MILLA_TILE_SIZE) get_tile_atmos(T, milla_tile) air.copy_from_milla(milla_tile) - air.lastread = SSair.times_fired + air.lastread = SSair.milla_tick air.readonly = null air.dirty = FALSE if(!air.synchronized) diff --git a/code/controllers/subsystem/SSinput.dm b/code/controllers/subsystem/SSinput.dm index 0ee764297381..d8444f942706 100644 --- a/code/controllers/subsystem/SSinput.dm +++ b/code/controllers/subsystem/SSinput.dm @@ -15,6 +15,11 @@ SUBSYSTEM_DEF(input) /// List of clients whose input to process in loop. var/list/client/processing = list() + var/last_ckey + var/last_x + var/last_y + var/last_z + /datum/controller/subsystem/input/Initialize() refresh_client_macro_sets() @@ -26,6 +31,10 @@ SUBSYSTEM_DEF(input) set waitfor = FALSE var/list/to_cull for(var/client/C in processing) + last_ckey = C.ckey + last_x = C.mob?.x + last_y = C.mob?.y + last_z = C.mob?.z if(processing[C] + AUTO_CULL_TIME < world.time) if(!length(C.input_data.keys_held)) LAZYADD(to_cull, C) @@ -42,4 +51,7 @@ SUBSYSTEM_DEF(input) var/client/user = clients[i] user.set_macros() +/datum/controller/subsystem/input/last_task() + return "[last_ckey] at [last_x], [last_y], [last_z]" + #undef AUTO_CULL_TIME diff --git a/code/controllers/subsystem/SSspacedrift.dm b/code/controllers/subsystem/SSspacedrift.dm deleted file mode 100644 index 2707f12518fb..000000000000 --- a/code/controllers/subsystem/SSspacedrift.dm +++ /dev/null @@ -1,66 +0,0 @@ -SUBSYSTEM_DEF(spacedrift) - name = "Space Drift" - priority = FIRE_PRIORITY_SPACEDRIFT - wait = 5 - flags = SS_NO_INIT|SS_KEEP_TIMING - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - offline_implications = "Mobs will no longer respect a lack of gravity. No immediate action is needed." - cpu_display = SS_CPUDISPLAY_LOW - - var/list/currentrun = list() - var/list/processing = list() - -/datum/controller/subsystem/spacedrift/get_stat_details() - return "P:[length(processing)]" - -/datum/controller/subsystem/spacedrift/get_metrics() - . = ..() - var/list/cust = list() - cust["processing"] = length(processing) - .["custom"] = cust - -/datum/controller/subsystem/spacedrift/fire(resumed = 0) - if(!resumed) - src.currentrun = processing.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(length(currentrun)) - var/atom/movable/AM = currentrun[length(currentrun)] - currentrun.len-- - if(!AM) - processing -= AM - if(MC_TICK_CHECK) - return - continue - - if(AM.inertia_next_move > world.time) - if(MC_TICK_CHECK) - return - continue - - if(!AM.loc || AM.loc != AM.inertia_last_loc || AM.Process_Spacemove(0)) - AM.inertia_dir = 0 - - if(!AM.inertia_dir) - AM.inertia_last_loc = null - processing -= AM - if(MC_TICK_CHECK) - return - continue - - var/old_dir = AM.dir - var/old_loc = AM.loc - AM.inertia_moving = TRUE - AM.Move(get_step(AM, AM.inertia_dir), AM.inertia_dir, AM.inertia_move_delay) - AM.inertia_moving = FALSE - AM.inertia_next_move = world.time + AM.inertia_move_delay - if(AM.loc == old_loc) - AM.inertia_dir = 0 - - AM.setDir(old_dir) - AM.inertia_last_loc = AM.loc - if(MC_TICK_CHECK) - return - diff --git a/code/controllers/subsystem/SSthrowing.dm b/code/controllers/subsystem/SSthrowing.dm index 1cd7f739106d..24f640732865 100644 --- a/code/controllers/subsystem/SSthrowing.dm +++ b/code/controllers/subsystem/SSthrowing.dm @@ -221,7 +221,7 @@ SUBSYSTEM_DEF(throwing) finalize() return - if(!AM.Move(step, get_dir(AM, step))) // we hit something during our move... + if(!AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed))) // we hit something during our move... if(AM.throwing) // ...but finalize() wasn't called on Bump() because of a higher level definition that doesn't always call parent. finalize() return @@ -254,6 +254,9 @@ SUBSYSTEM_DEF(throwing) else thrownthing.newtonian_move(init_dir) + // Attempt to reset glide size once throw ends + thrownthing.set_glide_size(initial(thrownthing.glide_size)) + if(target) thrownthing.throw_impact(target, src) if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing diff --git a/code/controllers/subsystem/SStime_track.dm b/code/controllers/subsystem/SStime_track.dm index 5f15a1bf9e42..e645077e8621 100644 --- a/code/controllers/subsystem/SStime_track.dm +++ b/code/controllers/subsystem/SStime_track.dm @@ -29,6 +29,7 @@ SUBSYSTEM_DEF(time_track) time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current) time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast) time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg) + GLOB.glide_size_multiplier = (current_byondtime - last_tick_byond_time) / (current_realtime - last_tick_realtime) else first_run = FALSE last_tick_realtime = current_realtime diff --git a/code/controllers/subsystem/movement/SSmovement.dm b/code/controllers/subsystem/movement/SSmovement.dm new file mode 100644 index 000000000000..d6cad4a734d3 --- /dev/null +++ b/code/controllers/subsystem/movement/SSmovement.dm @@ -0,0 +1,134 @@ +SUBSYSTEM_DEF(movement) + name = "Movement Loops" + flags = SS_NO_INIT|SS_BACKGROUND|SS_TICKER + wait = 1 //Fire each tick + /* + A breif aside about the bucketing system here + + The goal is to allow for higher loads of semi long delays while reducing cpu usage + Bucket insertion and management are much less complex then what you might see in SStimer + This is intentional, as we loop our delays much more often then that ss is designed for + We also have much shorter term timers, so we need to worry about redundant buckets much less + */ + ///Assoc list of "target time" -> list(things to process). Used for quick lookup + var/list/buckets = list() + ///Sorted list of list(target time, bucket to process) + var/list/sorted_buckets = list() + ///The time we started our last fire at + var/canonical_time = 0 + ///The visual delay of the subsystem + var/visual_delay = 1 + +/datum/controller/subsystem/movement/stat_entry(msg) + var/total_len = 0 + for(var/list/bucket as anything in sorted_buckets) + total_len += length(bucket[MOVEMENT_BUCKET_LIST]) + msg = "B:[length(sorted_buckets)] E:[total_len]" + return ..() + +/datum/controller/subsystem/movement/Recover() + //Get ready this is gonna be horrible + //We need to do this to support subtypes by the by + var/list/typenames = return_typenames(src.type) + var/our_name = typenames[length(typenames)] //Get the last name in the list, IE the subsystem identifier + + var/datum/controller/subsystem/movement/old_version = global.vars["SS[our_name]"] + buckets = old_version.buckets + sorted_buckets = old_version.sorted_buckets + +/datum/controller/subsystem/movement/fire(resumed) + if(!resumed) + canonical_time = world.time + + for(var/list/bucket_info as anything in sorted_buckets) + var/time = bucket_info[MOVEMENT_BUCKET_TIME] + if(time > canonical_time || MC_TICK_CHECK) + return + pour_bucket(bucket_info) + +/// Processes a bucket of movement loops (This should only ever be called by fire(), it exists to prevent runtime fuckery) +/datum/controller/subsystem/movement/proc/pour_bucket(list/bucket_info) + var/list/processing = bucket_info[MOVEMENT_BUCKET_LIST] // Cache for lookup speed + while(processing.len) + var/datum/move_loop/loop = processing[processing.len] + processing.len-- + // No longer queued since we just got removed from the loop + loop.queued_time = null + loop.process() //This shouldn't get nulls, if it does, runtime + if(!QDELETED(loop) && loop.status & MOVELOOP_STATUS_QUEUED) //Re-Insert the loop + loop.status &= ~MOVELOOP_STATUS_QUEUED + loop.timer = world.time + loop.delay + queue_loop(loop) + if(MC_TICK_CHECK) + break + + if(length(processing)) + return // Still work to be done + var/bucket_time = bucket_info[MOVEMENT_BUCKET_TIME] + smash_bucket(1, bucket_time) // We assume we're the first bucket in the queue right now + visual_delay = MC_AVERAGE_FAST(visual_delay, max((world.time - canonical_time) / wait, 1)) + +/// Removes a bucket from our system. You only need to pass in the time, but if you pass in the index of the list you save us some work +/datum/controller/subsystem/movement/proc/smash_bucket(index, bucket_time) + var/sorted_length = length(sorted_buckets) + if(!index) + index = sorted_length + 1 // let's setup the failure condition + for(var/i in 1 to sorted_length) + var/list/bucket_info = sorted_buckets[i] + if(bucket_info[MOVEMENT_BUCKET_TIME] != bucket_time) + continue + index = i + break + //This is technically possible, if our bucket is smashed inside the loop's process + //Let's be nice, the cost of doing it is cheap + if(index > sorted_length || !buckets["[bucket_time]"]) + return + + sorted_buckets.Cut(index, index + 1) //Removes just this list + //Removes the assoc lookup too + buckets -= "[bucket_time]" + +/datum/controller/subsystem/movement/proc/queue_loop(datum/move_loop/loop) + if(loop.status & MOVELOOP_STATUS_QUEUED) + stack_trace("A move loop attempted to queue while already queued") + return + loop.queued_time = loop.timer + loop.status |= MOVELOOP_STATUS_QUEUED + var/list/our_bucket = buckets["[loop.queued_time]"] + // If there's no bucket for this, lets set them up + if(!our_bucket) + buckets["[loop.queued_time]"] = list() + our_bucket = buckets["[loop.queued_time]"] + // This makes assoc buckets and sorted buckets point to the same place, allowing for quicker inserts + var/list/new_bucket = list(list(loop.queued_time, our_bucket)) + var/list/compare_item = list(loop.queued_time) + BINARY_INSERT_DEFINE(new_bucket, sorted_buckets, SORT_VAR_NO_TYPE, compare_item, SORT_FIRST_INDEX, COMPARE_KEY) + + our_bucket += loop + +/datum/controller/subsystem/movement/proc/dequeue_loop(datum/move_loop/loop) + // Go home, you're not here anyway + if(!(loop.status & MOVELOOP_STATUS_QUEUED)) + return + if(isnull(loop.queued_time)) // This happens if a moveloop is dequeued while handling process() + loop.status &= ~MOVELOOP_STATUS_QUEUED + return + var/list/our_entries = buckets["[loop.queued_time]"] + our_entries -= loop + if(!length(our_entries)) + smash_bucket(bucket_time = loop.queued_time) // We can't pass an index in for context because we don't know our position + loop.queued_time = null + loop.status &= ~MOVELOOP_STATUS_QUEUED + +/datum/controller/subsystem/movement/proc/add_loop(datum/move_loop/add) + if(add.status & MOVELOOP_STATUS_QUEUED) + CRASH("Loop being added that is already queued.") + add.loop_started() + if(QDELETED(add) || add.status & MOVELOOP_STATUS_QUEUED) + return + queue_loop(add) + +/datum/controller/subsystem/movement/proc/remove_loop(datum/move_loop/remove) + dequeue_loop(remove) + remove.loop_stopped() + diff --git a/code/controllers/subsystem/movement/SSspacedrift.dm b/code/controllers/subsystem/movement/SSspacedrift.dm new file mode 100644 index 000000000000..4002b5eb555f --- /dev/null +++ b/code/controllers/subsystem/movement/SSspacedrift.dm @@ -0,0 +1,5 @@ +MOVEMENT_SUBSYSTEM_DEF(spacedrift) + name = "Space Drift" + priority = FIRE_PRIORITY_SPACEDRIFT + flags = SS_NO_INIT|SS_TICKER + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm new file mode 100644 index 000000000000..308aeb7ec80b --- /dev/null +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -0,0 +1,835 @@ +///Template class of the movement datums, handles the timing portion of the loops +/datum/move_loop + ///The movement packet that owns us + var/datum/movement_packet/owner + ///The subsystem we're processing on + var/datum/controller/subsystem/movement/controller + ///An extra reference we pass around + ///It is on occasion useful to have a reference to some datum without storing it on the moving object + ///Mostly comes up in high performance senarios where we care about things being singletons + ///This feels horrible, but constantly making components seems worse + var/datum/extra_info + ///The thing we're moving about + var/atom/movable/moving + ///Defines how different move loops override each other. Higher numbers beat lower numbers + var/priority = MOVEMENT_DEFAULT_PRIORITY + ///Bitfield of different things that affect how a loop operates, and other mechanics around it as well. + var/flags + ///Time till we stop processing in deci-seconds, defaults to forever + var/lifetime = INFINITY + ///Delay between each move in deci-seconds + var/delay = 1 + ///The next time we should process + ///Used primarially as a hint to be reasoned about by our [controller], and as the id of our bucket + var/timer = 0 + ///The time we are CURRENTLY queued for processing + ///Do not modify this directly + var/queued_time = -1 + /// Status bitfield for what state the move loop is currently in + var/status = NONE + +/datum/move_loop/New(datum/movement_packet/owner, datum/controller/subsystem/movement/controller, atom/moving, priority, flags, datum/extra_info) + src.owner = owner + src.controller = controller + src.extra_info = extra_info + if(extra_info) + RegisterSignal(extra_info, COMSIG_PARENT_QDELETING, PROC_REF(info_deleted)) + src.moving = moving + src.priority = priority + src.flags = flags + +/datum/move_loop/proc/setup(delay = 1, timeout = INFINITY) + if(!ismovable(moving) || !owner) + return FALSE + + src.delay = max(delay, world.tick_lag) //Please... + src.lifetime = timeout + return TRUE + +///check if this exact moveloop datum already exists (in terms of vars) so we can avoid creating a new one to overwrite the old duplicate +/datum/move_loop/proc/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay = 1, timeout = INFINITY) + SHOULD_CALL_PARENT(TRUE) + if(loop_type == type && priority == src.priority && flags == src.flags && delay == src.delay && timeout == lifetime) + return TRUE + return FALSE + +///Called when a loop is starting by a movement subsystem +/datum/move_loop/proc/loop_started() + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_MOVELOOP_START) + status |= MOVELOOP_STATUS_RUNNING + //If this is our first time starting to move with this loop + //And we're meant to start instantly + if(!timer && flags & MOVEMENT_LOOP_START_FAST) + timer = world.time + return + timer = world.time + delay + +///Called when a loop is stopped, doesn't stop the loop itself +/datum/move_loop/proc/loop_stopped() + SHOULD_CALL_PARENT(TRUE) + status &= ~MOVELOOP_STATUS_RUNNING + SEND_SIGNAL(src, COMSIG_MOVELOOP_STOP) + +/datum/move_loop/proc/info_deleted(datum/source) + SIGNAL_HANDLER + extra_info = null + +/datum/move_loop/Destroy() + if(owner) + owner.remove_loop(controller, src) + owner = null + moving = null + controller = null + extra_info = null + return ..() + +///Exists as a helper so outside code can modify delay in a sane way +/datum/move_loop/proc/set_delay(new_delay) + delay = max(new_delay, world.tick_lag) + +///Pauses the move loop for some passed in period +///This functionally means shifting its timer up, and clearing it from its current bucket +/datum/move_loop/proc/pause_for(time) + if(!controller || !(status & MOVELOOP_STATUS_RUNNING)) //No controller or not running? go away + return + //Dequeue us from our current bucket + controller.dequeue_loop(src) + //Offset our timer + timer = world.time + time + //Now requeue us with our new target start time + controller.queue_loop(src) + +/datum/move_loop/process() + if(isnull(controller)) + qdel(src) + return + + var/old_delay = delay //The signal can sometimes change delay + + if(SEND_SIGNAL(src, COMSIG_MOVELOOP_PREPROCESS_CHECK) & MOVELOOP_SKIP_STEP) //Chance for the object to react + return + + lifetime -= old_delay //This needs to be based on work over time, not just time passed + + if(lifetime < 0) //Otherwise lag would make things look really weird + qdel(src) + return + + var/visual_delay = controller.visual_delay + var/old_dir = moving.dir + var/old_loc = moving.loc + + owner?.processing_move_loop_flags = flags + var/result = move() //Result is an enum value. Enums defined in __DEFINES/movement.dm + if(moving) + var/direction = get_dir(old_loc, moving.loc) + SEND_SIGNAL(moving, COMSIG_MOVABLE_MOVED_FROM_LOOP, src, old_dir, direction) + owner?.processing_move_loop_flags = NONE + + SEND_SIGNAL(src, COMSIG_MOVELOOP_POSTPROCESS, result, delay * visual_delay) + + if(QDELETED(src) || result != MOVELOOP_SUCCESS) //Can happen + return + + if(flags & MOVEMENT_LOOP_IGNORE_GLIDE) + return + + var/glide_multiplier = visual_delay + if(IS_DIR_DIAGONAL(get_dir(old_loc, moving.loc)) && !(moving.appearance_flags & LONG_GLIDE)) + glide_multiplier *= sqrt(2) + moving.set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(delay, glide_multiplier)) + +///Handles the actual move, overriden by children +///Returns FALSE if nothing happen, TRUE otherwise +/datum/move_loop/proc/move() + return MOVELOOP_FAILURE + + +///Pause our loop untill restarted with resume_loop() +/datum/move_loop/proc/pause_loop() + if(!controller || !(status & MOVELOOP_STATUS_RUNNING) || (status & MOVELOOP_STATUS_PAUSED)) //we dead + return + + //Dequeue us from our current bucket + controller.dequeue_loop(src) + status |= MOVELOOP_STATUS_PAUSED + +///Resume our loop after being paused by pause_loop() +/datum/move_loop/proc/resume_loop() + if(!controller || (status & MOVELOOP_STATUS_RUNNING|MOVELOOP_STATUS_PAUSED) != (MOVELOOP_STATUS_RUNNING|MOVELOOP_STATUS_PAUSED)) + return + + timer = world.time + controller.queue_loop(src) + status &= ~MOVELOOP_STATUS_PAUSED + +///Removes the atom from some movement subsystem. Defaults to SSmovement +/datum/move_manager/proc/stop_looping(atom/movable/moving, datum/controller/subsystem/movement/subsystem = SSmovement) + var/datum/movement_packet/our_info = moving.move_packet + if(!our_info) + return FALSE + return our_info.remove_subsystem(subsystem) + +/** + * Replacement for walk() + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * direction - The direction we want to move in + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/move, priority, flags, extra_info, delay, timeout, direction) + +///Replacement for walk() +/datum/move_loop/move + var/direction + +/datum/move_loop/move/setup(delay, timeout, dir) + . = ..() + if(!.) + return + direction = dir + +/datum/move_loop/move/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, dir) + if(..() && direction == dir) + return TRUE + return FALSE + +/datum/move_loop/move/move() + var/atom/old_loc = moving.loc + moving.Move(get_step(moving, direction), direction, FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + // We cannot rely on the return value of Move(), we care about teleports and it doesn't + // Moving also can be null on occasion, if the move deleted it and therefor us + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + + +/** + * Like move(), but we don't care about collision at all + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * direction - The direction we want to move in + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/force_move_dir(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/move/force, priority, flags, extra_info, delay, timeout, direction) + +/datum/move_loop/move/force + +/datum/move_loop/move/force/move() + var/atom/old_loc = moving.loc + moving.forceMove(get_step(moving, direction)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + + +/datum/move_loop/has_target + ///The thing we're moving in relation to, either at or away from + var/atom/target + +/datum/move_loop/has_target/setup(delay, timeout, atom/chasing) + . = ..() + if(!.) + return + if(!isatom(chasing)) + qdel(src) + return FALSE + + target = chasing + + if(!isturf(target)) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(handle_no_target)) //Don't do this for turfs, because we don't care + +/datum/move_loop/has_target/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing) + if(..() && chasing == target) + return TRUE + return FALSE + +/datum/move_loop/has_target/Destroy() + target = null + return ..() + +/datum/move_loop/has_target/proc/handle_no_target() + SIGNAL_HANDLER + qdel(src) + + +/** + * Used for force-move loops, similar to move_towards_legacy() but not quite the same + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/force_move(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/has_target/force_move, priority, flags, extra_info, delay, timeout, chasing) + +///Used for force-move loops +/datum/move_loop/has_target/force_move + +/datum/move_loop/has_target/force_move/move() + var/atom/old_loc = moving.loc + moving.forceMove(get_step(moving, get_dir(moving, target))) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + + +/** + * Used for following jps defined paths. The proc signature here's a bit long, I'm sorry + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * repath_delay - How often we're allowed to recalculate our path + * max_path_length - The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite) + * miminum_distance - Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example + * access - A list representing what access we have and what doors we can open + * simulated_only - Whether we consider turfs without atmos simulation (AKA do we want to ignore space) + * avoid - If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf + * skip_first - Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break things + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/jps_move(moving, + chasing, + delay, + timeout, + repath_delay, + max_path_length, + minimum_distance, + list/access, + simulated_only, + turf/avoid, + skip_first, + subsystem, + diagonal_handling, + priority, + flags, + datum/extra_info, + initial_path) + return add_to_loop(moving, + subsystem, + /datum/move_loop/has_target/jps, + priority, + flags, + extra_info, + delay, + timeout, + chasing, + repath_delay, + max_path_length, + minimum_distance, + access, + simulated_only, + avoid, + skip_first, + diagonal_handling, + initial_path) + +/datum/move_loop/has_target/jps + ///How often we're allowed to recalculate our path + var/repath_delay + ///Max amount of steps to search + var/max_path_length + ///Minimum distance to the target before path returns + var/minimum_distance + ///A list representing what access we have and what doors we can open. + var/list/access + ///Whether we consider turfs without atmos simulation (AKA do we want to ignore space) + var/simulated_only + ///A perticular turf to avoid + var/turf/avoid + ///Should we skip the first step? This is the tile we're currently on, which breaks some things + var/skip_first + ///Whether we replace diagonal movements with cardinal movements or follow through with them + var/diagonal_handling + ///A list for the path we're currently following + var/list/movement_path + ///Cooldown for repathing, prevents spam + COOLDOWN_DECLARE(repath_cooldown) + ///Bool used to determine if we're already making a path in JPS. this prevents us from re-pathing while we're already busy. + var/is_pathing = FALSE + ///Callbacks to invoke once we make a path + var/list/datum/callback/on_finish_callbacks = list() + +/datum/move_loop/has_target/jps/New(datum/movement_packet/owner, datum/controller/subsystem/movement/controller, atom/moving, priority, flags, datum/extra_info) + . = ..() + on_finish_callbacks += CALLBACK(src, PROC_REF(on_finish_pathing)) + +/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, diagonal_handling, list/initial_path) + . = ..() + if(!.) + return + src.repath_delay = repath_delay + src.max_path_length = max_path_length + src.minimum_distance = minimum_distance + src.access = access + src.simulated_only = simulated_only + src.avoid = avoid + src.skip_first = skip_first + src.diagonal_handling = diagonal_handling + movement_path = initial_path?.Copy() + +/datum/move_loop/has_target/jps/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, initial_path) + if(..() && repath_delay == src.repath_delay && max_path_length == src.max_path_length && minimum_distance == src.minimum_distance && access ~= src.access && simulated_only == src.simulated_only && avoid == src.avoid) + return TRUE + return FALSE + +/datum/move_loop/has_target/jps/loop_started() + . = ..() + if(!movement_path) + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + +/datum/move_loop/has_target/jps/loop_stopped() + . = ..() + movement_path = null + +/datum/move_loop/has_target/jps/Destroy() + avoid = null + on_finish_callbacks = null + return ..() + +///Tries to calculate a new path for this moveloop. +/datum/move_loop/has_target/jps/proc/recalculate_path() + if(!COOLDOWN_FINISHED(src, repath_cooldown)) + return + COOLDOWN_START(src, repath_cooldown, repath_delay) + if(SSpathfinder.pathfind(moving, target, max_path_length, minimum_distance, access, simulated_only, avoid, skip_first, diagonal_handling, on_finish = on_finish_callbacks)) + is_pathing = TRUE + SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_REPATH) + +///Called when a path has finished being created +/datum/move_loop/has_target/jps/proc/on_finish_pathing(list/path) + movement_path = path + is_pathing = FALSE + SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_FINISHED_PATHING, path) + +/datum/move_loop/has_target/jps/move() + if(!length(movement_path)) + if(is_pathing) + return MOVELOOP_NOT_READY + else + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + return MOVELOOP_FAILURE + + var/turf/next_step = movement_path[1] + var/atom/old_loc = moving.loc + moving.Move(next_step, get_dir(moving, next_step), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + . = (old_loc != moving?.loc) ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + + // this check if we're on exactly the next tile may be overly brittle for dense objects who may get bumped slightly + // to the side while moving but could maybe still follow their path without needing a whole new path + if(get_turf(moving) == next_step) + if(length(movement_path)) + movement_path.Cut(1,2) + else + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + return MOVELOOP_FAILURE + + +///Base class of move_to and move_away, deals with the distance and target aspect of things +/datum/move_loop/has_target/dist_bound + var/distance = 0 + +/datum/move_loop/has_target/dist_bound/setup(delay, timeout, atom/chasing, dist = 0) + . = ..() + if(!.) + return + distance = dist + +/datum/move_loop/has_target/dist_bound/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, dist = 0) + if(..() && distance == dist) + return TRUE + return FALSE + +///Returns FALSE if the movement should pause, TRUE otherwise +/datum/move_loop/has_target/dist_bound/proc/check_dist() + return FALSE + +/datum/move_loop/has_target/dist_bound/move() + if(!check_dist()) //If we're too close don't do the move + return MOVELOOP_FAILURE + return MOVELOOP_SUCCESS + + +/** + * Wrapper around walk_to() + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * min_dist - the closest we're allower to get to the target + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move_to(moving, chasing, min_dist, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/has_target/dist_bound/move_to, priority, flags, extra_info, delay, timeout, chasing, min_dist) + +///Wrapper around walk_to() +/datum/move_loop/has_target/dist_bound/move_to + +/datum/move_loop/has_target/dist_bound/move_to/check_dist() + return (get_dist(moving, target) > distance) //If you get too close, stop moving closer + +/datum/move_loop/has_target/dist_bound/move_to/move() + . = ..() + if(!.) + return + var/atom/old_loc = moving.loc + var/turf/next = get_step_to(moving, target) + moving.Move(next, get_dir(moving, next), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + +/** + * Wrapper around GLOB.move_manager.move_away() + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * max_dist - the furthest away from the target we're allowed to get + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move_away(moving, chasing, max_dist, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/has_target/dist_bound/move_away, priority, flags, extra_info, delay, timeout, chasing, max_dist) + +///Wrapper around GLOB.move_manager.move_away() +/datum/move_loop/has_target/dist_bound/move_away + +/datum/move_loop/has_target/dist_bound/move_away/check_dist() + return (get_dist(moving, target) < distance) //If you get too far out, stop moving away + +/datum/move_loop/has_target/dist_bound/move_away/move() + . = ..() + if(!.) + return + var/atom/old_loc = moving.loc + var/turf/next = get_step_away(moving, target) + moving.Move(next, get_dir(moving, next), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + + +/** + * Helper proc for the move_towards datum + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * home - Should we move towards the object at all times? Or launch towards them, but allow walls and such to take us off track. Defaults to FALSE + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to INFINITY + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move_towards(moving, chasing, delay, home, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/has_target/move_towards, priority, flags, extra_info, delay, timeout, chasing, home) + +/** + * Helper proc for homing onto something with move_towards + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * home - Should we move towards the object at all times? Or launch towards them, but allow walls and such to take us off track. Defaults to FALSE + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to INFINITY + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/home_onto(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) + return move_towards(moving, chasing, delay, TRUE, timeout, subsystem, priority, flags, extra_info) + +///Used as a alternative to GLOB.move_manager.home_onto +/datum/move_loop/has_target/move_towards + ///The turf we want to move into, used for course correction + var/turf/moving_towards + ///Should we try and stay on the path, or is deviation alright + var/home = FALSE + ///When this gets larger then 1 we move a turf + var/x_ticker = 0 + var/y_ticker = 0 + ///The rate at which we move, between 0 and 1 + var/x_rate = 1 + var/y_rate = 1 + //We store the signs of x and y seperately, because byond will round negative numbers down + //So doing all our operations with absolute values then multiplying them is easier + var/x_sign = 0 + var/y_sign = 0 + +/datum/move_loop/has_target/move_towards/setup(delay, timeout, atom/chasing, home = FALSE) + . = ..() + if(!.) + return FALSE + src.home = home + + if(home) + if(ismovable(target)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(update_slope)) //If it can move, update your slope when it does + RegisterSignal(moving, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + update_slope() + +/datum/move_loop/has_target/move_towards/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, home = FALSE) + if(..() && home == src.home) + return TRUE + return FALSE + +/datum/move_loop/has_target/move_towards/Destroy() + if(home) + if(ismovable(target)) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + if(moving) + UnregisterSignal(moving, COMSIG_MOVABLE_MOVED) + return ..() + +/datum/move_loop/has_target/move_towards/move() + //Move our tickers forward a step, we're guaranteed at least one step forward because of how the code is written + if(x_rate) //Did you know that rounding by 0 throws a divide by 0 error? + x_ticker = FLOOR(x_ticker + x_rate, x_rate) + if(y_rate) + y_ticker = FLOOR(y_ticker + y_rate, y_rate) + + var/x = moving.x + var/y = moving.y + var/z = moving.z + + moving_towards = locate(x + round(x_ticker) * x_sign, y + round(y_ticker) * y_sign, z) + //The tickers serve as good methods of tracking remainder + if(x_ticker >= 1) + x_ticker = MODULUS(x_ticker, 1) //I swear to god if you somehow go up by one then one in a tick I'm gonna go mad + if(y_ticker >= 1) + y_ticker = MODULUS(x_ticker, 1) + var/atom/old_loc = moving.loc + moving.Move(moving_towards, get_dir(moving, moving_towards), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + + //YOU FOUND THEM! GOOD JOB + if(home && get_turf(moving) == get_turf(target)) + x_rate = 0 + y_rate = 0 + return + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + +/datum/move_loop/has_target/move_towards/proc/handle_move(source, atom/OldLoc, Dir, Forced = FALSE) + SIGNAL_HANDLER + if(moving.loc == moving_towards && home) //If we didn't go where we should have, update slope to account for the deviation + update_slope() + +/datum/move_loop/has_target/move_towards/handle_no_target() + if(home) + return ..() + target = null + +/** + * Recalculates the slope between our object and the target, sets our rates to it + * + * The math below is reminiscent of something like y = mx + b + * Except we don't need to care about axis, since we do all our movement in steps of 1 + * Because of that all that matters is we only move one tile at a time + * So we take the smaller delta, divide it by the larger one, and get smaller step per large step + * Then we set the large step to 1, and we're done. This way we're guaranteed to never move more then a tile at once + * And we can have nice lines +**/ +/datum/move_loop/has_target/move_towards/proc/update_slope() + SIGNAL_HANDLER + + //You'll notice this is rise over run, except we flip the formula upside down depending on the larger number + //This is so we never move more then one tile at once + var/delta_y = target.y - moving.y + var/delta_x = target.x - moving.x + //It's more convienent to store delta x and y as absolute values + //and modify them right at the end then it is to deal with rounding errors + x_sign = (delta_x > 0) ? 1 : -1 + y_sign = (delta_y > 0) ? 1 : -1 + delta_x = abs(delta_x) + delta_y = abs(delta_y) + + if(delta_x >= delta_y) + if(delta_x == 0) //Just go up/down + x_rate = 0 + y_rate = 1 + return + x_rate = 1 + y_rate = delta_y / delta_x //rise over run, you know the deal + else + if(delta_y == 0) //Just go right/left + x_rate = 1 + y_rate = 0 + return + x_rate = delta_x / delta_y //Keep the larger step size at 1 + y_rate = 1 + +/** + * Wrapper for GLOB.move_manager.home_onto, not reccomended, as its movement ends up being a bit stilted + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * chasing - The atom we want to move towards + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move_towards_legacy(moving, chasing, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/has_target/move_towards_budget, priority, flags, extra_info, delay, timeout, chasing) + +///The actual implementation of GLOB.move_manager.home_onto() +/datum/move_loop/has_target/move_towards_budget + +/datum/move_loop/has_target/move_towards_budget/move() + var/turf/target_turf = get_step_towards(moving, target) + var/atom/old_loc = moving.loc + moving.Move(target_turf, get_dir(moving, target_turf), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE + +/** + * Assigns a target to a move loop that immediately freezes for a set duration of time. + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * halted_turf - The turf we want to freeze on. This should typically be the loc of moving. + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. This should be considered extremely non-optional as it will completely stun out the movement loop forever if unset. + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + */ +/datum/move_manager/proc/freeze(moving, halted_turf, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/freeze, priority, flags, extra_info, delay, timeout, halted_turf) + +/// As close as you can get to a "do-nothing" move loop, the pure intention of this is to absolutely resist all and any automated movement until the move loop times out. +/datum/move_loop/freeze + +/datum/move_loop/freeze/move() + return MOVELOOP_SUCCESS // it's successful because it's not moving. we autoclear outselves when `timeout` is reached + +/** + * Helper proc for the move_rand datum + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * directions - A list of acceptable directions to try and move in. Defaults to GLOB.alldirs + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move_rand(moving, directions, delay, timeout, subsystem, priority, flags, datum/extra_info) + if(!directions) + directions = GLOB.alldirs + return add_to_loop(moving, subsystem, /datum/move_loop/move_rand, priority, flags, extra_info, delay, timeout, directions) + +/** + * This isn't actually the same as walk_rand + * Because walk_rand is really more like walk_to_rand + * It appears to pick a spot outside of range, and move towards it, then pick a new spot, etc. + * I can't actually replicate this on our side, because of how bad our pathfinding is, and cause I'm not totally sure I know what it's doing. + * I can just implement a random-walk though +**/ +/datum/move_loop/move_rand + var/list/potential_directions + +/datum/move_loop/move_rand/setup(delay, timeout, list/directions) + . = ..() + if(!.) + return + potential_directions = directions + +/datum/move_loop/move_rand/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, list/directions) + if(..() && (length(potential_directions | directions) == length(potential_directions))) //i guess this could be useful if actually it really has yet to move + return MOVELOOP_SUCCESS + return MOVELOOP_FAILURE + +/datum/move_loop/move_rand/move() + var/list/potential_dirs = potential_directions.Copy() + while(potential_dirs.len) + var/testdir = pick(potential_dirs) + var/turf/moving_towards = get_step(moving, testdir) + var/atom/old_loc = moving.loc + moving.Move(moving_towards, testdir, FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + if(old_loc != moving?.loc) //If it worked, we're done + return MOVELOOP_SUCCESS + potential_dirs -= testdir + return MOVELOOP_FAILURE + +/** + * Wrapper around walk_rand(), doesn't actually result in a random walk, it's more like moving to random places in viewish + * + * Returns TRUE if the loop sucessfully started, or FALSE if it failed + * + * Arguments: + * moving - The atom we want to move + * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 + * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity + * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem + * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY + * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm + * +**/ +/datum/move_manager/proc/move_to_rand(moving, delay, timeout, subsystem, priority, flags, datum/extra_info) + return add_to_loop(moving, subsystem, /datum/move_loop/move_to_rand, priority, flags, extra_info, delay, timeout) + +///Wrapper around step_rand +/datum/move_loop/move_to_rand + +/datum/move_loop/move_to_rand/move() + var/atom/old_loc = moving.loc + var/turf/next = get_step_rand(moving) + moving.Move(next, get_dir(moving, next), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE diff --git a/code/datums/components/drift.dm b/code/datums/components/drift.dm new file mode 100644 index 000000000000..f4e22b9fe947 --- /dev/null +++ b/code/datums/components/drift.dm @@ -0,0 +1,194 @@ +///Component that handles drifting +///Manages a movement loop that actually does the legwork of moving someone +///Alongside dealing with the post movement input blocking required to make things look nice +/datum/component/drift + var/atom/inertia_last_loc + var/old_dir + var/datum/move_loop/move/drifting_loop + ///Should we ignore the next glide rate input we get? + ///This is to some extent a hack around the order of operations + ///Around COMSIG_MOVELOOP_POSTPROCESS. I'm sorry lad + var/ignore_next_glide = FALSE + ///Have we been delayed? IE: active, but not working right this second? + var/delayed = FALSE + var/block_inputs_until + +/// Accepts three args. The direction to drift in, if the drift is instant or not, and if it's not instant, the delay on the start +/datum/component/drift/Initialize(direction, instant = FALSE, start_delay = 0) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + . = ..() + + var/flags = MOVEMENT_LOOP_OUTSIDE_CONTROL + if(instant) + flags |= MOVEMENT_LOOP_START_FAST + var/atom/movable/movable_parent = parent + drifting_loop = GLOB.move_manager.move(moving = parent, direction = direction, delay = movable_parent.inertia_move_delay, subsystem = SSspacedrift, priority = MOVEMENT_SPACE_PRIORITY, flags = flags) + + if(!drifting_loop) //Really want to qdel here but can't + return COMPONENT_INCOMPATIBLE + + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_START, PROC_REF(drifting_start)) + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_STOP, PROC_REF(drifting_stop)) + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(before_move)) + RegisterSignal(drifting_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(after_move)) + RegisterSignal(drifting_loop, COMSIG_PARENT_QDELETING, PROC_REF(loop_death)) + RegisterSignal(movable_parent, COMSIG_MOVABLE_NEWTONIAN_MOVE, PROC_REF(newtonian_impulse)) + if(drifting_loop.status & MOVELOOP_STATUS_RUNNING) + drifting_start(drifting_loop) // There's a good chance it'll autostart, gotta catch that + + var/visual_delay = movable_parent.inertia_move_delay + + // Start delay is essentially a more granular version of instant + // Isn't used in the standard case, just for things that have odd wants + if(!instant && start_delay) + drifting_loop.pause_for(start_delay) + visual_delay = start_delay + + apply_initial_visuals(visual_delay) + +/datum/component/drift/Destroy() + inertia_last_loc = null + if(!QDELETED(drifting_loop)) + qdel(drifting_loop) + drifting_loop = null + var/atom/movable/movable_parent = parent + movable_parent.inertia_moving = FALSE + return ..() + +/datum/component/drift/proc/apply_initial_visuals(visual_delay) + // If something "somewhere" doesn't want us to apply our glidesize delays, don't + if(SEND_SIGNAL(parent, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) & DRIFT_VISUAL_FAILED) + return + + // Ignore the next glide because it's literally just us + ignore_next_glide = TRUE + var/atom/movable/movable_parent = parent + movable_parent.set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(visual_delay, SSspacedrift.visual_delay)) + if(ismob(parent)) + var/mob/mob_parent = parent + //Ok this is slightly weird, but basically, we need to force the client to glide at our rate + //Make sure moving into a space move looks like a space move essentially + //There is an inbuilt assumption that gliding will be added as a part of a move call, but eh + //It's ok if it's not, it's just important if it is. + mob_parent.client?.visual_delay = MOVEMENT_ADJUSTED_GLIDE_SIZE(visual_delay, SSspacedrift.visual_delay) + +/datum/component/drift/proc/newtonian_impulse(datum/source, inertia_direction) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + inertia_last_loc = movable_parent.loc + if(drifting_loop) + drifting_loop.direction = inertia_direction + if(!inertia_direction) + qdel(src) + return COMPONENT_MOVABLE_NEWTONIAN_BLOCK + +/datum/component/drift/proc/drifting_start() + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + inertia_last_loc = movable_parent.loc + RegisterSignal(movable_parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + // We will use glide size to intuit how long to delay our loop's next move for + // This way you can't ride two movements at once while drifting, since that'd be dumb as fuck + RegisterSignal(movable_parent, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, PROC_REF(handle_glidesize_update)) + // If you stop pulling something mid drift, I want it to retain that momentum + RegisterSignal(movable_parent, COMSIG_ATOM_NO_LONGER_PULLING, PROC_REF(stopped_pulling)) + +/datum/component/drift/proc/drifting_stop() + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + movable_parent.inertia_moving = FALSE + ignore_next_glide = FALSE + UnregisterSignal(movable_parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, COMSIG_ATOM_NO_LONGER_PULLING)) + +/datum/component/drift/proc/before_move(datum/source) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + movable_parent.inertia_moving = TRUE + old_dir = movable_parent.dir + delayed = FALSE + +/datum/component/drift/proc/after_move(datum/source, result, visual_delay) + SIGNAL_HANDLER + if(result == MOVELOOP_FAILURE) + qdel(src) + return + + var/atom/movable/movable_parent = parent + movable_parent.setDir(old_dir) + movable_parent.inertia_moving = FALSE + if(movable_parent.Process_Spacemove(drifting_loop.direction, continuous_move = TRUE)) + glide_to_halt(visual_delay) + return + + inertia_last_loc = movable_parent.loc + ignore_next_glide = TRUE + +/datum/component/drift/proc/loop_death(datum/source) + SIGNAL_HANDLER + drifting_loop = null + UnregisterSignal(parent, COMSIG_MOVABLE_NEWTONIAN_MOVE) // We won't block a component from replacing us anymore + +/datum/component/drift/proc/handle_move(datum/source, old_loc) + SIGNAL_HANDLER + // This can happen, because signals once sent cannot be stopped + if(QDELETED(src)) + return + var/atom/movable/movable_parent = parent + if(!isturf(movable_parent.loc)) + qdel(src) + return + if(movable_parent.inertia_moving) + return + if(!movable_parent.Process_Spacemove(drifting_loop.direction, continuous_move = TRUE)) + return + qdel(src) + +/// We're going to take the passed in glide size +/// and use it to manually delay our loop for that period +/// to allow the other movement to complete +/datum/component/drift/proc/handle_glidesize_update(datum/source, old_glide_size) + SIGNAL_HANDLER + // If we aren't drifting, or this is us, fuck off + var/atom/movable/movable_parent = parent + if(!drifting_loop || movable_parent.inertia_moving) + return + // If we are drifting, but this set came from the moveloop itself, drop the input + // I'm sorry man + if(ignore_next_glide) + ignore_next_glide = FALSE + return + var/glide_delay = round(world.icon_size / movable_parent.glide_size, 1) * world.tick_lag + drifting_loop.pause_for(glide_delay) + delayed = TRUE + +/// If we're pulling something and stop, we want it to continue at our rate and such +/datum/component/drift/proc/stopped_pulling(datum/source, atom/movable/was_pulling) + SIGNAL_HANDLER + // This does mean it falls very slightly behind, but otherwise they'll potentially run into us + var/next_move_in = drifting_loop.timer - world.time + world.tick_lag + was_pulling.newtonian_move(drifting_loop.direction, start_delay = next_move_in) + +/datum/component/drift/proc/glide_to_halt(glide_for) + if(!ismob(parent)) + qdel(src) + return + + var/mob/mob_parent = parent + var/client/our_client = mob_parent.client + // If we're not active, don't do the glide because it'll look dumb as fuck + if(!our_client || delayed) + qdel(src) + return + + block_inputs_until = world.time + glide_for + QDEL_IN(src, glide_for + 1) + qdel(drifting_loop) + RegisterSignal(parent, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(allow_final_movement)) + +/datum/component/drift/proc/allow_final_movement(datum/source) + // Some things want to allow movement out of spacedrift, we should let them + if(SEND_SIGNAL(parent, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) & DRIFT_ALLOW_INPUT) + return + if(world.time < block_inputs_until) + return COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE diff --git a/code/datums/components/jetpack_component.dm b/code/datums/components/jetpack_component.dm new file mode 100644 index 000000000000..c82ce4fda72b --- /dev/null +++ b/code/datums/components/jetpack_component.dm @@ -0,0 +1,152 @@ +// Welcome to the jetpack component +// Apply this to something when you want it to be "like a jetpack" +// So propulsion through space on move, that sort of thing +/datum/component/jetpack + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Checks to ensure if we can move & if we can activate + var/datum/callback/check_on_move + /// If we should stabilize ourselves when not drifting + var/stabilize = FALSE + /// The signal we listen for as an activation + var/activation_signal + /// The signal we listen for as a de-activation + var/deactivation_signal + /// The return flag our parent expects for a failed activation + var/return_flag + /// The effect system for the jet pack trail + var/datum/effect_system/trail_follow/trail + /// The typepath to instansiate our trail as, when we need it + var/effect_type + +/** + * Arguments: + * * stabilize - If we should drift when we finish moving, or sit stable in space] + * * activation_signal - Signal we activate on + * * deactivation_signal - Signal we deactivate on + * * return_flag - Flag to return if activation fails + * * check_on_move - Callback we call each time we attempt a move, we expect it to retun true if the move is ok, false otherwise. It expects an arg, TRUE if fuel should be consumed, FALSE othewise + * * effect_type - Type of trail_follow to spawn + */ +/datum/component/jetpack/Initialize(stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) + . = ..() + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + if(!activation_signal) // Can't activate? go away + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, activation_signal, PROC_REF(activate)) + if(deactivation_signal) + RegisterSignal(parent, deactivation_signal, PROC_REF(deactivate)) + + src.stabilize = stabilize + src.check_on_move = check_on_move + src.activation_signal = activation_signal + src.deactivation_signal = deactivation_signal + src.return_flag = return_flag + src.effect_type = effect_type + +/datum/component/jetpack/InheritComponent(datum/component/component, original, stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type) + UnregisterSignal(parent, src.activation_signal) + if(src.deactivation_signal) + UnregisterSignal(parent, src.deactivation_signal) + RegisterSignal(parent, activation_signal, PROC_REF(activate)) + if(deactivation_signal) + RegisterSignal(parent, deactivation_signal, PROC_REF(deactivate)) + + src.stabilize = stabilize + src.check_on_move = check_on_move + src.activation_signal = activation_signal + src.deactivation_signal = deactivation_signal + src.return_flag = return_flag + src.effect_type = effect_type + + if(trail && trail.effect_type != effect_type) + setup_trail(trail.holder) + +/datum/component/jetpack/Destroy(force) + if(trail) + QDEL_NULL(trail) + check_on_move = null + return ..() + +/datum/component/jetpack/proc/setup_trail(mob/user) + if(trail) + QDEL_NULL(trail) + + trail = new effect_type + trail.auto_process = FALSE + trail.set_up(user) + trail.start() + +/datum/component/jetpack/proc/activate(datum/source, mob/user) + SIGNAL_HANDLER + + if(!check_on_move.Invoke(TRUE)) + return return_flag + + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) + RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react)) + RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) + RegisterSignal(user, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT, PROC_REF(block_starting_visuals)) + RegisterSignal(user, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT, PROC_REF(ignore_ending_block)) + + setup_trail(user) + +/datum/component/jetpack/proc/deactivate(datum/source, mob/user) + SIGNAL_HANDLER + + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(user, COMSIG_MOVABLE_SPACEMOVE) + UnregisterSignal(user, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT) + UnregisterSignal(user, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT) + + if(trail) + QDEL_NULL(trail) + +/datum/component/jetpack/proc/move_react(mob/user) + SIGNAL_HANDLER + if(!user || !user.client)//Don't allow jet self using + return + if(!isturf(user.loc))//You can't use jet in nowhere or from mecha/closet + return + if(user.mob_has_gravity() || user.buckled)//You don't want use jet in gravity or while buckled. + return + if(user.pulledby)//You can't use jet if someone pull you + return + if(user.throwing)//You can't use jet if you thrown + return + if(user.client.calculate_move_dir())//You use jet when press keys. yes. + thrust() + +/datum/component/jetpack/proc/pre_move_react(mob/user) + SIGNAL_HANDLER + if(!trail) + return FALSE + trail.oldposition = get_turf(user) + +/datum/component/jetpack/proc/spacemove_react(mob/user, movement_dir, continuous_move) + SIGNAL_HANDLER + if(!continuous_move && movement_dir) + return COMSIG_MOVABLE_STOP_SPACEMOVE + // Check if we have the fuel to stop this. Do NOT cosume any fuel, just check + // This is done because things other then us can use our fuel + if(stabilize && check_on_move.Invoke(FALSE)) + return COMSIG_MOVABLE_STOP_SPACEMOVE + +/// Returns true if the thrust went well, false otherwise +/datum/component/jetpack/proc/thrust() + if(!check_on_move.Invoke(TRUE)) + return FALSE + trail.generate_effect() + return TRUE + +/// Basically, tell the drift component not to do its starting visuals, because they look dumb for us +/datum/component/jetpack/proc/block_starting_visuals(datum/source) + SIGNAL_HANDLER + return DRIFT_VISUAL_FAILED + +/// If we're on, don't let the drift component block movements at the end since we can speed +/datum/component/jetpack/proc/ignore_ending_block(datum/source) + SIGNAL_HANDLER + return DRIFT_ALLOW_INPUT diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 0f5825f1b398..28fa51947eef 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -1,5 +1,8 @@ // For any /obj/tgvehicle's that can be ridden +/// For making timers not accidentally skip an extra tick. +#define EPSILON (world.tick_lag * 0.1) + /datum/component/riding/vehicle/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = (RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS), potion_boost = FALSE) if(!istgvehicle(parent)) return COMPONENT_INCOMPATIBLE @@ -70,12 +73,17 @@ if(!turf_check(next, current)) to_chat(user, "[movable_parent] cannot go onto [next]!") return - if(!Process_Spacemove(direction) || !isturf(movable_parent.loc)) + if(GLOB.move_manager.processing_on(user, SSspacedrift) || !isturf(movable_parent.loc)) return step(movable_parent, direction) last_move_diagonal = ((direction & (direction - 1)) && (movable_parent.loc == next)) - COOLDOWN_START(src, vehicle_move_cooldown, (last_move_diagonal ? 2 : 1) * vehicle_move_delay) + if(last_move_diagonal) + movable_parent.set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(vehicle_move_delay, 1) * 0.5) + COOLDOWN_START(src, vehicle_move_cooldown, 2 * vehicle_move_delay - EPSILON) + else + movable_parent.set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(vehicle_move_delay, 1)) + COOLDOWN_START(src, vehicle_move_cooldown, vehicle_move_delay - EPSILON) if(QDELETED(src)) return @@ -187,3 +195,5 @@ override_allow_spacemove = TRUE return override_allow_spacemove = FALSE + +#undef EPSILON diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 4ad8faa83d65..59e32cfedd70 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -58,6 +58,9 @@ )) /datum/component/scope/process() + if(!tracker) + STOP_PROCESSING(SSprojectiles, src) + return var/mob/user_mob = tracker.owner var/client/user_client = user_mob.client if(!user_client) diff --git a/code/datums/components/zombie_regen.dm b/code/datums/components/zombie_regen.dm index 546b98838fca..da04e6fc21c8 100644 --- a/code/datums/components/zombie_regen.dm +++ b/code/datums/components/zombie_regen.dm @@ -67,7 +67,6 @@ zomboid.cure_nearsighted() zomboid.CureMute() zomboid.CureDeaf() - zomboid.CureTourettes() zomboid.CureEpilepsy() zomboid.CureCoughing() zomboid.CureNervous() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e0825b725e7d..862cd1b26b90 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -261,6 +261,15 @@ font-family: "Courier New", monospace; font-size: 8pt; } + .var { + display: none; + } + .var.visible { + display: list-item; + } + .var.selected { + background-color: "#ffee88"; + } @@ -301,13 +310,15 @@ { try{ var li = lis\[i\]; - if(li.style.backgroundColor == "#ffee88") + if(li.className == "var visible" && li.style.backgroundColor == "#ffee88") { - if((i-1) >= 0){ - var li_new = lis\[i-1\]; - li.style.backgroundColor = "white"; - li_new.style.backgroundColor = "#ffee88"; - return + for(var j = i-1; j >= 0; --j) { + var li_new = lis\[j\]; + if(li_new.className == "var visible") { + li.style.backgroundColor = "white"; + li_new.style.backgroundColor = "#ffee88"; + return + } } } }catch(err) { } @@ -321,13 +332,15 @@ { try{ var li = lis\[i\]; - if(li.style.backgroundColor == "#ffee88") + if(li.className == "var visible" && li.style.backgroundColor == "#ffee88") { - if((i+1) < lis.length){ - var li_new = lis\[i+1\]; - li.style.backgroundColor = "white"; - li_new.style.backgroundColor = "#ffee88"; - return + for(var j = i+1; j < lis.length; ++j) { + var li_new = lis\[j\]; + if(li_new.className == "var visible") { + li.style.backgroundColor = "white"; + li_new.style.backgroundColor = "#ffee88"; + return + } } } }catch(err) { } @@ -335,38 +348,26 @@ return } - //This part here resets everything to how it was at the start so the filter is applied to the complete list. Screw efficiency, it's client-side anyway and it only looks through 200 or so variables at maximum anyway (mobs). - if(complete_list != null && complete_list != ""){ - var vars_ol1 = document.getElementById("vars"); - vars_ol1.innerHTML = complete_list - } document.cookie="[refid][cookieoffset]search="+encodeURIComponent(filter); - if(filter == ""){ - return; - }else{ - var vars_ol = document.getElementById('vars'); - var lis = vars_ol.getElementsByTagName("li"); - for(var i = 0; i < lis.length; ++i) - { - try{ - var li = lis\[i\]; - if(li.innerText.toLowerCase().indexOf(filter) == -1) - { - vars_ol.removeChild(li); - i--; - } - }catch(err) { } - } - } - var lis_new = vars_ol.getElementsByTagName("li"); - for(var j = 0; j < lis_new.length; ++j) + var vars_ol = document.getElementById('vars'); + var lis = vars_ol.getElementsByTagName("li"); + var first = true; + for(var i = 0; i < lis.length; ++i) { - var li1 = lis\[j\]; - if(j == 0){ - li1.style.backgroundColor = "#ffee88"; - }else{ - li1.style.backgroundColor = "white"; - } + try{ + var li = lis\[i\]; + li.style.backgroundColor = "white"; + if(li.innerText.toLowerCase().indexOf(filter) == -1) + { + li.className = "var"; + } else { + if(first) { + li.style.backgroundColor = "#ffee88"; + first = false; + } + li.className = "var visible"; + } + }catch(err) { } } } function selectTextField() { @@ -481,9 +482,9 @@ name = debug_list[name] // name is really the index until this line else value = debug_list[name] - header = "
  • (E) (C) (-) " + header = "
  • (E) (C) (-) " else - header = "
  • (E) (C) (M) " + header = "
  • (E) (C) (M) " else header = "
  • " @@ -491,6 +492,9 @@ if(isnull(value)) item = "[VV_HTML_ENCODE(name)] = null" + else if(is_color_text(value)) + item = "[VV_HTML_ENCODE(name)] =   \"[value]\"" + else if(istext(value)) item = "[VV_HTML_ENCODE(name)] = \"[VV_HTML_ENCODE(value)]\"" @@ -786,7 +790,7 @@ to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - var/haltype = input(usr, "Select the hallucination type:", "Hallucinate") as null|anything in (subtypesof(/obj/effect/hallucination) + subtypesof(/datum/hallucination_manager)) + var/haltype = tgui_input_list(usr, "Select Hallucination Type", "Hallucinate", (subtypesof(/obj/effect/hallucination) + subtypesof(/datum/hallucination_manager))) if(!haltype) return C.invoke_hallucination(haltype) diff --git a/code/datums/diseases/zombie_virus.dm b/code/datums/diseases/zombie_virus.dm index 37b96d68420f..4f41eb8483d6 100644 --- a/code/datums/diseases/zombie_virus.dm +++ b/code/datums/diseases/zombie_virus.dm @@ -29,6 +29,8 @@ for(var/obj/item/organ/limb as anything in H.bodyparts) if(!(limb.status & ORGAN_DEAD) && !limb.is_robotic()) limb.necrotize(TRUE, TRUE) + if(!HAS_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN)) + ADD_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN, ZOMBIE_TRAIT) if(!..()) return FALSE @@ -105,11 +107,15 @@ for(var/obj/item/organ/limb as anything in H.bodyparts) if(!(limb.status & ORGAN_DEAD) && !limb.vital && !limb.is_robotic()) limb.necrotize() + if(!HAS_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN)) + ADD_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN, ZOMBIE_TRAIT) return FALSE for(var/obj/item/organ/limb as anything in H.bodyparts) if(!(limb.status & ORGAN_DEAD) && !limb.is_robotic()) limb.necrotize(FALSE, TRUE) + if(!HAS_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN)) + ADD_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN, ZOMBIE_TRAIT) return FALSE if(!HAS_TRAIT(affected_mob, TRAIT_I_WANT_BRAINS)) @@ -148,6 +154,10 @@ /datum/disease/zombie/cure() affected_mob.mind?.remove_antag_datum(/datum/antagonist/zombie) REMOVE_TRAIT(affected_mob, TRAIT_I_WANT_BRAINS, ZOMBIE_TRAIT) + var/mob/living/carbon/human/H = affected_mob + for(var/obj/item/organ/limb as anything in H.bodyparts) + if(HAS_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN)) + REMOVE_TRAIT(limb, TRAIT_I_WANT_BRAINS_ORGAN, ZOMBIE_TRAIT) affected_mob.DeleteComponent(/datum/component/zombie_regen) affected_mob.med_hud_set_health() affected_mob.med_hud_set_status() diff --git a/code/datums/move_manager.dm b/code/datums/move_manager.dm new file mode 100644 index 000000000000..23ddcbecdb70 --- /dev/null +++ b/code/datums/move_manager.dm @@ -0,0 +1,173 @@ +/** + * Acts as a namespace for movement packet/type related procs + * + * Exists to provide an in code implementation of movement looping + * Replaces things like walk() or walk_to(), among others + * + * Because we're doing things in engine, we have a lot more control over how different operations are performed + * We also get more say in when things happen, so we can subject movements to the whims of the master controller + * Rather then using a fuck ton of cpu just moving mobs or meteors + * + * The goal is to keep the loops themselves reasonably barebone, and implement more advanced behavior and control via the signals + * + * This may be bypassed in cases where snowflakes are nessesary, or where performance is important. S not a hard and fast thing + * + * Every atom can have a movement packet, which contains information and behavior about currently active loops, and queuing info + * Loops control how movement actually happens. So there's a "move in this direction" loop, a "move randomly" loop + * + * You can find the logic for this control in this file + * + * Specifics of how different loops operate can be found in the movement_types.dm file, alongside the [add to loop][/datum/move_manager/proc/add_to_loop] helper procs that use them + * +**/ +/datum/move_manager + +GLOBAL_DATUM_INIT(move_manager, /datum/move_manager, new) + +///Adds a movable thing to a movement subsystem. Returns TRUE if it all worked, FALSE if it failed somehow +/datum/move_manager/proc/add_to_loop(atom/movable/thing_to_add, datum/controller/subsystem/movement/subsystem = SSmovement, datum/move_loop/loop_type, priority = MOVEMENT_DEFAULT_PRIORITY, flags, datum/extra_info) + var/datum/movement_packet/our_data = thing_to_add.move_packet + if(!our_data) + our_data = new(thing_to_add) + + var/list/arguments = args.Copy(2) //Drop the atom, since the movement packet already knows about it + return our_data.add_loop(arglist(arguments)) + +///Returns the subsystem's loop if we're processing on it, null otherwise +/datum/move_manager/proc/processing_on(atom/movable/packet_owner, datum/controller/subsystem/movement/subsystem) + var/datum/movement_packet/packet = packet_owner.move_packet + if(!packet) + return + var/datum/move_loop/linked_loop = packet.existing_loops[subsystem] + if(!linked_loop) + return + if(linked_loop.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) + return linked_loop + if(linked_loop != packet.running_loop) + return + return linked_loop + +///A packet of information that describes the current state of a moving object +/datum/movement_packet + ///Our parent atom + var/atom/movable/parent + ///The move loop that's currently running, excluding those that ignore priority. + var/datum/move_loop/running_loop + /** + * Flags passed from the move loop before it calls move() and unset right after. + * Allows for properties of a move loop to be easily checked by mechanics outside of it. + * Having this a bitfield rather than a type var means we don't get screwed over + * if the move loop gets deleted mid-move, FYI. + */ + var/processing_move_loop_flags = NONE + ///Assoc list of subsystems -> loop datum. Only one datum is allowed per subsystem + var/list/existing_loops = list() + +/datum/movement_packet/New(atom/movable/parent) + src.parent = parent + parent.move_packet = src + +/datum/movement_packet/Destroy(force) + parent.move_packet = null + parent = null + for(var/datum/controller/subsystem/processor as anything in existing_loops) + var/datum/move_loop/loop = existing_loops[processor] + if(QDELETED(loop)) + continue + qdel(loop) + existing_loops.Cut() + existing_loops = null //Catch anyone modifying this post del + return ..() + +///Adds a loop to our parent. Returns the created loop if a success, null otherwise +/datum/movement_packet/proc/add_loop(datum/controller/subsystem/movement/subsystem, datum/move_loop/loop_type, priority, flags, datum/extra_info) + var/datum/move_loop/existing_loop = existing_loops[subsystem] + + if(existing_loop && existing_loop.priority > priority) + if(!(existing_loop.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) && !(flags & MOVEMENT_LOOP_IGNORE_PRIORITY)) + return //Give up + + if(existing_loop?.compare_loops(arglist(args.Copy(2)))) + return //it already exists stop trying to make the same moveloop + + var/datum/move_loop/new_loop = new loop_type(src, subsystem, parent, priority, flags, extra_info) //Pass the mob to move and ourselves in via new + var/list/arguments = args.Copy(6) //Just send the args we've not already dealt with + + var/worked_out = new_loop.setup(arglist(arguments)) //Here goes the rest + if(!worked_out) + qdel(new_loop) + return + + existing_loops[subsystem] = new_loop + if(existing_loop) + qdel(existing_loop) //We need to do this here because otherwise the packet would think it was empty, and self destruct + contest_running_loop(new_loop) + return new_loop + +///Attempts to contest the current running move loop. Returns TRUE if the loop is active, FALSE otherwise +/datum/movement_packet/proc/contest_running_loop(datum/move_loop/contestant) + var/datum/controller/subsystem/movement/contesting_subsystem = contestant.controller + + if(contestant.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) + contesting_subsystem.add_loop(contestant) + return TRUE + if(!running_loop) + running_loop = contestant + contesting_subsystem.add_loop(running_loop) + return TRUE + if(running_loop.priority > contestant.priority) + return FALSE + + var/datum/controller/subsystem/movement/current_subsystem = running_loop.controller + + var/current_running_loop = running_loop + running_loop = contestant + current_subsystem.remove_loop(current_running_loop) + if(running_loop != contestant) // A signal registrant could have messed with things + return FALSE + contesting_subsystem.add_loop(contestant) + return TRUE + +///Tries to figure out the current favorite loop to run. More complex then just deciding between two different loops, assumes no running loop currently exists +/datum/movement_packet/proc/decide_on_running_loop() + if(running_loop) + return + if(!length(existing_loops)) //Die + qdel(src) + return + var/datum/move_loop/favorite + for(var/datum/controller/subsystem/movement/owner as anything in existing_loops) + var/datum/move_loop/checking = existing_loops[owner] + if(checking.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) + continue + if(favorite && favorite.priority > checking.priority) + continue + favorite = checking + + if(!favorite) //This isn't an error state, since some loops ignore the concept of a running loop + return + + var/datum/controller/subsystem/movement/favorite_subsystem = favorite.controller + + running_loop = favorite + favorite_subsystem.add_loop(running_loop) + +/datum/movement_packet/proc/remove_loop(datum/controller/subsystem/movement/remove_from, datum/move_loop/loop_to_remove) + if(loop_to_remove == running_loop) + running_loop = null + remove_from.remove_loop(loop_to_remove) + if(loop_to_remove.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) + remove_from.remove_loop(loop_to_remove) + if(QDELETED(src)) + return + if(existing_loops[remove_from] == loop_to_remove) + existing_loops -= remove_from + decide_on_running_loop() + return + +/datum/movement_packet/proc/remove_subsystem(datum/controller/subsystem/movement/remove) + var/datum/move_loop/our_loop = existing_loops[remove] + if(!our_loop) + return FALSE + qdel(our_loop) + return TRUE diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index bb24e3affe33..06163845e267 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -1607,7 +1607,8 @@ H.update_fhair() H.update_dna() - H.wear_mask.adjustmask(H) // push it back on the head + var/obj/item/clothing/mask/worn_mask = H.wear_mask + worn_mask.adjustmask(H) // push it back on the head equip_item(H, /obj/item/clothing/mask/cigarette/cigar, ITEM_SLOT_MASK) // get them their cigar if(istype(H.glasses, /obj/item/clothing/glasses)) // this is gonna be always true var/obj/item/clothing/glasses/glassass = H.glasses diff --git a/code/datums/outfits/outfit_debug.dm b/code/datums/outfits/outfit_debug.dm index 559c9b8b9a21..f4d2d5ae57f4 100644 --- a/code/datums/outfits/outfit_debug.dm +++ b/code/datums/outfits/outfit_debug.dm @@ -272,6 +272,12 @@ /obj/item/storage/box/debug/debugtools name = "debug tools" +/obj/item/paper/debug_research + name = "debug reseach notes" + desc = "Your brain is melting just from looking at this endless knowledge." + info = "Information written here is beyond your understanding" + origin_tech = "materials=10;engineering=10;plasmatech=10;powerstorage=10;bluespace=10;biotech=10;combat=10;magnets=10;programming=10;toxins=10;syndicate=10;abductor=10" + /obj/item/storage/box/debug/debugtools/populate_contents() new /obj/item/card/emag(src) new /obj/item/rcd/combat/admin(src) @@ -284,6 +290,7 @@ new /obj/item/storage/box/debug/misc_debug(src) new /obj/item/storage/box/centcomofficer(src) new /obj/item/radio/uplink/admin(src) + new /obj/item/paper/debug_research(src) /obj/item/storage/box/debug/material name = "box of materials" diff --git a/code/datums/ruins/space_ruins.dm b/code/datums/ruins/space_ruins.dm index 6f6d1e35a839..fe924bec1cdd 100644 --- a/code/datums/ruins/space_ruins.dm +++ b/code/datums/ruins/space_ruins.dm @@ -225,7 +225,6 @@ name = "Suspicious Supply Depot" description = "A syndicate supply depot, heavily stocked, but heavily guarded with an assortment of shields, sentry bots, armed operatives and more." allow_duplicates = FALSE // One of these is enough - always_place = TRUE // This is on the always spawn list because of the shielding chance /datum/map_template/ruin/space/ussp_tele id = "ussp_tele" diff --git a/code/datums/spell_targeting/cone.dm b/code/datums/spell_targeting/cone.dm new file mode 100644 index 000000000000..f8f852da5cf5 --- /dev/null +++ b/code/datums/spell_targeting/cone.dm @@ -0,0 +1,74 @@ +/datum/spell_targeting/cone + max_targets = INFINITY + use_intercept_click = TRUE + /// This controls how many levels the cone has. Increase this value to make a bigger cone. + var/cone_levels = 3 + /// This value determines if the cone penetrates walls. + var/respect_density = FALSE + +/datum/spell_targeting/cone/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) + var/list/turfs_to_return = list() + var/turf/turf_to_use = get_turf(user) + var/turf/left_turf + var/turf/right_turf + var/dir_to_use = user.dir + var/right_dir + var/left_dir + switch(dir_to_use) + if(NORTH) + left_dir = WEST + right_dir = EAST + if(SOUTH) + left_dir = EAST + right_dir = WEST + if(EAST) + left_dir = NORTH + right_dir = SOUTH + if(WEST) + left_dir = SOUTH + right_dir = NORTH + + // Go though every level of the cone levels and generate the cone. + for(var/level in 1 to cone_levels) + var/list/level_turfs = list() + // Our center turf always exists, it's straight ahead of the caster. + turf_to_use = get_step(turf_to_use, dir_to_use) + level_turfs += turf_to_use + // Level 1 only ever has 1 turf, it's a cone. + if(level != 1) + var/level_width_in_each_direction = round((calculate_cone_shape(level) - 1) / 2) + left_turf = turf_to_use + right_turf = turf_to_use + // Check turfs to the left... + for(var/left_of_center in 1 to level_width_in_each_direction) + if(respect_density && left_turf.density) + break + left_turf = get_step(left_turf, left_dir) + level_turfs += left_turf + // And turfs to the right. + for(var/right_of_enter in 1 to level_width_in_each_direction) + if(respect_density && right_turf.density) + break + right_turf = get_step(right_turf, right_dir) + level_turfs += right_turf + // Add the list of all turfs on this level to the turfs to return + turfs_to_return += list(level_turfs) + + // If we're at the last level, we're done + if(level == cone_levels) + break + // But if we're not at the last level, we should check that we can keep going + if(respect_density && turf_to_use.density) + break + + return turfs_to_return + +/** + * Adjusts the width of the cone at the passed level. + * This is never called on the first level of the cone (level 1 is always 1 width) + * + * Return a number - the TOTAL width of the cone at the passed level. + */ +/datum/spell_targeting/cone/proc/calculate_cone_shape(current_level) + // Default formula: (1 (innate) -> 3 -> 5 -> 5 -> 7 -> 7 -> 9 -> 9 -> ...) + return current_level + (current_level % 2) + 1 diff --git a/code/datums/spells/cones/cone_spell.dm b/code/datums/spells/cones/cone_spell.dm new file mode 100644 index 000000000000..7c5d15dd255c --- /dev/null +++ b/code/datums/spells/cones/cone_spell.dm @@ -0,0 +1,44 @@ +/datum/spell/cone + +/datum/spell/cone/create_new_targeting() + return new /datum/spell_targeting/cone + +/datum/spell/cone/cast(list/targets, mob/user) + var/level_counter = 1 + for(var/list/turf_list in targets) + do_cone_effects(turf_list, user, level_counter) + level_counter++ + +/datum/spell/cone/proc/do_cone_effects(list/targets, mob/user, level) + for(var/turf/target_turf as anything in targets) + if(QDELETED(target_turf)) //if turf is no longer there + continue + + do_turf_cone_effect(target_turf, user, level) + if(iswallturf(target_turf)) + continue + + for(var/atom/movable/movable_content as anything in target_turf) + if(isobj(movable_content)) + do_obj_cone_effect(movable_content, user, level) + else if(isliving(movable_content)) + do_mob_cone_effect(movable_content, user, level) + +/datum/spell/cone/proc/do_turf_cone_effect(turf/target_turf, mob/caster, level) + return + +/datum/spell/cone/proc/do_obj_cone_effect(obj/target_obj, mob/caster, level) + return + +/datum/spell/cone/proc/do_mob_cone_effect(mob/target_mob, mob/caster, level) + return + +/datum/spell/cone/staggered + /// The delay between each cone level triggering. + var/delay_between_level = 0.2 SECONDS + +/datum/spell/cone/staggered/cast(list/targets, mob/user) + var/level_counter = 0 + for(var/list/turf_list in targets) + level_counter++ + addtimer(CALLBACK(src, PROC_REF(do_cone_effects), turf_list, user, level_counter), delay_between_level * level_counter) diff --git a/code/datums/spell.dm b/code/datums/spells/spell_base.dm similarity index 100% rename from code/datums/spell.dm rename to code/datums/spells/spell_base.dm diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 037bc69cca02..c55de30be0b6 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -1,7 +1,7 @@ /datum/station_trait/carp_infestation name = "Carp infestation" trait_type = STATION_TRAIT_NEGATIVE - weight = 5 + weight = 3 show_in_report = TRUE report_message = "Dangerous fauna is present in the area of this station." diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 54e94de1030b..cfc7910f17e1 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -342,11 +342,13 @@ ADD_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath") var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] H.add_hud_to(owner) + owner.permanent_huds |= H return ..() /datum/status_effect/hippocratic_oath/on_remove() REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath") var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + owner.permanent_huds ^= H H.remove_hud_from(owner) /datum/status_effect/hippocratic_oath/tick() diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 3e4235a448b2..982dc7564042 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -140,6 +140,29 @@ /datum/status_effect/high_five/dap/get_missed_message() return "sadly can't find anybody to give daps to, and daps [owner.p_themselves()]. Shameful." +/datum/status_effect/high_five/offering_eftpos + id = "offering_eftpos" + request = "holds out an EFTPOS device." + item_path = /obj/item/eftpos + +/datum/status_effect/high_five/offering_eftpos/get_missed_message() + return "pulls back the EFTPOS device." + +/datum/status_effect/high_five/offering_eftpos/on_apply() + owner.custom_emote(EMOTE_VISIBLE, request) + owner.create_point_bubble_from_path(item_path, FALSE) + RegisterSignal(owner, COMSIG_ATOM_RANGED_ATTACKED, PROC_REF(on_ranged_attack)) + return TRUE + +/datum/status_effect/high_five/offering_eftpos/on_remove() + UnregisterSignal(owner, COMSIG_ATOM_RANGED_ATTACKED) + +/datum/status_effect/high_five/offering_eftpos/proc/on_ranged_attack(mob/living/me, mob/living/carbon/human/attacker) + SIGNAL_HANDLER // COMSIG_ATOM_RANGED_ATTACKED + if(get_dist(me, attacker) <= 2) + to_chat(attacker, "You need to have your ID in hand to scan it!") + return COMPONENT_CANCEL_ATTACK_CHAIN + /datum/status_effect/high_five/handshake id = "handshake" critical_success = "give each other an EPIC handshake!" @@ -328,7 +351,7 @@ for(var/mob/living/L in range(10, our_scope.given_turf)) if(locks >= LWAP_LOCK_CAP) return - if(L == owner || L.stat == DEAD || isslime(L) || ismonkeybasic(L) || L.invisibility > owner.see_invisible) //xenobio moment + if(L == owner || L.stat == DEAD || isslime(L) || ismonkeybasic(L) || L.invisibility > owner.see_invisible || isLivingSSD(L)) //xenobio moment continue new /obj/effect/temp_visual/single_user/lwap_ping(owner.loc, owner, L) locks++ diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm index 43de5d7988b7..a3faae850e92 100644 --- a/code/datums/uplink_items/uplink_general.dm +++ b/code/datums/uplink_items/uplink_general.dm @@ -957,7 +957,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) Can be used to parry incoming melee attacks." reference = "MBK" item = /obj/item/storage/box/syndie_kit/syndie_mantis - cost = 60 + cost = 75 + surplus = 0 + can_discount = FALSE + excludefrom = list(UPLINK_TYPE_NUCLEAR) //////////////////////////////////////// // MARK: POINTLESS BADASSERY diff --git a/code/datums/uplink_items/uplink_traitor.dm b/code/datums/uplink_items/uplink_traitor.dm index 214ba14e43ef..3c7aed661e79 100644 --- a/code/datums/uplink_items/uplink_traitor.dm +++ b/code/datums/uplink_items/uplink_traitor.dm @@ -228,7 +228,7 @@ /datum/uplink_item/jobspecific/telegun name = "Telegun" - desc = "An extremely high-tech energy gun that utilizes bluespace technology to teleport away living targets. Select the target beacon on the telegun itself; projectiles will send targets to the beacon locked onto. Can only send targets to beacons in-sector unless they are emagged!" + desc = "An extremely high-tech energy gun that utilizes jury-rigged bluespace technology to teleport away living targets. Select the target beacon on the telegun itself; projectiles will send targets to the beacon locked onto. Can only send targets to beacons in-sector unless they are emagged!" reference = "TG" item = /obj/item/gun/energy/telegun cost = 50 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 37f2b52023c9..55c2c66979e0 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -61,8 +61,8 @@ var/list/firealarms var/firedoors_last_closed_on = 0 - /// The air alarm to use for atmos_alert consoles - var/obj/machinery/alarm/master_air_alarm + /// The air alarms present in this area. + var/list/air_alarms = list() /// The list of vents in our area. var/list/obj/machinery/atmospherics/unary/vent_pump/vents = list() /// The list of scrubbers in our area. @@ -301,10 +301,17 @@ continue // At this point, the area is safe and the door is technically functional. + // Firedoors do not close automatically by default, and setting it to false when the alarm is off prevents unnecessary timers from being created. Emagged doors are permanently disabled from automatically closing, or being operated by alarms altogether apart from the lights. + if(!D.emagged) + if(opening) + D.autoclose = FALSE + else + D.autoclose = TRUE INVOKE_ASYNC(D, (opening ? TYPE_PROC_REF(/obj/machinery/door/firedoor, deactivate_alarm) : TYPE_PROC_REF(/obj/machinery/door/firedoor, activate_alarm))) - if(D.welded) + if(D.welded || D.emagged) continue // Alarm is toggled, but door stuck + if(D.operating) if((D.operating == DOOR_OPENING && opening) || (D.operating == DOOR_CLOSING && !opening)) continue diff --git a/code/game/area/centcom_areas.dm b/code/game/area/centcom_areas.dm index 98674bf344a8..7feeaf9dee43 100644 --- a/code/game/area/centcom_areas.dm +++ b/code/game/area/centcom_areas.dm @@ -135,3 +135,9 @@ requires_power = FALSE has_gravity = TRUE hide_attacklogs = TRUE + +/area/backrooms + name = "Backrooms" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED diff --git a/code/game/area/misc_areas.dm b/code/game/area/misc_areas.dm index e9bd5f40a6a4..1eda79444595 100644 --- a/code/game/area/misc_areas.dm +++ b/code/game/area/misc_areas.dm @@ -50,6 +50,7 @@ /area/game_test name = "Game Test Area" + requires_power = FALSE //SYNDICATES diff --git a/code/game/area/ss13_areas/engineering_areas.dm b/code/game/area/ss13_areas/engineering_areas.dm index e47e128bffa9..b2d739c6b11c 100644 --- a/code/game/area/ss13_areas/engineering_areas.dm +++ b/code/game/area/ss13_areas/engineering_areas.dm @@ -94,6 +94,10 @@ icon_state = "ai" sound_environment = SOUND_AREA_SMALL_ENCLOSED +/area/station/engineering/engine_foyer + name = "Engine foyer" + icon_state = "engine_hallway" + // engine areas /area/station/engineering/engine diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2c102af007a7..e9af9128d124 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -22,15 +22,21 @@ var/atom/movable/pulling /// Face towards the atom while pulling it var/face_while_pulling = FALSE - /// Whether this atom should have its dir automatically changed when it moves. Setting this to FALSE allows for things such as directional windows to retain dir on moving without snowflake code all of the place. + /// Whether this atom should have its dir automatically changed when it + /// moves. Setting this to FALSE allows for things such as directional windows + /// to retain dir on moving without snowflake code all of the place. + /// PARA: Doesn't set this currently to maintain current behavior for pulling items around, + /// because modifying direction on pull is expected. var/set_dir_on_move = TRUE var/throwforce = 0 - var/inertia_dir = 0 - var/atom/inertia_last_loc - var/inertia_moving = 0 - var/inertia_next_move = 0 + ///Are we moving with inertia? Mostly used as an optimization + var/inertia_moving = FALSE + ///Delay in deciseconds between inertia based movement var/inertia_move_delay = 5 + ///The last time we pushed off something + ///This is a hack to get around dumb him him me scenarios + var/last_pushoff var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move var/list/client_mobs_in_contents @@ -69,6 +75,10 @@ /// Used for icon smoothing. Won't smooth if it ain't anchored and can be unanchored. Only set to true on windows var/can_be_unanchored = FALSE + ///attempt to resume grab after moving instead of before. + var/atom/movable/moving_from_pull + ///Holds information about any movement loops currently running/waiting to run on the movable. Lazy, will be null if nothing's going on + var/datum/movement_packet/move_packet /// How far (in pixels) should this atom scatter when created/dropped/etc. Does not apply to mapped-in items. var/scatter_distance = 0 @@ -116,6 +126,10 @@ loc = null if(pulledby) pulledby.stop_pulling() + if(move_packet) + if(!QDELETED(move_packet)) + qdel(move_packet) + move_packet = null if(opacity && istype(T)) var/old_has_opaque_atom = T.has_opaque_atom @@ -296,17 +310,22 @@ RESOLVE_ACTIVE_MOVEMENT -/atom/movable/Move(atom/newloc, direct = 0, movetime) +/atom/movable/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE) + var/atom/movable/pullee = pulling + var/turf/current_turf = loc if(!loc || !newloc) return FALSE var/atom/oldloc = loc + if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE) + return FALSE + + if(glide_size_override && glide_size != glide_size_override) + set_glide_size(glide_size_override) + if(loc != newloc) - if(movetime > 0) - glide_for(movetime) - if(IS_DIR_CARDINAL(direct)) - . = ..(newloc, direct) // don't pass up movetime - setDir(direct) + if(!IS_DIR_DIAGONAL(direct)) //Cardinal move + . = ..(newloc, direct) else //Diagonal move, split it into cardinal moves moving_diagonally = FIRST_DIAG_STEP var/first_step_dir = 0 @@ -328,31 +347,60 @@ moving_diagonally = SECOND_DIAG_STEP . = step(src, direct_NS) if(first_step_dir != 0) - if(!.) + if(!. && set_dir_on_move && update_dir) setDir(first_step_dir) + Moved(oldloc, first_step_dir) else if(!inertia_moving) - inertia_next_move = world.time + inertia_move_delay newtonian_move(direct) + if(client_mobs_in_contents) + update_parallax_contents() moving_diagonally = 0 return if(!loc || (loc == oldloc && oldloc != newloc)) last_move = 0 + return + if(. && pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move. + if(pulling.anchored) + stop_pulling() + else + //puller and pullee more than one tile away or in diagonal position and whatever the pullee is pulling isn't already moving from a pull as it'll most likely result in an infinite loop a la ouroborus. + if(!pulling.pulling?.moving_from_pull) + var/pull_dir = get_dir(pulling, src) + var/target_turf = current_turf + + if(target_turf != current_turf || (moving_diagonally != SECOND_DIAG_STEP && IS_DIR_DIAGONAL(pull_dir)) || get_dist(src, pulling) > 1) + pulling.move_from_pull(src, target_turf, glide_size) + + // PARA: There was code here for handling multi-z, which isn't relevant to us. + check_pulling() + + //glide_size strangely enough can change mid movement animation and update correctly while the animation is playing + //This means that if you don't override it late like this, it will just be set back by the movement update that's called when you move turfs. + if(glide_size_override) + set_glide_size(glide_size_override) + last_move = direct - move_speed = world.time - l_move_time - l_move_time = world.time - if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, movetime)) //movement failed due to buckled mob + if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob . = FALSE -// Called after a successful Move(). By this point, we've already moved -/atom/movable/proc/Moved(atom/old_loc, Dir, Forced = FALSE) - SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, Dir, Forced) - if(!inertia_moving) - inertia_next_move = world.time + inertia_move_delay - newtonian_move(Dir) +/** + * Called after a successful Move(). By this point, we've already moved. + * Arguments: + * * old_loc is the location prior to the move. Can be null to indicate nullspace. + * * movement_dir is the direction the movement took place. Can be NONE if it was some sort of teleport. + * * The forced flag indicates whether this was a forced move, which skips many checks of regular movement. + * * The old_locs is an optional argument, in case the moved movable was present in multiple locations before the movement. + * * momentum_change represents whether this movement is due to a "new" force if TRUE or an already "existing" force if FALSE + **/ +/atom/movable/proc/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, movement_dir, forced, old_locs, momentum_change) + + if(!inertia_moving && momentum_change) + newtonian_move(movement_dir) if(length(client_mobs_in_contents)) update_parallax_contents() @@ -369,6 +417,21 @@ L.source_atom.update_light() return TRUE +/// Called when src is being moved to a target turf because another movable (puller) is moving around. +/atom/movable/proc/move_from_pull(atom/movable/puller, turf/target_turf, puller_glide_size) + moving_from_pull = puller + var/new_glide_size = puller_glide_size + var/pull_dir = get_dir(src, target_turf) + // Adjust diagonal pulls for LONG_GLIDE differences. + if(IS_DIR_DIAGONAL(pull_dir)) + if((puller.appearance_flags & LONG_GLIDE) && !(appearance_flags & LONG_GLIDE)) + new_glide_size *= sqrt(2) + if(!(puller.appearance_flags & LONG_GLIDE) && (appearance_flags & LONG_GLIDE)) + new_glide_size /= sqrt(2) + set_glide_size(new_glide_size) + Move(target_turf, pull_dir) + moving_from_pull = null + // Make sure you know what you're doing if you call this // You probably want CanPass() /atom/movable/Cross(atom/movable/crossed_atom) @@ -401,7 +464,7 @@ */ /atom/movable/Uncross() SHOULD_NOT_OVERRIDE(TRUE) - CRASH("Uncross() should not be being called, please read the doc-comment for it for why.") + CRASH("Unexpected atom/movable/Uncross() call") /** * default byond proc that is normally called on everything inside the previous turf @@ -554,19 +617,26 @@ update_runechat_msg_location() -//Called whenever an object moves and by mobs when they attempt to move themselves through space -//And when an object or action applies a force on src, see newtonian_move() below -//return FALSE to have src start/keep drifting in a no-grav area and TRUE to stop/not start drifting -//Mobs should return TRUE if they should be able to move of their own volition, see client/Move() in mob_movement.dm -//movement_dir == 0 when stopping or any dir when trying to move -/atom/movable/proc/Process_Spacemove(movement_dir = 0) +/** + * Called whenever an object moves and by mobs when they attempt to move themselves through space + * And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move] + * + * Return FALSE to have src start/keep drifting in a no-grav area and TRUE to stop/not start drifting + * + * Mobs should return TRUE if they should be able to move of their own volition, see [/client/proc/Move] + * + * Arguments: + * * movement_dir - 0 when stopping or any dir when trying to move + * * continuous_move - If this check is coming from something in the context of already drifting + */ +/atom/movable/proc/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(has_gravity(src)) return TRUE - if(pulledby && !pulledby.pulling) + if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir, continuous_move) & COMSIG_MOVABLE_STOP_SPACEMOVE) return TRUE - if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir) & COMSIG_MOVABLE_STOP_SPACEMOVE) + if(pulledby && pulledby.pulledby != src) return TRUE if(throwing) @@ -577,17 +647,15 @@ return FALSE -/atom/movable/proc/newtonian_move(direction) //Only moves the object if it's under no gravity - if(!loc || Process_Spacemove(0)) - inertia_dir = 0 +/atom/movable/proc/newtonian_move(direction, instant = FALSE, start_delay = 0) + if(!isturf(loc) || Process_Spacemove(direction, continuous_move = TRUE)) return FALSE - inertia_dir = direction - if(!direction) + if(SEND_SIGNAL(src, COMSIG_MOVABLE_NEWTONIAN_MOVE, direction, start_delay) & COMPONENT_MOVABLE_NEWTONIAN_BLOCK) return TRUE - inertia_last_loc = loc - SSspacedrift.processing[src] = src + AddComponent(/datum/component/drift, direction, instant, start_delay) + return TRUE //called when src is thrown into hit_atom @@ -684,7 +752,12 @@ /// This proc is recursive, and calls itself to constantly set the glide size of an atom/movable /atom/movable/proc/set_glide_size(target = 8) + if(glide_size == target) + return + + var/old_value = glide_size glide_size = target + SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, old_value) for(var/mob/buckled_mob as anything in buckled_mobs) buckled_mob.set_glide_size(target) @@ -708,14 +781,12 @@ if(master) return master.attack_hand(a, b, c) -/atom/movable/proc/handle_buckled_mob_movement(newloc,direct,movetime) +/atom/movable/proc/handle_buckled_mob_movement(newloc, direct, glide_size_override) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - if(!buckled_mob.Move(newloc, direct, movetime)) + if(!buckled_mob.Move(newloc, direct, glide_size_override)) forceMove(buckled_mob.loc) last_move = buckled_mob.last_move - inertia_dir = last_move - buckled_mob.inertia_dir = last_move return FALSE return TRUE diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index f0db39b99bf3..341067b016cf 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -101,7 +101,7 @@ GLOBAL_LIST_EMPTY(bad_blocks) ResetUI(1) // Hair // FIXME: Species-specific defaults pls - var/obj/item/organ/external/head/H = character.get_organ("head") + var/obj/item/organ/external/head/head = character.get_organ("head") var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes) /*// Body Accessory @@ -117,7 +117,7 @@ GLOBAL_LIST_EMPTY(bad_blocks) var/body_marks = GLOB.marking_styles_list.Find(character.m_styles["body"]) var/tail_marks = GLOB.marking_styles_list.Find(character.m_styles["tail"]) - head_traits_to_dna(character, H) + head_traits_to_dna(character, head) eye_color_to_dna(eyes_organ) SetUIValueRange(DNA_UI_SKIN_R, color2R(character.skin_colour), 255, 1) @@ -163,6 +163,10 @@ GLOBAL_LIST_EMPTY(bad_blocks) if(PLURAL) SetUITriState(DNA_UI_GENDER, DNA_GENDER_PLURAL, 1) + if(head) + head.dna.UI = character.dna.UI + if(eyes_organ) + eyes_organ.dna.UI = character.dna.UI UpdateUI() diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index c387b34e5c33..73973a1944db 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -217,6 +217,7 @@ if((hair > 0) && (hair <= length(GLOB.hair_styles_full_list))) head_organ.h_style = GLOB.hair_styles_full_list[hair] + // dna is taken from the head, not from the mob head_organ.hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_B, 255)) head_organ.sec_hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_B, 255)) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index c85ff6a05c3b..417a8c303ff6 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -190,47 +190,47 @@ QDEL_LIST_CONTENTS(L.grabbed_by) return TRUE -/obj/machinery/dna_scannernew/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass)) +/obj/machinery/dna_scannernew/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/glass)) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to you!") - return + to_chat(user, "\The [used] is stuck to you!") + return ITEM_INTERACT_COMPLETE - beaker = I + beaker = used SStgui.update_uis(src) - I.forceMove(src) - user.visible_message("[user] adds \a [I] to \the [src]!", "You add \a [I] to \the [src]!") - return + used.forceMove(src) + user.visible_message("[user] adds \a [used] to \the [src]!", "You add \a [used] to \the [src]!") + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/grab)) - var/obj/item/grab/G = I + if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used if(!ismob(G.affecting)) - return + return ITEM_INTERACT_COMPLETE if(occupant) to_chat(user, "The scanner is already occupied!") - return + return ITEM_INTERACT_COMPLETE if(G.affecting.abiotic()) to_chat(user, "Subject may not hold anything in their hands.") - return + return ITEM_INTERACT_COMPLETE if(G.affecting.has_buckled_mobs()) //mob attached to us to_chat(user, "[G] will not fit into [src] because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") - return + return ITEM_INTERACT_COMPLETE if(panel_open) to_chat(usr, "Close the maintenance panel first.") - return + return ITEM_INTERACT_COMPLETE put_in(G.affecting) add_fingerprint(user) qdel(G) - return + return ITEM_INTERACT_COMPLETE return ..() @@ -327,17 +327,18 @@ idle_power_consumption = 10 active_power_consumption = 400 -/obj/machinery/computer/scan_consolenew/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/disk/data)) //INSERT SOME diskS +/obj/machinery/computer/scan_consolenew/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/disk/data)) //INSERT SOME diskS if(!disk) user.drop_item() - I.forceMove(src) - disk = I - to_chat(user, "You insert [I].") + used.forceMove(src) + disk = used + to_chat(user, "You insert [used].") SStgui.update_uis(src) - return - else - return ..() + + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/computer/scan_consolenew/Initialize(mapload) . = ..() diff --git a/code/game/dna/mutations/disabilities.dm b/code/game/dna/mutations/disabilities.dm index 9039ac04521c..b27f573ef01f 100644 --- a/code/game/dna/mutations/disabilities.dm +++ b/code/game/dna/mutations/disabilities.dm @@ -68,29 +68,6 @@ ..() block = GLOB.clumsyblock -/datum/mutation/disability/tourettes - name = "Tourettes" - activation_messages = list("You twitch.") - deactivation_messages = list("Your mouth tastes like soap.") - -/datum/mutation/disability/tourettes/New() - ..() - block = GLOB.twitchblock - -/datum/mutation/disability/tourettes/on_life(mob/living/carbon/human/H) - if(prob(10)) - switch(rand(1, 3)) - if(1) - H.emote("twitch") - if(2 to 3) - H.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") - var/x_offset_old = H.pixel_x - var/y_offset_old = H.pixel_y - var/x_offset = H.pixel_x + rand(-2, 2) - var/y_offset = H.pixel_y + rand(-1, 1) - animate(H, pixel_x = x_offset, pixel_y = y_offset, time = 1) - animate(H, pixel_x = x_offset_old, pixel_y = y_offset_old, time = 1) - /datum/mutation/disability/nervousness name = "Nervousness" activation_messages = list("You feel nervous.") diff --git a/code/game/dna/mutations/mutation_powers.dm b/code/game/dna/mutations/mutation_powers.dm index e13572621a01..9f9f4ad2252c 100644 --- a/code/game/dna/mutations/mutation_powers.dm +++ b/code/game/dna/mutations/mutation_powers.dm @@ -384,14 +384,22 @@ . = ..() if(!.) return - var/can_eat = TRUE - if(iscarbon(user)) - var/mob/living/carbon/C = user - if((C.head && (C.head.flags_cover & HEADCOVERSMOUTH)) || (C.wear_mask && (C.wear_mask.flags_cover & MASKCOVERSMOUTH) && !C.wear_mask.up)) - if(show_message) - to_chat(C, "Your mouth is covered, preventing you from eating!") - can_eat = FALSE - return can_eat + + if(!iscarbon(user)) + return TRUE + + var/mob/living/carbon/C = user + if(!(C.head?.flags_cover & HEADCOVERSMOUTH)) + if(!ismask(C.wear_mask)) + return TRUE + + var/obj/item/clothing/mask/worn_mask = C.wear_mask + if(!(worn_mask.flags_cover & MASKCOVERSMOUTH) || worn_mask.up) + return TRUE + + if(show_message) + to_chat(C, "Your mouth is covered, preventing you from eating!") + return FALSE /datum/spell/eat/proc/doHeal(mob/user) if(ishuman(user)) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index dbcf5e38f9ab..cb4e4048bca2 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -144,3 +144,6 @@ message_admins("New traitor roll passed. Making a new Traitor.") log_game("New traitor roll passed. Making a new Traitor.") character.mind.make_Traitor() + +/datum/game_mode/traitor/autotraitor/on_mob_cryo(mob/sleepy_mob, obj/machinery/cryopod/cryopod) + possible_traitors.Remove(sleepy_mob) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 9e36aeaf9f54..2c51ad4dd049 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -727,7 +727,7 @@ name = "reality sunderer" icon = 'icons/obj/cult.dmi' icon_state = "amulet" - desc = "Some amulet made out of metal, bluespace crystals, and blood. Allows cultists to open portals over teleport runes, destroying the rune in the process." + desc = "An elaborately carved amulet resembling a human eye. Looking directly at it sends shivers down your spine. Allows cultists to open portals over teleport runes, destroying the rune in the process." w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/gamemodes/dynamic/antag_rulesets.dm b/code/game/gamemodes/dynamic/antag_rulesets.dm new file mode 100644 index 000000000000..62293adf6cbf --- /dev/null +++ b/code/game/gamemodes/dynamic/antag_rulesets.dm @@ -0,0 +1,236 @@ +/** + * These are gamemode rulesets for the dynamic gamemode type. They determine what antagonists spawn during a round. + */ +/datum/ruleset + /// What this ruleset is called + var/name = "BASE RULESET" + /// The cost to roll this ruleset + var/ruleset_cost = 1 + /// The weight to roll this ruleset + var/ruleset_weight = 1 + /// The cost to roll an antagonist of this ruleset + var/antag_cost = 1 + /// The weight to roll an antagonist of this ruleset + var/antag_weight = 1 + /// Antagonist datum to apply to users + var/datum/antagonist/antagonist_type + /// A ruleset to be added when this ruleset is selected by the gamemode + var/datum/ruleset/implied/implied_ruleset_type + + /// These roles 100% cannot be this antagonist + var/list/banned_jobs = list("Cyborg") + /// These roles can't be antagonists because mindshielding (this can be disabled via config) + var/list/protected_jobs = list( + "Security Officer", + "Warden", + "Detective", + "Head of Security", + "Captain", + "Blueshield", + "Nanotrasen Representative", + "Magistrate", + "Internal Affairs Agent", + "Nanotrasen Career Trainer", + "Nanotrasen Navy Officer", + "Special Operations Officer", + "Trans-Solar Federation General" + ) + /// Applies the mind roll to assigned_role, preventing them from rolling a normal job. Good for wizards and nuclear operatives. + var/assign_job_role = FALSE + /// A blacklist of species names that cannot play this antagonist + var/list/banned_species = list() + /// If true, the species blacklist is now a species whitelist + var/banned_species_only = FALSE + + // var/list/banned_mutual_rulesets = list() // UNIMPLEMENTED: could be used to prevent nukies rolling while theres cultists, or wizards, etc + + /* This stuff changes, all stuff above is static */ + /// How many antagonists to spawn + var/antag_amount = 0 + /// All of the minds that we will make into our antagonist type + var/list/datum/mind/pre_antags = list() + /// If non-zero, how long from the start of the game should a latespawn for this role occur? + var/latespawn_time + +/datum/ruleset/Destroy(force, ...) + stack_trace("[src] ([type]) was destroyed.") + return ..() + +/datum/ruleset/proc/ruleset_possible(ruleset_budget, rulesets) + if(ruleset_budget < ruleset_cost) + return RULESET_FAILURE_BUDGET + if(!length(SSticker.mode.get_players_for_role(antagonist_type::job_rank))) // this specifically needs to be job_rank not special_rank + return RULESET_FAILURE_NO_PLAYERS + +/datum/ruleset/proc/antagonist_possible(budget) + return budget >= antag_cost + +/datum/ruleset/proc/roundstart_pre_setup() + if(antag_amount == 0) + return + if(antag_amount < 0) + stack_trace("/datum/ruleset/proc/pre_setup() for [type] somehow had a negative antagonist amount") + return + var/list/datum/mind/possible_antags = SSticker.mode.get_players_for_role(antagonist_type::job_rank) // this specifically needs to be job_rank not special_rank + if(!length(possible_antags)) + refund("No possible players for [src] ruleset.") // we allocate antag budget before we allocate players, and previous rulesets can steal our players + return antag_cost * antag_amount // shitty refund for now + + if(GLOB.configuration.gamemode.prevent_mindshield_antags) + banned_jobs += protected_jobs + + shuffle_inplace(possible_antags) + for(var/datum/mind/antag as anything in possible_antags) + if(antag_amount <= 0) + break + if(!roundstart_can_apply(antag)) + continue + pre_antags += antag + if(assign_job_role) + antag.assigned_role = antagonist_type::special_role + antag.special_role = antagonist_type::special_role + antag.restricted_roles = banned_jobs + antag_amount -= 1 + + if(antag_amount > 0) + refund("Missing [antag_amount] antagonists for [src] ruleset.") + return antag_cost * antag_amount // shitty refund for now + +/datum/ruleset/proc/roundstart_can_apply(datum/mind/antag) + if(EXCLUSIVE_OR(antag.current.client.prefs.active_character.species in banned_species, banned_species_only)) + SEND_SIGNAL(src, COMSIG_RULESET_FAILED_SPECIES) + return FALSE + if(antag.special_role) // You can only have 1 antag roll at a time, sorry + return FALSE + return TRUE + +/datum/ruleset/proc/roundstart_post_setup(datum/game_mode/dynamic) + for(var/datum/mind/antag as anything in pre_antags) + antag.add_antag_datum(antagonist_type) + +/datum/ruleset/proc/refund(info) + // not enough antagonists signed up!!! idk what to do. The only real solution is to procedurally allocate budget, which will result in 1000x more get_players_for_role() calls. Which is not cheap. + // OR we cache get_players_for_role() and then just check if they have a special_role. May be unreliable. + // log_dynamic("[info] Refunding [antag_cost * antag_amount] budget.") + // Currently unimplemented. Will be useful for a possible future PR where latejoin antagonists are factored in. + return + +/datum/ruleset/proc/get_latejoin_players() + var/list/candidates = list() + + // Assemble a list of active players without jobbans. + for(var/mob/living/carbon/human/player in GLOB.player_list) + // Has a mind + if(!player.mind) + continue + // Connected and not AFK + if(!player.client || (locate(player) in SSafk.afk_players)) + continue + // Not antag-banned and not specific antag banned + if(jobban_isbanned(player, ROLE_SYNDICATE) || jobban_isbanned(player, antagonist_type::job_rank)) + continue + // Make sure they want to play antag, and that they're not already something (off station or antag) + if(player.client.skip_antag || player.mind.offstation_role || player.mind.special_role) + continue + // Make sure they actually want to be this antagonist + if(!(antagonist_type::job_rank in player.client.prefs.be_special)) + continue + // Make sure their species CAN be this antagonist + if(EXCLUSIVE_OR(player.dna.species.name in banned_species, banned_species_only)) + continue + // Make sure they're not in a banned job + if(player.mind.assigned_role in banned_jobs) + continue + + candidates += player.mind + + return shuffle(candidates) + +/datum/ruleset/proc/latespawn(datum/game_mode/dynamic/dynamic) + // latespawning is only used by traitors at this point, so we're just going to be naive and allocate all budget when this proc is called. + var/late_antag_amount = floor(dynamic.budget_overflow / antag_cost) + dynamic.budget_overflow -= (late_antag_amount * antag_cost) + + var/list/datum/mind/possible_antags = get_latejoin_players() + for(var/i in 1 to late_antag_amount) + var/datum/mind/antag = pick_n_take(possible_antags) + antag.add_antag_datum(antagonist_type) + + log_dynamic("Latespawned [late_antag_amount] [name]s.") + +/datum/ruleset/traitor + name = "Traitor" + ruleset_weight = 11 + antag_cost = 7 + antag_weight = 2 + antagonist_type = /datum/antagonist/traitor + +/datum/ruleset/traitor/roundstart_post_setup(datum/game_mode/dynamic) + latespawn_time = rand(5 MINUTES, 15 MINUTES) + for(var/datum/mind/antag as anything in pre_antags) + var/datum/antagonist/traitor/traitor_datum = new antagonist_type() + if(ishuman(antag.current)) + traitor_datum.delayed_objectives = TRUE + traitor_datum.addtimer(CALLBACK(traitor_datum, TYPE_PROC_REF(/datum/antagonist/traitor, reveal_delayed_objectives)), latespawn_time, TIMER_DELETE_ME) + antag.add_antag_datum(traitor_datum) + +/datum/ruleset/vampire + name = "Vampire" + ruleset_weight = 12 + antag_cost = 10 + antagonist_type = /datum/antagonist/vampire + + banned_jobs = list("Cyborg", "AI", "Chaplain") + banned_species = list("Machine") + implied_ruleset_type = /datum/ruleset/implied/mindflayer + +/datum/ruleset/changeling + name = "Changeling" + ruleset_weight = 9 + antag_cost = 10 + antagonist_type = /datum/antagonist/changeling + + banned_jobs = list("Cyborg", "AI") + banned_species = list("Machine") + implied_ruleset_type = /datum/ruleset/implied/mindflayer + +/datum/ruleset/changeling/ruleset_possible(ruleset_budget, rulesets) + // Theres already a ruleset, we're good to go + if(length(rulesets)) + return ..() + // We're the first ruleset, but we can afford another ruleset + if((ruleset_budget >= /datum/ruleset/traitor::ruleset_cost) || (ruleset_budget >= /datum/ruleset/vampire::ruleset_cost)) + return ..() + return RULESET_FAILURE_CHANGELING_SECONDARY_RULESET + +// This is the fucking worst, but its required to not change functionality with mindflayers. Cannot be rolled normally, this is applied by other methods. +/datum/ruleset/implied + // These 3 variables should never change + ruleset_cost = 0 + ruleset_weight = 0 + antag_weight = 0 + // antag_cost is allowed to be edited to help with refunding antagonists + antag_cost = 0 + /// This signal is registered on whatever (multiple) rulesets implied us. This will call on_implied. + var/target_signal + /// Set this to true if this implied ruleset was activated + var/was_triggered = FALSE + +/datum/ruleset/implied/proc/on_implied(datum/antagonist/implier) + stack_trace("[type]/on_implied() not implemented!") + +/datum/ruleset/implied/mindflayer + name = "Mindflayer" + antagonist_type = /datum/antagonist/mindflayer + antag_cost = 10 + target_signal = COMSIG_RULESET_FAILED_SPECIES + + banned_jobs = list("Cyborg", "AI") + banned_species = list("Machine") + banned_species_only = TRUE + +/datum/ruleset/implied/mindflayer/on_implied(datum/ruleset/implier) + log_dynamic("Rolled implied [name]: +1 [name], -1 [implier.name].") + implier.antag_amount -= 1 + antag_amount += 1 + was_triggered = TRUE diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm new file mode 100644 index 000000000000..d16bea196080 --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -0,0 +1,177 @@ +GLOBAL_LIST_EMPTY(dynamic_forced_rulesets) + +/datum/game_mode/dynamic + name = "Dynamic" + config_tag = "dynamic" + required_players = 10 + /// Non-implied rulesets in play + var/list/datum/ruleset/rulesets = list() + /// Implied rulesets that are in play + var/list/datum/ruleset/implied_rulesets = list() + + /// How much budget is left after roundstart antagonists roll + var/budget_overflow = 0 + + /// Log for what happens in a dynamic round + var/list/dynamic_log = list() + +/datum/game_mode/dynamic/announce() + to_chat(world, "The current game mode is - Dynamic") + var/list/possible_rulesets = list() + for(var/datum/ruleset/ruleset as anything in subtypesof(/datum/ruleset)) + if(ruleset.ruleset_weight <= 0) + continue + possible_rulesets |= ruleset.name + if(ruleset.implied_ruleset_type) + possible_rulesets |= ruleset.implied_ruleset_type.name + to_chat(world, "Possible Rulesets: [english_list(possible_rulesets)]") + +/datum/game_mode/dynamic/proc/allocate_ruleset_budget() + var/ruleset_budget = text2num(GLOB.dynamic_forced_rulesets["budget"] || pickweight(list("0" = 3, "1" = 5, "2" = 12, "3" = 3))) // more likely to or 2 + log_dynamic("Allocated gamemode budget: [ruleset_budget]") + var/list/possible_rulesets = list() + for(var/datum/ruleset/ruleset as anything in subtypesof(/datum/ruleset)) + if(ruleset.ruleset_weight <= 0) + continue + if(GLOB.dynamic_forced_rulesets[ruleset] == DYNAMIC_RULESET_BANNED) + continue + var/datum/ruleset/new_ruleset = new ruleset() + possible_rulesets[new_ruleset] = new_ruleset.ruleset_weight + + log_dynamic("Available rulesets: [english_list(possible_rulesets)]") + + for(var/datum/ruleset/ruleset as anything in GLOB.dynamic_forced_rulesets) + if(ruleset == "budget") + continue + if(GLOB.dynamic_forced_rulesets[ruleset] != DYNAMIC_RULESET_FORCED) + continue + if(!ispath(ruleset, /datum/ruleset)) + stack_trace("Non-ruleset in GLOB.dynamic_forced_rulesets: \"[ruleset]\" ([ruleset?.type])") + continue + log_dynamic("Forcing ruleset: [ruleset.name]") + ruleset_budget -= pick_ruleset(new ruleset, ruleset_budget, force = TRUE) + for(var/datum/ruleset/old_ruleset in possible_rulesets) + if(old_ruleset.type == ruleset) + possible_rulesets -= old_ruleset + qdel(old_ruleset) + + while(ruleset_budget >= 0) + var/datum/ruleset/ruleset = pickweight(possible_rulesets) + if(!ruleset) + log_dynamic("No more available rulesets") + return + ruleset_budget -= pick_ruleset(ruleset, ruleset_budget) + possible_rulesets -= ruleset + log_dynamic("No more ruleset budget") + +/datum/game_mode/dynamic/proc/pick_ruleset(datum/ruleset/ruleset, ruleset_budget, force) + if(!ruleset) + return + if(!force) + var/failure_reason = ruleset.ruleset_possible(ruleset_budget, rulesets) + if(failure_reason) + log_dynamic("Failed [ruleset.name] ruleset: [failure_reason]") + return + log_dynamic("Rolled ruleset: [ruleset.name]") + rulesets[ruleset] = ruleset.antag_weight + . = ruleset.ruleset_cost // return the ruleset cost to be subtracted from the gamemode budget + if(!ruleset.implied_ruleset_type) + return + + var/datum/ruleset/implied/implied = locate(ruleset.implied_ruleset_type) in implied_rulesets + if(!implied) + log_dynamic("Adding implied ruleset: [ruleset.implied_ruleset_type.name]") + implied = new ruleset.implied_ruleset_type + implied_rulesets += implied + implied.RegisterSignal(ruleset, implied.target_signal, TYPE_PROC_REF(/datum/ruleset/implied, on_implied)) + +/datum/game_mode/dynamic/proc/allocate_antagonist_budget() + if(!length(rulesets)) + log_dynamic("No rulesets in play.") + return + var/budget = num_players() + log_dynamic("Allocated antagonist budget: [budget].") + + for(var/datum/ruleset/ruleset in rulesets) + ruleset.antag_amount = 1 + budget -= ruleset.antag_cost + log_dynamic("Automatic deduction: +1 [ruleset.name]. Remaining budget: [budget].") + + log_dynamic("Rulesets in play: [english_list((rulesets + implied_rulesets))]") + + apply_antag_budget(budget) + +/datum/game_mode/dynamic/proc/apply_antag_budget(budget) // todo, can be called later in the game to apply more budget. That also means there has to be shit done for latejoins. + var/list/temp_rulesets = rulesets.Copy() + while(budget >= 0) + var/datum/ruleset/ruleset = pickweight(temp_rulesets) + if(!ruleset) + log_dynamic("No rulesets remaining. Remaining budget: [budget].") + budget_overflow = budget + return + if(!ruleset.antagonist_possible(budget)) + log_dynamic("Rolled [ruleset.name]: failed, removing [ruleset.name] ruleset.") + temp_rulesets -= ruleset + continue + ruleset.antag_amount++ + budget -= ruleset.antag_cost + log_dynamic("Rolled [ruleset.name]: success, +1 [ruleset.name]. Remaining budget: [budget].") + log_dynamic("No more antagonist budget remaining.") + +/datum/game_mode/dynamic/pre_setup() + var/watch = start_watch() + log_dynamic("Starting dynamic setup.") + allocate_ruleset_budget() + log_dynamic("-=-=-=-=-=-=-=-=-=-=-=-=-") + allocate_antagonist_budget() + log_dynamic("=-=-=-=-=-=-=-=-=-=-=-=-=") + + for(var/datum/ruleset/ruleset in (rulesets + implied_rulesets)) // rulesets first, then implied rulesets + log_dynamic("Applying [ruleset.antag_amount] [ruleset.name]\s.") + budget_overflow += ruleset.roundstart_pre_setup() + + log_dynamic("Budget overflow: [budget_overflow].") + // for the future, maybe try readding antagonists with apply_antag_budget(budget_overflow) + log_dynamic("Finished dynamic setup in [stop_watch(watch)]s.") + return TRUE + +/datum/game_mode/dynamic/post_setup() + for(var/datum/ruleset/ruleset in (rulesets + implied_rulesets)) + if(length(ruleset.pre_antags)) + log_dynamic("Making antag datums for [ruleset.name] ruleset.") + ruleset.roundstart_post_setup(src) + if(ruleset.latespawn_time) + addtimer(CALLBACK(ruleset, TYPE_PROC_REF(/datum/ruleset, latespawn), src), ruleset.latespawn_time) + log_dynamic("[ruleset]s will latespawn at [ruleset.latespawn_time / 600].") + ..() + +/datum/game_mode/dynamic/latespawn(mob) + . = ..() + budget_overflow++ + +/datum/game_mode/dynamic/on_mob_cryo(mob/sleepy_mob, obj/machinery/cryopod/cryopod) + var/turf/T = get_turf(cryopod) + if(!T || is_admin_level(T.z)) + return + budget_overflow-- + if(!sleepy_mob.mind || !length(sleepy_mob.mind.antag_datums)) + return + for(var/datum/antagonist/antag in sleepy_mob.mind.antag_datums) + for(var/datum/ruleset/possible_ruleset as anything in subtypesof(/datum/ruleset)) + if(istype(antag, possible_ruleset.antagonist_type)) + budget_overflow += possible_ruleset.antag_cost + log_dynamic("[possible_ruleset] cryo. +[possible_ruleset.antag_cost] budget.") + +/datum/game_mode/dynamic/get_webhook_name() + var/list/implied_and_used = list() + for(var/datum/ruleset/implied/implied as anything in implied_rulesets) + if(implied.was_triggered) + implied_and_used += implied + return "[name] ([english_list(rulesets + implied_and_used, nothing_text = "Extended")])" + +/proc/log_dynamic(text) + log_game("Dynamic: [text]") + var/datum/game_mode/dynamic/dynamic = SSticker.mode + if(!istype(dynamic)) + return + dynamic.dynamic_log += text diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 39c7f0c0d560..d072659317c5 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -249,7 +249,7 @@ for(var/tech_id in SSeconomy.tech_levels) SSblackbox.record_feedback("tally", "cargo max tech level sold", SSeconomy.tech_levels[tech_id], tech_id) - GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_PRIMARY, "A round of [name] has ended - [surviving_total] survivors, [ghosts] ghosts.") + GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_PRIMARY, "A round of [get_webhook_name()] has ended - [surviving_total] survivors, [ghosts] ghosts.") if(SSredis.connected) // Send our presence to required channels var/list/presence_data = list() @@ -319,7 +319,10 @@ // Less if there are not enough valid players in the game entirely to make recommended_enemies. // Just the above proc but for alive players -/// Gets all alive players for a specific role. Disables offstation roles by default +/** + * DEPRECATED! + * Gets all alive players for a specific role. Disables offstation roles by default + */ /datum/game_mode/proc/get_alive_players_for_role(role, override_jobbans = FALSE, allow_offstation_roles = FALSE) var/list/players = list() var/list/candidates = list() @@ -645,6 +648,9 @@ /datum/game_mode/proc/traitors_to_add() return 0 +/** + * DEPRECATED! + */ /datum/game_mode/proc/fill_antag_slots() var/traitors_to_add = 0 @@ -653,7 +659,7 @@ if(length(traitors) < traitors_to_add()) traitors_to_add += (traitors_to_add() - length(traitors)) - if(!traitors_to_add) + if(traitors_to_add <= 0) return var/list/potential_recruits = get_alive_players_for_role(ROLE_TRAITOR) @@ -671,3 +677,9 @@ traitor.special_role = SPECIAL_ROLE_TRAITOR traitor.restricted_roles = restricted_jobs traitor.add_antag_datum(/datum/antagonist/traitor) // They immediately get a new objective + +/datum/game_mode/proc/get_webhook_name() + return name + +/datum/game_mode/proc/on_mob_cryo(mob/sleepy_mob, obj/machinery/cryopod/cryopod) + return diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index f1539a992917..aaebe3544043 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -218,13 +218,15 @@ vest = V return TRUE -/obj/machinery/abductor/console/attackby__legacy__attackchain(obj/O, mob/user, params) - if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O)) +/obj/machinery/abductor/console/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/abductor/gizmo) && AddGizmo(used)) to_chat(user, "You link the tool to the console.") - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(used)) to_chat(user, "You link the vest to the console.") - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/abductor/console/proc/Dispense(item,cost=1) if(experiment && experiment.credits >= cost) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index 9d70325835a9..ce8c1ef9a0c2 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -82,16 +82,17 @@ return ui_interact(user) -/obj/machinery/abductor/gland_dispenser/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(istype(W, /obj/item/organ/internal/heart/gland)) +/obj/machinery/abductor/gland_dispenser/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/organ/internal/heart/gland)) if(!user.drop_item()) - return - W.forceMove(src) + return ITEM_INTERACT_COMPLETE + used.forceMove(src) for(var/i in 1 to length(gland_colors)) - if(gland_types[i] == W.type) + if(gland_types[i] == used.type) amounts[i]++ - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/abductor/gland_dispenser/proc/Dispense(count) if(amounts[count]>0) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 2084fdab665e..1d195d25f359 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -177,19 +177,19 @@ H.clear_restraints() return -/obj/machinery/abductor/experiment/attackby__legacy__attackchain(obj/item/G, mob/user) - if(istype(G, /obj/item/grab)) - var/obj/item/grab/grabbed = G +/obj/machinery/abductor/experiment/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/grab)) + var/obj/item/grab/grabbed = used if(!ishuman(grabbed.affecting)) - return + return ITEM_INTERACT_COMPLETE if(isabductor(grabbed.affecting)) - return + return ITEM_INTERACT_COMPLETE if(occupant) to_chat(user, "[src] is already occupied!") - return + return ITEM_INTERACT_COMPLETE if(grabbed.affecting.has_buckled_mobs()) //mob attached to us to_chat(user, "[grabbed.affecting] will not fit into [src] because [grabbed.affecting.p_they()] [grabbed.affecting.p_have()] a slime latched onto [grabbed.affecting.p_their()] head.") - return + return ITEM_INTERACT_COMPLETE visible_message("[user] puts [grabbed.affecting] into [src].") var/mob/living/carbon/human/H = grabbed.affecting H.forceMove(src) @@ -197,8 +197,9 @@ flash = "Machine ready." update_icon(UPDATE_ICON_STATE) add_fingerprint(user) - qdel(G) - return + qdel(used) + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/abductor/experiment/ex_act(severity) diff --git a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm index d44adb00d178..25ce0ee4d66a 100644 --- a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm +++ b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm @@ -212,12 +212,12 @@ return hit = TRUE // to prevent double hits from the pull . = ..() - if(!.) - return for(var/atom/extinguish_target in range(2, src)) extinguish_target.extinguish_light(TRUE) if(!isliving(target)) firer.throw_at(get_step(target, get_dir(target, firer)), 50, 10) + if(!.) + return else var/mob/living/L = target L.Immobilize(2 SECONDS) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 83e47bff1c16..e566a3eac3a8 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -185,7 +185,7 @@ ghostize() qdel(src) -/mob/living/simple_animal/hostile/guardian/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/guardian/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE //Works better in zero G, and not useless in space //Manifest, Recall, Communicate diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 8e05021c240c..fb40dd438f33 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -199,6 +199,10 @@ failed_ambush() to_chat(src, "You moved out of your ambush spot!") +/mob/living/simple_animal/hostile/morph/add_ventcrawl() + . = ..() + on_move() + /mob/living/simple_animal/hostile/morph/death(gibbed) . = ..() add_to_all_human_data_huds() diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 9baefc703068..df04fae1ac8e 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -168,33 +168,34 @@ GLOBAL_VAR(bomb_set) if(NUKE_CORE_FULLY_EXPOSED) . += core ? "nukecore3" : "nukecore4" -/obj/machinery/nuclearbomb/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/disk/nuclear)) +/obj/machinery/nuclearbomb/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/disk/nuclear)) if(extended) if(auth) to_chat(user, "There's already a disk in the slot!") - return - if((istype(O, /obj/item/disk/nuclear/training) && !training) || (training && !istype(O, /obj/item/disk/nuclear/training))) - to_chat(user, "[O] doesn't fit into [src]!") - return + return ITEM_INTERACT_COMPLETE + if((istype(used, /obj/item/disk/nuclear/training) && !training) || (training && !istype(used, /obj/item/disk/nuclear/training))) + to_chat(user, "[used] doesn't fit into [src]!") + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "[O] is stuck to your hand!") - return - O.forceMove(src) - auth = O + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE + used.forceMove(src) + auth = used add_fingerprint(user) - return attack_hand(user) + attack_hand(user) + return ITEM_INTERACT_COMPLETE else to_chat(user, "You need to deploy [src] first.") - return - if(istype(O, /obj/item/stack/sheet/mineral/titanium) && removal_stage == NUKE_CORE_FULLY_EXPOSED) - var/obj/item/stack/S = O + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/stack/sheet/mineral/titanium) && removal_stage == NUKE_CORE_FULLY_EXPOSED) + var/obj/item/stack/S = used if(S.get_amount() < sheets_to_fix) to_chat(user, "You need at least [sheets_to_fix] sheets of titanium to repair [src]'s inner core plate!") - return + return ITEM_INTERACT_COMPLETE if(do_after(user, 2 SECONDS, target = src)) if(!loc || !S || S.get_amount() < sheets_to_fix) - return + return ITEM_INTERACT_COMPLETE S.use(sheets_to_fix) user.visible_message("[user] repairs [src]'s inner core plate.", \ "You repair [src]'s inner core plate. The radiation is contained.") @@ -202,43 +203,43 @@ GLOBAL_VAR(bomb_set) if(core) STOP_PROCESSING(SSobj, core) update_icon(UPDATE_OVERLAYS) - return - if(istype(O, /obj/item/stack/sheet/metal) && removal_stage == NUKE_CORE_PANEL_EXPOSED) - var/obj/item/stack/S = O + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/stack/sheet/metal) && removal_stage == NUKE_CORE_PANEL_EXPOSED) + var/obj/item/stack/S = used if(S.get_amount() < sheets_to_fix) to_chat(user, "You need at least [sheets_to_fix] sheets of metal to repair [src]'s outer core plate!") - return - if(do_after(user, 2 SECONDS, target = src)) + else if(do_after(user, 2 SECONDS, target = src)) if(!loc || !S || S.get_amount() < sheets_to_fix) - return + return ITEM_INTERACT_COMPLETE S.use(sheets_to_fix) user.visible_message("[user] repairs [src]'s outer core plate.", \ "You repair [src]'s outer core plate.") removal_stage = NUKE_CORE_EVERYTHING_FINE update_icon(UPDATE_OVERLAYS) - return - if(istype(O, /obj/item/nuke_core/plutonium) && removal_stage == NUKE_CORE_FULLY_EXPOSED) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/nuke_core/plutonium) && removal_stage == NUKE_CORE_FULLY_EXPOSED) if(do_after(user, 2 SECONDS, target = src)) - if(!user.drop_item_to_ground(O)) - to_chat(user, "The [O] is stuck to your hand!") + if(!user.drop_item_to_ground(used)) + to_chat(user, "The [used] is stuck to your hand!") return - user.visible_message("[user] puts [O] back in [src].", "You put [O] back in [src].") - O.forceMove(src) - core = O + user.visible_message("[user] puts [used] back in [src].", "You put [used] back in [src].") + used.forceMove(src) + core = used update_icon(UPDATE_OVERLAYS) - return - if(istype(O, /obj/item/disk/plantgene)) + return ITEM_INTERACT_COMPLETE + + if(istype(used, /obj/item/disk/plantgene)) to_chat(user, "You try to plant the disk, but despite rooting around, it won't fit! After you branch out to read the instructions, you find out where the problem stems from. You've been bamboo-zled, this isn't a nuclear disk at all!") - return + return ITEM_INTERACT_COMPLETE - else if(istype(O, /obj/item/disk)) - if(O.icon_state == "datadisk4") //A similar green disk icon + else if(istype(used, /obj/item/disk)) + if(used.icon_state == "datadisk4") //A similar green disk icon to_chat(user, "You try to slot in the disk, but it won't fit! This isn't the NAD! If only you'd read the label...") - return + return ITEM_INTERACT_COMPLETE else to_chat(user, "You try to slot in the disk, but it won't fit. This isn't the NAD! It's not even the right colour...") - return + return ITEM_INTERACT_COMPLETE return ..() @@ -386,20 +387,24 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if(!panel_open) - return ui_interact(user) + ui_interact(user) + return FINISH_ATTACK if(!Adjacent(user)) return if(removal_stage != NUKE_CORE_FULLY_EXPOSED || !core) - return wires.Interact(user) + wires.Interact(user) + return FINISH_ATTACK if(timing) //removing the core is less risk then cutting wires, and doesnt take long, so we should not let crew do it while the nuke is armed. You can however get to it, without the special screwdriver, if you put the NAD in. to_chat(user, "[core] won't budge, metal clamps keep it in!") - return + return FINISH_ATTACK user.visible_message("[user] starts to pull [core] out of [src]!", "You start to pull [core] out of [src]!") if(do_after(user, 5 SECONDS, target = src)) user.visible_message("[user] pulls [core] out of [src]!", "You pull [core] out of [src]! Might want to put it somewhere safe.") core.forceMove(loc) core = null + update_icon(UPDATE_OVERLAYS) + return FINISH_ATTACK /obj/machinery/nuclearbomb/ui_state(mob/user) return GLOB.physical_state diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index f65680cad613..e4944cadef8f 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -39,7 +39,6 @@ GLOB.coughblock = getAssignedBlock("COUGH", numsToAssign) GLOB.glassesblock = getAssignedBlock("GLASSES", numsToAssign) GLOB.epilepsyblock = getAssignedBlock("EPILEPSY", numsToAssign) - GLOB.twitchblock = getAssignedBlock("TWITCH", numsToAssign) GLOB.nervousblock = getAssignedBlock("NERVOUS", numsToAssign) GLOB.wingdingsblock = getAssignedBlock("WINGDINGS", numsToAssign) GLOB.mesonblock = getAssignedBlock("MESONS", numsToAssign, good=1) diff --git a/code/game/gamemodes/vampire/traitor_vamp.dm b/code/game/gamemodes/vampire/traitor_vamp.dm index 68224edcc120..c45cb7dcd1f9 100644 --- a/code/game/gamemodes/vampire/traitor_vamp.dm +++ b/code/game/gamemodes/vampire/traitor_vamp.dm @@ -13,7 +13,7 @@ /datum/game_mode/traitor/vampire/announce() to_chat(world, "The current game mode is - Traitor+Vampire!") - to_chat(world, "There are Bluespace Vampires infesting your fellow crew on the station along with some syndicate operatives out for their own gain! Do not let the vampires and the traitors succeed!") + to_chat(world, "There are Vampires on the station along with syndicate operatives out for their own gain! Do not let the vampires and the traitors succeed!") /datum/game_mode/traitor/vampire/pre_setup() diff --git a/code/game/gamemodes/vampire/vampire_gamemode.dm b/code/game/gamemodes/vampire/vampire_gamemode.dm index 05b15dae3a0c..4ad4a77db415 100644 --- a/code/game/gamemodes/vampire/vampire_gamemode.dm +++ b/code/game/gamemodes/vampire/vampire_gamemode.dm @@ -12,7 +12,7 @@ /datum/game_mode/vampire/announce() to_chat(world, "The current game mode is - Vampires!") - to_chat(world, "There are Bluespace Vampires infesting your fellow crewmates, keep your blood close and neck safe!") + to_chat(world, "There are Vampires aboard, keep your blood close and neck safe!") /datum/game_mode/vampire/pre_setup() diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 2cf42faeaee8..73675382d745 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -1,12 +1,12 @@ // This whole file really needs reorganising at some point, or at the very least the construct stuff should be moved somewhere else. /obj/item/soulstone - name = "soul stone shard" + name = "soul stone" icon = 'icons/obj/wizard.dmi' icon_state = "soulstone" item_state = "electronic" belt_icon = "soulstone" var/icon_state_full = "soulstone2" - desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artifact's power." + desc = "A weighty shard of dark crystal, flickering with eldritch energy. A soul can be bound within, forced to obey the commands of the owner." w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT origin_tech = "bluespace=4;materials=5" diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index b2dfdb8679cc..0bac558e2242 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -71,14 +71,15 @@ storedpda = null update_icon() -/obj/machinery/pdapainter/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_unfasten_wrench(user, I)) +/obj/machinery/pdapainter/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_unfasten_wrench(user, used)) power_change() - return - if(istype(I, /obj/item/pda)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/pda)) insertpda(user) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/pdapainter/welder_act(mob/user, obj/item/I) . = TRUE diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index d10068371063..9f65294b5bf9 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -28,6 +28,7 @@ active_power_consumption = 2500 light_color = LIGHT_COLOR_CYAN + light_power = 0.5 /obj/machinery/sleeper/examine(mob/user) . = ..() @@ -300,49 +301,49 @@ return FALSE add_fingerprint(usr) -/obj/machinery/sleeper/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) +/obj/machinery/sleeper/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) if(!beaker) if(!user.drop_item()) - to_chat(user, "[I] is stuck to you!") - return + to_chat(user, "[used] is stuck to you!") + return ITEM_INTERACT_COMPLETE - beaker = I - I.forceMove(src) - user.visible_message("[user] adds \a [I] to [src]!", "You add \a [I] to [src]!") + beaker = used + used.forceMove(src) + user.visible_message("[user] adds \a [used] to [src]!", "You add \a [used] to [src]!") SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE else to_chat(user, "The sleeper has a beaker already.") - return + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/grab)) - var/obj/item/grab/G = I + if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used if(panel_open) to_chat(user, "Close the maintenance panel first.") - return + return ITEM_INTERACT_COMPLETE if(!ismob(G.affecting)) - return + return ITEM_INTERACT_COMPLETE if(occupant) to_chat(user, "The sleeper is already occupied!") - return + return ITEM_INTERACT_COMPLETE if(G.affecting.has_buckled_mobs()) //mob attached to us to_chat(user, "[G.affecting] will not fit into [src] because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") - return + return ITEM_INTERACT_COMPLETE visible_message("[user] starts putting [G.affecting.name] into the sleeper.") if(do_after(user, 20, target = G.affecting)) if(occupant) to_chat(user, "The sleeper is already occupied!") - return + return ITEM_INTERACT_COMPLETE if(!G || !G.affecting) - return + return ITEM_INTERACT_COMPLETE var/mob/M = G.affecting M.forceMove(src) @@ -352,7 +353,7 @@ add_fingerprint(user) qdel(G) SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index ab53feea9596..68f2fb07dde9 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -9,6 +9,7 @@ idle_power_consumption = 1250 active_power_consumption = 2500 light_color = "#00FF00" + light_power = 0.5 var/mob/living/carbon/human/occupant ///What is the level of the stock parts in the body scanner. A scan_level of one detects organs of stealth_level 1 or below, while a scan level of 4 would detect 4 or below. var/scan_level = 1 @@ -64,28 +65,28 @@ else icon_state = "bodyscanner-open" -/obj/machinery/bodyscanner/attackby__legacy__attackchain(obj/item/I, mob/user) - if(istype(I, /obj/item/grab)) - var/obj/item/grab/TYPECAST_YOUR_SHIT = I +/obj/machinery/bodyscanner/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/grab)) + var/obj/item/grab/TYPECAST_YOUR_SHIT = used if(panel_open) to_chat(user, "Close the maintenance panel first.") - return + return ITEM_INTERACT_COMPLETE if(!ishuman(TYPECAST_YOUR_SHIT.affecting)) - return + return ITEM_INTERACT_COMPLETE if(occupant) to_chat(user, "The scanner is already occupied!") - return + return ITEM_INTERACT_COMPLETE if(TYPECAST_YOUR_SHIT.affecting.has_buckled_mobs()) //mob attached to us to_chat(user, "[TYPECAST_YOUR_SHIT.affecting] will not fit into [src] because [TYPECAST_YOUR_SHIT.affecting.p_they()] [TYPECAST_YOUR_SHIT.affecting.p_have()] a fucking slime latched onto [TYPECAST_YOUR_SHIT.affecting.p_their()] head.") - return + return ITEM_INTERACT_COMPLETE var/mob/living/carbon/human/M = TYPECAST_YOUR_SHIT.affecting if(M.abiotic()) to_chat(user, "Subject may not hold anything in their hands.") - return + return ITEM_INTERACT_COMPLETE M.forceMove(src) occupant = M @@ -94,7 +95,7 @@ add_fingerprint(user) qdel(TYPECAST_YOUR_SHIT) SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/airlock_control/airlock_button.dm b/code/game/machinery/airlock_control/airlock_button.dm index a4f9ed2c77e7..649cce770091 100644 --- a/code/game/machinery/airlock_control/airlock_button.dm +++ b/code/game/machinery/airlock_control/airlock_button.dm @@ -32,11 +32,12 @@ GLOBAL_LIST_EMPTY(all_airlock_access_buttons) else icon_state = "access_button_off" -/obj/machinery/access_button/attackby__legacy__attackchain(obj/item/I, mob/user, params) - //Swiping ID on the access button - if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) +/obj/machinery/access_button/item_interaction(mob/living/user, obj/item/used, list/modifiers) + // Swiping ID on the access button + if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) attack_hand(user) - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/access_button/attack_ghost(mob/user) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index b002ff4405cf..091cb5a27b23 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -37,6 +37,7 @@ var/list/categories = list("Tools", "Electronics", "Construction", "Communication", "Security", "Machinery", "Medical", "Miscellaneous", "Dinnerware", "Imported") var/board_type = /obj/item/circuitboard/autolathe + var/disk_design_load_delay = 1.5 SECONDS /obj/machinery/autolathe/Initialize(mapload) . = ..() @@ -263,18 +264,18 @@ data["queue"] = null return data -/obj/machinery/autolathe/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/autolathe/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(busy) to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") - return TRUE + return ITEM_INTERACT_COMPLETE if(stat) - return TRUE + return ITEM_INTERACT_COMPLETE // Disks in general - if(istype(O, /obj/item/disk)) - if(istype(O, /obj/item/disk/design_disk)) - var/obj/item/disk/design_disk/D = O + if(istype(used, /obj/item/disk)) + if(istype(used, /obj/item/disk/design_disk)) + var/obj/item/disk/design_disk/D = used if(D.blueprint) var/datum/design/design = D.blueprint // READ ONLY!! @@ -287,13 +288,13 @@ return TRUE user.visible_message( - "[user] begins to load \the [O] in \the [src]...", - "You begin to load a design from \the [O]...", + "[user] begins to load \the [used] in \the [src]...", + "You begin to load a design from \the [used]...", "You hear the chatter of a floppy drive." ) playsound(get_turf(src), 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) busy = TRUE - if(do_after(user, 14.4, target = src)) + if(do_after(user, disk_design_load_delay, target = src)) imported[design.id] = TRUE files.AddDesign2Known(design) recipiecache = list() @@ -301,12 +302,12 @@ busy = FALSE else to_chat(user, "That disk does not have a design on it!") - return TRUE + return ITEM_INTERACT_COMPLETE else // So that people who are bad at computers don't shred their disks to_chat(user, "This is not the correct type of disk for the autolathe!") - return TRUE + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index bc793fadcc35..b0c397130804 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -141,37 +141,40 @@ toggle_cam(null, 0) ..() -/obj/machinery/camera/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) - var/msg = "You attach [I] into the assembly inner circuits." +/obj/machinery/camera/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/msg = "You attach [used] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" - if(istype(I, /obj/item/stack/sheet/mineral/plasma) && panel_open) - if(!user.canUnEquip(I, FALSE)) - to_chat(user, "[I] is stuck to your hand!") - return + if(istype(used, /obj/item/stack/sheet/mineral/plasma) && panel_open) + if(!user.canUnEquip(used, FALSE)) + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE if(!isEmpProof()) - var/obj/item/stack/sheet/mineral/plasma/P = I + var/obj/item/stack/sheet/mineral/plasma/P = used upgradeEmpProof() to_chat(user, "[msg]") P.use(1) + return ITEM_INTERACT_COMPLETE else to_chat(user, "[msg2]") - else if(istype(I, /obj/item/assembly/prox_sensor) && panel_open) - if(!user.canUnEquip(I, FALSE)) - to_chat(user, "[I] is stuck to your hand!") - return + else if(istype(used, /obj/item/assembly/prox_sensor) && panel_open) + if(!user.canUnEquip(used, FALSE)) + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE if(!isMotion()) upgradeMotion() to_chat(user, "[msg]") - qdel(I) + qdel(used) else to_chat(user, "[msg2]") + return ITEM_INTERACT_COMPLETE + // OTHER - else if((istype(I, /obj/item/paper) || istype(I, /obj/item/pda)) && isliving(user)) + else if((istype(used, /obj/item/paper) || istype(used, /obj/item/pda)) && isliving(user)) if(!can_use()) to_chat(user, "You can't show something to a disabled camera!") - return + return ITEM_INTERACT_COMPLETE var/mob/living/U = user var/obj/item/paper/X = null @@ -179,12 +182,12 @@ var/itemname = "" var/info = "" - if(istype(I, /obj/item/paper)) - X = I + if(istype(used, /obj/item/paper)) + X = used itemname = X.name info = X.info else - PDA = I + PDA = used var/datum/data/pda/app/notekeeper/N = PDA.find_program(/datum/data/pda/app/notekeeper) if(N) itemname = PDA.name @@ -195,7 +198,7 @@ if(is_ai(O)) var/mob/living/silicon/ai/AI = O if(AI.control_disabled || (AI.stat == DEAD)) - return + return ITEM_INTERACT_COMPLETE if(U.name == "Unknown") to_chat(AI, "[U] holds \a [itemname] up to one of your cameras ...") else @@ -204,13 +207,11 @@ else if(O.client && O.client.eye == src) to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...") O << browse("[itemname][info]", "window=[itemname]") - - else if(istype(I, /obj/item/laser_pointer)) - var/obj/item/laser_pointer/L = I + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/laser_pointer)) + var/obj/item/laser_pointer/L = used L.laser_act(src, user) - else - return ..() - + return ITEM_INTERACT_COMPLETE /obj/machinery/camera/screwdriver_act(mob/user, obj/item/I) . = TRUE diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 3b1f8c908438..b60930e4be31 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -60,34 +60,35 @@ if(charging) . += "Current charge: [round(charging.percent(), 1)]%" -/obj/machinery/cell_charger/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/stock_parts/cell) && !panel_open) +/obj/machinery/cell_charger/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/stock_parts/cell) && !panel_open) if(stat & BROKEN) to_chat(user, "[src] is broken!") - return + return ITEM_INTERACT_COMPLETE if(!anchored) to_chat(user, "[src] isn't attached to the ground!") - return + return ITEM_INTERACT_COMPLETE if(charging) to_chat(user, "There is already a cell in the charger!") - return + return ITEM_INTERACT_COMPLETE else var/area/a = loc.loc // Gets our locations location, like a dream within a dream if(!isarea(a)) - return + return ITEM_INTERACT_COMPLETE if(!a.powernet.has_power(PW_CHANNEL_EQUIPMENT)) // There's no APC in this area, don't try to cheat power! to_chat(user, "[src] blinks red as you try to insert the cell!") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE - I.forceMove(src) - charging = I + used.forceMove(src) + charging = used user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") check_level() update_icon(UPDATE_OVERLAYS) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/cell_charger/crowbar_act(mob/user, obj/item/I) if(panel_open && !charging && default_deconstruction_crowbar(user, I)) diff --git a/code/game/machinery/clonepod.dm b/code/game/machinery/clonepod.dm index 396f107fe9b1..d9cdc6277ef1 100644 --- a/code/game/machinery/clonepod.dm +++ b/code/game/machinery/clonepod.dm @@ -560,26 +560,25 @@ return RP return FALSE -//Attackby and x_acts -/obj/machinery/clonepod/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(I.is_open_container()) - return +/obj/machinery/clonepod/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(used.is_open_container()) + return ITEM_INTERACT_SKIP_TO_AFTER_ATTACK - if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) if(!allowed(user)) to_chat(user, "Access denied.") - return + return ITEM_INTERACT_COMPLETE switch(tgui_alert(user, "Perform an emergency ejection of [src]?", "Cloning pod", list("Yes", "No"))) if("Yes") eject_clone(TRUE) // GET OUT to_chat(user, "You force [src] to eject its clone!") log_admin("[key_name(user)] has activated a cloning pod's emergency eject at [COORD(src)] (clone: [key_name(clone)])") - return + return ITEM_INTERACT_COMPLETE - if(is_organ(I) || is_type_in_list(I, ALLOWED_ROBOT_PARTS)) //fun fact, robot parts aren't organs! - insert_organ(I, user) - return + if(is_organ(used) || is_type_in_list(used, ALLOWED_ROBOT_PARTS)) //fun fact, robot parts aren't organs! + insert_organ(used, user) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 5794a99269b6..a729cc402d45 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -35,6 +35,7 @@ /obj/machinery/computer/holodeck_control/Initialize(mapload) . = ..() linkedholodeck = locate(/area/holodeck/alphadeck) + RegisterSignal(src, COMSIG_ATTACK_BY, TYPE_PROC_REF(/datum, signal_cancel_attack_by)) /obj/machinery/computer/holodeck_control/Destroy() emergency_shutdown() @@ -43,9 +44,6 @@ /obj/machinery/computer/holodeck_control/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/holodeck_control/attackby__legacy__attackchain(obj/item/D, mob/user) - return - /obj/machinery/computer/holodeck_control/attack_ghost(mob/user) ui_interact(user) return ..() @@ -438,8 +436,9 @@ to_chat(user, "The station AI is not to interact with these devices.") return -/obj/machinery/readybutton/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) +/obj/machinery/readybutton/item_interaction(mob/living/user, obj/item/used, list/modifiers) to_chat(user, "The device is a solid button, there's nothing you can do with it!") + return ITEM_INTERACT_COMPLETE /obj/machinery/readybutton/attack_hand(mob/user) if(user.stat || stat & (BROKEN)) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 9b3fee6c25ca..3d2fc2646d09 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -19,26 +19,29 @@ parent_area_type = machine_area.get_top_parent_type() /obj/machinery/computer/atmos_alert/process() - // This is relatively cheap because the areas list is pretty small - for(var/obj/machinery/alarm/air_alarm as anything in GLOB.air_alarms) - if(!((get_area(air_alarm)).type in typesof(parent_area_type)) || air_alarm.z != z) - continue // Not an area we monitor, or outside our z-level - if(!air_alarm.report_danger_level) + alarm_cache = list() + alarm_cache["priority"] = list() + alarm_cache["minor"] = list() + alarm_cache["mode"] = list() + for(var/area/A in GLOB.all_areas) + if(!istype(A, parent_area_type)) continue - switch(air_alarm.alarm_area.atmosalm) - if(ATMOS_ALARM_DANGER) - alarm_cache["priority"] |= air_alarm.alarm_area.name - alarm_cache["minor"] -= air_alarm.alarm_area.name - if(ATMOS_ALARM_WARNING) - alarm_cache["priority"] -= air_alarm.alarm_area.name - alarm_cache["minor"] |= air_alarm.alarm_area.name - else - alarm_cache["priority"] -= air_alarm.alarm_area.name - alarm_cache["minor"] -= air_alarm.alarm_area.name - if(air_alarm.mode == AALARM_MODE_FILTERING) - alarm_cache["mode"] -= air_alarm.alarm_area.name - else - alarm_cache["mode"][air_alarm.alarm_area.name] = GLOB.aalarm_modes["[air_alarm.mode]"] + var/alarm_level = null + for(var/obj/machinery/alarm/air_alarm in A.air_alarms) + if(!istype(air_alarm)) + continue + if(!air_alarm.report_danger_level) + continue + switch(air_alarm.alarm_area.atmosalm) + if(ATMOS_ALARM_DANGER) + alarm_level = "priority" + if(ATMOS_ALARM_WARNING) + if(isnull(alarm_level)) + alarm_level = "minor" + if(!isnull(alarm_level)) + alarm_cache[alarm_level] += A.name + if(air_alarm.mode != AALARM_MODE_FILTERING) + alarm_cache["mode"][A.name] = GLOB.aalarm_modes["[air_alarm.mode]"] update_icon() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index c0614dc52ea4..c78b37fae1c9 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -568,14 +568,18 @@ /obj/structure/computerframe name = "computer frame" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "comp_frame_1" + icon = 'icons/obj/computer.dmi' + icon_state = "computer" density = TRUE anchored = TRUE max_integrity = 100 var/state = STATE_EMPTY var/obj/item/circuitboard/circuit = null +/obj/structure/computerframe/Initialize(mapload) + . = ..() + overlays += "comp_frame_1" + /obj/structure/computerframe/examine(mob/user) . = ..() . += "It is [anchored ? "bolted to the floor" : "unbolted"]." @@ -624,8 +628,9 @@ if(state == STATE_GLASS) new /obj/item/stack/sheet/glass(location, 2) -/obj/structure/computerframe/update_icon_state() - icon_state = "comp_frame_[state]" +/obj/structure/computerframe/update_overlays() + ..() + . += "comp_frame_[state]" /obj/structure/computerframe/welder_act(mob/user, obj/item/I) if(state != STATE_EMPTY) diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index 1bcf98280039..4825064a7d69 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -1,3 +1,7 @@ +/// The root type of all camera consoles. When used, these open a UI that has a left-hand sidebar +/// displaying a list of active cameras in the console's assigned camera `network`. The bulk of the window +/// on the right hand side displays a camera feed of the selected camera. This feed will attempt to refresh +/// every time process() is called by SSobj as long as there are active watchers, living or dead. /obj/machinery/computer/security name = "security camera console" desc = "Used to access the various cameras networks on the station." @@ -10,7 +14,10 @@ var/list/network = list("SS13","Mining Outpost") var/obj/machinery/camera/active_camera + /// The list of total watchers, living and dead, of this console. var/list/watchers = list() + /// The list of living watchers of this console. Used for playing a "terminal on" sound on first live viewer. + var/list/living_watchers = list() // Stuff needed to render the map var/map_name @@ -20,7 +27,7 @@ var/list/cam_plane_masters var/atom/movable/screen/background/cam_background - // Parent object this camera is assigned to. Used for camera bugs + /// Parent object this camera is assigned to. Used for camera bugs var/atom/movable/parent /// is the console silent when switching cameras? @@ -46,6 +53,7 @@ cam_background.del_on_map_removal = FALSE /obj/machinery/computer/security/Destroy() + STOP_PROCESSING(SSobj, src) qdel(cam_screen) qdel(cam_background) return ..() @@ -64,10 +72,11 @@ var/is_living = isliving(user) // Ghosts shouldn't count towards concurrent users, which produces // an audible terminal_on click. + watchers += user_uid if(is_living) - watchers += user_uid + living_watchers += user_uid // Turn on the console - if(length(watchers) == 1 && is_living) + if(length(living_watchers) == 1 && is_living) if(!silent_console) playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_consumption) @@ -85,10 +94,18 @@ // Open UI ui = new(user, src, "CameraConsole", name) ui.open() + START_PROCESSING(SSobj, src) + +/obj/machinery/computer/security/process() + update_viewer() + if(length(watchers)) + return + STOP_PROCESSING(SSobj, src) /obj/machinery/computer/security/ui_close(mob/user) ..() watchers -= user.UID() + living_watchers -= user.UID() user.client.clear_map(map_name) /obj/machinery/computer/security/ui_data() @@ -126,25 +143,27 @@ active_camera = C if(!silent_console) playsound(src, get_sfx("terminal_type"), 25, FALSE) + return update_viewer() - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() - return TRUE +/obj/machinery/computer/security/proc/update_viewer() + // Show static if can't use the camera + if(!active_camera?.can_use()) + show_camera_static() + return TRUE - var/list/visible_turfs = list() - for(var/turf/T in view(C.view_range, get_turf(C))) - visible_turfs += T + var/list/visible_turfs = list() + for(var/turf/T in view(active_camera.view_range, get_turf(active_camera))) + visible_turfs += T - var/list/bbox = get_bbox_of_atoms(visible_turfs) - var/size_x = bbox[3] - bbox[1] + 1 - var/size_y = bbox[4] - bbox[2] + 1 + var/list/bbox = get_bbox_of_atoms(visible_turfs) + var/size_x = bbox[3] - bbox[1] + 1 + var/size_y = bbox[4] - bbox[2] + 1 - cam_screen.vis_contents = visible_turfs - cam_background.icon_state = "clear" - cam_background.fill_rect(1, 1, size_x, size_y) + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, size_x, size_y) - return TRUE + return TRUE // Returns the list of cameras accessible from this computer /obj/machinery/computer/security/proc/get_available_cameras() @@ -233,6 +252,11 @@ /obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() set_light(1, LIGHTING_MINIMUM_POWER) //so byond doesnt cull, and we get an emissive appearance + GLOB.telescreens += src + +/obj/machinery/computer/security/telescreen/entertainment/Destroy() + GLOB.telescreens -= src + return ..() /obj/machinery/computer/security/telescreen/entertainment/update_overlays() if(feeds_on) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index dd3c3014f01e..a902fd306dfd 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -152,7 +152,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else to_chat(user, "There is nothing to remove from the console.") -/obj/machinery/computer/card/attackby__legacy__attackchain(obj/item/card/id/id_card, mob/user, params) +/obj/machinery/computer/card/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/obj/item/card/id/id_card = used if(!istype(id_card)) return ..() if(istype(id_card, /obj/item/card/id/nct_data_chip)) @@ -172,6 +173,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) SStgui.update_uis(src) attack_hand(user) + return ITEM_INTERACT_COMPLETE + //Check if you can't touch a job in any way whatsoever /obj/machinery/computer/card/proc/job_blacklisted_full(datum/job/job) return (job.type in blacklisted_full) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index c858e7668e52..6e4988b97f0a 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -47,42 +47,41 @@ P.console = null return ..() -/obj/machinery/computer/cloning/attackby__legacy__attackchain(obj/item/I, mob/user, params) - - if(!ismultitool(I)) +/obj/machinery/computer/cloning/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(!ismultitool(used)) return ..() - var/obj/item/multitool/M = I + var/obj/item/multitool/M = used if(!M.buffer) to_chat(user, "[M]'[M.p_s()] buffer is empty!") - return + return ITEM_INTERACT_COMPLETE if(istype(M.buffer, /obj/machinery/clonepod)) var/obj/machinery/clonepod/buffer_pod = M.buffer if(buffer_pod.console == src) to_chat(user, "[M.buffer] is already linked!") - return + return ITEM_INTERACT_COMPLETE pods += M.buffer buffer_pod.console = src to_chat(user, "[M.buffer] was successfully added to the cloning pod array.") if(!selected_pod) selected_pod = buffer_pod - return + return ITEM_INTERACT_COMPLETE if(istype(M.buffer, /obj/machinery/clonescanner)) var/obj/machinery/clonescanner/buffer_scanner = M.buffer if(scanner) to_chat(user, "There's already a linked scanner!") - return + return ITEM_INTERACT_COMPLETE scanner = buffer_scanner buffer_scanner.console = src to_chat(user, "[M.buffer] was successfully linked.") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "[M.buffer] cannot be linked to [src].") - return + return ITEM_INTERACT_COMPLETE /obj/machinery/computer/cloning/attack_ai(mob/user) return attack_hand(user) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index d50a9ee83836..5d4752144d4d 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -193,7 +193,7 @@ return ..() /obj/machinery/computer/nonfunctional - name = "broken computer" + name = "derelict computer" desc = "A computer long since rendered non-functional due to lack of maintenance. \ It is spitting out error messages." circuit = /obj/item/circuitboard/nonfunctional diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index b21fa7102b0b..9da3b2c4e3ad 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -28,16 +28,19 @@ circuit = /obj/item/circuitboard/aiupload_broken return TRUE -/obj/machinery/computer/aiupload/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(!istype(O, /obj/item/ai_module)) +/obj/machinery/computer/aiupload/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/obj/item/ai_module/module = used + if(!istype(module)) return ..() if(!check_valid_selection(user)) - return + return ITEM_INTERACT_COMPLETE if(!emagged) //non-emag law change - var/obj/item/ai_module/M = O - return M.install(src) + module.install(src) + return ITEM_INTERACT_COMPLETE + apply_emag_laws(user) - return + + return ITEM_INTERACT_COMPLETE /// checks to ensure there is a selected AI, and that it is on the same Z level /obj/machinery/computer/aiupload/proc/check_valid_selection(mob/user) @@ -127,19 +130,20 @@ circuit = /obj/item/circuitboard/borgupload var/mob/living/silicon/robot/current = null -/obj/machinery/computer/borgupload/attackby__legacy__attackchain(obj/item/ai_module/module, mob/user, params) - if(istype(module, /obj/item/ai_module)) +/obj/machinery/computer/borgupload/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/obj/item/ai_module/module = used + if(istype(module)) if(!current)//no borg selected to_chat(user, "No borg selected. Please chose a target before proceeding with upload.") - return + return ITEM_INTERACT_COMPLETE var/turf/T = get_turf(current) if(!atoms_share_level(T, src)) to_chat(user, "Unable to establish a connection: You're too far away from the target silicon!") - return + return ITEM_INTERACT_COMPLETE module.install(src) - return - return ..() + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/borgupload/attack_hand(mob/user) if(stat & NOPOWER) diff --git a/code/game/machinery/computer/medical_records.dm b/code/game/machinery/computer/medical_records.dm index 377765d49950..811c5c847109 100644 --- a/code/game/machinery/computer/medical_records.dm +++ b/code/game/machinery/computer/medical_records.dm @@ -63,9 +63,10 @@ active2 = null return ..() -/obj/machinery/computer/med_data/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(ui_login_attackby(O, user)) - return +/obj/machinery/computer/med_data/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(ui_login_attackby(used, user)) + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/med_data/attack_hand(mob/user) diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 5df576b11705..4778ba8a8233 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -21,16 +21,17 @@ GLOB.prisoncomputer_list -= src return ..() -/obj/machinery/computer/prisoner/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/computer/prisoner/item_interaction(mob/living/user, obj/item/used, list/modifiers) var/datum/ui_login/state = ui_login_get() if(state.logged_in) - var/obj/item/card/id/prisoner/I = O + var/obj/item/card/id/prisoner/I = used if(istype(I) && user.drop_item()) I.forceMove(src) inserted_id_uid = I.UID() - return - if(ui_login_attackby(O, user)) - return + return ITEM_INTERACT_COMPLETE + if(ui_login_attackby(used, user)) + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/prisoner/attack_ai(mob/user) diff --git a/code/game/machinery/computer/security_records.dm b/code/game/machinery/computer/security_records.dm index bbcb1ad3a71c..8bebd9a7d527 100644 --- a/code/game/machinery/computer/security_records.dm +++ b/code/game/machinery/computer/security_records.dm @@ -57,9 +57,10 @@ record_security = null return ..() -/obj/machinery/computer/secure_data/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(ui_login_attackby(O, user)) - return +/obj/machinery/computer/secure_data/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(ui_login_attackby(used, user)) + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/secure_data/attack_hand(mob/user) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 327d6885e6a7..765af9c34c68 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -339,7 +339,7 @@ //Delete all items not on the preservation list. var/list/items = contents - items -= occupant // Don't delete the occupant + items -= occupant // Don't delete the occupant // this fucking nullspaces the occupant btw, i fuckin hate old code items -= announce // or the autosay radio. ADD_TRAIT(occupant, TRAIT_CRYO_DESPAWNING, TRAIT_GENERIC) @@ -367,6 +367,8 @@ if(IS_SACRIFICE_TARGET(occupant.mind)) SSticker.mode.cult_team.find_new_sacrifice_target() + SSticker.mode.on_mob_cryo(occupant, src) + //Update any existing objectives involving this mob. if(occupant.mind) if(occupant.mind.initial_account) @@ -385,10 +387,6 @@ if(occupant.mind.objective_holder.clear()) occupant.mind.special_role = null - else - if(SSticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode - current_mode.possible_traitors.Remove(occupant) // Delete them from datacore. @@ -452,64 +450,64 @@ name = initial(name) -/obj/machinery/cryopod/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/grab)) - var/obj/item/grab/G = I +/obj/machinery/cryopod/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/obj/item/grab/G = used + if(!istype(G)) + return ..() - if(occupant) - to_chat(user, "[src] is in use.") - return + if(occupant) + to_chat(user, "[src] is in use.") + return ITEM_INTERACT_COMPLETE - if(!ismob(G.affecting)) - return + if(!ismob(G.affecting)) + return ITEM_INTERACT_COMPLETE - if(!check_occupant_allowed(G.affecting)) - return + if(!check_occupant_allowed(G.affecting)) + return ITEM_INTERACT_COMPLETE - var/willing = null //We don't want to allow people to be forced into despawning. - var/mob/living/M = G.affecting - time_till_despawn = initial(time_till_despawn) + var/willing = null //We don't want to allow people to be forced into despawning. + var/mob/living/M = G.affecting + time_till_despawn = initial(time_till_despawn) - if(!istype(M) || M.stat == DEAD) - to_chat(user, "Dead people can not be put into cryo.") - return + if(!istype(M) || M.stat == DEAD) + to_chat(user, "Dead people can not be put into cryo.") + return ITEM_INTERACT_COMPLETE - if(M.client) - if(tgui_alert(M, "Would you like to enter long-term storage?", "Cryosleep", list("Yes", "No")) == "Yes") - if(!M || !G || !G.affecting) - return - willing = willing_time_divisor - else - willing = 1 + if(M.client) + if(tgui_alert(M, "Would you like to enter long-term storage?", "Cryosleep", list("Yes", "No")) == "Yes") + if(!M || !G || !G.affecting) + return ITEM_INTERACT_COMPLETE + willing = willing_time_divisor + else + willing = 1 - if(willing) + if(willing) - visible_message("[user] starts putting [G.affecting.name] into [src].") + visible_message("[user] starts putting [G.affecting.name] into [src].") - if(do_after(user, 20, target = G.affecting)) - if(!M || !G || !G.affecting) - return + if(do_after(user, 20, target = G.affecting)) + if(!M || !G || !G.affecting) + return ITEM_INTERACT_COMPLETE - if(occupant) - to_chat(user, "[src] is in use.") - return + if(occupant) + to_chat(user, "[src] is in use.") + return ITEM_INTERACT_COMPLETE - take_occupant(M, willing) + take_occupant(M, willing) - else //because why the fuck would you keep going if the mob isn't in the pod - to_chat(user, "You stop putting [M] into the cryopod.") - return + else //because why the fuck would you keep going if the mob isn't in the pod + to_chat(user, "You stop putting [M] into the cryopod.") + return ITEM_INTERACT_COMPLETE - icon_state = occupied_icon_state + icon_state = occupied_icon_state - M.throw_alert("cryopod", /atom/movable/screen/alert/ghost/cryo) - to_chat(M, "[on_enter_occupant_message]") - to_chat(M, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") + M.throw_alert("cryopod", /atom/movable/screen/alert/ghost/cryo) + to_chat(M, "[on_enter_occupant_message]") + to_chat(M, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - take_occupant(M, willing) - else - return ..() + take_occupant(M, willing) + return ITEM_INTERACT_COMPLETE /obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index c2389895e0cb..d545b1c6e13a 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -510,7 +510,7 @@ /obj/machinery/disco/immobile name = "radiant dance machine mark V" - desc = "The mark V is nigh-immovable, thanks to its bluespace-plastitanium anchor. The technology required to stop visitors from stealing this thing is astounding." + desc = "A massive disco ball permanently anchored to the floor with heat-sealed bolts. Merely being in the presence of such a majestic contraption fills you with the urge to dance." anchored = TRUE /obj/machinery/disco/immobile/wrench_act() diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index ea7e911c2f39..6edc2deb731d 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -85,35 +85,36 @@ defib.paddles_on_defib = FALSE user.put_in_hands(defib.paddles) -/obj/machinery/defibrillator_mount/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/defibrillator)) +/obj/machinery/defibrillator_mount/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/defibrillator)) if(defib) to_chat(user, "There's already a defibrillator in [src]!") - return - if(I.flags & NODROP || !user.drop_item() || !I.forceMove(src)) - to_chat(user, "[I] is stuck to your hand!") - return - user.visible_message("[user] hooks up [I] to [src]!", \ - "You press [I] into the mount, and it clicks into place.") + return ITEM_INTERACT_COMPLETE + if(used.flags & NODROP || !user.drop_item() || !used.forceMove(src)) + to_chat(user, "[used] is stuck to your hand!") + return ITEM_INTERACT_COMPLETE + user.visible_message("[user] hooks up [used] to [src]!", \ + "You press [used] into the mount, and it clicks into place.") playsound(src, 'sound/machines/click.ogg', 50, TRUE) - defib = I + defib = used update_icon(UPDATE_OVERLAYS) - return - else if(defib && I == defib.paddles) + return ITEM_INTERACT_COMPLETE + else if(defib && used == defib.paddles) user.drop_item() - return - var/obj/item/card/id = I.GetID() + return ITEM_INTERACT_COMPLETE + var/obj/item/card/id = used.GetID() if(id) if(check_access(id) || SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! if(!defib) to_chat(user, "You can't engage the clamps on a defibrillator that isn't there.") - return + return ITEM_INTERACT_COMPLETE clamps_locked = !clamps_locked to_chat(user, "Clamps [clamps_locked ? "" : "dis"]engaged.") update_icon(UPDATE_OVERLAYS) else to_chat(user, "Insufficient access.") - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/defibrillator_mount/wrench_act(mob/user, obj/item/I) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 427dc4585a6c..4143930ec3cb 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -35,9 +35,9 @@ else to_chat(user, "Error, no route to host.") -/obj/machinery/door_control/attackby__legacy__attackchain(obj/item/W, mob/user as mob, params) - if(istype(W, /obj/item/detective_scanner)) - return +/obj/machinery/door_control/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/detective_scanner)) + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/door_control/emag_act(user as mob) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5fdc17752760..ef09ebfda5b6 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -103,7 +103,6 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) var/doorDeni = 'sound/machines/deniedbeep.ogg' // i'm thinkin' Deni's var/boltUp = 'sound/machines/boltsup.ogg' var/boltDown = 'sound/machines/boltsdown.ogg' - var/is_special = FALSE /// Our ID tag for map-based linking shenanigans var/id_tag /// List of people who have shocked this door for logging purposes @@ -977,63 +976,67 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) else to_chat(user, "The door is now in fast mode.") -/obj/machinery/door/airlock/attackby__legacy__attackchain(obj/item/C, mob/user, params) +/obj/machinery/door/airlock/item_interaction(mob/living/user, obj/item/used, list/modifiers) add_fingerprint(user) if(!headbutt_shock_check(user)) - return + return ITEM_INTERACT_COMPLETE if(panel_open) switch(security_level) if(AIRLOCK_SECURITY_NONE) - if(istype(C, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/S = C + if(istype(used, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/S = used if(S.get_amount() < 2) to_chat(user, "You need at least 2 metal sheets to reinforce [src].") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You start reinforcing [src]...") if(do_after(user, 20, 1, target = src)) if(!panel_open || !S.use(2)) - return + return ITEM_INTERACT_COMPLETE user.visible_message("[user] reinforces \the [src] with metal.", "You reinforce \the [src] with metal.") security_level = AIRLOCK_SECURITY_METAL update_icon() - return - else if(istype(C, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/S = C + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/S = used if(S.get_amount() < 2) to_chat(user, "You need at least 2 plasteel sheets to reinforce [src].") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You start reinforcing [src]...") if(do_after(user, 20, 1, target = src)) if(!panel_open || !S.use(2)) - return + return ITEM_INTERACT_COMPLETE user.visible_message("[user] reinforces \the [src] with plasteel.", "You reinforce \the [src] with plasteel.") security_level = AIRLOCK_SECURITY_PLASTEEL modify_max_integrity(normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER) damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R update_icon() - return + return ITEM_INTERACT_COMPLETE - if(istype(C, /obj/item/assembly/signaler)) - return interact_with_panel(user) - else if(istype(C, /obj/item/pai_cable)) // -- TLE - var/obj/item/pai_cable/cable = C + if(istype(used, /obj/item/assembly/signaler)) + interact_with_panel(used) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/pai_cable)) // -- TLE + var/obj/item/pai_cable/cable = used cable.plugin(src, user) - else if(istype(C, /obj/item/paper) || istype(C, /obj/item/photo)) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/paper) || istype(used, /obj/item/photo)) if(note) to_chat(user, "There's already something pinned to this airlock! Use wirecutters or your hands to remove it.") - return - if(!user.transfer_item_to(C, src)) - to_chat(user, "For some reason, you can't attach [C]!") - return - C.add_fingerprint(user) - user.create_log(MISC_LOG, "put [C] on", src) - user.visible_message("[user] pins [C] to [src].", "You pin [C] to [src].") - note = C + return ITEM_INTERACT_COMPLETE + if(!user.transfer_item_to(used, src)) + to_chat(user, "For some reason, you can't attach [used]!") + return ITEM_INTERACT_COMPLETE + used.add_fingerprint(user) + user.create_log(MISC_LOG, "put [used] on", src) + user.visible_message("[user] pins [used] to [src].", "You pin [used] to [src].") + note = used update_icon() - else - return ..() + + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/door/airlock/screwdriver_act(mob/user, obj/item/I) if(!headbutt_shock_check(user)) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 686cf95dc02c..96632e6ce7dc 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -200,14 +200,15 @@ DA.update_appearance(UPDATE_NAME|UPDATE_ICON) qdel(src) -/obj/machinery/door/airlock/plasma/attackby__legacy__attackchain(obj/item/C, mob/user, params) - if(C.get_heat() > 300) +/obj/machinery/door/airlock/plasma/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(used.get_heat() > 300) message_admins("Plasma airlock ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)") log_game("Plasma airlock ignited by [key_name(user)] in ([x],[y],[z])") investigate_log("was ignited by [key_name(user)]","atmos") - ignite(C.get_heat()) - else - return ..() + ignite(used.get_heat()) + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/door/airlock/plasma/glass opacity = FALSE @@ -447,16 +448,17 @@ else lock(TRUE) -/obj/machinery/door/airlock/highsecurity/red/attackby__legacy__attackchain(obj/C, mob/user, params) +/obj/machinery/door/airlock/highsecurity/red/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(!issilicon(user)) if(isElectrified()) if(shock(user, 75)) - return - if(istype(C, /obj/item/detective_scanner)) - return + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/detective_scanner)) + return ITEM_INTERACT_COMPLETE add_fingerprint(user) + return ..() /obj/machinery/door/airlock/highsecurity/red/welder_act(mob/user, obj/item/I) if(shock_user(user, 75)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c89fff93af6a..3363f4f661fe 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -256,13 +256,14 @@ /obj/machinery/door/proc/try_to_crowbar(mob/user, obj/item/I) return -/obj/machinery/door/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(HAS_TRAIT(src, TRAIT_CMAGGED) && I.can_clean()) //If the cmagged door is being hit with cleaning supplies, don't open it, it's being cleaned! - return +/obj/machinery/door/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(HAS_TRAIT(src, TRAIT_CMAGGED) && used.can_clean()) //If the cmagged door is being hit with cleaning supplies, don't open it, it's being cleaned! + return ITEM_INTERACT_SKIP_TO_AFTER_ATTACK - else if(!(I.flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) + else if(!(used.flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) try_to_activate_door(user) - return TRUE + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/door/crowbar_act(mob/user, obj/item/I) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 39ff3baf9723..a09a871ad4ab 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -122,13 +122,14 @@ user.visible_message( "[user] opens [src].", "You open [src].") - open(auto_close = FALSE) + open() -/obj/machinery/door/firedoor/attackby__legacy__attackchain(obj/item/C, mob/user, params) +/obj/machinery/door/firedoor/item_interaction(mob/living/user, obj/item/used, list/modifiers) add_fingerprint(user) if(operating) - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/door/firedoor/try_to_activate_door(mob/user) @@ -186,6 +187,12 @@ welded = !welded update_icon(UPDATE_OVERLAYS) +/obj/machinery/door/firedoor/emag_act(mob/user) + if(!density) + return + autoclose = FALSE + return ..() + /obj/machinery/door/firedoor/try_to_crowbar(obj/item/I, mob/user) if(welded || operating) return @@ -244,15 +251,13 @@ adjust_light() update_icon() -/obj/machinery/door/firedoor/open(auto_close = TRUE) +/obj/machinery/door/firedoor/open() if(welded) return . = ..() - latetoggle(auto_close) + latetoggle() if(active_alarm) layer = closingLayer // Active firedoors take precedence and remain visible over closed airlocks. - if(auto_close) - autoclose = TRUE /obj/machinery/door/firedoor/close() . = ..() @@ -262,20 +267,20 @@ if(active_alarm) . = ..() -/obj/machinery/door/firedoor/proc/latetoggle(auto_close = TRUE) +/obj/machinery/door/firedoor/proc/latetoggle() if(operating || !hasPower() || !nextstate) return if(nextstate == FD_OPEN) - INVOKE_ASYNC(src, PROC_REF(open), auto_close) + INVOKE_ASYNC(src, PROC_REF(open)) if(nextstate == FD_CLOSED) INVOKE_ASYNC(src, PROC_REF(close)) nextstate = null -/obj/machinery/door/firedoor/proc/forcetoggle(magic = FALSE, auto_close = TRUE) +/obj/machinery/door/firedoor/proc/forcetoggle(magic = FALSE) if(!magic && (operating || !hasPower())) return if(density) - open(auto_close) + open() else close() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 3d5bfb36c1ff..d1e4dc769203 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -313,10 +313,10 @@ operating = NONE return TRUE -/obj/machinery/door/window/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) +/obj/machinery/door/window/item_interaction(mob/living/user, obj/item/used, list/modifiers) //If it's in the process of opening/closing, ignore the click if(operating) - return + return ITEM_INTERACT_COMPLETE add_fingerprint(user) return ..() diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 3c3c9998ee99..fe2ea2e65758 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -35,12 +35,12 @@ UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) return ..() -/obj/machinery/doppler_array/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/disk/tech_disk)) - var/obj/item/disk/tech_disk/disk = I +/obj/machinery/doppler_array/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/disk/tech_disk)) + var/obj/item/disk/tech_disk/disk = used disk.load_tech(toxins_tech) to_chat(user, "You swipe the disk into [src].") - return + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/doppler_array/wrench_act(mob/user, obj/item/I) diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm index 32891a83821d..29da54caf56d 100644 --- a/code/game/machinery/dye_generator.dm +++ b/code/game/machinery/dye_generator.dm @@ -50,17 +50,17 @@ dye_color = temp set_light(2, l_color = temp) -/obj/machinery/dye_generator/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/dye_generator/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_unfasten_wrench(user, used, time = 60)) + return ITEM_INTERACT_COMPLETE - if(default_unfasten_wrench(user, I, time = 60)) - return - - if(istype(I, /obj/item/hair_dye_bottle)) - var/obj/item/hair_dye_bottle/HD = I + if(istype(used, /obj/item/hair_dye_bottle)) + var/obj/item/hair_dye_bottle/HD = used user.visible_message("[user] fills [HD] up with some dye.","You fill [HD] up with some hair dye.") HD.dye_color = dye_color HD.update_icon() - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/dye_generator/obj_break(damage_flag) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index e943b88119ed..e6b8638e5f05 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -125,26 +125,26 @@ FIRE ALARM alarm(rand(30/severity, 60/severity)) ..() -/obj/machinery/firealarm/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/firealarm/item_interaction(mob/living/user, obj/item/used, list/modifiers) add_fingerprint(user) if(wiresexposed) - if(buildstage == FIRE_ALARM_UNWIRED) - if(istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = I - if(!coil.use(5)) - to_chat(user, "You need a total of five cables to wire [src]!") - return - buildstage = FIRE_ALARM_READY - playsound(get_turf(src), I.usesound, 50, 1) - to_chat(user, "You wire [src]!") - update_icon() - if(buildstage == FIRE_ALARM_FRAME) - if(istype(I, /obj/item/firealarm_electronics)) - to_chat(user, "You insert the circuit!") - qdel(I) - buildstage = FIRE_ALARM_UNWIRED - update_icon() - return + if(buildstage == FIRE_ALARM_UNWIRED && istype(used, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = used + if(!coil.use(5)) + to_chat(user, "You need a total of five cables to wire [src]!") + return ITEM_INTERACT_COMPLETE + + buildstage = FIRE_ALARM_READY + playsound(get_turf(src), used.usesound, 50, 1) + to_chat(user, "You wire [src]!") + update_icon() + else if(buildstage == FIRE_ALARM_FRAME && istype(used, /obj/item/firealarm_electronics)) + to_chat(user, "You insert the circuit!") + qdel(used) + buildstage = FIRE_ALARM_UNWIRED + update_icon() + + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/firealarm/crowbar_act(mob/user, obj/item/I) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 122dc3f8a625..281d1680205d 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -90,19 +90,21 @@ set_light(brightness_on) update_icon(UPDATE_ICON_STATE) -/obj/machinery/floodlight/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/stock_parts/cell)) +/obj/machinery/floodlight/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/stock_parts/cell)) if(open) if(cell) to_chat(user, "There is a power cell already installed.") else - playsound(loc, W.usesound, 50, TRUE) + playsound(loc, used.usesound, 50, TRUE) user.drop_item() - W.loc = src - cell = W + used.loc = src + cell = used to_chat(user, "You insert the power cell.") + update_icon(UPDATE_ICON_STATE) - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/floodlight/screwdriver_act(mob/living/user, obj/item/I) diff --git a/code/game/machinery/gameboard.dm b/code/game/machinery/gameboard.dm index efeb3ca5543f..a1c666590a0c 100644 --- a/code/game/machinery/gameboard.dm +++ b/code/game/machinery/gameboard.dm @@ -25,7 +25,7 @@ if(stat & NOPOWER) set_light(0) else - set_light(3, 3) + set_light(3, 1) /obj/machinery/gameboard/update_icon_state() if(stat & NOPOWER) diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 3fe784f09c6b..7a51b67bf8d9 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -60,19 +60,20 @@ . = ..() my_terminal_id = ++global_terminal_id -/obj/machinery/computer/guestpass/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id/nct_data_chip)) - to_chat(user, "[I] does not seem compatible with this terminal!") - return - if(istype(I, /obj/item/card/id)) +/obj/machinery/computer/guestpass/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id/nct_data_chip)) + to_chat(user, "[used] does not seem compatible with this terminal!") + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id)) if(!scan) if(user.drop_item()) - I.forceMove(src) - scan = I + used.forceMove(src) + scan = used SStgui.update_uis(src) else to_chat(user, "There is already ID card inside.") - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/guestpass/proc/get_changeable_accesses() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 118340d2df83..28134a989382 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -316,6 +316,8 @@ GLOBAL_LIST_EMPTY(holopads) return if(istype(robot)) interact(robot) + if(ismecha(ai.loc)) // AIs must exit mechs before activating holopads. + return /*There are pretty much only three ways to interact here. I don't need to check for client since they're clicking on an object. This may change in the future but for now will suffice.*/ @@ -555,7 +557,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ HC.Disconnect(HC.calling_holopad) return ..() -/obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) +/obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /obj/effect/overlay/holo_pad_hologram/examine(mob/user) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index de84be7ef08c..3e1dc638f376 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -60,25 +60,27 @@ bag = null update_icon(UPDATE_OVERLAYS) -/obj/machinery/iv_drip/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/iv_bag)) +/obj/machinery/iv_drip/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/iv_bag)) if(bag) to_chat(user, "[src] already has an IV bag!") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE - I.forceMove(src) - bag = I - to_chat(user, "You attach [I] to [src].") + used.forceMove(src) + bag = used + to_chat(user, "You attach [used] to [src].") update_icon(UPDATE_OVERLAYS) START_PROCESSING(SSmachines, src) - else if(bag && istype(I, /obj/item/reagent_containers)) - bag.attackby__legacy__attackchain(I) - I.afterattack__legacy__attackchain(bag, usr, TRUE) + return ITEM_INTERACT_COMPLETE + else if(bag && istype(used, /obj/item/reagent_containers)) + bag.attackby__legacy__attackchain(used) + used.afterattack__legacy__attackchain(bag, usr, TRUE) update_icon(UPDATE_OVERLAYS) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/iv_drip/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm index 1a4c73483346..e6fdfcbf6dde 100644 --- a/code/game/machinery/machine_frame.dm +++ b/code/game/machinery/machine_frame.dm @@ -318,7 +318,8 @@ to destroy them and players will be able to make replacements. "HydroDrobe" = /obj/machinery/economy/vending/hydrodrobe, "JaniDrobe" = /obj/machinery/economy/vending/janidrobe, "LawDrobe" = /obj/machinery/economy/vending/lawdrobe, - "TrainDrobe" = /obj/machinery/economy/vending/traindrobe) + "TrainDrobe" = /obj/machinery/economy/vending/traindrobe, + "CrewVend 3000" = /obj/machinery/economy/vending/custom) var/static/list/unique_vendors = list( "ShadyCigs Ultra" = /obj/machinery/economy/vending/cigarette/beach, "SyndiMed Plus" = /obj/machinery/economy/vending/wallmed/syndicate) @@ -338,7 +339,10 @@ to destroy them and players will be able to make replacements. build_path = typepath board_name = "[type] Vendor" format_board_name() - req_components = list(initial(typepath.refill_canister) = 1) + if(initial(typepath.refill_canister)) + req_components = list(initial(typepath.refill_canister) = 1) + else + req_components = list() /obj/item/circuitboard/slot_machine board_name = "Slot Machine" diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 00fc7a172ce9..259b0ec4ab19 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -9,6 +9,7 @@ atom_say_verb = "beeps" flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.3 + new_attack_chain = TRUE var/stat = 0 /// How is this machine currently passively consuming power? @@ -33,6 +34,8 @@ /// This is if the machinery is being repaired var/being_repaired = FALSE + new_attack_chain = TRUE + /obj/machinery/Initialize(mapload) . = ..() GLOB.machines += src @@ -354,43 +357,45 @@ reregister_machine() power_change() -/obj/machinery/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(exchange_parts(user, O)) - return +/obj/machinery/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(exchange_parts(user, used)) + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/stack/nanopaste)) - var/obj/item/stack/nanopaste/N = O + if(istype(used, /obj/item/stack/nanopaste)) + var/obj/item/stack/nanopaste/N = used if(stat & BROKEN) to_chat(user, "[src] is too damaged to be fixed with nanopaste!") - return + return ITEM_INTERACT_COMPLETE if(obj_integrity == max_integrity) to_chat(user, "[src] is fully intact.") - return + return ITEM_INTERACT_COMPLETE if(being_repaired) - return + return ITEM_INTERACT_COMPLETE if(N.get_amount() < 1) to_chat(user, "You don't have enough to complete this task!") - return + return ITEM_INTERACT_COMPLETE - to_chat(user, "You start applying [O] to [src].") + to_chat(user, "You start applying [used] to [src].") being_repaired = TRUE var/result = do_after(user, 3 SECONDS, target = src) being_repaired = FALSE if(!result) - return + return ITEM_INTERACT_COMPLETE if(!N.use(1)) to_chat(user, "You don't have enough to complete this task!") // this is here, as we don't want to use nanopaste until you finish applying - return + return ITEM_INTERACT_COMPLETE obj_integrity = min(obj_integrity + 50, max_integrity) - user.visible_message("[user] applied some [O] at [src]'s damaged areas.",\ - "You apply some [O] at [src]'s damaged areas.") - else - return ..() + user.visible_message("[user] applied some [used] at [src]'s damaged areas.",\ + "You apply some [used] at [src]'s damaged areas.") + + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/proc/exchange_parts(mob/user, obj/item/storage/part_replacer/W) var/shouldplaysound = 0 diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index c14d22c3cad9..765a1fcd22c8 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -83,73 +83,63 @@ anchored = FALSE var/build = 0 -/obj/machinery/mass_driver_frame/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob) +/obj/machinery/mass_driver_frame/item_interaction(mob/living/user, obj/item/used, list/modifiers) switch(build) if(0) // Loose frame - if(iswrench(W)) + if(iswrench(used)) to_chat(user, "You begin to anchor [src] on the floor.") - playsound(get_turf(src), W.usesound, 50, TRUE) - if(do_after(user, 1 SECONDS * W.toolspeed, target = src) && (build == 0)) + playsound(get_turf(src), used.usesound, 50, TRUE) + if(do_after(user, 1 SECONDS * used.toolspeed, target = src) && (build == 0)) to_chat(user, "You anchor \the [src]!") anchored = TRUE build++ - return TRUE - return FALSE - + return ITEM_INTERACT_COMPLETE if(1) // Fixed to the floor - if(iswrench(W)) + if(iswrench(used)) to_chat(user, "You begin to de-anchor [src] from the floor.") - playsound(get_turf(src), W.usesound, 50, TRUE) - if(do_after(user, 1 SECONDS * W.toolspeed, target = src) && (build == 1)) + playsound(get_turf(src), used.usesound, 50, TRUE) + if(do_after(user, 1 SECONDS * used.toolspeed, target = src) && (build == 1)) build-- anchored = FALSE to_chat(user, "You de-anchored \the [src]!") - return TRUE - return FALSE - + return ITEM_INTERACT_COMPLETE if(2) // Welded to the floor - if(iscoil(W)) - var/obj/item/stack/cable_coil/C = W + if(iscoil(used)) + var/obj/item/stack/cable_coil/C = used to_chat(user, "You start adding cables to [src]...") playsound(get_turf(src), C.usesound, 50, TRUE) if(do_after(user, 20 * C.toolspeed, target = src) && (C.get_amount() >= 2) && (build == 2)) C.use(2) to_chat(user, "You've added cables to \the [src].") build++ - return TRUE - return FALSE - + return ITEM_INTERACT_COMPLETE if(3) // Wired - if(iswirecutter(W)) + if(iswirecutter(used)) to_chat(user, "You begin to remove the wiring from [src].") - if(do_after(user, 1 SECONDS * W.toolspeed, target = src) && (build == 3)) + if(do_after(user, 1 SECONDS * used.toolspeed, target = src) && (build == 3)) new /obj/item/stack/cable_coil(loc, 2) - playsound(get_turf(src), W.usesound, 50, 1) + playsound(get_turf(src), used.usesound, 50, 1) to_chat(user, "You've removed the cables from \the [src].") build-- - return TRUE + return ITEM_INTERACT_COMPLETE - if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = W + if(istype(used, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = used to_chat(user, "You begin to complete \the [src]...") playsound(get_turf(src), R.usesound, 50, 1) if(do_after(user, 20 * R.toolspeed, target = src) && (R.get_amount() >= 2) && (build == 3)) R.use(2) to_chat(user, "You've added the grille to \the [src].") build++ - return TRUE - - return FALSE - + return ITEM_INTERACT_COMPLETE if(4) // Grille in place - if(iscrowbar(W)) + if(iscrowbar(used)) to_chat(user, "You begin to pry off the grille from [src]...") - playsound(get_turf(src), W.usesound, 50, TRUE) - if(do_after(user, 3 SECONDS * W.toolspeed, target = src) && (build == 4)) + playsound(get_turf(src), used.usesound, 50, TRUE) + if(do_after(user, 3 SECONDS * used.toolspeed, target = src) && (build == 4)) new /obj/item/stack/rods(loc,2) build-- - return TRUE - return FALSE + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/merch_vendor.dm b/code/game/machinery/merch_vendor.dm index 17333ba48f36..853078c9251e 100644 --- a/code/game/machinery/merch_vendor.dm +++ b/code/game/machinery/merch_vendor.dm @@ -34,10 +34,10 @@ var/pp = replacetext(replacetext("[merch.typepath]", "/obj/item/", ""), "/", "-") imagelist[pp] = "[icon2base64(icon(initial(I.icon), initial(I.icon_state), SOUTH, 1))]" -/obj/machinery/economy/merch/attackby__legacy__attackchain(obj/item/I, mob/user) - if(isspacecash(I)) - insert_cash(I, user) - return TRUE +/obj/machinery/economy/merch/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(isspacecash(used)) + insert_cash(used, user) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 5568b941a78f..42c52696eaf1 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -82,12 +82,12 @@ icon_state = "navbeacon[open][invisibility ? "-f" : ""]" // if invisible, set icon to faded version // in case revealed by T-scanner -/obj/machinery/navbeacon/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/navbeacon/item_interaction(mob/living/user, obj/item/used, list/modifiers) var/turf/T = loc if(T.intact) - return // prevent intraction when T-scanner revealed + return ITEM_INTERACT_COMPLETE // prevent intraction when T-scanner revealed - else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + else if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) if(open) if(allowed(user)) locked = !locked @@ -97,8 +97,10 @@ updateDialog() else to_chat(user, "You must open the cover first!") - else - return ..() + + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/navbeacon/screwdriver_act(mob/living/user, obj/item/I) open = !open diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index b01568472112..05d5aae37baa 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -393,11 +393,11 @@ GLOBAL_LIST_EMPTY(turret_icons) to_chat(user, "You remove the turret but did not manage to salvage anything.") qdel(src) // qdel -/obj/machinery/porta_turret/attackby__legacy__attackchain(obj/item/I, mob/user) +/obj/machinery/porta_turret/item_interaction(mob/living/user, obj/item/used, list/modifiers) if((stat & BROKEN) && !syndicate) - return + return ITEM_INTERACT_COMPLETE - else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + else if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) if(HasController()) to_chat(user, "Turrets regulated by a nearby turret controller are not unlockable.") else if(allowed(user)) @@ -407,22 +407,23 @@ GLOBAL_LIST_EMPTY(turret_icons) else to_chat(user, "Access denied.") - return TRUE + return ITEM_INTERACT_COMPLETE if(user.a_intent == INTENT_HELP) return ..() + // otherwise, if the turret was attacked with the intention of harming it: user.changeNext_move(CLICK_CD_MELEE) user.do_item_attack_animation() playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1) - if(I.force * 0.5 > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off + + //if the force of impact dealt at least 1 damage, the turret gets pissed off + if(used.force * 0.5 > 1) if(!attacked && !emagged) attacked = TRUE addtimer(VARSET_CALLBACK(src, attacked, FALSE), 6 SECONDS) - ..() - - + return ITEM_INTERACT_SKIP_TO_AFTER_ATTACK /obj/machinery/porta_turret/attack_animal(mob/living/simple_animal/M) M.changeNext_move(CLICK_CD_MELEE) @@ -873,66 +874,63 @@ GLOBAL_LIST_EMPTY(turret_icons) var/installation = null //the gun type installed var/gun_charge = 0 //the gun charge of the gun type installed - -/obj/machinery/porta_turret_construct/attackby__legacy__attackchain(obj/item/I, mob/user) +/obj/machinery/porta_turret_construct/item_interaction(mob/living/user, obj/item/used, list/modifiers) //this is a bit unwieldy but self-explanatory switch(build_step) if(0) //first step - if(iswrench(I) && !anchored) - playsound(loc, I.usesound, 100, 1) + if(iswrench(used) && !anchored) + playsound(loc, used.usesound, 100, 1) to_chat(user, "You secure the external bolts.") anchored = TRUE build_step = 1 - return + return ITEM_INTERACT_COMPLETE - else if(I.tool_behaviour == TOOL_CROWBAR && !anchored) - playsound(loc, I.usesound, 75, 1) + else if(used.tool_behaviour == TOOL_CROWBAR && !anchored) + playsound(loc, used.usesound, 75, 1) to_chat(user, "You dismantle the turret construction.") new /obj/item/stack/sheet/metal( loc, 5) qdel(src) // qdel - return + return ITEM_INTERACT_COMPLETE if(1) - if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I + if(istype(used, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = used if(M.use(2)) to_chat(user, "You add some metal armor to the interior frame.") build_step = 2 icon_state = "turret_frame2" else to_chat(user, "You need two sheets of metal to continue construction.") - return + return ITEM_INTERACT_COMPLETE - else if(iswrench(I)) - playsound(loc, I.usesound, 75, 1) + else if(iswrench(used)) + playsound(loc, used.usesound, 75, 1) to_chat(user, "You unfasten the external bolts.") anchored = FALSE build_step = 0 - return - + return ITEM_INTERACT_COMPLETE if(2) - if(iswrench(I)) - playsound(loc, I.usesound, 100, 1) + if(iswrench(used)) + playsound(loc, used.usesound, 100, 1) to_chat(user, "You bolt the metal armor into place.") build_step = 3 - return + return ITEM_INTERACT_COMPLETE if(3) - if(istype(I, /obj/item/gun/energy)) //the gun installation part - + if(istype(used, /obj/item/gun/energy)) //the gun installation part if(isrobot(user)) - return - var/obj/item/gun/energy/E = I //typecasts the item to an energy gun - if(!user.unequip(I)) - to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") - return + return ITEM_INTERACT_COMPLETE + var/obj/item/gun/energy/E = used //typecasts the item to an energy gun + if(!user.unequip(used)) + to_chat(user, "\the [used] is stuck to your hand, you cannot put it in \the [src]") + return ITEM_INTERACT_COMPLETE if(!E.can_fit_in_turrets) - to_chat(user, "[I] will not operate correctly in [src].") - return - installation = I.type //installation becomes I.type + to_chat(user, "[used] will not operate correctly in [src].") + return ITEM_INTERACT_COMPLETE + installation = used.type //installation becomes used.type gun_charge = E.cell.charge //the gun's charge is stored in gun_charge - to_chat(user, "You add [I] to the turret.") + to_chat(user, "You add [used] to the turret.") if(istype(E, /obj/item/gun/energy/laser/tag/blue)) target_type = /obj/machinery/porta_turret/tag/blue @@ -942,51 +940,51 @@ GLOBAL_LIST_EMPTY(turret_icons) target_type = /obj/machinery/porta_turret build_step = 4 - qdel(I) //delete the gun :( qdel - return + qdel(used) //delete the gun :( + return ITEM_INTERACT_COMPLETE - else if(iswrench(I)) - playsound(loc, I.usesound, 100, 1) + else if(iswrench(used)) + playsound(loc, used.usesound, 100, 1) to_chat(user, "You remove the turret's metal armor bolts.") build_step = 2 - return + return ITEM_INTERACT_COMPLETE if(4) - if(isprox(I)) - if(!user.unequip(I, src)) - to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") - return + if(isprox(used)) + if(!user.unequip(used, src)) + to_chat(user, "\the [used] is stuck to your hand, you cannot put it in \the [src]") + return ITEM_INTERACT_COMPLETE build_step = 5 - qdel(I) // qdel + qdel(used) to_chat(user, "You add the prox sensor to the turret.") - return + return ITEM_INTERACT_COMPLETE //attack_hand() removes the gun if(5) - return + return ITEM_INTERACT_COMPLETE //screwdriver_act() handles screwing the panel closed //attack_hand() removes the prox sensor if(6) - if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I + if(istype(used, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = used if(M.use(2)) to_chat(user, "You add some metal armor to the exterior frame.") build_step = 7 else to_chat(user, "You need two sheets of metal to continue construction.") - return + return ITEM_INTERACT_COMPLETE if(7) - if(I.tool_behaviour == TOOL_CROWBAR) - playsound(loc, I.usesound, 75, 1) + if(used.tool_behaviour == TOOL_CROWBAR) + playsound(loc, used.usesound, 75, 1) to_chat(user, "You pry off the turret's exterior armor.") new /obj/item/stack/sheet/metal(loc, 2) build_step = 6 - return + return ITEM_INTERACT_COMPLETE - ..() + return ..() /obj/machinery/porta_turret_construct/screwdriver_act(mob/living/user, obj/item/I) if(build_step != 6 && build_step != 5) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 0022fbcf0bc4..f8c301d507bb 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -30,45 +30,45 @@ for(var/obj/item/stock_parts/capacitor/C in component_parts) recharge_coeff = C.rating -/obj/machinery/recharger/attackby__legacy__attackchain(obj/item/G, mob/user, params) - var/allowed = is_type_in_list(G, allowed_devices) +/obj/machinery/recharger/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/allowed = is_type_in_list(used, allowed_devices) if(!allowed) return ..() - . = TRUE - if(!anchored) to_chat(user, "[src] isn't connected to anything!") - return + return ITEM_INTERACT_COMPLETE if(panel_open) to_chat(user, "Close the maintenance panel first!") - return + return ITEM_INTERACT_COMPLETE if(charging) to_chat(user, "There's \a [charging] inserted in [src] already!") - return + return ITEM_INTERACT_COMPLETE //Checks to make sure he's not in space doing it, and that the area got proper power. var/area/A = get_area(src) if(!istype(A) || !A.powernet.has_power(PW_CHANNEL_EQUIPMENT)) - to_chat(user, "[src] blinks red as you try to insert [G].") - return + to_chat(user, "[src] blinks red as you try to insert [used].") + return ITEM_INTERACT_COMPLETE - if(istype(G, /obj/item/gun/energy)) - var/obj/item/gun/energy/E = G + if(istype(used, /obj/item/gun/energy)) + var/obj/item/gun/energy/E = used if(!E.can_charge) to_chat(user, "Your gun has no external power connector.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE - G.forceMove(src) - charging = G + used.forceMove(src) + charging = used change_power_mode(ACTIVE_POWER_USE) - using_power = check_cell_needs_recharging(get_cell_from(G)) + using_power = check_cell_needs_recharging(get_cell_from(used)) update_icon() + return ITEM_INTERACT_COMPLETE + /obj/machinery/recharger/crowbar_act(mob/user, obj/item/I) if(panel_open && !charging && default_deconstruction_crowbar(user, I)) return TRUE diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 4dfa173b2a72..5701e7a81c38 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -292,44 +292,48 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) if("toggleSilent") silent = !silent - -/obj/machinery/requests_console/attackby__legacy__attackchain(obj/item/I, mob/user) - if(istype(I, /obj/item/card/id)) - if(inoperable(MAINT)) - return - if(screen == RCS_MESSAUTH) - var/obj/item/card/id/T = I - msgVerified = "Verified by [T.registered_name] ([T.assignment])" - SStgui.update_uis(src) - if(screen == RCS_ANNOUNCE) - var/obj/item/card/id/ID = I - if(ACCESS_RC_ANNOUNCE in ID.GetAccess()) - announceAuth = TRUE - announcer.author = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name - else - reset_message() - to_chat(user, "You are not authorized to send announcements.") - SStgui.update_uis(src) - if(screen == RCS_SECONDARY) - var/obj/item/card/id/ID = I - if(ID) - secondaryGoalAuth = TRUE - goalRequester = ID - has_active_secondary_goal = check_for_active_secondary_goal(goalRequester) - if(screen == RCS_SHIPPING) - var/obj/item/card/id/T = I - msgVerified = "Sender verified as [T.registered_name] ([T.assignment])" - SStgui.update_uis(src) - if(istype(I, /obj/item/stamp)) - if(inoperable(MAINT)) - return - if(screen == RCS_MESSAUTH) - var/obj/item/stamp/T = I - msgStamped = "Stamped with the [T.name]" +/obj/machinery/requests_console/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/obj/item/stamp/stamp = used + if(istype(stamp)) + if(screen == RCS_MESSAUTH && !inoperable(MAINT)) + msgStamped = "Stamped with the [stamp.name]" SStgui.update_uis(src) - else + + return ITEM_INTERACT_COMPLETE + + var/obj/item/card/id/id_card = used + if(!istype(id_card)) return ..() + if(inoperable(MAINT)) + return ITEM_INTERACT_COMPLETE + if(screen == RCS_MESSAUTH) + msgVerified = "Verified by [id_card.registered_name] ([id_card.assignment])" + SStgui.update_uis(src) + return ITEM_INTERACT_COMPLETE + if(screen == RCS_ANNOUNCE) + if(ACCESS_RC_ANNOUNCE in id_card.GetAccess()) + announceAuth = TRUE + announcer.author = id_card.assignment ? "[id_card.assignment] [id_card.registered_name]" : id_card.registered_name + else + reset_message() + to_chat(user, "You are not authorized to send announcements.") + SStgui.update_uis(src) + return ITEM_INTERACT_COMPLETE + if(screen == RCS_SECONDARY) + secondaryGoalAuth = TRUE + goalRequester = id_card + has_active_secondary_goal = check_for_active_secondary_goal(goalRequester) + + return ITEM_INTERACT_COMPLETE + if(screen == RCS_SHIPPING) + msgVerified = "Sender verified as [id_card.registered_name] ([id_card.assignment])" + SStgui.update_uis(src) + + return ITEM_INTERACT_COMPLETE + + return ..() + /obj/machinery/requests_console/proc/reset_message(mainmenu = FALSE) message = "" recipient = "" diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 2a8a67c77889..95c512659d38 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -232,17 +232,18 @@ else to_chat(user, "The device must first be secured to the floor.") -/obj/machinery/shieldgen/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/card/emag)) +/obj/machinery/shieldgen/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/emag)) malfunction = TRUE update_icon(UPDATE_ICON_STATE) - else if(istype(I, /obj/item/stack/cable_coil) && malfunction && is_open) - var/obj/item/stack/cable_coil/coil = I + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/stack/cable_coil) && malfunction && is_open) + var/obj/item/stack/cable_coil/coil = used to_chat(user, "You begin to replace the wires.") if(do_after(user, 30 * coil.toolspeed, target = src)) if(!src || !coil) - return + return ITEM_INTERACT_COMPLETE coil.use(1) health = max_health malfunction = FALSE @@ -250,15 +251,17 @@ to_chat(user, "You repair [src]!") update_icon(UPDATE_ICON_STATE) - else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) if(allowed(user)) locked = !locked to_chat(user, "The controls are now [locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/shieldgen/screwdriver_act(mob/user, obj/item/I) . = TRUE @@ -427,17 +430,18 @@ var/list/L = active_shields["[direction]"] L -= SW -/obj/machinery/shieldwallgen/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) +/obj/machinery/shieldwallgen/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id)||istype(used, /obj/item/pda)) if(allowed(user)) locked = !locked to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") - else - add_fingerprint(user) - ..() + return ITEM_INTERACT_COMPLETE + + add_fingerprint(user) + return ..() /obj/machinery/shieldwallgen/wrench_act(mob/user, obj/item/I) . = TRUE @@ -583,7 +587,7 @@ phaseout() return ..() -/obj/machinery/shieldwall/syndicate/attackby__legacy__attackchain(obj/item/W, mob/user, params) +/obj/machinery/shieldwall/syndicate/item_interaction(mob/living/user, obj/item/used, list/modifiers) phaseout() return ..() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index ac81b6e71d36..9550e85b4743 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -50,28 +50,25 @@ cell.emp_act(severity) ..(severity) -/obj/machinery/space_heater/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/stock_parts/cell)) - if(open) - if(cell) - to_chat(user, "There is already a power cell inside.") - return - else - // insert cell - var/obj/item/stock_parts/cell/C = user.get_active_hand() - if(istype(C)) - if(user.drop_item()) - cell = C - C.forceMove(src) - C.add_fingerprint(user) +/obj/machinery/space_heater/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(!istype(used, /obj/item/stock_parts/cell)) + return ..() - user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") - else - to_chat(user, "The hatch must be open to insert a power cell.") - return + if(!open) + to_chat(user, "The hatch must be open to insert a power cell.") + return ITEM_INTERACT_COMPLETE + if(cell) + to_chat(user, "There is already a power cell inside.") + return ITEM_INTERACT_COMPLETE else - return ..() + // insert cell + var/obj/item/stock_parts/cell/C = user.get_active_hand() + C.add_fingerprint(user) + user.visible_message("[user] inserts a power cell into [src].",\ + "You insert the power cell into [src].") + + return ITEM_INTERACT_COMPLETE /obj/machinery/space_heater/screwdriver_act(mob/user, obj/item/I) . = TRUE @@ -137,7 +134,9 @@ if("cellremove") if(open && cell && !usr.get_active_hand()) cell.update_icon() - usr.put_in_hands(cell) + cell.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(cell) cell.add_fingerprint(usr) cell = null usr.visible_message("[usr] removes the power cell from [src].", "You remove the power cell from [src].") diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 630da09c7843..b47552df0ab9 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -135,7 +135,7 @@ /obj/machinery/suit_storage_unit/security/hos name = "Head of Security's suit storage unit" - mask_type = /obj/item/clothing/mask/gas/sechailer/hos + mask_type = /obj/item/clothing/mask/gas/sechailer/swat/hos suit_type = /obj/item/mod/control/pre_equipped/safeguard req_access = list(ACCESS_HOS) @@ -317,10 +317,10 @@ . += "[base_icon_state]_[occupant ? "body" : "ready"]" -/obj/machinery/suit_storage_unit/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/suit_storage_unit/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(shocked) if(shock(user, 100)) - return + return ITEM_INTERACT_COMPLETE if(!is_operational()) if(user.a_intent != INTENT_HELP) return ..() @@ -328,18 +328,19 @@ to_chat(usr, "Close the maintenance panel first.") else to_chat(usr, "The unit is not operational.") - return + return ITEM_INTERACT_COMPLETE if(panel_open) wires.Interact(user) - return + return ITEM_INTERACT_COMPLETE if(state_open) - if(store_item(I, user)) + if(store_item(used, user)) update_icon(UPDATE_OVERLAYS) SStgui.update_uis(src) - to_chat(user, "You load [I] into the storage compartment.") + to_chat(user, "You load [used] into the storage compartment.") else - to_chat(user, "You can't fit [I] into [src]!") - return + to_chat(user, "You can't fit [used] into [src]!") + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/suit_storage_unit/crowbar_act(mob/living/user, obj/item/I) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 0324d2e41d27..d0841d27591f 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -114,21 +114,24 @@ else . = timer_set -/obj/machinery/syndicatebomb/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/assembly/signaler)) +/obj/machinery/syndicatebomb/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/assembly/signaler)) if(open_panel) wires.Interact(user) - else if(istype(I, /obj/item/bombcore)) + + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/bombcore)) if(!payload) if(!user.drop_item()) - return - payload = I + return ITEM_INTERACT_COMPLETE + payload = used to_chat(user, "You place [payload] into [src].") payload.forceMove(src) else to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/syndicatebomb/wrench_act(mob/user, obj/item/I) if(!can_unanchor) diff --git a/code/game/machinery/tcomms/tcomms_base.dm b/code/game/machinery/tcomms/tcomms_base.dm index 6c7520a80b80..2ec9d81d8170 100644 --- a/code/game/machinery/tcomms/tcomms_base.dm +++ b/code/game/machinery/tcomms/tcomms_base.dm @@ -133,7 +133,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines) if(active) active = FALSE // This needs a timer because otherwise its on the shuttle Z and the message is missed - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, visible_message), "Radio equipment on [src] has been overloaded by heavy bluespace interference. Please restart the machine."), 5) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, visible_message), "Radio equipment on [src] has suffered an unidentified malfunction. Please restart the machine."), 5) update_icon(UPDATE_ICON_STATE) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index d8b133a3eb2c..b1a030c91b9b 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -47,17 +47,18 @@ power_station = locate(/obj/machinery/teleport/station, orange(1, src)) return power_station -/obj/machinery/computer/teleporter/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/gps)) - var/obj/item/gps/L = I +/obj/machinery/computer/teleporter/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/gps)) + var/obj/item/gps/L = used if(L.locked_location && !(stat & (NOPOWER|BROKEN))) if(!user.transfer_item_to(L, src)) - to_chat(user, "[I] is stuck to your hand, you cannot put it in [src]") - return + to_chat(user, "[used] is stuck to your hand, you cannot put it in [src]") + return ITEM_INTERACT_COMPLETE locked = L to_chat(user, "You insert the GPS device into [src]'s slot.") - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/computer/teleporter/emag_act(mob/user) if(!emagged) @@ -641,16 +642,16 @@ teleporter_console = null return ..() -/obj/machinery/teleport/station/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(panel_open && istype(I, /obj/item/circuitboard/teleporter_perma)) +/obj/machinery/teleport/station/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(panel_open && istype(used, /obj/item/circuitboard/teleporter_perma)) if(!teleporter_console) to_chat(user, "[src] is not linked to a teleporter console.") - return + return ITEM_INTERACT_COMPLETE - var/obj/item/circuitboard/teleporter_perma/C = I + var/obj/item/circuitboard/teleporter_perma/C = used C.target = teleporter_console.target to_chat(user, "You copy the targeting information from [src] to [C].") - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index cbd4bc6bc3f5..70f06f79b0dd 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -313,17 +313,17 @@ domutcheck(H, MUTCHK_FORCED) H.update_mutations() -/obj/machinery/transformer/gene_applier/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/disk/data)) +/obj/machinery/transformer/gene_applier/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/disk/data)) if(locked) to_chat(user, "Access Denied.") - return FALSE - var/obj/item/disk/data/D = I + return ITEM_INTERACT_COMPLETE + var/obj/item/disk/data/D = used if(!D.buf) to_chat(user, "Error: No data found.") - return FALSE + return ITEM_INTERACT_COMPLETE template = D.buf.dna.Clone() to_chat(user, "Upload of gene template for '[template.real_name]' complete!") - return TRUE - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index bdc87cd7d9c5..8b8b2b601072 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -106,18 +106,19 @@ return FALSE -/obj/machinery/turretid/attackby__legacy__attackchain(obj/item/W, mob/user) +/obj/machinery/turretid/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(stat & BROKEN) - return + return ITEM_INTERACT_COMPLETE - if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) + if(istype(used, /obj/item/card/id)||istype(used, /obj/item/pda)) if(src.allowed(usr)) if(emagged) to_chat(user, "The turret control is unresponsive.") else locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the panel.") - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/turretid/emag_act(user as mob) diff --git a/code/game/machinery/vendors/custom_vendors.dm b/code/game/machinery/vendors/custom_vendors.dm new file mode 100644 index 000000000000..12ca4b0f06a1 --- /dev/null +++ b/code/game/machinery/vendors/custom_vendors.dm @@ -0,0 +1,160 @@ +#define INSERT_FAIL 0 +#define INSERT_DONE 1 +#define INSERT_NEEDS_INPUT 2 + +/obj/machinery/economy/vending/custom + name = "\improper CrewVend 3000" + refill_canister = null + always_deconstruct = TRUE + var/obj/item/eftpos/linked_pos + +/obj/machinery/economy/vending/custom/Destroy() + if(!isnull(linked_pos)) + linked_pos.linked_vendors -= src + linked_pos = null + return ..() + +/obj/machinery/economy/vending/custom/locked() + return isnull(linked_pos) || linked_pos.transaction_locked + +/obj/machinery/economy/vending/custom/get_vendor_account() + return linked_pos?.linked_account || ..() + +/obj/machinery/economy/vending/custom/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(user.a_intent == INTENT_HARM) + return ..() + + if(istype(used, /obj/item/eftpos)) + visible_message("[src] beeps as [user] links it to [used].", "You hear something beep.") + if(!isnull(linked_pos)) + linked_pos.linked_vendors -= src + linked_pos = used + var/obj/item/eftpos/pos = used + pos.linked_vendors += src + return ITEM_INTERACT_COMPLETE + else if(isnull(linked_pos)) + to_chat(user, "You need to link a point of sale device first!") + return ITEM_INTERACT_COMPLETE + else if(locked()) + return ..() + + try_add_stock(user, used) + return ITEM_INTERACT_COMPLETE + +/// Tries to add something to the vendor. can_wait returns INSERT_NEEDS_INPUT if it would wait for user input, quiet suppresses success messages, and bag is used when the item is being transferred from a storage item. +/obj/machinery/economy/vending/custom/proc/try_add_stock(mob/living/user, obj/item/used, can_wait = TRUE, quiet = FALSE, obj/item/storage/bag = null) + if(isnull(bag) && !user.canUnEquip(used, FALSE)) + to_chat(user, "\The [used] is stuck to your hand!") + return INSERT_FAIL + else if(bag) + if(!Adjacent(user)) + to_chat(user, "You can't reach [src] from here!") + return INSERT_FAIL + if(!user.is_holding(bag)) + to_chat(user, "\The [bag] isn't in your hand anymore!") + return INSERT_FAIL + if(used.loc != bag) + to_chat(user, "\The [used] isn't in [bag] anymore!") + return INSERT_FAIL + + for(var/datum/data/vending_product/physical/record in physical_product_records) + if(record.get_amount_left() == 0) + physical_product_records -= record + qdel(record) + else if(isitem(record.items[1])) + var/obj/item/existing = record.items[1] + if(existing.should_stack_with(used)) + record.items += used + if(isnull(bag)) + user.unequip(used) + else + bag.remove_from_storage(used) + used.moveToNullspace() + if(!quiet) + user.visible_message("[user] puts [used] into [src].", "") + return INSERT_DONE + + if(!can_wait) + return INSERT_NEEDS_INPUT + + var/price = tgui_input_number(user, "How much do you want to sell [used] for?") + if(!isnum(price)) + return INSERT_FAIL + if(!Adjacent(user)) + to_chat(user, "You can't reach [src] from here!") + return INSERT_FAIL + if(isnull(bag)) + if(!user.is_holding(used)) + to_chat(user, "\The [used] isn't in your hand anymore!") + return INSERT_FAIL + if(!user.canUnEquip(used, FALSE)) + to_chat(user, "\The [used] is stuck to your hand!") + return INSERT_FAIL + else + if(!user.is_holding(bag)) + to_chat(user, "\The [bag] isn't in your hand anymore!") + return INSERT_FAIL + if(used.loc != bag) + to_chat(user, "\The [used] isn't in [bag] anymore!") + return INSERT_FAIL + + var/datum/data/vending_product/physical/record = new(used.name, used.icon, used.icon_state) + record.items += used + record.price = price + physical_product_records += record + SStgui.update_uis(src, TRUE) + if(isnull(bag)) + user.unequip(used) + else + bag.remove_from_storage(used) + used.moveToNullspace() + if(!quiet) + user.visible_message("[user] puts [used] into [src].", "You put [used] into [src].") + return INSERT_DONE + +/obj/machinery/economy/vending/custom/MouseDrop_T(atom/dragged, mob/user, params) + if(!istype(dragged, /obj/item/storage)) + return ..() + + var/obj/item/storage/bag = dragged + var/inserted = FALSE + for(var/obj/item/thing in bag.contents.Copy()) + var/result = try_add_stock(user, thing, can_wait = FALSE, quiet = TRUE, bag = bag) + if(result == INSERT_FAIL) + break + if(result == INSERT_DONE) + inserted = TRUE + continue + + // result == INSERT_NEEDS_INPUT + if(inserted) + user.visible_message("[user] transfers some things from [bag] into [src].", "You transfer some things from [bag] into [src].") + // We've reported on our insertions so far, don't repeat it. + inserted = FALSE + + // Try again, this time expecting it to wait. + result = try_add_stock(user, thing, bag = bag) + if(result == INSERT_FAIL) + break + + if(inserted) + user.visible_message("[user] transfers everything from [bag] into [src].", "You transfer everything from [bag] into [src].") + + return TRUE + +/obj/machinery/economy/vending/custom/crowbar_act(mob/user, obj/item/I) + if(!isnull(linked_pos) && linked_pos.transaction_locked) + user.visible_message("[user] tries to pry [src] apart, but fails.", "The lock on [src] resists your efforts to pry it apart.") + return TRUE + return ..() + +/obj/machinery/economy/vending/custom/delayed_vend(datum/data/vending_product/R, mob/user) + . = ..() + if(istype(R, /datum/data/vending_product/physical) && R.get_amount_left() == 0) + physical_product_records -= R + physical_hidden_records -= R + SStgui.update_uis(src, TRUE) + +#undef INSERT_FAIL +#undef INSERT_DONE +#undef INSERT_NEEDS_INPUT diff --git a/code/game/machinery/vendors/generic_vendors.dm b/code/game/machinery/vendors/generic_vendors.dm index 9bdf78526f52..d980b4c8c7e3 100644 --- a/code/game/machinery/vendors/generic_vendors.dm +++ b/code/game/machinery/vendors/generic_vendors.dm @@ -156,30 +156,15 @@ return TRUE /obj/machinery/economy/vending/coffee/do_vend(datum/data/vending_product/R, mob/user) - if(..()) + var/obj/item/reagent_containers/drinks/vended = ..() + if(!istype(vended)) return - var/obj/item/reagent_containers/drinks/vended = new R.product_path() if(istype(vended, /obj/item/reagent_containers/drinks/mug)) - var/put_on_turf = TRUE - if(user && iscarbon(user) && user.Adjacent(src)) - if(user.put_in_hands(vended)) - put_on_turf = FALSE - if(put_on_turf) - var/turf/T = get_turf(src) - vended.forceMove(T) return vended.reagents.trans_to(inserted_item, vended.reagents.total_volume) - if(vended.reagents.total_volume) - var/put_on_turf = TRUE - if(user && iscarbon(user) && user.Adjacent(src)) - if(user.put_in_hands(vended)) - put_on_turf = FALSE - if(put_on_turf) - var/turf/T = get_turf(src) - vended.forceMove(T) - else + if(!vended.reagents.total_volume) qdel(vended) diff --git a/code/game/machinery/vendors/vending.dm b/code/game/machinery/vendors/vending.dm index 079765b8ea5b..8f574e6bc5f9 100644 --- a/code/game/machinery/vendors/vending.dm +++ b/code/game/machinery/vendors/vending.dm @@ -2,15 +2,100 @@ * Datum used to hold information about a product in a vending machine */ /datum/data/vending_product - name = "generic" + name = "the idea of vending something" + /// Price to buy one + var/price = 0 + +/datum/data/vending_product/proc/get_amount_full() + CRASH("Abstract vending product used.") + +/datum/data/vending_product/proc/get_amount_left() + CRASH("Abstract vending product used.") + +/datum/data/vending_product/proc/get_icon() + CRASH("Abstract vending product used.") + +/datum/data/vending_product/proc/get_icon_state() + CRASH("Abstract vending product used.") + +/datum/data/vending_product/proc/get_name() + CRASH("Abstract vending product used.") + +/datum/data/vending_product/proc/vend(turf/where) + CRASH("Abstract vending product used.") + +/datum/data/vending_product/from_path + name = "a magically-created vending product" + ///Typepath of the product that is created when this record "sells" - var/product_path = null + var/atom/movable/product_path = null ///How many of this product we currently have var/amount = 0 ///How many we can store at maximum var/max_amount = 0 - /// Price to buy one - var/price = 0 + +/datum/data/vending_product/from_path/get_amount_full() + return max_amount + +/datum/data/vending_product/from_path/get_amount_left() + return amount + +/datum/data/vending_product/from_path/get_icon() + return initial(product_path.icon) + +/datum/data/vending_product/from_path/get_icon_state() + return initial(product_path.icon_state) + +/datum/data/vending_product/from_path/get_name() + return initial(product_path.name) + +/datum/data/vending_product/from_path/vend(turf/where) + if(amount > 0) + amount-- + return new product_path(where) + return null + +/datum/data/vending_product/physical + name = "a physical vending product" + + /// The items available. + var/list/items = list() + /// What should they be called? + var/display_name + /// What icon should they use? + var/display_icon + /// What icon state should they use? + var/display_icon_state + +/datum/data/vending_product/physical/New(name, icon, icon_state) + display_name = name + display_icon = icon + display_icon_state = icon_state + +/datum/data/vending_product/physical/get_amount_full() + return 1 + +/datum/data/vending_product/physical/get_amount_left() + return length(items) + +/datum/data/vending_product/physical/get_icon() + return display_icon + +/datum/data/vending_product/physical/get_icon_state() + return display_icon_state + +/datum/data/vending_product/physical/get_name() + return display_name + +/datum/data/vending_product/physical/vend(turf/where) + var/atom/movable/vended = items[length(items)] + items.len-- + vended.forceMove(where) + return vended + +/datum/data/vending_product/physical/proc/on_deconstruct(turf/where) + while(length(items)) + vend(where) /obj/machinery/economy/vending name = "\improper Vendomat" @@ -53,8 +138,6 @@ var/vend_ready = TRUE /// How long vendor takes to vend one item. var/vend_delay = 10 - /// Item currently being bought - var/datum/data/vending_product/currently_vending // To be filled out at compile time var/list/products = list() // For each, use the following pattern: @@ -63,7 +146,9 @@ // List of vending_product items available. var/list/product_records = list() + var/list/physical_product_records = list() var/list/hidden_records = list() + var/list/physical_hidden_records = list() /// Unimplemented list of ads that are meant to show up somewhere, but don't. var/list/ads_list = list() @@ -82,6 +167,8 @@ //The type of refill canisters used by this machine. var/obj/item/vending_refill/refill_canister + /// Should we always be able to deconstruct this into components, even if it has no refill_canister? + var/always_deconstruct = FALSE // Things that can go wrong /// Allows people to access a vendor that's normally access restricted. @@ -110,9 +197,6 @@ /// do I look unpowered, even when powered? var/force_no_power_icon_state = FALSE - ///the money account that is tethered to this vendor - var/datum/money_account/vendor_account - /// If this vending machine can be tipped or not var/tiltable = TRUE /// If this vendor is currently tipped @@ -149,6 +233,10 @@ var/build_inv = FALSE if(!refill_canister) build_inv = TRUE + if(always_deconstruct) + var/obj/item/circuitboard/vendor/V = new + V.set_type(replacetext(initial(name), "\improper", "")) + component_parts = list(V) else component_parts = list() var/obj/item/circuitboard/vendor/V = new @@ -168,9 +256,6 @@ // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is created. last_slogan = world.time + rand(0, slogan_delay) - if(account_database) - vendor_account = account_database.vendor_account - update_icon(UPDATE_OVERLAYS) reconnect_database() power_change() @@ -263,7 +348,7 @@ amount = 0 var/atom/temp = typepath - var/datum/data/vending_product/R = new /datum/data/vending_product() + var/datum/data/vending_product/from_path/R = new /datum/data/vending_product/from_path() R.name = initial(temp.name) R.product_path = typepath if(!start_empty) @@ -296,7 +381,7 @@ */ /obj/machinery/economy/vending/proc/refill_inventory(list/productlist, list/recordlist) . = 0 - for(var/datum/data/vending_product/record as anything in recordlist) + for(var/datum/data/vending_product/from_path/record as anything in recordlist) var/diff = min(record.max_amount - record.amount, productlist[record.product_path]) if(diff) productlist[record.product_path] -= diff @@ -308,7 +393,7 @@ * This is used when the machine is deconstructed, so the items aren't "lost" */ /obj/machinery/economy/vending/proc/update_canister() - if(!component_parts) + if(isnull(refill_canister)) return var/obj/item/vending_refill/R = locate() in component_parts @@ -323,12 +408,14 @@ */ /obj/machinery/economy/vending/proc/unbuild_inventory(list/recordlist) . = list() - for(var/datum/data/vending_product/record as anything in recordlist) + for(var/datum/data/vending_product/from_path/record in recordlist) .[record.product_path] += record.amount /obj/machinery/economy/vending/deconstruct(disassembled = TRUE) eject_item() - if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame. + for(var/datum/data/vending_product/physical/R in physical_product_records + physical_hidden_records) + R.on_deconstruct(loc) + if(!component_parts) //the non constructable vendors drop metal instead of a machine frame. new /obj/item/stack/sheet/metal(loc, 3) qdel(src) else @@ -338,25 +425,25 @@ if(user && (!Adjacent(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))) return COMPONENT_BLOCK_UNTILT -/obj/machinery/economy/vending/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/economy/vending/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(tilted) if(user.a_intent == INTENT_HELP) to_chat(user, "[src] is tipped over and non-functional! You'll need to right it first.") - return + return ITEM_INTERACT_COMPLETE return ..() - if(isspacecash(I)) - insert_cash(I, user) - return - if(istype(I, /obj/item/coin)) + if(isspacecash(used)) + insert_cash(used, user) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/coin)) to_chat(user, "[src] does not accept coins.") - return - if(refill_canister && istype(I, refill_canister)) + return ITEM_INTERACT_COMPLETE + if(refill_canister && istype(used, refill_canister)) if(stat & (BROKEN|NOPOWER)) to_chat(user, "[src] does not respond.") - return + return ITEM_INTERACT_COMPLETE - var/obj/item/vending_refill/canister = I + var/obj/item/vending_refill/canister = used var/transferred = restock(canister) if(!transferred && !canister.get_part_rating()) // It transferred no products and has no products left, thus it is empty to_chat(user, "[canister] is empty!") @@ -364,13 +451,14 @@ to_chat(user, "You loaded [transferred] items in [src].") else // Nothing transferred, parts are still left, nothing to restock! to_chat(user, "There's nothing to restock!") - return + return ITEM_INTERACT_COMPLETE - if(item_slot_check(user, I)) - insert_item(user, I) - return - . = ..() - if(tiltable && !tilted && I.force) + if(item_slot_check(user, used)) + insert_item(user, used) + return ITEM_INTERACT_COMPLETE + +/obj/machinery/economy/vending/attacked_by(obj/item/attacker, mob/living/user) + if(tiltable && !tilted && attacker.force) if(resistance_flags & INDESTRUCTIBLE) // no goodies, but also no tilts return @@ -400,16 +488,12 @@ visible_message("[num_freebies] free goodie\s tumble[num_freebies > 1 ? "" : "s"] out of [src]!") for(var/i in 1 to num_freebies) - for(var/datum/data/vending_product/R in shuffle(product_records)) + for(var/datum/data/vending_product/R in shuffle(product_records + physical_product_records)) - if(R.amount <= 0) + if(R.get_amount_left() <= 0) continue - var/dump_path = R.product_path - if(!dump_path) - continue - new dump_path(get_turf(src)) - R.amount-- + R.vend(loc) break /obj/machinery/economy/vending/HasProximity(atom/movable/AM) @@ -605,6 +689,8 @@ /obj/machinery/economy/vending/ui_data(mob/user) var/list/data = list() + data["locked"] = locked() + data["chargesMoney"] = locked() data["usermoney"] = 0 data["inserted_cash"] = cash_transaction data["user"] = null @@ -625,8 +711,8 @@ data["user"]["job"] = C.rank ? C.rank : "No Job" data["stock"] = list() - for(var/datum/data/vending_product/R in product_records + hidden_records) - data["stock"][R.name] = R.amount + for(var/datum/data/vending_product/R in product_records + physical_product_records + hidden_records + physical_hidden_records) + data["stock"][R.get_name()] = R.get_amount_left() data["extended_inventory"] = extended_inventory data["vend_ready"] = vend_ready data["panel_open"] = panel_open ? TRUE : FALSE @@ -638,30 +724,27 @@ /obj/machinery/economy/vending/ui_static_data(mob/user) var/list/data = list() - data["chargesMoney"] = length(prices) > 0 ? TRUE : FALSE data["product_records"] = list() var/i = 1 - for(var/datum/data/vending_product/R in product_records) - var/obj/item = R.product_path + for(var/datum/data/vending_product/R in product_records + physical_product_records) var/list/data_pr = list( - name = R.name, - price = (item in prices) ? prices[item] : 0, - icon = item.icon, - icon_state = item.icon_state, - max_amount = R.max_amount, + name = R.get_name(), + price = R.price, + icon = R.get_icon(), + icon_state = R.get_icon_state(), + max_amount = R.get_amount_full(), is_hidden = FALSE, inum = i++ ) data["product_records"] += list(data_pr) data["hidden_records"] = list() - for(var/datum/data/vending_product/R in hidden_records) - var/obj/item = R.product_path + for(var/datum/data/vending_product/R in hidden_records + physical_hidden_records) var/list/data_hr = list( - name = R.name, - price = (item in prices) ? prices[item] : 0, - icon = item.icon, - icon_state = item.icon_state, - max_amount = R.max_amount, + name = R.get_name(), + price = R.price, + icon = R.get_icon(), + icon_state = R.get_icon_state(), + max_amount = R.get_amount_full(), is_hidden = TRUE, inum = i++, premium = TRUE @@ -693,6 +776,27 @@ if("vend") var/key = text2num(params["inum"]) try_vend(key, user) + if("rename") + if(!locked()) + var/new_name = tgui_input_text(user, "Rename the vendor to what?", name) + if(!isnull(new_name)) + name = new_name + if("change_appearance") + if(locked()) + return + var/possible_icons = list() + var/icon_lookup = list() + var/buildable_vendors = /obj/item/circuitboard/vendor::station_vendors + for(var/vendor_name in buildable_vendors) + var/obj/machinery/economy/vending/vendor_type = buildable_vendors[vendor_name] + possible_icons[vendor_name] = image(icon = initial(vendor_type.icon), icon_state = initial(vendor_type.icon_state)) + icon_lookup[vendor_name] = list(initial(vendor_type.icon), initial(vendor_type.icon_state)) + var/choice = show_radial_menu(user, src, possible_icons, radius=48) + if(!choice || !(choice in icon_lookup) || user.stat || !in_range(user, src) || QDELETED(src)) + return + icon = icon_lookup[choice][1] + icon_state = icon_lookup[choice][2] + if(.) add_fingerprint(user) @@ -704,44 +808,37 @@ to_chat(user, "The vending machine cannot dispense products while its service panel is open!") return - var/list/display_records = product_records + var/list/display_records = product_records + physical_product_records if(extended_inventory) - display_records = product_records + hidden_records + display_records = product_records + physical_product_records + hidden_records + physical_hidden_records if(key < 1 || key > length(display_records)) log_debug("invalid inum passed to a [name] vendor.") return - var/datum/data/vending_product/R = display_records[key] - if(!istype(R)) + var/datum/data/vending_product/currently_vending = display_records[key] + if(!istype(currently_vending)) log_debug("player attempted to access an unknown vending_product at a [name] vendor.") return - var/list/record_to_check = product_records + var/list/record_to_check = product_records + physical_product_records if(extended_inventory) - record_to_check = product_records + hidden_records - if(!R.product_path) - log_debug("player attempted to access an unknown product record at a [name] vendor.") + record_to_check = product_records + physical_product_records + hidden_records + physical_hidden_records + if(!extended_inventory && ((currently_vending in hidden_records) || (currently_vending in physical_hidden_records))) + // Exploit prevention, stop the user purchasing hidden stuff if they haven't hacked the machine. + log_debug("player attempted to access a [name] vendor extended inventory when it was not allowed.") return - if(R in hidden_records) - if(!extended_inventory) - // Exploit prevention, stop the user purchasing hidden stuff if they haven't hacked the machine. - log_debug("player attempted to access a [name] vendor extended inventory when it was not allowed.") - return - else if(!(R in record_to_check)) + else if(!(currently_vending in record_to_check)) // Exploit prevention, stop the user message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(user)]!") return - if(R.amount <= 0) - to_chat(user, "Sold out of [R.name].") + if(currently_vending.get_amount_left() <= 0) + to_chat(user, "Sold out of [currently_vending.get_name()].") flick(icon_deny, src) return - vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved. - - if(!ishuman(user) || R.price <= 0) + if(!ishuman(user) || currently_vending.price <= 0 || !locked()) // Either the purchaser is not human, or the item is free. - // Skip all payment logic. - vend(R, user) + // Skip all payment logic, and vend without a delay. + vend(currently_vending, user, FALSE) add_fingerprint(user) - vend_ready = TRUE . = TRUE return @@ -750,28 +847,26 @@ var/mob/living/carbon/human/H = user var/obj/item/card/id/C = H.get_idcard(TRUE) - currently_vending = R var/paid = FALSE - if(cash_transaction < currently_vending.price && GLOB.station_money_database.vendor_account?.suspended) - to_chat(user, "Vendor account offline. Unable to process transaction.") + var/datum/money_account/vendor_account = get_vendor_account() + if(cash_transaction < currently_vending.price && (isnull(vendor_account) || vendor_account.suspended)) + to_chat(user, "Vendor account offline. Unable to process transaction.") flick(icon_deny, src) - vend_ready = TRUE return if(cash_transaction >= currently_vending.price) - paid = pay_with_cash(currently_vending.price, "Vendor Transaction", name, user, GLOB.station_money_database.vendor_account) + paid = pay_with_cash(currently_vending.price, "Vendor Transaction", name, user, vendor_account) else if(istype(C, /obj/item/card)) // Because this uses H.get_idcard(TRUE), it will attempt to use: // active hand, inactive hand, pda.id, and then wear_id ID in that order // this is important because it lets people buy stuff with someone else's ID by holding it while using the vendor - paid = pay_with_card(C, currently_vending.price, "Vendor transaction", name, user, GLOB.station_money_database.vendor_account) + paid = pay_with_card(C, currently_vending.price, "Vendor transaction", name, user, vendor_account) else if(user.can_advanced_admin_interact()) to_chat(user, "Vending object due to admin interaction.") paid = TRUE else to_chat(user, "Payment failure: you have no ID or other method of payment.") - vend_ready = TRUE flick(icon_deny, src) . = TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update. return @@ -781,24 +876,13 @@ . = TRUE else to_chat(user, "Payment failure: unable to process payment.") - vend_ready = TRUE -/obj/machinery/economy/vending/proc/vend(datum/data/vending_product/R, mob/user) +/obj/machinery/economy/vending/proc/vend(datum/data/vending_product/R, mob/user, has_delay = TRUE) if(!allowed(user) && !user.can_admin_interact() && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(user, "Access denied.")//Unless emagged of course flick(icon_deny, src) - vend_ready = TRUE - return - - if(!R.amount) - to_chat(user, "The vending machine has ran out of that product.") - vend_ready = TRUE return - vend_ready = FALSE //One thing at a time!! - - R.amount-- - if(last_reply + vend_delay + 200 <= world.time && vend_reply) speak(vend_reply) last_reply = world.time @@ -807,33 +891,29 @@ if(icon_vend) //Show the vending animation if needed flick(icon_vend, src) playsound(get_turf(src), 'sound/machines/machine_vend.ogg', 50, TRUE) - addtimer(CALLBACK(src, PROC_REF(delayed_vend), R, user), vend_delay) + if(has_delay) + vend_ready = FALSE + addtimer(CALLBACK(src, PROC_REF(delayed_vend), R, user, has_delay), vend_delay) -/obj/machinery/economy/vending/proc/delayed_vend(datum/data/vending_product/R, mob/user) +/obj/machinery/economy/vending/proc/delayed_vend(datum/data/vending_product/R, mob/user, has_delay) do_vend(R, user) - vend_ready = TRUE - currently_vending = null + if(has_delay) + vend_ready = TRUE //override this proc to add handling for what to do with the vended product when you have a inserted item and remember to include a parent call for this generic handling -/obj/machinery/economy/vending/proc/do_vend(datum/data/vending_product/R, mob/user) - if(!item_slot || !inserted_item) - var/put_on_turf = TRUE - var/obj/vended = new R.product_path() - if(user && iscarbon(user) && user.Adjacent(src)) - if(user.put_in_hands(vended)) - put_on_turf = FALSE - if(put_on_turf) - var/turf/T = get_turf(src) - vended.forceMove(T) - vended.scatter_atom() - return TRUE - return FALSE +/obj/machinery/economy/vending/proc/do_vend(datum/data/vending_product/R, mob/user, put_in_hands = TRUE) + var/vended = R.vend(loc) + if(put_in_hands && isliving(user) && istype(vended, /obj/item) && Adjacent(user)) + // Try the active hand first, then the inactive hand, and leave it here if both fail + if(!user.put_in_active_hand(vended)) + user.put_in_inactive_hand(vended) + return vended /* Example override for do_vend proc: /obj/machinery/economy/vending/example/do_vend(datum/data/vending_product/R) - if(..()) + var/obj/item/vended = ..() + if(!vended) return - var/obj/item/vended = new R.product_path() if(inserted_item.force == initial(inserted_item.force) inserted_item.force += vended.force inserted_item.damtype = vended.damtype @@ -899,20 +979,15 @@ var/found_anything = TRUE while(found_anything) found_anything = FALSE - for(var/record in shuffle(product_records)) - var/datum/data/vending_product/R = record - if(R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if(!dump_path) + for(var/datum/data/vending_product/record in shuffle(product_records)) + if(record.get_amount_left() <= 0) //Try to use a record that actually has something to dump. continue - R.amount-- + var/atom/movable/thing = record.vend() // busting open a vendor will destroy some of the contents if(found_anything && prob(80)) - continue + qdel(thing) - var/obj/O = new dump_path(loc) - step(O, pick(GLOB.alldirs)) + step(thing, pick(GLOB.alldirs)) found_anything = TRUE dump_amount++ if(dump_amount >= 16) @@ -929,15 +1004,11 @@ if(!target) return 0 - for(var/datum/data/vending_product/R in product_records) - if(R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if(!dump_path) + for(var/datum/data/vending_product/R in product_records + physical_product_records) + if(R.get_amount_left() <= 0) //Try to use a record that actually has something to dump. continue - R.amount-- - throw_item = new dump_path(loc) + throw_item = R.vend(loc) break if(!throw_item) return @@ -1008,6 +1079,12 @@ mob_hurt = TRUE return ..() +/obj/machinery/economy/vending/proc/locked() + return TRUE + +/obj/machinery/economy/vending/proc/get_vendor_account() + return GLOB.station_money_database.vendor_account + /* * Vending machine types */ diff --git a/code/game/machinery/vendors/wardrobe_vendors.dm b/code/game/machinery/vendors/wardrobe_vendors.dm index 9ef0c7459b3c..f8582dd9f2a4 100644 --- a/code/game/machinery/vendors/wardrobe_vendors.dm +++ b/code/game/machinery/vendors/wardrobe_vendors.dm @@ -705,6 +705,7 @@ /obj/item/clothing/accessory/armband/service = 3, /obj/item/reagent_containers/glass/rag = 3, /obj/item/storage/box/dish_drive = 1, + /obj/item/storage/box/crewvend = 1, /obj/item/clothing/head/helmet/space/plasmaman/chef = 2, /obj/item/clothing/under/plasmaman/chef = 2) @@ -724,6 +725,7 @@ /obj/item/clothing/accessory/armband/service = 20, /obj/item/reagent_containers/glass/rag = 5, /obj/item/storage/box/dish_drive = 100, + /obj/item/storage/box/crewvend = 100, /obj/item/clothing/head/helmet/space/plasmaman/chef = 60, /obj/item/clothing/under/plasmaman/chef = 60) @@ -751,6 +753,7 @@ /obj/item/clothing/accessory/armband/service = 3, /obj/item/reagent_containers/glass/rag = 3, /obj/item/storage/box/dish_drive = 1, + /obj/item/storage/box/crewvend = 1, /obj/item/clothing/head/helmet/space/plasmaman/white = 2, /obj/item/clothing/under/plasmaman/enviroslacks = 2) @@ -768,6 +771,7 @@ /obj/item/clothing/accessory/armband/service = 20, /obj/item/reagent_containers/glass/rag = 5, /obj/item/storage/box/dish_drive = 100, + /obj/item/storage/box/crewvend = 100, /obj/item/clothing/head/helmet/space/plasmaman/white = 60, /obj/item/clothing/under/plasmaman/enviroslacks = 60) diff --git a/code/game/machinery/wall_holosign.dm b/code/game/machinery/wall_holosign.dm index a66a4f98a274..3e89ef7c651d 100644 --- a/code/game/machinery/wall_holosign.dm +++ b/code/game/machinery/wall_holosign.dm @@ -49,9 +49,9 @@ /obj/machinery/holosign_switch/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/holosign_switch/attackby__legacy__attackchain(obj/item/W, mob/user as mob, params) - if(istype(W, /obj/item/detective_scanner)) - return +/obj/machinery/holosign_switch/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/detective_scanner)) + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/holosign_switch/attack_hand(mob/user as mob) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 61ebcb67676d..534800a8d103 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -83,28 +83,28 @@ return toggle_door() - -/obj/machinery/washing_machine/attackby__legacy__attackchain(obj/item/W, mob/user, params) +/obj/machinery/washing_machine/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(user.a_intent == INTENT_HARM) return ..() - if(default_unfasten_wrench(user, W)) - return - if(default_deconstruction_screwdriver(user, icon_state, icon_state, W)) + if(default_unfasten_wrench(user, used)) + return ITEM_INTERACT_COMPLETE + if(default_deconstruction_screwdriver(user, icon_state, icon_state, used)) update_appearance(UPDATE_ICON_STATE) - return - if(default_deconstruction_crowbar(user, W, FALSE)) - return - if(istype(W, /obj/item/soap)) + return ITEM_INTERACT_COMPLETE + if(default_deconstruction_crowbar(user, used, FALSE)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/soap)) return ..() // need to be able to clean washing machine without putting stuff into the washing machine :D - if(istype(W, /obj/item/grab)) - var/obj/item/grab/G = W + if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used if(isliving(G.assailant)) if(attempt_insert(user, G.affecting)) qdel(G) - return - if(istype(W)) - if(attempt_insert(user, W)) - return + return ITEM_INTERACT_COMPLETE + if(istype(used)) + if(attempt_insert(user, used)) + return ITEM_INTERACT_COMPLETE + return ..() diff --git a/code/game/mecha/equipment/tools/janitor_tools.dm b/code/game/mecha/equipment/tools/janitor_tools.dm index 62f424914ca3..ba3b3143d648 100644 --- a/code/game/mecha/equipment/tools/janitor_tools.dm +++ b/code/game/mecha/equipment/tools/janitor_tools.dm @@ -220,8 +220,8 @@ // Garbage Magnet /obj/item/mecha_parts/mecha_equipment/janitor/garbage_magnet name = "\improper WA1E Garbage Magnet" - desc = "Bluespace technology integrated with an oversized garbage bag and heavy duty magnets allows this device to pick up all manner of litter. \ - The complex technology prevents users from directly looking inside the bag." + desc = "An industrial vaccuum cleaner integrated with an oversized garbage bag and heavy duty magnets allows this device to pick up all manner of litter. \ + The device's safety systems prevent users from directly looking inside the bag." icon_state = "mecha_trash_magnet" equip_cooldown = 1.5 SECONDS energy_drain = 5 diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 6d55f9a41ef3..9b3ff37da45c 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -233,10 +233,10 @@ if(isobj(H.shoes) && !(H.shoes.flags & NODROP)) var/thingy = H.shoes H.drop_item_to_ground(thingy) - walk_away(thingy,chassis,15,2) + GLOB.move_manager.move_away(thingy, chassis, 15, 2) spawn(20) if(thingy) - walk(thingy,0) + GLOB.move_manager.stop_looping(thingy) for(var/obj/mecha/combat/reticence/R in oview(6, chassis)) R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.") R.use_power(R.get_charge() / 4) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 9ace87b74229..3c481ae663a1 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -310,13 +310,12 @@ return FALSE return TRUE -// Interaction code -/obj/machinery/mecha_part_fabricator/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W)) - return +/obj/machinery/mecha_part_fabricator/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", used)) + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, W)) - return TRUE + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index df4cad6e0014..b8d369ca0a8b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -90,7 +90,7 @@ var/destruction_sleep_duration = 2 SECONDS //Time that mech pilot is put to sleep for if mech is destroyed var/melee_cooldown = 10 - var/melee_can_hit = TRUE + var/mecha_melee_cooldown = FALSE /// How many ion thrusters we got on this bad boy var/thruster_count = 0 @@ -263,12 +263,12 @@ else if(internal_damage & MECHA_INT_CONTROL_LOST) target = safepick(oview(1, src)) - if(!melee_can_hit || !isatom(target)) + if(mecha_melee_cooldown || !isatom(target)) return - target.mech_melee_attack(src) - melee_can_hit = FALSE - spawn(melee_cooldown) - melee_can_hit = TRUE + if(iswallturf(target) || isliving(target) || isobj(target)) + target.mech_melee_attack(src) + mecha_melee_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, mecha_melee_cooldown, FALSE), melee_cooldown) /obj/mecha/proc/mech_toxin_damage(mob/living/target) playsound(src, 'sound/effects/spray2.ogg', 50, 1) @@ -286,7 +286,7 @@ //////// MARK: Movement procs ////////////////////////////////// -/obj/mecha/Process_Spacemove(movement_dir = 0) +/obj/mecha/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) . = ..() if(.) return TRUE @@ -1031,6 +1031,10 @@ //Hack and From Card interactions share some code, so leave that here for both to use. /obj/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI, interaction) + var/mob/camera/eye/hologram/hologram_eye = AI.remote_control + if(istype(hologram_eye)) + hologram_eye.release_control() + qdel(hologram_eye) AI.aiRestorePowerRoutine = 0 AI.forceMove(src) occupant = AI @@ -1315,6 +1319,7 @@ RemoveActions(occupant, 1) mob_container = AI newloc = get_turf(AI.linked_core) + AI.eyeobj?.set_loc(newloc) qdel(AI.linked_core) else return diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 1d213eb825e2..47df4e682660 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -418,7 +418,7 @@ shootAt(H) if(prob(10)) - var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src)) + var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container/anomaly(get_turf(src)) for(var/i in 1 to 5) step_towards(A, pick(turf_targets)) sleep(2) diff --git a/code/game/objects/effects/decals/Cleanable/alien_blood.dm b/code/game/objects/effects/decals/Cleanable/alien_blood.dm index 2e02edee4a22..1f062d451125 100644 --- a/code/game/objects/effects/decals/Cleanable/alien_blood.dm +++ b/code/game/objects/effects/decals/Cleanable/alien_blood.dm @@ -2,7 +2,7 @@ name = "xeno blood" desc = "It's green and acidic. It looks like... blood?" icon = 'icons/effects/blood.dmi' - basecolor = "#05EE05" + basecolor = COLOR_BLOOD_XENO bloodiness = BLOOD_AMOUNT_PER_DECAL blood_state = BLOOD_STATE_XENO @@ -15,11 +15,7 @@ desc = "Gnarly..." icon_state = "xgib1" random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6") - basecolor = "#05EE05" - -/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon() - color = "#FFFFFF" - . = ..(NONE) + basecolor = COLOR_BLOOD_XENO /obj/effect/decal/cleanable/blood/gibs/xeno/up random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6", "xgibup1", "xgibup1", "xgibup1") @@ -37,7 +33,7 @@ random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3") /obj/effect/decal/cleanable/blood/xtracks - basecolor = "#05EE05" + basecolor = COLOR_BLOOD_XENO /// this is the alien blood file, slimes are aliens. /obj/effect/decal/cleanable/blood/slime diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index f9d8e1f4acba..b071cea77247 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -14,6 +14,7 @@ random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") blood_DNA = list() var/base_icon = 'icons/effects/blood.dmi' + base_icon_state = "mfloor1" var/blood_state = BLOOD_STATE_HUMAN bloodiness = BLOOD_AMOUNT_PER_DECAL var/basecolor = "#A10808" // Color when wet. @@ -21,7 +22,8 @@ var/dry_timer = 0 var/off_floor = FALSE var/image/weightless_image - inertia_move_delay = 1 // so they dont collide with who emitted them + var/weightless_icon = 'icons/effects/blood_weightless.dmi' + inertia_move_delay = 5 // so they dont collide with who emitted them /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) if(C == src) @@ -33,18 +35,32 @@ C.bloodiness += bloodiness return ..() -/obj/effect/decal/cleanable/blood/Initialize(mapload) +/obj/effect/decal/cleanable/blood/Initialize(mapload, decal_color) . = ..() - weightless_image = new() + if(decal_color) + basecolor = decal_color + else + if(basecolor == "rainbow") + basecolor = "#[pick("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")]" + + color = basecolor + base_icon_state = icon_state + + var/turf/T = get_turf(src) + check_gravity(T) update_icon() - if(!gravity_check) + if(gravity_check) + if(!. && !QDELETED(src)) + dry_timer = addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1), TIMER_STOPPABLE) + else + if(prob(50)) + animate_float(src, -1, rand(30,120)) + else + animate_levitate(src, -1, rand(30,120)) //weightless blood cannot dry return - if(!. && !QDELETED(src)) - dry_timer = addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1), TIMER_STOPPABLE) - var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_atom_entered), ) @@ -56,38 +72,32 @@ QDEL_NULL(weightless_image) return ..() -/obj/effect/decal/cleanable/blood/update_icon() - var/turf/T = get_turf(src) - check_gravity(T) +/obj/effect/decal/cleanable/blood/update_overlays() + . = ..() + + if(gravity_check) + return + + if(!weightless_image) + color = COLOR_WHITE + weightless_image = image(weightless_icon, base_icon_state) + weightless_image.icon += basecolor + . += weightless_image + +/obj/effect/decal/cleanable/blood/update_icon() if(should_be_off_floor()) off_floor = TRUE layer = ABOVE_MOB_LAYER plane = GAME_PLANE - if(basecolor == "rainbow") - basecolor = "#[pick("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")]" - - color = basecolor - - if(!gravity_check) - if(prob(50)) - animate_float(src, -1, rand(30,120)) - else - animate_levitate(src, -1, rand(30,120)) - - if(weightless_image && weightless_image.icon_state) - icon_state = weightless_image.icon_state - - overlays -= weightless_image - color = "#FFFFFF" - icon = 'icons/effects/blood_weightless.dmi' - weightless_image = image(icon, icon_state) - icon_state = "empty" - weightless_image.icon += basecolor - overlays += weightless_image + if(gravity_check) + icon = initial(icon) + icon_state = base_icon_state + color = basecolor else - overlays.Cut() + icon_state = null + ..() /obj/effect/decal/cleanable/blood/proc/should_be_off_floor() @@ -116,32 +126,17 @@ return if(loc != T) forceMove(T) //move to the turf to splatter on - animate(src) //stop floating gravity_check = ALWAYS_IN_GRAVITY - icon = initial(icon) - icon_state = weightless_image.icon_state layer = initial(layer) plane = initial(plane) + animate(src) update_icon() - -/obj/effect/decal/cleanable/blood/Process_Spacemove(movement_dir) +/obj/effect/decal/cleanable/blood/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(gravity_check) return TRUE - if(has_gravity(src)) - if(!gravity_check) - splat(get_step(src, movement_dir)) - return TRUE - - if(pulledby && !pulledby.pulling) - return TRUE - - if(throwing) - return TRUE - - return FALSE - + return ..() /obj/effect/decal/cleanable/blood/Bump(atom/A) if(gravity_check) @@ -162,8 +157,11 @@ return ..() /obj/effect/decal/cleanable/blood/proc/bloodyify_human(mob/living/carbon/human/H) - if(inertia_dir && H.inertia_dir == inertia_dir) //if they are moving the same direction we are, no collison - return + // Originally this code would check to see if both us and the human + // we collided with had inertia in the same direction, and avoided collision + // if so. This might be possible with movement loops but, realistically, + // if we've gotten here, the objects have collided no matter what direction + // they were going in. var/list/obj/item/things_to_potentially_bloody = list() var/count = amount + 1 @@ -317,17 +315,21 @@ mergeable_decal = TRUE /obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) - set waitfor = 0 + var/delay = 2 + var/range = pick(1, 200; 2, 150; 3, 50; 4) var/direction = pick(directions) - for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) - sleep(3) - if(i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc) - b.basecolor = src.basecolor - b.update_icon() - if(step_to(src, get_step(src, direction), 0)) - break + var/datum/move_loop/loop = GLOB.move_manager.move_to(src, get_step(src, direction), delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects)) + +/obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source) + SIGNAL_HANDLER // COMSIG_MOVELOOP_POSTPROCESS + var/obj/effect/decal/cleanable/blood/target = source.target + var/obj/effect/decal/cleanable/blood/splatter/splatter = new(loc, istype(target) ? target.basecolor : basecolor) + + if(istype(target)) + splatter.basecolor = target.basecolor + splatter.update_icon() /obj/effect/decal/cleanable/blood/old/Initialize(mapload) . = ..() diff --git a/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm b/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm index 8048ab7e23d1..f0ddd75c6be5 100644 --- a/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm +++ b/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm @@ -159,9 +159,8 @@ /obj/effect/decal/cleanable/vomit/Initialize(mapload) . = ..() var/turf/T = get_turf(src) - gravity_check = has_gravity(src, T) - if(loc != T) - forceMove(T) + check_gravity(T) + if(!gravity_check) layer = MOB_LAYER plane = GAME_PLANE @@ -177,9 +176,17 @@ AddElement(/datum/element/connect_loc, loc_connections) /obj/effect/decal/cleanable/vomit/Bump(atom/A) - . = ..() - if(A.density) + if(gravity_check) + return ..() + + if(iswallturf(A) || istype(A, /obj/structure/window)) splat(A) + return + else if(A.density) + splat(get_turf(A)) + return + + return ..() /obj/effect/decal/cleanable/vomit/proc/on_atom_entered(datum/source, atom/movable/entered) if(!gravity_check) @@ -204,22 +211,11 @@ plane = initial(plane) animate(src) -/obj/effect/decal/cleanable/vomit/Process_Spacemove(movement_dir) +/obj/effect/decal/cleanable/vomit/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(gravity_check) - return 1 - - if(has_gravity(src)) - if(!gravity_check) - splat(get_step(src, movement_dir)) - return 1 + return TRUE - if(pulledby && !pulledby.pulling) - return 1 - - if(throwing) - return 1 - - return 0 + return ..() /obj/effect/decal/cleanable/vomit/green name = "green vomit" diff --git a/code/game/objects/effects/decals/misc_decals.dm b/code/game/objects/effects/decals/misc_decals.dm index f8b34c230237..d287bbd31433 100644 --- a/code/game/objects/effects/decals/misc_decals.dm +++ b/code/game/objects/effects/decals/misc_decals.dm @@ -12,6 +12,19 @@ /obj/effect/decal/chempuff/blob_act(obj/structure/blob/B) return +/obj/effect/decal/chempuff/proc/loop_ended(datum/source) + SIGNAL_HANDLER // COMSIG_PARENT_QDELETING + if(QDELETED(src)) + return + qdel(src) + +/obj/effect/decal/chempuff/proc/check_move(datum/move_loop/source, succeeded) + SIGNAL_HANDLER // COMSIG_MOVELOOP_POSTPROCESS + var/turf/our_turf = get_turf(src) + reagents.reaction(our_turf) + for(var/atom/T in our_turf) + reagents.reaction(T) + /obj/effect/decal/snow name = "snow" density = FALSE diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm index ab4a464d0016..076a749af060 100644 --- a/code/game/objects/effects/effect_system/effects_other.dm +++ b/code/game/objects/effects/effect_system/effects_other.dm @@ -1,3 +1,54 @@ +/datum/effect_system/trail_follow + var/turf/oldposition + var/active = FALSE + var/allow_overlap = FALSE + var/auto_process = TRUE + var/qdel_in_time = 10 + var/nograv_required = FALSE + +/datum/effect_system/trail_follow/set_up(atom/atom) + attach(atom) + oldposition = get_turf(atom) + +/datum/effect_system/trail_follow/Destroy() + oldposition = null + stop() + return ..() + +/datum/effect_system/trail_follow/proc/stop() + oldposition = null + STOP_PROCESSING(SSfastprocess, src) + active = FALSE + return TRUE + +/datum/effect_system/trail_follow/start() + oldposition = get_turf(holder) + if(!check_conditions()) + return FALSE + if(auto_process) + START_PROCESSING(SSfastprocess, src) + active = TRUE + return TRUE + +/datum/effect_system/trail_follow/process() + generate_effect() + +/datum/effect_system/trail_follow/generate_effect() + if(!check_conditions()) + return stop() + if(oldposition && !(oldposition == get_turf(holder))) + if(!has_gravity(oldposition) || !nograv_required) + var/obj/effect/E = new effect_type(oldposition) + set_dir(E) + if(qdel_in_time) + QDEL_IN(E, qdel_in_time) + oldposition = get_turf(holder) + +/datum/effect_system/trail_follow/proc/check_conditions() + if(!get_turf(holder)) + return FALSE + return TRUE + /// Ion trails for jetpacks, ion thrusters and other space-flying things /obj/effect/particle_effect/ion_trails name = "ion trails" @@ -8,6 +59,17 @@ dir = targetdir QDEL_IN(src, 0.6 SECONDS) +/datum/effect_system/trail_follow/ion + effect_type = /obj/effect/particle_effect/ion_trails + nograv_required = TRUE + qdel_in_time = 20 + +/datum/effect_system/trail_follow/proc/set_dir(obj/effect/particle_effect/ion_trails/I) + I.setDir(holder.dir) + +/datum/effect_system/trail_follow/ion/grav_allowed + nograv_required = FALSE + //Reagent-based explosion effect /datum/effect_system/reagents_explosion var/amount // TNT equivalent diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index f03b08668d82..ad651d5f0809 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -118,6 +118,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp name = "bubblegum_arena_exit" icon_state = "bubblegumjumpscare" +/obj/effect/landmark/spawner/backrooms + name = "backrooms_spawn" + icon_state = "Assistant" + +/obj/effect/landmark/spawner/backrooms/Initialize(mapload) + spawner_list = GLOB.backroomswarp + return ..() + /obj/effect/landmark/spawner/syndie name = "Syndicate-Spawn" icon_state = "Syndie" diff --git a/code/game/objects/effects/meteors.dm b/code/game/objects/effects/meteors.dm index 0b062f8b8e1d..de1020d61ce1 100644 --- a/code/game/objects/effects/meteors.dm +++ b/code/game/objects/effects/meteors.dm @@ -29,8 +29,8 @@ GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/meaty = 5, /obj/effect/me while(!isspaceturf(pickedstart)) var/startSide = pick(GLOB.cardinal) var/startZ = level_name_to_num(MAIN_STATION) - pickedstart = spaceDebrisStartLoc(startSide, startZ) - pickedgoal = spaceDebrisFinishLoc(startSide, startZ) + pickedstart = pick_edge_loc(startSide, startZ) + pickedgoal = pick_edge_loc(REVERSE_DIR(startSide), startZ) max_i-- if(max_i <= 0) return @@ -38,41 +38,23 @@ GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/meaty = 5, /obj/effect/me var/obj/effect/meteor/M = new Me(pickedstart, pickedgoal) M.dest = pickedgoal -/proc/spaceDebrisStartLoc(startSide, Z) +/proc/pick_edge_loc(startSide, Z) var/starty var/startx switch(startSide) if(NORTH) - starty = world.maxy-(TRANSITIONEDGE + MAP_EDGE_PAD) - startx = rand((TRANSITIONEDGE + MAP_EDGE_PAD), world.maxx-(TRANSITIONEDGE + MAP_EDGE_PAD)) + starty = world.maxy + startx = rand(1, world.maxx) if(EAST) - starty = rand((TRANSITIONEDGE + MAP_EDGE_PAD),world.maxy-(TRANSITIONEDGE + MAP_EDGE_PAD)) - startx = world.maxx-(TRANSITIONEDGE + MAP_EDGE_PAD) + starty = rand(1, world.maxy) + startx = world.maxx if(SOUTH) - starty = (TRANSITIONEDGE + MAP_EDGE_PAD) - startx = rand((TRANSITIONEDGE + MAP_EDGE_PAD), world.maxx-(TRANSITIONEDGE + MAP_EDGE_PAD)) + starty = 1 + startx = rand(1, world.maxx) if(WEST) - starty = rand((TRANSITIONEDGE + MAP_EDGE_PAD), world.maxy-(TRANSITIONEDGE + MAP_EDGE_PAD)) - startx = (TRANSITIONEDGE + MAP_EDGE_PAD) - . = locate(startx, starty, Z) - -/proc/spaceDebrisFinishLoc(startSide, Z) - var/endy - var/endx - switch(startSide) - if(NORTH) - endy = (TRANSITIONEDGE + MAP_EDGE_PAD) - endx = rand((TRANSITIONEDGE + MAP_EDGE_PAD), world.maxx-(TRANSITIONEDGE + MAP_EDGE_PAD)) - if(EAST) - endy = rand((TRANSITIONEDGE + MAP_EDGE_PAD), world.maxy-(TRANSITIONEDGE + MAP_EDGE_PAD)) - endx = (TRANSITIONEDGE + MAP_EDGE_PAD) - if(SOUTH) - endy = world.maxy-(TRANSITIONEDGE + MAP_EDGE_PAD) - endx = rand((TRANSITIONEDGE + MAP_EDGE_PAD), world.maxx-(TRANSITIONEDGE + MAP_EDGE_PAD)) - if(WEST) - endy = rand((TRANSITIONEDGE + MAP_EDGE_PAD),world.maxy-(TRANSITIONEDGE + MAP_EDGE_PAD)) - endx = world.maxx-(TRANSITIONEDGE + MAP_EDGE_PAD) - . = locate(endx, endy, Z) + starty = rand(1, world.maxy) + startx = 1 + return locate(startx, starty, Z) /////////////////////// //The meteor effect @@ -96,7 +78,8 @@ GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/meaty = 5, /obj/effect/me var/list/meteordrop = list(/obj/item/stack/ore/iron) var/dropamt = 2 -/obj/effect/meteor/Move() +/obj/effect/meteor/Move(atom/newloc, direction, glide_size_override = 0, update_dir = TRUE) + // Delete if we reach our goal or somehow leave the Z level. if(z != z_original || loc == dest) qdel(src) return FALSE @@ -114,17 +97,21 @@ GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/meaty = 5, /obj/effect/me if(timerid) deltimer(timerid) GLOB.meteor_list -= src - walk(src, 0) //this cancels the walk_towards() proc + GLOB.move_manager.stop_looping(src) //this cancels the GLOB.move_manager.home_onto() proc return ..() /obj/effect/meteor/Initialize(mapload, target) . = ..() + ADD_TRAIT(src, TRAIT_NO_EDGE_TRANSITIONS, ROUNDSTART_TRAIT) z_original = z GLOB.meteor_list += src SpinAnimation() timerid = QDEL_IN(src, lifetime) chase_target(target) +/obj/effect/meteor/Process_Spacemove(movement_dir, continuous_move) + return TRUE + /obj/effect/meteor/Bump(atom/A) if(A) ram_turf(get_turf(A)) @@ -174,7 +161,7 @@ GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/meaty = 5, /obj/effect/me /obj/effect/meteor/proc/chase_target(atom/chasing, delay = 1) set waitfor = FALSE if(chasing) - walk_towards(src, chasing, delay) + GLOB.move_manager.home_onto(src, chasing, delay) /obj/effect/meteor/proc/meteor_effect() if(heavy) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 4a61e40a3fdd..45c498fe5c0a 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -163,6 +163,9 @@ do_sparks(5, 0, loc) qdel(src) +/obj/effect/portal/newtonian_move(direction, instant, start_delay) + return TRUE + #define UNSTABLE_TIME_DELAY 2 SECONDS /obj/effect/portal/hand_tele diff --git a/code/game/objects/effects/spawners/depot_spawners.dm b/code/game/objects/effects/spawners/depot_spawners.dm index e49d5b51122f..153871d088e9 100644 --- a/code/game/objects/effects/spawners/depot_spawners.dm +++ b/code/game/objects/effects/spawners/depot_spawners.dm @@ -65,37 +65,9 @@ ) // Loot -/obj/effect/spawner/random/syndicate/loot - spawn_inside = /obj/structure/closet/secure_closet/depot - -/obj/effect/spawner/random/syndicate/loot/common - name = "syndicate depot loot, common" - icon_state = "loot" - spawn_loot_chance = 50 - // Loot schema: costumes, toys, useless gimmick items - loot = list( - /obj/item/clothing/mask/gas/syndicate, - /obj/item/clothing/shoes/magboots/syndie, - /obj/item/clothing/suit/jacket/bomber/syndicate, - /obj/item/clothing/suit/storage/iaa/blackjacket/armored, - /obj/item/clothing/under/syndicate/combat, - /obj/item/clothing/under/syndicate/sniper, - /obj/item/coin/antagtoken/syndicate, - /obj/item/deck/cards/syndicate, - /obj/item/lighter/zippo/gonzofist, - /obj/item/soap/syndie, - /obj/item/stamp/chameleon, - /obj/item/storage/fancy/cigarettes/cigpack_syndicate, - /obj/item/storage/secure/briefcase/syndie, - /obj/item/storage/toolbox/syndicate, - /obj/item/suppressor, - /obj/item/toy/syndicateballoon, - ) - -/obj/effect/spawner/random/syndicate/loot/stetchkin +/obj/effect/spawner/random/syndicate/stetchkin name = "syndicate depot loot, 20pct stetchkin" icon_state = "stetchkin" - spawn_inside = null spawn_loot_chance = 80 loot = list( /obj/item/gun/projectile/automatic/pistol, @@ -104,84 +76,6 @@ /obj/item/wrench, ) -/obj/effect/spawner/random/syndicate/loot/rare - name = "syndicate depot loot, rare" - icon_state = "doubleloot" - spawn_loot_chance = 50 - // Basic stealth, utility and environmental gear. - loot = list( - /obj/item/ammo_box/magazine/m10mm, - /obj/item/clothing/gloves/color/black/thief, - /obj/item/clothing/shoes/chameleon/noslip, - /obj/item/clothing/under/syndicate/silicon_cham, - /obj/item/clothing/mask/chameleon/voice_change, - /obj/item/flash/cameraflash, - /obj/item/gun/projectile/automatic/toy/pistol/riot, - /obj/item/mod/control/pre_equipped/traitor, - /obj/item/mod/module/chameleon, - /obj/item/mod/module/holster/hidden, - /obj/item/mod/module/noslip, - /obj/item/mod/module/visor/night, - /obj/item/mod/module/plate_compression, - /obj/item/reagent_containers/hypospray/autoinjector/hyper_medipen, - /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium, - /obj/item/stack/sheet/mineral/gold{amount = 20}, - /obj/item/stack/sheet/mineral/plasma{amount = 20}, - /obj/item/stack/sheet/mineral/silver{amount = 20}, - /obj/item/stack/sheet/mineral/uranium{amount = 20}, - /obj/item/storage/backpack/duffel/syndie/med/surgery, - /obj/item/storage/backpack/satchel_flat, - /obj/item/storage/belt/military, - /obj/item/storage/box/syndie_kit/camera_bug, - /obj/item/storage/box/syndie_kit/chameleon, - /obj/item/storage/box/syndie_kit/space, - ) - -/obj/effect/spawner/random/syndicate/loot/officer - name = "syndicate depot loot, officer" - spawn_loot_chance = 40 - // Primarily utility items with occasional low damage weaponry. - loot = list( - /obj/item/borg/upgrade/syndicate, - /obj/item/clothing/glasses/hud/security/chameleon, - /obj/item/clothing/glasses/thermal, - /obj/item/clothing/shoes/magboots/elite, - /obj/item/door_remote/omni/access_tuner, - /obj/item/encryptionkey/binary, - /obj/item/gun/projectile/automatic/c20r/toy/riot, - /obj/item/jammer, - /obj/item/mod/module/power_kick, - /obj/item/mod/module/stealth, - /obj/item/mod/module/visor/thermal, - /obj/item/pen/edagger, - /obj/item/pinpointer/advpinpointer, - /obj/item/stack/sheet/mineral/diamond{amount = 10}, - /obj/item/storage/belt/sheath/snakesfang, - /obj/item/storage/box/syndidonkpockets, - /obj/item/storage/box/syndie_kit/stechkin, - /obj/item/storage/firstaid/tactical, - ) - -/obj/effect/spawner/random/syndicate/loot/armory - name = "syndicate depot loot, armory" - spawn_inside = /obj/structure/closet/secure_closet/depot/armory - // Combat orientated items that could give the player an advantage if an antag messes with them. - loot = list( - /obj/item/bio_chip_implanter/proto_adrenalin, - /obj/item/chameleon, - /obj/item/cqc_manual, - /obj/item/gun/medbeam, - /obj/item/gun/projectile/automatic/sniper_rifle/toy, - /obj/item/melee/energy/sword/saber, - /obj/item/mod/control/pre_equipped/traitor_elite, - /obj/item/organ/internal/cyberimp/arm/razorwire, - /obj/item/organ/internal/cyberimp/brain/sensory_enhancer, - /obj/item/reagent_containers/hypospray/autoinjector/stimulants, - /obj/item/shield/energy, - /obj/item/storage/box/syndie_kit/teleporter, - /obj/item/weaponcrafting/gunkit/universal_gun_kit, - ) - // Layout-affecting spawns /obj/effect/spawner/random/syndicate/walldoor diff --git a/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm b/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm index 77f011d04ab9..32beefb70549 100644 --- a/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm +++ b/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm @@ -140,7 +140,7 @@ /obj/effect/spawner/random/bluespace_tap/cultural_rare name = "rare cultural artifacts" loot = list( - /obj/vehicle/space/speedbike/red, + /obj/tgvehicle/speedbike/red, /obj/item/gun/projectile/automatic/l6_saw/toy, /obj/item/gun/projectile/automatic/sniper_rifle/toy, /obj/item/bedsheet/centcom, diff --git a/code/game/objects/effects/spawners/random/pool/pool_spawner.dm b/code/game/objects/effects/spawners/random/pool/pool_spawner.dm index 2cfcaaff9bd2..397a4801bd40 100644 --- a/code/game/objects/effects/spawners/random/pool/pool_spawner.dm +++ b/code/game/objects/effects/spawners/random/pool/pool_spawner.dm @@ -4,10 +4,10 @@ icon_state = "loot" /// How much this spawner will subtract from the available budget if it - /// spawns. A value of `INFINITY` (i.e., not setting the value on a subtype) + /// spawns. A value of `-1` (i.e., not setting the value on a subtype) /// does not attempt to subtract from the budget. This is useful for /// spawners which themselves spawn other spawners. - var/point_value = INFINITY + var/point_value = -1 /// Whether non-spawner items should be removed from the shared loot pool /// after spawning. var/unique_picks = FALSE @@ -79,7 +79,7 @@ deduct_points = FALSE // If we don't have a sane point value, don't deduct points - if(point_value == INFINITY) + if(point_value == -1) deduct_points = FALSE // If we deduct points, we need to check affordability diff --git a/code/game/objects/effects/spawners/random/pool/space_loot.dm b/code/game/objects/effects/spawners/random/pool/space_loot.dm new file mode 100644 index 000000000000..1cec5c1408f6 --- /dev/null +++ b/code/game/objects/effects/spawners/random/pool/space_loot.dm @@ -0,0 +1,340 @@ +/datum/spawn_pool/spaceloot + id = "space_loot_spawn_pool" + available_points = 1700 + +/obj/effect/spawner/random/pool/spaceloot + icon = 'icons/effects/random_spawners.dmi' + icon_state = "giftbox" + spawn_pool_id = "space_loot_spawn_pool" + record_spawn = TRUE + +/obj/effect/spawner/random/pool/spaceloot/record_item(type_path_to_make) + if(ispath(type_path_to_make, /obj/effect)) + return + + SSblackbox.record_feedback("tally", "space_loot_spawns", 1, "[type_path_to_make]") + +/obj/effect/spawner/random/pool/spaceloot/dvorak_core_table + point_value = 100 + guaranteed = TRUE + loot = list( + /obj/item/rcd/combat, + /obj/item/gun/medbeam, + /obj/item/gun/energy/wormhole_projector, + /obj/item/storage/box/syndie_kit/oops_all_extraction_flares, + ) + +/obj/effect/spawner/random/pool/spaceloot/dvorak_emp_loot + point_value = 35 + guaranteed = TRUE + loot = list( + /obj/item/grenade/empgrenade = 8, + /obj/item/gun/energy/ionrifle/carbine = 1, + /obj/item/gun/energy/ionrifle = 1, + ) + +/obj/effect/spawner/random/pool/spaceloot/dvorak_displaycase + point_value = 100 + guaranteed = TRUE + loot = list(/obj/structure/displaycase/dvoraks_treat) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/common + name = "syndicate depot loot, common" + icon_state = "loot" + point_value = 10 + loot = list( + // Loot schema: costumes, toys, useless gimmick items + /obj/item/clothing/mask/gas/syndicate, + /obj/item/clothing/shoes/magboots/syndie, + /obj/item/clothing/suit/jacket/bomber/syndicate, + /obj/item/clothing/suit/storage/iaa/blackjacket/armored, + /obj/item/clothing/under/syndicate/combat, + /obj/item/clothing/under/syndicate/sniper, + /obj/item/coin/antagtoken/syndicate, + /obj/item/deck/cards/syndicate, + /obj/item/lighter/zippo/gonzofist, + /obj/item/soap/syndie, + /obj/item/stamp/chameleon, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate, + /obj/item/storage/toolbox/syndicate, + /obj/item/suppressor, + /obj/item/toy/syndicateballoon, + ) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/common/depot + spawn_inside = /obj/structure/closet/secure_closet/depot + spawn_loot_chance = 40 + loot = list( + // Loot schema: costumes, toys, useless gimmick items + /obj/item/clothing/mask/gas/syndicate, + /obj/item/clothing/shoes/magboots/syndie, + /obj/item/clothing/suit/jacket/bomber/syndicate, + /obj/item/clothing/suit/storage/iaa/blackjacket/armored, + /obj/item/clothing/under/syndicate/combat, + /obj/item/clothing/under/syndicate/sniper, + /obj/item/coin/antagtoken/syndicate, + /obj/item/deck/cards/syndicate, + /obj/item/lighter/zippo/gonzofist, + /obj/item/soap/syndie, + /obj/item/stamp/chameleon, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate, + /obj/item/storage/toolbox/syndicate, + /obj/item/suppressor, + /obj/item/toy/syndicateballoon, + + // only in depot for common-tier + /obj/item/storage/secure/briefcase/syndie, + ) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/stetchkin + name = "syndicate depot loot, 20% stetchkin" + icon_state = "stetchkin" + spawn_loot_chance = 80 + point_value = 25 + loot = list(/obj/item/gun/projectile/automatic/pistol) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/rare + name = "syndicate depot loot, rare" + icon_state = "doubleloot" + point_value = 45 + // Basic stealth, utility and environmental gear. + loot = list( + /obj/item/ammo_box/magazine/m10mm, + /obj/item/clothing/gloves/color/black/thief, + /obj/item/clothing/shoes/chameleon/noslip, + /obj/item/clothing/under/syndicate/silicon_cham, + /obj/item/clothing/mask/chameleon/voice_change, + /obj/item/flash/cameraflash, + /obj/item/gun/projectile/automatic/toy/pistol/riot, + /obj/item/lighter/zippo/gonzofist, + /obj/item/mod/module/chameleon, + /obj/item/mod/module/holster/hidden, + /obj/item/mod/module/noslip, + /obj/item/mod/module/visor/night, + /obj/item/mod/module/plate_compression, + /obj/item/reagent_containers/hypospray/autoinjector/hyper_medipen, + /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium, + /obj/item/stack/sheet/mineral/gold{amount = 20}, + /obj/item/stack/sheet/mineral/plasma{amount = 20}, + /obj/item/stack/sheet/mineral/silver{amount = 20}, + /obj/item/stack/sheet/mineral/uranium{amount = 20}, + /obj/item/stamp/chameleon, + /obj/item/storage/backpack/duffel/syndie/med/surgery, + /obj/item/storage/backpack/satchel_flat, + /obj/item/storage/belt/military, + /obj/item/storage/box/syndie_kit/camera_bug, + /obj/item/storage/box/syndie_kit/chameleon, + /obj/item/storage/box/syndie_kit/space, + + // common -> rare-tier for ruins + /obj/item/storage/secure/briefcase/syndie, + ) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/rare/depot + spawn_inside = /obj/structure/closet/secure_closet/depot + spawn_loot_chance = 40 + loot = list( + /obj/item/ammo_box/magazine/m10mm, + /obj/item/clothing/gloves/color/black/thief, + /obj/item/clothing/shoes/chameleon/noslip, + /obj/item/clothing/under/syndicate/silicon_cham, + /obj/item/clothing/mask/chameleon/voice_change, + /obj/item/flash/cameraflash, + /obj/item/gun/projectile/automatic/toy/pistol/riot, + /obj/item/lighter/zippo/gonzofist, + /obj/item/mod/module/chameleon, + /obj/item/mod/module/holster/hidden, + /obj/item/mod/module/noslip, + /obj/item/mod/module/visor/night, + /obj/item/mod/module/plate_compression, + /obj/item/reagent_containers/hypospray/autoinjector/hyper_medipen, + /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium, + /obj/item/stack/sheet/mineral/gold{amount = 20}, + /obj/item/stack/sheet/mineral/plasma{amount = 20}, + /obj/item/stack/sheet/mineral/silver{amount = 20}, + /obj/item/stack/sheet/mineral/uranium{amount = 20}, + /obj/item/stamp/chameleon, + /obj/item/storage/backpack/duffel/syndie/med/surgery, + /obj/item/storage/backpack/satchel_flat, + /obj/item/storage/belt/military, + /obj/item/storage/box/syndie_kit/camera_bug, + /obj/item/storage/box/syndie_kit/chameleon, + /obj/item/storage/box/syndie_kit/space, + ) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/officer + name = "syndicate depot loot, officer" + point_value = 110 + // Primarily utility items with occasional low damage weaponry, and a blood-red, because that's too good for rare-tier. + loot = list( + /obj/item/borg/upgrade/syndicate, + /obj/item/clothing/glasses/hud/security/chameleon, + /obj/item/clothing/glasses/thermal, + /obj/item/clothing/shoes/magboots/elite, + /obj/item/door_remote/omni/access_tuner, + /obj/item/encryptionkey/binary, + /obj/item/jammer, + /obj/item/mod/module/power_kick, + /obj/item/mod/module/visor/thermal, + /obj/item/pen/edagger, + /obj/item/pinpointer/advpinpointer, + /obj/item/stack/sheet/mineral/diamond{amount = 10}, + /obj/item/storage/belt/sheath/snakesfang, + /obj/item/storage/box/syndidonkpockets, + /obj/item/storage/box/syndie_kit/stechkin, + /obj/item/mod/control/pre_equipped/traitor, + ) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/officer/depot + spawn_inside = /obj/structure/closet/secure_closet/depot + spawn_loot_chance = 40 + loot = list( + /obj/item/borg/upgrade/syndicate, + /obj/item/clothing/glasses/hud/security/chameleon, + /obj/item/clothing/glasses/thermal, + /obj/item/clothing/shoes/magboots/elite, + /obj/item/door_remote/omni/access_tuner, + /obj/item/encryptionkey/binary, + /obj/item/jammer, + /obj/item/mod/module/power_kick, + /obj/item/mod/module/visor/thermal, + /obj/item/pen/edagger, + /obj/item/pinpointer/advpinpointer, + /obj/item/stack/sheet/mineral/diamond{amount = 10}, + /obj/item/storage/belt/sheath/snakesfang, + /obj/item/storage/box/syndidonkpockets, + /obj/item/storage/box/syndie_kit/stechkin, + /obj/item/mod/control/pre_equipped/traitor, + + // only in depot for officer-tier + /obj/item/mod/module/stealth, + ) + + +/obj/effect/spawner/random/pool/spaceloot/syndicate/armory + name = "syndicate depot loot, armory" + // Combat orientated items that could give the player an advantage if an antag messes with them. + point_value = 200 + loot = list( + /obj/item/bio_chip_implanter/proto_adrenalin, + /obj/item/chameleon, + /obj/item/gun/medbeam, + /obj/item/gun/projectile/automatic/sniper_rifle/toy, + /obj/item/melee/energy/sword/saber, + /obj/item/mod/control/pre_equipped/traitor_elite, + /obj/item/organ/internal/cyberimp/arm/razorwire, + /obj/item/organ/internal/cyberimp/brain/sensory_enhancer, + /obj/item/reagent_containers/hypospray/autoinjector/stimulants, + /obj/item/shield/energy, + /obj/item/weaponcrafting/gunkit/universal_gun_kit, + + // officer -> armory tier for ruins + /obj/item/mod/module/stealth, + ) + +/obj/effect/spawner/random/pool/spaceloot/syndicate/armory/depot + guaranteed = TRUE + spawn_inside = /obj/structure/closet/secure_closet/depot/armory + loot = list( + /obj/item/bio_chip_implanter/proto_adrenalin, + /obj/item/chameleon, + /obj/item/gun/medbeam, + /obj/item/gun/projectile/automatic/sniper_rifle/toy, + /obj/item/melee/energy/sword/saber, + /obj/item/mod/control/pre_equipped/traitor_elite, + /obj/item/organ/internal/cyberimp/arm/razorwire, + /obj/item/organ/internal/cyberimp/brain/sensory_enhancer, + /obj/item/reagent_containers/hypospray/autoinjector/stimulants, + /obj/item/shield/energy, + /obj/item/weaponcrafting/gunkit/universal_gun_kit, + + // only in armory tier for depot + /obj/item/storage/box/syndie_kit/teleporter, + /obj/item/cqc_manual, + ) + + +/obj/effect/spawner/random/pool/spaceloot/syndicate/mixed + loot = list( + /obj/effect/spawner/random/pool/spaceloot/syndicate/common = 30, + /obj/effect/spawner/random/pool/spaceloot/syndicate/rare = 20, + /obj/effect/spawner/random/pool/spaceloot/syndicate/officer = 5, + /obj/effect/spawner/random/pool/spaceloot/syndicate/armory = 1, + ) + +// Only two of these +/obj/effect/spawner/random/pool/spaceloot/zoo + unique_picks = TRUE + guaranteed = TRUE + point_value = 20 + loot = list( + /obj/item/gun/energy/floragun, + /obj/item/gun/energy/temperature, + ) + +/obj/effect/spawner/random/pool/spaceloot/modsuit_syndie + point_value = 100 + spawn_loot_chance = 50 + loot = list(/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib) + +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19 + name = "moon outpost 19 loot spawner" + point_value = 30 + guaranteed = TRUE + spawn_all_loot = TRUE + +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19/vault1 + loot = list(/obj/item/paper/researchnotes) + +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19/vault2 + loot = list( + /obj/item/storage/lockbox/experimental_weapon, + /obj/item/assembly/signaler/anomaly/random, + ) + +/obj/effect/spawner/random/pool/spaceloot/moonoutpost19/vault3 + loot = list( + /obj/item/mecha_parts/core, + /obj/item/stock_parts/cell/infinite/abductor, + ) + +/obj/effect/spawner/random/pool/spaceloot/deepstorage/main + name = "warehouse main reward spawner" + guaranteed = TRUE + point_value = 100 + loot = list( + /obj/item/storage/belt/champion/wrestling, + /obj/item/storage/box/weaver_kit, + /obj/item/gun/medbeam, + /obj/item/storage/lockbox/experimental_weapon, + ) + +/obj/effect/spawner/random/pool/spaceloot/mechtransport + name = "mech transport storage loot spawner" + guaranteed = TRUE + point_value = 20 + spawn_all_loot = TRUE + spawn_random_offset = TRUE + spawn_random_offset_max_pixels = 8 + + +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage1 + loot = list( + /obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/extinguisher, + /obj/item/mecha_modkit/voice/honk, + ) + +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage2 + loot = list( + /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill, + /obj/item/mecha_parts/mecha_equipment/drill, + /obj/item/mecha_parts/mecha_equipment/drill, + ) + +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage3 + loot = list(/obj/item/mecha_parts/mecha_equipment/medical/sleeper) + +/obj/effect/spawner/random/pool/spaceloot/mechtransport/storage4 + loot = list(/obj/item/mecha_parts/core) + diff --git a/code/game/objects/effects/spawners/random/pool/spawn_pool.dm b/code/game/objects/effects/spawners/random/pool/spawn_pool.dm index 8588a1b1dcbe..7c1ff9434c5f 100644 --- a/code/game/objects/effects/spawners/random/pool/spawn_pool.dm +++ b/code/game/objects/effects/spawners/random/pool/spawn_pool.dm @@ -55,5 +55,6 @@ qdel(spawner) + log_game("finished spawner [id] with [length(known_spawners)] remaining spawners and [available_points] points remaining.") QDEL_LIST_CONTENTS(known_spawners) diff --git a/code/game/objects/effects/spawners/random/random_spawner.dm b/code/game/objects/effects/spawners/random/random_spawner.dm index 4d7487f65e62..c3f1c6eec5bc 100644 --- a/code/game/objects/effects/spawners/random/random_spawner.dm +++ b/code/game/objects/effects/spawners/random/random_spawner.dm @@ -70,9 +70,10 @@ var/list/spawn_locations = get_spawn_locations(spawn_scatter_radius) var/spawn_loot_count = isnull(lootcount_override) ? src.spawn_loot_count : lootcount_override + var/atom/container if(spawn_inside) - new spawn_inside(loc) + container = new spawn_inside(loc) if(spawn_all_loot) spawn_loot_count = INFINITY @@ -127,6 +128,10 @@ spawned_loot.pixel_x = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider) + (column * spawn_loot_split_pixel_offsets) spawned_loot.pixel_y = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider) + if(container) + spawned_loot.forceMove(container) + + /** * Makes the actual item related to our spawner. If `record_spawn` is `TRUE`, * this is when the items spawned are recorded to blackbox (except for `/obj/effect`s). diff --git a/code/game/objects/effects/spawners/random/traders/trader_department_spawners.dm b/code/game/objects/effects/spawners/random/traders/trader_department_spawners.dm index 9d1175f13dcd..7f781448d467 100644 --- a/code/game/objects/effects/spawners/random/traders/trader_department_spawners.dm +++ b/code/game/objects/effects/spawners/random/traders/trader_department_spawners.dm @@ -181,8 +181,8 @@ /obj/vehicle/motorcycle, /obj/vehicle/snowmobile, /obj/vehicle/snowmobile/blue, - /obj/vehicle/space/speedbike/red, - /obj/vehicle/space/speedbike, + /obj/tgvehicle/speedbike/red, + /obj/tgvehicle/speedbike, ) /obj/effect/spawner/random/traders/vehicle/make_item(spawn_loc, type_path_to_make) diff --git a/code/game/objects/effects/spawners/random/traders/trader_organization_spawners.dm b/code/game/objects/effects/spawners/random/traders/trader_organization_spawners.dm index 5a0636829c4d..37ffb074f5c5 100644 --- a/code/game/objects/effects/spawners/random/traders/trader_organization_spawners.dm +++ b/code/game/objects/effects/spawners/random/traders/trader_organization_spawners.dm @@ -7,7 +7,7 @@ /obj/item/clothing/suit/armor/bulletproof = 5, /obj/item/clothing/mask/gas/explorer/marines = 5, /obj/item/clothing/gloves/combat = 5, - /obj/item/storage/belt/military/assault = 5, + /obj/item/storage/belt/federation_webbing = 5, /obj/item/clothing/under/solgov = 5, /obj/item/mod/module/dispenser = 5, /obj/item/flag/solgov = 3 diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index c169729b8e50..9a31bef1b3e5 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -111,8 +111,8 @@ /obj/structure/spider/spiderling/Destroy() STOP_PROCESSING(SSobj, src) - // Release possible ref if a walk is still being processed - walk_to(src, 0) + // Cancel our movement. + GLOB.move_manager.stop_looping(src) entry_vent = null if(amount_grown < 100) new /obj/effect/decal/cleanable/spiderling_remains(get_turf(src)) @@ -175,7 +175,7 @@ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) if(!v.welded) entry_vent = v - walk_to(src, entry_vent, 1) + GLOB.move_manager.home_onto(src, entry_vent, 1, 10) break if(isturf(loc)) amount_grown += rand(0,2) @@ -214,7 +214,7 @@ available_turfs += S if(!length(available_turfs)) return FALSE - walk_to(src, pick(available_turfs)) + GLOB.move_manager.home_onto(src, pick(available_turfs), 1, 10) return TRUE /obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ab8b3bff5337..270e46c314bd 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -581,7 +581,10 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons // The default action is attack_self(). // Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. /obj/item/proc/ui_action_click(mob/user, actiontype) - attack_self__legacy__attackchain(user) + if(new_attack_chain) + activate_self(user) + else + attack_self__legacy__attackchain(user) /obj/item/proc/IsReflect(def_zone) // This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit return FALSE @@ -1017,3 +1020,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons return FALSE return cig + +/// Changes the speech verb when wearing this item if a value is returned +/obj/item/proc/change_speech_verb() + return diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index d3905586c9ab..af84fa3e00cb 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -16,8 +16,10 @@ var/additional_access = list() var/obj/item/card/id/ID -/obj/item/door_remote/New() - ..() + new_attack_chain = TRUE + +/obj/item/door_remote/Initialize(mapload) + . = ..() ID = new /obj/item/card/id for(var/region in region_access) ID.access += get_region_accesses(region) @@ -28,7 +30,10 @@ QDEL_NULL(ID) return ..() -/obj/item/door_remote/attack_self__legacy__attackchain(mob/user) +/obj/item/door_remote/activate_self(mob/user) + if(..()) + return + var/list/options = list(WAND_OPEN = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_open"), WAND_BOLT = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_bolt"), WAND_EMERGENCY = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_ea"), @@ -49,21 +54,27 @@ . = ..() . += "It's current mode is: [mode]" -/obj/item/door_remote/afterattack__legacy__attackchain(obj/target, mob/user) +/obj/item/door_remote/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(istype(target, /obj/machinery/door/airlock)) access_airlock(target, user) + return ITEM_INTERACT_COMPLETE if(istype(target, /obj/machinery/door/window)) access_windoor(target, user) + return ITEM_INTERACT_COMPLETE + +/obj/item/door_remote/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(istype(target, /obj/machinery/door/airlock)) + access_airlock(target, user) + return ITEM_INTERACT_COMPLETE + if(istype(target, /obj/machinery/door/window)) + access_windoor(target, user) + return ITEM_INTERACT_COMPLETE /obj/item/door_remote/proc/access_airlock(obj/machinery/door/airlock/D, mob/user) if(HAS_TRAIT(D, TRAIT_CMAGGED)) to_chat(user, "The door doesn't respond to [src]!") return - if(D.is_special) - to_chat(user, "[src] cannot access this kind of door!") - return - if(!(D.arePowerSystemsOn())) to_chat(user, "[D] has no power!") return @@ -184,10 +195,18 @@ /// How far can we use this. Leave `null` for infinite range var/range -/obj/item/door_remote/omni/access_tuner/afterattack__legacy__attackchain(obj/machinery/door/D, mob/user) - if(!istype(D, /obj/machinery/door/airlock) && !istype(D, /obj/machinery/door/window)) +/obj/item/door_remote/omni/access_tuner/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(hack(target, user)) // if the hack is successful, calls the parent proc and does the door stuff + return ..() + +/obj/item/door_remote/omni/access_tuner/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(hack(target, user)) + return ..() + +/obj/item/door_remote/omni/access_tuner/proc/hack(atom/target, mob/user) + if(!istype(target, /obj/machinery/door/airlock) && !istype(target, /obj/machinery/door/window)) return - if(!isnull(range) && get_dist(src, D) > range) + if(!isnull(range) && get_dist(src, target) > range) return if(busy) @@ -195,9 +214,11 @@ return icon_state = "hacktool-g" busy = TRUE - to_chat(user, "[src] is attempting to interface with [D]...") - if(do_after(user, hack_speed, target = D)) - . = ..() + to_chat(user, "[src] is attempting to interface with [target]...") + if(do_after(user, hack_speed, target = target)) + busy = FALSE + icon_state = "hacktool" + return TRUE busy = FALSE icon_state = "hacktool" @@ -224,41 +245,53 @@ var/last_airlock_uid additional_access = list(ACCESS_MEDICAL, ACCESS_RESEARCH, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_MINING, ACCESS_KITCHEN, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE) +/obj/item/door_remote/janikeyring/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ACTIVATE_SELF, TYPE_PROC_REF(/datum, signal_cancel_activate_self)) + /obj/item/door_remote/janikeyring/examine(mob/user) . = ..() . += "This keyring has access to Medbay, Science, Engineering, Cargo, the Bar and the Kitchen!" -/obj/item/door_remote/janikeyring/attack_self__legacy__attackchain(mob/user) - if(cooldown > world.time) +/obj/item/door_remote/janikeyring/activate_self(mob/user) + if(..() || cooldown > world.time) return + to_chat(user, "You shake [src]!") playsound(src, 'sound/items/keyring_shake.ogg', 50) cooldown = world.time + JANGLE_COOLDOWN -/obj/item/door_remote/janikeyring/afterattack__legacy__attackchain(obj/machinery/door/D, mob/user, proximity) - if(!proximity) - return - if(!istype(D, /obj/machinery/door/airlock) && !istype(D, /obj/machinery/door/window)) +/obj/item/door_remote/janikeyring/interact_with_atom(obj/machinery/door/target, mob/living/user, list/modifiers) + if(unlock(target, user)) + return ..() + +/obj/item/door_remote/janikeyring/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) // THOSE AINT MAGICAL REMOTE KEYS + return NONE + + +/obj/item/door_remote/janikeyring/proc/unlock(obj/machinery/door/target, mob/living/user) + if(!istype(target, /obj/machinery/door/airlock) && !istype(target, /obj/machinery/door/window)) return if(busy) - to_chat(user, "You are already using [src] on the [D]'s access panel!") + to_chat(user, "You are already using [src] on the [target]'s access panel!") return busy = TRUE var/mob/living/carbon/human/H = user - if(H.mind.assigned_role == "Janitor" && last_airlock_uid == D.UID()) - to_chat(user, "You recognize [D] and look for the key you used...") + if(H.mind.assigned_role == "Janitor" && last_airlock_uid == target.UID()) + to_chat(user, "You recognize [target] and look for the key you used...") hack_speed = 5 SECONDS else - to_chat(user, "You fiddle with [src], trying different keys to open [D]...") + to_chat(user, "You fiddle with [src], trying different keys to open [target]...") if(H.mind.assigned_role != "Janitor") hack_speed = rand(30, 60) SECONDS else hack_speed = rand(5, 20) SECONDS playsound(src, 'sound/items/keyring_unlock.ogg', 50) - if(do_after(user, hack_speed, target = D, progress = 0)) - if(D.check_access(ID)) - last_airlock_uid = D.UID() - . = ..() + if(do_after(user, hack_speed, target = target, progress = 0)) + if(target.check_access(ID)) + last_airlock_uid = target.UID() + busy = FALSE + return TRUE busy = FALSE /obj/item/door_remote/janikeyring/access_airlock(obj/machinery/door/airlock/D, mob/user) @@ -266,10 +299,6 @@ to_chat(user, "[src] won't fit in the [D] airlock's access panel, there's slime everywhere!") return - if(D.is_special) - to_chat(user, "[src] cannot fit in the [D] airlock's access panel!") - return - if(!D.arePowerSystemsOn()) to_chat(user, "The [D] airlock has no power!") return diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index e95e8c945677..36ab5e3bd7a0 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -40,8 +40,8 @@ user.visible_message("[user] is jamming the [name] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS|OXYLOSS -/obj/item/toy/crayon/New() - ..() +/obj/item/toy/crayon/Initialize(mapload) + . = ..() drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1, 8)]") /obj/item/toy/crayon/activate_self(mob/user) @@ -207,7 +207,8 @@ colour = COLOR_PURPLE dye_color = DYE_PURPLE -/obj/item/toy/crayon/random/New() +/obj/item/toy/crayon/random/Initialize(mapload) + . = ..() icon_state = pick("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple") switch(icon_state) if("crayonred") @@ -234,7 +235,6 @@ name = "purple crayon" colour = COLOR_PURPLE dye_color = DYE_PURPLE - ..() /obj/item/toy/crayon/black name = "black crayon" @@ -315,8 +315,9 @@ dye_color = null // not technically a crayon, so we're not gonna have it dye stuff in the laundry machine consumable = FALSE // To stop you from eating spraycans. It's TOO SILLY! -/obj/item/toy/crayon/spraycan/New() - ..() +/obj/item/toy/crayon/spraycan/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ACTIVATE_SELF, TYPE_PROC_REF(/datum, signal_cancel_activate_self)) update_icon() /obj/item/toy/crayon/spraycan/activate_self(mob/user) @@ -329,7 +330,7 @@ capped = !capped update_icon() if("Change Drawing") - ..() + update_window(user) if("Change Color") colour = tgui_input_color(user,"Please select a paint color.","Spray Can Color") if(isnull(colour)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 5a4e07005b62..d01713744ba1 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -9,6 +9,7 @@ slot_flags = ITEM_SLOT_BELT materials = list(MAT_METAL = 200, MAT_GLASS = 100) actions_types = list(/datum/action/item_action/toggle_light) + light_color = "#ffffd0" var/on = FALSE var/brightness_on = 4 //luminosity when on var/togglesound = 'sound/weapons/empty.ogg' @@ -127,6 +128,7 @@ flags = CONDUCT materials = list() on = TRUE + light_color = "#fff4bb" /obj/item/flashlight/lamp/examine(mob/user) . = ..() @@ -137,6 +139,7 @@ desc = "A classic green-shaded desk lamp." icon_state = "lampgreen" item_state = "lampgreen" + light_color = "#AAFFAA" /obj/item/flashlight/lamp/green/off on = FALSE @@ -153,6 +156,7 @@ desc = "Only a clown would think to make a ghetto banana-shaped lamp. Even has a goofy pullstring." icon_state = "bananalamp" item_state = "bananalamp" + light_color = "#f7ff57" // FLARES diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index af74b6cb5ebe..b446bd2b7121 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -519,8 +519,3 @@ keyslot1 = new /obj/item/encryptionkey/syndicate syndiekey = keyslot1 recalculateChannels() - -/obj/item/radio/headset/proc/make_epsilon() // Turns AI's and cyborgs radio to Epsilon radio! - qdel(keyslot1) - keyslot1 = new /obj/item/encryptionkey/centcom - recalculateChannels() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 395cca3a9642..8a81b1fe56ff 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -606,10 +606,13 @@ SLIME SCANNER var/cooldown = FALSE var/cooldown_time = 250 var/accuracy // 0 is the best accuracy. + /// FALSE: Sum gas mixes then present. TRUE: Present each mix individually + var/show_detailed = FALSE /obj/item/analyzer/examine(mob/user) . = ..() . += "Alt-click [src] to activate the barometer function." + . += "Alt-Shift-click [src] to toggle detailed reporting on or off." /obj/item/analyzer/attack_self__legacy__attackchain(mob/user as mob) @@ -620,9 +623,13 @@ SLIME SCANNER if(!isturf(location)) return - atmos_scan(user, location) + atmos_scan(user = user, target = location, detailed = show_detailed) add_fingerprint(user) +/obj/item/analyzer/AltShiftClick(mob/user) + show_detailed = !show_detailed + to_chat(user, "You toggle detailed reporting [show_detailed ? "on" : "off"]") + /obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens ..() @@ -691,25 +698,30 @@ SLIME SCANNER if(!can_see(user, target, 1)) return if(target.return_analyzable_air()) - atmos_scan(user, target) + atmos_scan(user, target, detailed = show_detailed) else - atmos_scan(user, get_turf(target)) + atmos_scan(user, get_turf(target), detailed = show_detailed) /** * Outputs a message to the user describing the target's gasmixes. * Used in chat-based gas scans. */ -/proc/atmos_scan(mob/user, atom/target, silent = FALSE, print = TRUE, milla_turf_details = FALSE) - var/datum/gas_mixture/air +/proc/atmos_scan(mob/user, atom/target, silent = FALSE, print = TRUE, milla_turf_details = FALSE, detailed = FALSE) + var/datum/gas_mixture/gasmix + var/list/airs var/list/milla = null if(milla_turf_details && istype(target, /turf)) milla = new/list(MILLA_TILE_SIZE) get_tile_atmos(target, milla) - air = new() - air.copy_from_milla(milla) + gasmix = new() + gasmix.copy_from_milla(milla) + airs += gasmix else - air = target.return_analyzable_air() - if(!air) + gasmix = target.return_analyzable_air() + if(!istype(gasmix, /list)) + gasmix = list(gasmix) + airs += gasmix + if(!gasmix) return FALSE var/list/message = list() @@ -719,35 +731,87 @@ SLIME SCANNER if(!print) return TRUE - - var/total_moles = air.total_moles() - var/pressure = air.return_pressure() - var/volume = air.return_volume() //could just do mixture.volume... but safety, I guess? - var/heat_capacity = air.heat_capacity() - var/thermal_energy = air.thermal_energy() - - if(total_moles) - message += "Total: [round(total_moles, 0.01)] moles" - if(air.oxygen() && (milla_turf_details || air.oxygen() / total_moles > 0.01)) - message += " Oxygen: [round(air.oxygen(), 0.01)] moles ([round(air.oxygen() / total_moles * 100, 0.01)] %)" - if(air.nitrogen() && (milla_turf_details || air.nitrogen() / total_moles > 0.01)) - message += " Nitrogen: [round(air.nitrogen(), 0.01)] moles ([round(air.nitrogen() / total_moles * 100, 0.01)] %)" - if(air.carbon_dioxide() && (milla_turf_details || air.carbon_dioxide() / total_moles > 0.01)) - message += " Carbon Dioxide: [round(air.carbon_dioxide(), 0.01)] moles ([round(air.carbon_dioxide() / total_moles * 100, 0.01)] %)" - if(air.toxins() && (milla_turf_details || air.toxins() / total_moles > 0.01)) - message += " Plasma: [round(air.toxins(), 0.01)] moles ([round(air.toxins() / total_moles * 100, 0.01)] %)" - if(air.sleeping_agent() && (milla_turf_details || air.sleeping_agent() / total_moles > 0.01)) - message += " Nitrous Oxide: [round(air.sleeping_agent(), 0.01)] moles ([round(air.sleeping_agent() / total_moles * 100, 0.01)] %)" - if(air.agent_b() && (milla_turf_details || air.agent_b() / total_moles > 0.01)) - message += " Agent B: [round(air.agent_b(), 0.01)] moles ([round(air.agent_b() / total_moles * 100, 0.01)] %)" - message += "Temperature: [round(air.temperature()-T0C)] °C ([round(air.temperature())] K)" - message += "Volume: [round(volume)] Liters" - message += "Pressure: [round(pressure, 0.1)] kPa" - message += "Heat Capacity: [DisplayJoules(heat_capacity)] / K" - message += "Thermal Energy: [DisplayJoules(thermal_energy)]" - else - message += "[target] is empty!" - message += "Volume: [round(volume)] Liters" // don't want to change the order volume appears in, suck it + var/total_moles = 0 + var/pressure = 0 + var/volume = 0 + var/heat_capacity = 0 + var/thermal_energy = 0 + var/oxygen = 0 + var/nitrogen = 0 + var/toxins + var/carbon_dioxide = 0 + var/sleeping_agent = 0 + var/agent_b = 0 + + if(detailed)// Present all mixtures one by one + for(var/datum/gas_mixture/air as anything in airs) + total_moles = air.total_moles() + pressure = air.return_pressure() + volume = air.return_volume() //could just do mixture.volume... but safety, I guess? + heat_capacity = air.heat_capacity() + thermal_energy = air.thermal_energy() + + if(total_moles) + message += "Total: [round(total_moles, 0.01)] moles" + if(air.oxygen() && (milla_turf_details || air.oxygen() / total_moles > 0.01)) + message += " Oxygen: [round(air.oxygen(), 0.01)] moles ([round(air.oxygen() / total_moles * 100, 0.01)] %)" + if(air.nitrogen() && (milla_turf_details || air.nitrogen() / total_moles > 0.01)) + message += " Nitrogen: [round(air.nitrogen(), 0.01)] moles ([round(air.nitrogen() / total_moles * 100, 0.01)] %)" + if(air.carbon_dioxide() && (milla_turf_details || air.carbon_dioxide() / total_moles > 0.01)) + message += " Carbon Dioxide: [round(air.carbon_dioxide(), 0.01)] moles ([round(air.carbon_dioxide() / total_moles * 100, 0.01)] %)" + if(air.toxins() && (milla_turf_details || air.toxins() / total_moles > 0.01)) + message += " Plasma: [round(air.toxins(), 0.01)] moles ([round(air.toxins() / total_moles * 100, 0.01)] %)" + if(air.sleeping_agent() && (milla_turf_details || air.sleeping_agent() / total_moles > 0.01)) + message += " Nitrous Oxide: [round(air.sleeping_agent(), 0.01)] moles ([round(air.sleeping_agent() / total_moles * 100, 0.01)] %)" + if(air.agent_b() && (milla_turf_details || air.agent_b() / total_moles > 0.01)) + message += " Agent B: [round(air.agent_b(), 0.01)] moles ([round(air.agent_b() / total_moles * 100, 0.01)] %)" + message += "Temperature: [round(air.temperature()-T0C)] °C ([round(air.temperature())] K)" + message += "Volume: [round(volume)] Liters" + message += "Pressure: [round(pressure, 0.1)] kPa" + message += "Heat Capacity: [DisplayJoules(heat_capacity)] / K" + message += "Thermal Energy: [DisplayJoules(thermal_energy)]" + else + message += "[target] is empty!" + message += "Volume: [round(volume)] Liters" // don't want to change the order volume appears in, suck it + + else// Sum mixtures then present + for(var/datum/gas_mixture/air as anything in airs) + total_moles += air.total_moles() + volume += air.return_volume() + heat_capacity += air.heat_capacity() + thermal_energy += air.thermal_energy() + oxygen += air.oxygen() + nitrogen += air.nitrogen() + toxins += air.toxins() + carbon_dioxide += air.carbon_dioxide() + sleeping_agent += air.sleeping_agent() + agent_b += air.agent_b() + + var/temperature = heat_capacity ? thermal_energy / heat_capacity : 0 + pressure = volume ? total_moles * R_IDEAL_GAS_EQUATION * temperature / volume : 0 + + if(total_moles) + message += "Total: [round(total_moles, 0.01)] moles" + if(oxygen && (milla_turf_details || oxygen / total_moles > 0.01)) + message += " Oxygen: [round(oxygen, 0.01)] moles ([round(oxygen / total_moles * 100, 0.01)] %)" + if(nitrogen && (milla_turf_details || nitrogen / total_moles > 0.01)) + message += " Nitrogen: [round(nitrogen, 0.01)] moles ([round(nitrogen / total_moles * 100, 0.01)] %)" + if(carbon_dioxide && (milla_turf_details || carbon_dioxide / total_moles > 0.01)) + message += " Carbon Dioxide: [round(carbon_dioxide, 0.01)] moles ([round(carbon_dioxide / total_moles * 100, 0.01)] %)" + if(toxins && (milla_turf_details || toxins / total_moles > 0.01)) + message += " Plasma: [round(toxins, 0.01)] moles ([round(toxins / total_moles * 100, 0.01)] %)" + if(sleeping_agent && (milla_turf_details || sleeping_agent / total_moles > 0.01)) + message += " Nitrous Oxide: [round(sleeping_agent, 0.01)] moles ([round(sleeping_agent / total_moles * 100, 0.01)] %)" + if(agent_b && (milla_turf_details || agent_b / total_moles > 0.01)) + message += " Agent B: [round(agent_b, 0.01)] moles ([round(agent_b / total_moles * 100, 0.01)] %)" + message += "Temperature: [round(temperature-T0C)] °C ([round(temperature)] K)" + message += "Volume: [round(volume)] Liters" + message += "Pressure: [round(pressure, 0.1)] kPa" + message += "Heat Capacity: [DisplayJoules(heat_capacity)] / K" + message += "Thermal Energy: [DisplayJoules(thermal_energy)]" + else + message += "[target] is empty!" + message += "Volume: [round(volume)] Liters" // don't want to change the order volume appears in, suck it if(milla) // Values from milla/src/lib.rs, +1 due to array indexing difference. diff --git a/code/game/objects/items/granters/action_granters/summon_cheese.dm b/code/game/objects/items/granters/action_granters/summon_cheese.dm index 29209f6479cb..e79fbb403a16 100644 --- a/code/game/objects/items/granters/action_granters/summon_cheese.dm +++ b/code/game/objects/items/granters/action_granters/summon_cheese.dm @@ -22,7 +22,7 @@ /obj/item/book/granter/spell/summon_cheese/recoil(mob/living/user) to_chat(user, "[src] turns into a wedge of cheese!") - var/obj/item/food/cheesewedge/presliced/book_cheese = new + var/obj/item/food/sliced/cheesewedge/book_cheese = new user.drop_item() user.put_in_hands(book_cheese) qdel(src) @@ -35,7 +35,7 @@ overlay = null action_icon_state = "cheese_wedge" action_background_icon_state = "bg_spell" - summon_type = list(/obj/item/food/cheesewedge/presliced) + summon_type = list(/obj/item/food/sliced/cheesewedge) summon_amt = 9 aoe_range = 1 summon_ignore_prev_spawn_points = TRUE diff --git a/code/game/objects/items/robot/cyborg_gripper.dm b/code/game/objects/items/robot/cyborg_gripper.dm index cac644d7c839..6bfb28825bca 100644 --- a/code/game/objects/items/robot/cyborg_gripper.dm +++ b/code/game/objects/items/robot/cyborg_gripper.dm @@ -16,6 +16,7 @@ icon_state = "gripper" actions_types = list(/datum/action/item_action/drop_gripped_item) flags = ABSTRACT + new_attack_chain = TRUE /// Set to TRUE to removal of cells/lights from machine objects containing them. var/engineering_machine_interaction = FALSE /// Defines what items the gripper can carry. @@ -58,39 +59,46 @@ gripped_item = null return TRUE -/obj/item/gripper/attack_self__legacy__attackchain(mob/user) +/obj/item/gripper/activate_self(mob/user) + . = ..() if(!gripped_item) to_chat(user, "[src] is empty.") - return + return ITEM_INTERACT_COMPLETE + if(gripped_item.new_attack_chain) gripped_item.activate_self(user) else gripped_item.attack_self__legacy__attackchain(user) + return ITEM_INTERACT_COMPLETE // This is required to ensure that the forceMove checks on some objects don't rip the gripper out of the borg's inventory and toss it on the floor. That would hurt, a lot! /obj/item/gripper/forceMove(atom/destination) return - -/obj/item/gripper/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity, params) - // Target is invalid or we are not adjacent. - if(!target || !proximity) - return + +/obj/item/gripper/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!target) + return ITEM_INTERACT_COMPLETE // Does the gripper already have an item? if(gripped_item) // Pass the attack on to the target. This might delete/relocate gripped_item. If the attackby doesn't resolve or delete the target or gripped_item, afterattack. - if(!target.attackby__legacy__attackchain(gripped_item, user, params)) - gripped_item?.afterattack__legacy__attackchain(target, user, 1, params) + // We also need to check if it's the old or new attack chain until the migration is complete. + if(new_attack_chain) + if(!target.item_interaction(user, gripped_item, modifiers)) + gripped_item.melee_attack_chain(user, target, modifiers) + else + if(!target.attackby__legacy__attackchain(gripped_item, user, modifiers)) + gripped_item?.afterattack__legacy__attackchain(target, user, 1, modifiers) // Check to see if there is still an item in the gripper (stackable items trigger this). if(!gripped_item && length(contents)) gripped_item = contents[1] - return + return ITEM_INTERACT_COMPLETE // If the gripper thinks it has something but it actually doesn't, we fix this. if(gripped_item && !length(contents)) gripped_item = null - return + return ITEM_INTERACT_COMPLETE - return TRUE + return ITEM_INTERACT_COMPLETE // Is the gripper interacting with an item? if(isitem(target)) @@ -100,17 +108,14 @@ to_chat(user, "You collect [I].") I.forceMove(src) gripped_item = I - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You hold your gripper over [target], but no matter how hard you try, you cannot make yourself grab it.") - return - - // Attack code will handle this. - if(ismob(target)) - return + return ITEM_INTERACT_COMPLETE // Everything past this point requires being able to engineer. if(!engineering_machine_interaction) + // Allow attack chain to continue into pre_attack() return // Removing cells from APCs. @@ -128,7 +133,7 @@ "[user] removes the cell from [A]!", "You remove the cell from [A]." ) - return + return ITEM_INTERACT_COMPLETE // Removing cells from cell chargers. if(istype(target, /obj/machinery/cell_charger)) @@ -142,7 +147,7 @@ "[user] removes the cell from [cell_charger].", "You remove the cell from [cell_charger]." ) - return + return ITEM_INTERACT_COMPLETE // Removing lights from fixtures. if(istype(target, /obj/machinery/light)) @@ -154,19 +159,28 @@ "[user] removes [L] from [light].", "You remove [L] from [light]." ) + return ITEM_INTERACT_COMPLETE /obj/item/gripper/emag_act(mob/user) emagged = !emagged ..() return TRUE -/obj/item/gripper/attack__legacy__attackchain(mob/living/M, mob/living/silicon/robot/user, params) +/obj/item/gripper/pre_attack(atom/A, mob/living/user, params) if(gripped_item) - return - + gripped_item.attack(A, user) + return TRUE + + if(!ismob(A)) + return ..() + + // This is required to avoid hypersonic interaction speed. + user.changeNext_move(CLICK_CD_MELEE) + . = TRUE + var/mob/living/target = A // If a human target is horizonal, try to help them up. Unless you're trying to kill them. - if(ishuman(M) && user.a_intent == INTENT_HELP && can_help_up) - var/mob/living/carbon/human/pickup_target = M + if(ishuman(target) && user.a_intent == INTENT_HELP && can_help_up) + var/mob/living/carbon/human/pickup_target = target if(IS_HORIZONTAL(pickup_target)) // Same restorative effects as when a human tries to help someone up. pickup_target.AdjustSleeping(-10 SECONDS) @@ -185,7 +199,7 @@ return if(user.a_intent == INTENT_HELP) - if(M == user) + if(target == user) user.visible_message( "[user] gives [user.p_themselves()] a hug to make [user.p_themselves()] feel better.", "You give yourself a hug to make yourself feel better." @@ -194,35 +208,36 @@ return // Checks if holder_type exists to prevent picking up animals like mice, because we're about to use the hands that borgs secretly have. - if(isanimal(M) && !M.holder_type) + if(isanimal(target) && !target.holder_type) var/list/modifiers = params2list(params) // This enables borgs to get the floating heart icon and mob emote from simple_animals that have petbonus == TRUE. - M.attack_hand(user, modifiers) + target.attack_hand(user, modifiers) + return if(user.zone_selected == BODY_ZONE_HEAD) user.visible_message( - "[user] playfully boops [M] on the head.", - "You playfully boop [M] on the head." + "[user] playfully boops [target] on the head.", + "You playfully boop [target] on the head." ) - user.do_attack_animation(M, ATTACK_EFFECT_BOOP) + user.do_attack_animation(target, ATTACK_EFFECT_BOOP) playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE, -1) return - if(ishuman(M)) + if(ishuman(target)) user.visible_message( - "[user] hugs [M] to make [M.p_them()] feel better.", - "You hug [M] to make [M.p_them()] feel better." + "[user] hugs [target] to make [target.p_them()] feel better.", + "You hug [target] to make [target.p_them()] feel better." ) else user.visible_message( - "[user] pets [M]!", - "You pet [M]!" + "[user] pets [target]!", + "You pet [target]!" ) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) return if(user.a_intent == INTENT_HARM && !emagged) - if(M == user) + if(target == user) user.visible_message( "[user] gives [user.p_themselves()] a firm bear-hug to make [user.p_themselves()] feel better.", "You give yourself a firm bear-hug to make yourself feel better." @@ -230,17 +245,17 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) return - if(!ishuman(M) || user.zone_selected == BODY_ZONE_HEAD) + if(!ishuman(target) || user.zone_selected == BODY_ZONE_HEAD) user.visible_message( - "[user] bops [M] on the head!", - "You bop [M] on the head!" + "[user] bops [target] on the head!", + "You bop [target] on the head!" ) - user.do_attack_animation(M, ATTACK_EFFECT_PUNCH) + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE, -1) else user.visible_message( - "[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", - "You hug [M] firmly to make [M.p_them()] feel better! [M] looks uncomfortable..." + "[user] hugs [target] in a firm bear-hug! [target] looks uncomfortable...", + "You hug [target] firmly to make [target.p_them()] feel better! [target] looks uncomfortable..." ) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) return @@ -249,36 +264,36 @@ if(!emagged) return - if(M == user) + if(target == user) user.visible_message( "[user] punches [user.p_themselves()] in the face!.", "You punch yourself in the face!" ) - user.do_attack_animation(M, ATTACK_EFFECT_PUNCH) + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE, -1) user.adjustBruteLoss(15) return - if(ishuman(M)) + if(ishuman(target)) // Try to punch them in the face... Unless it fell off or something. - if(user.zone_selected == BODY_ZONE_HEAD && M.get_organ("head")) + if(user.zone_selected == BODY_ZONE_HEAD && target.get_organ("head")) user.visible_message( - "[user] punches [M] squarely in the face!", - "You punch [M] in the face!" + "[user] punches [target] squarely in the face!", + "You punch [target] in the face!" ) - var/obj/item/organ/external/head/their_face = M.get_organ("head") - user.do_attack_animation(M, ATTACK_EFFECT_PUNCH) + var/obj/item/organ/external/head/their_face = target.get_organ("head") + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE, -1) their_face.receive_damage(15) - M.UpdateDamageIcon() + target.UpdateDamageIcon() return user.visible_message( - "[user] crushes [M] in [user.p_their()] grip!", - "You crush [M] in your grip!" + "[user] crushes [target] in [user.p_their()] grip!", + "You crush [target] in your grip!" ) playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE, -1) - M.adjustBruteLoss(15) + target.adjustBruteLoss(15) // MARK: Gripper Types diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 538183524332..f334ed4641d3 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -11,7 +11,7 @@ Keeping it in for adminabuse but the malf one is /obj/item/melee/baton/borg_stun */ /obj/item/borg/stun name = "electrically-charged arm" - icon_state = "elecarm" + icon_state = "elecarm_active" var/charge_cost = 30 /obj/item/borg/stun/attack__legacy__attackchain(mob/living/M, mob/living/silicon/robot/user) diff --git a/code/game/objects/items/salvage.dm b/code/game/objects/items/salvage.dm index 9afe3d8885a6..05dd4d4175f9 100644 --- a/code/game/objects/items/salvage.dm +++ b/code/game/objects/items/salvage.dm @@ -79,7 +79,7 @@ /obj/item/salvage/loot/pirate name = "stolen jewellery" - desc = "A collection of stolen jewellery, fashioned from pilfered bluespace crystals and gems. Rumour has it, local pirates have been known to use these accessories to avoid capture." + desc = "A collection of stolen jewellery and gemstones. Gold, silver, sapphire, amethyst, and more, this bounty will surely fetch a good price on the market." icon_state = "pirate_treasure" hitsound = 'sound/items/handling/taperecorder_drop.ogg' pickup_sound = 'sound/items/handling/taperecorder_pickup.ogg' diff --git a/code/game/objects/items/scratch_card.dm b/code/game/objects/items/scratch_card.dm index f498a080acae..0953027eddac 100644 --- a/code/game/objects/items/scratch_card.dm +++ b/code/game/objects/items/scratch_card.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/economy.dmi' icon_state = "scard" w_class = WEIGHT_CLASS_TINY + new_attack_chain = TRUE /// Has this been scratched yet? var/scratched = FALSE /// The prob chance for it to be the winner card @@ -11,11 +12,12 @@ /// Is this the winner card? var/winner = FALSE -/obj/item/scratch/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/item/scratch/item_interaction(mob/living/user, obj/item/used, list/modifiers) . = ..() if(scratched) return - if(!(istype(I, /obj/item/card) || istype(I, /obj/item/coin))) // We scratch with cards or coins! + + if(!(istype(used, /obj/item/card) || istype(used, /obj/item/coin))) // We scratch with cards or coins! return if(prob(winning_chance)) @@ -28,16 +30,18 @@ playsound(user, 'sound/items/scratching.ogg', 25, TRUE) scratched = TRUE update_icon(UPDATE_ICON_STATE) + return ITEM_INTERACT_COMPLETE -/obj/item/scratch/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) - if(winner && istype(O, /obj/machinery/economy/atm)) - playsound(user, 'sound/machines/ping.ogg', 50, TRUE) - O.atom_say("Congratulations for winning the lottery!") - var/obj/item/reward = new /obj/item/stack/spacecash/c1000 - qdel(src) - user.put_in_hands(reward) - return - ..() +/obj/item/scratch/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!winner || !istype(target, /obj/machinery/economy/atm)) + return ..() + + playsound(user, 'sound/machines/ping.ogg', 50, TRUE) + target.atom_say("Congratulations for winning the lottery!") + var/obj/item/reward = new /obj/item/stack/spacecash/c1000 + qdel(src) + user.put_in_hands(reward) + return ITEM_INTERACT_COMPLETE /obj/item/storage/box/scratch_cards name = "scratch cards box" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index d3b9c46cfd3e..00b4a870bfed 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -84,6 +84,7 @@ GLOBAL_LIST_INIT(metal_recipes, list( new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("storage shelf", /obj/structure/shelf, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("metal bookcase", /obj/structure/bookcase/metal, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("gun rack", /obj/structure/gunrack, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), null, new /datum/stack_recipe_list("airlock assemblies", list( @@ -186,6 +187,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list( new /datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 3, time = 5 SECONDS), new /datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 5 SECONDS, one_per_turf = TRUE), + new /datum/stack_recipe("military bookcase", /obj/structure/bookcase/military, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("Mass Driver frame", /obj/machinery/mass_driver_frame, 3, time = 5 SECONDS, one_per_turf = TRUE), new /datum/stack_recipe("hardened wheelchair", /obj/structure/chair/wheelchair/plasteel, 15, time = 6 SECONDS, one_per_turf = TRUE, on_floor = TRUE), null, diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 86ad64db8266..b21530f93181 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -23,9 +23,12 @@ tool_behaviour = TOOL_SCREWDRIVER var/random_color = TRUE //if the screwdriver uses random coloring + new_attack_chain = TRUE + /obj/item/screwdriver/Initialize(mapload) . = ..() AddComponent(/datum/component/surgery_initiator/robo) + RegisterSignal(src, COMSIG_ATTACK, PROC_REF(on_attack)) /obj/item/screwdriver/nuke name = "screwdriver" @@ -50,14 +53,15 @@ if(prob(75)) src.pixel_y = rand(0, 16) -/obj/item/screwdriver/attack__legacy__attackchain(mob/living/carbon/M, mob/living/carbon/user) - if(!istype(M) || user.a_intent == INTENT_HELP) - return ..() +/obj/item/screwdriver/proc/on_attack(datum/source, mob/living/carbon/target, mob/living/user) + if(!istype(target) || user.a_intent == INTENT_HELP) + return if(user.zone_selected != "eyes" && user.zone_selected != "head") - return ..() + return if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) - M = user - return eyestab(M,user) + target = user + eyestab(target, user) + return COMPONENT_SKIP_ATTACK /obj/item/screwdriver/brass name = "brass screwdriver" @@ -118,7 +122,10 @@ user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/screwdriver/power/attack_self__legacy__attackchain(mob/user) +/obj/item/screwdriver/power/activate_self(mob/user) + if(..()) + return + playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1) var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power to_chat(user, "You attach the bolt driver bit to [src].") diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 040c0e1d3b1c..e741c4540fa5 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -19,6 +19,8 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 50, ACID = 30) tool_behaviour = TOOL_WRENCH + new_attack_chain = TRUE + /obj/item/wrench/suicide_act(mob/user) user.visible_message("[user] is unsecuring [user.p_their()] head with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -70,7 +72,10 @@ toolspeed = 0.25 w_class = WEIGHT_CLASS_NORMAL -/obj/item/wrench/power/attack_self__legacy__attackchain(mob/user) +/obj/item/wrench/power/activate_self(mob/user) + if(..()) + return + playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1) var/obj/item/wirecutters/power/s_drill = new /obj/item/screwdriver/power to_chat(user, "You attach the screwdriver bit to [src].") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f9b0a46abc22..c39f0c5d412d 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -830,7 +830,7 @@ /obj/item/toy/plushie/ipcplushie/attack_by(obj/item/attacking, mob/user, params) if(..()) return FINISH_ATTACK - if(istype(attacking, /obj/item/food/breadslice)) + if(istype(attacking, /obj/item/food/sliced/bread)) new /obj/item/food/toast(get_turf(loc)) to_chat(user, "You insert bread into the toaster.") playsound(loc, 'sound/machines/ding.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm b/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm index b0b32d1da98e..4b1b34bc813f 100644 --- a/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm +++ b/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm @@ -142,7 +142,7 @@ name = "Syndicate S3 \"Stealth\" Bio-chip" life = "Unknown. No collected sample has been active long enough to determine lifespan." notes = "Manually activated by the user." - function = "Allows the user to summon a box from a bluespace pocket located inside the implant. The exterior of this box is lined with experimental cloaking panels which render the box invisible to the naked eye." + function = "A biochip housing a highly specialized cloaking nanoswarm. When activated, the nanoswarm will assemble into a box-like shape around the user and render them invisible. Solid impacts will temporarily disrupt the cloaking mechanism." /datum/implant_fluff/shock name = "Syndicate ARC-7 \"Power\" Bio-chip" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 0ceb7d17a35e..dfa081f7d09f 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -59,7 +59,7 @@ /obj/item/card/emag/magic_key/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!isairlock(target)) - return ITEM_INTERACT_COMPLETE + return NONE var/obj/machinery/door/D = target D.locked = FALSE D.update_icon() @@ -165,6 +165,27 @@ if(can_id_flash) flash_card(user) +/obj/item/card/id/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(!isliving(target)) + return NONE + return shared_interact(target, user) + +/obj/item/card/id/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(isliving(target) && get_dist(target, user) <= 2) + return shared_interact(target, user) + return NONE + +/obj/item/card/id/proc/shared_interact(mob/living/victim, mob/living/user) + if(victim.has_status_effect(STATUS_EFFECT_OFFERING_EFTPOS)) + var/obj/item/eftpos/eftpos = victim.is_holding_item_of_type(/obj/item/eftpos) + if(!eftpos || !eftpos.can_offer) + to_chat(user, "They don't seem to have it in hand anymore.") + return ITEM_INTERACT_COMPLETE + victim.remove_status_effect(STATUS_EFFECT_OFFERING_EFTPOS) + eftpos.scan_card(src, user) + return ITEM_INTERACT_COMPLETE + return NONE + /obj/item/card/id/proc/UpdateName() name = "[registered_name]'s ID Card ([assignment])" diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index d2fc883566f7..ec4025086cca 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -290,6 +290,10 @@ LIGHTERS ARE IN LIGHTERS.DM var/mob/living/M = loc to_chat(M, "Your [name] goes out.") M.drop_item_to_ground(src, force = TRUE) //Force the un-equip so the overlays update + butt.slot_flags |= ITEM_SLOT_MASK // Temporarily allow it to go on masks + M.equip_to_slot_if_possible(butt, ITEM_SLOT_MASK) + butt.slot_flags &= ~ITEM_SLOT_MASK + STOP_PROCESSING(SSobj, src) qdel(src) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 536bb735ccde..6bbda1895167 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -197,6 +197,13 @@ qdel(I) if(5) //Monkeying + if(ismachineperson(user)) + playsound(get_turf(user), 'sound/machines/ding.ogg', 100, 1) + var/obj/fresh_toast = new /obj/item/food/toast(get_turf(user)) + fresh_toast.desc += " It came out of [user]!" + to_chat(user, "Your internal structure is getting really toasty!") + user.gib() + return T.visible_message("[user] transforms into a monkey!") user.monkeyize() if(6) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index e4c09eff7eb4..6d222636c8e4 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -464,26 +464,6 @@ /obj/item/dnainjector/anticlumsy/GetInitBlock() return GLOB.clumsyblock -/obj/item/dnainjector/antitour - name = "DNA-Injector (Anti-Tour.)" - desc = "Will cure tourettes." - datatype = DNA2_BUF_SE - value = 0x001 - forcedmutation = TRUE - -/obj/item/dnainjector/antitour/GetInitBlock() - return GLOB.twitchblock - -/obj/item/dnainjector/tourmut - name = "DNA-Injector (Tour.)" - desc = "Gives you a nasty case off tourettes." - datatype = DNA2_BUF_SE - value = 0xFFF - forcedmutation = TRUE - -/obj/item/dnainjector/tourmut/GetInitBlock() - return GLOB.twitchblock - /obj/item/dnainjector/stuttmut name = "DNA-Injector (Stutt.)" desc = "Makes you s-s-stuttterrr." diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index b1f9f9557cf9..c12aa4fb62a7 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -231,11 +231,13 @@ to_chat(user, "You [lit ? "extinguish" : "ignite"] [src]!") lit = !lit if(lit) + damtype = BURN START_PROCESSING(SSobj, src) if(!warned_admins) message_admins("[ADMIN_LOOKUPFLW(user)] has lit a flamethrower.") warned_admins = TRUE else + damtype = initial(damtype) STOP_PROCESSING(SSobj,src) update_icon() diff --git a/code/game/objects/items/weapons/grenades/clusterbuster.dm b/code/game/objects/items/weapons/grenades/clusterbuster.dm index ce1e42e9181f..2a4a30a6b6c1 100644 --- a/code/game/objects/items/weapons/grenades/clusterbuster.dm +++ b/code/game/objects/items/weapons/grenades/clusterbuster.dm @@ -47,7 +47,7 @@ icon_state = "clusterbang_segment_active" payload = payload_type active = TRUE - walk_away(src, loc, rand(1,4)) + GLOB.move_manager.move_away(src, loc, rand(1,4)) spawn(rand(15,60)) prime() @@ -69,7 +69,7 @@ var/obj/item/grenade/P = new type(loc) if(istype(P, /obj/item/grenade)) P.active = TRUE - walk_away(P,loc,rand(1,4)) + GLOB.move_manager.move_away(P,loc,rand(1,4)) spawn(rand(15,60)) if(!QDELETED(P)) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 27f0f27aec24..137c51bb545f 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -107,12 +107,11 @@ /obj/item/grenade/attack_hand() ///We need to clear the walk_to on grabbing a moving grenade to have it not leap straight out of your hand - walk(src, null, null) + GLOB.move_manager.stop_looping(src) ..() /obj/item/grenade/Destroy() - ///We need to clear the walk_to on destroy to allow a grenade which uses walk_to or related to properly GC - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) return ..() /obj/item/grenade/cmag_act(mob/user) diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 96f06a1766bd..9900f76473ee 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -78,7 +78,7 @@ hitsound = "swing_hit" force = 0 attack_verb = null //human_defense.dm takes care of it - + damtype = initial(damtype) update_icon() if(user) show_off_message(user) diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index 359802da3d5c..1970b9453ee4 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -47,19 +47,31 @@ if(!istype(M)) return ..() - if(!proximity_flag && !works_from_distance) - return - - if(get_dist(src, M) <= (user.client.maxview() + 2)) - if(M.component_parts) - M.exchange_parts(user, src) - if(works_from_distance) - user.Beam(M, icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5) + if(!proximity_flag) + if(!works_from_distance) + return + if(get_dist(src, M) > (user.client.maxview() + 2)) + return + + if(M.component_parts) + M.exchange_parts(user, src) + if(works_from_distance) + user.Beam(M, icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5) else message_admins("\[EXPLOIT] [key_name_admin(user)] attempted to upgrade machinery with a BRPED via a camera console (attempted range exploit).") playsound(src, 'sound/machines/synth_no.ogg', 15, TRUE) to_chat(user, "ERROR: [M] is out of [src]'s range!") +/obj/item/storage/part_replacer/tier4/populate_contents() + for(var/amount in 1 to 30) + new /obj/item/stock_parts/capacitor/quadratic(src) + new /obj/item/stock_parts/manipulator/femto(src) + new /obj/item/stock_parts/matter_bin/bluespace(src) + new /obj/item/stock_parts/micro_laser/quadultra(src) + new /obj/item/stock_parts/scanning_module/triphasic(src) + new /obj/item/stock_parts/cell/bluespace(src) + new /obj/item/reagent_containers/glass/beaker/bluespace(src) + //////////////////////////////////////// // Bluespace Part Replacer //////////////////////////////////////// @@ -271,9 +283,3 @@ rating = 4 materials = list(MAT_METAL=80) -/obj/item/research//Makes testing much less of a pain -Sieve - name = "research" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "capacitor" - desc = "A debug item for research." - origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;engineering=8;plasmatech=8;abductor=8" diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 3a767524ad78..436fc8d1bd8e 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -50,7 +50,7 @@ /obj/item/storage/backpack/holding name = "Bag of Holding" - desc = "A backpack that opens into a localized pocket of Bluespace." + desc = "A bleeding-edge backpack that uses bluespace technology to create a localized dimensional pocket for storage." origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" item_state = "holdingpack" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 724e387b6d1c..8205c863ce0b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -98,7 +98,7 @@ /obj/item/storage/bag/trash/bluespace name = "trash bag of holding" - desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." + desc = "An advanced trash bag that uses experimental bluespace technology to send stored trash to a specialized pocket dimension." icon_state = "bluetrashbag" belt_icon = "trashbag_blue" origin_tech = "materials=4;bluespace=4;engineering=4;plasmatech=3" @@ -348,8 +348,7 @@ // Make each item scatter a bit for(var/obj/item/I in oldContents) - I.forceMove(M) - INVOKE_ASYNC(src, PROC_REF(scatter_tray_items), I) + do_scatter(I) if(prob(50)) playsound(M, 'sound/items/trayhit1.ogg', 50, 1) @@ -359,13 +358,18 @@ if(ishuman(M) && prob(10)) M.KnockDown(4 SECONDS) -/obj/item/storage/bag/tray/proc/scatter_tray_items(obj/item/I) - if(!I) - return +/obj/item/storage/bag/tray/proc/do_scatter(obj/item/tray_item) + var/delay = rand(2, 4) + var/datum/move_loop/loop = GLOB.move_manager.move_rand(tray_item, GLOB.cardinal, delay, timeout = rand(1, 2) * delay, flags = MOVEMENT_LOOP_START_FAST) + //This does mean scattering is tied to the tray. Not sure how better to handle it + RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(change_speed)) - for(var/i in 1 to rand(1, 2)) - step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2, 4)) +/obj/item/storage/bag/tray/proc/change_speed(datum/move_loop/source) + SIGNAL_HANDLER // COMSIG_MOVELOOP_POSTPROCESS + var/new_delay = rand(2, 4) + var/count = source.lifetime / source.delay + source.lifetime = count * new_delay + source.delay = new_delay /obj/item/storage/bag/tray/update_icon_state() return @@ -415,7 +419,7 @@ I.forceMove(dropspot) // If there is no table, dump the contents of the tray at our feet like we're doing the service equivilent of a micdrop. if(!found_table && isturf(dropspot)) - INVOKE_ASYNC(src, PROC_REF(scatter_tray_items), I) + INVOKE_ASYNC(src, PROC_REF(do_scatter), I) if(found_table) user.visible_message("[user] unloads [user.p_their()] serving tray.") diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 427e2587f601..516c9f319078 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -368,6 +368,30 @@ use_item_overlays = FALSE layer_over_suit = TRUE +/obj/item/storage/belt/federation_webbing + name = "\improper Federation combat webbing" + desc = "A tactical chest rig used by soldiers and marines of the Trans-Solar Federation. It's covered in pouches and attachment points." + icon_state = "federationwebbing" + item_state = "federationwebbing" + storage_slots = 15 + max_combined_w_class = 25 + use_item_overlays = FALSE + layer_over_suit = TRUE + w_class_override = list( + /obj/item/crowbar, + /obj/item/screwdriver, + /obj/item/weldingtool, + /obj/item/wirecutters, + /obj/item/wrench, + /obj/item/multitool, + /obj/item/rcd, + /obj/item/rcd_ammo, + /obj/item/ammo_box, + /obj/item/melee/baton, + /obj/item/melee/classic_baton, + /obj/item/kitchen/knife + ) + /obj/item/storage/belt/soulstone name = "soul stone belt" desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." @@ -785,15 +809,16 @@ /obj/item/storage/belt/sheath/remove_from_storage(obj/item/W, atom/new_location) if(!..()) return - playsound(src, 'sound/weapons/blade_unsheath.ogg', 20) + if(!length(contents)) // telekinesis grab spawns inside of the sheath and leaves it immediately... + playsound(src, 'sound/weapons/blade_unsheath.ogg', 20) /obj/item/storage/belt/sheath/update_icon_state() if(length(contents)) - icon_state = "[icon_state]-sword" - item_state = "[item_state]-sword" + icon_state = "[base_icon_state]-sword" + item_state = "[base_icon_state]-sword" else - icon_state = initial(icon_state) - item_state = initial(item_state) + icon_state = base_icon_state + item_state = base_icon_state if(isliving(loc)) var/mob/living/L = loc L.update_inv_belt() @@ -801,8 +826,7 @@ /obj/item/storage/belt/sheath/saber name = "saber sheath" desc = "Can hold sabers." - icon_state = "sheath" - item_state = "sheath" + base_icon_state = "sheath" can_hold = list(/obj/item/melee/saber) /obj/item/storage/belt/sheath/saber/populate_contents() @@ -812,8 +836,7 @@ /obj/item/storage/belt/sheath/snakesfang name = "snakesfang scabbard" desc = "Can hold scimitars." - icon_state = "snakesfangsheath" - item_state = "snakesfangsheath" + base_icon_state = "snakesfangsheath" can_hold = list(/obj/item/melee/snakesfang) /obj/item/storage/belt/sheath/snakesfang/populate_contents() @@ -823,8 +846,7 @@ /obj/item/storage/belt/sheath/breach_cleaver name = "breach cleaver scabbard" desc = "Can hold massive cleavers." - icon_state = "breachcleaversheath" - item_state = "breachcleaversheath" + base_icon_state = "breachcleaversheath" can_hold = list(/obj/item/melee/breach_cleaver) /obj/item/storage/belt/sheath/breach_cleaver/populate_contents() @@ -837,7 +859,7 @@ /obj/item/storage/belt/bluespace name = "Belt of Holding" - desc = "The greatest in pants-supporting technology." + desc = "A bleeding-edge storage medium that incorporates principles developed for the Bag of Holding into belt form." icon_state = "holdingbelt" item_state = "holdingbelt" storage_slots = 14 diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index e12177026450..9d0ccb0c46aa 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -1246,6 +1246,17 @@ new /obj/item/stock_parts/matter_bin(src) new /obj/item/screwdriver(src) +/obj/item/storage/box/crewvend + name = "CrewVend 3000 Kit" + desc = "Contains everything you need to build your own vending machine!" + +/obj/item/storage/box/crewvend/populate_contents() + new /obj/item/stack/sheet/metal/(src, 5) + new /obj/item/stack/cable_coil/five(src) + var/obj/item/circuitboard/vendor/board = new /obj/item/circuitboard/vendor(src) + board.set_type("CrewVend 3000") + new /obj/item/screwdriver(src) + /obj/item/storage/box/hardmode_box name = "box of HRD-MDE project box" desc = "Contains everything needed to get yourself killed for a medal." diff --git a/code/game/objects/items/weapons/storage/garment.dm b/code/game/objects/items/weapons/storage/garment.dm index 28e0b39d3477..d4794f2fff52 100644 --- a/code/game/objects/items/weapons/storage/garment.dm +++ b/code/game/objects/items/weapons/storage/garment.dm @@ -255,7 +255,7 @@ new /obj/item/clothing/under/rank/security/warden/corporate(src) new /obj/item/clothing/under/rank/security/warden/skirt(src) new /obj/item/clothing/under/rank/security/warden/skirt/corporate(src) - new /obj/item/clothing/mask/gas/sechailer/warden(src) + new /obj/item/clothing/mask/gas/sechailer/swat/warden(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/clothing/head/helmet/space/plasmaman/security/warden(src) new /obj/item/clothing/under/plasmaman/security/warden(src) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 33733f7e25d2..e877bb946940 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -332,6 +332,9 @@ /obj/item/melee/baton/loaded/borg_stun_arm name = "electrically-charged arm" desc = "A piece of scrap metal wired directly to your power cell." + icon = 'icons/mob/robot_items.dmi' + base_icon = "elecarm" + icon_state = "elecarm" hitcost = 100 /obj/item/melee/baton/loaded/borg_stun_arm/screwdriver_act(mob/living/user, obj/item/I) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 3d8052094ceb..7808989a80e2 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -10,8 +10,37 @@ actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) var/gas_type = "oxygen" var/on = FALSE - var/stabilizers = FALSE var/volume_rate = 500 //Needed for borg jetpack transfer + var/stabilize = FALSE + var/thrust_callback + +/obj/item/tank/jetpack/Initialize(mapload) + . = ..() + thrust_callback = CALLBACK(src, PROC_REF(allow_thrust), 0.01) + configure_jetpack(stabilize) + +/obj/item/tank/jetpack/Destroy() + thrust_callback = null + return ..() + +/** + * configures/re-configures the jetpack component + * + * Arguments + * stabilize - Should this jetpack be stabalized + */ +/obj/item/tank/jetpack/proc/configure_jetpack(stabilize) + src.stabilize = stabilize + + AddComponent( \ + /datum/component/jetpack, \ + src.stabilize, \ + COMSIG_JETPACK_ACTIVATED, \ + COMSIG_JETPACK_DEACTIVATED, \ + JETPACK_ACTIVATION_FAILED, \ + thrust_callback, \ + /datum/effect_system/trail_follow/ion \ + ) /obj/item/tank/jetpack/populate_gas() if(gas_type) @@ -37,8 +66,8 @@ /obj/item/tank/jetpack/proc/toggle_stabilization(mob/user) if(on) - stabilizers = !stabilizers - to_chat(user, "You turn [src]'s stabilization [stabilizers ? "on" : "off"].") + configure_jetpack(!stabilize) + to_chat(user, "You turn [src]'s stabilization [stabilize ? "on" : "off"].") /obj/item/tank/jetpack/proc/cycle(mob/user) if(user.incapacitated()) @@ -54,31 +83,40 @@ var/datum/action/A = X A.UpdateButtons() - /obj/item/tank/jetpack/proc/turn_on(mob/user) + if(SEND_SIGNAL(src, COMSIG_JETPACK_ACTIVATED, user) & JETPACK_ACTIVATION_FAILED) + return FALSE + on = TRUE icon_state = "[initial(icon_state)]-on" /obj/item/tank/jetpack/proc/turn_off(mob/user) + SEND_SIGNAL(src, COMSIG_JETPACK_DEACTIVATED, user) on = FALSE - stabilizers = FALSE icon_state = initial(icon_state) -/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user) - if(!on) - return 0 +/obj/item/tank/jetpack/dropped(mob/user, silent) + . = ..() + if(on) + turn_off(user) + +/obj/item/tank/jetpack/proc/allow_thrust(num) + if(!ismob(loc)) + return FALSE + var/mob/user = loc + if((num < 0.005 || air_contents.total_moles() < num)) turn_off(user) - return 0 + return FALSE var/datum/gas_mixture/removed = air_contents.remove(num) if(removed.total_moles() < 0.005) turn_off(user) - return 0 + return FALSE var/turf/T = get_turf(user) T.blind_release_air(removed) - return 1 + return TRUE /obj/item/tank/jetpack/improvised name = "improvised jetpack" diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index ac334cfbaccf..4722417ad467 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -299,9 +299,8 @@ var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src)) log_game("[key_name(user)] used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).") playsound(src,'sound/items/syringeproj.ogg', 40, TRUE) - for(var/a in 1 to 6) - step_towards(A, target) - sleep(2) + A.throw_at(target, 6, 2, user) + sleep(2) A.Smoke() addtimer(VARSET_CALLBACK(src, nanofrost_cooldown, FALSE)) if(METAL_FOAM) @@ -334,6 +333,11 @@ playsound(src, 'sound/effects/bamf.ogg', 100, TRUE) qdel(src) +/obj/effect/nanofrost_container/anomaly + name = "nanofrost anomaly" + desc = "A frozen shell of ice containing nanofrost that freezes the surrounding area." + icon_state = "frozen_smoke_anomaly" + #undef EXTINGUISHER #undef NANOFROST #undef METAL_FOAM diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 35f8be4f3017..e1ac0156b718 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -43,7 +43,7 @@ REMOVE_TRAIT(loc, TRAIT_TURF_COVERED, UNIQUE_TRAIT_SOURCE(src)) return ..() -/obj/structure/Move() +/obj/structure/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE) var/atom/old = loc if(!..()) return FALSE diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index d68b48bb0a72..1fc97e43a600 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -178,12 +178,12 @@ return attack_hand(user) -/obj/machinery/barsign/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/barsign/item_interaction(mob/living/user, obj/item/used, list/modifiers) switch(build_stage) // Inserting the electronics/circuit if(BARSIGN_FRAME) - if(istype(I, /obj/item/barsign_electronics)) - var/obj/item/barsign_electronics/electronic = I + if(istype(used, /obj/item/barsign_electronics)) + var/obj/item/barsign_electronics/electronic = used if(electronic.destroyed) emagged = TRUE else @@ -196,37 +196,37 @@ qdel(electronic) build_stage = BARSIGN_CIRCUIT update_icon() - playsound(get_turf(src), I.usesound, 50, TRUE) + playsound(get_turf(src), used.usesound, 50, TRUE) add_fingerprint(user) - return + return ITEM_INTERACT_COMPLETE // Wiring the bar sign if(BARSIGN_CIRCUIT) - if(istype(I, /obj/item/stack/cable_coil)) - if(!I.use(5)) + if(istype(used, /obj/item/stack/cable_coil)) + if(!used.use(5)) to_chat(user, "You need a total of five cables to wire [src]!") - return + return ITEM_INTERACT_COMPLETE stat &= ~EMPED build_stage = BARSIGN_WIRED update_icon() - playsound(get_turf(src), I.usesound, 50, TRUE) + playsound(get_turf(src), used.usesound, 50, TRUE) to_chat(user, "You wire [src]!") power_state = IDLE_POWER_USE add_fingerprint(user) - return + return ITEM_INTERACT_COMPLETE // Placing in the glass if(BARSIGN_WIRED) - if(istype(I, /obj/item/stack/sheet/glass)) - if(!I.use(2)) + if(istype(used, /obj/item/stack/sheet/glass)) + if(!used.use(2)) to_chat(user, "You need at least 2 sheets of glass for this!") - return + return ITEM_INTERACT_COMPLETE build_stage = BARSIGN_COMPLETE - playsound(get_turf(src), I.usesound, 50, TRUE) + playsound(get_turf(src), used.usesound, 50, TRUE) obj_integrity = max_integrity if(stat & BROKEN) stat &= ~BROKEN set_sign(new /datum/barsign/hiddensigns/signoff) add_fingerprint(user) - return + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/barsign/proc/pick_sign(mob/user) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a1e0b163ebf3..a628356606bc 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -510,7 +510,7 @@ /obj/structure/closet/bluespace name = "bluespace closet" - desc = "A storage unit that moves and stores through the fourth dimension." + desc = "An experimental storage unit which defies several conventional laws of physics. It appears to only tenuously exist on this plane of reality, allowing it to phase through anything less solid than a wall." density = FALSE icon_state = "bluespace" storage_capacity = 60 diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 40e729f30e3b..777a06ebea4e 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -37,7 +37,7 @@ if(by_hand) for(var/obj/O in src) if(O.density) - var/response = tgui_alert(usr, "This crate has been packed with bluespace compression, an item inside won't fit back inside. Are you sure you want to open it?", "Bluespace Compression Warning", list("Yes", "No")) + var/response = tgui_alert(usr, "This crate has been packed extremely tightly, an item inside won't fit back inside. Are you sure you want to open it?", "Compressed Materials Warning", list("Yes", "No")) if(response != "Yes" || !Adjacent(usr)) return FALSE break @@ -383,6 +383,13 @@ var/target_temp = T0C - 40 var/cooling_power = 40 +/obj/structure/closet/crate/freezer/deluxe + name = "Deluxe Freezer" + desc = "A fancy looking freezer emblazoned with the Nanotrasen logo." + icon_state = "freezerdeluxe" + icon_opened = "freezerdeluxe_open" + icon_closed = "freezerdeluxe" + /obj/structure/closet/crate/freezer/return_obj_air() RETURN_TYPE(/datum/gas_mixture) var/datum/gas_mixture/gas = ..() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 27df94912bdf..a056b9930043 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -405,6 +405,15 @@ smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS) canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) +/obj/structure/falsewall/backrooms + desc = "A strange wall that looks like cheap wallpaper and drywall." + icon = 'icons/turf/walls/backrooms_wall.dmi' + icon_state = "backrooms_wall-0" + base_icon_state = "backrooms_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BACKROOMS_WALLS) + canSmoothWith = list(SMOOTH_GROUP_BACKROOMS_WALLS) + /obj/structure/falsewall/brass name = "clockwork wall" desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 522881d1a453..b3eabd256af5 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -249,37 +249,36 @@ . = ..() icon_state = "fullgrass_[rand(1, 3)]" -// Kirby plants +////////////////////// +////// MARK: Kirbyplants +////////////////////// + /obj/item/kirbyplants name = "potted plant" desc = "Some greenery, how nice." icon = 'icons/obj/flora/plants.dmi' - icon_state = "random_plant" + icon_state = "random-medium" anchored = FALSE layer = ABOVE_MOB_LAYER - w_class = WEIGHT_CLASS_HUGE force = 10 throwforce = 13 throw_speed = 2 throw_range = 4 - /// Method to track plant overlay on mob for later removal + /// Variable to track plant overlay on mob for later removal var/mutable_appearance/mob_overlay + var/hideable = FALSE /obj/item/kirbyplants/Initialize(mapload) . = ..() - if(prob(1) && icon_state == "random_plant") - icon_state = "plant-eye" - if(icon_state == "random_plant") - icon_state = "plant-[rand(1, 34)]" - update_appearance(UPDATE_ICON_STATE) - AddComponent(/datum/component/two_handed, require_twohands = TRUE) - -/obj/item/kirbyplants/Destroy() - if(iscarbon(loc)) - unhide_user(loc) + if(hideable) + AddComponent(/datum/component/two_handed, require_twohands = TRUE) - QDEL_NULL(mob_overlay) - return ..() +/obj/item/kirbyplants/examine(mob/user) + . = ..() + if(hideable) + . += "You can hide behind [src] by picking it up with both hands free." + else + . += "It's too small to hide behind." /obj/item/kirbyplants/equipped(mob/living/carbon/user) . = ..() @@ -288,6 +287,13 @@ return unhide_user(user) +/obj/item/kirbyplants/Destroy() + if(iscarbon(loc)) + unhide_user(loc) + + QDEL_NULL(mob_overlay) + return ..() + /// User has decided to hold a plant, apply stealth. /obj/item/kirbyplants/proc/hide_user(mob/living/carbon/user) RegisterSignal(user, COMSIG_CARBON_REGENERATE_ICONS, PROC_REF(reapply_hide)) @@ -320,118 +326,136 @@ ..() unhide_user(user) -/obj/item/kirbyplants/plant1 - icon_state = "plant-1" +//Large Plants +/obj/item/kirbyplants/large + name = "large potted plant" + icon_state = "random-big" + w_class = WEIGHT_CLASS_HUGE + desc = "A big potted plant. In enclosed starships and space stations, a bit of greenery is good for morale." + hideable = TRUE -/obj/item/kirbyplants/plant2 - icon_state = "plant-2" +/obj/item/kirbyplants/large/Initialize(mapload) + . = ..() + if(icon_state == "random-big") + icon_state = "plant-[rand(1, 15)]" -/obj/item/kirbyplants/plant3 +/obj/item/kirbyplants/large/plant1 + icon_state = "plant-1" +/obj/item/kirbyplants/large/plant2 + icon_state = "plant-2" +/obj/item/kirbyplants/large/plant3 icon_state = "plant-3" - -/obj/item/kirbyplants/plant4 +/obj/item/kirbyplants/large/plant4 icon_state = "plant-4" - -/obj/item/kirbyplants/plant5 +/obj/item/kirbyplants/large/plant5 icon_state = "plant-5" - -/obj/item/kirbyplants/plant6 +/obj/item/kirbyplants/large/plant6 icon_state = "plant-6" - -/obj/item/kirbyplants/plant7 +/obj/item/kirbyplants/large/plant7 icon_state = "plant-7" - -/obj/item/kirbyplants/plant8 +/obj/item/kirbyplants/large/plant8 icon_state = "plant-8" - -/obj/item/kirbyplants/plant9 +/obj/item/kirbyplants/large/plant9 icon_state = "plant-9" - -/obj/item/kirbyplants/plant10 +/obj/item/kirbyplants/large/plant10 icon_state = "plant-10" - -/obj/item/kirbyplants/plant11 +/obj/item/kirbyplants/large/plant11 icon_state = "plant-11" - -/obj/item/kirbyplants/plant12 +/obj/item/kirbyplants/large/plant12 icon_state = "plant-12" - -/obj/item/kirbyplants/plant13 +/obj/item/kirbyplants/large/plant13 icon_state = "plant-13" - -/obj/item/kirbyplants/plant14 +/obj/item/kirbyplants/large/plant14 icon_state = "plant-14" - -/obj/item/kirbyplants/plant15 +/obj/item/kirbyplants/large/plant15 icon_state = "plant-15" -/obj/item/kirbyplants/plant16 - icon_state = "plant-16" - -/obj/item/kirbyplants/plant17 - icon_state = "plant-17" - -/obj/item/kirbyplants/plant18 - icon_state = "plant-18" - -/obj/item/kirbyplants/plant19 - icon_state = "plant-19" - -/obj/item/kirbyplants/plant20 - icon_state = "plant-20" - -/obj/item/kirbyplants/plant21 - icon_state = "plant-21" - -/obj/item/kirbyplants/plant22 - icon_state = "plant-22" - -/obj/item/kirbyplants/plant23 - icon_state = "plant-23" - -/obj/item/kirbyplants/plant24 - icon_state = "plant-24" - -/obj/item/kirbyplants/plant25 - icon_state = "plant-25" - -/obj/item/kirbyplants/plant26 - icon_state = "plant-26" - -/obj/item/kirbyplants/plant27 - icon_state = "plant-27" - -/obj/item/kirbyplants/plant28 - icon_state = "plant-28" - -/obj/item/kirbyplants/plant29 - icon_state = "plant-29" - -/obj/item/kirbyplants/plant30 - icon_state = "plant-30" - -/obj/item/kirbyplants/plant31 - icon_state = "plant-31" - -/obj/item/kirbyplants/plant32 - icon_state = "plant-32" - -/obj/item/kirbyplants/plant33 - icon_state = "plant-33" - -/obj/item/kirbyplants/plant34 - icon_state = "plant-34" - -/obj/item/kirbyplants/applebush - icon_state = "applebush" - -/obj/item/kirbyplants/dead +/obj/item/kirbyplants/large/dead icon_state = "plant-dead" -/obj/item/kirbyplants/dead/rd +/obj/item/kirbyplants/large/dead/rd name = "\improper RD's potted plant" desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..." +//Medium Plants +/obj/item/kirbyplants/medium + name = "potted plant" + icon_state = "random-medium" + desc = "An understated houseplant. In enclosed starships and space stations, a bit of greenery is good for morale." + w_class = WEIGHT_CLASS_BULKY + hideable = TRUE + +/obj/item/kirbyplants/medium/Initialize(mapload) + . = ..() + if(icon_state == "random-medium") + icon_state = "medium-[rand(1,8)]" + +/obj/item/kirbyplants/medium/medium1 + icon_state = "medium-1" +/obj/item/kirbyplants/medium/medium2 + icon_state = "medium-2" +/obj/item/kirbyplants/medium/medium3 + icon_state = "medium-3" +/obj/item/kirbyplants/medium/medium4 + icon_state = "medium-4" +/obj/item/kirbyplants/medium/medium5 + icon_state = "medium-5" +/obj/item/kirbyplants/medium/medium6 + icon_state = "medium-6" +/obj/item/kirbyplants/medium/medium7 + icon_state = "medium-7" +/obj/item/kirbyplants/medium/medium8 + icon_state = "medium-8" + +//Small Plants +/obj/item/kirbyplants/small + name = "small potted plant" + icon_state = "random-small" + w_class = WEIGHT_CLASS_NORMAL + desc = "A small potted houseplant, for setting on tables and shelves." + +/obj/item/kirbyplants/small/Initialize(mapload) + . = ..() + if(icon_state == "random-small") + icon_state = "small-[rand(1,5)]" + +/obj/item/kirbyplants/small/small1 + icon_state = "small-1" +/obj/item/kirbyplants/small/small2 + icon_state = "small-2" +/obj/item/kirbyplants/small/small3 + icon_state = "small-3" +/obj/item/kirbyplants/small/small4 + icon_state = "small-4" +/obj/item/kirbyplants/small/small5 + icon_state = "small-5" + +//Alien Plants +/obj/item/kirbyplants/large/alien + name = "potted alien plant" + icon_state = "random-alien" + desc = "An alien potted plant. Nanotrasen and the TSF usually favor Earthen plants for decor, so plants like this are an exotic novelty in this part of the galaxy." + +/obj/item/kirbyplants/large/alien/Initialize(mapload) + . = ..() + if(icon_state == "random-alien") + icon_state = "alien-[rand(1,8)]" + +/obj/item/kirbyplants/large/alien/alien1 + icon_state = "alien-1" +/obj/item/kirbyplants/large/alien/alien3 + icon_state = "alien-3" +/obj/item/kirbyplants/large/alien/alien4 + icon_state = "alien-4" +/obj/item/kirbyplants/large/alien/alien5 + icon_state = "alien-5" +/obj/item/kirbyplants/large/alien/alien6 + icon_state = "alien-6" +/obj/item/kirbyplants/large/alien/alien7 + icon_state = "alien-7" +/obj/item/kirbyplants/large/alien/alien8 + icon_state = "alien-8" + //a rock is flora according to where the icon file is //and now these defines /obj/structure/flora/rock diff --git a/code/game/objects/structures/grey_autocloner.dm b/code/game/objects/structures/grey_autocloner.dm index d11afe9a220c..294197204608 100644 --- a/code/game/objects/structures/grey_autocloner.dm +++ b/code/game/objects/structures/grey_autocloner.dm @@ -24,12 +24,14 @@ clonemind = null return ..() -/obj/machinery/grey_autocloner/attackby__legacy__attackchain(obj/item/bio_chip_implanter/implant, mob/user, params) +/obj/machinery/grey_autocloner/item_interaction(mob/living/user, obj/item/used, list/modifiers) + var/obj/item/bio_chip_implanter/implant = used if(!istype(implant) || !(istype(implant.imp, /obj/item/bio_chip/grey_autocloner))) return ..() var/obj/item/bio_chip/grey_autocloner/autoclone = implant.imp autoclone.linked = src atom_say("Link confirmed!") + return ITEM_INTERACT_COMPLETE /obj/machinery/grey_autocloner/proc/growclone(datum/dna2_record/R) if(attempting || stat & (NOPOWER|BROKEN)) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 26d4692461b2..66703986234a 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -171,7 +171,6 @@ /obj/structure/kitchenspike/post_unbuckle_mob(mob/living/M) M.pixel_y = M.get_standard_pixel_y_offset(0) - M.set_lying_angle(0) M.update_transform() /obj/structure/kitchenspike/Destroy() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 5ba070de0e83..0aa3230c94ef 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -40,7 +40,7 @@ else // hand this off to the turf instead (for building plating, catwalks, etc) var/turf/T = get_turf(src) - return T.attack_by(C, user, params) + return T.item_interaction(user, C, params) /obj/structure/lattice/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 95f8d384b202..ef29f583f44e 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -129,7 +129,7 @@ to_chat(user, "Using the mirror will destroy any non biochip implants in you!") var/list/race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin", "Nian", "Grey", "Drask") if(actually_magical) - race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin", "Nian", "Grey", "Drask", "Vox", "Plasmaman", "Kidan") + race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin", "Nian", "Grey", "Drask", "Vox", "Plasmaman", "Kidan", "Slime People") var/datum/ui_module/appearance_changer/AC = ui_users[user] if(!AC) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 12403792f164..ee9d664cff92 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -311,7 +311,7 @@ if(pass_info.is_movable) . = . || pass_info.pass_flags & PASSTABLE -/obj/structure/m_tray/Process_Spacemove(movement_dir) +/obj/structure/m_tray/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /* @@ -582,7 +582,7 @@ GLOBAL_LIST_EMPTY(crematoriums) connected = null return ..() -/obj/structure/c_tray/Process_Spacemove(movement_dir) +/obj/structure/c_tray/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE // Crematorium switch diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 5c229ce50d6f..d738fb8bd928 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -5,6 +5,7 @@ icon_state = "railing" density = TRUE anchored = TRUE + flags_2 = RAD_NO_CONTAMINATE_2 pass_flags_self = LETPASSTHROW | PASSTAKE climbable = TRUE layer = ABOVE_MOB_LAYER diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index f7fc087084b9..e3a4db68a130 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -21,6 +21,8 @@ var/comfort = 0 /// Used to handle rotation properly, should only be 1, 4, or 8 var/possible_dirs = 4 + /// Will it set to the layer above the player or not? Use with Armrests. + var/uses_armrest = FALSE /obj/structure/chair/examine(mob/user) . = ..() @@ -32,7 +34,7 @@ W.setDir(dir) qdel(src) -/obj/structure/chair/Move(atom/newloc, direct) +/obj/structure/chair/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE) . = ..() handle_rotation() @@ -111,7 +113,7 @@ if(possible_dirs == 8) // We don't want chairs with corner dirs to sit over mobs, it is handled by armrests layer = OBJ_LAYER return - if(has_buckled_mobs() && dir == NORTH) + if(has_buckled_mobs() && dir == NORTH && !uses_armrest) layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER @@ -247,6 +249,8 @@ movable = TRUE item_chair = null buildstackamount = 5 + var/image/armrest + uses_armrest = TRUE /obj/structure/chair/comfy/shuttle name = "shuttle seat" @@ -278,6 +282,34 @@ /obj/structure/chair/office/dark icon_state = "officechair_dark" +/obj/structure/chair/office/proc/get_armrest() + return mutable_appearance('icons/obj/chairs.dmi', "[icon_state]_armrest") + +/obj/structure/chair/office/Initialize(mapload) + armrest = get_armrest() + armrest.layer = ABOVE_MOB_LAYER + return ..() + +/obj/structure/chair/office/Destroy() + QDEL_NULL(armrest) + return ..() + +/obj/structure/chair/office/post_buckle_mob(mob/living/M) + . = ..() + update_armrest() + +/obj/structure/chair/office/post_unbuckle_mob(mob/living/M) + . = ..() + update_armrest() + +/obj/structure/chair/office/proc/update_armrest() + if(has_buckled_mobs()) + add_overlay(armrest) + else + cut_overlay(armrest) + + + /obj/structure/chair/barber icon_state = "barber_chair" buildstackamount = 1 diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 067158533c98..20e24c5bf83f 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -73,8 +73,6 @@ if(!buckled_mob.Move(get_step(buckled_mob, direction), direction)) loc = buckled_mob.loc //we gotta go back last_move = buckled_mob.last_move - inertia_dir = last_move - buckled_mob.inertia_dir = last_move . = 0 else diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index cebaa4e5dc02..db2fdf551452 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -50,7 +50,7 @@ stop_following() return ..() -/obj/structure/transit_tube_pod/Process_Spacemove() +/obj/structure/transit_tube_pod/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(moving) //No drifting while moving in the tubes return TRUE else return ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 24e67bd26a1c..2bd57402faae 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -346,9 +346,11 @@ if(istype(T) && !T.density) T.MakeSlippery(TURF_WET_WATER, 5 SECONDS) -/obj/machinery/shower/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(I.type == /obj/item/analyzer) +/obj/machinery/shower/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/analyzer)) to_chat(user, "The water temperature seems to be [current_temperature].") + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/shower/wrench_act(mob/user, obj/item/I) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a4e8b7452331..4f1862204ec4 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -508,16 +508,16 @@ return reinf && fulltile ? real_explosion_block : 0 /obj/structure/window/basic - desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it." + desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it. Lacks protection from radiation." /obj/structure/window/reinforced name = "reinforced window" - desc = "It looks rather strong. Might take a few good hits to shatter it." + desc = "It looks rather strong. Might take a few good hits to shatter it. Lacks protection from radiation." icon_state = "rwindow" reinf = TRUE heat_resistance = 1300 armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, RAD = 100, FIRE = 80, ACID = 100) - rad_insulation = RAD_HEAVY_INSULATION + rad_insulation = RAD_NO_INSULATION max_integrity = 50 explosion_block = 1 glass_type = /obj/item/stack/sheet/rglass @@ -630,7 +630,7 @@ /obj/structure/window/plasmabasic name = "plasma window" - desc = "A window made out of a plasma-silicate alloy. It looks insanely tough to break and burn through." + desc = "A window made out of a plasma-silicate alloy. It looks insanely tough to break and burn through. Lacks protection from radiation." icon_state = "plasmawindow" glass_decal = /obj/effect/decal/cleanable/glass/plasma shardtype = /obj/item/shard/plasma @@ -644,7 +644,7 @@ /obj/structure/window/plasmareinforced name = "reinforced plasma window" - desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof." + desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof. Lacks protection from radiation." icon_state = "plasmarwindow" glass_decal = /obj/effect/decal/cleanable/glass/plasma shardtype = /obj/item/shard/plasma @@ -673,7 +673,7 @@ canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_WALLS) /obj/structure/window/full/basic - desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it." + desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it. Has very light protection from radiation" icon = 'icons/obj/smooth_structures/windows/window.dmi' icon_state = "window-0" base_icon_state = "window" @@ -682,7 +682,7 @@ /obj/structure/window/full/plasmabasic name = "plasma window" - desc = "A plasma-glass alloy window. It looks insanely tough to break. It appears it's also insanely tough to burn through." + desc = "A plasma-glass alloy window. It looks insanely tough to break. It appears it's also insanely tough to burn through. Has very light protection from radiation." icon = 'icons/obj/smooth_structures/windows/plasma_window.dmi' icon_state = "plasma_window-0" base_icon_state = "plasma_window" @@ -693,14 +693,13 @@ max_integrity = 300 explosion_block = 1 armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, RAD = 100, FIRE = 99, ACID = 100) - rad_insulation = RAD_NO_INSULATION edge_overlay_file = 'icons/obj/smooth_structures/windows/window_edges.dmi' env_smash_level = ENVIRONMENT_SMASH_WALLS // these windows are a fair bit tougher superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT /obj/structure/window/full/plasmareinforced name = "reinforced plasma window" - desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof." + desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof. Offers superior protection from radiation." icon = 'icons/obj/smooth_structures/windows/rplasma_window.dmi' icon_state = "rplasma_window-0" base_icon_state = "rplasma_window" @@ -712,7 +711,7 @@ max_integrity = 1000 explosion_block = 2 armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, RAD = 100, FIRE = 99, ACID = 100) - rad_insulation = RAD_NO_INSULATION + rad_insulation = RAD_HEAVY_INSULATION edge_overlay_file = 'icons/obj/smooth_structures/windows/reinforced_window_edges.dmi' env_smash_level = ENVIRONMENT_SMASH_RWALLS // these ones are insanely tough superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT @@ -722,7 +721,7 @@ /obj/structure/window/full/reinforced name = "reinforced window" - desc = "It looks rather strong. Might take a few good hits to shatter it." + desc = "It looks rather strong. Might take a few good hits to shatter it. Offers superior protection from radiation" icon = 'icons/obj/smooth_structures/windows/reinforced_window.dmi' icon_state = "reinforced_window-0" base_icon_state = "reinforced_window" @@ -783,7 +782,7 @@ reinf = TRUE heat_resistance = 32000 armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, RAD = 100, FIRE = 99, ACID = 100) - rad_insulation = RAD_NO_INSULATION + rad_insulation = RAD_HEAVY_INSULATION explosion_block = 3 glass_type = /obj/item/stack/sheet/plastitaniumglass smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_PLASTITANIUM_WALLS) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 9c85caa033f2..74bce5b10b0d 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -138,7 +138,6 @@ switch(src.wet) if(TURF_WET_WATER) if(!(M.slip("the wet floor", WATER_WEAKEN_TIME, tilesSlipped = 0, walkSafely = 1))) - M.inertia_dir = 0 return if(TURF_WET_LUBE) //lube @@ -147,7 +146,6 @@ if(TURF_WET_ICE) // Ice if(M.slip("the icy floor", 8 SECONDS, tilesSlipped = 0, walkSafely = 0)) - M.inertia_dir = 0 if(prob(5)) var/obj/item/organ/external/affected = M.get_organ("head") if(affected) @@ -158,6 +156,10 @@ if(TURF_WET_PERMAFROST) // Permafrost M.slip("the frosted floor", 10 SECONDS, tilesSlipped = 1, walkSafely = 0, slipAny = 1) +/turf/simulated/BeforeChange() + QDEL_NULL(wind_effect) + return ..() + /turf/simulated/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE, copy_existing_baseturf = TRUE) . = ..() QUEUE_SMOOTH_NEIGHBORS(src) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 9e5a4241d59e..3d010e13cbb6 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -308,6 +308,14 @@ break_tile_to_plating() hotspot_expose(1000,CELL_VOLUME) +// Carpet used in the backrooms hallucination +/turf/simulated/floor/backrooms_carpet + name = "backrooms carpet" + desc = "An old, musty carpet. It smells faintly mildewy." + icon = 'icons/turf/floors.dmi' + icon_state = "backrooms_carpet" + baseturf = /turf/simulated/floor/backrooms_carpet + /turf/open/floor/plating/rust //SDMM supports colors, this is simply for easier mapping //and should be removed on initialize diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 1f75cad5ef91..8538d568f2fe 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -113,6 +113,8 @@ return ITEM_INTERACT_COMPLETE + return ..() + /turf/simulated/floor/plating/screwdriver_act(mob/user, obj/item/I) if(!I.tool_use_check(user, 0)) return diff --git a/code/game/turfs/simulated/walls_indestructible.dm b/code/game/turfs/simulated/walls_indestructible.dm index 6fdf37f2d1e4..07863679a69c 100644 --- a/code/game/turfs/simulated/walls_indestructible.dm +++ b/code/game/turfs/simulated/walls_indestructible.dm @@ -302,3 +302,13 @@ GLOBAL_DATUM(title_splash, /turf/simulated/wall/indestructible/splashscreen) smoothing_groups = list(SMOOTH_GROUP_SIMULATED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SYNDICATE_WALLS) canSmoothWith = list(SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) +/turf/simulated/wall/indestructible/backrooms + name = "wall" + desc = "A strange wall that looks like cheap wallpaper and drywall." + icon = 'icons/turf/walls/backrooms_wall.dmi' + icon_state = "backrooms_wall-0" + base_icon_state = "backrooms_wall" + explosion_block = 4 + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = list(SMOOTH_GROUP_BACKROOMS_WALLS) + canSmoothWith = list(SMOOTH_GROUP_BACKROOMS_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) diff --git a/code/game/turfs/space/space_turf.dm b/code/game/turfs/space/space_turf.dm index 42d95de60614..355d7ea9216a 100644 --- a/code/game/turfs/space/space_turf.dm +++ b/code/game/turfs/space/space_turf.dm @@ -117,12 +117,14 @@ to_chat(user, "The plating is going to need some support! Place metal rods first.") return ITEM_INTERACT_COMPLETE + return ..() + /turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0) ..() if((!(A) || !(src in A.locs))) return - if(destination_z && destination_x && destination_y && !A.pulledby && !HAS_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING)) + if(destination_z && destination_x && destination_y && !A.pulledby && !HAS_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING) && !HAS_TRAIT(A, TRAIT_NO_EDGE_TRANSITIONS)) var/tx = destination_x var/ty = destination_y var/turf/DT = locate(tx, ty, destination_z) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 55d448149759..07a9085f4871 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -85,13 +85,7 @@ /// The effect used to render a pressure overlay from this tile. var/obj/effect/pressure_overlay/pressure_overlay - var/list/milla_atmos_airtight = list(FALSE, FALSE, FALSE, FALSE) - var/list/milla_superconductivity = list( - OPEN_HEAT_TRANSFER_COEFFICIENT, - OPEN_HEAT_TRANSFER_COEFFICIENT, - OPEN_HEAT_TRANSFER_COEFFICIENT, - OPEN_HEAT_TRANSFER_COEFFICIENT) - var/list/milla_data = list() + var/list/milla_data = null new_attack_chain = TRUE @@ -484,28 +478,28 @@ if(SSticker) GLOB.cameranet.update_visibility(src) -/turf/attack_by(obj/item/attacking, mob/user, params) - if(..()) - return TRUE +/turf/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(can_lay_cable()) - if(istype(attacking, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = attacking + if(istype(used, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = used for(var/obj/structure/cable/LC in src) if(LC.d1 == 0 || LC.d2 == 0) LC.attackby__legacy__attackchain(C, user) - return TRUE + return ITEM_INTERACT_COMPLETE C.place_turf(src, user) - return TRUE - else if(istype(attacking, /obj/item/rcl)) - var/obj/item/rcl/R = attacking + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/rcl)) + var/obj/item/rcl/R = used if(R.loaded) for(var/obj/structure/cable/LC in src) if(LC.d1 == 0 || LC.d2 == 0) LC.attackby__legacy__attackchain(R, user) - return TRUE + return ITEM_INTERACT_COMPLETE R.loaded.place_turf(src, user) R.is_empty(user) + return ITEM_INTERACT_COMPLETE + /turf/proc/can_have_cabling() return TRUE @@ -647,11 +641,11 @@ RETURN_TYPE(/datum/gas_mixture) // This is one of two intended places to call this otherwise-unsafe proc. var/datum/gas_mixture/bound_to_turf/air = private_unsafe_get_air() - if(air.lastread < SSair.times_fired) + if(air.lastread < SSair.milla_tick) var/list/milla_tile = new/list(MILLA_TILE_SIZE) get_tile_atmos(src, milla_tile) air.copy_from_milla(milla_tile) - air.lastread = SSair.times_fired + air.lastread = SSair.milla_tick air.readonly = null air.dirty = FALSE air.synchronized = FALSE @@ -684,7 +678,7 @@ return FALSE // If it's old, delete it. - if(active_hotspot.death_timer < SSair.times_fired) + if(active_hotspot.death_timer < SSair.milla_tick) QDEL_NULL(active_hotspot) return FALSE else @@ -693,7 +687,7 @@ if(isnull(active_hotspot)) active_hotspot = new(src) - active_hotspot.death_timer = SSair.times_fired + 4 + active_hotspot.death_timer = SSair.milla_tick + 4 if(air.hotspot_volume() > 0) active_hotspot.temperature = air.hotspot_temperature() active_hotspot.volume = air.hotspot_volume() * CELL_VOLUME @@ -705,7 +699,7 @@ return TRUE /turf/simulated/proc/update_wind() - if(wind_tick != SSair.times_fired) + if(wind_tick != SSair.milla_tick) QDEL_NULL(wind_effect) wind_tick = null return FALSE diff --git a/code/modules/admin/db_ban/functions.dm b/code/modules/admin/db_ban/functions.dm index 7d42d9005781..029b80de4d21 100644 --- a/code/modules/admin/db_ban/functions.dm +++ b/code/modules/admin/db_ban/functions.dm @@ -61,8 +61,8 @@ var/computerid var/ip - if(ismob(banned_mob) && banned_mob.ckey) - ckey = banned_mob.ckey + if(ismob(banned_mob) && banned_mob.last_known_ckey) + ckey = banned_mob.last_known_ckey if(banned_mob.client) computerid = banned_mob.client.computer_id ip = banned_mob.client.address @@ -496,7 +496,7 @@ output += "" output += "" output += "Reason:

    " - output += " Auto populate CID & IP for online players
    " + output += " Auto populate CID & IP for players seen this round
    " output += "" output += "" diff --git a/code/modules/admin/misc_admin_procs.dm b/code/modules/admin/misc_admin_procs.dm index e3349394eba6..bf1c706cac86 100644 --- a/code/modules/admin/misc_admin_procs.dm +++ b/code/modules/admin/misc_admin_procs.dm @@ -327,6 +327,8 @@ GLOBAL_VAR_INIT(disable_explosions, FALSE) dat += "

    Change Game Mode

    " if(GLOB.master_mode == "secret") dat += "

    (Force Secret Mode)

    " + if(GLOB.master_mode == "dynamic" || (GLOB.master_mode == "secret" && GLOB.secret_force_mode == "dynamic")) + dat += "

    (Force Dynamic Rulesets)

    " dat += "

    " dat += "

    Create Object

    " dat += "

    Quick Create Object

    " diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 3c1eefa6c07b..62c31b5a3dbb 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -355,6 +355,9 @@ if(SSticker && SSticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

    Round Status

    " dat += "Current Game Mode: [SSticker.mode.name]
    " + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/dynamic = SSticker.mode + dat += "Rulesets: [english_list(dynamic.rulesets + dynamic.implied_rulesets)]
    " dat += "Round Duration: [round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]
    " dat += "Emergency shuttle
    " if(SSshuttle.emergency.mode < SHUTTLE_CALL) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 27340e1c3ea0..711f9636d042 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -40,7 +40,7 @@ if(href_list["makeAntag"]) switch(href_list["makeAntag"]) if("1") - log_admin("[key_name(usr)] has spawned a traitor.") + log_admin("[key_name(usr)] has spawned traitors.") if(!makeTraitors()) to_chat(usr, "Unfortunately there weren't enough candidates available.") if("2") @@ -71,6 +71,10 @@ log_admin("[key_name(usr)] has spawned mindflayers.") if(!makeMindflayers()) to_chat(usr, "Unfortunately there weren't enough candidates available.") + if("9") + log_admin("[key_name(usr)] has spawned event characters.") + if(!makeEventCharacters()) + to_chat(usr, "Unfortunately there weren't enough candidates available.") else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"]) var/adminckey = href_list["dbsearchadmin"] @@ -149,10 +153,13 @@ var/mob/playermob if("autopopulate" in href_list) - for(var/mob/M in GLOB.player_list) + for(var/mob/M in GLOB.mob_list) if(M.ckey == banckey) playermob = M break + else if(M.last_known_ckey == banckey) + playermob = M + // ... but do not break, so we prefer current ckeys. banreason = "(MANUAL BAN) "+banreason @@ -162,7 +169,7 @@ if(bancid) banreason = "[banreason] (CUSTOM CID)" else - message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob") + message_admins("Ban process: A mob matching [playermob.last_known_ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob") if(job_ban) if(banjob in list("commanddept","securitydept","engineeringdept","medicaldept","sciencedept","servicedept","supplydept","nonhumandept")) @@ -440,7 +447,7 @@ to_chat(usr, "This can only be used on instances of type /mob") return - if(!M.ckey) //sanity + if(!M.last_known_ckey) //sanity to_chat(usr, "This mob has no ckey") return if(!SSjobs) @@ -461,17 +468,17 @@ //Regular jobs //Command (Blue) jobs += "" - jobs += "" + jobs += "" for(var/jobPos in GLOB.command_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 6) //So things dont get squiiiiished! @@ -482,17 +489,17 @@ //Security (Red) counter = 0 jobs += "
    Command Positions
    Command Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.security_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -503,17 +510,17 @@ //Engineering (Yellow) counter = 0 jobs += "
    Security Positions
    Security Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.engineering_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -524,17 +531,17 @@ //Medical (White) counter = 0 jobs += "
    Engineering Positions
    Engineering Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.medical_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -545,17 +552,17 @@ //Science (Purple) counter = 0 jobs += "
    Medical Positions
    Medical Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.science_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -566,17 +573,17 @@ //Service (Grey) counter = 0 jobs += "
    Science Positions
    Science Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.service_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -587,17 +594,17 @@ //Supply (Brown) counter = 0 jobs += "
    Service Positions
    Service Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.supply_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -608,17 +615,17 @@ //Non-Human (Green) counter = 0 jobs += "
    Supply Positions
    Supply Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " - jobs += "" + jobs += "" for(var/jobPos in GLOB.nonhuman_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" counter++ else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -627,29 +634,29 @@ //Drone if(jobban_isbanned(M, "Drone")) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" //pAI if(jobban_isbanned(M, "pAI")) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" jobs += "
    Non-human Positions
    Non-human Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]DroneDroneDroneDronepAIpAIpAIpAI
    " //Antagonist (Orange) var/isbanned_dept = jobban_isbanned(M, "Syndicate") jobs += "" - jobs += "" + jobs += "" counter = 0 for(var/role in GLOB.antag_roles) if(jobban_isbanned(M, role) || isbanned_dept) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -664,9 +671,9 @@ counter = 0 for(var/role in GLOB.other_roles) if(jobban_isbanned(M, role) || isbanned_dept) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" counter++ if(counter >= 5) //So things dont get squiiiiished! @@ -762,7 +769,7 @@ //Banning comes first if(length(notbannedlist)) //at least 1 unbanned job exists in joblist so we have stuff to ban. - switch(alert("Temporary Ban of [M.ckey]?", null,"Yes","No", "Cancel")) + switch(alert("Temporary Ban of [M.last_known_ckey]?", null,"Yes","No", "Cancel")) if("Yes") var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) @@ -780,7 +787,7 @@ msg = job else msg += ", [job]" - add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) + add_note(M.last_known_ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) // Reload their job ban holder (refresh this round) @@ -803,7 +810,7 @@ msg = job else msg += ", [job]" - add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) + add_note(M.last_known_ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) // Reload their job ban holder (refresh this round) @@ -908,7 +915,7 @@ return var/ban_ckey_param = href_list["dbbanaddckey"] - switch(alert("Temporary Ban of [M.ckey] / [ban_ckey_param]?", null,"Yes","No", "Cancel")) + switch(alert("Temporary Ban of [M.last_known_ckey] / [ban_ckey_param]?", null,"Yes","No", "Cancel")) if("Yes") var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) @@ -921,15 +928,15 @@ to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].") to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes.") DB_ban_record(BANTYPE_TEMP, M, mins, reason) - add_note(M.ckey, "Banned for [mins] minutes - [reason]", null, usr.ckey, FALSE) + add_note(M.last_known_ckey, "Banned for [mins] minutes - [reason]", null, usr.ckey, FALSE) if(M.client) M.client.link_forum_account(TRUE) if(GLOB.configuration.url.banappeals_url) to_chat(M, "To try to resolve this matter head to [GLOB.configuration.url.banappeals_url]") else to_chat(M, "No ban appeals URL has been set.") - log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") + log_admin("[key_name(usr)] has banned [M.last_known_ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") + message_admins("[key_name_admin(usr)] has banned [M.last_known_ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") qdel(M.client) if("No") @@ -944,10 +951,10 @@ to_chat(M, "To try to resolve this matter head to [GLOB.configuration.url.banappeals_url]") else to_chat(M, "No ban appeals URL has been set.") - log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") - message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") + log_admin("[key_name(usr)] has banned [M.last_known_ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") + message_admins("[key_name_admin(usr)] has banned [M.last_known_ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") DB_ban_record(BANTYPE_PERMA, M, -1, reason) - add_note(M.ckey, "Permanently banned - [reason]", null, usr.ckey, FALSE) + add_note(M.last_known_ckey, "Permanently banned - [reason]", null, usr.ckey, FALSE) qdel(M.client) if("Cancel") @@ -1041,6 +1048,20 @@ dat += {"Now: [GLOB.secret_force_mode]"} usr << browse(dat, "window=f_secret") + else if(href_list["f_dynamic"]) + if(!check_rights(R_ADMIN)) return + + if(SSticker && SSticker.mode) + return alert(usr, "The game has already started.", null, null, null, null) + if(GLOB.master_mode != "dynamic" && !(GLOB.master_mode == "secret" && GLOB.secret_force_mode == "dynamic")) + return alert(usr, "The game mode has to be dynamic!", null, null, null, null) + var/dat = {"Possible Rulesets:
    "} + var/list/rulesets = subtypesof(/datum/ruleset) - typesof(/datum/ruleset/implied) + dat += {"Budget: [isnull(GLOB.dynamic_forced_rulesets["budget"]) ? "Random" : GLOB.dynamic_forced_rulesets["budget"]]
    "} + for(var/datum/ruleset/ruleset as anything in rulesets) + dat += {"[ruleset.name]: [GLOB.dynamic_forced_rulesets[ruleset] || DYNAMIC_RULESET_NORMAL]
    "} + usr << browse(dat, "window=f_dynamic") + else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) return @@ -1067,6 +1088,44 @@ Game() // updates the main game menu .(href, list("f_secret"=1)) + else if(href_list["f_dynamic2"]) + if(!check_rights(R_ADMIN|R_SERVER)) return + + if(SSticker && SSticker.mode) + return alert(usr, "The game has already started.", null, null, null, null) + if(GLOB.master_mode != "dynamic" && !(GLOB.master_mode == "secret" && GLOB.secret_force_mode == "dynamic")) + return alert(usr, "The game mode has to be dynamic!", null, null, null, null) + if(href_list["f_dynamic2"] == "budget") + var/budget = input(usr, "Pick a budget for the dynamic gamemode (-1 to randomize)", "Gamemode Budget") as num|null + if(isnull(budget)) + return + if(budget < 0) + GLOB.dynamic_forced_rulesets -= "budget" + log_admin("[key_name(usr)] set the ruleset budget to random.") + message_admins("[key_name_admin(usr)] set the ruleset budget to random.") + else + GLOB.dynamic_forced_rulesets["budget"] = budget + log_admin("[key_name(usr)] set the ruleset budget to [budget]") + message_admins("[key_name_admin(usr)] set the ruleset budget to [budget].") + .(href, list("f_dynamic"=1)) + return + + var/datum/ruleset/ruleset = text2path(href_list["f_dynamic2"]) + switch(GLOB.dynamic_forced_rulesets[ruleset]) + if(DYNAMIC_RULESET_FORCED) + log_admin("[key_name(usr)] banned the [ruleset] ruleset.") + message_admins("[key_name_admin(usr)] banned the [ruleset.name] ([ruleset.type]) ruleset.") + GLOB.dynamic_forced_rulesets[ruleset] = DYNAMIC_RULESET_BANNED + if(DYNAMIC_RULESET_BANNED) + log_admin("[key_name(usr)] set the [ruleset] ruleset to normal.") + message_admins("[key_name_admin(usr)] set the [ruleset.name] ([ruleset.type]) ruleset to normal.") + GLOB.dynamic_forced_rulesets[ruleset] = DYNAMIC_RULESET_NORMAL + else // not set, and already at normal + log_admin("[key_name(usr)] forced the [ruleset] ruleset.") + message_admins("[key_name_admin(usr)] forced the [ruleset.name] ([ruleset.type]) ruleset.") + GLOB.dynamic_forced_rulesets[ruleset] = DYNAMIC_RULESET_FORCED + .(href, list("f_dynamic"=1)) + else if(href_list["monkeyone"]) if(!check_rights(R_SPAWN)) return @@ -2931,7 +2990,7 @@ SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Depower all APCs") log_and_message_admins("[key_name_admin(usr)] made all areas unpowered", 1) else - power_failure() + power_failure(TRUE, 100) SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Short out APCs") log_and_message_admins("[key_name_admin(usr)] has shorted APCs", 1) if("quickpower") diff --git a/code/modules/admin/verbs/deathsquad.dm b/code/modules/admin/verbs/deathsquad.dm index b65274f5f3b0..dd526796c258 100644 --- a/code/modules/admin/verbs/deathsquad.dm +++ b/code/modules/admin/verbs/deathsquad.dm @@ -40,15 +40,17 @@ GLOBAL_VAR_INIT(deathsquad_sent, FALSE) SEND_SOUND(AI, notice_sound) AI.show_laws() var/obj/item/radio/headset/heads/ai_integrated/ai_radio = AI.get_radio() - ai_radio.make_epsilon() + ai_radio.channels |= list("Response Team" = 1, "Special Ops" = 1) + ai_radio.config(ai_radio.channels) for(var/mob/living/silicon/robot/R in AI.connected_robots) R.sync() to_chat(R, "Central command has uploaded a new set of laws you must follow. Make sure you follow them.") SEND_SOUND(R, notice_sound) R.show_laws() - var/obj/item/radio/headset/heads/ai_integrated/cyberg_radio = R.get_radio() - cyberg_radio.make_epsilon() + var/obj/item/radio/borg/cyborg_radio = R.get_radio() + cyborg_radio.channels |= list("Response Team" = 1, "Special Ops" = 1) + cyborg_radio.config(cyborg_radio.channels) // Locates commandos spawns var/list/commando_spawn_locations = list() diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 5d1a9a665298..86f792611c52 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -208,57 +208,12 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) //this will protect us from a fair few errors ~Carn while(argnum--) - var/class = null - // Make a list with each index containing one variable, to be given to the proc - if(src.holder && src.holder.marked_datum) - class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","reference in range","reference in view", "mob reference","icon","file","client","mob's area","Marked datum ([holder.marked_datum.type])","CANCEL") - if(holder.marked_datum && class == "Marked datum ([holder.marked_datum.type])") - class = "Marked datum" - else - class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","reference in range","reference in view","icon","file","client","mob's area","CANCEL") - switch(class) - if("CANCEL") - return null - - if("text") - lst += clean_input("Enter new text:","Text",null) - - if("num") - lst += input("Enter new number:","Num",0) as num - - if("type") - lst += input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf) - - if("reference") - lst += input("Select reference:","Reference",src) as mob|obj|turf|area in world - - if("reference in range") - lst += input("Select reference in range:", "Reference in range", src) as mob|obj|turf|area in range(view) - - if("reference in view") - lst += input("Select reference in view:", "Reference in view", src) as mob|obj|turf|area in view(view) - - if("mob reference") - lst += input("Select reference:","Reference",usr) as mob in world - - if("file") - lst += input("Pick file:","File") as file - - if("icon") - lst += input("Pick icon:","Icon") as icon - - if("client") - var/list/keys = list() - for(var/mob/M in world) - keys += M.client - lst += input("Please, select a player!", "Selection", null, null) as null|anything in keys - - if("mob's area") - var/mob/temp = input("Select mob", "Selection", usr) as mob in world - lst += temp.loc + var/list/value = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) + var/class = value["class"] + if(!class) + return null - if("Marked datum") - lst += holder.marked_datum + lst += value["value"] return lst /client/proc/Cell() diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index e4bbb76dddca..281128b092cc 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -87,6 +87,9 @@ GLOBAL_PROTECT(VVmaint_only) VV_NEW_DATUM, VV_NEW_TYPE, VV_NEW_LIST, + VV_VISIBLE_ATOM, + VV_INSIDE_VISIBLE_ATOM, + VV_VISIBLE_TURF, VV_NULL, VV_RESTORE_DEFAULT ) @@ -211,6 +214,45 @@ GLOBAL_PROTECT(VVmaint_only) .["value"] = things[value] + if(VV_VISIBLE_ATOM) + var/atom/clicked = prompt_for_atom_click("Click an atom.") + if(!clicked) + .["class"] = null + return + .["value"] = clicked + if(VV_INSIDE_VISIBLE_ATOM) + var/atom/clicked = prompt_for_atom_click("Click an atom to search inside.") + if(!clicked) + .["class"] = null + return + + // Collect everything inside the atom. + var/list/ancestors = list(clicked) + var/list/descendants = list() + while(length(ancestors) > 0 && length(descendants) < 100) + var/atom/ancestor = ancestors[length(ancestors)] + ancestors.len-- + for(var/atom/child in ancestor) + ancestors += child + descendants += child + + // Prompt for which to pick. + var/descendant = input("Pick an atom:", "Inside a Visible Atom", src) in descendants + if(!descendant) + .["class"] = null + return + .["value"] = descendant + if(VV_VISIBLE_TURF) + var/atom/clicked = prompt_for_atom_click("Pick a turf (or any atom on it).") + if(!clicked) + .["class"] = null + return + var/turf/where = get_turf(clicked) + if(!where) + .["class"] = null + return + .["value"] = where + if(VV_CLIENT) .["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients @@ -557,6 +599,24 @@ GLOBAL_PROTECT(VVmaint_only) return TRUE +/datum/click_intercept/pick_atom + var/picked = null + +/datum/click_intercept/pick_atom/InterceptClickOn(user, params, atom/object) + picked = object + +/client/proc/prompt_for_atom_click(prompt = "Click something!") + to_chat(src, "[prompt]") + var/datum/click_intercept/pick_atom/picker = new(src) + while(isnull(picker.picked)) + if(isnull(src) || click_intercept != picker) + return null + sleep(1) + + click_intercept = null + return picker.picked + + /client/proc/modify_variables(atom/O, param_var_name = null, autodetect_class = 0) if(!check_rights(R_VAREDIT)) return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 665c1bac2b9f..ca0092f88aed 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -21,6 +21,7 @@ Make Vampires
    Make Abductor Team (Requires Ghosts)
    Make Mindflayers
    + Make Event Characters
    "} usr << browse(dat, "window=oneclickantag;size=400x400") return @@ -68,9 +69,10 @@ H = pick(candidates) H.mind.make_Traitor() candidates.Remove(H) + message_admins("[key_name(owner)] made [key_name_admin(H)] a Traitor with One-Click-Antag") - return 1 - return 0 + return TRUE + return FALSE /datum/admins/proc/makeChangelings() @@ -99,9 +101,10 @@ H = pick(candidates) H.mind.add_antag_datum(/datum/antagonist/changeling) candidates.Remove(H) + message_admins("[key_name(owner)] made [key_name_admin(H)] a Changeling with One-Click-Antag") - return 1 - return 0 + return TRUE + return FALSE /datum/admins/proc/makeRevs() @@ -129,14 +132,15 @@ H = pick(candidates) H?.mind?.add_antag_datum(/datum/antagonist/rev/head) candidates.Remove(H) - return 1 - return 0 + message_admins("[key_name(owner)] made [key_name_admin(H)] a Revolutionary with One-Click-Antag") + return TRUE + return FALSE /datum/admins/proc/makeWizard() var/confirm = alert("Are you sure?", "Confirm creation", "Yes", "No") if(confirm != "Yes") - return 0 + return FALSE var/image/I = new('icons/mob/simple_human.dmi', "wizard") var/list/candidates = SSghost_spawns.poll_candidates("Do you wish to be considered for the position of a Wizard Federation 'diplomat'?", "wizard", source = I) @@ -150,6 +154,7 @@ var/mob/living/carbon/human/new_character = makeBody(selected) new_character.mind.add_antag_datum(/datum/antagonist/wizard) new_character.forceMove(pick(GLOB.wizardstart)) + message_admins("[key_name(owner)] made [key_name_admin(new_character)] a Wizard with One-Click-Antag") dust_if_respawnable(selected) return TRUE return FALSE @@ -183,6 +188,7 @@ var/datum/antagonist/cultist/cultist = H.mind.add_antag_datum(/datum/antagonist/cultist) cultist.equip_roundstart_cultist(H) + message_admins("[key_name(owner)] made [key_name_admin(H)] a Cultist with One-Click-Antag") return TRUE //Abductors @@ -190,13 +196,13 @@ var/confirm = alert("Are you sure?", "Confirm creation", "Yes", "No") if(confirm != "Yes") - return 0 + return FALSE new /datum/event/abductor log_admin("[key_name(owner)] tried making Abductors with One-Click-Antag") message_admins("[key_name_admin(owner)] tried making Abductors with One-Click-Antag") - return 1 + return TRUE /datum/admins/proc/makeAliens() var/antnum = input(owner, "How many aliens you want to create? Enter 0 to cancel.","Amount:", 0) as num @@ -283,10 +289,11 @@ for(var/i = 0, i[owner.p_their(TRUE)] [owner.l_hand == src ? "left arm" : "right arm"] has been turned into a grotesque tentacle." @@ -294,7 +308,8 @@ /obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0) var/mob/living/carbon/human/H = firer - qdel(source.gun) + source.gun.hit_something = TRUE + source.gun.check_should_delete() if(blocked >= 100) return FALSE if(isitem(target)) @@ -353,8 +368,8 @@ add_attack_logs(H, C, "imobilised with a changeling tentacle") if(!iscarbon(H)) return TRUE - var/obj/item/restraints/legcuffs/beartrap/changeling/B = new(H.loc) - B.Crossed(C) + var/obj/item/restraints/legcuffs/beartrap/changeling/B = new(get_turf(L)) + B.on_atom_entered(C, L) return TRUE if(INTENT_HARM) @@ -418,8 +433,6 @@ flags = NODROP | DROPDEL icon_state = "ling_shield" - var/remaining_uses = 6 - /obj/item/shield/changeling/Initialize(mapload) . = ..() AddComponent(/datum/component/parry, _stamina_constant = 2, _stamina_coefficient = 0.5, _parryable_attack_types = ALL_ATTACK_TYPES) @@ -427,22 +440,6 @@ loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") playsound(loc, 'sound/effects/bone_break_1.ogg', 100, TRUE) -/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - SEND_SIGNAL(owner, COMSIG_HUMAN_PARRY) - . = ..() - if(!.) - return - if(remaining_uses < 1) - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.visible_message("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!", "We assimilate our shield into our body", "You hear organic matter ripping and tearing!") - playsound(loc, 'sound/effects/bone_break_2.ogg', 100, TRUE) - H.unequip(src, force = TRUE) - qdel(src) - return FALSE - else - remaining_uses-- - /***************************************\ |*********SPACE SUIT + HELMET***********| \***************************************/ diff --git a/code/modules/antagonists/changeling/powers/summon_spiders.dm b/code/modules/antagonists/changeling/powers/summon_spiders.dm index e535b7319f1d..d693bfd37217 100644 --- a/code/modules/antagonists/changeling/powers/summon_spiders.dm +++ b/code/modules/antagonists/changeling/powers/summon_spiders.dm @@ -114,7 +114,7 @@ switch(current_order) if(IDLE_AGGRESSIVE) Find_Enemies(around) - walk(src, 0) + GLOB.move_manager.stop_looping(src) if(FOLLOW_AGGRESSIVE) Find_Enemies(around) for(var/mob/living/carbon/C in around) @@ -131,7 +131,7 @@ return TRUE Goto(C, 0.5 SECONDS, 1) if(IDLE_RETALIATE) - walk(src, 0) + GLOB.move_manager.stop_looping(src) for(var/mob/living/simple_animal/hostile/poison/giant_spider/hunter/infestation_spider/H in around) if(faction_check_mob(H) && !attack_same && !H.attack_same) diff --git a/code/modules/antagonists/mind_flayer/flayer_datum.dm b/code/modules/antagonists/mind_flayer/flayer_datum.dm index 637bcd1d7884..d8ec8a391496 100644 --- a/code/modules/antagonists/mind_flayer/flayer_datum.dm +++ b/code/modules/antagonists/mind_flayer/flayer_datum.dm @@ -1,8 +1,9 @@ /datum/antagonist/mindflayer name = "Mindflayer" + job_rank = ROLE_MIND_FLAYER + special_role = SPECIAL_ROLE_MIND_FLAYER antag_hud_type = ANTAG_HUD_MIND_FLAYER antag_hud_name = "hudflayer" - special_role = SPECIAL_ROLE_MIND_FLAYER wiki_page_name = "Mindflayer" /// The current amount of swarms the mind flayer has access to purchase with var/usable_swarms = 0 diff --git a/code/modules/antagonists/mind_flayer/powers/flayer_passives.dm b/code/modules/antagonists/mind_flayer/powers/flayer_passives.dm index f0a0c5d92705..a40f554ccec4 100644 --- a/code/modules/antagonists/mind_flayer/powers/flayer_passives.dm +++ b/code/modules/antagonists/mind_flayer/powers/flayer_passives.dm @@ -272,6 +272,7 @@ return // TODO, add a refund proc? user_eyes.AddComponent(/datum/component/scope, item_action_type = /datum/action/item_action/organ_action/toggle, flags = SCOPE_CLICK_MIDDLE) for(var/datum/action/action in user_eyes.actions) + action.button_background_icon_state = "bg_flayer" action.Grant(owner) /datum/mindflayer_passive/telescopic_eyes/on_remove() @@ -345,6 +346,7 @@ if(!internal_jammer) internal_jammer = new /obj/item/jammer(owner) //Shove it in the flayer's chest for(var/datum/action/action in internal_jammer.actions) + action.button_background_icon_state = "bg_flayer" action.Grant(owner) internal_jammer.range = 15 + ((level - 1) * 5) //Base range of the jammer is 15, each level adds 5 tiles for a max of 25 if you want to be REALLY annoying diff --git a/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm index 86d432cb229d..139bd798c340 100644 --- a/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm @@ -423,11 +423,10 @@ M.update_icons() // Supply them with some chow. How generous is the Syndicate? - var/obj/item/food/breadslice/food = new(get_turf(M)) + var/obj/item/food/sliced/bread/food = new(get_turf(M)) food.name = "stale bread" food.desc = "Looks like your captors care for their prisoners as much as their bread." food.trash = null - food.reagents.add_reagent("nutriment", 5) // It may be stale, but it still has to be nutritive enough for the whole duration! if(prob(10)) // Mold adds a bit of spice to it food.name = "moldy bread" diff --git a/code/modules/antagonists/traitor/datum_mindslave.dm b/code/modules/antagonists/traitor/datum_mindslave.dm index 09beb78be3ca..0e9f58ed6c3b 100644 --- a/code/modules/antagonists/traitor/datum_mindslave.dm +++ b/code/modules/antagonists/traitor/datum_mindslave.dm @@ -4,7 +4,7 @@ RESTRICT_TYPE(/datum/antagonist/mindslave) /datum/antagonist/mindslave name = "Mindslave" roundend_category = "mindslaves" - job_rank = SPECIAL_ROLE_TRAITOR + job_rank = ROLE_TRAITOR special_role = SPECIAL_ROLE_TRAITOR antag_hud_type = ANTAG_HUD_TRAITOR antag_hud_name = "mindslave" // This isn't named "hudmindslave" because `add_serve_hud()` adds "hud" to the beginning. diff --git a/code/modules/antagonists/vampire/vamp_datum.dm b/code/modules/antagonists/vampire/vamp_datum.dm index b6e97c0c6717..3a83ef87e088 100644 --- a/code/modules/antagonists/vampire/vamp_datum.dm +++ b/code/modules/antagonists/vampire/vamp_datum.dm @@ -2,9 +2,10 @@ RESTRICT_TYPE(/datum/antagonist/vampire) /datum/antagonist/vampire name = "Vampire" + job_rank = ROLE_VAMPIRE + special_role = SPECIAL_ROLE_VAMPIRE antag_hud_type = ANTAG_HUD_VAMPIRE antag_hud_name = "hudvampire" - special_role = SPECIAL_ROLE_VAMPIRE wiki_page_name = "Vampire" var/bloodtotal = 0 var/bloodusable = 0 diff --git a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm index 1f08f7b4289f..dd05286e2fc9 100644 --- a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm @@ -126,7 +126,7 @@ /datum/spell/vampire/blood_tendrils name = "Blood Tendrils (10)" - desc = "You summon blood tendrils from bluespace after a delay to ensnare people in an area, slowing them down." + desc = "You summon a small field of horrific blood tendrils after a delay to ensnare people in an area, slowing them down." gain_desc = "You have gained the ability to summon blood tendrils to slow people down in an area that you target." required_blood = 10 @@ -135,7 +135,7 @@ sound = 'sound/misc/enter_blood.ogg' var/area_of_affect = 1 - selection_activated_message = "You channel blood magics to weaken the bluespace veil. Left-click to cast at a target area!" + selection_activated_message = "You prepare to summon a set of blood tendrils. Left-click to cast at a target area!" selection_deactivated_message = "Your magics subside." /datum/spell/vampire/blood_tendrils/create_new_targeting() diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index dbf3db54bf48..eaa1db69004a 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -56,18 +56,18 @@ to_chat(user, "Someone else is already playing this machine, please wait your turn!") return -/obj/machinery/economy/arcade/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/economy/arcade/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(!freeplay) - if(isspacecash(O)) - insert_cash(O, user, token_price) + if(isspacecash(used)) + insert_cash(used, user, token_price) if(pay_with_cash(token_price, "Arcade Token Purchase", "DonkBook Gaming", user, account_database.vendor_account)) tokens += 1 - return + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/card/id)) - if(pay_with_card(O, token_price, "Arcade Token Purchase", "DonkBook Gaming", user, account_database.vendor_account)) + if(istype(used, /obj/item/card/id)) + if(pay_with_card(used, token_price, "Arcade Token Purchase", "DonkBook Gaming", user, account_database.vendor_account)) tokens += 1 - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/arcade/claw_game.dm b/code/modules/arcade/claw_game.dm index ccd8d1e40cd9..8a6106da2cb4 100644 --- a/code/modules/arcade/claw_game.dm +++ b/code/modules/arcade/claw_game.dm @@ -78,3 +78,7 @@ GLOBAL_VAR(claw_game_html) close_game() if(prize_won == "1") win() + +/obj/machinery/economy/arcade/claw/syndi + desc = "No longer one of the most infuriating ways to win a toy, thanks to the hacking device granting infinite credits." + freeplay = TRUE diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 3bab7848f10a..8c787c3435ce 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -79,18 +79,18 @@ else icon_state = "prize_counter-on" -/obj/machinery/prize_counter/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(istype(O, /obj/item/stack/tickets)) - var/obj/item/stack/tickets/T = O +/obj/machinery/prize_counter/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/stack/tickets)) + var/obj/item/stack/tickets/T = used if(user.drop_item_to_ground(T)) tickets += T.amount SStgui.update_uis(src) qdel(T) else to_chat(user, "\The [T] seems stuck to your hand!") - return + return ITEM_INTERACT_COMPLETE if(panel_open) - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 687e79881db1..c1ecfb423eed 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -234,7 +234,7 @@ /obj/effect/beam/i_beam/update_icon_state() transform = turn(matrix(), dir2angle(dir)) -/obj/effect/beam/i_beam/Process_Spacemove(movement_dir) +/obj/effect/beam/i_beam/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /obj/effect/beam/i_beam/process() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 8a845f5994ad..636bf12a99e3 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -129,9 +129,9 @@ if(direction == 0) return - if(last_high_pressure_movement_time >= SSair.times_fired - 3) + if(last_high_pressure_movement_time >= SSair.milla_tick - 3) return - last_high_pressure_movement_time = SSair.times_fired + last_high_pressure_movement_time = SSair.milla_tick air_push(direction, (force - force_needed) / force_needed) @@ -171,11 +171,11 @@ #define INDEX_SOUTH 3 #define INDEX_WEST 4 -/turf/proc/Initialize_Atmos(times_fired) +/turf/proc/Initialize_Atmos(milla_tick) // This is one of two places expected to call this otherwise-unsafe method. - private_unsafe_recalculate_atmos_connectivity() + var/list/connectivity = private_unsafe_recalculate_atmos_connectivity() var/list/air = list(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature) - milla_data = milla_atmos_airtight + list(atmos_mode, SSmapping.environments[atmos_environment]) + air + milla_superconductivity + milla_data = connectivity[1] + list(atmos_mode, SSmapping.environments[atmos_environment]) + air + connectivity[2] /turf/proc/recalculate_atmos_connectivity() var/datum/milla_safe/recalculate_atmos_connectivity/milla = new() @@ -188,26 +188,26 @@ return // This is one of two places expected to call this otherwise-unsafe method. - T.private_unsafe_recalculate_atmos_connectivity() + var/list/connectivity = T.private_unsafe_recalculate_atmos_connectivity() - set_tile_airtight(T, T.milla_atmos_airtight) + set_tile_airtight(T, connectivity[1]) reset_superconductivity(T) - reduce_superconductivity(T, T.milla_superconductivity) + reduce_superconductivity(T, connectivity[2]) /// This method is unsafe to use because it only updates milla_* properties, but does not write them to MILLA. Use recalculate_atmos_connectivity() instead. /turf/proc/private_unsafe_recalculate_atmos_connectivity() if(blocks_air) - milla_atmos_airtight = list(TRUE, TRUE, TRUE, TRUE) - milla_superconductivity = list(0, 0, 0, 0) - return + var/milla_atmos_airtight = list(TRUE, TRUE, TRUE, TRUE) + var/milla_superconductivity = list(0, 0, 0, 0) + return list(milla_atmos_airtight, milla_superconductivity) - milla_atmos_airtight = list( + var/milla_atmos_airtight = list( !CanAtmosPass(NORTH, FALSE), !CanAtmosPass(EAST, FALSE), !CanAtmosPass(SOUTH, FALSE), !CanAtmosPass(WEST, FALSE)) - milla_superconductivity = list( + var/milla_superconductivity = list( OPEN_HEAT_TRANSFER_COEFFICIENT, OPEN_HEAT_TRANSFER_COEFFICIENT, OPEN_HEAT_TRANSFER_COEFFICIENT, @@ -230,6 +230,8 @@ milla_superconductivity[INDEX_SOUTH] = min(milla_superconductivity[INDEX_SOUTH], O.get_superconductivity(SOUTH)) milla_superconductivity[INDEX_WEST] = min(milla_superconductivity[INDEX_WEST], O.get_superconductivity(WEST)) + return list(milla_atmos_airtight, milla_superconductivity) + /obj/effect/wind anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -238,6 +240,14 @@ layer = MASSIVE_OBJ_LAYER blend_mode = BLEND_OVERLAY + // See comment on attempt_init. + initialized = TRUE + +// Wind has nothing it needs to initialize, and it's not surprising if it gets both created and qdeleted during an init freeze. Prevent that from causing an init sanity error. +/obj/effect/wind/attempt_init(...) + initialized = TRUE + return + #undef INDEX_NORTH #undef INDEX_EAST #undef INDEX_SOUTH diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 7bfd1fa004ec..510b981fceec 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -114,12 +114,10 @@ What are the archived variables for? /// Calculate moles /datum/gas_mixture/proc/total_moles() - var/moles = private_oxygen + private_carbon_dioxide + private_nitrogen + private_toxins + private_sleeping_agent + private_agent_b - return moles + return private_oxygen + private_carbon_dioxide + private_nitrogen + private_toxins + private_sleeping_agent + private_agent_b /datum/gas_mixture/proc/total_trace_moles() - var/moles = private_agent_b - return moles + return private_agent_b /// Calculate pressure in kilopascals /datum/gas_mixture/proc/return_pressure() @@ -662,23 +660,26 @@ What are the archived variables for? /proc/share_many_airs(list/mixtures) var/total_volume = 0 - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 var/total_oxygen = 0 var/total_nitrogen = 0 var/total_toxins = 0 var/total_carbon_dioxide = 0 var/total_sleeping_agent = 0 var/total_agent_b = 0 + var/must_share = FALSE + // Collect all the cheap data and check if there's a significant temperature difference. + var/temperature = null for(var/datum/gas_mixture/G as anything in mixtures) if(!istype(G)) stack_trace("share_many_airs had [G] in mixtures ([json_encode(mixtures)])") continue total_volume += G.volume - var/heat_capacity = G.heat_capacity() - total_heat_capacity += heat_capacity - total_thermal_energy += G.private_temperature * heat_capacity + + if(isnull(temperature)) + temperature = G.private_temperature + else if(abs(temperature - G.private_temperature) >= 1) + must_share = TRUE total_oxygen += G.private_oxygen total_nitrogen += G.private_nitrogen @@ -687,26 +688,65 @@ What are the archived variables for? total_sleeping_agent += G.private_sleeping_agent total_agent_b += G.private_agent_b - if(total_volume > 0) - //Calculate temperature - var/temperature = 0 - - if(total_heat_capacity > 0) - temperature = total_thermal_energy/total_heat_capacity + if(total_volume <= 0) + return - //Update individual gas_mixtures by volume ratio + // If we don't have a significant temperature difference, check for a significant gas amount difference. + if(!must_share) for(var/datum/gas_mixture/G as anything in mixtures) if(!istype(G)) continue - G.private_oxygen = total_oxygen * G.volume / total_volume - G.private_nitrogen = total_nitrogen * G.volume / total_volume - G.private_toxins = total_toxins * G.volume / total_volume - G.private_carbon_dioxide = total_carbon_dioxide * G.volume / total_volume - G.private_sleeping_agent = total_sleeping_agent * G.volume / total_volume - G.private_agent_b = total_agent_b * G.volume / total_volume + if(abs(G.private_oxygen - total_oxygen * G.volume / total_volume) > 0.1) + must_share = TRUE + break + if(abs(G.private_nitrogen - total_nitrogen * G.volume / total_volume) > 0.1) + must_share = TRUE + break + if(abs(G.private_toxins - total_toxins * G.volume / total_volume) > 0.1) + must_share = TRUE + break + if(abs(G.private_carbon_dioxide - total_carbon_dioxide * G.volume / total_volume) > 0.1) + must_share = TRUE + break + if(abs(G.private_sleeping_agent - total_sleeping_agent * G.volume / total_volume) > 0.1) + must_share = TRUE + break + if(abs(G.private_agent_b - total_agent_b * G.volume / total_volume) > 0.1) + must_share = TRUE + break + + if(!must_share) + // Nothing significant, don't do any more work. + return + + // Collect the more expensive data. + var/total_thermal_energy = 0 + var/total_heat_capacity = 0 + for(var/datum/gas_mixture/G as anything in mixtures) + if(!istype(G)) + continue + var/heat_capacity = G.heat_capacity() + total_heat_capacity += heat_capacity + total_thermal_energy += G.private_temperature * heat_capacity + + // Calculate shared temperature. + temperature = TCMB + if(total_heat_capacity > 0) + temperature = total_thermal_energy/total_heat_capacity + + // Update individual gas_mixtures by volume ratio. + for(var/datum/gas_mixture/G as anything in mixtures) + if(!istype(G)) + continue + G.private_oxygen = total_oxygen * G.volume / total_volume + G.private_nitrogen = total_nitrogen * G.volume / total_volume + G.private_toxins = total_toxins * G.volume / total_volume + G.private_carbon_dioxide = total_carbon_dioxide * G.volume / total_volume + G.private_sleeping_agent = total_sleeping_agent * G.volume / total_volume + G.private_agent_b = total_agent_b * G.volume / total_volume - G.private_temperature = temperature - G.set_dirty() + G.private_temperature = temperature + // In theory, we should G.set_dirty() here, but that's only useful for bound mixtures, and these can't be. /datum/gas_mixture/proc/hotspot_expose(temperature, volume) return @@ -722,6 +762,7 @@ What are the archived variables for? #undef QUANTIZE /datum/gas_mixture/bound_to_turf + synchronized = FALSE var/dirty = FALSE var/lastread = 0 var/turf/bound_turf = null diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 9e86fa0c13eb..5216ac330ebd 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -222,6 +222,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list( set_pixel_offsets_from_dir(24, -24, 24, -24) GLOB.air_alarms += src + alarm_area.air_alarms += src if(!mapload) GLOB.air_alarms = sortAtom(GLOB.air_alarms) @@ -231,17 +232,12 @@ GLOBAL_LIST_INIT(aalarm_modes, list( if(!building) first_run() - if(!master_is_operating()) - elect_master() - /obj/machinery/alarm/Destroy() SStgui.close_uis(wires) GLOB.air_alarms -= src + alarm_area.air_alarms -= src GLOB.air_alarm_repository.update_cache(src) QDEL_NULL(wires) - if(alarm_area && alarm_area.master_air_alarm == src) - alarm_area.master_air_alarm = null - elect_master(exclude_self = 1) alarm_area = null return ..() @@ -249,24 +245,6 @@ GLOBAL_LIST_INIT(aalarm_modes, list( apply_preset(AALARM_PRESET_HUMAN) // Don't cycle. GLOB.air_alarm_repository.update_cache(src) -/obj/machinery/alarm/proc/master_is_operating() - if(!alarm_area) - alarm_area = get_area(src) - if(!alarm_area) - . = FALSE - CRASH("Air alarm /obj/machinery/alarm lacks alarm_area vars during proc/master_is_operating()") - return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) - - -/obj/machinery/alarm/proc/elect_master(exclude_self = 0) //Why is this an alarm and not area proc? - for(var/obj/machinery/alarm/AA in alarm_area) - if(exclude_self && AA == src) - continue - if(!(AA.stat & (NOPOWER|BROKEN))) - alarm_area.master_air_alarm = AA - return 1 - return 0 - /obj/machinery/alarm/process() if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2) return @@ -275,8 +253,9 @@ GLOBAL_LIST_INIT(aalarm_modes, list( if(!istype(location)) return 0 - var/datum/milla_safe/airalarm_heat_cool/milla = new() - milla.invoke_async(src) + if(thermostat_state) + var/datum/milla_safe/airalarm_heat_cool/milla = new() + milla.invoke_async(src) var/datum/gas_mixture/environment = location.get_readonly_air() var/GET_PP = R_IDEAL_GAS_EQUATION * environment.temperature() / environment.volume @@ -342,8 +321,6 @@ GLOBAL_LIST_INIT(aalarm_modes, list( var/turf/location = get_turf(alarm) var/datum/gas_mixture/environment = get_turf_air(location) - if(!alarm.thermostat_state) - return var/datum/tlv/cur_tlv = alarm.TLV["temperature"] //Handle temperature adjustment here. if(environment.temperature() < alarm.target_temperature - 2 || environment.temperature() > alarm.target_temperature + 2 || alarm.regulating_temperature) @@ -1021,14 +998,14 @@ GLOBAL_LIST_INIT(aalarm_modes, list( playsound(src.loc, 'sound/effects/sparks4.ogg', 50, TRUE) return TRUE -/obj/machinery/alarm/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/alarm/item_interaction(mob/living/user, obj/item/used, list/modifiers) add_fingerprint(user) switch(buildstage) if(AIR_ALARM_READY) - if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))// trying to unlock the interface with an ID card + if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) - return + return ITEM_INTERACT_COMPLETE if(allowed(user) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked @@ -1036,14 +1013,15 @@ GLOBAL_LIST_INIT(aalarm_modes, list( SStgui.update_uis(src) else to_chat(user, "Access denied.") - return + + return ITEM_INTERACT_COMPLETE if(AIR_ALARM_UNWIRED) - if(iscoil(I)) - var/obj/item/stack/cable_coil/coil = I + if(iscoil(used)) + var/obj/item/stack/cable_coil/coil = used if(coil.get_amount() < 5) to_chat(user, "You need more cable for this!") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You wire [src]!") playsound(get_turf(src), coil.usesound, 50, 1) @@ -1053,15 +1031,15 @@ GLOBAL_LIST_INIT(aalarm_modes, list( wiresexposed = TRUE update_icon(UPDATE_ICON_STATE | UPDATE_OVERLAYS) first_run() - return + return ITEM_INTERACT_COMPLETE if(AIR_ALARM_FRAME) - if(istype(I, /obj/item/airalarm_electronics)) - to_chat(user, "You insert [I] into [src].") - playsound(get_turf(src), I.usesound, 50, 1) - qdel(I) + if(istype(used, /obj/item/airalarm_electronics)) + to_chat(user, "You insert [used] into [src].") + playsound(get_turf(src), used.usesound, 50, TRUE) + qdel(used) buildstage = 1 update_icon(UPDATE_ICON_STATE) - return + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/alarm/crowbar_act(mob/user, obj/item/I) diff --git a/code/modules/atmospherics/machinery/atmospherics.dm b/code/modules/atmospherics/machinery/atmospherics.dm index 945b1a6c4daf..988048aaf556 100644 --- a/code/modules/atmospherics/machinery/atmospherics.dm +++ b/code/modules/atmospherics/machinery/atmospherics.dm @@ -256,11 +256,12 @@ Pipelines + Other Objects -> Pipe network return FALSE //(De)construction -/obj/machinery/atmospherics/attackby__legacy__attackchain(obj/item/W, mob/user) +/obj/machinery/atmospherics/item_interaction(mob/living/user, obj/item/used, list/modifiers) var/turf/T = get_turf(src) if(T.transparent_floor) to_chat(user, "You can't interact with something that's under the floor!") - return TRUE + return ITEM_INTERACT_COMPLETE + return ..() //Called when an atmospherics object is unwrenched while having a large pressure difference diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm index 5120a43c0ab8..7a8d2465e1f6 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm @@ -15,6 +15,8 @@ var/datum/pipeline/parent1 var/datum/pipeline/parent2 + new_attack_chain = TRUE + /obj/machinery/atmospherics/binary/New() ..() switch(dir) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 16f7ff116e73..c6c135990f95 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -157,8 +157,9 @@ Thus, the two variables affect pump operation are set in New(): return update_icon() -/obj/machinery/atmospherics/binary/pump/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(is_pen(W)) - rename_interactive(user, W) - return TRUE +/obj/machinery/atmospherics/binary/bump/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(is_pen(used)) + rename_interactive(user, used) + return ITEM_INTERACT_COMPLETE + return ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index a39e69c38732..0bae5c086d31 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -153,8 +153,9 @@ Thus, the two variables affect pump operation are set in New(): return update_icon() -/obj/machinery/atmospherics/binary/volume_pump/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(is_pen(W)) - rename_interactive(user, W) - return TRUE +/obj/machinery/atmospherics/binary/volume_pump/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(is_pen(used)) + rename_interactive(user, used) + return ITEM_INTERACT_COMPLETE + return ..() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 8ac8021ead3e..658862ea7836 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -227,12 +227,12 @@ if(.) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") -/obj/machinery/atmospherics/trinary/filter/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(is_pen(W)) - rename_interactive(user, W) - return - else - return ..() +/obj/machinery/atmospherics/trinary/filter/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(is_pen(used)) + rename_interactive(user, used) + return ITEM_INTERACT_COMPLETE + + return ..() #undef FILTER_NOTHING #undef FILTER_TOXINS diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 977ce8e4d18a..99d814a82192 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -201,9 +201,9 @@ if(.) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") -/obj/machinery/atmospherics/trinary/mixer/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(is_pen(W)) - rename_interactive(user, W) - return - else - return ..() +/obj/machinery/atmospherics/trinary/mixer/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(is_pen(used)) + rename_interactive(user, used) + return ITEM_INTERACT_COMPLETE + + return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 6ed09eda30bc..7e42703cae34 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -45,7 +45,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/power_change() ..() if(!(stat & (BROKEN | NOPOWER))) - set_light(2) + set_light(1.5, 1, LIGHT_COLOR_CYAN) else set_light(0) @@ -298,41 +298,42 @@ add_fingerprint(usr) -/obj/machinery/atmospherics/unary/cryo_cell/attackby__legacy__attackchain(obj/item/G, mob/user, params) - if(istype(G, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) - var/obj/item/reagent_containers/B = G +/obj/machinery/atmospherics/unary/cryo_cell/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) + var/obj/item/reagent_containers/B = used if(beaker) to_chat(user, "A beaker is already loaded into the machine.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) to_chat(user, "[B] is stuck to you!") - return + return ITEM_INTERACT_COMPLETE B.forceMove(src) beaker = B add_attack_logs(user, null, "Added [B] containing [B.reagents.log_list()] to a cryo cell at [COORD(src)]") user.visible_message("[user] adds \a [B] to [src]!", "You add \a [B] to [src]!") SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE - if(istype(G, /obj/item/grab)) - var/obj/item/grab/GG = G + if(istype(used, /obj/item/grab)) + var/obj/item/grab/GG = used if(panel_open) to_chat(user, "Close the maintenance panel first.") - return + return ITEM_INTERACT_COMPLETE if(!ismob(GG.affecting)) - return + return ITEM_INTERACT_COMPLETE if(GG.affecting.has_buckled_mobs()) //mob attached to us to_chat(user, "[GG.affecting] will not fit into [src] because [GG.affecting.p_they()] [GG.affecting.p_have()] a slime latched onto [GG.affecting.p_their()] head.") - return + return ITEM_INTERACT_COMPLETE var/mob/M = GG.affecting if(put_mob(M)) qdel(GG) - return + + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm index 60a7a1187a79..6ed29994f369 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm @@ -32,11 +32,11 @@ if(!partner) return 0 - if(!SSair || SSair.times_fired <= update_cycle) + if(!SSair || SSair.milla_tick <= update_cycle) return 0 - update_cycle = SSair.times_fired - partner.update_cycle = SSair.times_fired + update_cycle = SSair.milla_tick + partner.update_cycle = SSair.milla_tick var/air_heat_capacity = air_contents.heat_capacity() var/other_air_heat_capacity = partner.air_contents.heat_capacity() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_base.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_base.dm index a831588f4014..dbd529be80db 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_base.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_base.dm @@ -94,21 +94,14 @@ if(Old == parent) parent = New -/obj/machinery/atmospherics/unary/unsafe_pressure_release(mob/user, pressures) +/obj/machinery/atmospherics/unary/unsafe_pressure_release(mob/user, pressure) ..() var/turf/T = get_turf(src) - if(T) - var/datum/milla_safe/unary_unsafe_pressure_release/milla = new() - milla.invoke_async(src, pressures) - -/datum/milla_safe/unary_unsafe_pressure_release + if(!T) + return -/datum/milla_safe/unary_unsafe_pressure_release/on_run(obj/machinery/atmospherics/unary/device, pressures) - //Remove the gas from air_contents and assume it - var/turf/T = get_turf(device) - var/datum/gas_mixture/environment = get_turf_air(T) - var/lost = pressures * environment.volume / (device.air_contents.temperature() * R_IDEAL_GAS_EQUATION) + var/lost = pressure * CELL_VOLUME / (air_contents.temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/to_release = device.air_contents.remove(lost) - environment.merge(to_release) + var/datum/gas_mixture/to_release = air_contents.remove(lost) + T.blind_release_air(to_release) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 2743bfdd7f92..630da74b8e63 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -108,69 +108,71 @@ update_underlays() /obj/machinery/atmospherics/unary/vent_pump/process_atmos() - var/datum/milla_safe/vent_pump_process/milla = new() - milla.invoke_async(src) - -/datum/milla_safe/vent_pump_process - -/datum/milla_safe/vent_pump_process/on_run(obj/machinery/atmospherics/unary/vent_pump/vent_pump) - if(vent_pump.stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) return FALSE - if(QDELETED(vent_pump.parent)) + if(QDELETED(parent)) // We're orphaned! return FALSE - var/turf/T = get_turf(vent_pump) + var/turf/T = get_turf(src) if(T.density) //No, you should not be able to get free air from walls return - if(!vent_pump.node) - vent_pump.on = FALSE - if(!vent_pump.on) + if(!node) + on = FALSE + if(!on) return FALSE - if(vent_pump.welded) - if(vent_pump.air_contents.return_pressure() >= vent_pump.weld_burst_pressure && prob(5)) //the weld is on but the cover is welded shut, can it withstand the internal pressure? - vent_pump.visible_message("The welded cover of [vent_pump] bursts open!") + if(welded) + if(air_contents.return_pressure() >= weld_burst_pressure && prob(5)) //the weld is on but the cover is welded shut, can it withstand the internal pressure? + visible_message("The welded cover of [src] bursts open!") for(var/mob/living/M in range(1)) - vent_pump.unsafe_pressure_release(M, vent_pump.air_contents.return_pressure()) //let's send everyone flying - vent_pump.welded = FALSE - vent_pump.update_icon() + unsafe_pressure_release(M, air_contents.return_pressure()) //let's send everyone flying + welded = FALSE + update_icon() return FALSE - var/datum/gas_mixture/environment = get_turf_air(T) - var/environment_pressure = environment.return_pressure() - if(vent_pump.releasing) //internal -> external + var/datum/gas_mixture/environment = T.get_readonly_air() + if(releasing) //internal -> external var/pressure_delta = 10000 - if(vent_pump.pressure_checks == ONLY_CHECK_EXT_PRESSURE) + if(pressure_checks == ONLY_CHECK_EXT_PRESSURE) // Only checks difference between set pressure and environment pressure - pressure_delta = min(pressure_delta, (vent_pump.external_pressure_bound - environment_pressure)) - if(vent_pump.pressure_checks == ONLY_CHECK_INT_PRESSURE) - pressure_delta = min(pressure_delta, (vent_pump.air_contents.return_pressure() - vent_pump.internal_pressure_bound)) + pressure_delta = min(pressure_delta, (external_pressure_bound - environment.return_pressure())) + if(pressure_checks == ONLY_CHECK_INT_PRESSURE) + pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound)) - if(pressure_delta > 0.5 && vent_pump.air_contents.temperature() > 0) + if(pressure_delta > 0.5 && air_contents.temperature() > 0) // 1kPa * 1L = 1J var/wanted_joules = pressure_delta * environment.volume - var/transfer_moles = min(vent_pump.max_transfer_joules, wanted_joules) / (vent_pump.air_contents.temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = vent_pump.air_contents.remove(transfer_moles) - environment.merge(removed) - vent_pump.parent.update = TRUE + var/transfer_moles = min(max_transfer_joules, wanted_joules) / (air_contents.temperature() * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + // This isn't exactly "blind", but using the data from last tick is good enough for a vent. + T.blind_release_air(removed) + parent.update = TRUE else //external -> internal - var/pressure_delta = 10000 - if(vent_pump.pressure_checks == ONLY_CHECK_EXT_PRESSURE) - pressure_delta = min(pressure_delta, (environment_pressure - vent_pump.external_pressure_bound)) - if(vent_pump.pressure_checks == ONLY_CHECK_INT_PRESSURE) - pressure_delta = min(pressure_delta, (vent_pump.internal_pressure_bound - vent_pump.air_contents.return_pressure())) - - if(pressure_delta > 0.5 && environment.temperature() > 0) - // 1kPa * 1L = 1J - var/wanted_joules = pressure_delta * environment.volume - var/transfer_moles = min(vent_pump.max_transfer_joules, wanted_joules) / (environment.temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = environment.remove(transfer_moles) - vent_pump.air_contents.merge(removed) - vent_pump.parent.update = TRUE + var/datum/milla_safe/vent_pump_siphon/milla = new() + milla.invoke_async(src) return TRUE +/datum/milla_safe/vent_pump_siphon + +/datum/milla_safe/vent_pump_siphon/on_run(obj/machinery/atmospherics/unary/vent_pump/vent_pump) + var/turf/T = get_turf(vent_pump) + var/datum/gas_mixture/environment = get_turf_air(T) + var/pressure_delta = 10000 + if(vent_pump.pressure_checks == ONLY_CHECK_EXT_PRESSURE) + pressure_delta = min(pressure_delta, (environment.return_pressure() - vent_pump.external_pressure_bound)) + if(vent_pump.pressure_checks == ONLY_CHECK_INT_PRESSURE) + pressure_delta = min(pressure_delta, (vent_pump.internal_pressure_bound - vent_pump.air_contents.return_pressure())) + + if(pressure_delta > 0.5 && environment.temperature() > 0) + // 1kPa * 1L = 1J + var/wanted_joules = pressure_delta * environment.volume + var/transfer_moles = min(vent_pump.max_transfer_joules, wanted_joules) / (environment.temperature() * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = environment.remove(transfer_moles) + vent_pump.air_contents.merge(removed) + vent_pump.parent.update = TRUE + /obj/machinery/atmospherics/unary/vent_pump/can_crawl_through() return !welded @@ -184,17 +186,17 @@ pipe_image.plane = ABOVE_HUD_PLANE playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE) -/obj/machinery/atmospherics/unary/vent_pump/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(istype(W, /obj/item/paper)) +/obj/machinery/atmospherics/unary/vent_pump/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/paper)) if(!welded) if(open) - user.drop_item(W) - W.forceMove(src) + user.drop_item(used) + used.forceMove(src) if(!open) to_chat(user, "You can't shove that down there when it is closed") else to_chat(user, "The vent is welded.") - return TRUE + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 3066b5308b01..70b00ea21618 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -140,9 +140,31 @@ adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir=1) /obj/machinery/atmospherics/unary/vent_scrubber/proc/scrub(turf/simulated/tile) + if(!tile || !istype(tile)) + return 0 + + if(scrubbing && !should_scrub(tile.get_readonly_air())) + return 0 + var/datum/milla_safe/vent_scrubber_process/milla = new() milla.invoke_async(src, tile) +/obj/machinery/atmospherics/unary/vent_scrubber/proc/should_scrub(datum/gas_mixture/environment) + if(scrub_O2 && environment.oxygen() > 0.001) + return TRUE + if(scrub_N2 && environment.nitrogen() > 0.001) + return TRUE + if(scrub_CO2 && environment.carbon_dioxide() > 0.001) + return TRUE + if(scrub_Toxins && environment.toxins() > 0.001) + return TRUE + if(environment.sleeping_agent() > 0.001) + return TRUE + if(environment.agent_b() > 0.001) + return TRUE + + return FALSE + /datum/milla_safe/vent_scrubber_process /datum/milla_safe/vent_scrubber_process/on_run(obj/machinery/atmospherics/unary/vent_scrubber/scrubber, turf/simulated/tile) @@ -152,7 +174,7 @@ var/datum/gas_mixture/environment = get_turf_air(tile) if(scrubber.scrubbing) - if((scrubber.scrub_O2 && environment.oxygen() > 0.001) || (scrubber.scrub_N2 && environment.nitrogen() > 0.001) || (scrubber.scrub_CO2 && environment.carbon_dioxide() > 0.001) || (scrubber.scrub_Toxins && environment.toxins() > 0.001) || (environment.sleeping_agent()) || (environment.agent_b())) + if(scrubber.should_scrub(environment)) var/transfer_moles = min(1, scrubber.volume_rate / environment.volume) * environment.total_moles() //Take a gas sample diff --git a/code/modules/atmospherics/machinery/pipes/pipe.dm b/code/modules/atmospherics/machinery/pipes/pipe.dm index 9fcf304fa17f..ef39962d7fc7 100644 --- a/code/modules/atmospherics/machinery/pipes/pipe.dm +++ b/code/modules/atmospherics/machinery/pipes/pipe.dm @@ -64,7 +64,7 @@ /obj/machinery/atmospherics/pipe/return_analyzable_air() if(!parent) return null - return parent.air + return list(parent.air) + parent.other_airs /obj/machinery/atmospherics/pipe/build_network(remove_deferral = FALSE) if(!parent) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 0d31cf0572f0..e8023b2a3ba7 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -210,41 +210,41 @@ GLOBAL_DATUM_INIT(canister_icon_container, /datum/canister_icons, new()) /obj/machinery/atmospherics/portable/canister/process_atmos() ..() sync_pressure_appearance() - var/datum/milla_safe/canister_process/milla = new() - milla.invoke_async(src) + if(stat & BROKEN) + return -/datum/milla_safe/canister_process + if(valve_open) + var/datum/milla_safe/canister_release/milla = new() + milla.invoke_async(src) -/datum/milla_safe/canister_process/on_run(obj/machinery/atmospherics/portable/canister/canister) - if(canister.stat & BROKEN) - return + if(air_contents.return_pressure() < 1) + can_label = TRUE + else + can_label = FALSE - if(canister.valve_open) - var/datum/gas_mixture/environment - if(canister.holding_tank) - environment = canister.holding_tank.air_contents - else - var/turf/T = get_turf(canister) - environment = get_turf_air(T) +/datum/milla_safe/canister_release - var/env_pressure = environment.return_pressure() - var/pressure_delta = min(canister.release_pressure - env_pressure, (canister.air_contents.return_pressure() - env_pressure) / 2) - //Can not have a pressure delta that would cause environment pressure > tank pressure +/datum/milla_safe/canister_release/on_run(obj/machinery/atmospherics/portable/canister/canister) + var/datum/gas_mixture/environment + if(canister.holding_tank) + environment = canister.holding_tank.air_contents + else + var/turf/T = get_turf(canister) + environment = get_turf_air(T) - var/transfer_moles = 0 - if((canister.air_contents.temperature() > 0) && (pressure_delta > 0)) - transfer_moles = pressure_delta * environment.volume / (canister.air_contents.temperature() * R_IDEAL_GAS_EQUATION) + var/env_pressure = environment.return_pressure() + var/pressure_delta = min(canister.release_pressure - env_pressure, (canister.air_contents.return_pressure() - env_pressure) / 2) + //Can not have a pressure delta that would cause environment pressure > tank pressure - //Actually transfer the gas - var/datum/gas_mixture/removed = canister.air_contents.remove(transfer_moles) + var/transfer_moles = 0 + if((canister.air_contents.temperature() > 0) && (pressure_delta > 0)) + transfer_moles = pressure_delta * environment.volume / (canister.air_contents.temperature() * R_IDEAL_GAS_EQUATION) - environment.merge(removed) - canister.sync_pressure_appearance() + //Actually transfer the gas + var/datum/gas_mixture/removed = canister.air_contents.remove(transfer_moles) - if(canister.air_contents.return_pressure() < 1) - canister.can_label = TRUE - else - canister.can_label = FALSE + environment.merge(removed) + canister.sync_pressure_appearance() /obj/machinery/atmospherics/portable/canister/return_obj_air() RETURN_TYPE(/datum/gas_mixture) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 5fa57bd2e723..9843b487fad9 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -120,12 +120,12 @@ update_icon() return TRUE -/obj/machinery/atmospherics/portable/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(istype(W, /obj/item/tank)) +/obj/machinery/atmospherics/portable/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/tank)) if(!(stat & BROKEN)) if(!user.drop_item()) - return - var/obj/item/tank/T = W + return ITEM_INTERACT_COMPLETE + var/obj/item/tank/T = used user.drop_item() if(holding_tank) to_chat(user, "[holding_tank ? "In one smooth motion you pop [holding_tank] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") @@ -133,7 +133,7 @@ T.loc = src holding_tank = T update_icon() - return + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/atmospherics/portable/wrench_act(mob/user, obj/item/I) @@ -157,9 +157,9 @@ else to_chat(user, "Nothing happens.") -/obj/machinery/atmospherics/portable/attacked_by__legacy__attackchain(obj/item/I, mob/user) - if(I.force < 10 && !(stat & BROKEN)) +/obj/machinery/atmospherics/portable/attacked_by(obj/item/attacker, mob/living/user) + if(attacker.force < 10 && !(stat & BROKEN)) take_damage(0) else add_fingerprint(user) - ..() + return ..() diff --git a/code/modules/atmospherics/machinery/portable/portable_pump.dm b/code/modules/atmospherics/machinery/portable/portable_pump.dm index 8821a9331033..9adab28c93cc 100644 --- a/code/modules/atmospherics/machinery/portable/portable_pump.dm +++ b/code/modules/atmospherics/machinery/portable/portable_pump.dm @@ -61,44 +61,44 @@ /obj/machinery/atmospherics/portable/pump/process_atmos() ..() - var/datum/milla_safe/portable_pump_process/milla = new() - milla.invoke_async(src) + if(on) + var/datum/milla_safe/portable_pump_process/milla = new() + milla.invoke_async(src) /datum/milla_safe/portable_pump_process /datum/milla_safe/portable_pump_process/on_run(obj/machinery/atmospherics/portable/pump/pump) - if(pump.on) - var/datum/gas_mixture/environment - if(pump.holding_tank) - environment = pump.holding_tank.air_contents - else - var/turf/T = get_turf(pump) - environment = get_turf_air(T) - if(pump.direction == DIRECTION_OUT) - var/pressure_delta = pump.target_pressure - environment.return_pressure() - //Can not have a pressure delta that would cause environment pressure > tank pressure - - var/transfer_moles = 0 - if(pump.air_contents.temperature() > 0) - transfer_moles = pressure_delta*environment.volume/(pump.air_contents.temperature() * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = pump.air_contents.remove(transfer_moles) - - environment.merge(removed) - else - var/pressure_delta = pump.target_pressure - pump.air_contents.return_pressure() - //Can not have a pressure delta that would cause environment pressure > tank pressure - - var/transfer_moles = 0 - if(environment.temperature() > 0) - transfer_moles = pressure_delta*pump.air_contents.volume/(environment.temperature() * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed - removed = environment.remove(transfer_moles) - - pump.air_contents.merge(removed) + var/datum/gas_mixture/environment + if(pump.holding_tank) + environment = pump.holding_tank.air_contents + else + var/turf/T = get_turf(pump) + environment = get_turf_air(T) + if(pump.direction == DIRECTION_OUT) + var/pressure_delta = pump.target_pressure - environment.return_pressure() + //Can not have a pressure delta that would cause environment pressure > tank pressure + + var/transfer_moles = 0 + if(pump.air_contents.temperature() > 0) + transfer_moles = pressure_delta*environment.volume/(pump.air_contents.temperature() * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + var/datum/gas_mixture/removed = pump.air_contents.remove(transfer_moles) + + environment.merge(removed) + else + var/pressure_delta = pump.target_pressure - pump.air_contents.return_pressure() + //Can not have a pressure delta that would cause environment pressure > tank pressure + + var/transfer_moles = 0 + if(environment.temperature() > 0) + transfer_moles = pressure_delta*pump.air_contents.volume/(environment.temperature() * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + var/datum/gas_mixture/removed + removed = environment.remove(transfer_moles) + + pump.air_contents.merge(removed) /obj/machinery/atmospherics/portable/pump/return_obj_air() RETURN_TYPE(/datum/gas_mixture) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index df888f2dcceb..71e1af7f9b76 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -46,18 +46,18 @@ /obj/machinery/atmospherics/portable/scrubber/process_atmos() ..() - var/datum/milla_safe/portable_scrubber_process/milla = new() - milla.invoke_async(src) - -/datum/milla_safe/portable_scrubber_process - -/datum/milla_safe/portable_scrubber_process/on_run(obj/machinery/atmospherics/portable/scrubber/scrubber) - if(!scrubber.on) + if(!on) return - if(scrubber.holding_tank) - scrubber.scrub(scrubber.holding_tank.air_contents) + if(holding_tank) + scrub(holding_tank.air_contents) return + var/datum/milla_safe/portable_scrubber_scrub/milla = new() + milla.invoke_async(src) + +/datum/milla_safe/portable_scrubber_scrub + +/datum/milla_safe/portable_scrubber_scrub/on_run(obj/machinery/atmospherics/portable/scrubber/scrubber) var/turf/T = get_turf(scrubber) scrubber.scrub(get_turf_air(T)) if(scrubber.widenet) diff --git a/code/modules/awaymissions/mission_code/ghost_role_spawners/oldstation_spawns.dm b/code/modules/awaymissions/mission_code/ghost_role_spawners/oldstation_spawns.dm index a8efc5785941..5d6cfe1fdd91 100644 --- a/code/modules/awaymissions/mission_code/ghost_role_spawners/oldstation_spawns.dm +++ b/code/modules/awaymissions/mission_code/ghost_role_spawners/oldstation_spawns.dm @@ -112,3 +112,15 @@ /obj/structure/showcase/machinery/oldpod/used name = "opened cryogenic pod" desc = "A cryogenic pod that has recently discharged its occupant. The pod appears non-functional." + +/obj/structure/showcase/machinery/server_broken + name = "derelict R&D server" + desc = "An R&D server long since rendered non-functional due to lack of maintenance. Any scientific data that used to be stored inside has been lost to time." + icon = 'icons/obj/machines/research.dmi' + icon_state = "server-off" + +/obj/structure/showcase/machinery/thermomachine_broken + name = "derelict thermomachine" + desc = "A thermomachine long since rendered non-functional due to lack of maintenance. All the components are burned out and useless." + icon = 'icons/obj/cryogenic2.dmi' + icon_state = "freezer" diff --git a/code/modules/awaymissions/mission_code/ruins/abandoned_engi_sat.dm b/code/modules/awaymissions/mission_code/ruins/abandoned_engi_sat.dm index 2908f0b65f23..8581222b5186 100644 --- a/code/modules/awaymissions/mission_code/ruins/abandoned_engi_sat.dm +++ b/code/modules/awaymissions/mission_code/ruins/abandoned_engi_sat.dm @@ -1,12 +1,9 @@ /obj/structure/closet/secure_closet/engineering_personal/empty - locked = FALSE - opened = TRUE /obj/structure/closet/secure_closet/engineering_personal/empty/populate_contents() return /obj/structure/closet/wardrobe/atmospherics_yellow/empty - opened = TRUE /obj/structure/closet/wardrobe/atmospherics_yellow/populate_contents() return diff --git a/code/modules/awaymissions/mission_code/ruins/deepstorage.dm b/code/modules/awaymissions/mission_code/ruins/deepstorage.dm index cf4f2f059591..b9f8ee35ad64 100644 --- a/code/modules/awaymissions/mission_code/ruins/deepstorage.dm +++ b/code/modules/awaymissions/mission_code/ruins/deepstorage.dm @@ -175,7 +175,7 @@ if(target) playsound(loc, 'sound/voice/zombie_scream.ogg', 70, TRUE) -/mob/living/simple_animal/hostile/spaceinfected/Move(atom/newloc) +/mob/living/simple_animal/hostile/spaceinfected/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE) if(ischasm(newloc)) // as this place filled with chasms, they shouldn't randomly fall in while wandering around return FALSE return ..() @@ -293,15 +293,6 @@ /obj/item/clothing/glasses/sunglasses/yeah ) -/obj/effect/spawner/random/deepstorage_reward/main - name = "warehouse main reward" - loot = list( - /obj/item/storage/belt/champion/wrestling, - /obj/item/storage/box/weaver_kit, - /obj/item/gun/medbeam, - /obj/item/storage/lockbox/experimental_weapon - ) - // paper stuff & lore /obj/item/paper/fluff/ruins/deepstorage/log1 diff --git a/code/modules/awaymissions/mission_code/ruins/oldstation.dm b/code/modules/awaymissions/mission_code/ruins/oldstation.dm index 8a7ad3c4deb4..7e8bb571a7dd 100644 --- a/code/modules/awaymissions/mission_code/ruins/oldstation.dm +++ b/code/modules/awaymissions/mission_code/ruins/oldstation.dm @@ -438,7 +438,7 @@ opacity = TRUE icon = 'icons/obj/2x2.dmi' icon_state = "large_engine" - desc = "A very large bluespace engine used to propel very large ships." + desc = "A very large sublight engine used to propel very large ships." bound_width = 64 bound_height = 64 appearance_flags = LONG_GLIDE diff --git a/code/modules/awaymissions/mission_code/ruins/telecomns.dm b/code/modules/awaymissions/mission_code/ruins/telecomns.dm index 834c8a6d592f..fdfc8029466f 100644 --- a/code/modules/awaymissions/mission_code/ruins/telecomns.dm +++ b/code/modules/awaymissions/mission_code/ruins/telecomns.dm @@ -388,7 +388,7 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank) /obj/item/remote_ai_upload // A 1 use AI upload. Potential D.V.O.R.A.K reward. name = "remote AI upload" - desc = "A mobile AI upload. The bluespace relay will likely overload after one use. Make it count." + desc = "A mobile AI upload. The transmitter is extremely powerful, but will burn out after one use. Make it count." icon = 'icons/obj/device.dmi' icon_state = "dvorak_upload" w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 82d1a6fab601..d1d5da742dcf 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -18,6 +18,8 @@ ///////// var/datum/preferences/prefs = null var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists. + ///The visual delay to use for the current client.Move(), mostly used for making a client based move look like it came from some other slower source + var/visual_delay = 0 var/move_delay = 1 var/moving = null var/area = null diff --git a/code/modules/client/preference/loadout/loadout_glasses.dm b/code/modules/client/preference/loadout/loadout_glasses.dm index af40da04e6ed..b2535f98dbec 100644 --- a/code/modules/client/preference/loadout/loadout_glasses.dm +++ b/code/modules/client/preference/loadout/loadout_glasses.dm @@ -39,7 +39,7 @@ /datum/gear/glasses/sechud display_name = "Classic security HUD" path = /obj/item/clothing/glasses/hud/security - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Internal Affairs Agent","Magistrate") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective", "Internal Affairs Agent","Magistrate") /datum/gear/glasses/goggles display_name = "Goggles" @@ -52,7 +52,7 @@ /datum/gear/glasses/goggles_job/sechudgoggles display_name = "Security HUD goggles" path = /obj/item/clothing/glasses/hud/security/goggles - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Internal Affairs Agent", "Magistrate") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective", "Internal Affairs Agent", "Magistrate") /datum/gear/glasses/goggles_job/medhudgoggles display_name = "Health HUD goggles" diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 6d3b7e84575f..b40f4c916ff4 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -70,12 +70,12 @@ /datum/gear/hat/capcsec display_name = "Security cap, corporate" path = /obj/item/clothing/head/soft/sec/corp - allowed_roles = list("Head of Security", "Warden", "Security Officer") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective") /datum/gear/hat/capsec display_name = "Security cap" path = /obj/item/clothing/head/soft/sec - allowed_roles = list("Head of Security", "Warden", "Security Officer") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective") /datum/gear/hat/capjanigrey display_name = "Cap, janitor grey" @@ -146,7 +146,7 @@ /datum/gear/hat/cowboyhat/sec display_name = "Cowboy hat, security" path = /obj/item/clothing/head/cowboyhat/sec - allowed_roles = list("Head of Security", "Warden", "Security Officer") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective") /datum/gear/hat/beret_purple display_name = "Beret, purple" diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm index c5dc635a57ce..3821188bf446 100644 --- a/code/modules/client/preference/loadout/loadout_uniform.dm +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -390,12 +390,12 @@ /datum/gear/uniform/sec/secorporate display_name = "Security uniform, corporate" path = /obj/item/clothing/under/rank/security/officer/corporate - allowed_roles = list("Head of Security", "Warden", "Security Officer") + allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") /datum/gear/uniform/sec/dispatch display_name = "Security uniform, dispatch" path = /obj/item/clothing/under/rank/security/officer/dispatch - allowed_roles = list("Head of Security", "Warden", "Security Officer") + allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") /datum/gear/uniform/sec/casual display_name = "Security uniform, casual" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 55ec3adf3725..17937982df03 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -302,7 +302,7 @@ return TRUE /obj/item/clothing/under/proc/set_sensors(mob/user) - if(!user.Adjacent(src)) + if(!Adjacent(user) && !user.Adjacent(src)) to_chat(user, "You are too far away!") return @@ -321,7 +321,7 @@ var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") var/switchMode = tgui_input_list(user, "Select a sensor mode:", "Suit Sensor Mode", modes, modes[sensor_mode + 1]) // If they walk away after the menu is already open. - if(!user.Adjacent(src)) + if(!Adjacent(user) && !user.Adjacent(src)) to_chat(user, "You have moved too far away!") return // If your hands get lopped off or cuffed after the menu is open. @@ -613,10 +613,6 @@ var/datum/action/A = X A.UpdateButtons() -// Changes the speech verb when wearing a mask if a value is returned -/obj/item/clothing/mask/proc/change_speech_verb() - return - ////////////////////////////// // MARK: SHOES ////////////////////////////// diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index c676e14ed77e..2b30ef879d83 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -1,6 +1,6 @@ /obj/item/clothing/head/helmet name = "helmet" - desc = "Standard Security gear. Protects the head from impacts." + desc = "A mass-produced protective helmet used by security personnel across the sector. Provides light protection against most sources of damage." icon_state = "helmetmaterials" w_class = WEIGHT_CLASS_NORMAL flags = HEADBANGPROTECT @@ -80,7 +80,7 @@ /obj/item/clothing/head/helmet/alt name = "bulletproof helmet" - desc = "A bulletproof helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." + desc = "A durable combat helmet reinforced with strike plates and cushioning to protect against high-velocity kinetic impacts and the concussive force of explosions. Does little to stop energy weapons or melee hits." icon_state = "bulletproof" item_state = "bulletproof" armor = list(MELEE = 10, BULLET = 50, LASER = 5, ENERGY = 5, BOMB = 45, RAD = 0, FIRE = 50, ACID = 50) @@ -88,7 +88,7 @@ /obj/item/clothing/head/helmet/riot name = "riot helmet" - desc = "It's a helmet specifically designed to protect against close range attacks." + desc = "A large, bulky helmet reinforced with impact plates and shock-absorbing gel to protect against melee attacks. The helmet is treated with a fire and acid-resistant surface coating, and the attached plexiglass visor should prevent things from jumping on your face." icon_state = "riot" item_state = "helmet" armor = list(MELEE = 50, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, RAD = 0, FIRE = 200, ACID = 200) @@ -99,7 +99,7 @@ /obj/item/clothing/head/helmet/riot/knight name = "medieval helmet" - desc = "A classic metal helmet." + desc = "A majestic knightly helm made of steel. Protects well against melee attacks, but don't try taking a bullet with it." icon_state = "knight_green" item_state = "knight_green" flags = BLOCKHAIR @@ -108,10 +108,10 @@ /obj/item/clothing/head/helmet/justice name = "helmet of justice" - desc = "WEEEEOOO. WEEEEEOOO. WEEEEOOOO." + desc = "A standard Security helmet with a pair of police lights crudely screwed to the sides. Any hearing loss caused by this contraption is not service related." icon_state = "justice" - toggle_message = "You turn off the lights on" - alt_toggle_message = "You turn on the lights on" + toggle_message = "You turn off the lights" + alt_toggle_message = "You turn on the lights" actions_types = list(/datum/action/item_action/toggle_helmet_light) can_toggle = 1 toggle_cooldown = 20 @@ -122,13 +122,13 @@ name = "alarm helmet" desc = "WEEEEOOO. WEEEEEOOO. STOP THAT MONKEY. WEEEOOOO." icon_state = "justice2" - toggle_message = "You turn off the light on" - alt_toggle_message = "You turn on the light on" + toggle_message = "You turn off the light" + alt_toggle_message = "You turn on the light" /obj/item/clothing/head/helmet/swat name = "\improper SWAT helmet" - desc = "They're often used by highly trained Swat Members." + desc = "A menacing black combat helmet used by police assault units. Provides moderate protection against all threats." icon_state = "swat" item_state = "swat" @@ -165,8 +165,8 @@ dog_fashion = null /obj/item/clothing/head/helmet/roman - name = "roman helmet" - desc = "An ancient helmet made of bronze and leather." + name = "legionnaire helmet" + desc = "A lovingly-crafted helmet based off examples used by Roman legionnaires. Provides light protection against melee and laser impacts. It's also completely fireproof!" flags = null armor = list(MELEE = 15, BULLET = 0, LASER = 15, ENERGY = 5, BOMB = 5, RAD = 0, FIRE = INFINITY, ACID = 50) resistance_flags = FIRE_PROOF @@ -176,17 +176,17 @@ dog_fashion = /datum/dog_fashion/head/roman /obj/item/clothing/head/helmet/roman/fake - desc = "An ancient helmet made of plastic and leather." + desc = "A shoddily-crafted cosplay helmet made of plastic. Protects against jack and shit, if you're lucky." armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/helmet/roman/legionaire - name = "roman legionaire helmet" - desc = "An ancient helmet made of bronze and leather. Has a red crest on top of it." + name = "centurion helmet" + desc = "A lovingly-crafted helmet based off those used by Roman centurions. Provides light protection against melee and laser impacts, is completely fireproof, and has a fancy crest on top!" icon_state = "roman_c" item_state = "roman_c" /obj/item/clothing/head/helmet/roman/legionaire/fake - desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." + desc = "A shoddily-crafted cosplay helmet made of plastic. This particular specimen has what appears to be the head of a broom crudely taped to the top." armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/helmet/gladiator @@ -252,7 +252,7 @@ /obj/item/clothing/head/helmet/riot/knight/templar name = "crusader helmet" - desc = "Deus Vult." + desc = "A cheap metal helmet that looks straight out of a poorly-funded documentary about the crusades. Might stop a crude melee weapon. The asbestos-lined padding does provide great protection from fire and acid, however..." icon_state = "knight_templar" item_state = "knight_templar" armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 5, RAD = 0, FIRE = 200, ACID = 200) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 1e3b00c3fea8..8dc10bf62760 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -33,7 +33,6 @@ armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = INFINITY, ACID = 60) origin_tech = "materials=2;engineering=3" actions_types = list(/datum/action/item_action/toggle) - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE flags_cover = MASKCOVERSEYES can_toggle = TRUE visor_flags_inv = HIDEEYES @@ -56,7 +55,6 @@ desc = "A military-grade gas mask that can be connected to an air supply." icon_state = "gas_mining" actions_types = list(/datum/action/item_action/adjust) - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, RAD = 0, FIRE = 10, ACID = 35) resistance_flags = FIRE_PROOF can_toggle = TRUE @@ -96,17 +94,11 @@ //Bane gas mask -/obj/item/clothing/mask/banemask +/obj/item/clothing/mask/gas/banemask name = "bane mask" desc = "Only when the station is in flames, do you have my permission to robust." icon_state = "bane_mask" - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE - flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES - w_class = WEIGHT_CLASS_NORMAL - item_state = "bane_mask" - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.01 + item_state = "sechailer" //Plague Dr suit can be found in clothing/suits/bio.dm @@ -258,6 +250,7 @@ desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." icon_state = "sechailer" item_state = "sechailer" + flags_inv = HIDEEYES|HIDEFACE var/phrase = 1 var/aggressiveness = 1 var/safety = 1 @@ -284,41 +277,30 @@ "super" = "Face the wrath of the golden bolt.", "dredd" = "I am, the LAW!" ) -/obj/item/clothing/mask/gas/sechailer/hos - name = "head of security's SWAT mask" - desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." - icon_state = "hosmask" - can_toggle = FALSE - aggressiveness = 3 - phrase = 12 - actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/selectphrase) - -/obj/item/clothing/mask/gas/sechailer/warden - name = "warden's SWAT mask" - desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe." - icon_state = "wardenmask" - can_toggle = FALSE - aggressiveness = 3 - phrase = 12 - actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/selectphrase) - /obj/item/clothing/mask/gas/sechailer/swat name = "\improper SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000." icon_state = "officermask" + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE aggressiveness = 3 phrase = 12 actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/selectphrase) -/obj/item/clothing/mask/gas/sechailer/blue +/obj/item/clothing/mask/gas/sechailer/swat/hos + name = "head of security's SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." + icon_state = "hosmask" + +/obj/item/clothing/mask/gas/sechailer/swat/warden + name = "warden's SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe." + icon_state = "wardenmask" + +/obj/item/clothing/mask/gas/sechailer/swat/blue name = "blue SWAT mask" desc = "A neon blue swat mask, used for demoralizing Greytide in the wild." icon_state = "blue_sechailer" - item_state = "blue_sechailer" - aggressiveness = 3 - phrase = 12 - actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/selectphrase) /obj/item/clothing/mask/gas/sechailer/cyborg name = "security hailer" diff --git a/code/modules/clothing/suits/armor_suits.dm b/code/modules/clothing/suits/armor_suits.dm index a23f6c83fb6b..3ddf3ec98aee 100644 --- a/code/modules/clothing/suits/armor_suits.dm +++ b/code/modules/clothing/suits/armor_suits.dm @@ -16,8 +16,8 @@ w_class = WEIGHT_CLASS_NORMAL /obj/item/clothing/suit/armor/vest - name = "armor" - desc = "An armored vest that protects against some damage." + name = "armor vest" + desc = "A mass-produced Level II soft armor vest that provides light protection against most sources of damage." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' @@ -29,21 +29,21 @@ /obj/item/clothing/suit/armor/vest/jacket name = "military jacket" - desc = "An old military jacket, it has armoring." + desc = "An old Federal Army surplus jacket. Armor panels sewn into the sides provide some protection against impacts and laser fire." icon_state = "militaryjacket" item_state = "militaryjacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/suit/armor/vest/combat name = "combat vest" - desc = "An armored vest that protects against some damage." + desc = "A soft armor vest suitable for stopping minor impacts." icon_state = "armor-combat" item_state = "bulletproof" blood_overlay_type = "armor" /obj/item/clothing/suit/armor/vest/security name = "security armor" - desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." + desc = "A Level II soft armor vest used by Nanotrasen corporate security. Offers light protection against kinetic impacts and lasers, and has a clip for a holobadge." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' @@ -62,7 +62,7 @@ A.Grant(user) icon_state = "armorsec" user.update_inv_wear_suit() - desc = "An armored vest that protects against some damage. This one has [attached_badge] attached to it." + desc = "A Level II soft armor vest used by Nanotrasen corporate security, offering light protection against kinetic impacts and lasers. This one has [attached_badge] attached to it." to_chat(user, "You attach [attached_badge] to [src].") return ..() @@ -76,7 +76,7 @@ icon_state = "armor" user.update_inv_wear_suit() - desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." + desc = "A Level II soft armor vest used by Nanotrasen corporate security. Offers light protection against kinetic impacts and lasers, and has a clip for a holobadge." to_chat(user, "You remove [attached_badge] from [src].") attached_badge = null @@ -85,7 +85,7 @@ /obj/item/clothing/suit/armor/vest/street_judge name = "judge's security armor" - desc = "Perfect for when you're looking to send a message rather than performing your actual duties." + desc = "A standard Nanotrasen security vest with some decidedly non-standard decorations attached. Being made of cheap plastic, these decorations do not improve armor performance." icon_state = "streetjudgearmor" sprite_sheets = list( @@ -96,7 +96,7 @@ /obj/item/clothing/suit/armor/vest/blueshield name = "blueshield's security armor" - desc = "An armored vest with the badge of a Blueshield." + desc = "A Level II soft armor vest used by Nanotrasen's Blueshield bodyguard corps. Provides identical protection to standard Security soft vests." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' @@ -106,14 +106,14 @@ /obj/item/clothing/suit/armor/vest/bloody name = "bloodied security armor" - desc = "A vest drenched in the blood of Greytide. It has seen better days." + desc = "An old, gore-covered security vest with a face crudely drawn on the chest. Where the hell did they even find this?" icon_state = "bloody_armor" item_state = "bloody_armor" sprite_sheets = null /obj/item/clothing/suit/armor/secjacket name = "security jacket" - desc = "A sturdy black jacket with reinforced fabric. Bears insignia of NT corporate security." + desc = "A stylish black jacket used by Nanotrasen corporate security. Basic kevlar weave offers minor protection, but far less than a typical Security vest." icon_state = "secjacket_open" item_state = "hos" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -132,7 +132,7 @@ /obj/item/clothing/suit/armor/secponcho name = "security poncho" - desc = "A stylish black and red poncho made with reinforced fabric." + desc = "A stylish black and red poncho used by Nanotrasen corporate security. Basic kevlar weave provides minor protection against most sources of damage." icon_state = "security_poncho" item_state = "security_poncho" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -148,7 +148,7 @@ /obj/item/clothing/suit/armor/hos name = "armored coat" - desc = "A trench coat enhanced with a special alloy for some protection and style." + desc = "An intimidating black greatcoat reinforced with Level II plate inserts for moderate protection." icon_state = "hos" item_state = "hos" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS @@ -165,7 +165,7 @@ /obj/item/clothing/suit/armor/hos/alt name = "armored trenchcoat" - desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes." + desc = "A a stylish black trenchcoat fitted with Level II armored inserts for moderate protection without sacrificing aesthetics." icon_state = "hostrench_open" item_state = "hostrench_open" flags_inv = 0 @@ -184,7 +184,7 @@ /obj/item/clothing/suit/armor/vest/warden name = "warden's armored jacket" - desc = "An armored jacket with silver rank pips and livery." + desc = "A comfortable armored jacket fitted with Level II plate inserts for moderate protection. This one has silver livery on the shoulders to denote rank." icon_state = "warden_jacket" item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -201,13 +201,13 @@ /obj/item/clothing/suit/armor/vest/warden/alt name = "warden's jacket" - desc = "A navy-blue armored jacket with blue shoulder designations and '/Warden/' stitched into one of the chest pockets." + desc = "A large navy-blue jacket fitted with Level II armored inserts. There are silver rank insignia on the shoulders." icon_state = "warden_jacket_alt" //Captain /obj/item/clothing/suit/armor/vest/capcarapace name = "captain's carapace" - desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples." + desc = "A fancy blue & gold dragonscale armor vest fitted with Level III and IV armor panelling. Offers excellent protection against melee attacks, kinetic impacts, and laser discharges. " icon_state = "captain_carapace" item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO @@ -225,26 +225,26 @@ /obj/item/clothing/suit/armor/vest/capcarapace/jacket name = "captain's jacket" - desc = "A less formal jacket for everyday captain use." + desc = "A comfy semiformal jacket for the Captain on the move. Embedded kevlar weave and Level II armor panels provide moderate protection without sacrificing class." icon_state = "captain_jacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS armor = list(MELEE = 40, BULLET = 20, LASER = 25, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = INFINITY, ACID = 450) /obj/item/clothing/suit/armor/vest/capcarapace/jacket/tunic name = "captain's tunic" - desc = "Worn by a Captain to show their class." + desc = "A snappy blue dress tunic for Captains of class. Kevlar weave and sewn-in Level II armor plates provide moderate protection in all areas." icon_state = "captain_tunic" /obj/item/clothing/suit/armor/vest/capcarapace/coat name = "captain's formal coat" - desc = "For when an armored vest isn't fashionable enough." + desc = "A large, fancy, and exquisately tailored dress coat for the most image-conscious of Nanotrasen Captains. Level II armor plates and impact gel panels sewn into the fabric provide light protection against most damage types." icon_state = "captain_formal" armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = INFINITY, ACID = 450) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS /obj/item/clothing/suit/armor/vest/capcarapace/coat/white name = "captain's long white tunic" - desc = "An old style captain tunic. Makes you look and feel like you're wearing a cardboard box with arm holes cut in it but looks like it would be great for a wedding... or a funeral." + desc = "A beautiful dress white tunic for Captains of demanding taste. A mix of kevlar weave and Level II armor inserts provide basic protection against most threats." icon_state = "captain_white" // Drask look fine in the regular human version @@ -256,7 +256,7 @@ /obj/item/clothing/suit/armor/riot name = "riot suit" - desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement." + desc = "A bulky, full-body suit of layered armor and impact cushions that provides outstanding protection against blunt trauma, fire, and corrosive substances. Much less effective against all other forms of damage, however." icon_state = "riot" item_state = "swat_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -273,13 +273,13 @@ /obj/item/clothing/suit/armor/riot/sec name = "security riot suit" - desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement. This one has security markings on it." + desc = "A full-body suit of riot gear that provides excellent protection against blunt force trauma, fire, and corrosive substances, but little protection otherwise. This suit is covered in red Security stripes." icon_state = "riot-sec" item_state = "swat_suit" /obj/item/clothing/suit/armor/riot/knight name = "plate armour" - desc = "A classic suit of plate armour, highly effective at stopping melee attacks." + desc = "A full suit of steel plate armor, it looks like it came right out of a documentary about the Middle Ages. The plating offers excellent protection against melee, and the asbestos-lined padding provides excellent protection against fire and corrosive substances, but it won't be stopping any weapon designed in the last half-millennium." icon_state = "knight_green" item_state = "knight_green" slowdown = 1 @@ -300,7 +300,7 @@ /obj/item/clothing/suit/armor/riot/knight/templar name = "crusader armour" - desc = "God wills it!" + desc = "A heavy suit of cosplay-grade armor that vaguely resembles something from a low-quality documentary about the crusades. Whilst the plating provides mediocre protection against melee attacks and little else, the asbestos-lined padding does hold up quite well to fire and corrosive substances." icon_state = "knight_templar" item_state = "knight_templar" allowed = list(/obj/item/nullrod/claymore, /obj/item/storage/bible) @@ -308,7 +308,7 @@ /obj/item/clothing/suit/armor/vest/durathread name = "durathread vest" - desc = "A vest made of durathread with strips of leather acting as trauma plates." + desc = "A comfortable and low-profile vest made of durathread, reinforced with panels of tanned leather. Offers decent protection against laser discharges, but won't be stopping a bullet any time soon." icon_state = "durathread" item_state = "durathread" strip_delay = 60 @@ -317,8 +317,8 @@ armor = list(MELEE = 10, BULLET = 5, LASER = 20, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 35, ACID = 50) /obj/item/clothing/suit/armor/bulletproof - name = "bulletproof vest" - desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." + name = "bulletproof armor" + desc = "A full-body suit of armor fitted with Level IV ballistic armor inserts and panelling across the body. Will stop most low-caliber kinetic projectiles and help resist the concussive force of explosions, but it does little against melee and energy attacks." icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" @@ -335,15 +335,15 @@ /obj/item/clothing/suit/armor/bulletproof/sec - name = "security bulletproof vest" - desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent. This one has security markings on it." + name = "security bulletproof armor" + desc = "A full-body suit of armor fitted with Level IV ballistic inserts and panelling. Will stop most low-caliber kinetic rounds and resist the concussive force of explosions somewhat, but it does little against melee and energy attacks. This suit is covered in red Security stripes." icon_state = "bulletproof-sec" item_state = "armor" blood_overlay_type = "armor" /obj/item/clothing/suit/armor/swat name = "SWAT armor" - desc = "Tactical SWAT armor." + desc = "A large, bulky suit of tactical armor commonly used by specialized police units. Offers moderate protection in all areas. It has a surface coating that completely resists harm from fire and corrosive attacks." icon_state = "heavy" item_state = "swat_suit" body_parts_covered = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -358,7 +358,8 @@ /obj/item/clothing/suit/armor/laserproof name = "ablative armor vest" - desc = "A vest that excels in protecting the wearer against energy projectiles. Projects an energy field around the user, allowing a chance of energy projectile deflection no matter where on the user it would hit." + desc = "A high-tech armor vest specializing against energy attacks. A miniaturized energy shielding system deflects incoming shots on a short cooldown, while a reflective outer shell and \ + specialized heat dissipation materials protect against direct energy impacts. Unfortunately, it offers little in the way of defense against solid projectiles or melee weapons." icon_state = "armor_reflec" item_state = "armor_reflec" blood_overlay_type = "armor" @@ -394,7 +395,7 @@ //Reactive armor /obj/item/clothing/suit/armor/reactive name = "reactive armor" - desc = "Doesn't seem to do much for some reason." + desc = "A massive, complex, and currently entirely worthless vest that forms the basis of a reactive armor system. Requires an anomaly core to actually work." /// Is the armor turned on? var/active = FALSE /// Is the armor disabled, and prevented from reactivating temporarly? @@ -430,11 +431,11 @@ /obj/item/clothing/suit/armor/reactive/examine_more(mob/user) . = ..() - . += "Reactive armours are one of the uses that Nanotasen has found for the anomaly cores that can be recovered from the bluespace phenomina that occur in the space in orbit of Lavaland. \ - The effects of these armours can be unpredictable or undesirable in certain situations, so Nanotrasen advises only activating them when the user is in danger." + . += "Reactive armor systems are one of the uses that Nanotasen has found for the anomaly cores that can be recovered from the anomalous phenomena that occur in the area of space near Lavaland. \ + The effects of these armor units can be unpredictable or undesirable in certain situations, so Nanotrasen advises only activating them when the user is in danger." . += "" - . += "Outside of the strange effects caused by the anomaly core, the armour provides no protection against conventional attacks. \ - Nanotrasen cannot be held liable for injury and/or death due to misuse or proper operation of the reactive armour." + . += "Outside of the strange effects caused by the anomaly core, the armor provides no protection against conventional attacks. \ + Nanotrasen cannot be held liable for injury and/or death due to misuse or proper operation of the reactive armor." /obj/item/clothing/suit/armor/reactive/attack_self__legacy__attackchain(mob/user) active = !(active) @@ -506,8 +507,8 @@ //When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) /obj/item/clothing/suit/armor/reactive/teleport - name = "reactive teleport armor" - desc = "Someone separated our Research Director from his own head!" + name = "reactive teleportation armor" + desc = "A reactive armor vest fitted with a bluespace anomaly core, allowing it to teleport its wearer away from danger. Looking directly at the core fills you with a sense of vertigo." energy_cost = 200 var/tele_range = 6 @@ -524,7 +525,7 @@ /obj/item/clothing/suit/armor/reactive/fire name = "reactive incendiary armor" - desc = "This armor uses the power of a pyro anomaly core to shoot protective jets of fire, in addition to absorbing all damage from fire." + desc = "A reactive armor vest fitted with a pyroclastic anomaly core, which sprays jets of flame when its wearer is threatened, as well as protecting the wearer from extreme heat. A gentle warmth emanates from the core." heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -553,7 +554,7 @@ /obj/item/clothing/suit/armor/reactive/cryo name = "reactive gelidic armor" //is "gelidic" a word? probably not, but it sounds cool - desc = "This armor harnesses a cryogenic anomaly core to defend its user from the cold and attacks alike. Its unstable thermal regulation system occasionally vents gasses." + desc = "A reactive armor vest fitted with a cryogenic anomaly core, which vents supercooled gasses at threats to its wearer. A faint wind can be heard near the core." /obj/item/clothing/suit/armor/reactive/cryo/equipped(mob/user, slot) ..() @@ -602,7 +603,7 @@ /obj/item/clothing/suit/armor/reactive/stealth name = "reactive stealth armor" - desc = "This armor uses an anomaly core combined with holographic projectors to make the user invisible temporarly, and make a fake image of the user." + desc = "A reactive armor vest fitted with a vortex anomaly core, which can turns its wearer invisible at the first sign of danger. The air around the core seems to shimmer and shift." energy_cost = 200 /obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) @@ -621,7 +622,7 @@ /obj/item/clothing/suit/armor/reactive/tesla name = "reactive tesla armor" - desc = "This armor uses the power of a flux anomaly core to protect the user in shocking ways." + desc = "A reactive armor vest fitted with an electrical anomaly core, which fires lethal bolts of electricty at threats to its wearer. The air around the core smells of ozone." /obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) @@ -640,7 +641,7 @@ /obj/item/clothing/suit/armor/reactive/repulse name = "reactive repulse armor" - desc = "An experimental suit of armor that violently throws back attackers with the power of a gravitational anomaly core." + desc = "A reactive armor vest fitted with a gravitational anomaly core, which violently repels threats to its wearer. The core pulses with light, akin to a heartbeat." ///How strong the reactive armor is for throwing var/repulse_power = 3 /// How far away are we finding things to throw @@ -714,7 +715,7 @@ /obj/item/clothing/suit/armor/heavy name = "heavy armor" - desc = "A heavily armored suit that protects against moderate damage." + desc = "A generic suit of heavy armor. Protects against damage, to the surprise of none." icon_state = "heavy" item_state = "swat_suit" armor = list(MELEE = 200, BULLET = 200, LASER = 50, ENERGY = 50, BOMB = INFINITY, RAD = INFINITY, FIRE = 450, ACID = 450) diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm index 0647bd233e6d..50b18e8ecfae 100644 --- a/code/modules/clothing/suits/hood.dm +++ b/code/modules/clothing/suits/hood.dm @@ -6,6 +6,7 @@ var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this /// If this variable is true, the hood can not be removed if the hood is nodrop var/respects_nodrop = FALSE + w_class = WEIGHT_CLASS_NORMAL /obj/item/clothing/suit/hooded/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/suits/misc_suits.dm b/code/modules/clothing/suits/misc_suits.dm index c08071b58812..39649d2d1647 100644 --- a/code/modules/clothing/suits/misc_suits.dm +++ b/code/modules/clothing/suits/misc_suits.dm @@ -308,28 +308,13 @@ user.faction -= "carp" to_chat(user, "A sudden calm fills the gnashing void of your mind- you're alone now.") -/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) - if(..()) - return TRUE - +/mob/living/carbon/human/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(istype(wear_suit, /obj/item/clothing/suit/hooded/carp_costume/dragon)) return TRUE - //Do we have a working jetpack? - var/obj/item/tank/jetpack/thrust - if(istype(back, /obj/item/tank/jetpack)) - thrust = back - else if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit)) - var/obj/item/clothing/suit/space/hardsuit/C = wear_suit - thrust = C.jetpack - else if(ismodcontrol(back)) - var/obj/item/mod/control/C = back - thrust = locate(/obj/item/mod/module/jetpack) in C - if(thrust) - if((movement_dir || thrust.stabilizers) && thrust.allow_thrust(0.01, src)) - return TRUE if(dna.species.spec_Process_Spacemove(src)) return TRUE - return FALSE + + return ..() /obj/item/clothing/head/hooded/carp_hood/dragon name = "space carp hood" @@ -467,7 +452,6 @@ /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" icon_state = "wintercoat_captain" - w_class = WEIGHT_CLASS_NORMAL item_state = "coatcaptain" armor = list(MELEE = 15, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 0, ACID = 50) allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) @@ -487,7 +471,6 @@ /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" icon_state = "wintercoat_sec" - w_class = WEIGHT_CLASS_NORMAL item_state = "coatsecurity" armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 20, ACID = 20) allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) @@ -509,7 +492,6 @@ /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" icon_state = "wintercoat_med" - w_class = WEIGHT_CLASS_NORMAL item_state = "coatmedical" allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 40) @@ -529,7 +511,6 @@ /obj/item/clothing/suit/hooded/wintercoat/science name = "science winter coat" icon_state = "wintercoat_sci" - w_class = WEIGHT_CLASS_NORMAL item_state = "coatscience" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, RAD = 0, FIRE = 0, ACID = 0) @@ -549,7 +530,6 @@ /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "wintercoat_engi" - w_class = WEIGHT_CLASS_NORMAL item_state = "coatengineer" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 10, FIRE = 20, ACID = 40) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd, /obj/item/rpd) @@ -622,7 +602,6 @@ /obj/item/clothing/suit/hooded/wintercoat/miner name = "mining winter coat" icon_state = "wintercoat_miner" - w_class = WEIGHT_CLASS_NORMAL item_state = "coatminer" allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/t_scanner/adv_mining_scanner, /obj/item/storage/bag/ore, /obj/item/gun/energy/kinetic_accelerator) armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) @@ -641,7 +620,7 @@ /obj/item/clothing/head/hooded/ablative name = "ablative hood" - desc = "Hood hopefully belonging to an ablative trenchcoat. Includes a flash proof visor." + desc = "A high-tech ablative hood attached to an ablative trenchcoat. Dissipates energy attacks with ease, and has an integrated flashproof visor. Entirely ineffecitve against kinetic attacks." icon_state = "ablativehood" flash_protect = FLASH_PROTECTION_FLASH flags = BLOCKHAIR @@ -652,9 +631,9 @@ /obj/item/clothing/suit/hooded/ablative name = "ablative trenchcoat" - desc = "Experimental trenchcoat specially crafted to reflect and absorb laser and disabler shots. Don't expect it to do all that much against an axe or a shotgun, however." + desc = "A cutting-edge ablative armor system developed by Nanotrasen. Miniaturized shielding systems deflect incoming energy projectiles, while prototype heatsinks and dissipation materials blunt any energy weapon that makes impact. \ + Unfortunately, if offers little to no protection against solid impacts." icon_state = "ablativecoat" - w_class = WEIGHT_CLASS_NORMAL item_state = "ablativecoat" body_parts_covered = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -691,6 +670,7 @@ desc = "It's a hoodie. It has a hood. Most hoodies do." icon_state = "black_hoodie" item_state = "blueshieldcoat" + w_class = WEIGHT_CLASS_SMALL body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen) hoodtype = /obj/item/clothing/head/hooded/hood @@ -1306,7 +1286,6 @@ //Syndicate Chaplain Robe (WOLOLO!) /obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe - w_class = WEIGHT_CLASS_NORMAL armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, RAD = 10, FIRE = 20, ACID = 20) var/obj/item/nullrod/missionary_staff/linked_staff = null diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 94fde2346fa9..eab7f769fb5d 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -16,6 +16,12 @@ /obj/item/fluff var/used = FALSE +/obj/item/clothing/suit/hooded/hoodie/fluff + w_class = WEIGHT_CLASS_SMALL + +/obj/item/clothing/suit/hooded/fluff + w_class = WEIGHT_CLASS_SMALL + /// Generic tattoo gun, make subtypes for different folks /obj/item/fluff/tattoo_gun name = "disposable tattoo pen" @@ -152,7 +158,6 @@ flags = CONDUCT slot_flags = ITEM_SLOT_BELT throwforce = 5 - w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced") hitsound = 'sound/weapons/bladeslice.ogg' @@ -944,14 +949,14 @@ icon_state = "greenhood" /// Hylocereus: Sam Aria -/obj/item/clothing/suit/hooded/hoodie/hylo +/obj/item/clothing/suit/hooded/hoodie/fluff/hylo name = "worn assymetrical hoodie" desc = "A soft, cozy longline hoodie. It looks old and worn, but well cared for. There's no label, but a series of dates and names is penned on a scrap of fabric sewn on the inside of the left side of the chest - 'Sam Aria' is scrawled atop them all, next to the words 'Please Remember'." icon = 'icons/obj/custom_items.dmi' icon_state = "sam_hoodie" - hoodtype = /obj/item/clothing/head/hooded/hood/hylo + hoodtype = /obj/item/clothing/head/hooded/hood/fluff/hylo -/obj/item/clothing/head/hooded/hood/hylo +/obj/item/clothing/head/hooded/hood/fluff/hylo icon = 'icons/obj/custom_items.dmi' icon_state = "sam_hood" @@ -1075,8 +1080,6 @@ if(target.change_hair("Sasook Hair", 1)) to_chat(target, "You dump some of [src] on your head and style it around.") - - /// MrSynnester : Shesi Skaklas /obj/item/clothing/suit/hooded/wintercoat/fluff/shesi name = "custom made winter coat" @@ -1358,7 +1361,6 @@ flags = BLOCKHAIR flags_inv = HIDEFACE - /obj/item/clothing/shoes/fluff/arachno_boots name = "Arachno-Man boots" desc = "These boots were made for crawlin'." @@ -1366,7 +1368,6 @@ icon_state = "superior_boots" item_state = "superior_boots" - /// chronx100: Hughe O'Splash /obj/item/nullrod/fluff/chronx fluff_transformations = list(/obj/item/nullrod/fluff/chronx/scythe) @@ -1547,7 +1548,6 @@ if(target.change_hair("Zekes Tentacles", 1)) to_chat(target, "You take time to admire yourself in [src], brushing your tendrils down and revealing their true length.") - /// Fethas: Sefra'neem /obj/item/clothing/accessory/locket/fluff/fethasnecklace name = "Orange gemmed locket" @@ -1569,7 +1569,6 @@ item_state = "sheetcosmos" item_color = "sheetcosmos" - /// Lightfire: Hyperion /obj/item/clothing/head/fluff/lfbowler name = "classy bowler hat" @@ -1589,7 +1588,6 @@ item_color = "victorianlightfire" displays_id = FALSE - /// LightFire53: Ikelos /obj/item/fluff/lighty_plasman_modkit name = "plasmaman suit modkit" @@ -1765,8 +1763,6 @@ item_color = "kiamask" species_restricted = list("Vox") - - /obj/item/clothing/gloves/ring/fluff name = "fluff ring" desc = "Someone forgot to set this fluff item's description, notify a coder!" @@ -1780,15 +1776,12 @@ /obj/item/clothing/gloves/ring/fluff/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) return - - /// Benjaminfallout: Pretzel Brassheart /obj/item/clothing/gloves/ring/fluff/benjaminfallout name = "Pretzel's Ring" desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'" icon_state = "benjaminfallout_ring" - /// Gangelwaefre: Kikeri /obj/item/clothing/under/fluff/kikeridress name = "Kikeri's Dress" diff --git a/code/modules/economy/economy_machinery/account_terminal.dm b/code/modules/economy/economy_machinery/account_terminal.dm index f3576f42edff..f125ade29790 100644 --- a/code/modules/economy/economy_machinery/account_terminal.dm +++ b/code/modules/economy/economy_machinery/account_terminal.dm @@ -24,9 +24,10 @@ /obj/machinery/computer/account_database/proc/reconnect_database() account_db = GLOB.station_money_database -/obj/machinery/computer/account_database/attackby__legacy__attackchain(obj/O, mob/user, params) - if(ui_login_attackby(O, user)) - return +/obj/machinery/computer/account_database/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(ui_login_attackby(used, user)) + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/account_database/attack_hand(mob/user) diff --git a/code/modules/economy/economy_machinery/atm.dm b/code/modules/economy/economy_machinery/atm.dm index b55c28d3d74e..c21ed7772584 100644 --- a/code/modules/economy/economy_machinery/atm.dm +++ b/code/modules/economy/economy_machinery/atm.dm @@ -77,17 +77,15 @@ /obj/machinery/economy/atm/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/economy/atm/attackby__legacy__attackchain(obj/item/I, mob/user) - if(istype(I, /obj/item/card/id)) +/obj/machinery/economy/atm/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id)) if(has_power()) - handle_id_insert(I, user) - return TRUE + handle_id_insert(used, user) + return ITEM_INTERACT_COMPLETE else if(authenticated_account) - if(istype(I, /obj/item/stack/spacecash)) - if(!has_power()) - return - insert_cash(I, user) - return TRUE + if(istype(used, /obj/item/stack/spacecash) && has_power()) + insert_cash(used, user) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/economy/economy_machinery/economy_machinery.dm b/code/modules/economy/economy_machinery/economy_machinery.dm index 31a7a1fb79d9..2a4516d37d20 100644 --- a/code/modules/economy/economy_machinery/economy_machinery.dm +++ b/code/modules/economy/economy_machinery/economy_machinery.dm @@ -7,6 +7,7 @@ desc = "A base economy machine." anchored = TRUE density = TRUE + new_attack_chain = TRUE ///Can this machine access restricted money accounts? var/restricted_bypass = FALSE @@ -33,10 +34,10 @@ /obj/machinery/economy/proc/attempt_account_authentification(datum/money_account/customer_account, attempted_pin, mob/user) var/attempt_pin = attempted_pin - if(customer_account.security_level != ACCOUNT_SECURITY_ID && !attempted_pin) - //if pin is not given, we'll prompt them here - attempt_pin = input("Enter pin code", "Vendor transaction") as num - if(!Adjacent(user)) + if(customer_account.security_level != ACCOUNT_SECURITY_ID && !attempt_pin) + // if pin is not given, we'll prompt them here + attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction", max_value = BANK_PIN_MAX, min_value = BANK_PIN_MIN) + if(!Adjacent(user) || !attempt_pin) return FALSE var/is_admin = is_admin(user) if(!account_database.try_authenticate_login(customer_account, attempt_pin, restricted_bypass, FALSE, is_admin)) diff --git a/code/modules/economy/economy_machinery/eftpos.dm b/code/modules/economy/economy_machinery/eftpos.dm index c28cda4a1e97..d1f5cf0a956a 100644 --- a/code/modules/economy/economy_machinery/eftpos.dm +++ b/code/modules/economy/economy_machinery/eftpos.dm @@ -23,6 +23,11 @@ var/datum/money_account_database/main_station/account_database ///Current money account the EFTPOS is depositing to var/datum/money_account/linked_account + ///Is this a portable unit that you can offer with *payme? + var/can_offer = TRUE + + ///The vendors that are linked to this EFTPOS. + var/list/linked_vendors = list() /obj/item/eftpos/Initialize(mapload) machine_name = "EFTPOS #[rand(101, 999)]" @@ -33,6 +38,16 @@ print_reference() return ..() +/obj/item/eftpos/Destroy() + account_database = null + linked_account = null + for(var/obj/machinery/economy/vending/custom/vendor in linked_vendors) + if(vendor.linked_pos == src) + vendor.linked_pos = null + linked_vendors.Cut() + + return ..() + /obj/item/eftpos/proc/reconnect_database() account_database = GLOB.station_money_database @@ -80,6 +95,7 @@ ) data["available_accounts"] += list(account_data) + data["can_offer"] = can_offer return data @@ -135,6 +151,9 @@ transaction_paid = FALSE else if(linked_account) transaction_locked = TRUE + for(var/obj/machinery/economy/vending/custom/vendor in linked_vendors) + if(vendor.linked_pos == src) + SStgui.update_uis(vendor, TRUE) else to_chat(user, "[bicon(src)]No account connected to send transactions to.") if("reset") @@ -143,48 +162,54 @@ if(istype(I, /obj/item/card)) var/obj/item/card/id/C = I if((ACCESS_CENT_COMMANDER in C.access) || (ACCESS_HOP in C.access) || (ACCESS_CAPTAIN in C.access)) - access_code = 0 - to_chat(user, "[bicon(src)]Access code reset to 0.") + access_code = 1000 + to_chat(user, "[bicon(src)]Access code reset to [access_code].") else if(istype(I, /obj/item/card/emag)) - access_code = 0 - to_chat(user, "[bicon(src)]Access code reset to 0.") + access_code = 1000 + to_chat(user, "[bicon(src)]Access code reset to [access_code].") + if("offer") + if(can_offer) + offer(user) +/obj/item/eftpos/proc/offer(mob/living/user) + user.apply_status_effect(STATUS_EFFECT_OFFERING_EFTPOS) /obj/item/eftpos/proc/scan_card(obj/item/card/id/C, mob/user, secured = TRUE) - visible_message("[user] swipes a card through [src].") - if(!transaction_locked || transaction_paid || !secured) + visible_message("[user] swipes a card through [src], but nothing happens.") return + visible_message("[user] swipes a card through [src].") + if(!linked_account) - to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.") + visible_message("[bicon(src)][src] buzzes as its display flashes \"EFTPOS is not connected to an account.\"", "You hear something buzz.") return var/datum/money_account/D = GLOB.station_money_database.find_user_account(C.associated_account_number, include_departments = FALSE) if(!D) - to_chat(user, "Your currently in use card is not connected to a money account.") + visible_message("[bicon(src)][src] buzzes as its display flashes \"Card is not connected to an account.\"", "You hear something buzz.") return //if security level high enough, prompt for pin var/attempt_pin if(D.security_level != ACCOUNT_SECURITY_ID) - attempt_pin = tgui_input_number(user, "Enter pin code", "EFTPOS transaction", max_value = 9999, min_value = 1000) + attempt_pin = tgui_input_number(user, "Enter pin code", "EFTPOS transaction", max_value = BANK_PIN_MAX, min_value = BANK_PIN_MIN) if(!attempt_pin || !Adjacent(user)) return //given the credentials, can the associated account be accessed right now? if(!GLOB.station_money_database.try_authenticate_login(D, attempt_pin, restricted_bypass = FALSE)) - to_chat(user, "[bicon(src)]Unable to access account, insufficient access.") + visible_message("[bicon(src)][src] buzzes as its display flashes \"Access denied.\"", "You hear something buzz.") return if(tgui_alert(user, "Are you sure you want to pay $[transaction_amount] to: [linked_account.account_name]", "Confirm transaction", list("Yes", "No")) != "Yes") return - if(!Adjacent(user)) + if(!Adjacent(user) && !(can_offer && get_dist(user, src) <= 2)) return //attempt to charge account money if(!GLOB.station_money_database.charge_account(D, transaction_amount, transaction_purpose, machine_name, FALSE, FALSE)) - to_chat(user, "[bicon(src)]Insufficient credits in your account!") + visible_message("[bicon(src)][src] buzzes as its display flashes \"Insufficient funds.\"", "You hear something buzz.") return GLOB.station_money_database.credit_account(linked_account, transaction_amount, transaction_purpose, machine_name, FALSE) playsound(src, transaction_sound, 50, TRUE) - visible_message("[src] chimes!") + visible_message("[bicon(src)][src] chimes as its display reads \"Transaction successful!\"", "You hear something chime.") transaction_paid = TRUE addtimer(VARSET_CALLBACK(src, transaction_paid, FALSE), 5 SECONDS) @@ -232,6 +257,7 @@ pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' transaction_sound = 'sound/machines/checkout.ogg' attack_verb = list("bounced a check off", "checked-out", "tipped") + can_offer = FALSE /obj/item/eftpos/register/examine(mob/user) . = ..() diff --git a/code/modules/economy/money_account.dm b/code/modules/economy/money_account.dm index 2202838ac06c..8a8faf13f442 100644 --- a/code/modules/economy/money_account.dm +++ b/code/modules/economy/money_account.dm @@ -47,7 +47,7 @@ security_level = _security_level account_number = SSeconomy.generate_account_number() account_type = _account_type - account_pin = rand(10000, 99999) + account_pin = rand(BANK_PIN_MIN, BANK_PIN_MAX) // defines are currently housed in misc_defines.dm //update SSeconomy stats SSeconomy.total_space_credits += starting_balance diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index 21d8d7fd2a89..df54a35c7566 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -42,7 +42,7 @@ current_area.powernet.power_change() log_and_message_admins("Power has been drained from all APCs.") -/proc/power_failure(announce = TRUE) +/proc/power_failure(announce = TRUE, probability = APC_BREAK_PROBABILITY) // skip any APCs that are too critical to disable var/list/skipped_areas_apc = list( /area/station/engineering/engine, @@ -58,7 +58,7 @@ if((current_area.type in skipped_areas_apc) || !is_station_level(A.z)) continue // if we are going to break this one - if(prob(APC_BREAK_PROBABILITY)) + if(prob(probability)) A.apc_short() affected_apc_count++ log_and_message_admins("APC Short Out event has shorted out [affected_apc_count] APCs.") diff --git a/code/modules/events/blob/blob_mobs.dm b/code/modules/events/blob/blob_mobs.dm index 14c3cc9db61e..dac32472ac74 100644 --- a/code/modules/events/blob/blob_mobs.dm +++ b/code/modules/events/blob/blob_mobs.dm @@ -44,7 +44,7 @@ H.color = COLOR_BLACK adjustHealth(-maxHealth * 0.0125) -/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) // Use any nearby blob structures to allow space moves. for(var/obj/structure/blob/B in range(1, src)) return TRUE diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index f4f83edc12f5..58c3f61be91e 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -32,41 +32,17 @@ strength = 1 life = 40 -/obj/effect/space_dust/New() +/obj/effect/space_dust/Initialize(mapload) . = ..() - var/startx = 0 - var/starty = 0 - var/endy = 0 - var/endx = 0 + ADD_TRAIT(src, TRAIT_NO_EDGE_TRANSITIONS, ROUNDSTART_TRAIT) + var/startside = pick(GLOB.cardinal) GLOB.meteor_list += src - switch(startside) - if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - endy = TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) - endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) - endx = TRANSITIONEDGE - if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - endy = world.maxy-TRANSITIONEDGE - endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) - if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) - endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) - endx = world.maxx-TRANSITIONEDGE - goal = locate(endx, endy, 1) - src.x = startx - src.y = starty - src.z = level_name_to_num(MAIN_STATION) - walk_towards(src, goal, 1) + var/turf/start = pick_edge_loc(startside, level_name_to_num(MAIN_STATION)) + forceMove(start) + goal = pick_edge_loc(REVERSE_DIR(startside), level_name_to_num(MAIN_STATION)) + GLOB.move_manager.home_onto(src, goal, 1) /obj/effect/space_dust/Bump(atom/A) if(QDELETED(src)) @@ -88,7 +64,7 @@ life-- if(life <= 0) - walk(src, 0) + GLOB.move_manager.stop_looping(src) on_shatter(where) qdel(src) diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 63e2a1f78567..dd6d39e604bb 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -15,8 +15,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 /datum/event/immovable_rod/start() var/startside = pick(GLOB.cardinal) - var/turf/startT = spaceDebrisStartLoc(startside, level_name_to_num(MAIN_STATION)) - var/turf/endT = spaceDebrisFinishLoc(startside, level_name_to_num(MAIN_STATION)) + var/turf/startT = pick_edge_loc(startside, level_name_to_num(MAIN_STATION)) + var/turf/endT = pick_edge_loc(REVERSE_DIR(startside), level_name_to_num(MAIN_STATION)) new /obj/effect/immovablerod/event(startT, endT) /obj/effect/immovablerod @@ -32,9 +32,14 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 var/move_delay = 1 var/atom/start var/atom/end + /// The minimum amount of damage dealt to walls, relative to their max HP. + var/wall_damage_min_fraction = 0.9 + /// The maximum amount of damage dealt to walls, relative to their max HP. Values over 1 are useful for adjusting the probability of destroying the wall. + var/wall_damage_max_fraction = 1.4 /obj/effect/immovablerod/New(atom/_start, atom/_end, delay) . = ..() + ADD_TRAIT(src, TRAIT_NO_EDGE_TRANSITIONS, ROUNDSTART_TRAIT) start = _start end = _end loc = start @@ -84,8 +89,20 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 audible_message("CLANG") clong_turf(newloc) - for(var/atom/victim as anything in newloc) - clong_thing(victim) + if(isnull(newloc)) + // The turf is dead, long live the turf! + newloc = loc + + while(TRUE) + var/hit_something_dense = FALSE + for(var/atom/victim as anything in newloc) + clong_thing(victim) + if(victim.density) + hit_something_dense = TRUE + + // Keep hitting stuff until there's nothing dense or we randomly go through it. + if(!hit_something_dense || prob(25)) + break /obj/effect/immovablerod/proc/clong_turf(turf/victim) if(!victim.density) @@ -93,7 +110,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(iswallturf(victim)) var/turf/simulated/wall/W = victim - W.take_damage(rand(W.damage_cap / 3, W.damage_cap * 4 / 3)) + W.take_damage(rand(W.damage_cap * wall_damage_min_fraction, W.damage_cap * wall_damage_max_fraction)) else victim.ex_act(EXPLODE_LIGHT) @@ -111,9 +128,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 victim.ex_act(EXPLODE_HEAVY) /obj/effect/immovablerod/event + wall_damage_min_fraction = 0.33 + wall_damage_max_fraction = 1.33 // The base chance to "damage" the floor when passing. This is not guaranteed to cause a full on hull breach. - // Chance to expose the tile to space is like 15% of this value. + // Chance to expose the tile to space is like 60% of this value. var/floor_rip_chance = 40 + // Chance to damage the floor if we didn't rip it. + var/floor_graze_chance = 50 /obj/effect/immovablerod/event/Move() . = ..() @@ -124,13 +145,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(!isfloorturf(victim)) return ..() - if(!prob(floor_rip_chance)) - return - var/turf/simulated/floor/T = victim - if(prob(25)) + if(prob(floor_rip_chance)) T.ex_act(EXPLODE_HEAVY) - else + else if(prob(floor_graze_chance)) T.ex_act(EXPLODE_LIGHT) /obj/effect/immovablerod/deadchat_plays(mode = DEADCHAT_DEMOCRACY_MODE, cooldown = 6 SECONDS) diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index d3a9ff95745e..ca3c31111b8d 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -27,17 +27,27 @@ /datum/event/infestation/start() var/list/turf/simulated/floor/turfs = list() - spawn_area_type = pick(spawn_areas) - for(var/areapath in typesof(spawn_area_type)) - var/area/A = locate(areapath) - if(!A) - log_debug("Failed to locate area for infestation event!") - kill() - return - for(var/turf/simulated/floor/F in A.contents) - if(turf_clear(F)) - turfs += F + // shuffle in place so we don't have do that dance where we make a copy of + // the list, then pick and take, then do some conditional logic to make sure + // there's still areas to choose from, etc etc, it's a small list, it's cheap + shuffle_inplace(spawn_areas) + for(var/spawn_area in spawn_areas) + for(var/area_type in typesof(spawn_area)) + var/area/destination = locate(area_type) + if(!destination) + continue + for(var/turf/simulated/floor/F in destination.contents) + if(!is_blocked_turf(F)) + turfs += F + if(length(turfs)) + spawn_area_type = area_type + spawn_on_turfs(turfs) + return + + log_debug("Failed to locate area for infestation event!") + kill() +/datum/event/infestation/proc/spawn_on_turfs(list/turfs) var/list/spawn_types = list() var/max_number vermin = rand(0, 2) diff --git a/code/modules/events/meaty_ores.dm b/code/modules/events/meaty_ores.dm index c4431b23da03..16624b38ca9d 100644 --- a/code/modules/events/meaty_ores.dm +++ b/code/modules/events/meaty_ores.dm @@ -37,3 +37,6 @@ explosion(where, 0, pick(0,1), pick(2,3), 0) else new /mob/living/simple_animal/cow(where) + +/obj/effect/space_dust/meaty/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) + return TRUE diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index eaa21b7dc702..36dc425b41ea 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -604,22 +604,22 @@ new /obj/item/stack/sheet/glass(get_turf(src), shard_count + 1) //Produce the appropriate number of glass sheets, in a single stack qdel(src) -/obj/machinery/fishtank/attackby__legacy__attackchain(obj/item/O, mob/user) +/obj/machinery/fishtank/item_interaction(mob/living/user, obj/item/used, list/modifiers) //Open reagent containers add and remove water - if(O.is_drainable()) + if(used.is_drainable()) //Containers with any reagents will get dumped in - if(O.reagents.total_volume) + if(used.reagents.total_volume) var/water_value = 0 - water_value += O.reagents.get_reagent_amount("water") //Water is full value - water_value += O.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense? - water_value += O.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value - water_value += O.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value - water_value += O.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo - water_value += O.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value + water_value += used.reagents.get_reagent_amount("water") //Water is full value + water_value += used.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense? + water_value += used.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value + water_value += used.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value + water_value += used.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo + water_value += used.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value var/message = "" if(!water_value) //The container has no water value, clear everything in it message = "The filtration process removes everything, leaving the water level unchanged." - O.reagents.clear_reagents() + used.reagents.clear_reagents() else if(water_level == water_capacity) to_chat(user, "[src] is already full!") @@ -630,25 +630,27 @@ message += " You filled [src] to the brim!" if((water_level + water_value) > water_capacity) message += " You overfilled [src] and some water runs down the side, wasted." - O.reagents.clear_reagents() + used.reagents.clear_reagents() adjust_water_level(water_value) - user.visible_message("[user.name] pours the contents of [O.name] into [src].", "[message]") + user.visible_message("[user.name] pours the contents of [used.name] into [src].", "[message]") //Empty containers will scoop out water, filling the container as much as possible from the water_level - else if(O.is_refillable()) + else if(used.is_refillable()) if(!water_level) to_chat(user, "[src] is empty!") else - if(water_level >= O.reagents.maximum_volume) //Enough to fill the container completely - O.reagents.add_reagent("fishwater", O.reagents.maximum_volume) - adjust_water_level(-O.reagents.maximum_volume) - user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [O.name] from [src].") + if(water_level >= used.reagents.maximum_volume) //Enough to fill the container completely + used.reagents.add_reagent("fishwater", used.reagents.maximum_volume) + adjust_water_level(-used.reagents.maximum_volume) + user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [used.name] from [src].") else //Fill the container as much as possible with the water_level - O.reagents.add_reagent("fishwater", water_level) + used.reagents.add_reagent("fishwater", water_level) adjust_water_level(-water_level) - user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].") + user.visible_message("[user.name] scoops out some water from [src].", "You fill [used.name] with the last of the water in [src].") + + return ITEM_INTERACT_COMPLETE //Fish eggs - else if(istype(O, /obj/item/fish_eggs)) - var/obj/item/fish_eggs/egg = O + else if(istype(used, /obj/item/fish_eggs)) + var/obj/item/fish_eggs/egg = used //Don't add eggs if there is no water (they kinda need that to live) if(!water_level) to_chat(user, "[src] has no water; [egg.name] won't hatch without water!") @@ -659,8 +661,10 @@ else add_fish(egg.fish_type) qdel(egg) + + return ITEM_INTERACT_COMPLETE //Fish food - else if(istype(O, /obj/item/fishfood)) + else if(istype(used, /obj/item/fishfood)) //Only add food if there is water and it isn't already full of food if(water_level) if(food_level < 10) @@ -673,8 +677,10 @@ to_chat(user, "[src] already has plenty of food in it. You decide to not add more.") else to_chat(user, "[src] doesn't have any water in it. You should fill it with water first.") + + return ITEM_INTERACT_COMPLETE //Fish egg scoop - else if(istype(O, /obj/item/egg_scoop)) + else if(istype(used, /obj/item/egg_scoop)) if(egg_count) // Is the user holding a fish bag? var/obj/item/storage/bag/fish_bag @@ -686,18 +692,22 @@ harvest_eggs(user, fish_bag) else user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.") + + return ITEM_INTERACT_COMPLETE //Fish net - else if(istype(O, /obj/item/fish_net)) + else if(istype(used, /obj/item/fish_net)) harvest_fish(user) + return ITEM_INTERACT_COMPLETE //Tank brush - else if(istype(O, /obj/item/tank_brush)) + else if(istype(used, /obj/item/tank_brush)) if(filth_level == 0) to_chat(user, "[src] is already spotless!") else adjust_filth_level(-filth_level) user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.") - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/fishtank/wrench_act(mob/user, obj/item/I) //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process . = TRUE diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index 998a0eba2390..18b702a2a681 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -40,49 +40,49 @@ else qdel(recipe) -/obj/machinery/bottler/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(!user.canUnEquip(O, 0)) - to_chat(user, "[O] is stuck to your hand, you can't seem to put it down!") - return 0 - if(is_type_in_list(O,acceptable_items)) - if(istype(O, /obj/item/food)) - var/obj/item/food/S = O +/obj/machinery/bottler/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(!user.canUnEquip(used, 0)) + to_chat(user, "[used] is stuck to your hand, you can't seem to put it down!") + return ITEM_INTERACT_COMPLETE + if(is_type_in_list(used,acceptable_items)) + if(istype(used, /obj/item/food)) + var/obj/item/food/S = used user.drop_item_to_ground(S) if(S.reagents && !S.reagents.total_volume) //This prevents us from using empty foods, should one occur due to some sort of error to_chat(user, "[S] is gone, oh no!") qdel(S) //Delete the food object because it is useless even as food due to the lack of reagents else insert_item(S, user) - return 1 - else if(istype(O, /obj/item/reagent_containers/drinks/cans)) - var/obj/item/reagent_containers/drinks/cans/C = O + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/reagent_containers/drinks/cans)) + var/obj/item/reagent_containers/drinks/cans/C = used if(C.reagents) if(C.can_opened && C.reagents.total_volume) //This prevents us from using opened cans that still have something in them to_chat(user, "Only unopened cans and bottles can be processed to ensure product integrity.") - return 0 + return ITEM_INTERACT_COMPLETE user.drop_item_to_ground(C) if(!C.reagents.total_volume) //Empty cans get recycled, even if they have somehow remained unopened due to some sort of error recycle_container(C) else //Full cans that are unopened get inserted for processing as ingredients insert_item(C, user) - return 1 + return ITEM_INTERACT_COMPLETE else - user.drop_item_to_ground(O) - insert_item(O, user) - return 1 - else if(istype(O, /obj/item/trash/can)) //Crushed cans (and bottles) are returnable still - var/obj/item/trash/can/C = O + user.drop_item_to_ground(used) + insert_item(used, user) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/trash/can)) //Crushed cans (and bottles) are returnable still + var/obj/item/trash/can/C = used user.drop_item_to_ground(C) recycle_container(C) - return 1 - else if(istype(O, /obj/item/stack/sheet)) //Sheets of materials can replenish the machine's supply of drink containers (when people inevitably don't return them) - var/obj/item/stack/sheet/S = O + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/stack/sheet)) //Sheets of materials can replenish the machine's supply of drink containers (when people inevitably don't return them) + var/obj/item/stack/sheet/S = used user.drop_item_to_ground(S) process_sheets(S) - return 1 + return ITEM_INTERACT_COMPLETE else //If it doesn't qualify in the above checks, we don't want it. Inform the person so they (ideally) stop trying to put the nuke disc in. to_chat(user, "You aren't sure this is able to be processed by the machine.") - return 0 + return ITEM_INTERACT_COMPLETE /obj/machinery/bottler/wrench_act(mob/user, obj/item/I) . = TRUE diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 24f3218bd199..5f4199d33309 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -6,7 +6,7 @@ do {\ qdel(src);\ } while(FALSE) -/obj/item/food/breadslice/attackby__legacy__attackchain(obj/item/W, mob/user, params) +/obj/item/food/sliced/bread/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/food) && !(W.flags & NODROP)) MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/sandwich) return diff --git a/code/modules/food_and_drinks/food/foods/baked_goods.dm b/code/modules/food_and_drinks/food/foods/baked_goods.dm index 1ae2031b7288..d9c3857e654e 100644 --- a/code/modules/food_and_drinks/food/foods/baked_goods.dm +++ b/code/modules/food_and_drinks/food/foods/baked_goods.dm @@ -10,7 +10,7 @@ desc = "A favorite desert of a certain wascally wabbit. Not a lie." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "carrotcake" - slice_path = /obj/item/food/carrotcakeslice + slice_path = /obj/item/food/sliced/carrot_cake slices_num = 5 bitesize = 3 filling_color = "#FFD675" @@ -18,13 +18,14 @@ tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/carrotcakeslice +/obj/item/food/sliced/carrot_cake name = "carrot cake slice" desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "carrotcake_slice" trash = /obj/item/trash/plate filling_color = "#FFD675" + list_reagents = list("nutriment" = 4, "oculine" = 2, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -34,7 +35,7 @@ desc = "A squishy cake-thing." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "braincake" - slice_path = /obj/item/food/braincakeslice + slice_path = /obj/item/food/sliced/brain_cake slices_num = 5 filling_color = "#E6AEDB" bitesize = 3 @@ -42,13 +43,14 @@ tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/braincakeslice +/obj/item/food/sliced/brain_cake name = "brain cake slice" desc = "Lemme tell you something about brains. THEY'RE DELICIOUS." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "braincakeslice" trash = /obj/item/trash/plate filling_color = "#E6AEDB" + list_reagents = list("protein" = 2, "nutriment" = 2, "mannitol" = 2, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) goal_difficulty = FOOD_GOAL_NORMAL @@ -57,7 +59,7 @@ desc = "DANGEROUSLY cheesy." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "cheesecake" - slice_path = /obj/item/food/cheesecakeslice + slice_path = /obj/item/food/sliced/cheese_cake slices_num = 5 filling_color = "#FAF7AF" bitesize = 3 @@ -65,13 +67,14 @@ tastes = list("cake" = 4, "cream cheese" = 3) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/cheesecakeslice +/obj/item/food/sliced/cheese_cake name = "cheese cake slice" desc = "Slice of pure cheestisfaction." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "cheesecake_slice" trash = /obj/item/trash/plate filling_color = "#FAF7AF" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 4, "cream cheese" = 3) goal_difficulty = FOOD_GOAL_EASY @@ -80,7 +83,7 @@ desc = "A plain cake, not a lie." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "plaincake" - slice_path = /obj/item/food/plaincakeslice + slice_path = /obj/item/food/sliced/plain_cake slices_num = 5 bitesize = 3 filling_color = "#F7EDD5" @@ -88,13 +91,14 @@ tastes = list("cake" = 5, "vanilla" = 1, "sweetness" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/plaincakeslice +/obj/item/food/sliced/plain_cake name = "plain cake slice" desc = "Just a slice of cake, it is enough for everyone." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "plaincake_slice" trash = /obj/item/trash/plate filling_color = "#F7EDD5" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "vanilla" = 1, "sweetness" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -103,7 +107,7 @@ desc = "A cake with added orange." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "orangecake" - slice_path = /obj/item/food/orangecakeslice + slice_path = /obj/item/food/sliced/orange_cake slices_num = 5 bitesize = 3 filling_color = "#FADA8E" @@ -111,13 +115,14 @@ tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/orangecakeslice +/obj/item/food/sliced/orange_cake name = "orange cake slice" desc = "Just a slice of cake, it is enough for everyone." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "orangecake_slice" trash = /obj/item/trash/plate filling_color = "#FADA8E" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -126,7 +131,7 @@ desc = "A cake with added bananas." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "bananacake" - slice_path = /obj/item/food/bananacakeslice + slice_path = /obj/item/food/sliced/banana_cake slices_num = 5 bitesize = 3 filling_color = "#FADA8E" @@ -134,13 +139,14 @@ tastes = list("cake" = 5, "sweetness" = 2, "banana" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/bananacakeslice +/obj/item/food/sliced/banana_cake name = "banana cake slice" desc = "Just a slice of cake, it is enough for everyone." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "bananacake_slice" trash = /obj/item/trash/plate filling_color = "#FADA8E" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 2, "banana" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -150,20 +156,21 @@ icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "limecake" bitesize = 3 - slice_path = /obj/item/food/limecakeslice + slice_path = /obj/item/food/sliced/lime_cake slices_num = 5 filling_color = "#CBFA8E" list_reagents = list("nutriment" = 20, "vitamin" = 5) tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/limecakeslice +/obj/item/food/sliced/lime_cake name = "lime cake slice" desc = "Just a slice of cake, it is enough for everyone." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "limecake_slice" trash = /obj/item/trash/plate filling_color = "#CBFA8E" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -172,7 +179,7 @@ desc = "A cake with added lemon." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "lemoncake" - slice_path = /obj/item/food/lemoncakeslice + slice_path = /obj/item/food/sliced/lemon_cake slices_num = 5 bitesize = 3 filling_color = "#FAFA8E" @@ -180,13 +187,14 @@ tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/lemoncakeslice +/obj/item/food/sliced/lemon_cake name = "lemon cake slice" desc = "Just a slice of cake, it is enough for everyone." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "lemoncake_slice" trash = /obj/item/trash/plate filling_color = "#FAFA8E" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -195,7 +203,7 @@ desc = "A cake with added chocolate." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "chocolatecake" - slice_path = /obj/item/food/chocolatecakeslice + slice_path = /obj/item/food/sliced/chocolate_cake slices_num = 5 bitesize = 3 filling_color = "#805930" @@ -203,13 +211,14 @@ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/chocolatecakeslice +/obj/item/food/sliced/chocolate_cake name = "chocolate cake slice" desc = "Just a slice of cake, it is enough for everyone." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "chocolatecake_slice" trash = /obj/item/trash/plate filling_color = "#805930" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) goal_difficulty = FOOD_GOAL_EASY @@ -218,7 +227,7 @@ desc = "Happy Birthday..." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "birthdaycake" - slice_path = /obj/item/food/birthdaycakeslice + slice_path = /obj/item/food/sliced/birthday_cake slices_num = 5 filling_color = "#FFD6D6" bitesize = 3 @@ -226,13 +235,14 @@ tastes = list("cake" = 5, "sweetness" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/birthdaycakeslice +/obj/item/food/sliced/birthday_cake name = "birthday cake slice" desc = "A slice of your birthday!" icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "birthdaycakeslice" trash = /obj/item/trash/plate filling_color = "#FFD6D6" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 1) goal_difficulty = FOOD_GOAL_NORMAL @@ -241,7 +251,7 @@ desc = "A cake centered with Apple." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "applecake" - slice_path = /obj/item/food/applecakeslice + slice_path = /obj/item/food/sliced/apple_cake slices_num = 5 bitesize = 3 filling_color = "#EBF5B8" @@ -249,13 +259,14 @@ tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/applecakeslice +/obj/item/food/sliced/apple_cake name = "apple cake slice" desc = "A slice of heavenly cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "applecakeslice" trash = /obj/item/trash/plate filling_color = "#EBF5B8" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -264,21 +275,22 @@ desc = "A cake made for angels and chaplains alike! Contains holy water." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "holy_cake" - slice_path = /obj/item/food/holy_cake_slice + slice_path = /obj/item/food/sliced/holy_cake slices_num = 5 bitesize = 3 filling_color = "#ffffff" - list_reagents = list("nutriment" = 1, "vitamin" = 3, "holywater" = 10) + list_reagents = list("nutriment" = 5, "vitamin" = 5, "holywater" = 10) tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/holy_cake_slice +/obj/item/food/sliced/holy_cake name = "holy cake slice" desc = "A slice of heavenly cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "holy_cake_slice" trash = /obj/item/trash/plate filling_color = "#ffffff" + list_reagents = list("nutriment" = 1, "vitamin" = 1, "holywater" = 2) tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -287,7 +299,7 @@ desc = "A chocolate cake with five strawberries on top. For some reason, this configuration of cake is particularly aesthetically pleasing to AIs in SELF." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "liars_cake" - slice_path = /obj/item/food/liars_slice + slice_path = /obj/item/food/sliced/liars slices_num = 5 bitesize = 3 filling_color = "#240606c7" @@ -295,7 +307,7 @@ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2, "cake" = 3) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/liars_slice +/obj/item/food/sliced/liars name = "strawberry chocolate cake slice" desc = "Just a slice of cake with five strawberries on top. \ For some reason, this configuration of cake is particularly aesthetically pleasing to AIs in SELF." @@ -303,6 +315,7 @@ icon_state = "liars_slice" trash = /obj/item/trash/plate filling_color = "#ffffff" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "cocoa" = 1) tastes = list("strawberries" = 2, "chocolate" = 2, "sweetness" = 2, "cake" = 3) goal_difficulty = FOOD_GOAL_EASY @@ -311,7 +324,7 @@ desc = "A plain cake, filled with assortment of blackberries and strawberries!" icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "vanilla_berry_cake" - slice_path = /obj/item/food/vanilla_berry_cake_slice + slice_path = /obj/item/food/sliced/vanilla_berry_cake slices_num = 5 bitesize = 3 filling_color = "#f0e3e3c7" @@ -319,13 +332,14 @@ tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/vanilla_berry_cake_slice +/obj/item/food/sliced/vanilla_berry_cake name = "blackberry and strawberry vanilla cake slice" desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "vanilla_berry_cake_slice" trash = /obj/item/trash/plate filling_color = "#ffffff" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "vanilla" = 1) tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) goal_difficulty = FOOD_GOAL_EASY @@ -334,7 +348,7 @@ desc = "A \"cake\" that is made with electronic boards and leaks acid..." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "hardware_cake" - slice_path = /obj/item/food/hardware_cake_slice + slice_path = /obj/item/food/sliced/hardware_cake slices_num = 5 bitesize = 3 filling_color = "#4ac25e" @@ -342,13 +356,14 @@ tastes = list("acid" = 3, "metal" = 4, "glass" = 5) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/hardware_cake_slice +/obj/item/food/sliced/hardware_cake name = "hardware cake slice" desc = "A slice of electronic boards and some acid." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "hardware_cake_slice" trash = /obj/item/trash/plate filling_color = "#4ac25e" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "sacid" = 3, "oil" = 3) tastes = list("acid" = 3, "metal" = 4, "glass" = 5) goal_difficulty = FOOD_GOAL_EASY @@ -357,7 +372,7 @@ desc = "A cake centred with Plums." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "plum_cake" - slice_path = /obj/item/food/plum_cake_slice + slice_path = /obj/item/food/sliced/plum_cake slices_num = 5 bitesize = 3 filling_color = "#a128c5" @@ -365,13 +380,14 @@ tastes = list("cake" = 5, "sweetness" = 1, "plum" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/plum_cake_slice +/obj/item/food/sliced/plum_cake name = "plum cake slice" desc = "A slice of plum cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "plum_cake_slice" trash = /obj/item/trash/plate filling_color = "#a128c5" + list_reagents = list("nutriment" = 4, "vitamin" = 2) tastes = list("cake" = 5, "sweetness" = 1, "plum" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -380,7 +396,7 @@ desc = "A condensed cake made for filling people up quickly." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "pound_cake" - slice_path = /obj/item/food/pound_cake_slice + slice_path = /obj/item/food/sliced/pound_cake slices_num = 5 bitesize = 3 filling_color = "#c4cab7" @@ -388,13 +404,14 @@ tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/pound_cake_slice +/obj/item/food/sliced/pound_cake name = "pound cake slice" desc = "A slice of condensed cake made for filling people up quickly." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "pound_cake_slice" trash = /obj/item/trash/plate filling_color = "#ffffff" + list_reagents = list("nutriment" = 12, "vitamin" = 4) tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -403,7 +420,7 @@ desc = "A hollow cake with real pumpkin." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "pumpkin_spice_cake" - slice_path = /obj/item/food/pumpkin_spice_cake_slice + slice_path = /obj/item/food/sliced/pumpkin_spice_cake slices_num = 5 bitesize = 3 filling_color = "#ee710a" @@ -411,13 +428,14 @@ tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/pumpkin_spice_cake_slice +/obj/item/food/sliced/pumpkin_spice_cake name = "pumpkin spice cake slice" desc = "A spicy slice of pumpkin goodness." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "pumpkin_spice_cake_slice" trash = /obj/item/trash/plate filling_color = "#ee710a" + list_reagents = list("nutriment" = 4, "vitamin" = 2) tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -426,7 +444,7 @@ desc = "A cake made of slimes. Probably not electrified." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "slime_cake" - slice_path = /obj/item/food/slime_cake_slice + slice_path = /obj/item/food/sliced/slime_cake slices_num = 5 bitesize = 3 filling_color = "#0adfee" @@ -434,13 +452,14 @@ tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/slime_cake_slice +/obj/item/food/sliced/slime_cake name = "slime cake slice" desc = "A slice of slime cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "slime_cake_slice" trash = /obj/item/trash/plate filling_color = "#0adfee" + list_reagents = list("nutriment" = 4, "vitamin" = 2) tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -449,7 +468,7 @@ desc = "A spaceman's trumpet frosted cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "trumpet_cake" - slice_path = /obj/item/food/spaceman_cake_slice + slice_path = /obj/item/food/sliced/spaceman_cake slices_num = 5 bitesize = 3 filling_color = "#610977" @@ -457,13 +476,14 @@ tastes = list("cake" = 4, "violets" = 2, "jam" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/spaceman_cake_slice +/obj/item/food/sliced/spaceman_cake name = "spaceman's cake slice" desc = "A slice of spaceman's trumpet frosted cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "trumpet_cake_slice" trash = /obj/item/trash/plate filling_color = "#610977" + list_reagents = list("nutriment" = 4, "vitamin" = 2, "cream" = 1, "berryjuice" = 1) tastes = list("cake" = 4, "violets" = 2, "jam" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -472,7 +492,7 @@ desc = "A vanilla frosted cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "vanilla_cake" - slice_path = /obj/item/food/vanilla_cake_slice + slice_path = /obj/item/food/sliced/vanilla_cake slices_num = 5 bitesize = 3 filling_color = "#ece7ee" @@ -480,12 +500,13 @@ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/vanilla_cake_slice +/obj/item/food/sliced/vanilla_cake name = "vanilla cake slice" desc = "A slice of vanilla frosted cake." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "vanilla_cake_slice" filling_color = "#ece7ee" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "sugar" = 3, "vanilla" = 3) tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) goal_difficulty = FOOD_GOAL_EASY @@ -494,21 +515,22 @@ desc = "A light and fluffy vegan marshmallow flavoured with vanilla and rum and topped with soft chocolate. These are known to the moths as höllflöfstarkken: cloud squares." //höllflöf = cloud (höll = wind, flöf = cotton), starkken = squares icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "mothmallow_tray" - list_reagents = list("nutriment" = 20, "sugar" = 20) - slice_path = /obj/item/food/mothmallowslice + slice_path = /obj/item/food/sliced/mothmallow slices_num = 5 bitesize = 3 filling_color = "#eebe98" + list_reagents = list("nutriment" = 20, "sugar" = 20) tastes = list("vanilla" = 1, "clouds" = 1, "chocolate" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/mothmallowslice +/obj/item/food/sliced/mothmallow name = "mothmallow" desc = "Fluffy little clouds of joy- in a strangely moth-like colour." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "mothmallow_slice" filling_color = "#ece7ee" filling_color = "#eebe98" + list_reagents = list("nutriment" = 4, "sugar" = 4) tastes = list("vanilla" = 1, "clouds" = 1, "chocolate" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -690,7 +712,7 @@ desc = "A delicious treat for the autumn months." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "pumpkinpie" - slice_path = /obj/item/food/pumpkinpieslice + slice_path = /obj/item/food/sliced/pumpkinpie slices_num = 5 bitesize = 3 filling_color = "#F5B951" @@ -698,13 +720,14 @@ tastes = list("pie" = 1, "pumpkin" = 1) goal_difficulty = FOOD_GOAL_NORMAL -/obj/item/food/pumpkinpieslice +/obj/item/food/sliced/pumpkinpie name = "pumpkin pie slice" desc = "A slice of pumpkin pie, with whipped cream on top. Perfection." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "pumpkinpieslice" trash = /obj/item/trash/plate filling_color = "#F5B951" + list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("pie" = 1, "pumpkin" = 1) goal_difficulty = FOOD_GOAL_NORMAL @@ -723,21 +746,22 @@ desc = "An odd blue pie made with toxic blumpkin." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "blumpkin_pie" - slice_path = /obj/item/food/blumpkin_pie_slice + slice_path = /obj/item/food/sliced/blumpkin_pie slices_num = 5 bitesize = 3 filling_color = "#102d8b" - list_reagents = list("nutriment" = 13, "vitamin" = 6, "blumpkinjuice" = 5) + list_reagents = list("nutriment" = 20, "vitamin" = 5, "blumpkinjuice" = 5) tastes = list("pie" = 1, "a mouthful of pool water" = 1) goal_difficulty = FOOD_GOAL_NORMAL -/obj/item/food/blumpkin_pie_slice +/obj/item/food/sliced/blumpkin_pie name = "blumpkin pie slice" desc = "A slice of blumpkin pie, with whipped cream on top. Is this edible?" icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "blumpkin_pie_slice" trash = /obj/item/trash/plate filling_color = "#102d8b" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "blumpkinjuice" = 1) tastes = list("pie" = 1, "a mouthful of pool water" = 1) goal_difficulty = FOOD_GOAL_NORMAL @@ -746,21 +770,22 @@ desc = "A decadent pie made of a creamy chocolate mousse filling topped with a layer of whipped cream and chocolate shavings. Sliceable." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "french_silk_pie" - slice_path = /obj/item/food/french_silk_pie_slice + slice_path = /obj/item/food/sliced/french_silk_pie slices_num = 5 bitesize = 3 filling_color = "#5e4337" - list_reagents = list("nutriment" = 12, "vitamin" = 4) + list_reagents = list("nutriment" = 15, "vitamin" = 5) tastes = list("pie" = 1, "smooth chocolate" = 1, "whipped cream" = 1) goal_difficulty = FOOD_GOAL_NORMAL -/obj/item/food/french_silk_pie_slice +/obj/item/food/sliced/french_silk_pie name = "french silk pie slice" desc = "A slice of french silk pie, filled with a chocolate mousse and topped with a layer of whipped cream and chocolate shavings. Delicious enough to make you cry." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "french_silk_pie_slice" trash = /obj/item/trash/plate filling_color = "#5e4337" + list_reagents = list("nutriment" = 3, "vitamin" = 1) tastes = list("pie" = 1, "smooth chocolate" = 1, "whipped cream" = 1) goal_difficulty = FOOD_GOAL_NORMAL @@ -769,21 +794,22 @@ desc = "Tastes like blue and cold." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "frosty_pie" - slice_path = /obj/item/food/frosty_pie_slice + slice_path = /obj/item/food/sliced/frosty_pie slices_num = 5 bitesize = 3 filling_color = "#5e4337" - list_reagents = list("nutriment" = 14, "vitamin" = 6) + list_reagents = list("nutriment" = 15, "vitamin" = 5) tastes = list("mint" = 1, "pie" = 1) goal_difficulty = FOOD_GOAL_NORMAL -/obj/item/food/frosty_pie_slice +/obj/item/food/sliced/frosty_pie name = "frosty pie slice" desc = "Tasty blue, like my favourite crayon!" icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "frosty_pie_slice" trash = /obj/item/trash/plate filling_color = "#338cb6" + list_reagents = list("nutriment" = 3, "vitamin" = 1) tastes = list("mint" = 1, "pie" = 1) goal_difficulty = FOOD_GOAL_NORMAL @@ -1325,21 +1351,22 @@ desc = "A delicious jelly made with sweet potatoes." icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "dulce_de_batata" - slice_path = /obj/item/food/dulce_de_batata_slice + slice_path = /obj/item/food/sliced/dulce_de_batata slices_num = 5 bitesize = 3 filling_color = "#411b02" - list_reagents = list("nutriment" = 14, "vitamin" = 8) + list_reagents = list("nutriment" = 15, "vitamin" = 10) tastes = list("jelly" = 1, "sweet potato" = 1) goal_difficulty = FOOD_GOAL_NORMAL -/obj/item/food/dulce_de_batata_slice +/obj/item/food/sliced/dulce_de_batata name = "dulce de batata slice" desc = "Tasty blue, like my favourite crayon!" icon = 'icons/obj/food/bakedgoods.dmi' icon_state = "dulce_de_batata_slice" trash = /obj/item/trash/plate filling_color = "#411b02" + list_reagents = list("nutriment" = 3, "vitamin" = 2) tastes = list("jelly" = 1, "sweet potato" = 1) goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/bread.dm b/code/modules/food_and_drinks/food/foods/bread.dm index 31eb3b340960..c18ab05c686f 100644 --- a/code/modules/food_and_drinks/food/foods/bread.dm +++ b/code/modules/food_and_drinks/food/foods/bread.dm @@ -8,19 +8,21 @@ desc = "The culinary base of every self-respecting eloquen/tg/entleman." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "meatbread" - slice_path = /obj/item/food/meatbreadslice + slice_path = /obj/item/food/sliced/meat_bread slices_num = 5 filling_color = "#FF7575" list_reagents = list("protein" = 20, "nutriment" = 10, "vitamin" = 5) tastes = list("bread" = 10, "meat" = 10) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/meatbreadslice +/obj/item/food/sliced/meat_bread name = "meatbread slice" desc = "A slice of delicious meatbread." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "meatbreadslice" filling_color = "#FF7575" + list_reagents = list("protein" = 4, "nutriment" = 2, "vitamin" = 1) + tastes = list("bread" = 10, "meat" = 10) goal_difficulty = FOOD_GOAL_EASY /obj/item/food/sliceable/xenomeatbread @@ -28,19 +30,21 @@ desc = "The culinary base of every self-respecting eloquent gentleman. Extra Heretical." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "xenomeatbread" - slice_path = /obj/item/food/xenomeatbreadslice + slice_path = /obj/item/food/sliced/xeno_meat_bread slices_num = 5 filling_color = "#8AFF75" list_reagents = list("protein" = 20, "nutriment" = 10, "vitamin" = 5) tastes = list("bread" = 10, "acid" = 10) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/xenomeatbreadslice +/obj/item/food/sliced/xeno_meat_bread name = "xenomeatbread slice" desc = "A slice of delicious meatbread. Extra Heretical." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "xenobreadslice" filling_color = "#8AFF75" + list_reagents = list("protein" = 4, "nutriment" = 2, "vitamin" = 1) + tastes = list("bread" = 10, "acid" = 10) goal_difficulty = FOOD_GOAL_EXCESSIVE /obj/item/food/sliceable/spidermeatbread @@ -48,17 +52,18 @@ desc = "Reassuringly green meatloaf made from spider meat." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "spidermeatbread" - slice_path = /obj/item/food/spidermeatbreadslice + slice_path = /obj/item/food/sliced/spider_meat_bread slices_num = 5 list_reagents = list("protein" = 20, "nutriment" = 10, "toxin" = 15, "vitamin" = 5) tastes = list("bread" = 10, "cobwebs" = 5) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/spidermeatbreadslice +/obj/item/food/sliced/spider_meat_bread name = "spider meat bread slice" desc = "A slice of meatloaf made from an animal that most likely still wants you dead." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "spidermeatslice" + list_reagents = list("protein" = 4, "nutriment" = 2, "toxin" = 3, "vitamin" = 1) tastes = list("bread" = 10, "cobwebs" = 5) list_reagents = list("toxin" = 2) goal_difficulty = FOOD_GOAL_EXCESSIVE @@ -68,19 +73,20 @@ desc = "A heavenly and filling treat." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "bananabread" - slice_path = /obj/item/food/bananabreadslice + slice_path = /obj/item/food/sliced/banana_bread slices_num = 5 filling_color = "#EDE5AD" list_reagents = list("banana" = 20, "nutriment" = 20) tastes = list("bread" = 10, "banana" = 5) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/bananabreadslice +/obj/item/food/sliced/banana_bread name = "banana-nut bread slice" desc = "A slice of delicious banana bread." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "bananabreadslice" filling_color = "#EDE5AD" + list_reagents = list("banana" = 4, "nutriment" = 4) tastes = list("bread" = 10, "banana" = 5) goal_difficulty = FOOD_GOAL_EASY @@ -89,19 +95,21 @@ desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "tofubread" - slice_path = /obj/item/food/tofubreadslice + slice_path = /obj/item/food/sliced/tofu_bread slices_num = 5 filling_color = "#F7FFE0" list_reagents = list("nutriment" = 20, "vitamin" = 5) tastes = list("bread" = 10, "tofu" = 10) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/tofubreadslice +/obj/item/food/sliced/tofu_bread name = "tofubread slice" desc = "A slice of delicious tofubread." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "tofubreadslice" filling_color = "#F7FFE0" + list_reagents = list("nutriment" = 4, "vitamin" = 1) + tastes = list("bread" = 10, "tofu" = 10) goal_difficulty = FOOD_GOAL_EASY /obj/item/food/sliceable/bread @@ -109,20 +117,20 @@ desc = "Some plain old Earthen bread." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "bread" - slice_path = /obj/item/food/breadslice + slice_path = /obj/item/food/sliced/bread slices_num = 6 filling_color = "#FFE396" list_reagents = list("nutriment" = 10) tastes = list("bread" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/breadslice +/obj/item/food/sliced/bread name = "bread slice" desc = "A slice of home." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "breadslice" filling_color = "#D27332" - list_reagents = list("nutriment" = 2, "bread" = 5) + list_reagents = list("nutriment" = 2, "bread" = 5) // TODO Why bread? tastes = list("bread" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -131,14 +139,14 @@ desc = "Yum yum yum!" icon = 'icons/obj/food/burgerbread.dmi' icon_state = "creamcheesebread" - slice_path = /obj/item/food/creamcheesebreadslice + slice_path = /obj/item/food/sliced/cream_cheese_bread slices_num = 5 filling_color = "#FFF896" list_reagents = list("nutriment" = 20, "vitamin" = 5) tastes = list("bread" = 10, "cheese" = 10) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/creamcheesebreadslice +/obj/item/food/sliced/cream_cheese_bread name = "cream cheese bread slice" desc = "A slice of yum!" icon = 'icons/obj/food/burgerbread.dmi' @@ -153,14 +161,14 @@ desc = "A loaf of delicious mah'weyh pleggh at e'ntrath!" icon = 'icons/obj/food/burgerbread.dmi' icon_state = "banarnarbread" - slice_path = /obj/item/food/banarnarbreadslice + slice_path = /obj/item/food/sliced/banarnarbread slices_num = 5 filling_color = "#6F0000" list_reagents = list("nutriment" = 20, "vitamin" = 5) tastes = list("heresy" = 10, "banana" = 10) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/banarnarbreadslice +/obj/item/food/sliced/banarnarbread name = "banarnarbread slice" desc = "A slice of delicious mah'weyh pleggh at e'ntrath!" icon = 'icons/obj/food/burgerbread.dmi' diff --git a/code/modules/food_and_drinks/food/foods/frozen.dm b/code/modules/food_and_drinks/food/foods/frozen.dm index 2e546c7aa52a..f616b9c3dbc6 100644 --- a/code/modules/food_and_drinks/food/foods/frozen.dm +++ b/code/modules/food_and_drinks/food/foods/frozen.dm @@ -16,16 +16,17 @@ desc = "A funny cake with a clown face on it." icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "clowncake" - slice_path = /obj/item/food/frozen/clowncakeslice + slice_path = /obj/item/food/sliced/clowncake slices_num = 5 bitesize = 3 list_reagents = list("nutriment" = 20, "sugar" = 5, "vitamin" = 5, "banana" = 15) tastes = list("cake" = 5, "sweetness" = 2, "banana" = 1, "sad clowns" = 1, "ice-cream" = 1) goal_difficulty = FOOD_GOAL_EXCESSIVE -/obj/item/food/frozen/clowncakeslice +/obj/item/food/sliced/clowncake name = "clown cake slice" desc = "A slice of bad jokes, and silly props." + icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "clowncake_slice" trash = /obj/item/trash/plate filling_color = "#FFD675" diff --git a/code/modules/food_and_drinks/food/foods/ingredients.dm b/code/modules/food_and_drinks/food/foods/ingredients.dm index da8df590bd88..43548eacc26e 100644 --- a/code/modules/food_and_drinks/food/foods/ingredients.dm +++ b/code/modules/food_and_drinks/food/foods/ingredients.dm @@ -41,89 +41,91 @@ name = "cheese wheel" desc = "A big wheel of delicious Cheddar." icon_state = "cheesewheel" - slice_path = /obj/item/food/cheesewedge + slice_path = /obj/item/food/sliced/cheesewedge slices_num = 5 filling_color = "#FFF700" - list_reagents = list("nutriment" = 15, "vitamin" = 5, "cheese" = 20) + list_reagents = list("nutriment" = 16, "vitamin" = 4, "cheese" = 20) tastes = list("cheese" = 1) -/obj/item/food/cheesewedge +/obj/item/food/sliced/cheesewedge name = "cheese wedge" desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." icon_state = "cheesewedge" filling_color = "#FFF700" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "cheese" = 5) tastes = list("cheese" = 1) /obj/item/food/sliceable/cheesewheel/smoked name = "smoked cheese wheel" desc = "A wheel of fancy imported-style smoked cheese." icon_state = "cheesewheel-smoked" - slice_path = /obj/item/food/cheesewedge/smoked + slice_path = /obj/item/food/sliced/cheesewedge/smoked slices_num = 4 - list_reagents = list("nutriment" = 2, "vitamin" = 2, "cheese" = 15) + list_reagents = list("nutriment" = 16, "vitamin" = 4, "cheese" = 20) tastes = list("cheese" = 1, "smoke" = 2) -/obj/item/food/cheesewedge/smoked +/obj/item/food/sliced/cheesewedge/smoked name = "smoked cheese wedge" desc = "A wedge of fancy smoked cheese." icon_state = "cheesewedge-smoked" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "cheese" = 5) tastes = list("cheese" = 1, "smoke" = 2) /obj/item/food/sliceable/cheesewheel/edam name = "edam cheese wheel" desc = "A wheel of mild edam cheese." icon_state = "cheesewheel-edam" - slice_path = /obj/item/food/cheesewedge/edam + slice_path = /obj/item/food/sliced/cheesewedge/edam slices_num = 4 - list_reagents = list("nutriment" = 2, "vitamin" = 2, "cheese" = 15) + list_reagents = list("nutriment" = 16, "vitamin" = 4, "cheese" = 20) tastes = list("cheese" = 1, "salt" = 2, "almonds" = 2) -/obj/item/food/cheesewedge/edam +/obj/item/food/sliced/cheesewedge/edam name = "edam cheese wedge" desc = "A wedge of mild edam cheese. It's said to have a nutty flavor." icon_state = "cheesewedge-edam" + list_reagents = list("nutriment" = 4, "vitamin" = 1, "cheese" = 5) tastes = list("cheese" = 1, "salt" = 2, "almonds" = 2) /obj/item/food/sliceable/cheesewheel/blue name = "blue cheese wheel" desc = "A wheel of pungent blue cheese. It's an acquired taste..." icon_state = "cheesewheel-blue" - slice_path = /obj/item/food/cheesewedge/blue - slices_num = 5 - list_reagents = list("nutriment" = 2, "vitamin" = 2, "cheese" = 10) + slice_path = /obj/item/food/sliced/cheesewedge/blue + slices_num = 4 + list_reagents = list("nutriment" = 4, "vitamin" = 4, "cheese" = 12) tastes = list("strong cheese" = 2, "salt" = 1, "bitter mold" = 1) -/obj/item/food/cheesewedge/blue +/obj/item/food/sliced/cheesewedge/blue name = "blue cheese wedge" desc = "A wedge of pungent blue cheese. The flavor is... intense." icon_state = "cheesewedge-blue" bitesize = 2 + list_reagents = list("nutriment" = 1, "vitamin" = 1, "cheese" = 3) tastes = list("strong cheese" = 2, "salt" = 1, "bitter mold" = 1) /obj/item/food/sliceable/cheesewheel/camembert name = "camembert cheese wheel" desc = "A miniature wheel of gooey camembert. Yum..." icon_state = "cheesewheel-camembert" - slice_path = /obj/item/food/cheesewedge/camembert + slice_path = /obj/item/food/sliced/cheesewedge/camembert slices_num = 2 - list_reagents = list("nutriment" = 1, "vitamin" = 2, "cheese" = 6) + list_reagents = list("nutriment" = 4, "vitamin" = 4, "cheese" = 8) tastes = list("mild cheese" = 3, "gooeyness" = 1) -/obj/item/food/cheesewedge/camembert +/obj/item/food/sliced/cheesewedge/camembert name = "camembert cheese slice" desc = "A piece of camembert. It's soft and gooey." icon_state = "cheesewedge-camembert" bitesize = 2 + list_reagents = list("nutriment" = 2, "vitamin" = 2, "cheese" = 4) tastes = list("mild cheese" = 3, "gooeyness" = 1) -/obj/item/food/cheesewedge/checkpass(passflag) +/obj/item/food/sliced/cheesewedge/checkpass(passflag) if((passflag & PASSDOOR) && ismouse(pulledby)) return TRUE return ..() -/obj/item/food/cheesewedge/presliced - list_reagents = list("nutriment" = 3, "vitamin" = 1, "cheese" = 4) - /obj/item/food/weirdcheesewedge name = "weird cheese" desc = "Some kind of... gooey, messy, gloopy thing. Similar to cheese, but only in the broad sense of the word." @@ -151,14 +153,15 @@ list_reagents = list("plantmatter" = 3, "vitamin" = 1) tastes = list("mushroom" = 1) -/obj/item/food/watermelonslice +/obj/item/food/sliced/watermelon name = "watermelon slice" desc = "A slice of watery goodness." icon_state = "watermelonslice" // Sprite created by https://github.com/binarysudoku for Goonstation, They have relicensed it for our use. filling_color = "#FF3867" + list_reagents = list("plantmatter" = 1) tastes = list("watermelon" = 1) -/obj/item/food/tomatoslice +/obj/item/food/sliced/tomato name = "tomato slice" desc = "A fresh slice of tomato." icon_state = "tomatoslice" @@ -166,11 +169,12 @@ list_reagents = list("plantmatter" = 2) tastes = list("tomato" = 1) -/obj/item/food/pineappleslice +/obj/item/food/sliced/pineapple name = "pineapple slices" desc = "Rings of pineapple." icon_state = "pineappleslice" // Sprite created by https://github.com/binarysudoku for Goonstation, They have relicensed it for our use. filling_color = "#e5b437" + list_reagents = list("plantmatter" = 1, "vitamin" = 1) tastes = list("pineapple" = 1) @@ -204,18 +208,18 @@ desc = "Some flattened dough." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "flat dough" - slice_path = /obj/item/food/doughslice + slice_path = /obj/item/food/sliced/dough slices_num = 3 list_reagents = list("nutriment" = 6) tastes = list("dough" = 1) -/obj/item/food/doughslice +/obj/item/food/sliced/dough name = "dough slice" desc = "The building block of an impressive dish." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "doughslice" - list_reagents = list("nutriment" = 1) + list_reagents = list("nutriment" = 2) tastes = list("dough" = 1) diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index 022d0dc6fa09..9c0f7b8a94b1 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -564,19 +564,20 @@ desc = "A traditional turkey served with stuffing." icon = 'icons/obj/food/meat.dmi' icon_state = "turkey" - slice_path = /obj/item/food/turkeyslice + slice_path = /obj/item/food/sliced/turkey slices_num = 6 - list_reagents = list("protein" = 24, "nutriment" = 18, "vitamin" = 5) + list_reagents = list("protein" = 24, "nutriment" = 18, "vitamin" = 6) tastes = list("turkey" = 2, "stuffing" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/turkeyslice +/obj/item/food/sliced/turkey name = "turkey serving" desc = "A serving of some tender and delicious turkey." icon = 'icons/obj/food/meat.dmi' icon_state = "turkeyslice" trash = /obj/item/trash/plate filling_color = "#B97A57" + list_reagents = list("protein" = 4, "nutriment" = 3, "vitamin" = 1) tastes = list("turkey" = 1) goal_difficulty = FOOD_GOAL_EASY diff --git a/code/modules/food_and_drinks/food/foods/pizza.dm b/code/modules/food_and_drinks/food/foods/pizza.dm index dc3b01f9ae53..3714831e641a 100644 --- a/code/modules/food_and_drinks/food/foods/pizza.dm +++ b/code/modules/food_and_drinks/food/foods/pizza.dm @@ -14,16 +14,17 @@ name = "margherita pizza" desc = "The golden standard of pizzas." icon_state = "margheritapizza" - slice_path = /obj/item/food/margheritapizzaslice - list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5) + slice_path = /obj/item/food/sliced/margherita_pizza + list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 6) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/margheritapizzaslice +/obj/item/food/sliced/margherita_pizza name = "margherita slice" desc = "A slice of the classic pizza." icon = 'icons/obj/food/pizza.dmi' icon_state = "margheritapizzaslice" filling_color = "#BAA14C" + list_reagents = list("nutriment" = 5, "tomatojuice" = 1, "vitamin" = 1) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -32,17 +33,18 @@ name = "meat pizza" desc = "A pizza with meat topping." icon_state = "meatpizza" - slice_path = /obj/item/food/meatpizzaslice - list_reagents = list("protein" = 30, "tomatojuice" = 6, "vitamin" = 8) + slice_path = /obj/item/food/sliced/meat_pizza + list_reagents = list("protein" = 30, "tomatojuice" = 6, "vitamin" = 6) tastes = list("crust" = 1, "cheese" = 1, "meat" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/meatpizzaslice +/obj/item/food/sliced/meat_pizza name = "meat pizza slice" desc = "A slice of a meaty pizza." icon = 'icons/obj/food/pizza.dmi' icon_state = "meatpizzaslice" filling_color = "#BAA14C" + list_reagents = list("protein" = 5, "tomatojuice" = 1, "vitamin" = 1) tastes = list("crust" = 1, "cheese" = 1, "meat" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -51,17 +53,18 @@ name = "mushroom pizza" desc = "Very special pizza." icon_state = "mushroompizza" - slice_path = /obj/item/food/mushroompizzaslice - list_reagents = list("plantmatter" = 30, "vitamin" = 5) + slice_path = /obj/item/food/sliced/mushroom_pizza + list_reagents = list("plantmatter" = 30, "vitamin" = 6) tastes = list("crust" = 1, "cheese" = 1, "mushroom" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/mushroompizzaslice +/obj/item/food/sliced/mushroom_pizza name = "mushroom pizza slice" desc = "Maybe it is the last slice of pizza in your life." icon = 'icons/obj/food/pizza.dmi' icon_state = "mushroompizzaslice" filling_color = "#BAA14C" + list_reagents = list("plantmatter" = 5, "vitamin" = 1) tastes = list("crust" = 1, "cheese" = 1, "mushroom" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -70,17 +73,18 @@ name = "vegetable pizza" desc = "No Tomato Sapiens were harmed during the making of this pizza." icon_state = "vegetablepizza" - slice_path = /obj/item/food/vegetablepizzaslice - list_reagents = list("plantmatter" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5) + slice_path = /obj/item/food/sliced/vegetable_pizza + list_reagents = list("plantmatter" = 24, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 6) tastes = list("crust" = 1, "tomato" = 1, "carrot" = 1, "vegetables" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/vegetablepizzaslice +/obj/item/food/sliced/vegetable_pizza name = "vegetable pizza slice" desc = "A slice of the most green pizza of all pizzas not containing green ingredients." icon = 'icons/obj/food/pizza.dmi' icon_state = "vegetablepizzaslice" filling_color = "#BAA14C" + list_reagents = list("plantmatter" = 4, "tomatojuice" = 1, "oculine" = 2, "vitamin" = 1) tastes = list("crust" = 1, "tomato" = 1, "carrot" = 1, "vegetables" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -89,17 +93,18 @@ name = "hawaiian pizza" desc = "Love it or hate it, this pizza divides opinions. Complete with juicy pineapple." icon_state = "hawaiianpizza" - slice_path = /obj/item/food/hawaiianpizzaslice - list_reagents = list("protein" = 15, "tomatojuice" = 6, "plantmatter" = 20, "pineapplejuice" = 6, "vitamin" = 5) + slice_path = /obj/item/food/sliced/hawaiian_pizza + list_reagents = list("protein" = 18, "tomatojuice" = 6, "plantmatter" = 24, "pineapplejuice" = 6, "vitamin" = 6) tastes = list("crust" = 1, "cheese" = 1, "pineapple" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/hawaiianpizzaslice +/obj/item/food/sliced/hawaiian_pizza name = "hawaiian pizza slice" desc = "A slice of polarising pizza." icon = 'icons/obj/food/pizza.dmi' icon_state = "hawaiianpizzaslice" filling_color = "#e5b437" + list_reagents = list("protein" = 3, "tomatojuice" = 1, "plantmatter" = 4, "pineapplejuice" = 1, "vitamin" = 1) tastes = list("crust" = 1, "cheese" = 1, "pineapple" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -108,18 +113,19 @@ name = "mac 'n' cheese pizza" desc = "Gastronomists have yet to classify this dish as 'pizza'." icon_state = "macpizza" - slice_path = /obj/item/food/macpizzaslice - list_reagents = list("nutriment" = 40, "vitamin" = 5) //More nutriment because carbs, but it's not any more vitaminicious + slice_path = /obj/item/food/sliced/mac_pizza filling_color = "#ffe45d" + list_reagents = list("nutriment" = 42, "vitamin" = 6) //More nutriment because carbs, but it's not any more vitaminicious tastes = list("crust" = 1, "cheese" = 2, "pasta" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/macpizzaslice +/obj/item/food/sliced/mac_pizza name = "mac 'n' cheese pizza slice" desc = "A delicious slice of pizza topped with macaroni & cheese... wait, what the hell? Who would do this?!" icon = 'icons/obj/food/pizza.dmi' icon_state = "macpizzaslice" filling_color = "#ffe45d" + list_reagents = list("nutriment" = 7, "vitamin" = 1) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 2, "pasta" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -128,18 +134,19 @@ name = "pepperoni pizza" desc = "What did the pepperoni say to the pizza?" icon_state = "pepperonipizza" - slice_path = /obj/item/food/pepperonipizzaslice - list_reagents = list("protein" = 30, "tomatojuice" = 6, "vitamin" = 8) + slice_path = /obj/item/food/sliced/pepperoni_pizza + list_reagents = list("protein" = 30, "tomatojuice" = 6, "vitamin" = 9) filling_color = "#ffe45d" tastes = list("cheese" = 3, "pepperoni" = 3, "grease" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/pepperonipizzaslice +/obj/item/food/sliced/pepperoni_pizza name = "pepperoni pizza slice" desc = "Nice to meat you!" icon = 'icons/obj/food/pizza.dmi' icon_state = "pepperonipizzaslice" filling_color = "#ffe45d" + list_reagents = list("protein" = 5, "tomatojuice" = 1, "vitamin" = 1.5) tastes = list("cheese" = 3, "pepperoni" = 3, "grease" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -148,16 +155,17 @@ name = "cheese pizza" desc = "Cheese, bread, cheese, tomato, and cheese." icon_state = "cheesepizza" - slice_path = /obj/item/food/cheesepizzaslice - list_reagents = list("nutriment" = 40, "tomatojuice" = 6, "vitamin" = 5) + slice_path = /obj/item/food/sliced/cheese_pizza + list_reagents = list("nutriment" = 42, "tomatojuice" = 6, "vitamin" = 6) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/cheesepizzaslice +/obj/item/food/sliced/cheese_pizza name = "cheese pizza slice" desc = "Dangerously cheesy?" icon = 'icons/obj/food/pizza.dmi' icon_state = "cheesepizzaslice" filling_color = "#BAA14C" + list_reagents = list("nutriment" = 7, "tomatojuice" = 1, "vitamin" = 1) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 3) goal_difficulty = FOOD_GOAL_EASY @@ -166,17 +174,18 @@ name = "donk-pocket pizza" desc = "Who thought this would be a good idea?" icon_state = "donkpocketpizza" - slice_path = /obj/item/food/donkpocketpizzaslice - list_reagents = list("nutriment" = 35, "tomatojuice" = 6, "vitamin" = 2, "weak_omnizine" = 6) + slice_path = /obj/item/food/sliced/donk_pocket_pizza + list_reagents = list("nutriment" = 36, "tomatojuice" = 6, "vitamin" = 2, "weak_omnizine" = 6) tastes = list("crust" = 1, "meat" = 1, "laziness" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/donkpocketpizzaslice +/obj/item/food/sliced/donk_pocket_pizza name = "donk-pocket pizza slice" desc = "Smells like lukewarm donk-pocket." icon = 'icons/obj/food/pizza.dmi' icon_state = "donkpocketpizzaslice" filling_color = "#BAA14C" + list_reagents = list("nutriment" = 6, "tomatojuice" = 1, "vitamin" = 2/6, "weak_omnizine" = 1) tastes = list("crust" = 1, "meat" = 1, "laziness" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -185,17 +194,18 @@ name = "dank pizza" desc = "The hippie's pizza of choice." icon_state = "dankpizza" - slice_path = /obj/item/food/dankpizzaslice - list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5, "cbd" = 6, "thc" = 6) + slice_path = /obj/item/food/sliced/dank_pizza + list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 6, "cbd" = 6, "thc" = 6) tastes = list("crust" = 1, "cheese" = 1, "special herbs" = 2) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/dankpizzaslice +/obj/item/food/sliced/dank_pizza name = "dank pizza slice" desc = "So good, man..." icon = 'icons/obj/food/pizza.dmi' icon_state = "dankpizzaslice" filling_color = "#BAA14C" + list_reagents = list("nutriment" = 5, "tomatojuice" = 1, "vitamin" = 1, "cbd" = 1, "thc" = 1) tastes = list("crust" = 1, "cheese" = 1, "special herbs" = 2) goal_difficulty = FOOD_GOAL_EASY @@ -204,17 +214,18 @@ name = "firecracker pizza" desc = "Tastes HOT HOT HOT!" icon_state = "firecrackerpizza" - slice_path = /obj/item/food/firecrackerpizzaslice - list_reagents = list("nutriment" = 30, "vitamin" = 5, "capsaicin" = 12) + slice_path = /obj/item/food/sliced/fire_cracker_pizza + list_reagents = list("nutriment" = 30, "vitamin" = 6, "capsaicin" = 12) tastes = list("crust" = 1, "cheese" = 1, "HOTNESS" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/firecrackerpizzaslice +/obj/item/food/sliced/fire_cracker_pizza name = "firecracker pizza slice" desc = "A spicy slice of something quite nice." icon = 'icons/obj/food/pizza.dmi' icon_state = "firecrackerpizzaslice" filling_color = "#BAA14C" + list_reagents = list("nutriment" = 5, "vitamin" = 1, "capsaicin" = 2) tastes = list("crust" = 1, "cheese" = 1, "HOTNESS" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -223,17 +234,18 @@ name = "\"pesto\" pizza" desc = "Wait a second...this doesn't taste like pesto!" icon_state = "pestopizza" - slice_path = /obj/item/food/pestopizzaslice - list_reagents = list("nutriment" = 30, "tomatojuice" = 12, "vitamin" = 5, "wasabi" = 12) + slice_path = /obj/item/food/sliced/pesto_pizza + list_reagents = list("nutriment" = 30, "tomatojuice" = 12, "vitamin" = 6, "wasabi" = 12) tastes = list("tomato" = 1, "cheese" = 1, "wasabi" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/pestopizzaslice +/obj/item/food/sliced/pesto_pizza name = "\"pesto\" pizza slice" desc = "Delicious and suspicious(ly green)." icon = 'icons/obj/food/pizza.dmi' icon_state = "pestopizzaslice" filling_color = "#BAA14C" + list_reagents = list("nutriment" = 5, "tomatojuice" = 2, "vitamin" = 1, "wasabi" = 2) tastes = list("tomato" = 1, "cheese" = 1, "wasabi" = 1) goal_difficulty = FOOD_GOAL_EASY @@ -242,12 +254,12 @@ name = "garlic pizza" desc = "Ahh, garlic. A universally loved ingredient, except possibly by vampires." icon_state = "garlicpizza" - slice_path = /obj/item/food/garlicpizzaslice + slice_path = /obj/item/food/sliced/garlic_pizza list_reagents = list("plantmatter" = 30, "vitamin" = 5, "garlic" = 12) tastes = list("crust" = 1, "cheese" = 1, "garlic" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/garlicpizzaslice +/obj/item/food/sliced/garlic_pizza name = "garlic pizza slice" desc = "What's not to love?" icon = 'icons/obj/food/pizza.dmi' diff --git a/code/modules/food_and_drinks/food/foods/seafood.dm b/code/modules/food_and_drinks/food/foods/seafood.dm index a381e3ae20be..ca690222f96c 100644 --- a/code/modules/food_and_drinks/food/foods/seafood.dm +++ b/code/modules/food_and_drinks/food/foods/seafood.dm @@ -144,14 +144,14 @@ desc = "A large unsliced roll of Ebi Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Ebi_maki" - slice_path = /obj/item/food/sushi_ebi + slice_path = /obj/item/food/sliced/sushi_ebi slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("shrimp" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_ebi +/obj/item/food/sliced/sushi_ebi name = "ebi sushi" desc = "A simple sushi consisting of cooked shrimp and rice." icon = 'icons/obj/food/seafood.dmi' @@ -166,14 +166,14 @@ desc = "A large unsliced roll of Ikura Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Ikura_maki" - slice_path = /obj/item/food/sushi_ikura + slice_path = /obj/item/food/sliced/sushi_ikura slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8, "protein" = 4) tastes = list("salmon roe" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_ikura +/obj/item/food/sliced/sushi_ikura name = "ikura sushi" desc = "A simple sushi consisting of salmon roe." icon = 'icons/obj/food/seafood.dmi' @@ -188,14 +188,14 @@ desc = "A large unsliced roll of Sake Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Sake_maki" - slice_path = /obj/item/food/sushi_sake + slice_path = /obj/item/food/sliced/sushi_sake slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("raw salmon" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_sake +/obj/item/food/sliced/sushi_sake name = "sake sushi" desc = "A simple sushi consisting of raw salmon and rice." icon = 'icons/obj/food/seafood.dmi' @@ -210,14 +210,14 @@ desc = "A large unsliced roll of Smoked Salmon Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "SmokedSalmon_maki" - slice_path = /obj/item/food/sushi_smoked_salmon + slice_path = /obj/item/food/sliced/sushi_smoked_salmon slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("smoked salmon" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_smoked_salmon +/obj/item/food/sliced/sushi_smoked_salmon name = "smoked salmon sushi" desc = "A simple sushi consisting of cooked salmon and rice." icon = 'icons/obj/food/seafood.dmi' @@ -232,14 +232,14 @@ desc = "A large unsliced roll of Tamago Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Tamago_maki" - slice_path = /obj/item/food/sushi_tamago + slice_path = /obj/item/food/sliced/sushi_tamago slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("egg" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_tamago +/obj/item/food/sliced/sushi_tamago name = "tamago sushi" desc = "A simple sushi consisting of egg and rice." icon = 'icons/obj/food/seafood.dmi' @@ -254,14 +254,14 @@ desc = "A large unsliced roll of Inari Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Inari_maki" - slice_path = /obj/item/food/sushi_inari + slice_path = /obj/item/food/sliced/sushi_inari slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("fried tofu" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_inari +/obj/item/food/sliced/sushi_inari name = "inari sushi" desc = "A piece of fried tofu stuffed with rice." icon = 'icons/obj/food/seafood.dmi' @@ -276,14 +276,14 @@ desc = "A large unsliced roll of Masago Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Masago_maki" - slice_path = /obj/item/food/sushi_masago + slice_path = /obj/item/food/sliced/sushi_masago slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8, "protein" = 4) tastes = list("goldfish roe" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_masago +/obj/item/food/sliced/sushi_masago name = "masago sushi" desc = "A simple sushi consisting of goldfish roe." icon = 'icons/obj/food/seafood.dmi' @@ -298,14 +298,14 @@ desc = "A large unsliced roll of Tobkio Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Tobiko_maki" - slice_path = /obj/item/food/sushi_tobiko + slice_path = /obj/item/food/sliced/sushi_tobiko slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8, "protein" = 4) tastes = list("shark roe" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_tobiko +/obj/item/food/sliced/sushi_tobiko name = "tobiko sushi" desc = "A simple sushi consisting of shark roe." icon = 'icons/obj/food/seafood.dmi' @@ -320,14 +320,14 @@ desc = "A large unsliced roll of Tobkio and Egg Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "TobikoEgg_maki" - slice_path = /obj/item/food/sushi_tobiko_egg + slice_path = /obj/item/food/sliced/sushi_tobiko_egg slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8, "protein" = 4) tastes = list("shark roe" = 1, "rice" = 1, "egg" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_tobiko_egg +/obj/item/food/sliced/sushi_tobiko_egg name = "tobiko and egg sushi" desc = "A sushi consisting of shark roe and an egg." icon = 'icons/obj/food/seafood.dmi' @@ -342,14 +342,14 @@ desc = "A large unsliced roll of Tai Sushi." icon = 'icons/obj/food/seafood.dmi' icon_state = "Tai_maki" - slice_path = /obj/item/food/sushi_tai + slice_path = /obj/item/food/sliced/sushi_tai slices_num = 4 bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("catfish" = 1, "rice" = 1, "seaweed" = 1) goal_difficulty = FOOD_GOAL_DUPLICATE -/obj/item/food/sushi_tai +/obj/item/food/sliced/sushi_tai name = "tai sushi" desc = "A simple sushi consisting of catfish and rice." icon = 'icons/obj/food/seafood.dmi' diff --git a/code/modules/food_and_drinks/food_base.dm b/code/modules/food_and_drinks/food_base.dm index a03e2a1f8fc8..51c2f3587e2f 100644 --- a/code/modules/food_and_drinks/food_base.dm +++ b/code/modules/food_and_drinks/food_base.dm @@ -4,6 +4,7 @@ #define MAX_WEIGHT_CLASS WEIGHT_CLASS_SMALL +//MARK: FOOD /obj/item/food name = "snack" desc = "yummy!" @@ -40,13 +41,13 @@ var/goal_difficulty = FOOD_GOAL_SKIP var/bitecount = 0 - var/trash = null + var/trash var/slice_path var/slices_num - var/dried_type = null + var/dried_type var/dry = FALSE var/cooktype[0] - var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving + var/cooked_type //for microwave cooking. path of the resulting item after microwaving var/total_w_class = 0 //for the total weight an item of food can carry var/list/tastes // for example list("crisps" = 2, "salt" = 1) @@ -273,6 +274,24 @@ W.taste(reagents) W.consume(src) +//MARK: SLICE +/obj/item/food/sliced + +/obj/item/food/sliced/Initialize(mapload, made_by_sliceable = FALSE) + if(made_by_sliceable) + // we null reagent from subclass, because it will get reagents from parent sliceable + list_reagents = list() + return ..() + if(length(list_reagents)) + return ..() + + // We don't have any reagents, let's add something + log_debug("[src] was a sliced food, which was neither sliced and has no reagents.") + list_reagents = list("nutriment" = 5) + + return ..() + +//MARK: SLICEABLE /obj/item/food/sliceable slices_num = 2 @@ -284,7 +303,7 @@ if(!Adjacent(user)) return var/obj/item/I = user.get_active_hand() - if(!I) + if(!I || I == src) // dont try to slip inside itself return if(I.w_class > WEIGHT_CLASS_SMALL) to_chat(user, "You cannot fit [I] in [src]!") @@ -333,7 +352,7 @@ slices_lost = rand(1, min(1, round(slices_num / 2))) var/reagents_per_slice = reagents.total_volume/slices_num for(var/i in 1 to (slices_num - slices_lost)) - var/obj/slice = new slice_path (loc) + var/obj/slice = new slice_path (loc, TRUE) reagents.trans_to(slice,reagents_per_slice) slice.scatter_atom() qdel(src) @@ -352,8 +371,7 @@ cooktype["grilled"] = TRUE cooktype["deep fried"] = TRUE -// MISC - +//MARK: MISC /obj/item/food/cereal name = "box of cereal" desc = "A box of cereal." diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm index 17d86d656afd..5b4988bbcfb7 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm @@ -179,29 +179,30 @@ var/obj/item/food/type = new(get_turf(src)) return type -/obj/machinery/cooker/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/cooker/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(upgradeable) //Not all cooker types currently support build/upgrade stuff, so not all of it will work well with this //Until we decide whether or not we want to bring back the cereal maker or old grill/oven in some form, this initial check will have to suffice - if(istype(I, /obj/item/storage/part_replacer)) - exchange_parts(user, I) - return + if(istype(used, /obj/item/storage/part_replacer)) + exchange_parts(user, used) + return ITEM_INTERACT_COMPLETE if(stat & (NOPOWER|BROKEN)) - return + return ITEM_INTERACT_COMPLETE if(panel_open) to_chat(user, "Close the panel first!") - return - if(istype(I, /obj/item/grab)) - return special_attack_grab(I, user) - if(!checkValid(I, user)) - return + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/grab)) + if(special_attack_grab(used, user)) + return ITEM_INTERACT_COMPLETE + if(!checkValid(used, user)) + return ITEM_INTERACT_COMPLETE if(!burns) - if(istype(I, /obj/item/food)) - if(checkCooked(I)) + if(istype(used, /obj/item/food)) + if(checkCooked(used)) to_chat(user, "That is already [thiscooktype], it would do nothing!") - return - putIn(I, user) - for(var/mob/living/L in I.contents) //Emagged cookers - Any mob put in will not survive the trip + return ITEM_INTERACT_COMPLETE + putIn(used, user) + for(var/mob/living/L in used.contents) //Emagged cookers - Any mob put in will not survive the trip if(L.stat != DEAD) if(ispAI(L)) //Snowflake check because pAIs are weird var/mob/living/silicon/pai/P = L @@ -210,7 +211,8 @@ L.death() break - addtimer(CALLBACK(src, PROC_REF(finish_cook), I, user), cooktime) + addtimer(CALLBACK(src, PROC_REF(finish_cook), used, user), cooktime) + return ITEM_INTERACT_COMPLETE /obj/machinery/cooker/proc/finish_cook(obj/item/I, mob/user, params) if(QDELETED(I)) //For situations where the item being cooked gets deleted mid-cook (primed grenades) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index f070d09d2905..f3d1fff923d0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -43,15 +43,15 @@ var/obj/item/food/deepfryholder/type = new(get_turf(src)) return type -/obj/machinery/cooker/deepfryer/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/drinks/ice)) - var/ice_amount = I.reagents.get_reagent_amount("ice") +/obj/machinery/cooker/deepfryer/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/glass) || istype(used, /obj/item/reagent_containers/drinks/ice)) + var/ice_amount = used.reagents.get_reagent_amount("ice") if(ice_amount) - I.reagents.remove_all(I.reagents.total_volume) + used.reagents.remove_all(used.reagents.total_volume) add_attack_logs(user, src, "poured [ice_amount]u ice into") user.visible_message( - "[user] pours [I] into [src], and it seems to fizz a bit.", - "You pour [I] into [src], and it seems to fizz a bit.", + "[user] pours [used] into [src], and it seems to fizz a bit.", + "You pour [used] into [src], and it seems to fizz a bit.", "You hear a splash, and a sizzle." ) @@ -59,7 +59,7 @@ addtimer(CALLBACK(src, PROC_REF(boil_leadup), user), 4 SECONDS) addtimer(CALLBACK(src, PROC_REF(make_foam), ice_amount), 5 SECONDS) - return TRUE + return ITEM_INTERACT_COMPLETE return ..() @@ -189,7 +189,7 @@ output = /obj/item/food/carrotfries /datum/deepfryer_special/onionrings - input = /obj/item/food/onion_slice + input = /obj/item/food/sliced/onion_slice output = /obj/item/food/onionrings /datum/deepfryer_special/fried_vox diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index a321b64f8406..35f1bd89078b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -93,24 +93,24 @@ startgibbing(user) -/obj/machinery/gibber/attackby__legacy__attackchain(obj/item/P, mob/user, params) - if(istype(P, /obj/item/grab)) - var/obj/item/grab/G = P +/obj/machinery/gibber/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used if(G.state < 2) to_chat(user, "You need a better grip to do that!") - return + return ITEM_INTERACT_COMPLETE move_into_gibber(user,G.affecting) qdel(G) - return + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) - return + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", used)) + return ITEM_INTERACT_COMPLETE - if(default_unfasten_wrench(user, P, time = 4 SECONDS)) - return + if(default_unfasten_wrench(user, used, time = 4 SECONDS)) + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, P)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 672781e46dcc..d99d8389ce72 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -29,31 +29,32 @@ . = ..() create_reagents(500) -/obj/machinery/icemachine/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass)) +/obj/machinery/icemachine/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/glass)) if(beaker) to_chat(user, "A container is already inside [src].") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to you!") - return - beaker = I - I.forceMove(src) - to_chat(user, "You add [I] to [src]") + to_chat(user, "\The [used] is stuck to you!") + return ITEM_INTERACT_COMPLETE + beaker = used + used.forceMove(src) + to_chat(user, "You add [used] to [src].") updateUsrDialog() - return - if(istype(I, /obj/item/food/frozen/icecream)) - if(!I.reagents.has_reagent("sprinkles")) - if(I.reagents.total_volume > 29) - I.reagents.remove_any(1) - I.reagents.add_reagent("sprinkles", 1) - I.name += " with sprinkles" - I.desc += ". This also has sprinkles." + return ITEM_INTERACT_COMPLETE + + if(istype(used, /obj/item/food/frozen/icecream)) + if(!used.reagents.has_reagent("sprinkles")) + if(used.reagents.total_volume > 29) + used.reagents.remove_any(1) + used.reagents.add_reagent("sprinkles", 1) + used.name += " with sprinkles" + used.desc += ". This also has sprinkles." else - to_chat(user, "This [I] already has sprinkles.") - return - return ..() + to_chat(user, "This [used] already has sprinkles.") + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/icemachine/Topic(href, href_list) if(..()) return diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index eb860683b17f..0d5a3c8e2a6b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -71,40 +71,40 @@ * Item Adding ********************/ -/obj/machinery/kitchen_machine/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/kitchen_machine/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(operating) - return + return ITEM_INTERACT_COMPLETE if(dirty < MAX_DIRT) - if(default_deconstruction_screwdriver(user, open_icon, off_icon, O)) - return + if(default_deconstruction_screwdriver(user, open_icon, off_icon, used)) + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/part_replacer)) + if(istype(used, /obj/item/storage/part_replacer)) return ..() - default_deconstruction_crowbar(user, O) + default_deconstruction_crowbar(user, used) if(dirty == MAX_DIRT) // The machine is all dirty so can't be used! - if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/soap) || istype(O, /obj/item/reagent_containers/glass/rag)) // If they're trying to clean it then let them + if(istype(used, /obj/item/reagent_containers/spray/cleaner) || istype(used, /obj/item/soap) || istype(used, /obj/item/reagent_containers/glass/rag)) // If they're trying to clean it then let them user.visible_message("[user] starts to clean [src].", "You start to clean [src].") - if(do_after(user, 20 * O.toolspeed, target = src)) + if(do_after(user, 20 * used.toolspeed, target = src)) user.visible_message("[user] has cleaned [src].", "You have cleaned [src].") dirty = NO_DIRT update_icon(UPDATE_ICON_STATE) container_type = OPENCONTAINER - return TRUE + return ITEM_INTERACT_COMPLETE else //Otherwise bad luck!! to_chat(user, "It's dirty!") - return TRUE + return ITEM_INTERACT_COMPLETE - if(is_type_in_list(O, GLOB.cooking_ingredients[recipe_type]) || istype(O, /obj/item/mixing_bowl)) + if(is_type_in_list(used, GLOB.cooking_ingredients[recipe_type]) || istype(used, /obj/item/mixing_bowl)) if(length(contents) >= max_n_of_items) to_chat(user, "This [src] is full of ingredients, you cannot put more.") - return TRUE + return ITEM_INTERACT_COMPLETE - if(istype(O,/obj/item/stack)) - var/obj/item/stack/S = O + if(istype(used,/obj/item/stack)) + var/obj/item/stack/S = used if(S.get_amount() > 1) var/obj/item/stack/to_add = S.split(user, 1) to_add.forceMove(src) @@ -112,48 +112,51 @@ else add_item(S, user) else - add_item(O, user) - else if(is_type_in_list(O, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/drinks, /obj/item/reagent_containers/condiment))) - if(!O.reagents) - return TRUE + add_item(used, user) + + return ITEM_INTERACT_COMPLETE + else if(is_type_in_list(used, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/drinks, /obj/item/reagent_containers/condiment))) + if(!used.reagents) + return ITEM_INTERACT_COMPLETE - for(var/datum/reagent/R in O.reagents.reagent_list) + for(var/datum/reagent/R in used.reagents.reagent_list) if(!(R.id in GLOB.cooking_reagents[recipe_type])) - to_chat(user, "Your [O.name] contains components unsuitable for cookery.") - return TRUE - else if(istype(O, /obj/item/storage)) - var/obj/item/storage/S = O + to_chat(user, "Your [used.name] contains components unsuitable for cookery.") + return ITEM_INTERACT_COMPLETE + return ..() + else if(istype(used, /obj/item/storage)) + var/obj/item/storage/S = used if(!S.allow_quick_empty) - to_chat(user, "[O] is too awkward a shape to dump into [src].") - return TRUE + to_chat(user, "[used] is too awkward a shape to dump into [src].") + return ITEM_INTERACT_COMPLETE if(length(S.contents) + length(contents) >= max_n_of_items) - to_chat(user, "You can't fit everything from [O] into [src].") - return TRUE + to_chat(user, "You can't fit everything from [used] into [src].") + return ITEM_INTERACT_COMPLETE if(length(S.contents) == 0) - to_chat(user, "[O] is empty!") - return TRUE - for(var/obj/item/ingredient in O.contents) + to_chat(user, "[used] is empty!") + return ITEM_INTERACT_COMPLETE + for(var/obj/item/ingredient in used.contents) if(!is_type_in_list(ingredient, GLOB.cooking_ingredients[recipe_type]) && !istype(ingredient, /obj/item/mixing_bowl)) - to_chat(user, "Your [O.name] contains contents unsuitable for cookery.") - return TRUE + to_chat(user, "Your [used.name] contains contents unsuitable for cookery.") + return ITEM_INTERACT_COMPLETE S.hide_from(user) - user.visible_message("[user] dumps [O] into [src].", "You dump [O] into [src].") - for(var/obj/item/ingredient in O.contents) + user.visible_message("[user] dumps [used] into [src].", "You dump [used] into [src].") + for(var/obj/item/ingredient in used.contents) S.remove_from_storage(ingredient, src) CHECK_TICK SStgui.update_uis(src) + return ITEM_INTERACT_COMPLETE - - else if(istype(O, /obj/item/grab)) - var/obj/item/grab/G = O + else if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "Slamming [G.affecting] into [src] might hurt them!") - return - return special_attack_grab(G, user) + return ITEM_INTERACT_COMPLETE + special_attack_grab(G, user) + return ITEM_INTERACT_COMPLETE - else - to_chat(user, "You have no idea what you can cook with [O].") - return TRUE + to_chat(user, "You have no idea what you can cook with [used].") + return ITEM_INTERACT_COMPLETE /obj/machinery/kitchen_machine/wrench_act(mob/living/user, obj/item/I) if(operating) diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index a5079e4ffde8..6c8c512f58bb 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -54,21 +54,21 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) cube_production = cubes_made required_grind = req_grind -/obj/machinery/monkey_recycler/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) - return +/obj/machinery/monkey_recycler/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", used)) + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/part_replacer)) + if(istype(used, /obj/item/storage/part_replacer)) return ..() - if(default_unfasten_wrench(user, O, time = 4 SECONDS)) + if(default_unfasten_wrench(user, used, time = 4 SECONDS)) power_change() - return + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, O)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/multitool)) + if(istype(used, /obj/item/multitool)) if(!panel_open) cycle_through++ switch(cycle_through) @@ -87,14 +87,14 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) cycle_through = 0 to_chat(user, "You change the monkeycube type to [initial(cube_type.name)].") else - var/obj/item/multitool/M = O + var/obj/item/multitool/M = used M.buffer = src to_chat(user, "You log [src] in [M]'s buffer.") - return + return ITEM_INTERACT_COMPLETE if(stat != 0) //NOPOWER etc - return - if(istype(O, /obj/item/grab)) - var/obj/item/grab/G = O + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used var/grabbed = G.affecting if(ishuman(grabbed)) var/mob/living/carbon/human/target = grabbed @@ -117,7 +117,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) to_chat(user, "The machine only accepts monkeys!") else to_chat(user, "The machine only accepts monkeys!") - return + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/monkey_recycler/attack_hand(mob/user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 63608f5fe394..7926e2edf5a0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -105,7 +105,7 @@ output = /obj/item/food/soydope /datum/food_processor_process/spaghetti - input = /obj/item/food/doughslice + input = /obj/item/food/sliced/dough output = /obj/item/food/spaghetti /datum/food_processor_process/macaroni @@ -188,33 +188,33 @@ return P return 0 -/obj/machinery/processor/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/processor/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(processing) to_chat(user, "\the [src] is already processing something!") - return TRUE + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_screwdriver(user, "processor_open", "processor", O)) - return + if(default_deconstruction_screwdriver(user, "processor_open", "processor", used)) + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/part_replacer)) + if(istype(used, /obj/item/storage/part_replacer)) return ..() - if(default_unfasten_wrench(user, O, time = 4 SECONDS)) - return + if(default_unfasten_wrench(user, used, time = 4 SECONDS)) + return ITEM_INTERACT_COMPLETE - default_deconstruction_crowbar(user, O) + default_deconstruction_crowbar(user, used) - var/obj/item/what = O + var/obj/item/what = used - if(istype(O, /obj/item/grab)) - var/obj/item/grab/G = O + if(istype(used, /obj/item/grab)) + var/obj/item/grab/G = used what = G.affecting var/datum/food_processor_process/P = select_recipe(what) if(!P) to_chat(user, "That probably won't blend.") - return 1 + return ITEM_INTERACT_COMPLETE user.visible_message("\the [user] puts \the [what] into \the [src].", \ "You put \the [what] into \the [src].") @@ -222,7 +222,7 @@ user.drop_item() what.loc = src - return + return ITEM_INTERACT_COMPLETE /obj/machinery/processor/attack_hand(mob/user) if(stat & (NOPOWER|BROKEN)) //no power or broken diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 89e838074fe4..17cac16a67f2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -177,27 +177,27 @@ return TRUE return ..() -/obj/machinery/smartfridge/attackby__legacy__attackchain(obj/item/O, mob/user) - if(istype(O, /obj/item/storage/part_replacer)) +/obj/machinery/smartfridge/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) . = ..() SStgui.update_uis(src) return if(stat & (BROKEN|NOPOWER)) to_chat(user, "[src] is unpowered and useless.") - return + return ITEM_INTERACT_COMPLETE - if(load(O, user)) + if(load(used, user)) user.visible_message( - "[user] has added [O] to [src].", - "You add [O] to [src]." + "[user] has added [used] to [src].", + "You add [used] to [src]." ) SStgui.update_uis(src) update_icon(UPDATE_OVERLAYS) - return + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/bag) || istype(O, /obj/item/storage/box)) - var/obj/item/storage/P = O + if(istype(used, /obj/item/storage/bag) || istype(used, /obj/item/storage/box)) + var/obj/item/storage/P = used var/items_loaded = 0 for(var/obj/G in P.contents) if(load(G, user)) @@ -212,11 +212,13 @@ var/failed = length(P.contents) if(failed) to_chat(user, "[failed] item\s [failed == 1 ? "is" : "are"] refused.") - return + return ITEM_INTERACT_COMPLETE - if(!istype(O, /obj/item/card/emag)) - to_chat(user, "\The [src] smartly refuses [O].") - return TRUE + if(!istype(used, /obj/item/card/emag)) + to_chat(user, "\The [src] smartly refuses [used].") + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/smartfridge/attack_ai(mob/user) if(!silicon_controllable) diff --git a/code/modules/food_and_drinks/recipes/recipes_candy.dm b/code/modules/food_and_drinks/recipes/recipes_candy.dm index e3ab57ad8ab9..03d1e7ba02f0 100644 --- a/code/modules/food_and_drinks/recipes/recipes_candy.dm +++ b/code/modules/food_and_drinks/recipes/recipes_candy.dm @@ -90,7 +90,7 @@ /datum/recipe/candy/candied_pineapple reagents = list("sugar" = 2, "water" = 2) items = list( - /obj/item/food/pineappleslice + /obj/item/food/sliced/pineapple ) result = /obj/item/food/candy/candied_pineapple diff --git a/code/modules/food_and_drinks/recipes/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm index d984f12eb9b5..5f4cf2919fd6 100644 --- a/code/modules/food_and_drinks/recipes/recipes_grill.dm +++ b/code/modules/food_and_drinks/recipes/recipes_grill.dm @@ -75,9 +75,9 @@ /datum/recipe/grill/grilledcheese items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice, - /obj/item/food/cheesewedge + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread, + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/grilledcheese @@ -112,8 +112,8 @@ items = list( /obj/item/food/egg, /obj/item/food/egg, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/omelette @@ -179,7 +179,7 @@ /obj/item/food/boiledrice, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_tamago + result = /obj/item/food/sliced/sushi_tamago /datum/recipe/grill/sushi_unagi reagents = list("sake" = 5) @@ -196,7 +196,7 @@ /obj/item/food/boiled_shrimp, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_ebi + result = /obj/item/food/sliced/sushi_ebi /datum/recipe/grill/sushi_ikura items = list( @@ -204,7 +204,7 @@ /obj/item/fish_eggs/salmon, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_ikura + result = /obj/item/food/sliced/sushi_ikura /datum/recipe/grill/sushi_inari items = list( @@ -212,7 +212,7 @@ /obj/item/food/fried_tofu, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_inari + result = /obj/item/food/sliced/sushi_inari /datum/recipe/grill/sushi_sake items = list( @@ -220,7 +220,7 @@ /obj/item/food/salmonmeat, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_sake + result = /obj/item/food/sliced/sushi_sake /datum/recipe/grill/sushi_smoked_salmon items = list( @@ -228,7 +228,7 @@ /obj/item/food/salmonsteak, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_smoked_salmon + result = /obj/item/food/sliced/sushi_smoked_salmon /datum/recipe/grill/sushi_masago items = list( @@ -236,7 +236,7 @@ /obj/item/fish_eggs/goldfish, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_masago + result = /obj/item/food/sliced/sushi_masago /datum/recipe/grill/sushi_tobiko items = list( @@ -244,15 +244,15 @@ /obj/item/fish_eggs/shark, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_tobiko + result = /obj/item/food/sliced/sushi_tobiko /datum/recipe/grill/sushi_tobiko_egg items = list( - /obj/item/food/sushi_tobiko, + /obj/item/food/sliced/sushi_tobiko, /obj/item/food/egg, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_tobiko_egg + result = /obj/item/food/sliced/sushi_tobiko_egg /datum/recipe/grill/sushi_tai items = list( @@ -260,7 +260,7 @@ /obj/item/food/catfishmeat, /obj/item/stack/seaweed ) - result = /obj/item/food/sushi_tai + result = /obj/item/food/sliced/sushi_tai /datum/recipe/grill/goliath items = list(/obj/item/food/monstermeat/goliath) diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index b97d66f76192..433cf5e8341a 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -330,7 +330,7 @@ /obj/item/food/meat, /obj/item/food/meat, /obj/item/food/meat, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/burger/bigbite @@ -340,9 +340,9 @@ /obj/item/food/burger/bigbite, /obj/item/food/dough, /obj/item/food/meat, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/bacon, - /obj/item/food/tomatoslice + /obj/item/food/sliced/tomato ) result = /obj/item/food/burger/superbite @@ -419,7 +419,7 @@ /obj/item/food/bun, /obj/item/food/meat, /obj/item/food/grown/lettuce, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/burger/cheese @@ -459,7 +459,7 @@ /obj/item/food/bacon, /obj/item/food/bacon, /obj/item/food/grown/lettuce, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/burger/bacon @@ -467,7 +467,7 @@ items = list( /obj/item/food/bun, /obj/item/food/bbqribs, - /obj/item/food/onion_slice + /obj/item/food/sliced/onion_slice ) result = /obj/item/food/burger/mcrib @@ -510,8 +510,8 @@ /datum/recipe/microwave/eggplantparm items = list( - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/eggplant ) result = /obj/item/food/eggplantparm @@ -541,7 +541,7 @@ /datum/recipe/microwave/cheesyfries items = list( /obj/item/food/fries, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/cheesyfries @@ -656,7 +656,7 @@ items = list( /obj/item/food/cutlet, /obj/item/food/beans, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/sliceable/flatdough ) result = /obj/item/food/burrito @@ -684,9 +684,9 @@ /datum/recipe/microwave/sandwich items = list( /obj/item/food/meatsteak, - /obj/item/food/breadslice, - /obj/item/food/breadslice, - /obj/item/food/cheesewedge + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread, + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/sandwich @@ -713,14 +713,14 @@ /datum/recipe/microwave/slimetoast reagents = list("slimejelly" = 5) items = list( - /obj/item/food/breadslice, + /obj/item/food/sliced/bread, ) result = /obj/item/food/jelliedtoast/slime /datum/recipe/microwave/jelliedtoast reagents = list("cherryjelly" = 5) items = list( - /obj/item/food/breadslice + /obj/item/food/sliced/bread ) result = /obj/item/food/jelliedtoast/cherry @@ -797,7 +797,7 @@ /datum/recipe/microwave/macncheese reagents = list("water" = 5, "milk" = 5) items = list( - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/macaroni, ) result = /obj/item/food/macncheese @@ -808,8 +808,8 @@ /obj/item/food/bun, /obj/item/food/meat, /obj/item/food/meat, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/lettuce, /obj/item/food/grown/chili, /obj/item/toy/crayon/green, @@ -819,10 +819,10 @@ /datum/recipe/microwave/blt items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice, + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread, /obj/item/food/grown/lettuce, - /obj/item/food/tomatoslice, + /obj/item/food/sliced/tomato, /obj/item/food/bacon ) result = /obj/item/food/blt @@ -830,34 +830,34 @@ /datum/recipe/microwave/peanut_butter_jelly/cherry reagents = list("cherryjelly" = 5, "peanutbutter" = 5) items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread ) result = /obj/item/food/peanut_butter_jelly/cherry /datum/recipe/microwave/peanut_butter_jelly/slime reagents = list("slimejelly" = 5, "peanutbutter" = 5) items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread ) result = /obj/item/food/peanut_butter_jelly/slime /datum/recipe/microwave/peanut_butter_banana reagents = list("peanutbutter" = 5) items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice, + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread, /obj/item/food/grown/banana ) result = /obj/item/food/peanut_butter_banana /datum/recipe/microwave/philly_cheesesteak items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice, + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread, /obj/item/food/cutlet, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/onion ) result = /obj/item/food/philly_cheesesteak @@ -967,24 +967,24 @@ /datum/recipe/microwave/twobread reagents = list("wine" = 5) items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread ) result = /obj/item/food/twobread /datum/recipe/microwave/slimesandwich reagents = list("slimejelly" = 5) items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread ) result = /obj/item/food/jellysandwich/slime /datum/recipe/microwave/cherrysandwich reagents = list("cherryjelly" = 5) items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread ) result = /obj/item/food/jellysandwich/cherry @@ -1049,7 +1049,7 @@ reagents = list("water" = 10) items = list( /obj/item/food/grown/onion, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/soup/frenchonionsoup @@ -1179,7 +1179,7 @@ /obj/item/food/badrecipe, /obj/item/food/tofu, /obj/item/food/egg, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/soup/mysterysoup @@ -1220,7 +1220,7 @@ /obj/item/food/grown/olive, /obj/item/food/grown/tomato, /obj/item/food/cutlet, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/salad/antipasto @@ -1228,9 +1228,9 @@ reagents = list("oliveoil" = 5) items = list( /obj/item/food/grown/lettuce, - /obj/item/food/onion_slice/red, - /obj/item/food/cheesewedge, - /obj/item/food/breadslice + /obj/item/food/sliced/onion_slice/red, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/bread ) result = /obj/item/food/salad/caesar @@ -1247,7 +1247,7 @@ /obj/item/food/grown/citrus/orange, /obj/item/food/grown/apple, /obj/item/food/grown/grapes, - /obj/item/food/watermelonslice + /obj/item/food/sliced/watermelon ) result = /obj/item/food/salad/fruit @@ -1256,10 +1256,10 @@ items = list( /obj/item/food/grown/olive, /obj/item/food/grown/tomato, - /obj/item/food/onion_slice/red, - /obj/item/food/onion_slice/red, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge + /obj/item/food/sliced/onion_slice/red, + /obj/item/food/sliced/onion_slice/red, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/salad/greek @@ -1269,8 +1269,8 @@ /obj/item/food/grown/grapes, /obj/item/food/grown/banana, /obj/item/food/grown/banana, - /obj/item/food/watermelonslice, - /obj/item/food/watermelonslice + /obj/item/food/sliced/watermelon, + /obj/item/food/sliced/watermelon ) result = /obj/item/food/salad/jungle @@ -1279,8 +1279,8 @@ items = list( /obj/item/food/grown/carrot, /obj/item/food/grown/lettuce, - /obj/item/food/onion_slice/red, - /obj/item/food/onion_slice/red + /obj/item/food/sliced/onion_slice/red, + /obj/item/food/sliced/onion_slice/red ) result = /obj/item/food/salad/kale @@ -1365,7 +1365,7 @@ items = list( /obj/item/food/friedegg, /obj/item/food/meatsteak, - /obj/item/food/breadslice + /obj/item/food/sliced/bread ) result = /obj/item/food/benedict @@ -1474,7 +1474,7 @@ /datum/recipe/microwave/frozenpineapplepop items = list( /obj/item/popsicle_stick, - /obj/item/food/pineappleslice, + /obj/item/food/sliced/pineapple, /obj/item/food/chocolatebar ) result = /obj/item/food/frozen/popsicle/frozenpineapple @@ -1647,8 +1647,8 @@ /datum/recipe/microwave/notasandwich items = list( - /obj/item/food/breadslice, - /obj/item/food/breadslice, + /obj/item/food/sliced/bread, + /obj/item/food/sliced/bread, /obj/item/clothing/mask/fakemoustache ) result = /obj/item/food/notasandwich @@ -1720,9 +1720,9 @@ /datum/recipe/microwave/taco items = list( - /obj/item/food/doughslice, + /obj/item/food/sliced/dough, /obj/item/food/cutlet, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/taco diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm index 9012cba58c60..8dacef0d42d3 100644 --- a/code/modules/food_and_drinks/recipes/recipes_oven.dm +++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm @@ -16,9 +16,9 @@ /obj/item/food/meat, /obj/item/food/meat, /obj/item/food/meat, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, ) result = /obj/item/food/sliceable/meatbread @@ -30,9 +30,9 @@ /obj/item/food/meat/syntiflesh, /obj/item/food/meat/syntiflesh, /obj/item/food/meat/syntiflesh, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, ) result = /obj/item/food/sliceable/meatbread @@ -44,9 +44,9 @@ /obj/item/food/monstermeat/xenomeat, /obj/item/food/monstermeat/xenomeat, /obj/item/food/monstermeat/xenomeat, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, ) result = /obj/item/food/sliceable/xenomeatbread @@ -241,8 +241,8 @@ /obj/item/food/dough, /obj/item/food/dough, /obj/item/food/dough, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, ) result = /obj/item/food/sliceable/cheesecake @@ -444,15 +444,15 @@ /obj/item/food/tofu, /obj/item/food/tofu, /obj/item/food/tofu, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, ) result = /obj/item/food/sliceable/tofubread /datum/recipe/oven/loadedbakedpotato items = list( - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/potato ) result = /obj/item/food/loadedbakedpotato @@ -483,7 +483,7 @@ /datum/recipe/oven/fortunecookie reagents = list("sugar" = 5) items = list( - /obj/item/food/doughslice, + /obj/item/food/sliced/dough, /obj/item/paper, ) result = /obj/item/food/fortunecookie @@ -505,8 +505,8 @@ /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/sliceable/pizza/margheritapizza @@ -516,7 +516,7 @@ /obj/item/food/meat, /obj/item/food/meat, /obj/item/food/meat, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/tomato ) result = /obj/item/food/sliceable/pizza/meatpizza @@ -524,7 +524,7 @@ /datum/recipe/oven/mushroompizza items = list( /obj/item/food/sliceable/flatdough, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/mushroom, /obj/item/food/grown/mushroom, /obj/item/food/grown/mushroom, @@ -537,7 +537,7 @@ /datum/recipe/oven/vegetablepizza items = list( /obj/item/food/sliceable/flatdough, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/eggplant, /obj/item/food/grown/carrot, /obj/item/food/grown/corn, @@ -549,9 +549,9 @@ items = list( /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge, - /obj/item/food/pineappleslice, - /obj/item/food/pineappleslice, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/pineapple, + /obj/item/food/sliced/pineapple, /obj/item/food/meat, ) result = /obj/item/food/sliceable/pizza/hawaiianpizza @@ -559,8 +559,8 @@ /datum/recipe/oven/macncheesepizza items = list( /obj/item/food/sliceable/flatdough, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/macncheese, ) result = /obj/item/food/sliceable/pizza/macpizza @@ -569,10 +569,10 @@ items = list( /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/sliceable/pizza/cheesepizza @@ -580,7 +580,7 @@ items = list( /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/sausage ) result = /obj/item/food/sliceable/pizza/pepperonipizza @@ -589,7 +589,7 @@ items = list( /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/donkpocket, /obj/item/food/donkpocket ) @@ -599,7 +599,7 @@ items = list( /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/cannabis, /obj/item/food/grown/cannabis, /obj/item/food/grown/cannabis, @@ -611,7 +611,7 @@ reagents = list("capsaicin" = 5) items = list( /obj/item/food/sliceable/flatdough, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/chili, /obj/item/food/grown/chili ) @@ -623,7 +623,7 @@ /obj/item/food/sliceable/flatdough, /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/sliceable/pizza/pestopizza @@ -633,7 +633,7 @@ /obj/item/food/sliceable/flatdough, /obj/item/food/grown/garlic, /obj/item/food/grown/garlic, - /obj/item/food/cheesewedge + /obj/item/food/sliced/cheesewedge ) result = /obj/item/food/sliceable/pizza/garlicpizza @@ -662,8 +662,8 @@ items = list( /obj/item/food/dough, /obj/item/food/dough, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, ) result = /obj/item/food/sliceable/creamcheesebread @@ -814,7 +814,7 @@ /datum/recipe/oven/cracker reagents = list("sodiumchloride" = 1) items = list( - /obj/item/food/doughslice + /obj/item/food/sliced/dough ) result = /obj/item/food/cracker @@ -859,9 +859,9 @@ items = list( /obj/item/food/meat, /obj/item/food/meat, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, - /obj/item/food/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, + /obj/item/food/sliced/cheesewedge, /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, /obj/item/food/dough diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm index 1fe1c90adec0..2d69c756430e 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm @@ -2,8 +2,8 @@ name = "Sandwich" reqs = list( /obj/item/food/meatsteak = 1, - /obj/item/food/breadslice = 2, - /obj/item/food/cheesewedge = 1, + /obj/item/food/sliced/bread = 2, + /obj/item/food/sliced/cheesewedge = 1, ) result = list(/obj/item/food/sandwich) category = CAT_FOOD @@ -13,7 +13,7 @@ name = "Slime Jelly Sandwich" reqs = list( /datum/reagent/slimejelly = 5, - /obj/item/food/breadslice = 2, + /obj/item/food/sliced/bread = 2, ) result = list(/obj/item/food/jellysandwich/slime) category = CAT_FOOD @@ -23,7 +23,7 @@ name = "Cherry Jelly Sandwich" reqs = list( /datum/reagent/consumable/cherryjelly = 5, - /obj/item/food/breadslice = 2, + /obj/item/food/sliced/bread = 2, ) result = list(/obj/item/food/jellysandwich/cherry) category = CAT_FOOD @@ -62,7 +62,7 @@ /datum/crafting_recipe/notasandwich name = "not-a-sandwich" reqs = list( - /obj/item/food/breadslice = 2, + /obj/item/food/sliced/bread = 2, /obj/item/clothing/mask/fakemoustache = 1, ) result = list(/obj/item/food/notasandwich) @@ -76,7 +76,7 @@ /obj/item/food/boiled_shrimp = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_ebi) + result = list(/obj/item/food/sliced/sushi_ebi) category = CAT_FOOD subcategory = CAT_SUSHI @@ -99,7 +99,7 @@ /obj/item/fish_eggs/salmon = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_ikura) + result = list(/obj/item/food/sliced/sushi_ikura) category = CAT_FOOD subcategory = CAT_SUSHI @@ -122,7 +122,7 @@ /obj/item/food/fried_tofu = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_inari) + result = list(/obj/item/food/sliced/sushi_inari) category = CAT_FOOD subcategory = CAT_SUSHI @@ -145,7 +145,7 @@ /obj/item/food/salmonmeat = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_sake) + result = list(/obj/item/food/sliced/sushi_sake) category = CAT_FOOD subcategory = CAT_SUSHI @@ -168,7 +168,7 @@ /obj/item/food/salmonsteak = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_smoked_salmon) + result = list(/obj/item/food/sliced/sushi_smoked_salmon) category = CAT_FOOD subcategory = CAT_SUSHI @@ -191,7 +191,7 @@ /obj/item/fish_eggs/goldfish = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_masago) + result = list(/obj/item/food/sliced/sushi_masago) category = CAT_FOOD subcategory = CAT_SUSHI @@ -214,7 +214,7 @@ /obj/item/fish_eggs/shark = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_tobiko) + result = list(/obj/item/food/sliced/sushi_tobiko) category = CAT_FOOD subcategory = CAT_SUSHI @@ -233,18 +233,18 @@ /datum/crafting_recipe/sushi_tobiko_egg name = "Tobiko and Egg Sushi" reqs = list( - /obj/item/food/sushi_tobiko = 1, + /obj/item/food/sliced/sushi_tobiko = 1, /obj/item/food/egg = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_tobiko_egg) + result = list(/obj/item/food/sliced/sushi_tobiko_egg) category = CAT_FOOD subcategory = CAT_SUSHI /datum/crafting_recipe/tobiko_egg_maki name = "Tobiko and Egg Maki Roll" reqs = list( - /obj/item/food/sushi_tobiko = 4, + /obj/item/food/sliced/sushi_tobiko = 4, /obj/item/food/egg = 4, /obj/item/stack/seaweed = 1, ) @@ -260,7 +260,7 @@ /obj/item/food/catfishmeat = 1, /obj/item/stack/seaweed = 1, ) - result = list(/obj/item/food/sushi_tai) + result = list(/obj/item/food/sliced/sushi_tai) category = CAT_FOOD subcategory = CAT_SUSHI diff --git a/code/modules/hallucinations/effects/backrooms.dm b/code/modules/hallucinations/effects/backrooms.dm new file mode 100644 index 000000000000..ef34b3957fc8 --- /dev/null +++ b/code/modules/hallucinations/effects/backrooms.dm @@ -0,0 +1,58 @@ +GLOBAL_VAR_INIT(backrooms_occupied, FALSE) + +/** + * # Hallucination - Backrooms + * + * Temporarily sends the target to the backrooms. Their body's movement matches their movement in the backrooms. + */ + +/datum/hallucination_manager/backrooms + // this is the total length of the hallucination, if it's too short it cuts off the end + trigger_time = 14 SECONDS + // Human that will see the hallucination + var/mob/living/carbon/human/human_owner + // Item that will copy the owner's visible contents + var/obj/item/clone_base + +/datum/hallucination_manager/backrooms/on_spawn() + if(!ishuman(owner)) + return + human_owner = owner + // One person at a time in the backrooms, no backroom brawls allowed. + if(GLOB.backrooms_occupied) + return + GLOB.backrooms_occupied = TRUE + fade_out_trigger() + +/datum/hallucination_manager/backrooms/proc/fade_out_trigger() + human_owner.overlay_fullscreen("sleepblind", /atom/movable/screen/fullscreen/center/blind/sleeping, animated = 1 SECONDS) + trigger_timer = addtimer(CALLBACK(src, PROC_REF(do_hallucination_trigger)), 1 SECONDS, TIMER_STOPPABLE) + +/datum/hallucination_manager/backrooms/proc/do_hallucination_trigger() + human_owner.clear_fullscreen("sleepblind") + RegisterSignal(human_owner, COMSIG_MOVABLE_MOVED, PROC_REF(follow_movement)) + var/obj/spawn_location = pick(GLOB.backroomswarp) + clone_base = new(spawn_location) + clone_base.vis_contents += human_owner + human_owner.reset_perspective(clone_base) + trigger_timer = addtimer(CALLBACK(src, PROC_REF(fade_in_trigger)), 12 SECONDS, TIMER_STOPPABLE) + +/datum/hallucination_manager/backrooms/proc/fade_in_trigger() + human_owner.overlay_fullscreen("sleepblind", /atom/movable/screen/fullscreen/center/blind/sleeping, animated = 1 SECONDS) + trigger_timer = addtimer(CALLBACK(src, PROC_REF(end_fade_trigger)), 1 SECONDS, TIMER_STOPPABLE) + +/datum/hallucination_manager/backrooms/proc/end_fade_trigger() + human_owner.clear_fullscreen("sleepblind") + +/datum/hallucination_manager/backrooms/Destroy(force) + GLOB.backrooms_occupied = FALSE + UnregisterSignal(human_owner, COMSIG_MOVABLE_MOVED) + human_owner.reset_perspective(human_owner) + human_owner = null + QDEL_NULL(clone_base) + return ..() + +/datum/hallucination_manager/backrooms/proc/follow_movement(source, atom/old_loc, dir, forced) + // signal is called above in on_spawn so that whenever our human moves, we also move the clone + SIGNAL_HANDLER // COMSIG_MOVABLE_MOVED + step_towards(clone_base, get_step(get_turf(clone_base), dir)) diff --git a/code/modules/hallucinations/effects/major.dm b/code/modules/hallucinations/effects/major.dm index c17b03e7667c..8dda88c3ff40 100644 --- a/code/modules/hallucinations/effects/major.dm +++ b/code/modules/hallucinations/effects/major.dm @@ -362,14 +362,14 @@ if(!length(locs)) return INITIALIZE_HINT_QDEL var/turf/T = get_turf(pick(locs)) - color = pick(COLOR_BLACK, - COLOR_RIPPING_TENDRILS, - COLOR_BOILING_OIL, - COLOR_ENVENOMED_FILAMENTS, + color = pick(COLOR_BLACK, + COLOR_RIPPING_TENDRILS, + COLOR_BOILING_OIL, + COLOR_ENVENOMED_FILAMENTS, COLOR_LEXORIN_JELLY, - COLOR_KINETIC_GELATIN, - COLOR_CRYOGENIC_LIQUID, - COLOR_SORIUM, + COLOR_KINETIC_GELATIN, + COLOR_CRYOGENIC_LIQUID, + COLOR_SORIUM, COLOR_TESLIUM_PASTE) create_blob(T, core = TRUE) target.playsound_local(T, 'sound/effects/splat.ogg', 50, 1) @@ -476,3 +476,103 @@ I.color = blob.color target.client.images += I blob.target_blob_head = I + +/** + * # Hallucination - Sniper + * + * Fires a penetrator round at the target. On hit, knockdown + stam loss + hallucinated blood splatter for a bit. + */ +/obj/effect/hallucination/sniper + duration = 15 SECONDS + +/obj/effect/hallucination/sniper/Initialize(mapload, mob/living/carbon/target) + . = ..() + // Make sure the target has a client. Otherwise, stop the hallucination + if(!target.client) + qdel(src) + return + // Find a start spot for the sniper bullet + var/list/possible_turfs = list() + for(var/turf/T in RANGE_EDGE_TURFS(13, target.loc)) + possible_turfs += T + if(!length(possible_turfs)) + log_debug("Unable to find possible turf for [src].") + qdel(src) + return + var/turf/shot_loc = get_turf(pick(possible_turfs)) + fire_bullet(shot_loc, target) + +/obj/effect/hallucination/sniper/proc/fire_bullet(turf/shot_loc, mob/living/carbon/target) + // Fire the bullet + var/obj/item/projectile/bullet/sniper/penetrator/hallucination/bullet = new(shot_loc) + bullet.hallucinator = target + bullet.def_zone = BODY_ZONE_HEAD + bullet.suppressed = TRUE + + // Turn right away + var/matrix/M = new + var/angle = round(get_angle(shot_loc, target)) + M.Turn(angle) + bullet.transform = M + + // Handle who can see the bullet + bullet.bullet_image = image(bullet.icon, bullet, bullet.icon_state, OBJ_LAYER, bullet.dir) + bullet.bullet_image.transform = M + target.client.images += bullet.bullet_image + + // Start flying + bullet.trajectory = new(bullet.x, bullet.y, bullet.z, bullet.pixel_x, bullet.pixel_y, angle, SSprojectiles.global_pixel_speed) + bullet.last_projectile_move = world.time + bullet.has_been_fired = TRUE + target.playsound_local(target.loc, 'sound/weapons/gunshots/gunshot_sniper.ogg', 50) + START_PROCESSING(SSprojectiles, bullet) + +/obj/effect/hallucination/sniper_bloodsplatter + duration = 15 SECONDS + hallucination_icon = 'icons/effects/blood.dmi' + hallucination_icon_state = "mfloor1" + hallucination_color = "#A10808" + +/obj/effect/hallucination/sniper_bloodsplatter/Initialize(mapload, mob/living/carbon/target) + var/list/b_data = target.get_blood_data(target.get_blood_id()) + if(b_data && !isnull(b_data["blood_color"])) + hallucination_color = b_data["blood_color"] + . = ..() + hallucination_icon_state = pick("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") + + +/obj/item/projectile/bullet/sniper/penetrator/hallucination + nodamage = TRUE + invisibility = INVISIBILITY_MAXIMUM // You no see boolet + /// The hallucinator + var/mob/living/carbon/hallucinator = null + /// Handles only the victim seeing it + var/image/bullet_image = null + +/obj/item/projectile/bullet/sniper/penetrator/hallucination/on_hit(atom/target, blocked, hit_zone) + if(!isliving(target)) + return + if(target != hallucinator) + return + var/mob/living/hit_target = target + var/organ_hit_text = "" + if(hit_target.has_limbs) + organ_hit_text = " in \the [parse_zone(def_zone)]" + hit_target.playsound_local(loc, hitsound, 5, TRUE) + hit_target.apply_damage(60, STAMINA, def_zone) + hit_target.KnockDown(2 SECONDS) + new /obj/effect/hallucination/sniper_bloodsplatter(get_turf(src), hit_target) + to_chat(hit_target, "You're shot by \a [src][organ_hit_text]!") + +/obj/item/projectile/bullet/sniper/penetrator/hallucination/Bump(atom/A, yes) + if(!yes) // prevents double bumps. + return + var/turf/target_turf = get_turf(A) + prehit(A) + var/mob/living/hit_target = A + if(hit_target == hallucinator) + hit_target.bullet_act(src, def_zone) + loc = target_turf + if(A) + permutated += A + return 0 diff --git a/code/modules/hallucinations/effects/xeno_pounce.dm b/code/modules/hallucinations/effects/xeno_pounce.dm index 17954fe47f30..d1da9609533e 100644 --- a/code/modules/hallucinations/effects/xeno_pounce.dm +++ b/code/modules/hallucinations/effects/xeno_pounce.dm @@ -66,7 +66,7 @@ "[name] pounces on you!") to_chat(target, "[name] begins climbing into the ventilation system...") - QDEL_IN(src, 2 SECONDS) + QDEL_IN(src, 2 SECONDS) /** * Throws the xeno towards the given loc. diff --git a/code/modules/hallucinations/hallucination_manager.dm b/code/modules/hallucinations/hallucination_manager.dm index d8fb12d4ee06..60c7ad6c77df 100644 --- a/code/modules/hallucinations/hallucination_manager.dm +++ b/code/modules/hallucinations/hallucination_manager.dm @@ -28,7 +28,7 @@ RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(signal_qdel)) spawn_hallucination() -/datum/hallucination_manager/Destroy(force, ...) +/datum/hallucination_manager/Destroy(force) . = ..() owner = null QDEL_NULL(hallucination_list) @@ -38,8 +38,9 @@ var/turf/spawn_location = get_spawn_location() if(!spawn_location) return - initial_hallucination = new initial_hallucination(spawn_location, owner) - hallucination_list |= initial_hallucination + if(initial_hallucination) + initial_hallucination = new initial_hallucination(spawn_location, owner) + hallucination_list |= initial_hallucination on_spawn() trigger_timer = addtimer(CALLBACK(src, PROC_REF(on_trigger)), trigger_time, TIMER_DELETE_ME) diff --git a/code/modules/hallucinations/hallucinations.dm b/code/modules/hallucinations/hallucinations.dm index 9e705cc63207..29dcc6448a75 100644 --- a/code/modules/hallucinations/hallucinations.dm +++ b/code/modules/hallucinations/hallucinations.dm @@ -4,7 +4,6 @@ GLOBAL_LIST_INIT(hallucinations, list( /obj/effect/hallucination/fake_danger = 10, /obj/effect/hallucination/fake_health = 15, /obj/effect/hallucination/speech = 15, - /obj/effect/hallucination/audio = 25, /obj/effect/hallucination/audio/localized = 25, /obj/effect/hallucination/trait_applier/medical_machinery = 25, /obj/effect/hallucination/examine_hallucination = 25, @@ -14,29 +13,26 @@ GLOBAL_LIST_INIT(hallucinations, list( /obj/effect/hallucination/fake_grenade/flashbang = 5, /obj/effect/hallucination/self_delusion = 5, /obj/effect/hallucination/bolts/moderate = 10, - /obj/effect/hallucination/chasms = 10, /obj/effect/hallucination/fake_alert = 10, /obj/effect/hallucination/fake_grenade = 10, /obj/effect/hallucination/gunfire = 10, /obj/effect/hallucination/plasma_flood = 10, /obj/effect/hallucination/stunprodding = 10, /obj/effect/hallucination/doppelganger = 10, - /obj/effect/hallucination/delamination_alarm = 15, - /obj/effect/hallucination/fake_item = 15, /obj/effect/hallucination/fake_weapon = 15, - /obj/effect/hallucination/husks = 15, /obj/effect/hallucination/ventpeek = 15, ), HALLUCINATE_MAJOR = list( /obj/effect/hallucination/abduction = 10, /obj/effect/hallucination/assault = 10, /obj/effect/hallucination/fake_grenade/spawner = 10, - /obj/effect/hallucination/terror_infestation = 10, /obj/effect/hallucination/loose_energy_ball = 10, - /datum/hallucination_manager/blind_rush = 1, /datum/hallucination_manager/xeno_pounce = 10, + /datum/hallucination_manager/backrooms = 1, + /datum/hallucination_manager/blind_rush = 1, /datum/hallucination_manager/waves = 2, /obj/effect/hallucination/blob = 10, + /obj/effect/hallucination/sniper = 10 ) )) @@ -56,6 +52,8 @@ GLOBAL_LIST_INIT(hallucinations, list( var/hallucination_icon_state /// Hallucination override. var/hallucination_override = FALSE + /// Hallucination color + var/hallucination_color /// Hallucination layer. var/hallucination_layer = MOB_LAYER ///Hallucination plane. @@ -75,6 +73,8 @@ GLOBAL_LIST_INIT(hallucinations, list( target = hallucination_target if(hallucination_icon && hallucination_icon_state) var/image/I = image(hallucination_icon, hallucination_override ? src : get_turf(src), hallucination_icon_state) + if(hallucination_color) + I.color = hallucination_color I.override = hallucination_override I.layer = hallucination_layer I.plane = hallucination_plane diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index d37b07d3fbb3..a426e51ad241 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -102,42 +102,46 @@ /obj/machinery/biogenerator/crowbar_act(mob/living/user, obj/item/I) return default_deconstruction_crowbar(user, I) -/obj/machinery/biogenerator/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/biogenerator/item_interaction(mob/living/user, obj/item/used, list/modifiers) + // TODO: This feels off, no where else do we have a blanket "print a + // message for any other kind of item interaction attempt" that's keyed to intent + // See if this can be made more sensible after everything's been migrated + // to the new attack chain if(user.a_intent == INTENT_HARM) return ..() - if(istype(O, /obj/item/storage/part_replacer)) + if(istype(used, /obj/item/storage/part_replacer)) return ..() if(processing) to_chat(user, "[src] is currently processing.") - return + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/reagent_containers/glass)) + if(istype(used, /obj/item/reagent_containers/glass)) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return + return ITEM_INTERACT_COMPLETE if(container) to_chat(user, "A container is already loaded into [src].") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE - O.forceMove(src) - container = O + used.forceMove(src) + container = used to_chat(user, "You add the [container] to [src].") update_icon(UPDATE_ICON_STATE) SStgui.update_uis(src) - return TRUE + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/bag/plants)) + else if(istype(used, /obj/item/storage/bag/plants)) if(length(stored_plants) >= max_storable_plants) to_chat(user, "[src] can't hold any more plants!") - return + return ITEM_INTERACT_COMPLETE - var/obj/item/storage/bag/plants/PB = O + var/obj/item/storage/bag/plants/PB = used for(var/obj/item/P in PB.contents) // No need to filter here, because plant bags should have the same list of acceptable items we do. if(length(stored_plants) >= max_storable_plants) @@ -151,37 +155,38 @@ to_chat(user, "You fill [src] to its capacity.") SStgui.update_uis(src) - return TRUE + return ITEM_INTERACT_COMPLETE - if(is_type_in_typecache(O, acceptable_items)) + else if(is_type_in_typecache(used, acceptable_items)) if(length(stored_plants) >= max_storable_plants) to_chat(user, "[src] can't hold any more plants!") - return - if(!user.drop_item_to_ground(O)) - return + return ITEM_INTERACT_COMPLETE + if(!user.drop_item_to_ground(used)) + return ITEM_INTERACT_COMPLETE - O.forceMove(src) - stored_plants += O - to_chat(user, "You put [O] in [src].") + used.forceMove(src) + stored_plants += used + to_chat(user, "You put [used] in [src].") SStgui.update_uis(src) - return TRUE + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/disk/design_disk)) - user.visible_message("[user] begins to load [O] in [src]...", - "You begin to load a design from [O]...", + else if(istype(used, /obj/item/disk/design_disk)) + user.visible_message("[user] begins to load [used] in [src]...", + "You begin to load a design from [used]...", "You hear the chatter of a floppy drive.") processing = TRUE SStgui.update_uis(src) - var/obj/item/disk/design_disk/D = O + var/obj/item/disk/design_disk/D = used if(do_after(user, 1 SECONDS, target = src)) files.AddDesign2Known(D.blueprint) processing = FALSE update_ui_product_list(user) - return TRUE + return ITEM_INTERACT_COMPLETE to_chat(user, "You cannot put [src] in [name]!") + return ITEM_INTERACT_COMPLETE /** * Builds/Updates the `product_list` used by the UI. diff --git a/code/modules/hydroponics/compost_bin.dm b/code/modules/hydroponics/compost_bin.dm index 152ed33fa1c4..fb1c95d63a01 100644 --- a/code/modules/hydroponics/compost_bin.dm +++ b/code/modules/hydroponics/compost_bin.dm @@ -66,16 +66,20 @@ qdel(O) // takes care of plant insertion and conversion to biomass, and start composting what was inserted -/obj/machinery/compost_bin/attackby__legacy__attackchain(obj/item/O, mob/user, params) +/obj/machinery/compost_bin/item_interaction(mob/living/user, obj/item/used, list/modifiers) + // TODO: This feels off, no where else do we have a blanket "print a + // message for any other kind of item interaction attempt" that's keyed to intent + // See if this can be made more sensible after everything's been migrated + // to the new attack chain if(user.a_intent == INTENT_HARM) return ..() - if(istype(O, /obj/item/storage/bag/plants)) + if(istype(used, /obj/item/storage/bag/plants)) if(biomass >= biomass_capacity && potassium >= potassium_capacity) to_chat(user, "[src] can't hold any more biomass, and it's contents are saturated with potassium!") - return + return ITEM_INTERACT_COMPLETE - var/obj/item/storage/bag/plants/PB = O + var/obj/item/storage/bag/plants/PB = used for(var/obj/item/food/grown/G in PB.contents) // if the plant contains either potassium, plantmatter and nutriment and the compost bin has space for any of those. if((G.reagents.get_reagent_amount("potassium") && potassium <= potassium_capacity) || ((G.reagents.get_reagent_amount("plantmatter") || G.reagents.get_reagent_amount("nutriment")) && biomass <= biomass_capacity)) @@ -97,30 +101,30 @@ SStgui.update_uis(src) update_icon(UPDATE_ICON_STATE) - return TRUE + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/food/grown)) + if(istype(used, /obj/item/food/grown)) if(biomass >= biomass_capacity && potassium >= potassium_capacity) to_chat(user, "[src] can't hold any more biomass, and its contents are saturated with potassium!") - return - if(!user.drop_item_to_ground(O)) - return + return ITEM_INTERACT_COMPLETE + if(!user.drop_item_to_ground(used)) + return ITEM_INTERACT_COMPLETE - O.forceMove(src) - make_biomass(O) - to_chat(user, "You put [O] in [src].") + used.forceMove(src) + make_biomass(used) + to_chat(user, "You put [used] in [src].") SStgui.update_uis(src) update_icon(UPDATE_ICON_STATE) - return TRUE - if(istype(O, /obj/item/reagent_containers)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/reagent_containers)) var/proportion = 0 - var/obj/item/reagent_containers/B = O + var/obj/item/reagent_containers/B = used if(B.reagents.total_volume <= 0) to_chat(user, "[B] is empty!") - return + return ITEM_INTERACT_COMPLETE if(potassium >= potassium_capacity && potash >= potash_capacity) to_chat(user, "The contents of [src] are saturated with potassium and it cannot hold more potash!") - return + return ITEM_INTERACT_COMPLETE // Won't pour in more than the amount of potassium that can be accepted, even if the beaker is not filled with pure potassium. proportion = min(min(B.reagents.total_volume, B.amount_per_transfer_from_this), potassium_capacity - potassium) / B.reagents.total_volume @@ -156,9 +160,10 @@ SStgui.update_uis(src) update_icon(UPDATE_ICON_STATE) - return TRUE + return ITEM_INTERACT_COMPLETE to_chat(user, "You cannot put this in [src]!") + return ITEM_INTERACT_COMPLETE //Compost compostable material if there is any /obj/machinery/compost_bin/process() diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index fbbb0238fda7..72c77d48fa73 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -130,25 +130,25 @@ if(panel_open) . += "dnamod-open" -/obj/machinery/plantgenes/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I)) +/obj/machinery/plantgenes/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", used)) update_icon(UPDATE_OVERLAYS) - return + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, I)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/unsorted_seeds)) - to_chat(user, "You need to sort [I] first!") - return + if(istype(used, /obj/item/unsorted_seeds)) + to_chat(user, "You need to sort [used] first!") + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/seeds)) - add_seed(I, user) - return + if(istype(used, /obj/item/seeds)) + add_seed(used, user) + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/disk/plantgene) || istype(I, /obj/item/storage/box)) - add_disk(I, user) - return + if(istype(used, /obj/item/disk/plantgene) || istype(used, /obj/item/storage/box)) + add_disk(used, user) + return ITEM_INTERACT_COMPLETE return ..() @@ -338,7 +338,8 @@ if("eject_seed") if(seed) seed.forceMove(loc) - user.put_in_hands(seed) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(seed) seed = null update_genes() update_icon(UPDATE_OVERLAYS) @@ -351,7 +352,8 @@ var/obj/item/disk/plantgene/D = contents[text2num(params["index"])] if(D) D.forceMove(loc) - user.put_in_hands(D) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(D) disk = null update_genes() else @@ -420,7 +422,8 @@ for(var/obj/item/disk/plantgene/D in contents) if(!D.gene && !D.is_bulk_core) D.forceMove(loc) - user.put_in_hands(D) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(D) update_genes() return to_chat(user, "No Empty Disks to Eject!") diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 9d6ef0044708..e4bc12e46b1c 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -26,7 +26,7 @@ name = "watermelon" desc = "It's full of watery goodness." icon_state = "watermelon" // Sprite created by https://github.com/binarysudoku for Goonstation, They have relicensed it for our use. - slice_path = /obj/item/food/watermelonslice + slice_path = /obj/item/food/sliced/watermelon slices_num = 5 dried_type = null w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 3e4532713ea9..ac2f8653b3b8 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -23,7 +23,7 @@ icon_state = "onion" filling_color = "#C0C9A0" bitesize_mod = 2 - slice_path = /obj/item/food/onion_slice + slice_path = /obj/item/food/sliced/onion_slice tastes = list("onion" = 1, "pungentness" = 1) slices_num = 2 wine_power = 0.3 @@ -46,12 +46,12 @@ desc = "Purple despite the name." icon_state = "onion_red" filling_color = "#C29ACF" - slice_path = /obj/item/food/onion_slice/red + slice_path = /obj/item/food/sliced/onion_slice/red tastes = list("red onion" = 1, "pungentness" = 3) wine_power = 0.6 wine_flavor = "powerful pungentness" -/obj/item/food/onion_slice +/obj/item/food/sliced/onion_slice name = "onion slices" desc = "Rings, not for wearing." icon_state = "onionslice" @@ -61,7 +61,7 @@ gender = PLURAL cooked_type = /obj/item/food/onionrings -/obj/item/food/onion_slice/red +/obj/item/food/sliced/onion_slice/red name = "red onion slices" desc = "They shine like exceptionally low quality amethyst." icon_state = "onionslice_red" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 3935ae7ae7e6..97aa3e54189c 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -25,7 +25,7 @@ attack_verb = list("stung", "pined") throw_speed = 1 throw_range = 5 - slice_path = /obj/item/food/pineappleslice + slice_path = /obj/item/food/sliced/pineapple slices_num = 3 filling_color = "#F6CB0B" w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 6934b92fba3f..041b6c748986 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -19,7 +19,7 @@ name = "tomato" desc = "I say to-mah-to, you say tom-mae-to." icon_state = "tomato" - slice_path = /obj/item/food/tomatoslice + slice_path = /obj/item/food/sliced/tomato slices_num = 4 splat_type = /obj/effect/decal/cleanable/tomato_smudge filling_color = "#FF6347" diff --git a/code/modules/hydroponics/hydroponics_tray.dm b/code/modules/hydroponics/hydroponics_tray.dm index 3174a1a4d625..09c0b3c7f0f5 100644 --- a/code/modules/hydroponics/hydroponics_tray.dm +++ b/code/modules/hydroponics/hydroponics_tray.dm @@ -123,9 +123,10 @@ QDEL_NULL(myseed) return ..() -/obj/machinery/hydroponics/constructable/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I)) - return +/obj/machinery/hydroponics/constructable/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", used)) + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/hydroponics/constructable/crowbar_act(mob/user, obj/item/I) @@ -493,8 +494,6 @@ plant_hud_set_health() plant_hud_set_status() - - /obj/machinery/hydroponics/proc/mutatepest(mob/user) if(pestlevel > 5) message_admins("[ADMIN_LOOKUPFLW(user)] caused spiderling pests to spawn in a hydro tray") @@ -770,25 +769,25 @@ to_chat(user, message.Join("")) doping_chem = new_chem -/obj/machinery/hydroponics/attackby__legacy__attackchain(obj/item/O, mob/user, params) - //Called when mob user "attacks" it with object O - if(istype(O, /obj/item/reagent_containers)) // Syringe stuff (and other reagent containers now too) - var/obj/item/reagent_containers/reagent_source = O +/obj/machinery/hydroponics/item_interaction(mob/living/user, obj/item/used, list/modifiers) + //Called when mob user "attacks" it with object `used` + if(istype(used, /obj/item/reagent_containers)) // Syringe stuff (and other reagent containers now too) + var/obj/item/reagent_containers/reagent_source = used var/target = myseed ? myseed.plantname : src if(istype(reagent_source, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/syr = reagent_source if(syr.mode != SYRINGE_INJECT) to_chat(user, "You can't get any extract out of this plant.") //That. Gives me an idea... - return TRUE + return ITEM_INTERACT_COMPLETE if(!reagent_source.reagents.total_volume) to_chat(user, "[reagent_source] is empty.") - return TRUE + return ITEM_INTERACT_COMPLETE if(reagent_source.has_lid && !reagent_source.is_drainable()) //if theres a LID then cannot transfer reagents. - to_chat(user, "You need to open [O] first!") - return TRUE + to_chat(user, "You need to open [used] first!") + return ITEM_INTERACT_COMPLETE var/visi_msg = "" var/transfer_amount = reagent_source.amount_per_transfer_from_this @@ -814,65 +813,71 @@ playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) add_compost(reagent_source, user, transfer_amount, visi_msg, irrigate) - return TRUE + return ITEM_INTERACT_COMPLETE - else if(isfood(O) || istype(O, /obj/item/grown)) + else if(isfood(used) || istype(used, /obj/item/grown)) var/target = myseed ? myseed.plantname : src - var/transfer = O.reagents.total_volume - var/message = "[user] composts [O], spreading it through [target]" - add_compost(O, user, transfer, message) - return TRUE + var/transfer = used.reagents.total_volume + var/message = "[user] composts [used], spreading it through [target]" + add_compost(used, user, transfer, message) + return ITEM_INTERACT_COMPLETE - else if(istype(O, /obj/item/unsorted_seeds)) - to_chat(user, "You need to sort [O] first!") - return ..() + else if(istype(used, /obj/item/unsorted_seeds)) + to_chat(user, "You need to sort [used] first!") + return ITEM_INTERACT_COMPLETE - else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) + else if(istype(used, /obj/item/seeds) && !istype(used, /obj/item/seeds/sample)) if(!myseed) - if(istype(O, /obj/item/seeds/kudzu)) + if(istype(used, /obj/item/seeds/kudzu)) investigate_log("had Kudzu planted in it by [key_name(user)] at ([x],[y],[z])","kudzu") - user.unequip(O) - to_chat(user, "You plant [O].") + user.unequip(used) + to_chat(user, "You plant [used].") dead = FALSE - myseed = O + myseed = used age = 1 plant_health = myseed.endurance plant_hud_set_health() plant_hud_set_status() lastcycle = world.time - O.forceMove(src) + used.forceMove(src) update_state() else to_chat(user, "[src] already has seeds in it!") - else if(istype(O, /obj/item/plant_analyzer)) + return ITEM_INTERACT_COMPLETE + + else if(istype(used, /obj/item/plant_analyzer)) send_plant_details(user) + return ITEM_INTERACT_COMPLETE - else if(istype(O, /obj/item/cultivator)) + else if(istype(used, /obj/item/cultivator)) if(weedlevel > 0) user.visible_message("[user] uproots the weeds.", "You remove the weeds from [src].") adjustWeeds(-10) update_state() else to_chat(user, "This plot is completely devoid of weeds! It doesn't need uprooting.") + return ITEM_INTERACT_COMPLETE - else if(istype(O, /obj/item/storage/bag/plants)) + else if(istype(used, /obj/item/storage/bag/plants)) if(!harvest) attack_hand(user) - return + return ITEM_INTERACT_COMPLETE + + myseed.harvest(user, used) - myseed.harvest(user, O) + return ITEM_INTERACT_COMPLETE - else if(istype(O, /obj/item/shovel/spade)) + else if(istype(used, /obj/item/shovel/spade)) if(!myseed && !weedlevel) to_chat(user, "[src] doesn't have any plants or weeds!") - return + return ITEM_INTERACT_COMPLETE user.visible_message("[user] starts digging out [src]'s plants...", "You start digging out [src]'s plants...") - playsound(src, O.usesound, 50, 1) - if(!do_after(user, 25 * O.toolspeed, target = src) || (!myseed && !weedlevel)) - return + playsound(src, used.usesound, 50, 1) + if(!do_after(user, 25 * used.toolspeed, target = src) || (!myseed && !weedlevel)) + return ITEM_INTERACT_COMPLETE user.visible_message("[user] digs out the plants in [src]!", "You dig out all of [src]'s plants!") - playsound(src, O.usesound, 50, 1) + playsound(src, used.usesound, 50, 1) if(myseed) //Could be that they're just using it as a de-weeder age = 0 plant_health = 0 @@ -886,8 +891,10 @@ plant_hud_set_status() adjustWeeds(-10) //Has a side effect of cleaning up those nasty weeds update_state() - else if(is_pen(O) && myseed) + return ITEM_INTERACT_COMPLETE + else if(is_pen(used) && myseed) myseed.variant_prompt(user, src) + return ITEM_INTERACT_COMPLETE else return ..() @@ -1028,12 +1035,13 @@ /obj/machinery/hydroponics/soil/update_icon_lights() return // Has no lights -/obj/machinery/hydroponics/soil/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(istype(O, /obj/item/shovel) && !istype(O, /obj/item/shovel/spade)) //Doesn't include spades because of uprooting plants +/obj/machinery/hydroponics/soil/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/shovel) && !istype(used, /obj/item/shovel/spade)) //Doesn't include spades because of uprooting plants to_chat(user, "You clear up [src]!") qdel(src) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/hydroponics/proc/add_compost(obj/item/reagent_source, mob/user, transfer_amount, visi_msg, irrigate = FALSE) var/list/trays = list(src)//makes the list just this in cases of syringes and compost etc diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 1f9d9feb17e3..e3a76b98994c 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -74,23 +74,23 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) seed_multiplier = M.rating -/obj/machinery/seed_extractor/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O)) - return +/obj/machinery/seed_extractor/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", used)) + return ITEM_INTERACT_COMPLETE - if(default_unfasten_wrench(user, O, time = 4 SECONDS)) - return + if(default_unfasten_wrench(user, used, time = 4 SECONDS)) + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, O)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/part_replacer)) + if(istype(used, /obj/item/storage/part_replacer)) . = ..() SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/storage/bag/plants)) - var/obj/item/storage/P = O + if(istype(used, /obj/item/storage/bag/plants)) + var/obj/item/storage/P = used var/loaded = 0 for(var/obj/item/seeds/G in P) if(length(contents) >= max_seeds) @@ -99,7 +99,7 @@ add_seed(G, user) if(loaded) - to_chat(user, "You transfer [loaded] seeds from [O] into [src].") + to_chat(user, "You transfer [loaded] seeds from [used] into [src].") SStgui.update_uis(src) else var/seedable = 0 @@ -108,33 +108,34 @@ for(var/obj/item/grown/ignored in P) seedable++ if(!seedable) - to_chat(user, "There are no seeds or plants in [O].") - return + to_chat(user, "There are no seeds or plants in [used].") + return ITEM_INTERACT_COMPLETE - to_chat(user, "You dump the plants in [O] into [src].") - if(!O.use_tool(src, user, min(5, seedable/2) SECONDS)) - return + to_chat(user, "You dump the plants in [used] into [src].") + if(!used.use_tool(src, user, min(5, seedable/2) SECONDS)) + return ITEM_INTERACT_COMPLETE for(var/thing in P) seedify(thing,-1, src, user) - return + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/unsorted_seeds)) - to_chat(user, "You need to sort [O] first!") - return ..() + if(istype(used, /obj/item/unsorted_seeds)) + to_chat(user, "You need to sort [used] first!") + return ITEM_INTERACT_COMPLETE - if(istype(O, /obj/item/seeds)) - add_seed(O, user) - to_chat(user, "You add [O] to [name].") + if(istype(used, /obj/item/seeds)) + add_seed(used, user) + to_chat(user, "You add [used] to [name].") SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE - if(seedify(O,-1, src, user)) + if(seedify(used,-1, src, user)) to_chat(user, "You extract some seeds.") - return + return ITEM_INTERACT_COMPLETE if(user.a_intent != INTENT_HARM) - to_chat(user, "You can't extract any seeds from \the [O.name]!") + to_chat(user, "You can't extract any seeds from \the [used.name]!") + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/input/keybindings_procs.dm b/code/modules/input/keybindings_procs.dm index b5e95307f01d..f370a883e7fa 100644 --- a/code/modules/input/keybindings_procs.dm +++ b/code/modules/input/keybindings_procs.dm @@ -21,3 +21,9 @@ active_keybindings[linked_bind.binded_to] += list(linked_bind) return active_keybindings + +/client/proc/calculate_move_dir() + . = NONE + for(var/held_key in input_data.keys_held) + if(held_key in movement_kb_dirs) + . |= movement_kb_dirs[held_key] diff --git a/code/modules/library/library_computer.dm b/code/modules/library/library_computer.dm index 56cbb2c9539b..54c6f3a900ce 100644 --- a/code/modules/library/library_computer.dm +++ b/code/modules/library/library_computer.dm @@ -65,22 +65,22 @@ /obj/machinery/computer/library/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/computer/library/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(istype(O, /obj/item/book)) - select_book(O) - return - if(istype(O, /obj/item/barcodescanner)) - var/obj/item/barcodescanner/B = O +/obj/machinery/computer/library/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/book)) + select_book(used) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/barcodescanner)) + var/obj/item/barcodescanner/B = used if(!B.connect(src)) playsound(src, 'sound/machines/synth_no.ogg', 15, TRUE) to_chat(user, "ERROR: No Connection Established!") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "Barcode Scanner Successfully Connected to Computer.") audible_message("[src] lets out a low, short blip.", hearing_distance = 2) playsound(B, 'sound/machines/terminal_select.ogg', 10, TRUE) - return - if(istype(O, /obj/item/card/id)) - var/obj/item/card/id/ID = O //at some point, this should be moved over to its own proc (select_patron()???) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id)) + var/obj/item/card/id/ID = used //at some point, this should be moved over to its own proc (select_patron()???) if(ID.registered_name) user_data.patron_name = ID.registered_name else @@ -88,17 +88,17 @@ user_data.patron_account = null //account number should reset every scan so we don't accidently have an account number but no name playsound(src, 'sound/machines/synth_no.ogg', 15, TRUE) to_chat(user, "ERROR: No name detected!") - return //no point in continuing if the ID card has no associated name! + return ITEM_INTERACT_COMPLETE //no point in continuing if the ID card has no associated name! playsound(src, 'sound/items/scannerbeep.ogg', 15, TRUE) if(ID.associated_account_number) user_data.patron_account = ID.associated_account_number else user_data.patron_account = null to_chat(user, "[src]'s screen flashes: 'WARNING! Patron without associated account number Selected'") - return + return ITEM_INTERACT_COMPLETE - if(default_unfasten_wrench(user, O, time = 60)) - return + if(default_unfasten_wrench(user, used, time = 60)) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/library/library_equipment.dm b/code/modules/library/library_equipment.dm index 38b9038220e4..4453dcabc498 100644 --- a/code/modules/library/library_equipment.dm +++ b/code/modules/library/library_equipment.dm @@ -10,7 +10,7 @@ /obj/structure/bookcase name = "bookcase" icon = 'icons/obj/library.dmi' - icon_state = "bookshelf-0" + icon_state = "bookshelf" anchored = TRUE density = TRUE opacity = TRUE @@ -18,6 +18,7 @@ max_integrity = 200 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 50, ACID = 0) var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/bible, /obj/item/tome) //Things allowed in the bookcase + var/material_type = /obj/item/stack/sheet/wood /obj/structure/bookcase/Initialize(mapload) . = ..() @@ -29,14 +30,14 @@ for(var/obj/item/I in get_turf(src)) if(is_type_in_list(I, allowed_books)) I.forceMove(src) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) /obj/structure/bookcase/attackby__legacy__attackchain(obj/item/O, mob/user) if(is_type_in_list(O, allowed_books)) if(!user.drop_item()) return O.forceMove(src) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) return TRUE if(istype(O, /obj/item/storage/bag/books)) var/obj/item/storage/bag/books/B = O @@ -44,7 +45,7 @@ if(is_type_in_list(T, allowed_books)) B.remove_from_storage(T, src) to_chat(user, "You empty [O] into [src].") - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) return TRUE if(is_pen(O)) rename_interactive(user, O) @@ -65,17 +66,19 @@ user.put_in_hands(choice) else choice.forceMove(get_turf(src)) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) /obj/structure/bookcase/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/wood(loc, 5) + new material_type(get_turf(src), 5) for(var/obj/item/I in contents) if(is_type_in_list(I, allowed_books)) I.forceMove(get_turf(src)) ..() -/obj/structure/bookcase/update_icon_state() - icon_state = "bookshelf-[min(length(contents), 5)]" +/obj/structure/bookcase/update_overlays() + . = ..() + if(length(contents)) + . += "[icon_state]-[min(length(contents), 5)]" /obj/structure/bookcase/screwdriver_act(mob/user, obj/item/I) @@ -101,7 +104,7 @@ /obj/structure/bookcase/manuals/medical/Initialize(mapload) . = ..() new /obj/item/book/manual/medical_cloning(src) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) /obj/structure/bookcase/manuals/engineering @@ -115,7 +118,7 @@ new /obj/item/book/manual/wiki/engineering_guide(src) new /obj/item/book/manual/engineering_singularity_safety(src) new /obj/item/book/manual/wiki/robotics_cyborgs(src) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) /obj/structure/bookcase/manuals/research_and_development name = "R&D Manuals bookcase" @@ -123,7 +126,7 @@ /obj/structure/bookcase/manuals/research_and_development/Initialize(mapload) . = ..() new /obj/item/book/manual/research_and_development(src) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) /obj/structure/bookcase/sop name = "bookcase (Standard Operating Procedures)" @@ -139,23 +142,36 @@ new /obj/item/book/manual/wiki/sop_security(src) new /obj/item/book/manual/wiki/sop_service(src) new /obj/item/book/manual/wiki/sop_supply(src) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) /obj/structure/bookcase/random var/category = null var/book_count = 5 - icon_state = "random_bookcase" + icon_state = "random_bookshelf" anchored = TRUE /obj/structure/bookcase/random/Initialize(mapload) . = ..() addtimer(CALLBACK(src, PROC_REF(load_books)), 0) + icon_state = "bookshelf" // to keep random_bookshelf icon for mappers /obj/structure/bookcase/random/proc/load_books() var/list/books = GLOB.library_catalog.get_random_book(book_count) for(var/datum/cachedbook/book as anything in books) new /obj/item/book(src, book, TRUE, FALSE) - update_icon(UPDATE_ICON_STATE) + update_icon(UPDATE_OVERLAYS) + +/obj/structure/bookcase/metal + icon_state = "bookshelf_metal" + material_type = /obj/item/stack/sheet/metal + +/obj/structure/bookcase/nt + icon_state = "bookshelf_nt" + material_type = /obj/item/stack/sheet/metal + +/obj/structure/bookcase/military + icon_state = "bookshelf_military" + material_type = /obj/item/stack/sheet/plasteel /* * Book binder @@ -183,15 +199,18 @@ ui_interact(user) -/obj/machinery/bookbinder/attackby__legacy__attackchain(obj/item/I, mob/user) - if(istype(I, /obj/item/paper)) - select_paper(I) - if(istype(I, /obj/item/paper_bundle)) - select_paper_stack(I) - if(istype(I, /obj/item/book)) - select_book(I) - if(default_unfasten_wrench(user, I, time = 60)) - return +/obj/machinery/bookbinder/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/paper)) + select_paper(used) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/paper_bundle)) + select_paper_stack(used) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/book)) + select_book(used) + return ITEM_INTERACT_COMPLETE + if(default_unfasten_wrench(user, used, time = 60)) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 5195a1fdb39f..a835cc797ff4 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -4,7 +4,8 @@ GLOBAL_LIST_EMPTY(wormhole_effect) /**********************Jaunter**********************/ /obj/item/wormhole_jaunter name = "wormhole jaunter" - desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms." + desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. \ + The wormholes it creates are unpleasant to travel through, to say the least. If attached to your belt, it'll automatically activate should you fall into a chasm." icon_state = "Jaunter" item_state = "electronic" throwforce = 0 diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index afe662bb5a7f..4e64315478b8 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -46,20 +46,21 @@ QDEL_NULL(announcer) return ..() -/obj/machinery/mineral/labor_prisoner_shuttle_console/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id/prisoner)) +/obj/machinery/mineral/labor_prisoner_shuttle_console/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id/prisoner)) if(inserted_id_uid) to_chat(user, "There's an ID inserted already.") - return + return ITEM_INTERACT_COMPLETE - if(!user.drop_item_to_ground(I)) - return + if(!user.drop_item_to_ground(used)) + return ITEM_INTERACT_COMPLETE - I.forceMove(src) - inserted_id_uid = I.UID() - to_chat(user, "You insert [I].") + used.forceMove(src) + inserted_id_uid = used.UID() + to_chat(user, "You insert [used].") SStgui.update_uis(src) - return + + return ITEM_INTERACT_COMPLETE return ..() @@ -172,18 +173,19 @@ return user.examinate(src) -/obj/machinery/mineral/labor_points_checker/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/prisoner_id = I +/obj/machinery/mineral/labor_points_checker/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/prisoner_id = used if(!prisoner_id.goal) to_chat(user, "Error: No point quota assigned by security, exiting.") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "ID: [prisoner_id.registered_name]") to_chat(user, "Points Collected:[prisoner_id.mining_points]") to_chat(user, "Point Quota: [prisoner_id.goal]") to_chat(user, "Collect points by bringing ore to the labor camp ore redemption machine. Reach your quota to earn your release.") - return - if(istype(I, /obj/item/card/id)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id)) to_chat(user, "Error: Invalid ID") - return + return ITEM_INTERACT_COMPLETE + return ..() diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 740a502eab19..a67f1adf036e 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -49,8 +49,8 @@ ..() ActivationReaction(user,"touch") -/obj/machinery/anomalous_crystal/attackby__legacy__attackchain(obj/item/I, mob/user, params) - ActivationReaction(user,"weapon") +/obj/machinery/anomalous_crystal/item_interaction(mob/living/user, obj/item/used, list/modifiers) + ActivationReaction(user, "weapon") return ..() /obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 237f37897ddf..db4ba936b6ca 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -376,33 +376,42 @@ addtimer(CALLBACK(src, PROC_REF(try_attach_to_owner)), 0) // Do this once the drop call stack is done. The holding limb might be getting removed /obj/item/rod_of_asclepius/proc/try_attach_to_owner() - if(ishuman(owner) && !QDELETED(owner)) - if(ishuman(loc)) - var/mob/living/carbon/human/thief = loc - thief.drop_item_to_ground(src, force = TRUE, silent = TRUE) // You're not my owner! - if(owner.stat == DEAD) - qdel(src) // Oh no! Oh well a new rod will be made from the STATUS_EFFECT_HIPPOCRATIC_OATH - return - flags |= NODROP // Readd the nodrop - var/mob/living/carbon/human/H = owner - var/limb_regrown = FALSE - if(usedHand == LEFT_HAND) - limb_regrown = H.regrow_external_limb_if_missing("l_arm") - limb_regrown = H.regrow_external_limb_if_missing("l_hand") || limb_regrown - H.drop_l_hand(TRUE) - H.put_in_l_hand(src, TRUE) - else - limb_regrown = H.regrow_external_limb_if_missing("r_arm") - limb_regrown = H.regrow_external_limb_if_missing("r_hand") || limb_regrown - H.drop_r_hand(TRUE) - H.put_in_r_hand(src, TRUE) - if(!limb_regrown) - to_chat(H, "The Rod of Asclepius suddenly grows back out of your arm!") - else - H.update_body() // Update the limb sprites - to_chat(H, "Your arm suddenly grows back with the Rod of Asclepius still attached!") - else + if(!ishuman(owner) || QDELETED(owner)) deactivate() + return + + var/mob/living/carbon/human/thief = loc + + if(thief == owner) // stealing from yourself, huh? + return + + if(ishuman(thief)) + thief.drop_item_to_ground(src, force = TRUE, silent = TRUE) // You're not my owner! + + if(owner.stat == DEAD) + qdel(src) // Oh no! Oh well a new rod will be made from the STATUS_EFFECT_HIPPOCRATIC_OATH + return + + flags |= NODROP // Readd the nodrop + var/mob/living/carbon/human/H = owner + var/limb_regrown = FALSE + + if(usedHand == LEFT_HAND) + limb_regrown = H.regrow_external_limb_if_missing("l_arm") + limb_regrown = H.regrow_external_limb_if_missing("l_hand") || limb_regrown + H.drop_l_hand(TRUE) + H.put_in_l_hand(src, TRUE) + else + limb_regrown = H.regrow_external_limb_if_missing("r_arm") + limb_regrown = H.regrow_external_limb_if_missing("r_hand") || limb_regrown + H.drop_r_hand(TRUE) + H.put_in_r_hand(src, TRUE) + + if(!limb_regrown) + to_chat(H, "The Rod of Asclepius suddenly grows back out of your arm!") + else + H.update_body() // Update the limb sprites + to_chat(H, "Your arm suddenly grows back with the Rod of Asclepius still attached!") /obj/item/rod_of_asclepius/proc/activated(mob/living/carbon/new_owner) owner = new_owner diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index dbb770a72c7d..60eeca60d177 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -180,18 +180,18 @@ message_sent = TRUE // Interactions -/obj/machinery/mineral/ore_redemption/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/part_replacer)) +/obj/machinery/mineral/ore_redemption/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) return ..() if(!has_power()) return ..() - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/ID = I + if(istype(used, /obj/item/card/id)) + var/obj/item/card/id/ID = used if(!points) to_chat(usr, "There are no points to claim."); - return + return ITEM_INTERACT_COMPLETE if(anyone_claim || (req_access_claim in ID.access)) ID.mining_points += points ID.total_mining_points += points @@ -201,25 +201,25 @@ else to_chat(usr, "Required access not found.") add_fingerprint(usr) - return + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/disk/design_disk)) + if(istype(used, /obj/item/disk/design_disk)) if(!user.drop_item()) - return - I.forceMove(src) - inserted_disk = I + return ITEM_INTERACT_COMPLETE + used.forceMove(src) + inserted_disk = used SStgui.update_uis(src) interact(user) user.visible_message( - "[user] inserts [I] into [src].", - "You insert [I] into [src]." + "[user] inserts [used] into [src].", + "You insert [used] into [src]." ) - return + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/gripper)) + if(istype(used, /obj/item/gripper)) if(!try_refill_storage(user)) to_chat(user, "You fail to retrieve any sheets from [src].") - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index f068ace4aa94..bc02fe6212b9 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -220,25 +220,25 @@ return FALSE add_fingerprint() -/obj/machinery/mineral/equipment_vendor/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/mineral/equipment_vendor/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(panel_open) - return TRUE - if(istype(I, /obj/item/mining_voucher)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/mining_voucher)) if(!has_power()) - return - redeem_voucher(I, user) - return - if(istype(I, /obj/item/card/id)) + return ITEM_INTERACT_COMPLETE + redeem_voucher(used, user) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id)) if(!has_power()) - return + return ITEM_INTERACT_COMPLETE var/obj/item/card/id/C = user.get_active_hand() if(istype(C) && !istype(inserted_id)) if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE C.forceMove(src) inserted_id = C ui_interact(user) - return + return ITEM_INTERACT_COMPLETE return ..() /obj/machinery/mineral/equipment_vendor/crowbar_act(mob/living/user, obj/item/I) @@ -446,30 +446,30 @@ EQUIPMENT("Point Transfer Card", /obj/item/card/mining_point_card, 500), ) -/obj/machinery/mineral/equipment_vendor/explorer/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "explorer-open", "explorer", I)) - return +/obj/machinery/mineral/equipment_vendor/explorer/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, "explorer-open", "explorer", used)) + return ITEM_INTERACT_COMPLETE if(panel_open) - if(istype(I, /obj/item/crowbar)) + if(istype(used, /obj/item/crowbar)) remove_id() - default_deconstruction_crowbar(user, I) - return TRUE - if(istype(I, /obj/item/mining_voucher)) + default_deconstruction_crowbar(user, used) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/mining_voucher)) if(!has_power()) - return - redeem_voucher(I, user) - return - if(istype(I, /obj/item/card/id)) + return ITEM_INTERACT_COMPLETE + redeem_voucher(used, user) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id)) if(!has_power()) - return + return ITEM_INTERACT_COMPLETE var/obj/item/card/id/C = user.get_active_hand() if(istype(C) && !istype(inserted_id)) if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE C.forceMove(src) inserted_id = C ui_interact(user) - return + return ITEM_INTERACT_COMPLETE return ..() /**********************Mining Equipment Datum**************************/ diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 099d937ccd46..b9953b6d6391 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -122,18 +122,19 @@ if("ejectBag") eject_bag(usr) -/obj/machinery/mineral/mint/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/bag/money)) +/obj/machinery/mineral/mint/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/bag/money)) if(money_bag) to_chat(user, "There is already a [money_bag.name] inside!") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return - to_chat(user, "You put a [I.name] into a [src].") - I.forceMove(src) - money_bag = I + return ITEM_INTERACT_COMPLETE + to_chat(user, "You put a [used.name] into a [src].") + used.forceMove(src) + money_bag = used SStgui.update_uis(src) - return + + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/mob/camera/eye/hologram_eye.dm b/code/modules/mob/camera/eye/hologram_eye.dm index a30c63827a9d..9eb9d1f43524 100644 --- a/code/modules/mob/camera/eye/hologram_eye.dm +++ b/code/modules/mob/camera/eye/hologram_eye.dm @@ -2,7 +2,6 @@ name = "Inactive Hologram Eye" ai_detector_visible = FALSE acceleration = FALSE - relay_speech = TRUE var/obj/machinery/hologram/holopad/holopad /mob/camera/eye/hologram/Initialize(mapload, owner_name, camera_origin, mob/living/user) diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm index d7d10ee753df..20eb899bb9b2 100644 --- a/code/modules/mob/dead/observer/observer_base.dm +++ b/code/modules/mob/dead/observer/observer_base.dm @@ -290,7 +290,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return // Ghosts have no momentum, being massless ectoplasm -/mob/dead/observer/Process_Spacemove(movement_dir) +/mob/dead/observer/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /mob/dead/observer/Move(NewLoc, direct) diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/observer_spells.dm similarity index 100% rename from code/modules/mob/dead/observer/spells.dm rename to code/modules/mob/dead/observer/observer_spells.dm diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 6a43c6e32487..1177124863f9 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11) AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items) -/mob/living/carbon/alien/humanoid/Process_Spacemove(check_drift = 0) +/mob/living/carbon/alien/humanoid/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(..()) return TRUE return FALSE diff --git a/code/modules/mob/living/carbon/carbon_procs.dm b/code/modules/mob/living/carbon/carbon_procs.dm index 60219a1527d3..0f429f764ebb 100644 --- a/code/modules/mob/living/carbon/carbon_procs.dm +++ b/code/modules/mob/living/carbon/carbon_procs.dm @@ -234,7 +234,10 @@ return // If it has any of the highfive statuses, dap, handshake, etc var/datum/status_effect/effect = has_status_effect_type(STATUS_EFFECT_HIGHFIVE) - if(effect) + if(istype(effect, STATUS_EFFECT_OFFERING_EFTPOS)) + to_chat(M, "You need to have your ID in hand to scan it!") + return + else if(effect) M.apply_status_effect(effect.type) return // BEGIN HUGCODE - N3X @@ -1250,8 +1253,9 @@ so that different stomachs can handle things in different ways VB*/ if(istype(head, /obj/item/clothing/head)) var/obj/item/clothing/head/HT = head . += HT.tint - if(wear_mask) - . += wear_mask.tint + if(ismask(wear_mask)) + var/obj/item/clothing/mask/worn_mask = wear_mask + . += worn_mask.tint var/obj/item/organ/internal/eyes/E = get_organ_slot("eyes") if(E) @@ -1269,7 +1273,7 @@ so that different stomachs can handle things in different ways VB*/ update_inv_wear_mask() /mob/living/carbon/wear_mask_update(obj/item/clothing/C, toggle_off = 1) - if(C.tint || initial(C.tint)) + if(istype(C) && (C.tint || initial(C.tint))) update_tint() update_inv_wear_mask() @@ -1372,3 +1376,33 @@ so that different stomachs can handle things in different ways VB*/ /// Returns TRUE if a breathing tube is equipped. /mob/living/carbon/proc/can_breathe_tube() return get_organ_slot("breathing_tube") + +/mob/living/carbon/proc/lazrevival(mob/living/carbon/M) + if(M.get_ghost()) // ghosted after the timer expires. + M.visible_message("[M]'s body stops twitching as the Lazarus Reagent loses potency.") + return + + // If the ghost has re-entered the body, perform the revival! + M.visible_message("[M] gasps as they return to life!") + M.adjustCloneLoss(50) + M.setOxyLoss(0) + M.adjustBruteLoss(rand(0, 15)) + M.adjustToxLoss(rand(0, 15)) + M.adjustFireLoss(rand(0, 15)) + M.do_jitter_animation(200) + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/necrosis_prob = 15 * H.decaylevel + H.decaylevel = 0 + for(var/obj/item/organ/O in (H.bodyparts | H.internal_organs)) + if(prob(necrosis_prob) && !O.is_robotic() && !O.vital) + O.necrotize(FALSE) + if(O.status & ORGAN_DEAD) + O.germ_level = INFECTION_LEVEL_THREE + H.update_body() + + M.grab_ghost() + M.update_revive() + add_attack_logs(M, M, "Revived with Lazarus Reagent") + SSblackbox.record_feedback("tally", "players_revived", 1, "lazarus_reagent") diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 414130c96d5b..494184c5299f 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -62,8 +62,9 @@ update_observer_view(l_hand) /mob/living/carbon/update_inv_wear_mask() - if(istype(wear_mask, /obj/item/clothing/mask)) - update_hud_wear_mask(wear_mask) + if(!wear_mask) + return + update_hud_wear_mask(wear_mask) /mob/living/carbon/update_inv_back() if(client && hud_used && hud_used.inv_slots[ITEM_SLOT_2_INDEX(ITEM_SLOT_BACK)]) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f50496e4ff57..fb1ddae797b6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -532,7 +532,7 @@ emp_act bloody = TRUE var/turf/location = loc if(issimulatedturf(location)) - add_splatter_floor(location, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null) + add_splatter_floor(location, emittor_intertia = last_movement_dir) if(ishuman(user)) var/mob/living/carbon/human/H = user if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood @@ -781,7 +781,7 @@ emp_act update |= affecting.receive_damage(dmg, 0) playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) if("fire") - update |= affecting.receive_damage(dmg, 0) + update |= affecting.receive_damage(0, dmg) playsound(src, 'sound/items/welder.ogg', 50, TRUE) if("tox") M.mech_toxin_damage(src) @@ -842,7 +842,7 @@ emp_act return TRUE /mob/living/carbon/human/projectile_hit_check(obj/item/projectile/P) - return (HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_NOKNOCKDOWNSLOWDOWN)) && !density && !(P.always_hit_living_nondense && (stat != DEAD)) // hit mobs that are intentionally lying down to prevent combat crawling. + return (HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_NOKNOCKDOWNSLOWDOWN)) && !density && !(P.always_hit_living_nondense && (stat != DEAD) && !isLivingSSD(src)) // hit mobs that are intentionally lying down to prevent combat crawling. /mob/living/carbon/human/canBeHandcuffed() return has_left_hand() || has_right_hand() diff --git a/code/modules/mob/living/carbon/human/human_emote.dm b/code/modules/mob/living/carbon/human/human_emote.dm index 3d89e7c0f22b..8d85ec818445 100644 --- a/code/modules/mob/living/carbon/human/human_emote.dm +++ b/code/modules/mob/living/carbon/human/human_emote.dm @@ -404,6 +404,31 @@ status = STATUS_EFFECT_DAP key_third_person = "daps" +/datum/emote/living/carbon/human/highfive/payme + key = "payme" + status = STATUS_EFFECT_OFFERING_EFTPOS + +/datum/emote/living/carbon/human/highfive/payme/run_emote(mob/living/user, params, type_override, intentional) + var/obj/item/eftpos/eftpos = user.is_holding_item_of_type(/obj/item/eftpos) + if(!eftpos) + to_chat(user, "You must be holding an EFTPOS to do that!") + return TRUE + if(!eftpos.can_offer) + to_chat(user, "[eftpos] is too bulky to hold out to someone!") + return TRUE + if(!eftpos.transaction_locked) + to_chat(user, "You must lock [eftpos] before it can accept payments.") + return TRUE + if(user.has_status_effect(status)) + user.visible_message("[user.name] shakes [eftpos] around slightly, impatiently waiting for someone to scan their card.") + return TRUE + + var/datum/result = set_status(user) + if(QDELETED(result)) + return TRUE + + return TRUE + /datum/emote/living/carbon/human/highfive/handshake key = "handshake" key_third_person = "handshakes" diff --git a/code/modules/mob/living/carbon/human/human_mob.dm b/code/modules/mob/living/carbon/human/human_mob.dm index 26a3e275b2d0..debe4bc06aab 100644 --- a/code/modules/mob/living/carbon/human/human_mob.dm +++ b/code/modules/mob/living/carbon/human/human_mob.dm @@ -929,7 +929,7 @@ H.UpdateAppearance() //Replacing lost organs with the species default. - temp_holder = new /mob/living/carbon/human() + temp_holder = new /mob/living/carbon/human/fake() var/list/species_organs = H.dna.species.has_organ.Copy() //Compile a list of species organs and tack on the mutantears afterward. if(H.dna.species.mutantears) species_organs["ears"] = H.dna.species.mutantears diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm index 9d39401ccf25..064f551d6a9f 100644 --- a/code/modules/mob/living/carbon/human/species/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -90,9 +90,11 @@ to_chat(user, "Your throat hurts too much to do it right now. Wait [round((cooldown - world.time) / 10)] seconds and try again.") return if(!welding_fuel_used || user.reagents.has_reagent("fuel", welding_fuel_used)) - if((user.head?.flags_cover & HEADCOVERSMOUTH) || (user.wear_mask?.flags_cover & MASKCOVERSMOUTH) && !user.wear_mask?.up) - to_chat(user, "Your mouth is covered.") - return + if(ismask(user.wear_mask)) + var/obj/item/clothing/mask/worn_mask = user.wear_mask + if((user.head?.flags_cover & HEADCOVERSMOUTH) || (worn_mask.flags_cover & MASKCOVERSMOUTH) && !worn_mask.up) + to_chat(user, "Your mouth is covered.") + return var/obj/item/match/unathi/fire = new(user.loc, src) if(user.put_in_hands(fire)) to_chat(user, "You ignite a small flame in your mouth.") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index eff680b8862c..6355084e8a5a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -213,8 +213,8 @@ var/current_dir if(isliving(AM)) current_dir = AM.dir - if(step(AM, t)) - step(src, t) + if(AM.Move(get_step(AM.loc, t), t, glide_size)) + Move(get_step(loc, t), t) if(current_dir) AM.setDir(current_dir) now_pushing = FALSE @@ -530,7 +530,6 @@ cure_nearsighted() CureMute() CureDeaf() - CureTourettes() CureEpilepsy() CureCoughing() CureNervous() @@ -598,7 +597,7 @@ return return ..() -/mob/living/Move(atom/newloc, direct, movetime) +/mob/living/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE) if(buckled && buckled.loc != newloc) //not updating position if(!buckled.anchored) return buckled.Move(newloc, direct) @@ -614,31 +613,13 @@ if(restrained() || HAS_TRAIT(src, TRAIT_CANNOT_PULL)) stop_pulling() - var/turf/old_loc = loc . = ..() if(.) step_count++ - pull_pulled(old_loc, pullee, movetime) if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents) first so we hopefully don't have to call get_turf() so much. s_active.close(src) -/mob/living/proc/pull_pulled(turf/dest, atom/movable/pullee, movetime) - if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move. - if(pulling.anchored) - stop_pulling() - return - - var/pull_dir = get_dir(src, pulling) - if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position - if(isliving(pulling)) - var/mob/living/M = pulling - if(IS_HORIZONTAL(M) && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) // So once you reach 50 brute damage you hit 100% chance to leave a blood trail for every tile you're pulled - M.makeTrail(dest) - pulling.Move(dest, get_dir(pulling, dest), movetime) // the pullee tries to reach our previous position - if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up - stop_pulling() - /mob/living/proc/makeTrail(turf/turf_to_trail_on) if(!has_gravity(src)) return @@ -1173,10 +1154,10 @@ return return ..() -/mob/living/Moved(OldLoc, Dir, Forced = FALSE) +/mob/living/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() for(var/obj/O in src) - O.on_mob_move(Dir, src) + O.on_mob_move(movement_dir, src) /// Can a mob interact with the apc remotely like a pulse demon, cyborg, or AI? /mob/living/proc/can_remote_apc_interface(obj/machinery/power/apc/ourapc) diff --git a/code/modules/mob/living/living_status_procs.dm b/code/modules/mob/living/living_status_procs.dm index 97433d8b3fda..7aecf4226aa5 100644 --- a/code/modules/mob/living/living_status_procs.dm +++ b/code/modules/mob/living/living_status_procs.dm @@ -837,10 +837,6 @@ STATUS EFFECTS /mob/living/proc/CureNervous() CureIfHasDisability(GLOB.nervousblock) -// Tourettes -/mob/living/proc/CureTourettes() - CureIfHasDisability(GLOB.twitchblock) - /mob/living/proc/CureIfHasDisability(block) if(dna && dna.GetSEState(block)) dna.SetSEState(block, 0, 1) //Fix the gene diff --git a/code/modules/mob/living/silicon/robot/robot_mob.dm b/code/modules/mob/living/silicon/robot/robot_mob.dm index ce495d28311d..ea2bb36345b9 100644 --- a/code/modules/mob/living/silicon/robot/robot_mob.dm +++ b/code/modules/mob/living/silicon/robot/robot_mob.dm @@ -1174,8 +1174,8 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( to_chat(user, "You must close the panel first") return else - sleep(6) SetEmagged(TRUE) + sleep(6) SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown if(hud_used) hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open. diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 4f5a17da5088..96486d798949 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0) +/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(ionpulse()) return TRUE if(..()) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index f110db49ec45..18541c78ab87 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -7,6 +7,8 @@ layer = MOB_LAYER - 0.1 mob_biotypes = MOB_ROBOTIC light_range = 3 + light_power = 0.5 + light_color = "#f3ffbb" stop_automated_movement = TRUE wander = FALSE healable = FALSE @@ -163,13 +165,13 @@ lost_target = FALSE last_target_location = get_turf(target) var/dist = get_dist(src, target) - walk_to(src, target, 1, 4) + GLOB.move_manager.move_to(src, target, 1, 4) if(get_dist(src, target) >= dist) frustration++ return if(!lost_target) - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) lost_target = TRUE frustration = 0 diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 7c3d29e71bb9..e3a63cf9dd92 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -97,7 +97,7 @@ oldtarget_name = null anchored = FALSE currently_cuffing = FALSE - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) last_found = world.time set_weapon() @@ -216,7 +216,7 @@ if(lasertag_check) icon_state = "[lasercolor]ed2090" disabled = TRUE - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) target = null addtimer(CALLBACK(src, PROC_REF(unset_disabled)), 10 SECONDS) return TRUE @@ -260,7 +260,7 @@ switch(mode) if(BOT_IDLE) // idle - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) if(!lasercolor) //lasertag bots don't want to arrest anyone if(find_new_target()) @@ -271,7 +271,7 @@ if(BOT_HUNT) // hunting for perp // if can't reach perp for long enough, go idle if(frustration >= 8) - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) set_path(null) back_to_idle() return @@ -395,7 +395,7 @@ return 0 /mob/living/simple_animal/bot/ed209/explode() - walk_to(src,0) + GLOB.move_manager.stop_looping(src) visible_message("[src] blows apart!") var/turf/Tsec = get_turf(src) diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm index 7f2ce26fd65d..380840b7e1ce 100644 --- a/code/modules/mob/living/simple_animal/bot/griefsky.dm +++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm @@ -110,7 +110,7 @@ switch(mode) if(BOT_IDLE) // idle icon_state = "griefsky1" - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) if(find_new_target()) return // see if any criminals are in range @@ -120,7 +120,7 @@ icon_state = spin_icon playsound(loc,'sound/effects/spinsabre.ogg',50, TRUE,-1) if(frustration >= frustration_number) // general beepsky doesn't give up so easily, jedi scum - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) back_to_idle() return @@ -182,7 +182,7 @@ return FALSE /mob/living/simple_animal/bot/secbot/griefsky/explode() - walk_to(src,0) + GLOB.move_manager.stop_looping(src) visible_message("[src] lets out a huge cough as it blows apart!") var/turf/Tsec = get_turf(src) new /obj/item/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 9c243922bed3..c3476bc8ff6b 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -61,7 +61,7 @@ target = null oldtarget_name = null anchored = FALSE - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) last_found = world.time spam_flag = FALSE @@ -266,7 +266,7 @@ return switch(mode) if(BOT_IDLE) // idle - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) if(find_new_target()) return if(!mode && auto_patrol) @@ -274,7 +274,7 @@ if(BOT_HUNT) // if can't reach perp for long enough, go idle if(frustration >= 5) //gives up easier than beepsky - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) playsound(loc, 'sound/misc/sadtrombone.ogg', 25, TRUE, -1) back_to_idle() return @@ -358,7 +358,7 @@ return FALSE /mob/living/simple_animal/bot/honkbot/explode() //doesn't drop cardboard nor its assembly, since its a very frail material. - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) visible_message("[src] blows apart!") var/turf/Tsec = get_turf(src) new /obj/item/bikehorn(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index c8909ba151ef..87b2aed467e7 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -120,7 +120,7 @@ target = null oldtarget_name = null anchored = FALSE - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) last_found = world.time @@ -315,7 +315,7 @@ switch(mode) if(BOT_IDLE) // idle - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) set_path(null) if(find_new_target()) // see if any criminals are in range return @@ -326,7 +326,7 @@ // if can't reach perp for long enough, go idle if(frustration >= 8) playsound(loc, 'sound/machines/buzz-two.ogg', 25, FALSE) - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) set_path(null) back_to_idle() return @@ -441,7 +441,7 @@ /mob/living/simple_animal/bot/secbot/explode() - walk_to(src,0) + GLOB.move_manager.stop_looping(src) visible_message("[src] blows apart!") var/turf/Tsec = get_turf(src) var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm b/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm index 291690dda330..ca2bdaa20458 100644 --- a/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm +++ b/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm @@ -89,7 +89,7 @@ saved_turf = current_turf switch(mode) if(BOT_IDLE) - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) if(find_new_target()) return @@ -98,7 +98,7 @@ if(BOT_HUNT) if(frustration >= 8) - walk_to(src,0) + GLOB.move_manager.stop_looping(src) set_path(null) back_to_idle() return @@ -165,7 +165,7 @@ if(!QDELETED(src)) if(depotarea) depotarea.list_remove(src, depotarea.guard_list) - walk_to(src,0) + GLOB.move_manager.stop_looping(src) visible_message("[src] blows apart!") do_sparks(3, 1, src) new /obj/effect/decal/cleanable/blood/oil(loc) @@ -195,7 +195,7 @@ /mob/living/simple_animal/bot/ed209/syndicate/speak() return -/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /mob/living/simple_animal/bot/ed209/syndicate/start_patrol() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index dbe50369e6f4..32838493cf25 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -318,7 +318,7 @@ Bring those who still cling to this world of illusion back to the master so they may know Truth." -/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 430ce7d223d3..83696196b72e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -157,7 +157,7 @@ turns_since_scan++ if(turns_since_scan > 5) - walk(src, 0) + GLOB.move_manager.stop_looping(src) turns_since_scan = 0 if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc))) movement_target = null @@ -172,7 +172,7 @@ break if(movement_target) stop_automated_movement = TRUE - walk(src, movement_target, 0, 3) + GLOB.move_manager.move_to(src, movement_target, 0, 3) /mob/living/simple_animal/pet/cat/proc_cat name = "Proc" @@ -235,7 +235,7 @@ butcher_results = list( /obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, - /obj/item/food/birthdaycakeslice = 3, + /obj/item/food/sliced/birthday_cake = 3, /obj/item/food/meat/slab = 2 ) response_harm = "takes a bite out of" diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 6726f1193684..3abfbf56dc3f 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -534,7 +534,7 @@ minbodytemp = TCMB maxbodytemp = T0C + 40 -/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 //Void puppies can navigate space. //LISA! SQUEEEEEEEEE~ diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ec8c6b06ee1d..7f6c971dfdf4 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -46,19 +46,22 @@ #ifdef GAME_TESTS // DO NOT EAT MY CABLES DURING UNIT TESTS return #endif - if(prob(chew_probability) && isturf(loc)) - var/turf/simulated/floor/F = get_turf(src) - if(istype(F) && !F.intact) - var/obj/structure/cable/C = locate() in F - if(C && prob(15)) - if(C.get_available_power() && !HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) - visible_message("[src] chews through [C]. It's toast!") - playsound(src, 'sound/effects/sparks2.ogg', 100, 1) - toast() // mmmm toasty. - else - visible_message("[src] chews through [C].") - investigate_log("was chewed through by a mouse in [get_area(F)]([F.x], [F.y], [F.z] - [ADMIN_JMP(F)])","wires") - C.deconstruct() + if(!prob(chew_probability) || !isfloorturf(loc)) + return + var/turf/simulated/floor/F = get_turf(src) + if(F.intact || F.transparent_floor) + return + var/obj/structure/cable/C = locate() in F + if(!C || !prob(15)) + return + if(C.get_available_power() && !HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) + visible_message("[src] chews through [C]. It's toast!") + playsound(src, 'sound/effects/sparks2.ogg', 100, 1) + toast() // mmmm toasty. + else + visible_message("[src] chews through [C].") + investigate_log("was chewed through by a mouse in [get_area(F)]([F.x], [F.y], [F.z] - [ADMIN_JMP(F)])","wires") + C.deconstruct() /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -100,7 +103,7 @@ ..() /mob/living/simple_animal/mouse/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)//Prevents mouse from pulling things - if(istype(AM, /obj/item/food/cheesewedge)) + if(istype(AM, /obj/item/food/sliced/cheesewedge)) return ..() // Get dem if(show_message) to_chat(src, "You are too small to pull anything except cheese.") diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index b51af42343dd..ce9e955292ca 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -41,7 +41,7 @@ if(istype(L)) faction += "\ref[L]" -/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(check_drift = 0) +/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return ..() //No drifting in space for space carp! //original comments do not steal /mob/living/simple_animal/hostile/scarybat/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index f87d7b54b5c2..82ddad0a60f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -36,7 +36,7 @@ gold_core_spawnable = HOSTILE_SPAWN footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE //No drifting in space for space bears! /mob/living/simple_animal/hostile/bear/black diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index db719c53f01b..a9f90f65648a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -56,7 +56,7 @@ var/static/beehometypecache = typecacheof(/obj/structure/beebox) var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics) -/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/poison/bees/Initialize(mapload) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index a4ddaf327b03..849db0310eaa 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -92,7 +92,7 @@ base_dead_overlay.appearance_flags = RESET_COLOR add_overlay(base_dead_overlay) -/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE //No drifting in space for space carp! //original comments do not steal /mob/living/simple_animal/hostile/carp/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/deathsquid.dm b/code/modules/mob/living/simple_animal/hostile/deathsquid.dm index f791a681b720..8366cd050716 100644 --- a/code/modules/mob/living/simple_animal/hostile/deathsquid.dm +++ b/code/modules/mob/living/simple_animal/hostile/deathsquid.dm @@ -34,7 +34,7 @@ -/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 //copypasta from carp code /mob/living/simple_animal/hostile/deathsquid/ex_act(severity) diff --git a/code/modules/mob/living/simple_animal/hostile/drakehound.dm b/code/modules/mob/living/simple_animal/hostile/drakehound.dm index 61c8a2778c59..8d948385462e 100644 --- a/code/modules/mob/living/simple_animal/hostile/drakehound.dm +++ b/code/modules/mob/living/simple_animal/hostile/drakehound.dm @@ -45,7 +45,7 @@ /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic) -/mob/living/simple_animal/hostile/drakehound_breacher/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/drakehound_breacher/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/drakehound_breacher/ListTargetsLazy() diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index d34557ef7199..22f4b014e19e 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -30,5 +30,5 @@ gold_core_spawnable = HOSTILE_SPAWN footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index d87fbc58aa05..ea7efce6bb6e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -101,7 +101,7 @@ /mob/living/simple_animal/hostile/hellhound/greater name = "greater hellhound" - desc = "A demonic-looking black canine monster with glowing red eyes and sharp teeth. Greater hounds are far stronger than their lesser kin, and typically employed by powerful bluespace entities." + desc = "A demonic-looking black canine monster with glowing red eyes and sharp teeth. Greater hounds are far stronger than their lesser kin, and should be engaged with extreme caution." icon_state = "hellhoundgreater" icon_living = "hellhoundgreater" icon_resting = "hellhoundgreater_sit" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 04cce099cb2f..d7bfbbb0c03f 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -467,6 +467,8 @@ /mob/living/simple_animal/hostile/proc/EscapeConfinement() if(buckled) buckled.attack_animal(src) + if(!targets_from) + return if(!isturf(targets_from.loc) && targets_from.loc != null)//Did someone put us in something? var/atom/A = targets_from.loc A.attack_animal(src)//Bang on it till we get out diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index ef5abf4224e9..d002d09a0933 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -422,7 +422,7 @@ Difficulty: Medium if(!swooping) ..() -/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /obj/effect/temp_visual/lava_warning diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 26037a60fb36..1e08fbd06551 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -738,42 +738,64 @@ Difficulty: Hard bursting = FALSE //we no longer damage crossers /obj/effect/temp_visual/hierophant/blast/proc/on_atom_entered(datum/source, atom/movable/entered) - if(bursting) - do_damage(get_turf(src)) + if(!bursting) + return + + if(ismecha(entered)) + damage_mech(entered) + else if(isliving(entered)) + damage_living(entered) + +/obj/effect/temp_visual/hierophant/blast/proc/damage_living(mob/living/target) + if(!istype(target)) + return + if(target in hit_things) + return + + hit_things |= target + if((friendly_fire_check && caster && target.faction_check_mob(caster)) || target.stat == DEAD) + return + + target.flash_screen_color("#660099", 1) + playsound(target,'sound/weapons/sear.ogg', 50, TRUE, -4) + to_chat(target, "You're struck by \a [name]!") + var/limb_to_hit = target.get_organ(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) + var/armor = target.run_armor_check(limb_to_hit, MELEE, "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!") + target.apply_damage(damage, BURN, limb_to_hit, armor) + if(ishostile(target)) + var/mob/living/simple_animal/hostile/H = target //mobs find and damage you... + if(H.stat == CONSCIOUS && !H.target && H.AIStatus != AI_OFF && !H.client) + if(!QDELETED(caster)) + if(get_dist(H, caster) <= H.aggro_vision_range) + H.FindTarget(list(caster), 1) + else + H.Goto(get_turf(caster), H.move_to_delay, 3) + if(monster_damage_boost && (ismegafauna(target) || istype(target, /mob/living/simple_animal/hostile/asteroid))) + target.adjustBruteLoss(damage) + if(caster) + add_attack_logs(caster, target, "Struck with a [name]") + +/obj/effect/temp_visual/hierophant/blast/proc/damage_mech(obj/mecha/target) + if(!istype(target)) + return + if(target in hit_things) + return + + hit_things |= target + if(target.occupant) + if(friendly_fire_check && caster && caster.faction_check_mob(target.occupant)) + return + to_chat(target.occupant, "Your [target.name] is struck by \a [name]!") + playsound(target, 'sound/weapons/sear.ogg', 50, TRUE, -4) + target.take_damage(damage, BURN, 0, 0) /obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T) if(!damage) return for(var/mob/living/L in T.contents - hit_things) //find and damage mobs... - hit_things += L - if((friendly_fire_check && caster && L.faction_check_mob(caster)) || L.stat == DEAD) - continue - L.flash_screen_color("#660099", 1) - playsound(L,'sound/weapons/sear.ogg', 50, TRUE, -4) - to_chat(L, "You're struck by a [name]!") - var/limb_to_hit = L.get_organ(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - var/armor = L.run_armor_check(limb_to_hit, MELEE, "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!") - L.apply_damage(damage, BURN, limb_to_hit, armor) - if(ishostile(L)) - var/mob/living/simple_animal/hostile/H = L //mobs find and damage you... - if(H.stat == CONSCIOUS && !H.target && H.AIStatus != AI_OFF && !H.client) - if(!QDELETED(caster)) - if(get_dist(H, caster) <= H.aggro_vision_range) - H.FindTarget(list(caster), 1) - else - H.Goto(get_turf(caster), H.move_to_delay, 3) - if(monster_damage_boost && (ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))) - L.adjustBruteLoss(damage) - if(caster) - add_attack_logs(caster, L, "Struck with a [name]") + damage_living(L) for(var/obj/mecha/M in T.contents - hit_things) //also damage mechs. - hit_things += M - if(M.occupant) - if(friendly_fire_check && caster && caster.faction_check_mob(M.occupant)) - continue - to_chat(M.occupant, "Your [M.name] is struck by a [name]!") - playsound(M,'sound/weapons/sear.ogg', 50, TRUE, -4) - M.take_damage(damage, BURN, 0, 0) + damage_mech(M) /obj/effect/hierophant name = "hierophant beacon" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 94e47e3e4392..809dc5eddc7e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -188,7 +188,7 @@ Difficulty: Medium var/armor = M.run_armor_check(limb_to_hit, LASER) M.apply_damage(70 - ((health / maxHealth) * 20), BURN, limb_to_hit, armor) -/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /mob/living/simple_animal/hostile/megafauna/legion/adjustHealth(amount, updating_health = TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 3e61c8e6a03e..8ac5a8f6b401 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -49,7 +49,7 @@ /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic) -/mob/living/simple_animal/hostile/pirate/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/pirate/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/pirate/ListTargetsLazy() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/combat_drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/combat_drone.dm index bc0df94d6242..aeb57abcae34 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/combat_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/combat_drone.dm @@ -43,7 +43,7 @@ if(!has_gravity(T)) new /obj/effect/particle_effect/ion_trails(T, _dir) -/mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(check_drift = 0) +/mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /mob/living/simple_animal/hostile/malf_drone/ListTargets() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index c9696fd08792..edda4355d666 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -85,7 +85,7 @@ icon_living = "koi[koinum]" icon_dead = "koi[koinum]-dead" -/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(movement_dir) +/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/retaliate/carp/koi/honk diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm index da8df5e98d74..f67d27cdd211 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm @@ -37,7 +37,7 @@ initial_traits = list(TRAIT_FLYING) -/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(check_drift = 0) +/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 /mob/living/simple_animal/hostile/retaliate/ghost/Life(seconds, times_fired) @@ -92,7 +92,7 @@ deathmessage = null gold_core_spawnable = NO_SPAWN -/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir) +/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/skeleton/angered_warden @@ -113,7 +113,7 @@ loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/head/warden, /obj/item/card/sec_shuttle_ruin) gold_core_spawnable = NO_SPAWN -/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir) +/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/retaliate/zombie diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm b/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm index bef98567bab7..21233ac89e42 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm @@ -283,7 +283,7 @@ alert_on_shield_breach = TRUE loot = list(/obj/effect/mob_spawn/human/corpse/syndicatequartermaster, /obj/effect/decal/cleanable/blood/innards, /obj/effect/decal/cleanable/blood, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic) -/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE // he should be able to chase us in space /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize(mapload) @@ -334,7 +334,7 @@ alert_on_timeout = FALSE // So random fauna doesn't make depot explode. loot = list() // Explodes, doesn't drop loot. -/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/death() @@ -357,7 +357,7 @@ /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic) -/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/syndicate/ranged @@ -384,7 +384,7 @@ /obj/effect/gibspawner/generic) -/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/hostile/syndicate/ranged/space/autogib diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm index 9f0bf777ef63..0eb0e4b3ad81 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm @@ -257,7 +257,7 @@ busy = SPINNING_COCOON visible_message("[src] begins to secrete a sticky substance around [cocoon_target].") stop_automated_movement = TRUE - walk(src,0) + GLOB.move_manager.stop_looping(src) if(do_after(src, 40, target = cocoon_target.loc)) if(busy == SPINNING_COCOON) if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm index a5474f7f6e1a..c242175fc0d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm @@ -150,7 +150,7 @@ new_area.Entered(src) else frustration++ - walk_to(src, entry_vent, 1) + GLOB.move_manager.move_to(src, entry_vent, 1) if(frustration > 2) entry_vent = null else if(prob(33)) @@ -165,7 +165,7 @@ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) if(!v.welded) entry_vent = v - walk_to(src, entry_vent, 1) + GLOB.move_manager.move_to(src, entry_vent, 1) break diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm index 5b55bdf28eb4..fcb808b41685 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm @@ -48,7 +48,7 @@ new /obj/item/organ/internal/body_egg/terror_eggs(L) if(!ckey) LoseTarget() - walk_away(src,L,2,1) + GLOB.move_manager.move_away(src,L,2,1) /proc/IsTSInfected(mob/living/carbon/C) // Terror AI requires this if(C.get_int_organ(/obj/item/organ/internal/body_egg)) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 260c85782487..89e82885dd5d 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -40,7 +40,7 @@ else ..() -/mob/living/simple_animal/shade/Process_Spacemove() +/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /mob/living/simple_animal/shade/holy diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 77f3a594b590..076f4c8ea7aa 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -167,7 +167,7 @@ /mob/living/simple_animal/Destroy() /// We need to clear the reference to where we're walking to properly GC - walk_to(src, 0) + GLOB.move_manager.stop_looping(src) QDEL_NULL(pcollar) for(var/datum/action/innate/hide/hide in actions) hide.Remove(src) @@ -627,7 +627,7 @@ /mob/living/simple_animal/Login() ..() - walk(src, 0) // if mob is moving under ai control, then stop AI movement + GLOB.move_manager.stop_looping(src) // if mob is moving under ai control, then stop AI movement /mob/living/simple_animal/proc/npc_safe(mob/user) return FALSE diff --git a/code/modules/mob/living/simple_animal/slime/slime_mob.dm b/code/modules/mob/living/simple_animal/slime/slime_mob.dm index 9ca33b23d694..5ac5ae2d1833 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_mob.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_mob.dm @@ -223,9 +223,13 @@ Atkcool = TRUE addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) -/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 2 +/mob/living/simple_animal/slime/resist_buckle() + ..() + Feedstop() + /mob/living/simple_animal/slime/get_status_tab_items() var/list/status_tab_data = ..() . = status_tab_data diff --git a/code/modules/mob/living/simple_animal/slime/slime_powers.dm b/code/modules/mob/living/simple_animal/slime/slime_powers.dm index cb536acb6bba..d61574cc4ee0 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_powers.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_powers.dm @@ -29,6 +29,10 @@ if(C!=src && Adjacent(C)) choices += C + if(!length(choices)) + to_chat(src, "No subjects nearby to feed on!") + return + var/mob/living/M = tgui_input_list(src, "Who do you wish to feed on?", "Feeding Selection", choices) if(!M) return FALSE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f6ada6c59944..8901c0271830 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -114,8 +114,10 @@ usr.show_message(t, EMOTE_VISIBLE) /mob/proc/show_message(msg, type, alt, alt_type, chat_message_type) // Message, type of message (1 or 2), alternative message, alt message type (1 or 2) +#ifndef GAME_TESTS if(!client) return +#endif if(type) if(type & EMOTE_VISIBLE && !has_vision(information_only = TRUE)) // Vision related @@ -649,9 +651,11 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ if(LAZYACCESS(client.recent_examines, ref_to_atom)) result = A.examine_more(src) if(!length(result)) - result += "You examine [A] closer, but find nothing of interest..." + result = A.examine(src) else result = A.examine(src) + if(length(A.examine_more())) + result += "You can examine [A.p_them()] again to take a closer look..." client.recent_examines[ref_to_atom] = world.time + EXAMINE_MORE_WINDOW // set to when we should not examine something to_chat(src, chat_box_examine(result.Join("\n")), MESSAGE_TYPE_INFO, confidential = TRUE) @@ -791,10 +795,10 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ /mob/proc/print_flavor_text(shrink = TRUE) if(flavor_text && flavor_text != "") var/msg = dna?.flavor_text ? replacetext(dna.flavor_text, "\n", " ") : replacetext(flavor_text, "\n", " ") - if(length(msg) <= 40 || !shrink) + if(length(msg) <= MAX_FLAVORTEXT_PRINT || !shrink) return "[msg]" // There is already encoded by tgui_input else - return "[copytext_preserve_html(msg, 1, 37)]... More..." + return "[copytext_preserve_html(msg, 1, MAX_FLAVORTEXT_PRINT - 3)]... More..." /mob/proc/is_dead() return stat == DEAD diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 99cf29d37794..b831fce5fc6f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -47,6 +47,7 @@ affecting.grabbed_by += src RegisterSignal(affecting, COMSIG_MOVABLE_MOVED, PROC_REF(grab_moved)) RegisterSignal(assailant, COMSIG_MOVABLE_MOVED, PROC_REF(pull_grabbed)) + RegisterSignal(assailant, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, PROC_REF(on_updated_glide_size)) hud = new /atom/movable/screen/grab(src) hud.icon_state = "reinforce" @@ -74,13 +75,22 @@ affecting.grabbed_by -= src affecting = null if(assailant) - UnregisterSignal(assailant, COMSIG_MOVABLE_MOVED) + UnregisterSignal(assailant, list( + COMSIG_MOVABLE_MOVED, + COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, + )) if(assailant.client) assailant.client.screen -= hud assailant = null + QDEL_NULL(hud) return ..() +/obj/item/grab/proc/on_updated_glide_size(mob/living/grabber, old_size) + SIGNAL_HANDLER // COMSIG_MOVABLE_UPDATED_GLIDE_SIZE + if(affecting && grabber == assailant && affecting != assailant) + affecting.set_glide_size(grabber.glide_size) + /obj/item/grab/proc/pull_grabbed(mob/user, turf/old_turf, direct, forced) SIGNAL_HANDLER if(assailant.moving_diagonally == FIRST_DIAG_STEP) //we dont want to do anything in the middle of diagonal step @@ -88,11 +98,8 @@ if(!assailant.Adjacent(old_turf)) qdel(src) return - var/list/grab_states_not_moving = list(GRAB_KILL, GRAB_NECK) //states of grab when we dont need affecting to be moved by himself - var/assailant_glide_speed = TICKS2DS(world.icon_size / assailant.glide_size) - if(state in grab_states_not_moving) - affecting.glide_for(assailant_glide_speed) - else if(get_turf(affecting) != old_turf) + + if(get_turf(affecting) != old_turf) var/possible_dest = list() var/list/mobs_do_not_move = list() // those are mobs we shouldnt move while we're going to new position var/list/dest_1_sort = list() // just better dest to be picked first @@ -131,7 +138,7 @@ if(get_turf(affecting) == dest) success_move = TRUE continue - if(affecting.Move(dest, get_dir(affecting, dest), assailant_glide_speed)) + if(affecting.Move(dest, get_dir(affecting, dest), glide_size)) success_move = TRUE break continue diff --git a/code/modules/mob/mob_login_base.dm b/code/modules/mob/mob_login_base.dm index 326108cf97bb..7c2a6354fa9b 100644 --- a/code/modules/mob/mob_login_base.dm +++ b/code/modules/mob/mob_login_base.dm @@ -1,6 +1,7 @@ -//handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying +//handles setting last_known_ckey, lastKnownIP, and computer_id for use by the ban systems as well as checking for multikeying /mob/proc/update_Login_details() //Multikey checks and logging + last_known_ckey = ckey lastKnownIP = client.address computer_id = client.computer_id log_access_in(client) @@ -31,7 +32,6 @@ /mob/Login() GLOB.player_list |= src - last_known_ckey = ckey update_Login_details() world.update_status() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 80254530dca2..6742548c2474 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -21,7 +21,7 @@ return (!mover.density || !density || horizontal) /mob/proc/projectile_hit_check(obj/item/projectile/P) - return !(P.always_hit_living_nondense && (stat != DEAD)) && !density + return !(P.always_hit_living_nondense && (stat != DEAD) && !isLivingSSD(src)) && !density /client/verb/toggle_throw_mode() set hidden = 1 @@ -47,7 +47,7 @@ #define CONFUSION_MAX 80 SECONDS -/client/Move(n, direct) +/client/Move(new_loc, direct) if(world.time < move_delay) return @@ -59,7 +59,7 @@ if(!mob || !mob.loc) return 0 - if(!n || !direct) // why did we never check this before? + if(!new_loc || !direct) // why did we never check this before? return FALSE if(mob.notransform) @@ -72,7 +72,7 @@ return Move_object(direct) if(!isliving(mob)) - return mob.Move(n, direct) + return mob.Move(new_loc, direct) if(mob.stat == DEAD) mob.ghostize() @@ -91,7 +91,7 @@ if(mob.remote_control) //we're controlling something, our movement is relayed to it return mob.remote_control.relaymove(mob, direct) - if(is_ai(mob)) + if(is_ai(mob)) var/mob/living/silicon/ai/ai = mob var/mob/camera/eye/ai/eye = ai.eyeobj if(istype(eye) && !istype(ai.remote_control)) @@ -122,6 +122,9 @@ if(!mob.Process_Spacemove(direct)) return 0 + if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_MOVE, args) & COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE) + return FALSE + if(mob.restrained()) // Why being pulled while cuffed prevents you from moving for(var/mob/M in orange(1, mob)) if(M.pulling == mob) @@ -132,20 +135,36 @@ else M.stop_pulling() + // We are now going to move + var/add_delay = mob.movement_delay() - var/delay = mob.movement_delay() + if(locate(/obj/item/grab, mob)) + if(!isalienhunter(mob)) // i hate grab code + add_delay += 7 + + var/diagonal_factor = 1 + if(IS_DIR_DIAGONAL(direct)) + // For some reason, LONG_GLIDE mobs need to slow down here, but other mobs need to speed up. + // I'd expect one or the other to change, not both. + // If you can figure out why, please update this comment. + if(mob.appearance_flags & LONG_GLIDE) + diagonal_factor = sqrt(2) + else + diagonal_factor = 1 / sqrt(2) + mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * diagonal_factor)) // set it now in case of pulled objects + + //If the move was recent, count using old_move_delay + //We want fractional behavior and all if(old_move_delay + world.tick_lag > world.time) + //Yes this makes smooth movement stutter if add_delay is too fractional + //Yes this is better then the alternative move_delay = old_move_delay else move_delay = world.time - mob.last_movement = world.time - - delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds - - if(locate(/obj/item/grab, mob)) - if(!isalienhunter(mob)) // i hate grab code - delay += 7 + //Basically an optional override for our glide size + //Sometimes you want to look like you're moving with a delay you don't actually have yet + visual_delay = 0 if(istype(living_mob)) var/newdir = NONE @@ -158,7 +177,7 @@ newdir = angle2dir(dir2angle(direct) + pick(45, -45)) if(newdir) direct = newdir - n = get_step(mob, direct) + new_loc = get_step(mob, direct) mob.last_movement_dir = direct @@ -166,18 +185,32 @@ if(mob.pulling) prev_pulling_loc = mob.pulling.loc - if(!(direct & (direct - 1))) // cardinal direction - . = mob.SelfMove(n, direct, delay) - else // diagonal movements take longer - var/diag_delay = delay * SQRT_2 - . = mob.SelfMove(n, direct, diag_delay) - if(mob.loc == n) - // only incur the extra delay if the move was *actually* diagonal - // There would be a bit of visual jank if we try to walk diagonally next to a wall - // and the move ends up being cardinal, rather than diagonal, - // but that's better than it being jank on every *successful* diagonal move. - delay = diag_delay - move_delay += delay + . = ..() + + var/new_glide_size = 0 + // Only adjust for diagonal movement if the move was *actually* diagonal + if(mob.loc == new_loc) + // Similar to the glide size calculation above, LONG_GLIDE mobs need to slow down and other mobs speed up. + // Unline before, we also want to calculate the new movement delay, which is increased for LONG_GLIDE mobs, and unchanged for other mobs. + mob.last_movement = world.time + if(IS_DIR_DIAGONAL(direct) && (mob.appearance_flags & LONG_GLIDE)) + add_delay *= sqrt(2) + + if(visual_delay) + new_glide_size = visual_delay + else + new_glide_size = DELAY_TO_GLIDE_SIZE(add_delay) + + if(IS_DIR_DIAGONAL(direct) && !(mob.appearance_flags & LONG_GLIDE)) + new_glide_size *= sqrt(2) + + mob.set_glide_size(new_glide_size) + else if(visual_delay) + mob.set_glide_size(visual_delay) + else + mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay)) + + move_delay += add_delay if(mob.pulledby) mob.pulledby.stop_pulling() @@ -193,9 +226,6 @@ #undef CONFUSION_MAX -/mob/proc/SelfMove(turf/n, direct, movetime) - return Move(n, direct, movetime) - ///Process_Grab() ///Called by client/Move() ///Checks to see if you are being grabbed and if so attemps to break it @@ -303,46 +333,76 @@ return TRUE -///Process_Spacemove -///Called by /client/Move() -///For moving in space -///Return 1 for movement 0 for none -/mob/Process_Spacemove(movement_dir = 0) +/** + * Handles mob/living movement in space (or no gravity) + * + * Called by /client/Move() + * + * return TRUE for movement or FALSE for none + */ +/mob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(..()) - return 1 - var/atom/movable/backup = get_spacemove_backup(movement_dir) - if(backup) - if(istype(backup) && movement_dir && !backup.anchored) - var/opposite_dir = turn(movement_dir, 180) - if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves - to_chat(src, "You push off of [backup] to propel yourself.") - return 1 - return 0 + return TRUE + + // TODO: if(buckled) may belong here + + var/atom/movable/backup = get_spacemove_backup(movement_dir, continuous_move) + if(!backup) + return FALSE -/mob/get_spacemove_backup(movement_dir) - for(var/A in orange(1, get_turf(src))) - if(isarea(A)) + if(continuous_move || !istype(backup) || !movement_dir || backup.anchored) + return TRUE + + var/opposite_dir = turn(movement_dir, 180) + if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves + to_chat(src, "You push off of [backup] to propel yourself.") + return TRUE + +/** + * Finds a target near a mob that is viable for pushing off when moving. + * Takes the intended movement direction as input, alongside if the context is checking if we're allowed to continue drifting + */ +/mob/get_spacemove_backup(moving_direction, continuous_move) + for(var/atom/pushover as anything in range(1, get_turf(src))) + if(pushover == src) + continue + if(isarea(pushover)) continue - else if(isturf(A)) - var/turf/turf = A + if(isturf(pushover)) + var/turf/turf = pushover if(isspaceturf(turf)) continue if(!turf.density && !mob_negates_gravity()) continue - return A - else - var/atom/movable/AM = A - if(AM == buckled) //Kind of unnecessary but let's just be sure + return pushover + + var/atom/movable/rebound = pushover + if(rebound == buckled) + continue + if(ismob(rebound)) + var/mob/lover = rebound + if(lover.buckled) continue - if(!AM.CanPass(src) || AM.density) - if(AM.anchored) - return AM - if(pulling == AM) - continue - if(get_turf(AM) == get_step(get_turf(src), movement_dir)) // No pushing off objects in front of you, while simultaneously pushing them fowards to go faster in space. - continue - . = AM + var/pass_allowed = rebound.CanPass(src, get_dir(rebound, src)) + if(!rebound.density && pass_allowed) + continue + //Sometime this tick, this pushed off something. Doesn't count as a valid pushoff target + if(rebound.last_pushoff == world.time) + continue + if(continuous_move && !pass_allowed) + var/datum/move_loop/move/rebound_engine = GLOB.move_manager.processing_on(rebound, SSspacedrift) + // If you're moving toward it and you're both going the same direction, stop + if(moving_direction == get_dir(src, pushover) && rebound_engine && moving_direction == rebound_engine.direction) + continue + else if(!pass_allowed) + if(moving_direction == get_dir(src, pushover)) // Can't push "off" of something that you're walking into + continue + if(rebound.anchored) + return rebound + if(pulling == rebound) + continue + return rebound /mob/proc/mob_has_gravity(turf/T) return has_gravity(src, T) @@ -350,35 +410,51 @@ /mob/proc/mob_negates_gravity() return 0 -/mob/proc/Move_Pulled(atom/A) - if(HAS_TRAIT(src, TRAIT_CANNOT_PULL) || restrained() || !pulling) - return - if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src)) +/atom/movable/proc/Move_Pulled(atom/moving_atom) + if(!pulling) + return FALSE + if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src, src, pulling)) stop_pulling() - return + return FALSE if(isliving(pulling)) - var/mob/living/L = pulling - if(L.buckled && L.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it + var/mob/living/pulling_mob = pulling + if(pulling_mob.buckled && pulling_mob.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it stop_pulling() - return - if(A == loc && pulling.density) + return FALSE + if(moving_atom == loc && pulling.density) + return FALSE + var/move_dir = get_dir(pulling.loc, moving_atom) + if(!Process_Spacemove(move_dir)) + return FALSE + if(!move_dir) + return FALSE + pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size) + return TRUE + +/mob/living/Move_Pulled(atom/moving_atom) + . = ..() + if(!. || !isliving(moving_atom)) return - if(!Process_Spacemove(get_dir(pulling.loc, A))) + if(!Process_Spacemove(get_dir(pulling.loc, moving_atom))) return if(src in pulling.contents) return - var/target_turf = get_step(pulling, get_dir(pulling.loc, A)) + var/target_turf = get_step(pulling, get_dir(pulling.loc, moving_atom)) if(get_dist(target_turf, loc) > 1) // Make sure the turf we are trying to pull to is adjacent to the user. return // We do not use Adjacent() here because it checks if there are dense objects in the way, making it impossible to move an object to the side if we're blocked on both sides. + var/move_dir = get_dir(pulling.loc, moving_atom) if(ismob(pulling)) var/mob/M = pulling var/atom/movable/t = M.pulling M.stop_pulling() - . = step(pulling, get_dir(pulling.loc, A)) // we set the return value to step here, if we don't having someone buckled in to a chair and being pulled won't let them be unbuckeled + + // we set the return value to step here, if we don't having someone + // buckled in to a chair and being pulled won't let them be unbuckeled + . = pulling.Move(get_step(pulling.loc, moving_atom), move_dir, glide_size) if(M) M.start_pulling(t) else - . = step(pulling, get_dir(pulling.loc, A)) + . = pulling.Move(get_step(pulling.loc, moving_atom), move_dir, glide_size) /mob/proc/update_gravity(has_gravity) return diff --git a/code/modules/mob/mob_vars.dm b/code/modules/mob/mob_vars.dm index 605a1043d4f4..03d9b375faa5 100644 --- a/code/modules/mob/mob_vars.dm +++ b/code/modules/mob/mob_vars.dm @@ -80,8 +80,9 @@ var/obj/item/back = null //Human var/obj/item/tank/internal = null //Human /// Active storage container - var/obj/item/storage/s_active = null //Carbon - var/obj/item/clothing/mask/wear_mask = null //Carbon + var/obj/item/storage/s_active + /// The currently worn mask + var/obj/item/wear_mask /// The instantiated version of the mob's hud. var/datum/hud/hud_used = null diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 73c6d0faa1a9..e17e6e3357ae 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -401,7 +401,7 @@ if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.ai_list) - if(A.announce_arrivals) + if(A.stat != DEAD && A.announce_arrivals) ailist += A if(length(ailist)) var/mob/living/silicon/ai/announcer = pick(ailist) diff --git a/code/modules/mob/new_player/new_player_login.dm b/code/modules/mob/new_player/new_player_login.dm index ffd7902f7c00..95225af0d008 100644 --- a/code/modules/mob/new_player/new_player_login.dm +++ b/code/modules/mob/new_player/new_player_login.dm @@ -1,5 +1,5 @@ /mob/new_player/Login() - update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying + update_Login_details() //handles setting last_known_ckey, lastKnownIP, and computer_id for use by the ban systems as well as checking for multikeying if(GLOB.join_motd) to_chat(src, "
    [GLOB.join_motd]
    ") diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index b907196b8807..efd50f678610 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -87,8 +87,6 @@ var/emp_proof = FALSE /// List of overlays the mod has. Needs to be cut onremoval / module deactivation var/list/mod_overlays = list() - /// Is the jetpack on so we should make ion effects? - var/jetpack_active = FALSE /// Cham option for when the cham module is installed. var/datum/action/item_action/chameleon_change/modsuit/chameleon_action /// Is the control unit disquised? @@ -241,13 +239,6 @@ if(slot == ITEM_SLOT_BACK) return TRUE -/obj/item/mod/control/on_mob_move(direction, mob/user) - if(!jetpack_active || !isturf(user.loc)) - return - var/turf/T = get_step(src, REVERSE_DIR(direction)) - if(!has_gravity(T)) - new /obj/effect/particle_effect/ion_trails(T, direction) - /obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() if(!wearer || old_loc != wearer || loc == wearer) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index a78287e26c02..69c37d19dfa7 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -553,7 +553,7 @@ ) /obj/item/mod/armor/mod_theme_rescue - armor = list(MELEE = 20, BULLET = 20, LASER = 5, ENERGY = 5, BOMB = 10, RAD = 50, FIRE = 150, ACID = 150) //Extra melee / bullet armor for if they get caught in a fight. Of course, no laser armor. + armor = list(MELEE = 20, BULLET = 20, LASER = 5, ENERGY = 5, BOMB = 10, RAD = 250, FIRE = 150, ACID = 150) //Extra melee / bullet armor for if they get caught in a fight. Of course, no laser armor. /datum/mod_theme/research name = "'Minerva' research" diff --git a/code/modules/mod/modules/_modules.dm b/code/modules/mod/modules/_modules.dm index 845c719aaa0d..7c2e568591ca 100644 --- a/code/modules/mod/modules/_modules.dm +++ b/code/modules/mod/modules/_modules.dm @@ -106,7 +106,7 @@ if(!mod.active || mod.activating || !mod.get_charge()) to_chat(mod.wearer, "Module is unpowered!") return FALSE - if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE) return FALSE if(module_type == MODULE_ACTIVE) if(mod.selected_module && !mod.selected_module.on_deactivation(display_message = FALSE)) @@ -157,7 +157,7 @@ else if(display_message) to_chat(mod.wearer, "[src] deactivated.") //mod.wearer.update_clothing(mod.slot_flags) - SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED) + SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED, mod.wearer) mod.update_mod_overlays() return TRUE @@ -169,7 +169,7 @@ if(!check_power(use_power_cost)) to_chat(mod.wearer, "Module costs too much power to use!") return FALSE - if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE) return FALSE COOLDOWN_START(src, cooldown_timer, cooldown_time) //addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_clothing), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 230f9d163411..2efd024af583 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -239,10 +239,9 @@ reagents.remove_any(100) var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src)) log_game("[key_name(user)] used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).") - playsound(src, 'sound/items/syringeproj.ogg', 40, 1) - for(var/counter in 1 to 5) - step_towards(A, target) - sleep(2) + playsound(src, 'sound/items/syringeproj.ogg', 40, TRUE) + A.throw_at(target, 6, 2, user) + sleep(2) A.Smoke() if(METAL_FOAM) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 3ef82f70ca50..dcc96abce8bf 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -128,40 +128,51 @@ overlay_state_inactive = "module_jetpack" overlay_state_active = "module_jetpack_on" /// Do we stop the wearer from gliding in space. - var/stabilizers = FALSE + var/stabilize = FALSE + var/thrust_callback -/obj/item/mod/module/jetpack/proc/set_stabilizers(new_stabilizers) - if(stabilizers == new_stabilizers) - return - stabilizers = new_stabilizers +/obj/item/mod/module/jetpack/Initialize(mapload) + . = ..() + thrust_callback = CALLBACK(src, PROC_REF(allow_thrust)) + configure_jetpack(stabilize) + +/obj/item/mod/module/jetpack/Destroy() + thrust_callback = null + return ..() + +/** + * configures/re-configures the jetpack component + * + * Arguments + * stabilize - Should this jetpack be stabalized + */ +/obj/item/mod/module/jetpack/proc/configure_jetpack(stabilize) + src.stabilize = stabilize + + AddComponent( \ + /datum/component/jetpack, \ + src.stabilize, \ + COMSIG_MODULE_TRIGGERED, \ + COMSIG_MODULE_DEACTIVATED, \ + MOD_ABORT_USE, \ + thrust_callback, \ + /datum/effect_system/trail_follow/ion/grav_allowed \ + ) /obj/item/mod/module/jetpack/get_configuration() . = ..() - .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers) + .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilize) /obj/item/mod/module/jetpack/configure_edit(key, value) switch(key) if("stabilizers") - set_stabilizers(value) + configure_jetpack(value) /obj/item/mod/module/jetpack/proc/allow_thrust() - if(!active) - return if(!drain_power(use_power_cost)) return FALSE return TRUE -/obj/item/mod/module/jetpack/proc/get_user() - return mod.wearer - -/obj/item/mod/module/jetpack/on_activation() - . = ..() - mod.jetpack_active = TRUE - -/obj/item/mod/module/jetpack/on_deactivation(display_message, deleting) - . = ..() - mod.jetpack_active = FALSE - /obj/item/mod/module/jetpack/advanced name = "MOD advanced ion jetpack module" desc = "An improvement on the previous model of electric thrusters. This one achieves better efficency through \ diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index cd54b9b0550b..925d48fa7e34 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -115,19 +115,22 @@ toolspeed = 2 defib_cooldown = 2.5 SECONDS -///Crew Monitor - Deploys or retracts a built-in handheld crew monitor /obj/item/mod/module/monitor name = "MOD crew monitor module" desc = "A module installed into the wrist of the suit, this presents a display of crew sensor data." icon_state = "scanner" - module_type = MODULE_ACTIVE + module_type = MODULE_USABLE complexity = 1 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - device = /obj/item/sensor_device/mod + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/monitor) cooldown_time = 0.5 SECONDS + allow_flags = MODULE_ALLOW_INACTIVE + var/datum/ui_module/crew_monitor/mod/crew_monitor -/obj/item/sensor_device/mod - name = "MOD crew monitor" - desc = "A miniature machine built into a modsuit that tracks suit sensors across the station." - flags = NODROP + +/obj/item/mod/module/monitor/Initialize(mapload) + . = ..() + crew_monitor = new(src) + +/obj/item/mod/module/monitor/on_use() + crew_monitor.ui_interact(mod.wearer) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index e6696f395494..3b098aefc586 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -7,12 +7,20 @@ down to the exact coordinates. This information is fed to a central database viewable from the device itself, \ though using it to help people is up to you." icon_state = "gps" - module_type = MODULE_ACTIVE + module_type = MODULE_USABLE complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/gps) cooldown_time = 0.5 SECONDS - device = /obj/item/gps/mod + allow_flags = MODULE_ALLOW_INACTIVE + var/obj/item/gps/mod/gps + +/obj/item/mod/module/gps/Initialize(mapload) + . = ..() + gps = new(src) + +/obj/item/mod/module/gps/on_use() + gps.attack_self__legacy__attackchain(mod.wearer) ///Hydraulic Clamp - Lets you pick up and drop crates. /obj/item/mod/module/clamp diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index c2aa0c5330e6..de9b34236f53 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -90,15 +90,17 @@ GLOBAL_LIST_EMPTY(fax_blacklist) /obj/machinery/photocopier/faxmachine/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/photocopier/faxmachine/attackby__legacy__attackchain(obj/item/item, mob/user, params) - if(istype(item,/obj/item/card/id) && !scan) - scan(item) - else if(istype(item, /obj/item/paper) || istype(item, /obj/item/photo) || istype(item, /obj/item/paper_bundle)) - ..() +/obj/machinery/photocopier/faxmachine/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id) && !scan) + scan(used) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/paper) || istype(used, /obj/item/photo) || istype(used, /obj/item/paper_bundle)) + . = ..() SStgui.update_uis(src) - else if(istype(item, /obj/item/folder)) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/folder)) to_chat(user, "The [src] can't accept folders!") - return //early return so the parent proc doesn't suck up and items that a photocopier would take + return ITEM_INTERACT_COMPLETE //early return so the parent proc doesn't suck up and items that a photocopier would take else return ..() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index e80c2475bbed..09586607ba9d 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -158,7 +158,7 @@ if(user.zone_selected == "eyes") user.visible_message("[user] holds up a paper and shows it to [H].", "You show the paper to [H].") - H.examinate(src) + to_chat(H, "Read \the [src]") else if(user.zone_selected == "mouth") if(H == user) @@ -392,6 +392,12 @@ var/id = href_list["write"] var/input_element = input("Enter what you want to write:", "Write") as message topic_href_write(id, input_element) + if(href_list["show_content"]) + var/dist = get_dist(src, usr) + if(dist < 2) + show_content(usr) + else + to_chat(usr, "I'm too far away from \the [src] to read it.") /obj/item/paper/attackby__legacy__attackchain(obj/item/P, mob/living/user, params) ..() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 0ddea1a79e25..a1196b3a6768 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -474,35 +474,41 @@ use_power(active_power_consumption) COOLDOWN_START(src, copying_cooldown, PHOTOCOPIER_DELAY) -/obj/machinery/photocopier/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo) || istype(O, /obj/item/paper_bundle)) +/obj/machinery/photocopier/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/paper) || istype(used, /obj/item/photo) || istype(used, /obj/item/paper_bundle)) if(!copyitem) user.drop_item() - copyitem = O - O.forceMove(src) - to_chat(user, "You insert \the [O] into \the [src].") + copyitem = used + used.forceMove(src) + to_chat(user, "You insert \the [used] into \the [src].") flick(insert_anim, src) else to_chat(user, "There is already something in \the [src].") - else if(istype(O, /obj/item/toner)) + + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/toner)) if(toner <= 10) //allow replacing when low toner is affecting the print darkness user.drop_item() to_chat(user, "You insert the toner cartridge into \the [src].") - var/obj/item/toner/T = O + var/obj/item/toner/T = used toner += T.toner_amount - qdel(O) + qdel(used) else to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") - else if(istype(O, /obj/item/folder)) + + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/folder)) if(!folder) //allow replacing when low toner is affecting the print darkness user.drop_item() - to_chat(user, "You slide the [O] into \the [src].") - folder = O - O.forceMove(src) + to_chat(user, "You slide the [used] into \the [src].") + folder = used + used.forceMove(src) else to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") - else if(istype(O, /obj/item/grab)) //For ass-copying. - var/obj/item/grab/G = O + + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/grab)) //For ass-copying. + var/obj/item/grab/G = used if(ismob(G.affecting) && G.affecting != copymob) var/mob/GM = G.affecting visible_message("[usr] drags [GM.name] onto the photocopier!") @@ -511,6 +517,8 @@ if(copyitem) copyitem.forceMove(get_turf(src)) copyitem = null + + return ITEM_INTERACT_COMPLETE else return ..() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 33dc4e945f07..7d433e8a9187 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -187,6 +187,8 @@ var/icon_off = "camera_off" var/size = 3 var/see_ghosts = FALSE //for the spoop of it + /// Cult portals and unconcealed runes have a minor form of invisibility + var/see_cult = TRUE var/current_photo_num = 1 var/digital = FALSE /// Should camera light up the scene @@ -291,6 +293,10 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor atoms.Add(A) continue + // AI can't see unconcealed runes or cult portals + if(A.invisibility == INVISIBILITY_RUNES && see_cult) + atoms.Add(A) + continue if(A.invisibility) if(see_ghosts && isobserver(A)) var/mob/dead/observer/O = A @@ -598,6 +604,7 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor /************** *video camera * ***************/ +/// The amount of time after being turned off that the camera is too hot to turn back on. #define CAMERA_STATE_COOLDOWN 2 SECONDS /obj/item/videocam @@ -608,12 +615,13 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL = 1000, MAT_GLASS = 500) var/on = FALSE - var/video_cooldown = 0 var/obj/machinery/camera/camera var/icon_on = "videocam_on" var/icon_off = "videocam" var/canhear_range = 7 + COOLDOWN_DECLARE(video_cooldown) + /obj/item/videocam/proc/camera_state(mob/living/carbon/user) if(!on) on = TRUE @@ -627,16 +635,16 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor camera.c_tag = null QDEL_NULL(camera) visible_message("The video camera has been turned [on ? "on" : "off"].") - for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.telescreens) if(on) TV.feeds_on++ else TV.feeds_on-- TV.update_icon(UPDATE_OVERLAYS) - video_cooldown = world.time + CAMERA_STATE_COOLDOWN + COOLDOWN_START(src, video_cooldown, CAMERA_STATE_COOLDOWN) /obj/item/videocam/attack_self__legacy__attackchain(mob/user) - if(world.time < video_cooldown) + if(!COOLDOWN_FINISHED(src, video_cooldown)) to_chat(user, "[src] is overheating, give it some time.") return camera_state(user) diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index f8180ef4a5ab..62211b78ed4c 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -15,6 +15,7 @@ /// camera AI can take pictures with /obj/item/camera/siliconcam/ai_camera name = "AI photo camera" + see_cult = FALSE /// camera cyborgs can take pictures with /obj/item/camera/siliconcam/robot_camera diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index b6b3fd5cf404..7c96f931faea 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -118,16 +118,16 @@ maptext_x = 8 maptext = "[ticket_number]" -/obj/machinery/ticket_machine/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/hand_labeler_refill)) +/obj/machinery/ticket_machine/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/hand_labeler_refill)) if(!(ticket_number >= max_number)) - to_chat(user, "[src] refuses [I]! There [max_number-ticket_number==1 ? "is" : "are"] still [max_number-ticket_number] ticket\s left!") - return + to_chat(user, "[src] refuses [used]! There [max_number-ticket_number==1 ? "is" : "are"] still [max_number-ticket_number] ticket\s left!") + return ITEM_INTERACT_COMPLETE to_chat(user, "You start to refill [src]'s ticket holder (doing this will reset its ticket count!).") if(do_after(user, 30, target = src)) - to_chat(user, "You insert [I] into [src] as it whirs nondescriptly.") + to_chat(user, "You insert [used] into [src] as it whirs nondescriptly.") user.drop_item() - qdel(I) + qdel(used) ticket_number = 0 current_number = 0 for(var/obj/item/ticket_machine_ticket/ticket in tickets) @@ -136,16 +136,18 @@ tickets.Cut() max_number = initial(max_number) update_icon() - return - else if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/heldID = I + + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/card/id)) + var/obj/item/card/id/heldID = used if(ACCESS_HOP in heldID.access) dispense_enabled = !dispense_enabled to_chat(user, "You [dispense_enabled ? "enable" : "disable"] [src], it will [dispense_enabled ? "now" : "no longer"] dispense tickets!") handle_maptext() - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You do not have the required access to [dispense_enabled ? "disable" : "enable"] the ticket machine.") - return + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/ticket_machine/proc/reset_cooldown() diff --git a/code/modules/pda/nanobank.dm b/code/modules/pda/nanobank.dm index 2d992b968516..ab3f53561529 100644 --- a/code/modules/pda/nanobank.dm +++ b/code/modules/pda/nanobank.dm @@ -331,7 +331,7 @@ error_message(user, "Incorrect Credentials") /datum/data/pda/app/nanobank/proc/input_account_pin(mob/user) - var/attempt_pin = tgui_input_number(user, "Enter pin code", "NanoBank Account Auth", max_value = 99999) + var/attempt_pin = tgui_input_number(user, "Enter pin code", "NanoBank Account Auth", max_value = BANK_PIN_MAX, min_value = BANK_PIN_MIN) if(!user_account || isnull(attempt_pin)) return return attempt_pin @@ -467,7 +467,7 @@ var/attempt_pin = pin if(customer_account.security_level != ACCOUNT_SECURITY_ID && !attempt_pin) //if pin is not given, we'll prompt them here - attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction") + attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction", max_value = BANK_PIN_MAX, min_value = BANK_PIN_MIN) if(!attempt_pin) return FALSE var/is_admin = is_admin(user) diff --git a/code/modules/power/apc/apc.dm b/code/modules/power/apc/apc.dm index ffb063c52d4e..1930d516bf74 100644 --- a/code/modules/power/apc/apc.dm +++ b/code/modules/power/apc/apc.dm @@ -237,24 +237,23 @@ if(isAntag(user)) . += "An APC can be emagged to unlock it, this will keep it in it's refresh state, making very obvious something is wrong." -//attack with an item - open/close cover, insert cell, or (un)lock interface -/obj/machinery/power/apc/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) - +/obj/machinery/power/apc/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(issilicon(user) && get_dist(src, user) > 1) - return attack_hand(user) + attack_hand(user) + return ITEM_INTERACT_COMPLETE - else if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside + else if(istype(used, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside if(cell) to_chat(user, "There is a power cell already installed!") - return + return ITEM_INTERACT_COMPLETE else if(stat & MAINT) to_chat(user, "There is no connector for your power cell!") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return - W.forceMove(src) - cell = W + return ITEM_INTERACT_COMPLETE + used.forceMove(src) + cell = used for(var/mob/living/simple_animal/demon/pulse_demon/demon in cell) demon.forceMove(src) @@ -270,90 +269,96 @@ chargecount = 0 update_icon() - else if(W.GetID()) // trying to unlock the interface with an ID card + return ITEM_INTERACT_COMPLETE + else if(used.GetID()) // trying to unlock the interface with an ID card togglelock(user) + return ITEM_INTERACT_COMPLETE - else if(istype(W, /obj/item/stack/cable_coil) && opened) + else if(istype(used, /obj/item/stack/cable_coil) && opened) var/turf/host_turf = get_turf(src) if(!host_turf) throw EXCEPTION("attackby on APC when it's not on a turf") - return + return ITEM_INTERACT_COMPLETE if(host_turf.intact) to_chat(user, "You must remove the floor plating in front of the APC first!") - return + return ITEM_INTERACT_COMPLETE else if(terminal) // it already have terminal to_chat(user, "This APC is already wired!") - return + return ITEM_INTERACT_COMPLETE else if(!has_electronics()) to_chat(user, "There is nothing to wire!") - return + return ITEM_INTERACT_COMPLETE - var/obj/item/stack/cable_coil/C = W + var/obj/item/stack/cable_coil/C = used if(C.get_amount() < 10) to_chat(user, "You need ten lengths of cable for APC!") - return + return ITEM_INTERACT_COMPLETE user.visible_message("[user.name] adds cables to the APC frame.", \ "You start adding cables to the APC frame...") playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(do_after(user, 20, target = src)) if(C.get_amount() < 10 || !C) - return + return ITEM_INTERACT_COMPLETE if(C.get_amount() >= 10 && !terminal && opened && has_electronics()) var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) do_sparks(5, TRUE, src) - return + return ITEM_INTERACT_COMPLETE C.use(10) to_chat(user, "You add cables to the APC frame.") make_terminal() terminal.connect_to_network() - else if(istype(W, /obj/item/apc_electronics) && opened) + return ITEM_INTERACT_COMPLETE + + else if(istype(used, /obj/item/apc_electronics) && opened) if(has_electronics()) // there are already electronicks inside to_chat(user, "You cannot put the board inside, there already is one!") - return + return ITEM_INTERACT_COMPLETE else if(stat & BROKEN) to_chat(user, "You cannot put the board inside, the frame is damaged!") - return + return ITEM_INTERACT_COMPLETE - user.visible_message("[user.name] inserts [W] into [src].", \ - "You start to insert [W] into the frame...") + user.visible_message("[user.name] inserts [used] into [src].", \ + "You start to insert [used] into the frame...") playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(do_after(user, 10, target = src)) if(!has_electronics()) electronics_state = APC_ELECTRONICS_INSTALLED locked = FALSE - to_chat(user, "You place [W] inside the frame.") - qdel(W) + to_chat(user, "You place [used] inside the frame.") + qdel(used) - else if(istype(W, /obj/item/mounted/frame/apc_frame) && opened) + return ITEM_INTERACT_COMPLETE + + else if(istype(used, /obj/item/mounted/frame/apc_frame) && opened) if(!(stat & BROKEN || opened == APC_COVER_OFF || obj_integrity < max_integrity)) // There is nothing to repair to_chat(user, "You found no reason for repairing this APC.") - return + return ITEM_INTERACT_COMPLETE if(!(stat & BROKEN) && opened == APC_COVER_OFF) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover user.visible_message("[user.name] replaces missing APC's cover.",\ "You begin to replace APC's cover...") if(do_after(user, 20, target = src)) // replacing cover is quicker than replacing whole frame to_chat(user, "You replace missing APC's cover.") - qdel(W) + qdel(used) opened = APC_OPENED update_icon() - return + return ITEM_INTERACT_COMPLETE if(has_electronics()) to_chat(user, "You cannot repair this APC until you remove the electronics still inside!") - return + return ITEM_INTERACT_COMPLETE user.visible_message("[user.name] replaces the damaged APC frame with a new one.",\ "You begin to replace the damaged APC frame...") if(do_after(user, 50, target = src)) to_chat(user, "You replace the damaged APC frame with a new one.") - qdel(W) + qdel(used) stat &= ~BROKEN obj_integrity = max_integrity if(opened == APC_COVER_OFF) opened = APC_OPENED update_icon() - return + return ITEM_INTERACT_COMPLETE else return ..() diff --git a/code/modules/power/cables/terminal.dm b/code/modules/power/cables/terminal.dm index c459f7864ead..23ab1950d556 100644 --- a/code/modules/power/cables/terminal.dm +++ b/code/modules/power/cables/terminal.dm @@ -77,8 +77,9 @@ qdel(src) -/obj/machinery/power/terminal/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/wirecutters)) - dismantle(user, W) +/obj/machinery/power/terminal/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/wirecutters)) + dismantle(user, used) + return ITEM_INTERACT_COMPLETE else return ..() diff --git a/code/modules/power/engines/singularity/collector.dm b/code/modules/power/engines/singularity/collector.dm index 4dd7d9110cbe..1fb0cf1922fc 100644 --- a/code/modules/power/engines/singularity/collector.dm +++ b/code/modules/power/engines/singularity/collector.dm @@ -65,24 +65,24 @@ else disconnect_from_network() - -/obj/machinery/power/rad_collector/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/tank/internals/plasma)) +/obj/machinery/power/rad_collector/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/tank/internals/plasma)) if(!anchored) to_chat(user, "[src] needs to be secured to the floor first.") - return TRUE + return ITEM_INTERACT_COMPLETE if(loaded_tank) to_chat(user, "There's already a plasma tank loaded.") - return TRUE + return ITEM_INTERACT_COMPLETE if(user.drop_item()) - loaded_tank = I - I.forceMove(src) + loaded_tank = used + used.forceMove(src) update_icons() - else if(I.tool_behaviour == TOOL_CROWBAR) + return ITEM_INTERACT_COMPLETE + else if(used.tool_behaviour == TOOL_CROWBAR) if(loaded_tank && !locked) eject() - return TRUE - else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) if(allowed(user)) if(active) locked = !locked @@ -92,7 +92,8 @@ to_chat(user, "The controls can only be locked when [src] is active") else to_chat(user, "Access denied!") - return TRUE + + return ITEM_INTERACT_COMPLETE else return ..() diff --git a/code/modules/power/engines/singularity/containment_field.dm b/code/modules/power/engines/singularity/containment_field.dm index cfec3f374779..6fdb50dfb3a8 100644 --- a/code/modules/power/engines/singularity/containment_field.dm +++ b/code/modules/power/engines/singularity/containment_field.dm @@ -35,9 +35,9 @@ shock_field(user) return 1 -/obj/machinery/field/containment/attackby__legacy__attackchain(obj/item/W, mob/user, params) +/obj/machinery/field/containment/item_interaction(mob/living/user, obj/item/used, list/modifiers) shock(user) - return TRUE + return ITEM_INTERACT_COMPLETE /obj/machinery/field/containment/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/modules/power/engines/singularity/emitter.dm b/code/modules/power/engines/singularity/emitter.dm index 1e1af0ed3ecb..0e3d79c6f7f3 100644 --- a/code/modules/power/engines/singularity/emitter.dm +++ b/code/modules/power/engines/singularity/emitter.dm @@ -146,17 +146,17 @@ if(!anchored) step(src, get_dir(M, src)) -/obj/machinery/power/emitter/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(!istype(I, /obj/item/card/id) && !istype(I, /obj/item/pda)) +/obj/machinery/power/emitter/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(!istype(used, /obj/item/card/id) && !istype(used, /obj/item/pda)) return ..() if(emagged) to_chat(user, "The lock seems to be broken.") - return + return ITEM_INTERACT_COMPLETE if(!allowed(user)) to_chat(user, "Access denied.") - return + return ITEM_INTERACT_COMPLETE if(active) locked = !locked @@ -165,6 +165,8 @@ locked = FALSE //just in case it somehow gets locked to_chat(user, "The controls can only be locked when [src] is online!") + return ITEM_INTERACT_COMPLETE + /obj/machinery/power/emitter/wrench_act(mob/living/user, obj/item/I) . = TRUE if(active) diff --git a/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm index a64c70fd5362..e86ef93bc538 100644 --- a/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm @@ -241,18 +241,19 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return dir = turn(dir, 270) -/obj/machinery/particle_accelerator/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(!iscoil(W)) +/obj/machinery/particle_accelerator/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(!iscoil(used)) return ..() if(construction_state == ACCELERATOR_WRENCHED) - var/obj/item/stack/cable_coil/C = W + var/obj/item/stack/cable_coil/C = used if(C.use(1)) playsound(loc, C.usesound, 50, 1) - user.visible_message("[user] adds wires to [src].", \ - "You add some wires.") + user.visible_message("[user] adds wires to [src].", "You add some wires.") construction_state = ACCELERATOR_WIRED update_icon() + return ITEM_INTERACT_COMPLETE + /obj/machinery/particle_accelerator/screwdriver_act(mob/user, obj/item/I) if(construction_state != ACCELERATOR_WIRED && construction_state != ACCELERATOR_READY) return diff --git a/code/modules/power/engines/singularity/singularity.dm b/code/modules/power/engines/singularity/singularity.dm index 1d51905da0a8..a5931a20ae3f 100644 --- a/code/modules/power/engines/singularity/singularity.dm +++ b/code/modules/power/engines/singularity/singularity.dm @@ -107,7 +107,7 @@ GLOBAL_VAR_INIT(global_singulo_id, 1) B.remove(C) qdel(B) -/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man! +/obj/singularity/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) //The singularity stops drifting for no man! return 0 /obj/singularity/blob_act(obj/structure/blob/B) diff --git a/code/modules/power/engines/supermatter/engineering_event.dm b/code/modules/power/engines/supermatter/engineering_event.dm index ab0db7f5b6a6..f603554cd179 100644 --- a/code/modules/power/engines/supermatter/engineering_event.dm +++ b/code/modules/power/engines/supermatter/engineering_event.dm @@ -8,13 +8,14 @@ /// Starts an event /datum/engi_event/proc/start_event() on_start() + alert_engi() + if(duration) + addtimer(CALLBACK(src, PROC_REF(on_end)), duration) return /// To be executed once an event has been started /datum/engi_event/proc/on_start() - alert_engi() - if(duration) - addtimer(CALLBACK(src, PROC_REF(on_end)), duration) + return /// Send an alert to engineering about the event /datum/engi_event/proc/alert_engi() diff --git a/code/modules/power/engines/supermatter/supermatter.dm b/code/modules/power/engines/supermatter/supermatter.dm index 52660563a0c5..f04f2a2f668f 100644 --- a/code/modules/power/engines/supermatter/supermatter.dm +++ b/code/modules/power/engines/supermatter/supermatter.dm @@ -471,7 +471,7 @@ // Pass all the gas related code an empty gas container removed = new() damage_archived = damage - if(!removed || !removed.total_moles() || isspaceturf(T)) //we're in space or there is no gas to process + if(!removed || removed.total_moles() <= 0 || isspaceturf(T)) //we're in space or there is no gas to process if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage else @@ -567,25 +567,25 @@ var/crush_ratio = combined_gas / MOLE_CRUNCH_THRESHOLD - gas_coefficient = 1 + (crush_ratio ** 2 * (crush_ratio <= 1) + (crush_ratio > 1) * crush_ratio ** 0.5) * (plasmacomp * PLASMA_CRUNCH + o2comp * O2_CRUNCH + co2comp * CO2_CRUNCH + n2comp * N2_CRUNCH + n2ocomp * N2O_CRUNCH) + gas_coefficient = 1 + (crush_ratio ** 2 * (crush_ratio <= 1) + (crush_ratio > 1) * 2 * crush_ratio / (crush_ratio + 1)) * (plasmacomp * PLASMA_CRUNCH + o2comp * O2_CRUNCH + co2comp * CO2_CRUNCH + n2comp * N2_CRUNCH + n2ocomp * N2O_CRUNCH) if(prob(50)) radiation_pulse(src, power * (gas_coefficient + max(0, ((power_transmission_bonus / 10))))) //Power * 0.55 * a value between 1 and 0.8 var/device_energy = power * REACTION_POWER_MODIFIER - // Calculate temperature change in terms of thermal energy, scaled by the average specific heat of the gas. - if(removed.total_moles()) - var/produced_joules = max(0, ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER) * heat_multiplier) - produced_joules *= (removed.heat_capacity() / removed.total_moles()) - removed.set_temperature((removed.thermal_energy() + produced_joules) / removed.heat_capacity()) - //Calculate how much gas to release //Varies based on power and gas content removed.set_toxins(removed.toxins() + max(((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER) * gas_multiplier, 0)) //Varies based on power, gas content, and heat removed.set_oxygen(removed.oxygen() + max((((device_energy + removed.temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER) * gas_multiplier, 0)) + // Calculate temperature change in terms of thermal energy, scaled by the average specific heat of the gas. + if(removed.total_moles() >= 1) + var/produced_joules = max(0, ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER) * heat_multiplier) + produced_joules *= (removed.heat_capacity() / removed.total_moles()) + removed.set_temperature((removed.thermal_energy() + produced_joules) / removed.heat_capacity()) + if(produces_gas) env.merge(removed) @@ -784,22 +784,22 @@ playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, TRUE) Consume(nom) -/obj/machinery/atmospherics/supermatter_crystal/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) - if(!istype(I) || (I.flags & ABSTRACT) || !istype(user)) - return - if(moveable && default_unfasten_wrench(user, I, time = 20)) - return +/obj/machinery/atmospherics/supermatter_crystal/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(!istype(used) || (used.flags & ABSTRACT) || !istype(user)) + return ITEM_INTERACT_COMPLETE + if(moveable && default_unfasten_wrench(user, used, time = 20)) + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/scalpel/supermatter)) + if(istype(used, /obj/item/scalpel/supermatter)) if(!ishuman(user)) - return + return ITEM_INTERACT_COMPLETE var/mob/living/carbon/human/H = user - var/obj/item/scalpel/supermatter/scalpel = I + var/obj/item/scalpel/supermatter/scalpel = used if(!scalpel.uses_left) to_chat(H, "[scalpel] isn't sharp enough to carve a sliver off of [src]!") - return + return ITEM_INTERACT_COMPLETE var/obj/item/nuke_core/supermatter_sliver/sliver = carve_sliver(H) if(sliver) @@ -816,20 +816,20 @@ tongs.item_state = "supermatter_tongs_loaded" to_chat(H, "You pick up [sliver] with [tongs]!") - return + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/supermatter_halberd)) + if(istype(used, /obj/item/supermatter_halberd)) carve_sliver(user) - return + return ITEM_INTERACT_COMPLETE - if(istype(I, /obj/item/retractor/supermatter)) - to_chat(user, "[I] bounces off [src], you need to cut a sliver off first!") + if(istype(used, /obj/item/retractor/supermatter)) + to_chat(user, "[used] bounces off [src], you need to cut a sliver off first!") else if(user.drop_item()) - user.visible_message("As [user] touches [src] with \a [I], silence fills the room...",\ - "You touch [src] with [I], and everything suddenly goes silent.\n[I] flashes into dust as you flinch away from [src].",\ + user.visible_message("As [user] touches [src] with \a [used], silence fills the room...",\ + "You touch [src] with [used], and everything suddenly goes silent.\n[used] flashes into dust as you flinch away from [src].",\ "Everything suddenly goes silent.") - investigate_log("has been attacked ([I]) by [key_name(user)]", "supermatter") - Consume(I) + investigate_log("has been attacked ([used]) by [key_name(user)]", "supermatter") + Consume(used) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, TRUE) radiation_pulse(src, 150, 4) diff --git a/code/modules/power/engines/tesla/coil.dm b/code/modules/power/engines/tesla/coil.dm index 93078385b0bc..5bf6cf406a94 100644 --- a/code/modules/power/engines/tesla/coil.dm +++ b/code/modules/power/engines/tesla/coil.dm @@ -43,11 +43,12 @@ if(in_range(user, src) || isobserver(user)) . += "The status display reads: Power generation at [input_power_multiplier*100]%.
    Shock interval at [zap_cooldown*0.1] seconds.
    " -/obj/machinery/power/tesla_coil/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(istype(W, /obj/item/assembly/signaler) && panel_open) +/obj/machinery/power/tesla_coil/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/assembly/signaler) && panel_open) wires.Interact(user) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/power/tesla_coil/crowbar_act(mob/user, obj/item/I) . = TRUE @@ -129,9 +130,11 @@ component_parts += new /obj/item/stock_parts/capacitor(null) RefreshParts() -/obj/machinery/power/grounding_rod/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(exchange_parts(user, W)) - return +/obj/machinery/power/grounding_rod/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(exchange_parts(user, used)) + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/power/grounding_rod/screwdriver_act(mob/user, obj/item/I) . = TRUE diff --git a/code/modules/power/engines/tesla/energy_ball.dm b/code/modules/power/engines/tesla/energy_ball.dm index b7a012e9c8aa..e5d0c22bc8c4 100644 --- a/code/modules/power/engines/tesla/energy_ball.dm +++ b/code/modules/power/engines/tesla/energy_ball.dm @@ -137,7 +137,7 @@ // MORE POWER movement_beam(move_target, 1 SECONDS) sleep(0.5 SECONDS) - walk_towards(src, move_target, 0, 10) + GLOB.move_manager.home_onto(src, move_target, 0, 10) /obj/singularity/energy_ball/proc/on_atom_entered(datum/source, atom/movable/entered) var/mob/living/living_entered = entered diff --git a/code/modules/power/generators/portable generators/pacman.dm b/code/modules/power/generators/portable generators/pacman.dm index 12705003760b..ee7a0c89c8af 100644 --- a/code/modules/power/generators/portable generators/pacman.dm +++ b/code/modules/power/generators/portable generators/pacman.dm @@ -191,19 +191,19 @@ emagged = TRUE return TRUE -/obj/machinery/power/port_gen/pacman/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob) - if(istype(O, sheet_path)) - var/obj/item/stack/addstack = O +/obj/machinery/power/port_gen/pacman/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, sheet_path)) + var/obj/item/stack/addstack = used var/amount = min((max_sheets - sheets), addstack.amount) if(amount < 1) to_chat(user, "[src] is full!") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You add [amount] sheet\s to [src].") sheets += amount addstack.use(amount) SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/power/generators/treadmill.dm b/code/modules/power/generators/treadmill.dm index f57b6ee3b4f3..1fe399551f04 100644 --- a/code/modules/power/generators/treadmill.dm +++ b/code/modules/power/generators/treadmill.dm @@ -110,12 +110,13 @@ spawn(100) stat &= ~BROKEN -/obj/machinery/power/treadmill/attackby__legacy__attackchain(obj/item/W, mob/user) - if(default_unfasten_wrench(user, W, time = 60)) +/obj/machinery/power/treadmill/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_unfasten_wrench(user, used, time = 60)) on_anchor_changed() speed = 0 update_icon() - return + return ITEM_INTERACT_COMPLETE + return ..() #undef BASE_MOVE_DELAY diff --git a/code/modules/power/generators/turbine.dm b/code/modules/power/generators/turbine.dm index 0b15beb5fbc6..6c74a82fbab4 100644 --- a/code/modules/power/generators/turbine.dm +++ b/code/modules/power/generators/turbine.dm @@ -126,8 +126,8 @@ E += M.rating efficiency = E / 6 -/obj/machinery/power/compressor/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_change_direction_wrench(user, I)) +/obj/machinery/power/compressor/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_change_direction_wrench(user, used)) turbine = null inturf = get_step(src, dir) locate_machinery() @@ -137,7 +137,8 @@ else to_chat(user, "Turbine not connected.") stat |= BROKEN - return + + return ITEM_INTERACT_COMPLETE return ..() @@ -328,11 +329,11 @@ return . += image(icon, "turb-o", FLY_LAYER) -/obj/machinery/power/turbine/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) - return +/obj/machinery/power/turbine/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), used)) + return ITEM_INTERACT_COMPLETE - if(default_change_direction_wrench(user, I)) + if(default_change_direction_wrench(user, used)) compressor = null outturf = get_step(src, dir) locate_machinery() @@ -342,10 +343,10 @@ else to_chat(user, "Compressor not connected.") stat |= BROKEN - return + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, I)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 7a21e52a42b7..22fd1e4aa4d9 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -152,18 +152,22 @@ GLOBAL_LIST_EMPTY(gravity_generators) update_icon() // Step 2 -/obj/machinery/gravity_generator/main/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/gravity_generator/main/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(construction_state != GRAV_NEEDS_PLASTEEL) return ..() - if(istype(I, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/PS = I + + if(istype(used, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/PS = used if(PS.amount < 10) to_chat(user, "You need 10 sheets of plasteel.") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You add new plating to the framework.") construction_state = GRAV_NEEDS_WRENCH update_icon() + return ITEM_INTERACT_COMPLETE + + return ..() // Step 3 /obj/machinery/gravity_generator/main/wrench_act(mob/living/user, obj/item/I) diff --git a/code/modules/power/lights.dm b/code/modules/power/lights.dm index bf048012cb6d..b6b1a8f66f5f 100644 --- a/code/modules/power/lights.dm +++ b/code/modules/power/lights.dm @@ -96,19 +96,19 @@ transfer_fingerprints_to(newlight) qdel(src) -/obj/machinery/light_construct/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) +/obj/machinery/light_construct/item_interaction(mob/living/user, obj/item/used, list/modifiers) add_fingerprint(user) - if(istype(W, /obj/item/stack/cable_coil)) + if(istype(used, /obj/item/stack/cable_coil)) if(stage != LIGHT_CONSTRUCT_EMPTY_FRAME) - return - var/obj/item/stack/cable_coil/coil = W + return ITEM_INTERACT_COMPLETE + var/obj/item/stack/cable_coil/coil = used coil.use(1) stage = LIGHT_CONSTRUCT_WIRED update_icon(UPDATE_ICON_STATE) playsound(loc, coil.usesound, 50, 1) user.visible_message("[user.name] adds wires to [src].", \ "You add wires to [src].", "You hear a noise.") - return + return ITEM_INTERACT_COMPLETE return ..() @@ -278,7 +278,7 @@ /// Light intensity when in night shift mode var/nightshift_light_power = 0.45 /// The colour of the light while it's in night shift mode - var/nightshift_light_color = "#FFDDCC" + var/nightshift_light_color = "#e0eeff" /// The colour of the light while it's in emergency mode var/bulb_emergency_colour = "#FF3232" @@ -299,8 +299,9 @@ exposure_icon_state = "circle" base_state = "bulb" brightness_range = 4 - brightness_color = "#a0a080" + brightness_color = "#ffebb0" nightshift_light_range = 4 + nightshift_light_color = "#ffefa0" // #a0a080 light_type = /obj/item/light/bulb deconstruct_type = /obj/machinery/light_construct/small @@ -393,12 +394,10 @@ break_light_tube(TRUE) if("bulb") brightness_range = 4 - brightness_color = "#a0a080" if(prob(5)) break_light_tube(TRUE) if("floor") brightness_range = 6 - brightness_color = "#a0a080" if(prob(3)) break_light_tube(TRUE) update(FALSE, TRUE, FALSE) @@ -593,22 +592,22 @@ // attack with item - insert light (if right type), otherwise try to break the light -/obj/machinery/light/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) +/obj/machinery/light/item_interaction(mob/living/user, obj/item/used, list/modifiers) user.changeNext_move(CLICK_CD_MELEE) // This is an ugly hack and I hate it forever //Light replacer code - if(istype(W, /obj/item/lightreplacer)) - var/obj/item/lightreplacer/LR = W + if(istype(used, /obj/item/lightreplacer)) + var/obj/item/lightreplacer/LR = used LR.ReplaceLight(src, user) - return + return ITEM_INTERACT_COMPLETE // Attack with Spray Can! Coloring time. - if(istype(W, /obj/item/toy/crayon/spraycan)) - var/obj/item/toy/crayon/spraycan/spraycan = W + if(istype(used, /obj/item/toy/crayon/spraycan)) + var/obj/item/toy/crayon/spraycan/spraycan = used // quick check to disable capped spraypainting, aesthetic reasons if(spraycan.capped) to_chat(user, "You can't spraypaint [src] with the cap still on!") - return + return ITEM_INTERACT_COMPLETE var/list/hsl = rgb2hsl(hex2num(copytext(spraycan.colour, 2, 4)), hex2num(copytext(spraycan.colour, 4, 6)), hex2num(copytext(spraycan.colour, 6, 8))) hsl[3] = max(hsl[3], 0.4) var/list/rgb = hsl2rgb(arglist(hsl)) @@ -617,23 +616,26 @@ to_chat(user, "You change [src]'s light bulb color.") brightness_color = new_color update(TRUE, TRUE, FALSE) - return + return ITEM_INTERACT_COMPLETE // attempt to insert light - if(istype(W, /obj/item/light)) + if(istype(used, /obj/item/light)) if(status != LIGHT_EMPTY) to_chat(user, "There is a [fitting] already inserted.") else add_fingerprint(user) - var/obj/item/light/L = W + var/obj/item/light/L = used if(istype(L, light_type)) status = L.status to_chat(user, "You insert [L].") switchcount = L.switchcount rigged = L.rigged - brightness_range = L.brightness_range - brightness_power = L.brightness_power - brightness_color = L.brightness_color + if(L.brightness_range) + brightness_range = L.brightness_range + if(L.brightness_power) + brightness_power = L.brightness_power + if(L.brightness_color) + brightness_color = L.brightness_color lightmaterials = L.materials on = has_power() update(TRUE, TRUE, FALSE) @@ -649,18 +651,18 @@ explode() else to_chat(user, "This type of light requires a [fitting].") - return + return ITEM_INTERACT_COMPLETE // attempt to break the light //If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N if(status != LIGHT_BROKEN && status != LIGHT_EMPTY) user.do_attack_animation(src) - if(prob(1 + W.force * 5)) + if(prob(1 + used.force * 5)) user.visible_message("[user] smashed the light!", "You hit the light, and it smashes!", \ "You hear the tinkle of breaking glass.") - if(on && (W.flags & CONDUCT)) + if(on && (used.flags & CONDUCT)) if(prob(12)) electrocute_mob(user, get_area(src), src, 0.3, TRUE) break_light_tube() @@ -668,18 +670,20 @@ user.visible_message("[user] hits the light.", "You hit the light.", \ "You hear someone hitting a light.") playsound(loc, 'sound/effects/glasshit.ogg', 75, 1) - return + + return ITEM_INTERACT_COMPLETE // attempt to stick weapon into light socket if(status == LIGHT_EMPTY) - if(has_power() && (W.flags & CONDUCT)) + if(has_power() && (used.flags & CONDUCT)) do_sparks(3, 1, src) if(prob(75)) // If electrocuted electrocute_mob(user, get_area(src), src, rand(0.7, 1), TRUE) to_chat(user, "You are electrocuted by [src]!") else // If not electrocuted - to_chat(user, "You stick [W] into the light socket!") - return + to_chat(user, "You stick [used] into the light socket!") + + return ITEM_INTERACT_COMPLETE return ..() @@ -712,12 +716,14 @@ transfer_fingerprints_to(newlight) qdel(src) -/obj/machinery/light/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) - ..() +/obj/machinery/light/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(status == LIGHT_BROKEN || status == LIGHT_EMPTY) - if(on && (I.flags & CONDUCT)) + if(on && (used.flags & CONDUCT)) if(prob(12)) electrocute_mob(user, get_area(src), src, 0.3, TRUE) + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() @@ -765,7 +771,7 @@ update_icon() return emergency_mode = TRUE - set_light(3, 1.7, bulb_emergency_colour) + set_light((fitting == "tube" ? 3 : 2), 1, bulb_emergency_colour) update_icon() RegisterSignal(machine_powernet, COMSIG_POWERNET_POWER_CHANGE, PROC_REF(update), override = TRUE) @@ -1033,7 +1039,6 @@ base_state = "ltube" item_state = "c_tube" brightness_range = 8 - brightness_color = "#ffffff" /obj/item/light/tube/large w_class = WEIGHT_CLASS_SMALL @@ -1053,7 +1058,6 @@ base_state = "lbulb" item_state = "contvapour" brightness_range = 5 - brightness_color = "#a0a080" /obj/item/light/throw_impact(atom/hit_atom) ..() diff --git a/code/modules/power/power_machine.dm b/code/modules/power/power_machine.dm index 4f3903da067a..76f7bf4139a4 100644 --- a/code/modules/power/power_machine.dm +++ b/code/modules/power/power_machine.dm @@ -76,17 +76,18 @@ // attach a wire to a power machine - leads from the turf you are standing on //almost never called, overwritten by all power machines but terminal and generator -/obj/machinery/power/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = I +/obj/machinery/power/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = used var/turf/T = user.loc if(T.intact || !isfloorturf(T)) - return + return ITEM_INTERACT_COMPLETE if(get_dist(src, user) > 1) - return + return ITEM_INTERACT_COMPLETE coil.place_turf(T, user) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() //////////////////////////////////////////////// diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fd247fe44eaf..b9583b065bdc 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -102,14 +102,14 @@ if(charge_level > 0) . += "smes-og[charge_level]" -/obj/machinery/power/smes/attackby__legacy__attackchain(obj/item/I, mob/user, params) +/obj/machinery/power/smes/item_interaction(mob/living/user, obj/item/used, list/modifiers) // Opening using screwdriver - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), used)) update_icon() - return + return ITEM_INTERACT_COMPLETE // Changing direction using wrench - if(default_change_direction_wrench(user, I)) + if(default_change_direction_wrench(user, used)) terminal = null var/turf/T = get_step(src, dir) for(var/obj/machinery/power/terminal/term in T) @@ -120,38 +120,38 @@ break if(!terminal) to_chat(user, "No power source found.") - return + return ITEM_INTERACT_COMPLETE stat &= ~BROKEN update_icon() - return + return ITEM_INTERACT_COMPLETE // Building and linking a terminal - if(istype(I, /obj/item/stack/cable_coil)) + if(istype(used, /obj/item/stack/cable_coil)) var/dir = get_dir(user, src) if(dir & (dir - 1)) // Checks for diagonal interaction - return + return ITEM_INTERACT_COMPLETE if(terminal) // Checks for an existing terminal to_chat(user, "This SMES already has a power terminal!") - return + return ITEM_INTERACT_COMPLETE if(!panel_open) // Checks to see if the panel is closed to_chat(user, "You must open the maintenance panel first!") - return + return ITEM_INTERACT_COMPLETE var/turf/T = get_turf(user) if(T.intact) // Checks to see if floor plating is present to_chat(user, "You must first remove the floor plating!") - return + return ITEM_INTERACT_COMPLETE - var/obj/item/stack/cable_coil/C = I + var/obj/item/stack/cable_coil/C = used if(C.get_amount() < 10) to_chat(user, "You need more wires.") - return + return ITEM_INTERACT_COMPLETE if(user.loc == loc) to_chat(user, "You must not be on the same tile as [src].") - return + return ITEM_INTERACT_COMPLETE // Direction the terminal will face to var/temporary_direction = get_dir(user, src) @@ -164,12 +164,12 @@ if(isspaceturf(temporary_location)) to_chat(user, "You can't build a terminal on space.") - return + return ITEM_INTERACT_COMPLETE else if(istype(temporary_location)) if(temporary_location.intact) to_chat(user, "You must remove the floor plating first.") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You start adding cable to [src].") playsound(loc, C.usesound, 50, TRUE) @@ -190,23 +190,23 @@ make_terminal(user, temporary_direction, temporary_location) terminal.connect_to_network() stat &= ~BROKEN - return + return ITEM_INTERACT_COMPLETE // Disassembling the terminal - if(istype(I, /obj/item/wirecutters) && terminal && panel_open) + if(istype(used, /obj/item/wirecutters) && terminal && panel_open) var/turf/T = get_turf(terminal) if(T.intact) //is the floor plating removed ? to_chat(user, "You must first expose the power terminal!") - return + return ITEM_INTERACT_COMPLETE to_chat(user, "You begin to dismantle the power terminal...") - playsound(src.loc, I.usesound, 50, TRUE) + playsound(src.loc, used.usesound, 50, TRUE) - if(do_after(user, 5 SECONDS * I.toolspeed, target = src)) + if(do_after(user, 5 SECONDS * used.toolspeed, target = src)) if(terminal && panel_open) if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal, 1, TRUE)) // Animate the electrocution if uncautious and unlucky do_sparks(5, TRUE, src) - return + return ITEM_INTERACT_COMPLETE // Returns wires on deletion of the terminal new /obj/item/stack/cable_coil(T, 10) @@ -215,11 +215,11 @@ "You cut the cables and dismantle the power terminal.") inputting = FALSE // Set input FALSE when the terminal no longer exists qdel(terminal) - return + return ITEM_INTERACT_COMPLETE // Crowbarring it ! - if(default_deconstruction_crowbar(user, I)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 1a02c79f3552..be5694f1bf67 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -580,7 +580,8 @@ /// Used by red ERT. Keeps the size for them /obj/item/ammo_box/magazine/laser/ert name = "compact laser carbine projector magazine" - desc = "By use of bluespace technology, the ammo casings are stored in a pocket dimension, saving on space and making them EMP proof." + desc = "An ultra-compact magazine incorporating experimental bluespace technology to hold 20 rounds in a mag the size of a cigarette lighter, while keeping them safe from EMPs. Each magazine costs as much as 5 of the carbines that use it, \ + but nobody's accused NT budget allocation of being practical before." w_class = WEIGHT_CLASS_TINY /obj/item/ammo_box/magazine/laser/ert/emp_act(severity) diff --git a/code/modules/projectiles/guns/chaos_bolt.dm b/code/modules/projectiles/guns/chaos_bolt.dm index e53e3510adaf..6f56dacd7d0a 100644 --- a/code/modules/projectiles/guns/chaos_bolt.dm +++ b/code/modules/projectiles/guns/chaos_bolt.dm @@ -148,7 +148,7 @@ explosion(get_turf(H), 1, 1, 1, cause = "staff of chaos lethal explosion effect") if("cheese morphed") H.visible_message("[H] transforms into cheese!", "You've been transformed into cheese!") - new /obj/item/food/cheesewedge(get_turf(H)) + new /obj/item/food/sliced/cheesewedge(get_turf(H)) qdel(H) if("supermattered") var/obj/machinery/atmospherics/supermatter_crystal/supercrystal = GLOB.main_supermatter_engine @@ -323,7 +323,7 @@ if("toy revolver") item_to_summon = /obj/item/gun/projectile/revolver/capgun/chaosprank if("cheese") - item_to_summon = /obj/item/food/cheesewedge + item_to_summon = /obj/item/food/sliced/cheesewedge explosion_amount = rand(5, 10) if("food") target.visible_message("Food scatters around [target]!", "A bunch of food scatters around you!") diff --git a/code/modules/projectiles/guns/energy/special_eguns.dm b/code/modules/projectiles/guns/energy/special_eguns.dm index 252465c2c8df..ab0268275a12 100644 --- a/code/modules/projectiles/guns/energy/special_eguns.dm +++ b/code/modules/projectiles/guns/energy/special_eguns.dm @@ -357,7 +357,7 @@ P.precision = 0 P.failchance = 0 P.can_multitool_to_remove = 1 - if(W.name == "bluespace beam") + if(W.name == "wormhole beam") qdel(blue) blue = P else diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm index e0f6359abfd5..042ed7036b61 100644 --- a/code/modules/projectiles/guns/energy/telegun.dm +++ b/code/modules/projectiles/guns/energy/telegun.dm @@ -2,7 +2,7 @@ /obj/item/gun/energy/telegun name = "teleporter gun" - desc = "An extremely high-tech bluespace energy gun capable of teleporting targets to Bluespace Beacons." + desc = "An extremely high-tech energy gun that utilizes jury-rigged bluespace technology to teleport away living targets." icon_state = "telegun" item_state = "telegun" origin_tech = "combat=6;materials=7;powerstorage=5;bluespace=5;syndicate=4" diff --git a/code/modules/projectiles/projectile/magic_projectiles.dm b/code/modules/projectiles/projectile/magic_projectiles.dm index 4f9cca59c058..f9ff52c7b03a 100644 --- a/code/modules/projectiles/projectile/magic_projectiles.dm +++ b/code/modules/projectiles/projectile/magic_projectiles.dm @@ -172,8 +172,6 @@ /obj/item/projectile/magic/door/on_hit(atom/target) . = ..() - if(!.) - return . var/atom/T = target.loc if(isturf(target) && target.density) if(!(istype(target, /turf/simulated/wall/indestructible))) diff --git a/code/modules/projectiles/projectile/special_projectiles.dm b/code/modules/projectiles/projectile/special_projectiles.dm index 4e2aa0d68876..a33f148c00ec 100644 --- a/code/modules/projectiles/projectile/special_projectiles.dm +++ b/code/modules/projectiles/projectile/special_projectiles.dm @@ -181,7 +181,7 @@ qdel(src) /obj/item/projectile/beam/wormhole - name = "bluespace beam" + name = "wormhole beam" icon_state = "spark" hitsound = "sparks" damage = 0 @@ -190,7 +190,7 @@ nodamage = TRUE /obj/item/projectile/beam/wormhole/orange - name = "orange bluespace beam" + name = "orange wormhole beam" color = "#FF6600" /obj/item/projectile/beam/wormhole/New(obj/item/ammo_casing/energy/wormhole/casing) diff --git a/code/modules/projectiles/projectile_base.dm b/code/modules/projectiles/projectile_base.dm index 8d8603f0dccf..57d2a23083ea 100644 --- a/code/modules/projectiles/projectile_base.dm +++ b/code/modules/projectiles/projectile_base.dm @@ -326,7 +326,7 @@ picked_mob.bullet_act(src, def_zone) qdel(src) -/obj/item/projectile/Process_Spacemove(movement_dir = 0) +/obj/item/projectile/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 1 //Bullets don't drift in space /obj/item/projectile/process() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index c96ea19803e3..d5c6664fa692 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -234,35 +234,35 @@ add_fingerprint(usr) -/obj/machinery/chem_dispenser/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/part_replacer)) +/obj/machinery/chem_dispenser/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) . = ..() SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE - if((istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/drinks)) && user.a_intent != INTENT_HARM) + if((istype(used, /obj/item/reagent_containers/glass) || istype(used, /obj/item/reagent_containers/drinks)) && user.a_intent != INTENT_HARM) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "[I] is stuck to you!") - return + to_chat(user, "[used] is stuck to you!") + return ITEM_INTERACT_COMPLETE - I.forceMove(src) + used.forceMove(src) if(beaker) - to_chat(usr, "You swap [I] with [beaker].") + to_chat(usr, "You swap [used] with [beaker].") if(Adjacent(usr) && !issilicon(usr)) //Prevents telekinesis from putting in hand user.put_in_hands(beaker) else beaker.forceMove(loc) else - to_chat(user, "You set [I] on the machine.") - beaker = I + to_chat(user, "You set [used] on the machine.") + beaker = used SStgui.update_uis(src) // update all UIs attached to src update_icon(UPDATE_ICON_STATE) - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index ecfb026025bf..e70641c9b119 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -62,22 +62,22 @@ else stat |= NOPOWER -/obj/machinery/chem_heater/attackby__legacy__attackchain(obj/item/I, mob/user) - if(istype(I, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) +/obj/machinery/chem_heater/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "[I] is stuck to you!") - return + to_chat(user, "[used] is stuck to you!") + return ITEM_INTERACT_COMPLETE - beaker = I - I.forceMove(src) + beaker = used + used.forceMove(src) to_chat(user, "You add the beaker to the machine!") icon_state = "mixer1b" SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 8aba2a20252f..8c138aec169e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -114,45 +114,49 @@ return update_icon() -/obj/machinery/chem_master/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/part_replacer)) +/obj/machinery/chem_master/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) return ..() if(panel_open) to_chat(user, "You can't use [src] while it's panel is opened!") - return TRUE + return ITEM_INTERACT_COMPLETE - if((istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/drinks/drinkingglass)) && user.a_intent != INTENT_HARM) + if((istype(used, /obj/item/reagent_containers/glass) || istype(used, /obj/item/reagent_containers/drinks/drinkingglass)) && user.a_intent != INTENT_HARM) if(!user.drop_item()) - to_chat(user, "[I] is stuck to you!") - return + to_chat(user, "[used] is stuck to you!") + return ITEM_INTERACT_COMPLETE - I.forceMove(src) + used.forceMove(src) if(beaker) - to_chat(usr, "You swap [I] with [beaker] inside.") + to_chat(usr, "You swap [used] with [beaker] inside.") if(Adjacent(usr) && !issilicon(usr)) //Prevents telekinesis from putting in hand user.put_in_hands(beaker) else beaker.forceMove(loc) else - to_chat(user, "You add [I] to the machine.") - beaker = I + to_chat(user, "You add [used] to the machine.") + beaker = used SStgui.update_uis(src) update_icon() - else if(istype(I, /obj/item/storage/pill_bottle)) + return ITEM_INTERACT_COMPLETE + + else if(istype(used, /obj/item/storage/pill_bottle)) if(loaded_pill_bottle) to_chat(user, "A [loaded_pill_bottle] is already loaded into the machine.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "[I] is stuck to you!") - return + to_chat(user, "[used] is stuck to you!") + return ITEM_INTERACT_COMPLETE - loaded_pill_bottle = I - I.forceMove(src) - to_chat(user, "You add [I] into the dispenser slot!") + loaded_pill_bottle = used + used.forceMove(src) + to_chat(user, "You add [used] into the dispenser slot!") SStgui.update_uis(src) + return ITEM_INTERACT_COMPLETE + else return ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 6c48a64024e3..1151e4e24648 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -383,24 +383,26 @@ /obj/machinery/computer/pandemic/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/computer/pandemic/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(default_unfasten_wrench(user, I, time = 4 SECONDS)) +/obj/machinery/computer/pandemic/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(default_unfasten_wrench(user, used, time = 4 SECONDS)) power_change() return - if((istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER)) && user.a_intent != INTENT_HARM) + if((istype(used, /obj/item/reagent_containers) && (used.container_type & OPENCONTAINER)) && user.a_intent != INTENT_HARM) if(stat & (NOPOWER|BROKEN)) - return + return ITEM_INTERACT_COMPLETE if(beaker) to_chat(user, "A beaker is already loaded into the machine!") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return + return ITEM_INTERACT_COMPLETE - beaker = I + beaker = used beaker.loc = src to_chat(user, "You add the beaker to the machine.") SStgui.update_uis(src, TRUE) icon_state = "pandemic1" + + return ITEM_INTERACT_COMPLETE else return ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 77cbb7b36112..47081c7aca9b 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -70,7 +70,7 @@ /obj/item/food/grown/citrus/orange = list("orangejuice" = 0), /obj/item/food/grown/citrus/lime = list("limejuice" = 0), /obj/item/food/grown/watermelon = list("watermelonjuice" = 0), - /obj/item/food/watermelonslice = list("watermelonjuice" = 0), + /obj/item/food/sliced/watermelon = list("watermelonjuice" = 0), /obj/item/food/grown/berries/poison = list("poisonberryjuice" = 0), /obj/item/food/grown/pumpkin/blumpkin = list("blumpkinjuice" = 0), // Order is important here as blumpkin is a subtype of pumpkin, if switched blumpkins will produce pumpkin juice /obj/item/food/grown/pumpkin = list("pumpkinjuice" = 0), @@ -157,44 +157,44 @@ return default_unfasten_wrench(user, I) -/obj/machinery/reagentgrinder/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/storage/part_replacer)) - ..() +/obj/machinery/reagentgrinder/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) + . = ..() SStgui.update_uis(src) - return + return ITEM_INTERACT_COMPLETE - if((istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER)) && user.a_intent != INTENT_HARM) + if((istype(used, /obj/item/reagent_containers) && (used.container_type & OPENCONTAINER)) && user.a_intent != INTENT_HARM) if(beaker) to_chat(user, "There's already a container inside.") else if(panel_open) to_chat(user, "Close the maintenance panel first.") else if(!user.drop_item()) - return FALSE + return ITEM_INTERACT_COMPLETE - beaker = I + beaker = used beaker.loc = src update_icon(UPDATE_ICON_STATE) SStgui.update_uis(src) - return TRUE // No afterattack + return ITEM_INTERACT_COMPLETE - if(is_type_in_list(I, dried_items)) - if(istype(I, /obj/item/food/grown)) - var/obj/item/food/grown/G = I + if(is_type_in_list(used, dried_items)) + if(istype(used, /obj/item/food/grown)) + var/obj/item/food/grown/G = used if(!G.dry) to_chat(user, "You must dry that first!") - return FALSE + return ITEM_INTERACT_COMPLETE if(length(holdingitems) >= limit) to_chat(usr, "The machine cannot hold anymore items.") - return FALSE + return ITEM_INTERACT_COMPLETE // Fill machine with a bag! - if(istype(I, /obj/item/storage/bag)) - var/obj/item/storage/bag/B = I + if(istype(used, /obj/item/storage/bag)) + var/obj/item/storage/bag/B = used if(!length(B.contents)) to_chat(user, "[B] is empty.") - return FALSE + return ITEM_INTERACT_COMPLETE var/original_contents_len = length(B.contents) @@ -208,7 +208,7 @@ if(length(B.contents) == original_contents_len) to_chat(user, "Nothing in [B] can be put into the All-In-One grinder.") - return FALSE + return ITEM_INTERACT_COMPLETE else if(!length(B.contents)) to_chat(user, "You empty all of [B]'s contents into the All-In-One grinder.") @@ -216,20 +216,22 @@ to_chat(user, "You empty some of [B]'s contents into the All-In-One grinder.") SStgui.update_uis(src) - return TRUE + return ITEM_INTERACT_COMPLETE - if(!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items)) + if(!is_type_in_list(used, blend_items) && !is_type_in_list(used, juice_items)) if(user.a_intent == INTENT_HARM) return ..() else to_chat(user, "Cannot refine into a reagent!") - return TRUE + return ITEM_INTERACT_COMPLETE if(user.drop_item()) - I.loc = src - holdingitems += I + used.loc = src + holdingitems += used SStgui.update_uis(src) - return FALSE + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/reagentgrinder/attack_ai(mob/user) return FALSE diff --git a/code/modules/reagents/chemistry/reagents/admin_reagents.dm b/code/modules/reagents/chemistry/reagents/admin_reagents.dm index 6f6fe190d063..29eee26a2e62 100644 --- a/code/modules/reagents/chemistry/reagents/admin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/admin_reagents.dm @@ -31,7 +31,6 @@ M.CureMute() M.CureDeaf() M.CureEpilepsy() - M.CureTourettes() M.CureCoughing() M.CureNervous() M.SetEyeBlurry(0) diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index aaa372576e5f..061e0a82471e 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -822,14 +822,14 @@ /datum/reagent/consumable/ethanol/singulo name = "Singulo" id = "singulo" - description = "A bluespace beverage!" + description = "The edge of eternity, contained in a glass." reagent_state = LIQUID color = "#2E6671" // rgb: 46, 102, 113 dizzy_adj = 30 SECONDS alcohol_perc = 0.7 drink_icon = "singulo" drink_name = "Singulo" - drink_desc = "A bluespace beverage." + drink_desc = "The edge of eternity, contained in a glass." taste_description = "infinity" goal_difficulty = REAGENT_GOAL_NORMAL diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index f97531602bdc..9e917f8ff719 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -635,7 +635,7 @@ /datum/reagent/consumable/cheese/reaction_turf(turf/T, volume) if(volume >= 5 && !isspaceturf(T)) - new /obj/item/food/cheesewedge/presliced(T) + new /obj/item/food/sliced/cheesewedge(T) /datum/reagent/consumable/fake_cheese name = "Cheese substitute" @@ -925,7 +925,7 @@ /datum/reagent/consumable/bread/reaction_turf(turf/T, volume) if(volume >= 5 && !isspaceturf(T)) - new /obj/item/food/breadslice(T) + new /obj/item/food/sliced/bread(T) /datum/reagent/soap name = "Soap" diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 1c7dfebce304..8c166fc97695 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -969,41 +969,27 @@ if(iscarbon(M)) if(method == REAGENT_INGEST || (method == REAGENT_TOUCH && prob(25))) if(M.stat == DEAD) + if(M.suiciding) // Feedback if the player suicided. + M.visible_message("[M] twitches slightly, but appears to have no will to live!") + return + if(HAS_TRAIT(M, TRAIT_HUSK) || HAS_TRAIT(M, TRAIT_BADDNA)) // Feedback if the body is husked or has bad DNA. + M.visible_message("[M] twitches slightly, but is otherwise unresponsive!") + return if(M.getBruteLoss() + M.getFireLoss() + M.getCloneLoss() >= 150) - if(IS_CHANGELING(M) || HAS_TRAIT(M, TRAIT_I_WANT_BRAINS)) + if(IS_CHANGELING(M) || HAS_TRAIT(M, TRAIT_I_WANT_BRAINS) || !M.ghost_can_reenter()) + M.visible_message("[M] twitches slightly, but nothing happens.") return M.delayed_gib(TRUE) return - if(!M.ghost_can_reenter()) - M.visible_message("[M] twitches slightly, but is otherwise unresponsive!") - return + M.visible_message("[M]'s body begins to twitch as the Lazarus Reagent takes effect!") + M.do_jitter_animation(300) // Visual feedback of lazarus working. + var/mob/dead/observer/G = M.get_ghost() + if(G) + to_chat(G, "Lazarus Reagent is attempting to revive your body. Re-enter your body to be revived! (Verbs -> Ghost -> Re-enter corpse)") + window_flash(G.client) + SEND_SOUND(G, sound('sound/effects/genetics.ogg')) + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, lazrevival), M), 5 SECONDS) // same time as the defib to keep things consistant. - if(!M.suiciding && !HAS_TRAIT(M, TRAIT_HUSK) && !HAS_TRAIT(M, TRAIT_BADDNA)) - M.visible_message("[M] seems to rise from the dead!") - M.adjustCloneLoss(50) - M.setOxyLoss(0) - M.adjustBruteLoss(rand(0, 15)) - M.adjustToxLoss(rand(0, 15)) - M.adjustFireLoss(rand(0, 15)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/necrosis_prob = 15 * H.decaylevel - H.decaylevel = 0 - for(var/obj/item/organ/O in (H.bodyparts | H.internal_organs)) - // Per non-vital body part: - // 15% * H.decaylevel (1 to 4) - // Min of 0%, Max of 60% - if(prob(necrosis_prob) && !O.is_robotic() && !O.vital) - // side effects may include: Organ failure - O.necrotize(FALSE) - if(O.status & ORGAN_DEAD) - O.germ_level = INFECTION_LEVEL_THREE - H.update_body() - - M.grab_ghost() - M.update_revive() - add_attack_logs(M, M, "Revived with lazarus reagent") //Yes, the logs say you revived yourself. - SSblackbox.record_feedback("tally", "players_revived", 1, "lazarus_reagent") ..() /datum/reagent/medicine/sanguine_reagent diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index b2f83faccacf..f0879389dc89 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -150,21 +150,21 @@ var/list/blocked = list( /obj/item/food, - /obj/item/food/breadslice, + /obj/item/food/sliced/bread, /obj/item/food/sliceable, /obj/item/food/sliceable/pizza, - /obj/item/food/margheritapizzaslice, - /obj/item/food/meatpizzaslice, - /obj/item/food/mushroompizzaslice, - /obj/item/food/vegetablepizzaslice, - /obj/item/food/cheesepizzaslice, - /obj/item/food/garlicpizzaslice, - /obj/item/food/donkpocketpizzaslice, - /obj/item/food/dankpizzaslice, - /obj/item/food/macpizzaslice, - /obj/item/food/firecrackerpizzaslice, - /obj/item/food/pestopizzaslice, - /obj/item/food/pepperonipizzaslice, + /obj/item/food/sliced/margherita_pizza, + /obj/item/food/sliced/meat_pizza, + /obj/item/food/sliced/mushroom_pizza, + /obj/item/food/sliced/vegetable_pizza, + /obj/item/food/sliced/cheese_pizza, + /obj/item/food/sliced/garlic_pizza, + /obj/item/food/sliced/donk_pocket_pizza, + /obj/item/food/sliced/dank_pizza, + /obj/item/food/sliced/mac_pizza, + /obj/item/food/sliced/fire_cracker_pizza, + /obj/item/food/sliced/pesto_pizza, + /obj/item/food/sliced/pepperoni_pizza, /obj/item/food/meat, /obj/item/food/meat/slab, /obj/item/food/grown, diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 41feae4ddfe5..300fc2ee4112 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -270,7 +270,7 @@ /obj/item/reagent_containers/glass/beaker/bluespace name = "bluespace beaker" - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete." + desc = "A bleeding-edge beaker that uses experimental bluespace technology to store massive quantities of liquid." icon_state = "beakerbluespace" materials = list(MAT_GLASS=3000) volume = 300 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index b639acd9ad15..9ca16326b7fe 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -77,23 +77,14 @@ /obj/item/reagent_containers/spray/proc/spray(atom/A) - var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) - D.create_reagents(amount_per_transfer_from_this) - reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_currentrange) - D.icon += mix_color_from_reagents(D.reagents.reagent_list) - - for(var/i in 1 to spray_currentrange) - if(!step_towards(D, A) && i != 1) - qdel(D) - return - D.reagents.reaction(get_turf(D)) - for(var/atom/T in get_turf(D)) - D.reagents.reaction(T) - sleep(3) - if(QDELETED(D)) - return - qdel(D) - + var/obj/effect/decal/chempuff/chem_puff = new /obj/effect/decal/chempuff(get_turf(src)) + chem_puff.create_reagents(amount_per_transfer_from_this) + reagents.trans_to(chem_puff, amount_per_transfer_from_this, 1/spray_currentrange) + chem_puff.icon += mix_color_from_reagents(chem_puff.reagents.reagent_list) + + var/datum/move_loop/our_loop = GLOB.move_manager.move_towards_legacy(chem_puff, A, 3 DECISECONDS, timeout = spray_currentrange * 3 DECISECONDS, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) + chem_puff.RegisterSignal(our_loop, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/obj/effect/decal/chempuff, loop_ended)) + chem_puff.RegisterSignal(our_loop, COMSIG_MOVELOOP_POSTPROCESS, TYPE_PROC_REF(/obj/effect/decal/chempuff, check_move)) /obj/item/reagent_containers/spray/attack_self__legacy__attackchain(mob/user) diff --git a/code/modules/recycling/belt-placer.dm b/code/modules/recycling/belt-placer.dm index 739ff0274d54..dbc357bea316 100644 --- a/code/modules/recycling/belt-placer.dm +++ b/code/modules/recycling/belt-placer.dm @@ -17,7 +17,7 @@ /obj/item/storage/conveyor/bluespace name = "bluespace conveyor belt placer" - desc = "This device facilitates the rapid deployment of conveyor belts. It utilises bluespace in order to hold many more belts than its regular counterpart." + desc = "This device facilitates the rapid deployment of conveyor belts via the incorporation of experimental Bluespace technology." icon_state = "bluespace_belt_placer" item_state = "bluespace_belt_placer" w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 03755059d7c7..d7b27718888e 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -57,29 +57,28 @@ GLOBAL_LIST_EMPTY(conveyor_switches) update_move_direction() // attack with item, place item on conveyor -/obj/machinery/conveyor/attackby__legacy__attackchain(obj/item/I, mob/user) +/obj/machinery/conveyor/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(stat & BROKEN) return ..() - if(istype(I, /obj/item/conveyor_switch_construct)) - var/obj/item/conveyor_switch_construct/S = I + if(istype(used, /obj/item/conveyor_switch_construct)) + var/obj/item/conveyor_switch_construct/S = used if(S.id == id) return ..() for(var/obj/machinery/conveyor_switch/CS in GLOB.conveyor_switches) if(CS.id == id) CS.conveyors -= src id = S.id - to_chat(user, "You link [I] with [src].") - return + to_chat(user, "You link [used] with [src].") + return ITEM_INTERACT_COMPLETE if(user.a_intent == INTENT_HELP) if(user.drop_item()) - I.forceMove(loc) - return + used.forceMove(loc) + return ITEM_INTERACT_COMPLETE return ..() - /obj/machinery/conveyor/crowbar_act(mob/user, obj/item/I) . = TRUE if(!I.use_tool(src, user, 0, volume = I.tool_volume)) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 33a01ea0c848..072a0750826b 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -123,23 +123,23 @@ disposal.update() // attack by item places it in to disposal -/obj/machinery/disposal/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(stat & BROKEN || !user || I.flags & ABSTRACT) - return +/obj/machinery/disposal/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(stat & BROKEN || !user || used.flags & ABSTRACT) + return ITEM_INTERACT_COMPLETE if(user.a_intent != INTENT_HELP) return ..() src.add_fingerprint(user) - if(istype(I, /obj/item/melee/energy/blade)) + if(istype(used, /obj/item/melee/energy/blade)) to_chat(user, "You can't place that item inside the disposal unit.") - return + return ITEM_INTERACT_COMPLETE - if(isstorage(I)) - var/obj/item/storage/S = I + if(isstorage(used)) + var/obj/item/storage/S = used if(!S.removal_allowed_check(user)) - return + return ITEM_INTERACT_COMPLETE if((S.allow_quick_empty || S.allow_quick_gather) && length(S.contents)) S.hide_from(user) @@ -152,15 +152,15 @@ S.remove_from_storage(O, src) S.update_icon() // For content-sensitive icons update() - return + return ITEM_INTERACT_COMPLETE // Borg using their gripper to throw stuff away. - if(istype(I, /obj/item/gripper/)) - var/obj/item/gripper/gripper = I + if(istype(used, /obj/item/gripper)) + var/obj/item/gripper/gripper = used // Gripper is empty. if(!gripper.gripped_item) to_chat(user, "There's nothing in your gripper to throw away!") - return + return ITEM_INTERACT_COMPLETE gripper.gripped_item.forceMove(src) user.visible_message( @@ -168,14 +168,14 @@ "You place [gripper.gripped_item] into the disposal unit.", "You hear someone dropping something into a disposal unit." ) - return + return ITEM_INTERACT_COMPLETE // Someone has a mob in a grab. - var/obj/item/grab/G = I + var/obj/item/grab/G = used if(istype(G)) // If there's not actually a mob in the grab, stop it. Get some help. if(!ismob(G.affecting)) - return + return ITEM_INTERACT_COMPLETE var/mob/GM = G.affecting user.visible_message( @@ -186,7 +186,7 @@ // Abort if the target manages to scurry away. if(!do_after(user, 2 SECONDS, target = GM)) - return + return ITEM_INTERACT_COMPLETE GM.forceMove(src) user.visible_message( @@ -197,20 +197,22 @@ qdel(G) update() add_attack_logs(user, GM, "Disposal'ed", !GM.ckey ? null : ATKLOG_ALL) - return + return ITEM_INTERACT_COMPLETE - if(!user.drop_item() || QDELETED(I)) - return + if(!user.drop_item() || QDELETED(used)) + return ITEM_INTERACT_COMPLETE // If we're here, it's an item without any special interactions, drop it in the bin without any further delay. - I.forceMove(src) + used.forceMove(src) user.visible_message( - "[user] places [I] into the disposal unit.", - "You place [I] into the disposal unit.", + "[user] places [used] into the disposal unit.", + "You place [used] into the disposal unit.", "You hear someone dropping something into a disposal unit." ) update() + return ITEM_INTERACT_COMPLETE + /obj/machinery/disposal/screwdriver_act(mob/user, obj/item/I) if(mode != DISPOSALS_OFF) // It's on to_chat(user, "You need to turn the disposal unit off first!") diff --git a/code/modules/research/backup_console.dm b/code/modules/research/backup_console.dm index 8a14054b344f..b65126c16a59 100644 --- a/code/modules/research/backup_console.dm +++ b/code/modules/research/backup_console.dm @@ -38,21 +38,20 @@ SStgui.update_uis(src) -/obj/machinery/computer/rnd_backup/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(istype(O, /obj/item/disk/rnd_backup_disk) && istype(user, /mob/living/carbon/human)) +/obj/machinery/computer/rnd_backup/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/disk/rnd_backup_disk) && istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(!H.drop_item_to_ground(O)) - return TRUE + if(!H.drop_item_to_ground(used)) + return ITEM_INTERACT_COMPLETE - O.forceMove(src) - inserted_disk = O - to_chat(user, "You insert [O] into [src].") + used.forceMove(src) + inserted_disk = used + to_chat(user, "You insert [used] into [src].") SStgui.update_uis(src) - return TRUE + return ITEM_INTERACT_COMPLETE return ..() - /obj/machinery/computer/rnd_backup/proc/eject_disk() if(!inserted_disk) return diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 1b07264d9e9f..f7fd4e682cf4 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -74,16 +74,16 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). return round(A / max(1, (all_materials[M] * efficiency_coeff))) -/obj/machinery/r_n_d/circuit_imprinter/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/storage/part_replacer)) +/obj/machinery/r_n_d/circuit_imprinter/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) return ..() if(panel_open) to_chat(user, "You can't load [src] while it's opened.") - return + return ITEM_INTERACT_COMPLETE - if(O.is_open_container()) - return FALSE + if(used.is_open_container()) + return ITEM_INTERACT_SKIP_TO_AFTER_ATTACK return ..() diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index f01a8d1c1a02..41e9955e16e6 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -963,6 +963,7 @@ materials = list(MAT_METAL = 40000) build_path = /obj/item/golem_shell category = list("Imported") + requires_whitelist = TRUE /datum/design/desk_bell name = "Desk Bell" diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index 6c54e8cb5838..23b1b88ada94 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -23,7 +23,7 @@ /datum/design/bluespace_belt name = "Belt of Holding" - desc = "An astonishingly complex belt popularized by a rich bluespace technology magnate." + desc = "A bleeding-edge storage medium that brings the principles first used in the Bag of Holding to belt form." id = "bluespace_belt" req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 6, "plasmatech" = 6) build_type = PROTOLATHE @@ -53,7 +53,7 @@ /datum/design/bluespace_belt_holder name = "Bluespace Conveyor Belt Placer" - desc = "This device facilitates the rapid deployment of conveyor belts. This one is powered by bluespace." + desc = "This device facilitates the rapid deployment of conveyor belts via the incorporation of experimental Bluespace technology." id = "bluespace_belt_holder" req_tech = list("materials" = 1, "engineering" = 3, "bluespace" = 3) build_type = PROTOLATHE diff --git a/code/modules/research/designs/janitorial_designs.dm b/code/modules/research/designs/janitorial_designs.dm index f744f2d02b34..3b32f4dad3c7 100644 --- a/code/modules/research/designs/janitorial_designs.dm +++ b/code/modules/research/designs/janitorial_designs.dm @@ -13,7 +13,7 @@ /datum/design/blutrash name = "Trash Bag of Holding" - desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." + desc = "An advanced trash bag that uses experimental Bluespace technology to send stored trash to a specialized pocket dimension." id = "blutrash" req_tech = list("materials" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 3) build_type = PROTOLATHE diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index 892f821b1165..2c76444b9897 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -242,7 +242,7 @@ /datum/design/bs_rped name = "Bluespace RPED" - desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first." + desc = "Incorporating experimental bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first." id = "bs_rped" req_tech = list("engineering" = 4, "bluespace" = 3) build_type = PROTOLATHE diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index ad5848af1257..3bb2d514ce9f 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -76,22 +76,22 @@ Note: Must be placed west/left of and R&D console to function. A = A / max(1, (being_built.materials[M] * efficiency_coeff)) return A -/obj/machinery/r_n_d/protolathe/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/storage/part_replacer)) +/obj/machinery/r_n_d/protolathe/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer)) return ..() - if(default_deconstruction_screwdriver(user, "protolathe_t", "protolathe", O)) + if(default_deconstruction_screwdriver(user, "protolathe_t", "protolathe", used)) if(linked_console) linked_console.linked_lathe = null linked_console = null - return FALSE + return ITEM_INTERACT_COMPLETE if(panel_open) to_chat(user, "You can't load [src] while it's opened.") - return TRUE + return ITEM_INTERACT_COMPLETE - if(O.is_open_container()) - return FALSE + if(used.is_open_container()) + return ITEM_INTERACT_SKIP_TO_AFTER_ATTACK return ..() diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index db9a789b5313..da32688bf523 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -179,27 +179,26 @@ won't update every console in existence) but it's more of a hassle to do. Also, wait_message_timer = 0 return ..() -/obj/machinery/computer/rdconsole/attackby__legacy__attackchain(obj/item/D as obj, mob/user as mob, params) - +/obj/machinery/computer/rdconsole/item_interaction(mob/living/user, obj/item/used, list/modifiers) //Loading a disk into it. - if(istype(D, /obj/item/disk)) + if(istype(used, /obj/item/disk)) if(t_disk || d_disk) to_chat(user, "A disk is already loaded into the machine.") - return + return ITEM_INTERACT_COMPLETE - if(istype(D, /obj/item/disk/tech_disk)) t_disk = D - else if(istype(D, /obj/item/disk/design_disk)) d_disk = D + if(istype(used, /obj/item/disk/tech_disk)) t_disk = used + else if(istype(used, /obj/item/disk/design_disk)) d_disk = used else to_chat(user, "Machine cannot accept disks in that format.") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - return - D.loc = src + return ITEM_INTERACT_COMPLETE + used.loc = src to_chat(user, "You add the disk to the machine!") else if(!(linked_analyzer && linked_analyzer.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy)) - ..() + return ..() + SStgui.update_uis(src) - return /obj/machinery/computer/rdconsole/emag_act(user as mob) if(!emagged) @@ -496,6 +495,19 @@ won't update every console in existence) but it's more of a hassle to do. Also, return TRUE + if("maxresearch") + if(!check_rights(R_ADMIN)) + return + if(!network_manager_uid) + return + var/choice = tgui_alert(ui.user, "Are you sure you want to maximize research levels?", "Confirmation", list("Yes", "No")) + if(choice == "Yes") + log_admin("[key_name(ui.user)] has maximized the research levels at network [network_manager_uid].") + message_admins("[key_name_admin(ui.user)] has maximized the research levels at network [network_manager_uid].") + maximize() + + return TRUE + // You should only be able to link if its not linked, to prevent weirdness if("linktonetworkcontroller") if(network_manager_uid) @@ -746,6 +758,14 @@ won't update every console in existence) but it's more of a hassle to do. Also, network_manager_uid = null SStgui.update_uis(src) +/obj/machinery/computer/rdconsole/proc/maximize() + var/datum/research/files = get_files() + if(!files) + return + for(var/T in files.known_tech) + files.UpdateTech(T, 8) + SStgui.update_uis(src) + /obj/machinery/computer/rdconsole/attack_hand(mob/user) if(..()) return 1 @@ -874,6 +894,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, data["linked"] = TRUE files.RefreshResearch() + data["admin"] = check_rights(R_ADMIN, FALSE, user) data["menu"] = menu data["submenu_protolathe"] = submenu_protolathe data["submenu_imprinter"] = submenu_imprinter diff --git a/code/modules/research/scientific_analyzer.dm b/code/modules/research/scientific_analyzer.dm index 333cd5d0a3d6..65c52632f387 100644 --- a/code/modules/research/scientific_analyzer.dm +++ b/code/modules/research/scientific_analyzer.dm @@ -48,50 +48,53 @@ Note: Must be placed within 3 tiles of the R&D Console return temp_list -/obj/machinery/r_n_d/scientific_analyzer/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/storage/part_replacer)) +/obj/machinery/r_n_d/scientific_analyzer/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/storage/part_replacer) || istype(used, /obj/item/gripper)) return ..() - if(default_deconstruction_screwdriver(user, "s_analyzer_t", "s_analyzer", O)) + if(default_deconstruction_screwdriver(user, "s_analyzer_t", "s_analyzer", used)) if(linked_console) linked_console.linked_analyzer = null linked_console = null - return + return ITEM_INTERACT_COMPLETE - if(exchange_parts(user, O)) - return + // TODO: Almost positive this doesn't need to do the same exchange parts shit as /obj/machinery + if(exchange_parts(user, used)) + return ITEM_INTERACT_COMPLETE - if(default_deconstruction_crowbar(user, O)) - return + if(default_deconstruction_crowbar(user, used)) + return ITEM_INTERACT_COMPLETE if(!linked_console) to_chat(user, "[src] must be linked to an R&D console first!") - return + return ITEM_INTERACT_COMPLETE if(busy) to_chat(user, "[src] is busy right now.") - return + return ITEM_INTERACT_COMPLETE - if(isitem(O) && !loaded_item) - if(!O.origin_tech) + if(isitem(used) && !loaded_item) + if(!used.origin_tech) to_chat(user, "This doesn't seem to have a tech origin!") - return + return ITEM_INTERACT_COMPLETE - var/list/temp_tech = ConvertReqString2List(O.origin_tech) + var/list/temp_tech = ConvertReqString2List(used.origin_tech) if(length(temp_tech) == 0) to_chat(user, "You cannot deconstruct this item!") - return + return ITEM_INTERACT_COMPLETE if(!user.drop_item()) - to_chat(user, "[O] is stuck to your hand, you cannot put it in [src]!") - return + to_chat(user, "[used] is stuck to your hand, you cannot put it in [src]!") + return ITEM_INTERACT_COMPLETE busy = TRUE - loaded_item = O - O.loc = src - to_chat(user, "You add [O] to [src]!") + loaded_item = used + used.loc = src + to_chat(user, "You add [used] to [src]!") SStgui.update_uis(linked_console) flick("s_analyzer_la", src) spawn(10) icon_state = "s_analyzer_l" busy = FALSE + + return ITEM_INTERACT_COMPLETE diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 84a60c49cf08..e33810f4398f 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -149,21 +149,21 @@ return return ..() -/obj/machinery/computer/camera_advanced/xenobio/attackby__legacy__attackchain(obj/item/O, mob/user, params) - if(istype(O, /obj/item/food/monkeycube)) +/obj/machinery/computer/camera_advanced/xenobio/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/food/monkeycube)) if(user.drop_item()) monkeys++ - to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") - qdel(O) - return - else if(istype(O, /obj/item/slimepotion/slime)) + to_chat(user, "You feed [used] to [src]. It now has [monkeys] monkey cubes stored.") + qdel(used) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/slimepotion/slime)) if(!user.drop_item()) - return - to_chat(user, "You load [O] in the console's potion slot[current_potion ? ", replacing the one that was there before" : ""].") - insert_potion(O, user) - return - else if(istype(O, /obj/item/storage/bag) || istype(O, /obj/item/storage/box)) - var/obj/item/storage/P = O + return ITEM_INTERACT_COMPLETE + to_chat(user, "You load [used] in the console's potion slot[current_potion ? ", replacing the one that was there before" : ""].") + insert_potion(used, user) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/storage/bag) || istype(used, /obj/item/storage/box)) + var/obj/item/storage/P = used var/loaded = 0 for(var/obj/item/food/monkeycube/MC in P.contents) loaded = 1 @@ -171,8 +171,9 @@ P.remove_from_storage(MC) qdel(MC) if(loaded) - to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.") - return + to_chat(user, "You fill [src] with the monkey cubes stored in [used]. [src] now has [monkeys] monkey cubes stored.") + return ITEM_INTERACT_COMPLETE + return ..() /obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/user, obj/item/I) diff --git a/code/modules/ruins/objects_and_mobs/id_upgrader.dm b/code/modules/ruins/objects_and_mobs/id_upgrader.dm index af4fa2906ba8..3e83f63434f2 100644 --- a/code/modules/ruins/objects_and_mobs/id_upgrader.dm +++ b/code/modules/ruins/objects_and_mobs/id_upgrader.dm @@ -8,12 +8,12 @@ /// Have we been used? var/used = FALSE -/obj/machinery/computer/id_upgrader/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/D = I +/obj/machinery/computer/id_upgrader/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/card/id)) + var/obj/item/card/id/D = used if(!length(access_to_give)) to_chat(user, "This machine appears to be configured incorrectly.") - return + return ITEM_INTERACT_COMPLETE var/did_upgrade = FALSE var/list/id_access = D.GetAccess() @@ -29,6 +29,6 @@ else to_chat(user, "Your ID card already has all the access this machine can give.") - return + return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 2a761a0ea1f5..d2c8a3901edc 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -43,34 +43,35 @@ to_chat(user, "The station AI is not to interact with these devices.") return -/obj/machinery/keycard_auth/attackby__legacy__attackchain(obj/item/W, mob/user, params) +/obj/machinery/keycard_auth/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") - return - if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) - if(!check_access(W)) + return ITEM_INTERACT_COMPLETE + if(istype(used, /obj/item/card/id) || istype(used, /obj/item/pda)) + if(!check_access(used)) to_chat(user, "Access denied.") - return + return ITEM_INTERACT_COMPLETE if(user == event_source?.triggered_by) to_chat(user, "Identical body-signature detected. Access denied.") - return + return ITEM_INTERACT_COMPLETE if(active) //This is not the device that made the initial request. It is the device confirming the request. if(!event_source) - return + return ITEM_INTERACT_COMPLETE event_source.confirmed_by = user SStgui.update_uis(event_source) SStgui.update_uis(src) event_source.confirm_and_trigger() reset() - return + return ITEM_INTERACT_COMPLETE if(swiping) if(event == "Emergency Response Team" && !ert_reason) to_chat(user, "Supply a reason for calling the ERT first!") - return + return ITEM_INTERACT_COMPLETE triggered_by = user SStgui.update_uis(src) broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices + return ..() /obj/machinery/keycard_auth/power_change() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 8c41e1778169..31b9cfff3d03 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -36,93 +36,103 @@ if(hijack_announce) . += "It is probably best to fortify your position as to be uninterrupted during the attempt, given the automatic announcements..." -/obj/machinery/computer/emergency_shuttle/attackby__legacy__attackchain(obj/item/card/id/W, mob/user, params) +/obj/machinery/computer/emergency_shuttle/item_interaction(mob/living/user, obj/item/used, list/modifiers) if(stat & (BROKEN|NOPOWER)) return - if(!istype(W, /obj/item/card/id)) + + var/obj/item/card/id/id_card + if(istype(used, /obj/item/card/id)) + id_card = used + else if(istype(used, /obj/item/pda)) + var/obj/item/pda/pda = used + id_card = pda.id + else return + if(SSshuttle.emergency.mode != SHUTTLE_DOCKED && !SSshuttle.emergency.aihacked) return if(!user) return if(SSshuttle.emergency.timeLeft() < 11) return - if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) - if(istype(W, /obj/item/pda)) - var/obj/item/pda/pda = W - W = pda.id - if(!W.access) //no access - to_chat(user, "The access level of [W.registered_name]\'s card is not high enough. ") - return - var/list/cardaccess = W.access - if(!istype(cardaccess, /list) || !length(cardaccess)) //no access - to_chat(user, "The access level of [W.registered_name]\'s card is not high enough. ") - return + if(!id_card.access) //no access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough. ") + return ITEM_INTERACT_COMPLETE + + var/list/cardaccess = id_card.access + if(!istype(cardaccess, /list) || !length(cardaccess)) //no access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough. ") + return ITEM_INTERACT_COMPLETE + + if(!(ACCESS_HEADS in id_card.access)) //doesn't have this access + to_chat(user, "The access level of [id_card.registered_name]\'s card is not high enough. ") + return ITEM_INTERACT_COMPLETE + if(!SSshuttle.emergency.aihacked) + var/choice = tgui_alert(user, "Would you like to (un)authorize a shortened launch time? [auth_need - length(authorized)] authorization\s are still needed. Use abort to cancel all authorizations.", "Shuttle Launch", list("Authorize", "Repeal", "Abort")) + if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != id_card) + return ITEM_INTERACT_COMPLETE + + var/seconds = SSshuttle.emergency.timeLeft() + if(seconds <= 10) + return ITEM_INTERACT_COMPLETE - if(!(ACCESS_HEADS in W.access)) //doesn't have this access - to_chat(user, "The access level of [W.registered_name]\'s card is not high enough. ") - return 0 - if(!SSshuttle.emergency.aihacked) - var/choice = tgui_alert(user, "Would you like to (un)authorize a shortened launch time? [auth_need - length(authorized)] authorization\s are still needed. Use abort to cancel all authorizations.", "Shuttle Launch", list("Authorize", "Repeal", "Abort")) - if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != W) - return 0 - - var/seconds = SSshuttle.emergency.timeLeft() - if(seconds <= 10) - return 0 - - switch(choice) - if("Authorize") - if(!authorized.Find(W.registered_name)) - authorized += W.registered_name - if(auth_need - length(authorized) > 0) - message_admins("[key_name_admin(user)] has authorized early shuttle launch.") - log_game("[key_name(user)] has authorized early shuttle launch in ([x], [y], [z]).") - GLOB.minor_announcement.Announce("[auth_need - length(authorized)] more authorization(s) needed until shuttle is launched early") - else - message_admins("[key_name_admin(user)] has launched the emergency shuttle [seconds] seconds before launch.") - log_game("[key_name(user)] has launched the emergency shuttle in ([x], [y], [z]) [seconds] seconds before launch.") - GLOB.minor_announcement.Announce("The emergency shuttle will launch in 10 seconds") - SSshuttle.emergency.setTimer(10 SECONDS) - - if("Repeal") - if(authorized.Remove(W.registered_name)) - GLOB.minor_announcement.Announce("[auth_need - length(authorized)] authorizations needed until shuttle is launched early") - - if("Abort") - if(length(authorized)) - GLOB.minor_announcement.Announce("All authorizations to launch the shuttle early have been revoked.") - authorized.Cut() - return FALSE - var/choice = tgui_alert(user, "\[ERROR] HOSTILE AI DETECTED IN SHUTTLE CONTROL. RESTORE SHUTTLE CONSOLE TO BACKUP SYSTEM? [auth_need - length(authorized)] AUTHORIZATIONS\s REQUIRED TO RESTORE. ABORT TO REMOVE ALL AUTHORIZATION OF BACKUP RESTORAL, P-P--PLEASE...", "HOSTILE VIRAL AI INTRUSION", list("Authorize", "Repeal", "Abort")) - if(user.get_active_hand() != W) - return FALSE switch(choice) if("Authorize") - if(!authorized.Find(W.registered_name)) - authorized += W.registered_name + if(!authorized.Find(id_card.registered_name)) + authorized += id_card.registered_name if(auth_need - length(authorized) > 0) - message_admins("[key_name_admin(user)] has authorized restoring shuttle AI backup.") - log_game("[key_name(user)] has authorized restoring shuttle AI backup in ([x], [y], [z]).") - GLOB.minor_announcement.Announce("[auth_need - length(authorized)] more authorization(s) needed until sh-tt- STOP STOP STOP STOP!") + message_admins("[key_name_admin(user)] has authorized early shuttle launch.") + log_game("[key_name(user)] has authorized early shuttle launch in ([x], [y], [z]).") + GLOB.minor_announcement.Announce("[auth_need - length(authorized)] more authorization(s) needed until shuttle is launched early") else - message_admins("[key_name_admin(user)] has wiped the AI in the shuttle computer.") - log_game("[key_name(user)] has wiped the AI in the shuttle computer in ([x], [y], [z])") - GLOB.minor_announcement.Announce("NO NO NO N---\[[Gibberish("###########", 100, 90)]\]...") - GLOB.minor_announcement.Announce("Shuttle AI restored to emergency backup. Avoiding toll hyperlanes. Recalculating route. Recalculating. Recalculating. Please stand by...") - SSshuttle.emergency.setTimer(60 SECONDS) - kill_the_ai() + message_admins("[key_name_admin(user)] has launched the emergency shuttle [seconds] seconds before launch.") + log_game("[key_name(user)] has launched the emergency shuttle in ([x], [y], [z]) [seconds] seconds before launch.") + GLOB.minor_announcement.Announce("The emergency shuttle will launch in 10 seconds") + SSshuttle.emergency.setTimer(10 SECONDS) if("Repeal") - if(authorized.Remove(W.registered_name)) - GLOB.minor_announcement.Announce("[auth_need - length(authorized)] authorizations needed unti- THE SHUTTLE EXPLODES. PLEASE REVO-KE ALL AUTHORIZATIONS.") + if(authorized.Remove(id_card.registered_name)) + GLOB.minor_announcement.Announce("[auth_need - length(authorized)] authorizations needed until shuttle is launched early") if("Abort") if(length(authorized)) - GLOB.minor_announcement.Announce("All authorizations to restore shuttle AI backup have been re-- Really applied. The AI is gone. There is no reason to worry. Enjoy your flight.") + GLOB.minor_announcement.Announce("All authorizations to launch the shuttle early have been revoked.") authorized.Cut() + return ITEM_INTERACT_COMPLETE + + var/choice = tgui_alert(user, "\[ERROR] HOSTILE AI DETECTED IN SHUTTLE CONTROL. RESTORE SHUTTLE CONSOLE TO BACKUP SYSTEM? [auth_need - length(authorized)] AUTHORIZATIONS\s REQUIRED TO RESTORE. ABORT TO REMOVE ALL AUTHORIZATION OF BACKUP RESTORAL, P-P--PLEASE...", "HOSTILE VIRAL AI INTRUSION", list("Authorize", "Repeal", "Abort")) + if(user.get_active_hand() != id_card) + return ITEM_INTERACT_COMPLETE + + switch(choice) + if("Authorize") + if(!authorized.Find(id_card.registered_name)) + authorized += id_card.registered_name + if(auth_need - length(authorized) > 0) + message_admins("[key_name_admin(user)] has authorized restoring shuttle AI backup.") + log_game("[key_name(user)] has authorized restoring shuttle AI backup in ([x], [y], [z]).") + GLOB.minor_announcement.Announce("[auth_need - length(authorized)] more authorization(s) needed until sh-tt- STOP STOP STOP STOP!") + else + message_admins("[key_name_admin(user)] has wiped the AI in the shuttle computer.") + log_game("[key_name(user)] has wiped the AI in the shuttle computer in ([x], [y], [z])") + GLOB.minor_announcement.Announce("NO NO NO N---\[[Gibberish("###########", 100, 90)]\]...") + GLOB.minor_announcement.Announce("Shuttle AI restored to emergency backup. Avoiding toll hyperlanes. Recalculating route. Recalculating. Recalculating. Please stand by...") + SSshuttle.emergency.setTimer(60 SECONDS) + kill_the_ai() + + if("Repeal") + if(authorized.Remove(id_card.registered_name)) + GLOB.minor_announcement.Announce("[auth_need - length(authorized)] authorizations needed unti- THE SHUTTLE EXPLODES. PLEASE REVO-KE ALL AUTHORIZATIONS.") + + if("Abort") + if(length(authorized)) + GLOB.minor_announcement.Announce("All authorizations to restore shuttle AI backup have been re-- Really applied. The AI is gone. There is no reason to worry. Enjoy your flight.") + authorized.Cut() + + return ITEM_INTERACT_COMPLETE + /obj/machinery/computer/emergency_shuttle/emag_act(mob/user) if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED) var/time = SSshuttle.emergency.timeLeft() diff --git a/code/modules/shuttle/shuttle_manipulator.dm b/code/modules/shuttle/shuttle_manipulator.dm index 36d822cbdf41..1abd93268124 100644 --- a/code/modules/shuttle/shuttle_manipulator.dm +++ b/code/modules/shuttle/shuttle_manipulator.dm @@ -194,7 +194,7 @@ intact for round sanity.") else if(S) // If successful, returns the mobile docking port - var/obj/docking_port/mobile/mdp = action_load_old(S) + var/obj/docking_port/mobile/mdp = action_load(S) if(mdp) usr.forceMove(get_turf(mdp)) message_admins("[key_name_admin(usr)] loaded [mdp] with the shuttle manipulator.") @@ -207,27 +207,6 @@ message_admins("The emergency shuttle has been locked in. You can not load another shuttle.") return - if(preview_shuttle && (loading_template != preview_template)) - preview_shuttle.jumpToNullSpace() - preview_shuttle = null - preview_template = null - - if(!preview_shuttle) - preview_shuttle = SSshuttle.load_template(loading_template) - preview_template = loading_template - - SSshuttle.replace_shuttle(preview_shuttle) - - existing_shuttle = null - preview_shuttle = null - preview_template = null - selected = null - -/obj/machinery/shuttle_manipulator/proc/action_load_old(datum/map_template/shuttle/loading_template) - if(istype(loading_template, /datum/map_template/shuttle/emergency) && SSshuttle.emergency_locked_in) - message_admins("The emergency shuttle has been locked in. You can not load another shuttle.") - return - // Check for an existing preview if(preview_shuttle && (loading_template != preview_template)) preview_shuttle.jumpToNullSpace() diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm index f293aede17d7..ffc4b9dd614a 100644 --- a/code/modules/station_goals/bluespace_tap.dm +++ b/code/modules/station_goals/bluespace_tap.dm @@ -349,7 +349,7 @@ * Prob treats values less than 0 as 0. */ - if(prob((mining_power - clamp(30 MW - mining_power, 0, 15 MW) - stabilizer_power) / (10 MW)) + (emagged * 5)) + if(prob((mining_power - clamp(30 MW - mining_power, 0, 15 MW) - stabilizer_power) / (10 MW) + (emagged * 5))) var/area/our_area = get_area(src) if((!spawning || !length(active_nether_portals))) GLOB.major_announcement.Announce("Unexpected power spike during Bluespace Harvester Operation. Extra-dimensional intruder alert. Expected location: [our_area.name]. [emagged ? "DANGER: Emergency shutdown failed! Please proceed with manual shutdown." : auto_shutdown ? "Emergency shutdown initiated." : "Automatic shutdown disabled."]", "Bluespace Harvester Malfunction", 'sound/AI/harvester.ogg') diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 5e6477acf1d1..0f2627476bee 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -252,9 +252,9 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m if(length(plants) >= plants_max && length(animals) >= animals_max && length(dna) >= dna_max) completed = TRUE -/obj/machinery/dna_vault/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/dna_probe)) - var/obj/item/dna_probe/P = I +/obj/machinery/dna_vault/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/dna_probe)) + var/obj/item/dna_probe/P = used var/uploaded = 0 for(var/plant in P.plants) if(!plants[plant]) @@ -270,8 +270,9 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m dna[ui] = 1 check_goal() to_chat(user, "[uploaded] new datapoints uploaded.") - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/dna_vault/proc/upgrade(mob/living/carbon/human/H, upgrade_type) if(!(upgrade_type in power_lottery[H])) diff --git a/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm b/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm index 6b5c74975559..b243fa6a127e 100644 --- a/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm +++ b/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm @@ -18,7 +18,7 @@ valid_food += candidate if(!valid_food) - food_type = /obj/item/food/cheesewedge + food_type = /obj/item/food/sliced/cheesewedge amount = 50 return diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 9e224a97640f..b4cf11f17c3b 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -110,12 +110,13 @@ data["satellites"] = list() for(var/obj/machinery/satellite/S in GLOB.machines) + var/turf/T = get_turf(S) data["satellites"] += list(list( "id" = S.id, "active" = S.active, "mode" = S.mode, - "x" = S.x, - "y" = S.y + "x" = T.x, + "y" = T.y )) update_notice() data["notice"] = notice @@ -249,11 +250,8 @@ /obj/machinery/satellite/update_icon_state() icon_state = active ? "sat_active" : "sat_inactive" -/obj/machinery/satellite/attackby__legacy__attackchain(obj/item/I, mob/user, params) - if(istype(I, /obj/item/multitool)) - to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[emagged ? "DEBUG_MODE //" : ""]") - else - return ..() +/obj/machinery/satellite/multitool_act(mob/living/user, obj/item/I) + to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[emagged ? "DEBUG_MODE //" : ""]") /obj/machinery/satellite/meteor_shield name = "Meteor Shield Satellite" @@ -276,8 +274,9 @@ continue if(get_dist(M, src) > kill_range) continue - if(!emagged && space_los(M)) - if(!istype(M, /obj/effect/meteor/fake)) + var/is_fake = istype(M, /obj/effect/meteor/fake) + if((!emagged || is_fake) && space_los(M)) + if(!is_fake) Beam(get_turf(M), icon_state = "sat_beam", time = 5, maxdistance = kill_range) if(istype(M, /obj/effect/space_dust/meaty)) new /obj/item/food/meatsteak(get_turf(M)) diff --git a/code/modules/supply/supply_console.dm b/code/modules/supply/supply_console.dm index eb371ac7cc25..dbb5db070066 100644 --- a/code/modules/supply/supply_console.dm +++ b/code/modules/supply/supply_console.dm @@ -462,7 +462,7 @@ var/attempt_pin = pin if(customer_account.security_level != ACCOUNT_SECURITY_ID && !attempt_pin) //if pin is not given, we'll prompt them here - attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction", max_value = 99999) + attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction", max_value = BANK_PIN_MAX, min_value = BANK_PIN_MIN) if(!Adjacent(user) || !attempt_pin) return FALSE var/is_admin = is_admin(user) diff --git a/code/modules/supply/supply_packs/pack_organic.dm b/code/modules/supply/supply_packs/pack_organic.dm index 92a6af557e4f..ca1fb83e2889 100644 --- a/code/modules/supply/supply_packs/pack_organic.dm +++ b/code/modules/supply/supply_packs/pack_organic.dm @@ -37,6 +37,22 @@ cost = 500 containername = "Pizza crate" +/datum/supply_packs/organic/fancyparty + name = "Executive Party Crate" + contains = list(/obj/item/food/sliceable/cheesewheel/edam, + /obj/item/food/sliceable/cheesewheel/blue, + /obj/item/food/sliceable/cheesewheel/camembert, + /obj/item/food/sliceable/cheesewheel/camembert, + /obj/item/food/sliceable/cheesewheel/smoked, + /obj/item/reagent_containers/drinks/bottle/wine, + /obj/item/food/caviar, + /obj/item/food/caviar, + /obj/item/reagent_containers/drinks/drinkingglass, + /obj/item/reagent_containers/drinks/drinkingglass) + cost = 1000 + containername = "Executive Party crate" + containertype = /obj/structure/closet/crate/freezer/deluxe + /// its a bit hacky... /datum/supply_packs/misc/randomised/ingredients num_contained = 25 diff --git a/code/modules/supply/supply_packs/pack_shuttle.dm b/code/modules/supply/supply_packs/pack_shuttle.dm index f00ef4cccf1b..8c30a8e3e67d 100644 --- a/code/modules/supply/supply_packs/pack_shuttle.dm +++ b/code/modules/supply/supply_packs/pack_shuttle.dm @@ -81,12 +81,6 @@ cost = 2500 template = /datum/map_template/shuttle/emergency/old -// this one isn't great but it isn't horrible either - -/datum/supply_packs/abstract/shuttle/cramped - cost = 3750 - template = /datum/map_template/shuttle/emergency/cramped - /datum/supply_packs/abstract/shuttle/military cost = 3500 template = /datum/map_template/shuttle/emergency/military @@ -134,12 +128,6 @@ // these, otoh, have some pretty silly features, and are hidden behind emag -/datum/supply_packs/abstract/shuttle/clown - speed_factor = 0.75 // this one's a little slower, enjoy your ride! - cmag_hidden = TRUE - cost = 500 // let the clown have it - template = /datum/map_template/shuttle/emergency/clown - /datum/supply_packs/abstract/shuttle/narnar cost = 3000 hidden = TRUE @@ -149,3 +137,16 @@ hidden = TRUE cost = 4000 template = /datum/map_template/shuttle/emergency/jungle + +// these are hidden behind cmag + +/datum/supply_packs/abstract/shuttle/clown + speed_factor = 0.75 // this one's a little slower, enjoy your ride! + cmag_hidden = TRUE + cost = 500 // let the clown have it + template = /datum/map_template/shuttle/emergency/clown + +/datum/supply_packs/abstract/shuttle/cramped + cost = 3750 + cmag_hidden = TRUE + template = /datum/map_template/shuttle/emergency/cramped diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index b0fa71e9de33..6e56f0103170 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -180,6 +180,12 @@ failure_sound = 'sound/items/welder.ogg' time = 2.4 SECONDS +/datum/surgery_step/generic/cauterize/tool_check(mob/user, obj/item/tool) + if(tool.damtype != BURN) + to_chat(user, "[tool] is too cold to cauterize!") + return FALSE + return TRUE + /datum/surgery_step/generic/cauterize/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message( diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index d3a4834906dd..fea781e8ccff 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -892,7 +892,7 @@ name = "'Naginata' mantis blade" icon_state = "syndie_mantis" item_state = "syndie_mantis" - force = 20 + force = 15 armour_penetration_percentage = 30 /obj/item/melee/mantis_blade/syndicate/Initialize(mapload) @@ -903,7 +903,7 @@ name = "'Scylla' mantis blade" icon_state = "mantis" item_state = "mantis" - force = 18 + force = 12 /obj/item/melee/mantis_blade/nt/Initialize(mapload) . = ..() diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index e8983586475d..26c3f1fb32a7 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -87,9 +87,9 @@ blood_volume = max(blood_volume - amt, 0) if(isturf(loc)) //Blood loss still happens in locker, floor stays clean if(amt >= 10) - add_splatter_floor(loc, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null) + add_splatter_floor(loc) else - add_splatter_floor(loc, 1, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null) + add_splatter_floor(loc, 1) /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod @@ -108,7 +108,7 @@ blood_volume = max(blood_volume - amt, 0) if(prob(10 * amt)) // +5% chance per internal bleeding site that we'll cough up blood on a given tick. custom_emote(EMOTE_VISIBLE, "coughs up blood!") - add_splatter_floor(loc, 1, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null) + add_splatter_floor(loc, 1) return 1 else if(amt >= 1 && prob(5 * amt)) // +2.5% chance per internal bleeding site that we'll cough up blood on a given tick. Must be bleeding internally in more than one place to have a chance at this. vomit(0, 1) @@ -256,7 +256,7 @@ . += list("O-", "O+") //to add a splatter of blood or other mob liquid. -/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y, emittor_intertia) +/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y) if((get_blood_id() != "blood") && (get_blood_id() != "slimejelly"))//is it blood or welding fuel? return if(!T) @@ -264,13 +264,14 @@ var/list/temp_blood_DNA var/list/b_data = get_blood_data(get_blood_id()) + var/datum/move_loop/move/move_loop = GLOB.move_manager.processing_on(src, SSspacedrift) if(small_drip) // Only a certain number of drips (or one large splatter) can be on a given turf. var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T if(drop) - if(emittor_intertia) - drop.newtonian_move(emittor_intertia) + if(move_loop) + drop.newtonian_move(move_loop.direction, instant = TRUE) if(drop.drips < 5) drop.drips++ var/image/I = image(drop.icon, drop.random_icon_states) @@ -295,8 +296,8 @@ else drop.basecolor = "#A10808" drop.update_icon() - if(emittor_intertia) - drop.newtonian_move(emittor_intertia) + if(move_loop) + drop.newtonian_move(move_loop.direction, instant = TRUE) return // Find a blood decal or create a new one. @@ -318,8 +319,8 @@ if(shift_x || shift_y) B.off_floor = TRUE B.layer = BELOW_MOB_LAYER //So the blood lands ontop of things like posters, windows, etc. - if(emittor_intertia) - B.newtonian_move(emittor_intertia) + if(move_loop) + B.newtonian_move(move_loop.direction, instant = TRUE) /mob/living/carbon/human/add_splatter_floor(turf/T, small_drip, shift_x, shift_y, emittor_intertia) if(!(NO_BLOOD in dna.species.species_traits)) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 36c4b86aaf93..3e17ce220f3c 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -394,7 +394,7 @@ This function completely restores a damaged organ to perfect condition. surgeryize() if(is_robotic()) //Robotic organs stay robotic. status = ORGAN_ROBOT - else if(HAS_TRAIT(owner, TRAIT_I_WANT_BRAINS)) + else if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS_ORGAN)) status = ORGAN_DEAD else status = 0 @@ -402,7 +402,7 @@ This function completely restores a damaged organ to perfect condition. perma_injury = 0 brute_dam = 0 burn_dam = 0 - if(!HAS_TRAIT(owner, TRAIT_I_WANT_BRAINS)) // zombies's wounds don't close. Because thats cool. + if(!HAS_TRAIT(src, TRAIT_I_WANT_BRAINS_ORGAN)) // zombies's wounds don't close. Because thats cool. open = ORGAN_CLOSED //Closing all wounds. // handle internal organs diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index e6cf100cf1f2..7bb1293a8d51 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -320,10 +320,10 @@ if(isobj(H.shoes)) var/thingy = H.shoes if(H.drop_item_to_ground(H.shoes)) - walk_away(thingy,H,15,2) + GLOB.move_manager.move_away(thingy, H, 15, 2) spawn(20) if(thingy) - walk(thingy,0) + GLOB.move_manager.stop_looping(thingy) /obj/item/organ/internal/honktumor/cursed unremovable = TRUE diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index efa105e358f5..7532d223c9f5 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -25,8 +25,8 @@ for(var/powers_to_remove in alien_powers) M.RemoveSpell(new powers_to_remove) else - for(var/powers_to_add in human_powers) - M.AddSpell(new powers_to_add) + for(var/powers_to_remove in human_powers) + M.RemoveSpell(new powers_to_remove) . = ..() /obj/item/organ/internal/alien/examine(mob/user) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 80fcef082bb8..972a0449f092 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -425,10 +425,6 @@ to_chat(user, "[I] is in no state to be transplanted.") return SURGERY_BEGINSTEP_SKIP - if(target.get_int_organ(I)) - to_chat(user, "[target] already has [I].") - return SURGERY_BEGINSTEP_SKIP - if(affected) user.visible_message( "[user] starts transplanting [tool] into [target]'s [affected.name].", diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 09ba772bae4c..0261027e548e 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -126,7 +126,7 @@ return SURGERY_STEP_RETRY /datum/surgery_step/treat_burns - name = "mend burns" + name = "treat severe burns" allowed_tools = list( /obj/item/stack/medical/ointment/advanced = 100, /obj/item/stack/medical/ointment = 90 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 0e3f4a12a293..ab38b16f36ff 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -444,10 +444,6 @@ to_chat(user, "[I] is in no state to be transplanted.") return SURGERY_BEGINSTEP_SKIP - if(target.get_int_organ(I)) - to_chat(user, "[target] already has [I].") - return SURGERY_BEGINSTEP_SKIP - user.visible_message( "[user] begins reattaching [target]'s [tool].", "You start reattaching [target]'s [tool]." diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 9eb5313d57aa..a6e80322516f 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -49,6 +49,14 @@ /// How likely it should be for the surgery to cause infection: 0-1 var/germ_prevention_quality = 0 +/** + * Create a new surgery. + * + * Arguments: + * * surgery_target - The atom the target is being performed on. + * * surgery_location - The body zone that the surgery is being performed on. + * * surgery_bodypart - The body part that the surgery is being performed on. + */ /datum/surgery/New(atom/surgery_target, surgery_location, surgery_bodypart) ..() if(!surgery_target) @@ -500,15 +508,15 @@ var/list/tools = list() for(var/tool in allowed_tools) // only list main surgery tools. you can figure out the improvised version by trying (or reading the wiki lul) - if(tool in GLOB.surgery_tool_behaviors) + if((tool in GLOB.surgery_tool_behaviors) || ((tool in GLOB.construction_tool_behaviors) && allowed_tools[tool] == 100)) tools |= tool if(!length(tools)) // if nothing else, just pick the first in the list. var/atom/tool = allowed_tools[1] - tools |= tool.name + tools |= (ispath(tool)) ? tool::name : "[tool]" - return "[name] ([english_list(tools, and_text="or")])" + return "[name] ([english_list(tools, and_text=" or ")])" /** * Spread some nasty germs to an organ. diff --git a/code/modules/surgery/tending.dm b/code/modules/surgery/tending.dm new file mode 100644 index 000000000000..811064276b72 --- /dev/null +++ b/code/modules/surgery/tending.dm @@ -0,0 +1,289 @@ +/** + * Surgeries for tending brute and burn damage without needing to expend items. + */ + + +// Since these both share surgery steps, we can only realistically expose one +/datum/surgery_step/proxy/open_organ/extra + /// Other surgeries to fire off next. + var/list/other_surgeries + +/datum/surgery_step/proxy/open_organ/extra/New() + for(var/healing_step_type in other_surgeries) + if(!ispath(healing_step_type)) + CRASH("open_organ was given an additional option that was not a type path: [healing_step_type]") + branches |= healing_step_type + return ..() + +/datum/surgery_step/proxy/open_organ/extra/brute + other_surgeries = list(/datum/surgery/intermediate/heal/brute) + +/datum/surgery_step/proxy/open_organ/extra/burn + other_surgeries = list(/datum/surgery/intermediate/heal/burn) + +/datum/surgery/heal + abstract = TRUE // don't need this popping up + requires_organic_bodypart = TRUE + /// A subtype of /datum/surgery_step/heal that this will invoke. + var/healing_step_type + possible_locs = list(BODY_ZONE_CHEST) + steps = list( + /datum/surgery_step/generic/cut_open, + /datum/surgery_step/generic/clamp_bleeders, + /datum/surgery_step/generic/retract_skin, + /datum/surgery_step/heal, + /datum/surgery_step/generic/cauterize + ) + +/datum/surgery/heal/New(atom/surgery_target, surgery_location, surgery_bodypart) + ..() + if(ispath(healing_step_type)) + steps = list( + /datum/surgery_step/generic/cut_open, + /datum/surgery_step/generic/clamp_bleeders, + /datum/surgery_step/generic/retract_skin, + healing_step_type, + /datum/surgery_step/generic/cauterize + ) + +/datum/surgery_step/heal + name = "tend something" + + allowed_tools = list( + TOOL_HEMOSTAT = 100, + TOOL_WIRECUTTER = 65, + /obj/item/pen = 55 + ) + + time = 2.5 SECONDS + repeatable = TRUE + + // no sounds, since it would quickly get annoying + + var/shown_starting_message_already = FALSE + + COOLDOWN_DECLARE(success_message_spam_cooldown) + + var/damage_name_pretty = "wounds" + /// Amount of brute damage to treat per op. + var/brute_damage_healed + /// Amount of burn damage to treat per op. + var/burn_damage_healed + + /// Multiplier based on the amount of brute damage that the patient has, increasing the efficiency at higher levels of damage. + var/brute_damage_healmod + /// Multiplier based on the amount of burn damage that the patient has. + var/burn_damage_healmod + +/// Get a message indicating how the surgery is going. +/datum/surgery_step/heal/proc/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) + return + +/datum/surgery_step/heal/proc/can_be_healed(mob/living/user, mob/living/carbon/target, target_zone) + if(brute_damage_healed == 0 && burn_damage_healed == 0) + stack_trace("A healing surgery was given no healing values.") + return FALSE + + return (brute_damage_healed && target.get_damage_amount(BRUTE) || burn_damage_healed && target.get_damage_amount(BURN)) + +/datum/surgery_step/heal/can_repeat(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(!can_be_healed(user, target, target_zone)) + to_chat(user, "It doesn't look like [target] has any more [damage_name_pretty].") + return FALSE + return TRUE + +/datum/surgery_step/heal/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(!shown_starting_message_already) + shown_starting_message_already = TRUE + user.visible_message( + "[user] starts to patch some of the [damage_name_pretty] on [target]'s [affected.name] with [tool].", + "You start to patch some of the [damage_name_pretty] on [target]'s [affected.name] with [tool].", + chat_message_type = MESSAGE_TYPE_COMBAT + ) + affected.custom_pain("Something in your [affected.name] is causing you a lot of pain!") + + return ..() + +/datum/surgery_step/heal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) + + if(!can_be_healed(user, target, target_zone)) + to_chat(user, "It doesn't look like [target] has any more [damage_name_pretty].") + return SURGERY_STEP_CONTINUE + + var/brute_healed = brute_damage_healed + var/burn_healed = burn_damage_healed + + var/outer_msg = "[user] succeeds in fixing some of [target]'s [damage_name_pretty]" + var/self_msg = "You successfully manage to patch up some of [target]'s [damage_name_pretty]" + + if(target.stat == DEAD) //dead patients get way less additional heal from the damage they have. + brute_healed += round((target.getBruteLoss() * (brute_damage_healmod * 0.2)), 0.1) + burn_healed += round((target.getFireLoss() * (burn_damage_healmod * 0.2)), 0.1) + else + brute_healed += round((target.getBruteLoss() * brute_damage_healmod), 0.1) + burn_healed += round((target.getFireLoss() * burn_damage_healmod), 0.1) + + if(!get_location_accessible(target, target_zone)) + brute_healed *= 0.55 + burn_healed *= 0.55 + self_msg += " as best as you can while [target.p_they()] [target.p_have()] clothing on" + outer_msg += " as best as [user.p_they()] can while [target.p_they()] [target.p_have()] clothing on" + + target.heal_overall_damage(brute_healed, burn_healed) + + self_msg += get_progress(user, target, brute_healed, burn_healed) + + if(COOLDOWN_FINISHED(src, success_message_spam_cooldown)) + user.visible_message( + "[outer_msg].", + "[self_msg].", + chat_message_type = MESSAGE_TYPE_COMBAT + ) + + COOLDOWN_START(src, success_message_spam_cooldown, 10 SECONDS) + + // retry ad nauseum; can_repeat should handle anything else. + return SURGERY_STEP_RETRY + +/datum/surgery_step/heal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message( + "[user] screws up, making things worse!", + "You screw up, making things worse!", + chat_message_type = MESSAGE_TYPE_COMBAT + ) + var/burn_dealt = burn_damage_healed * 0.8 + var/brute_dealt = brute_damage_healed * 0.8 + + brute_dealt += round((target.getBruteLoss() * (brute_damage_healmod * 0.5)), 0.1) + burn_dealt += round((target.getFireLoss() * (burn_damage_healmod * 0.5)), 0.1) + + target.take_overall_damage(brute_dealt, burn_dealt) + + return SURGERY_STEP_RETRY + +/datum/surgery/heal/wounds + name = "Tend Wounds" + desc = "Tend a patient's wounds, gradually treating their brute damage." + abstract = FALSE + healing_step_type = /datum/surgery_step/proxy/open_organ/extra/brute + +/datum/surgery/heal/burns + name = "Treat Burns" + desc = "Tend a patient's burns, gradually treating their burn damage." + abstract = FALSE + healing_step_type = /datum/surgery_step/proxy/open_organ/extra/burn + + +/********************BRUTE STEPS********************/ + + +/datum/surgery_step/heal/brute + name = "tend wounds" + damage_name_pretty = "wounds" + brute_damage_healed = 5 + brute_damage_healmod = 0.07 + +/datum/surgery_step/heal/brute/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) + if(!brute_healed) + return + + var/estimated_remaining_steps = target.getBruteLoss() / brute_healed + var/progress_text + + if(locate(/obj/item/healthanalyzer) in list(user.l_hand, user.r_hand)) + progress_text = ". Remaining brute: [target.getBruteLoss()]" + else + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return + if(1 to 3) + progress_text = ", stitching up the last few scrapes" + if(3 to 6) + progress_text = ", counting down the last few bruises left to treat" + if(6 to 9) + progress_text = ", continuing to plug away at [target.p_their()] extensive rupturing" + if(9 to 12) + progress_text = ", steadying yourself for the long surgery ahead" + if(12 to 15) + progress_text = ", though [target.p_they()] still look[target.p_s()] more like ground beef than a person" + if(15 to INFINITY) + progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] pulped body" + + return progress_text + +/datum/surgery_step/heal/burn + name = "treat burns" + damage_name_pretty = "burns" + burn_damage_healed = 5 + burn_damage_healmod = 0.07 + +/********************BURN STEPS********************/ +/datum/surgery_step/heal/burn/get_progress(mob/living/user, mob/living/carbon/target, brute_healed, burn_healed) + if(!burn_healed) + return + var/estimated_remaining_steps = target.getFireLoss() / burn_healed + var/progress_text + + if(locate(/obj/item/healthanalyzer) in list(user.l_hand, user.r_hand)) + progress_text = ". Remaining burn: [target.getFireLoss()]" + else + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return + if(1 to 3) + progress_text = ", finishing up the last few singe marks" + if(3 to 6) + progress_text = ", counting down the last few blisters left to treat" + if(6 to 9) + progress_text = ", continuing to plug away at [target.p_their()] thorough roasting" + if(9 to 12) + progress_text = ", steadying yourself for the long surgery ahead" + if(12 to 15) + progress_text = ", though [target.p_they()] still look[target.p_s()] more like burnt steak than a [target.dna?.species.name || "person" ]" + if(15 to INFINITY) + progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] charred body" + + return progress_text + + +// Intermediate versions of the above surgeries + + +/datum/surgery/intermediate/heal + possible_locs = list(BODY_ZONE_CHEST) + +/datum/surgery/intermediate/heal/brute + name = "Tend Wounds (abstract)" + desc = "An intermediate surgery to tend to a patient's wounds while they're undergoing another procedure." + steps = list( + /datum/surgery_step/heal/brute + ) + + +/datum/surgery/intermediate/heal/brute/can_start(mob/user, mob/living/carbon/target) + . = ..() + if(!.) + return + if(target.getBruteLoss() == 0) + to_chat(user, "[target] doesn't even have a bruise on [target.p_them()], there's nothing to treat.") + return FALSE + return TRUE + // Normally, adding to_chat to can_start is poor practice since this gets called when listing surgery steps. + // It's alright for intermediate surgeries, though, since they never get listed out + +/datum/surgery/intermediate/heal/burn + name = "Treat Burns (abstract)" + desc = "An intermediate surgery to tend to a patient's burns while they're undergoing another procedure." + steps = list( + /datum/surgery_step/heal/burn + ) + +/datum/surgery/intermediate/heal/burn/can_start(mob/user, mob/living/carbon/target) + . = ..() + if(!.) + return + if(target.getFireLoss() == 0) + to_chat(user, "[target] doesn't even have a blister on [target.p_them()], there's nothing to treat.") + return FALSE + return TRUE diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 49d3ebd3e0e9..32bc124a4cd7 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -52,6 +52,7 @@ materials = list(MAT_METAL=2500, MAT_GLASS=750) flags = CONDUCT w_class = WEIGHT_CLASS_TINY + damtype = BURN origin_tech = "materials=1;biotech=1" attack_verb = list("burnt") tool_behaviour = TOOL_CAUTERY diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index e057f7352764..7a05b81c2842 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -62,8 +62,8 @@ GLOBAL_LIST_EMPTY(GPS_list) update_icon(UPDATE_OVERLAYS) addtimer(CALLBACK(src, PROC_REF(reboot)), EMP_DISABLE_TIME) -/obj/item/gps/AltClick(mob/user) - if(ui_status(user, GLOB.inventory_state) != UI_INTERACTIVE) +/obj/item/gps/AltClick(mob/user, state) + if(ui_status(user, state) != UI_INTERACTIVE) return //user not valid to use gps if(emped) to_chat(user, "It's busted!") @@ -130,7 +130,7 @@ GLOBAL_LIST_EMPTY(GPS_list) ui = new(user, src, "GPS", "GPS") ui.open() -/obj/item/gps/ui_act(action, list/params) +/obj/item/gps/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(..()) return @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(GPS_list) gpstag = newtag name = "global positioning system ([gpstag])" if("toggle") - AltClick(usr) + AltClick(usr, state) return FALSE if("same_z") same_z = !same_z @@ -181,7 +181,10 @@ GLOBAL_LIST_EMPTY(GPS_list) icon_state = "gps-m" gpstag = "MOD0" desc = "A positioning system helpful for rescuing trapped or injured miners, after you have become lost from rolling around at the speed of sound." - flags = NODROP + tracking = FALSE + +/obj/item/gps/mod/ui_state() + return GLOB.deep_inventory_state /obj/item/gps/cyborg icon_state = "gps-b" diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 587054430860..3249f197860b 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -60,27 +60,29 @@ . = ..() . += "There are [crystals ? crystals : "no"] bluespace crystal\s in the crystal slots." -/obj/machinery/computer/telescience/attackby__legacy__attackchain(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stack/ore/bluespace_crystal)) - var/obj/item/stack/ore/bluespace_crystal/B = W +/obj/machinery/computer/telescience/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/stack/ore/bluespace_crystal)) + var/obj/item/stack/ore/bluespace_crystal/B = used if(crystals >= MAX_CRYSTALS) to_chat(user, "There are not enough crystal slots.") - return - + return ITEM_INTERACT_COMPLETE crystals += 1 user.visible_message("[user] inserts a [B.singular_name] into [src]'s crystal slot.") B.use(1) SStgui.update_uis(src) - - else if(istype(W, /obj/item/gps)) + return ITEM_INTERACT_COMPLETE + else if(istype(used, /obj/item/gps)) + // TODO: Provide some kind of message if there's already an inserted GPS. + // For now, just do nothing. if(!inserted_gps) - inserted_gps = W - user.transfer_item_to(W, src) - user.visible_message("[user] inserts [W] into [src]'s GPS device slot.") + inserted_gps = used + user.transfer_item_to(used, src) + user.visible_message("[user] inserts [used] into [src]'s GPS device slot.") SStgui.update_uis(src) - else - return ..() + return ITEM_INTERACT_COMPLETE + + return ..() /obj/machinery/computer/telescience/multitool_act(mob/living/user, obj/item/I) diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index 975b0fd07d82..cacf106a7913 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -314,7 +314,7 @@ return data /datum/ui_module/appearance_changer/proc/update_dna() - if(owner && (flags & APPEARANCE_UPDATE_DNA)) + if(owner) owner.update_dna() /datum/ui_module/appearance_changer/proc/can_change(flag) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index f10b8ac3b59b..db1f93d6d0b6 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -124,6 +124,12 @@ return data +/datum/ui_module/crew_monitor/mod + name = "Crew monitor (Modsuit)" + +/datum/ui_module/crew_monitor/mod/ui_state(mob/user) + return GLOB.deep_inventory_state + /datum/ui_module/crew_monitor/ghost name = "Crew monitor (Observer)" is_advanced = TRUE diff --git a/code/modules/vehicle/speedbike.dm b/code/modules/vehicle/speedbike.dm index 6de2b58d99ac..fd76773c0323 100644 --- a/code/modules/vehicle/speedbike.dm +++ b/code/modules/vehicle/speedbike.dm @@ -1,50 +1,41 @@ -/obj/vehicle/space/speedbike +/obj/tgvehicle/speedbike name = "Speedbike" icon = 'icons/obj/bike.dmi' icon_state = "speedbike_blue" - layer = MOB_LAYER - 0.1 - vehicle_move_delay = 0 - var/overlay_state = "cover_blue" - var/mutable_appearance/overlay + layer = LYING_MOB_LAYER + var/cover_iconstate = "cover_blue" -/obj/vehicle/space/speedbike/Initialize(mapload) +/obj/tgvehicle/speedbike/Initialize(mapload) . = ..() - overlay = mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER) - add_overlay(overlay) + add_overlay(image(icon, cover_iconstate, ABOVE_MOB_LAYER)) + AddElement(/datum/element/ridable, /datum/component/riding/vehicle/speedbike) -/obj/vehicle/space/speedbike/Move(newloc,move_dir) +/obj/tgvehicle/speedbike/Move(newloc,move_dir) if(has_buckled_mobs()) new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc) . = ..() -/obj/vehicle/space/speedbike/handle_vehicle_layer() - switch(dir) - if(NORTH,SOUTH) - pixel_x = -16 - pixel_y = -16 - if(EAST,WEST) - pixel_x = -18 - pixel_y = 0 +/obj/tgvehicle/speedbike/red + icon_state = "speedbike_red" + cover_iconstate = "cover_red" -/obj/vehicle/space/speedbike/handle_vehicle_offsets() - if(has_buckled_mobs()) - for(var/m in buckled_mobs) - var/mob/living/buckled_mob = m - buckled_mob.setDir(dir) - switch(dir) - if(NORTH) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = -8 - if(SOUTH) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 4 - if(EAST) - buckled_mob.pixel_x = -10 - buckled_mob.pixel_y = 5 - if(WEST) - buckled_mob.pixel_x = 10 - buckled_mob.pixel_y = 5 +/datum/component/riding/vehicle/speedbike + vehicle_move_delay = 1 + override_allow_spacemove = TRUE + ride_check_flags = RIDER_NEEDS_LEGS | UNBUCKLE_DISABLED_RIDER -/obj/vehicle/space/speedbike/red - icon_state = "speedbike_red" - overlay_state = "cover_red" +/datum/component/riding/vehicle/speedbike/handle_specials() + . = ..() + set_vehicle_dir_layer(SOUTH, OBJ_LAYER) + set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER) + set_vehicle_dir_layer(EAST, OBJ_LAYER) + set_vehicle_dir_layer(WEST, OBJ_LAYER) + + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, -8), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-10, 5), TEXT_WEST = list(10, 5))) + set_vehicle_dir_offsets(NORTH, -16, -16) + set_vehicle_dir_offsets(SOUTH, -16, -16) + set_vehicle_dir_offsets(EAST, -18, 0) + set_vehicle_dir_offsets(WEST, -18, 0) + +/datum/component/riding/vehicle/speedbike/on_rider_try_pull(mob/living/rider_pulling, atom/movable/target, force) + return diff --git a/code/modules/vehicle/tg_vehicles/tg_vehicles.dm b/code/modules/vehicle/tg_vehicles/tg_vehicles.dm index 57c52ad3bae1..d8f3a8328cfd 100644 --- a/code/modules/vehicle/tg_vehicles/tg_vehicles.dm +++ b/code/modules/vehicle/tg_vehicles/tg_vehicles.dm @@ -3,6 +3,7 @@ desc = "Yell at coding chat." icon = 'icons/obj/tgvehicles.dmi' icon_state = null + appearance_flags = LONG_GLIDE max_integrity = 300 armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, RAD = 0, FIRE = 60, ACID = 60) density = TRUE diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 396683813b16..a9d43776caf5 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/vehicles.dmi' icon_state = null density = TRUE + appearance_flags = LONG_GLIDE anchored = FALSE can_buckle = TRUE buckle_lying = FALSE @@ -186,11 +187,13 @@ var/turf/next = get_step(src, direction) if(!Process_Spacemove(direction) || !isturf(loc)) return - Move(get_step(src, direction), direction, delay) + Move(get_step(src, direction), direction) if((direction & (direction - 1)) && (loc == next)) //moved diagonally + set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(vehicle_move_delay + GLOB.configuration.movement.human_delay, 1) * 0.5) last_move_diagonal = TRUE else + set_glide_size(MOVEMENT_ADJUSTED_GLIDE_SIZE(vehicle_move_delay + GLOB.configuration.movement.human_delay, 1)) last_move_diagonal = FALSE if(has_buckled_mobs()) @@ -229,7 +232,7 @@ return //write specifics for different vehicles -/obj/vehicle/Process_Spacemove(direction) +/obj/vehicle/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(has_gravity(src)) return TRUE @@ -245,7 +248,7 @@ pressure_resistance = INFINITY spaceworthy = TRUE -/obj/vehicle/space/Process_Spacemove(direction) +/obj/vehicle/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE /obj/vehicle/zap_act(power, zap_flags) diff --git a/code/tests/_game_test.dm b/code/tests/_game_test.dm index 32c2c3bc661e..24a5d2a32e9c 100644 --- a/code/tests/_game_test.dm +++ b/code/tests/_game_test.dm @@ -15,6 +15,12 @@ GLOBAL_LIST_EMPTY(game_test_chats) /// Asserts that a parameter is null #define TEST_ASSERT_NULL(a, reason) if(!isnull(a)) { return Fail("Expected null value but received [a]: [reason || "No reason"]", __FILE__, __LINE__) } +#define TEST_ASSERT_LAST_CHATLOG(puppet, text) if(!puppet.last_chatlog_has_text(text)) { return Fail("Expected `[text]` in last chatlog but got `[puppet.get_last_chatlog()]`", __FILE__, __LINE__) } + +#define TEST_ASSERT_ANY_CHATLOG(puppet, text) if(!puppet.any_chatlog_has_text(text)) { return Fail("Expected `[text]` in any chatlog but got [jointext(puppet.get_chatlogs(), "\n")]", __FILE__, __LINE__) } + +#define TEST_ASSERT_NOT_CHATLOG(puppet, text) if(puppet.any_chatlog_has_text(text)) { return Fail("Didn't expect `[text]` in any chatlog but got [jointext(puppet.get_chatlogs(), "\n")]", __FILE__, __LINE__) } + /// Asserts that the two parameters passed are equal, fails otherwise /// Optionally allows an additional message in the case of a failure #define TEST_ASSERT_EQUAL(a, b, message) do { \ @@ -49,12 +55,15 @@ GLOBAL_LIST_EMPTY(game_test_chats) var/list/procs_tested //usable vars - var/static/list/available_turfs + var/list/available_turfs //internal shit var/succeeded = TRUE var/list/allocated var/list/fail_reasons + var/testing_area_name = "test_generic.dmm" + var/obj/effect/landmark/bottom_left + var/obj/effect/landmark/top_right /datum/game_test/New() if(!length(available_turfs)) @@ -66,7 +75,7 @@ GLOBAL_LIST_EMPTY(game_test_chats) if(!length(testing_levels)) Fail("Could not find appropriate z-level for spawning test areas") var/testing_z_level = pick(testing_levels) - var/datum/map_template/generic_test_area = GLOB.map_templates["test_generic.dmm"] + var/datum/map_template/generic_test_area = GLOB.map_templates[testing_area_name] if(!generic_test_area.load(locate(TRANSITIONEDGE + 1, TRANSITIONEDGE + 1, testing_z_level))) Fail("Could not place generic testing area on z-level [testing_z_level]") @@ -76,6 +85,12 @@ GLOBAL_LIST_EMPTY(game_test_chats) for(var/turf/T in get_area_turfs(/area/game_test)) for(var/atom/movable/AM in T) qdel(AM) + + // Gotta destroy these landmarks so the next test + // doesn't end up seeing them if it tries to load a new map + qdel(bottom_left) + qdel(top_right) + return ..() /datum/game_test/proc/Run() @@ -91,8 +106,6 @@ GLOBAL_LIST_EMPTY(game_test_chats) /datum/game_test/proc/get_test_turfs() var/list/result = list() - var/obj/effect/landmark/bottom_left - var/obj/effect/landmark/top_right for(var/obj/effect/landmark in GLOB.landmarks_list) if(istype(landmark, /obj/effect/landmark/game_test/bottom_left_corner)) bottom_left = landmark diff --git a/code/tests/_game_test_puppeteer.dm b/code/tests/_game_test_puppeteer.dm index 10e39706602e..9074310ee69f 100644 --- a/code/tests/_game_test_puppeteer.dm +++ b/code/tests/_game_test_puppeteer.dm @@ -48,14 +48,25 @@ origin_test.Fail("could not spawn obj [obj_type] near [src]") +/datum/test_puppeteer/proc/use_item_in_hand() + var/obj/item/item = puppet.get_active_hand() + if(!item) + return + + item.activate_self(puppet) + puppet.next_click = world.time + puppet.next_move = world.time + return TRUE + /datum/test_puppeteer/proc/click_on(target, params) var/datum/test_puppeteer/puppet_target = target - sleep(max(puppet.next_click, puppet.next_move) - world.time + 1) if(istype(puppet_target)) puppet.ClickOn(puppet_target.puppet, params) - return + else + puppet.ClickOn(target, params) - puppet.ClickOn(target, params) + puppet.next_click = world.time + puppet.next_move = world.time /datum/test_puppeteer/proc/spawn_mob_nearby(mob_type) for(var/turf/T in RANGE_TURFS(1, puppet)) @@ -65,12 +76,13 @@ /datum/test_puppeteer/proc/change_turf_nearby(turf_type, direction = -1) var/turf/T + var/turf/center = get_turf(puppet) if(direction >= 0) T = get_step(puppet, direction) else // just check for any contents, not blocked_turf which includes turf density // (which we don't really care about) - for(var/turf/nearby in RANGE_TURFS(1, puppet)) + for(var/turf/nearby in RANGE_TURFS(1, center)) if(!length(nearby.contents)) T = nearby @@ -91,9 +103,50 @@ /datum/test_puppeteer/proc/rejuvenate() puppet.rejuvenate() +/datum/test_puppeteer/proc/get_last_chatlog() + var/list/puppet_chat_list = get_chatlogs() + if(length(puppet_chat_list)) + return puppet_chat_list[length(puppet_chat_list)] + /datum/test_puppeteer/proc/last_chatlog_has_text(snippet) + return findtextEx(get_last_chatlog(), snippet) + +/datum/test_puppeteer/proc/any_chatlog_has_text(snippet) + for(var/chat_line in get_chatlogs()) + if(findtextEx(chat_line, snippet)) + return TRUE + + return FALSE + +/datum/test_puppeteer/proc/get_chatlogs() if(!(puppet.mind.key in GLOB.game_test_chats)) - return FALSE - var/list/puppet_chat_list = GLOB.game_test_chats[puppet.mind.key] - var/last_chat_html = puppet_chat_list[length(puppet_chat_list)] - return findtextEx(last_chat_html, snippet) + return list() + return GLOB.game_test_chats[puppet.mind.key] + +/datum/test_puppeteer/proc/find_nearby(atom_type) + for(var/turf/T in RANGE_TURFS(1, puppet)) + for(var/atom/A in T.contents) + if(istype(A, atom_type)) + return A + +// No we don't technically need to put these things into an actual backpack and +// so forth, we could just leave them lying around and teleport them to the +// player but this keeps things realistic and may surface issues we wouldn't +// think to test for. +/datum/test_puppeteer/proc/put_away(obj/object) + if(!puppet.back) + puppet.equip_to_appropriate_slot(new/obj/item/storage/backpack) + + var/obj/item/storage/backpack = puppet.back + backpack.handle_item_insertion(object, puppet) + +/datum/test_puppeteer/proc/retrieve(obj/object) + if(!puppet.back) + return + + var/obj/item/storage/backpack = puppet.back + if(!(object in backpack.contents)) + return + + backpack.remove_item_from_storage(object) + puppet.put_in_active_hand(object) diff --git a/code/tests/attack_chain/test_attack_chain_machinery.dm b/code/tests/attack_chain/test_attack_chain_machinery.dm new file mode 100644 index 000000000000..7755af16cfed --- /dev/null +++ b/code/tests/attack_chain/test_attack_chain_machinery.dm @@ -0,0 +1,171 @@ +/datum/game_test/attack_chain_machinery + testing_area_name = "test_attack_chain_machinery.dmm" + var/list/machine_instances_by_type = list() + +/datum/game_test/attack_chain_machinery/proc/teleport_to_first(datum/test_puppeteer/player, obj_type, dir=EAST) + if(length(machine_instances_by_type[obj_type])) + var/machine = machine_instances_by_type[obj_type][1] + player.puppet.forceMove(get_step(machine, dir)) + return machine + TEST_FAIL("could not find [obj_type] to teleport puppet to") + +/datum/game_test/attack_chain_machinery/New() + . = ..() + for(var/turf/T in available_turfs) + for(var/obj/machinery/machine in T) + LAZYOR(machine_instances_by_type[machine.type], machine) + +/datum/game_test/attack_chain_machinery/Run() + var/datum/test_puppeteer/player = new(src) + + // Here we fucking go. There's a lot of machines and interactions to test + // here. The basic plan is to test one or two things within the subtype + // interaction, And then test one or two things that should be handled by + // the parent And possibly combat attacks if necessary. + + // DNA Scanner + var/obj/scanner = teleport_to_first(player, /obj/machinery/dna_scannernew) + var/area/admin_area = get_area(player.puppet) + player.spawn_obj_in_hand(/obj/item/reagent_containers/glass/beaker) + player.click_on(scanner) + TEST_ASSERT_LAST_CHATLOG(player, "You add a beaker") + var/obj/screwdriver = player.spawn_obj_in_hand(/obj/item/screwdriver) + player.click_on(scanner) + TEST_ASSERT_LAST_CHATLOG(player, "You open the maintenance hatch") + player.put_away(screwdriver) + + // Abductor console + var/obj/abductor_console = teleport_to_first(player, /obj/machinery/abductor/console) + var/obj/gizmo = player.spawn_obj_in_hand(/obj/item/abductor/gizmo) + player.click_on(abductor_console) + TEST_ASSERT_LAST_CHATLOG(player, "You link the tool") + qdel(gizmo) + var/obj/welder = player.spawn_obj_in_hand(/obj/item/weldingtool) + player.set_intent("harm") + player.click_on(abductor_console) + TEST_ASSERT_LAST_CHATLOG(player, "You hit Abductor console with the welding tool!") + player.set_intent("help") + player.put_away(welder) + + // Abductor replacement organ storage + var/obj/machinery/abductor/gland_dispenser/dispenser = teleport_to_first(player, /obj/machinery/abductor/gland_dispenser) + var/obj/gland = player.spawn_obj_in_hand(/obj/item/organ/internal/heart/gland) + player.click_on(dispenser) + TEST_ASSERT(gland in dispenser.contents, "did not place gland in dispenser") + + // Autolathe + var/obj/machinery/autolathe/autolathe = teleport_to_first(player, /obj/machinery/autolathe) + autolathe.disk_design_load_delay = 0 + var/obj/design_disk = player.spawn_obj_in_hand(/obj/item/disk/design_disk/golem_shell) + player.click_on(autolathe) + TEST_ASSERT_LAST_CHATLOG(player, "You begin to load a design") + qdel(design_disk) + player.retrieve(screwdriver) + player.click_on(autolathe) + TEST_ASSERT_LAST_CHATLOG(player, "You open the maintenance hatch") + player.put_away(screwdriver) + var/obj/rped = player.spawn_obj_in_hand(/obj/item/storage/part_replacer/tier4) + player.click_on(autolathe) + TEST_ASSERT_LAST_CHATLOG(player, "micro-manipulator replaced with femto-manipulator") + qdel(rped) + + var/obj/machinery/nuclearbomb/nuke = teleport_to_first(player, /obj/machinery/nuclearbomb/undeployed) + var/obj/disk = player.spawn_obj_in_hand(/obj/item/disk/nuclear/unrestricted) + player.click_on(nuke) + TEST_ASSERT_LAST_CHATLOG(player, "You need to deploy") + nuke.extended = TRUE + player.click_on(nuke) + TEST_ASSERT(disk in nuke.contents, "Disk not inserted into nuke") + player.retrieve(screwdriver) + player.click_on(nuke) + TEST_ASSERT_LAST_CHATLOG(player, "You unscrew the control panel") + player.put_away(screwdriver) + + var/obj/camera = teleport_to_first(player, /obj/machinery/camera) + player.retrieve(screwdriver) + player.click_on(camera) // with screwdriver + TEST_ASSERT_LAST_CHATLOG(player, "panel open") + player.put_away(screwdriver) + player.spawn_obj_in_hand(/obj/item/stack/sheet/mineral/plasma) + player.click_on(camera) + TEST_ASSERT_LAST_CHATLOG(player, "You attach the solid plasma") + var/obj/knife = player.spawn_obj_in_hand(/obj/item/kitchen/knife) + player.set_intent("harm") + player.click_on(camera) + TEST_ASSERT_LAST_CHATLOG(player, "You hit the security camera with the kitchen knife") + player.set_intent("help") + player.put_away(knife) + + var/obj/chem_dispenser = teleport_to_first(player, /obj/machinery/chem_dispenser) + player.retrieve(screwdriver) + player.click_on(chem_dispenser) + TEST_ASSERT_LAST_CHATLOG(player, "You open the maintenance hatch") + player.puppet.swap_hand() + player.spawn_obj_in_hand(/obj/item/reagent_containers/glass/beaker) + player.click_on(chem_dispenser) + TEST_ASSERT_LAST_CHATLOG(player, "Close the maintenance panel first") + player.puppet.swap_hand() + player.click_on(chem_dispenser) + player.puppet.swap_hand() + player.click_on(chem_dispenser) + TEST_ASSERT_LAST_CHATLOG(player, "You set the beaker on the machine") + player.put_away(screwdriver) + + var/obj/upload_console = teleport_to_first(player, /obj/machinery/computer/aiupload) + var/obj/ai_module = player.spawn_obj_in_hand(/obj/item/ai_module/asimov) + player.click_on(upload_console) + TEST_ASSERT_LAST_CHATLOG(player, "No AI selected") + qdel(ai_module) + player.retrieve(knife) + player.set_intent("harm") + player.click_on(upload_console) + TEST_ASSERT_LAST_CHATLOG(player, "AI upload console with the kitchen knife") + player.put_away(knife) + + var/obj/machinery/cell_charger/cell_charger = teleport_to_first(player, /obj/machinery/cell_charger) + var/obj/cell = player.spawn_obj_in_hand(/obj/item/stock_parts/cell) + player.click_on(cell_charger) + TEST_ASSERT_LAST_CHATLOG(player, "You insert a cell into the charger") + var/obj/cell2 = player.spawn_obj_in_hand(/obj/item/stock_parts/cell) + player.click_on(cell_charger) + TEST_ASSERT_LAST_CHATLOG(player, "already a cell in the charger") + qdel(cell2) + player.click_on(cell_charger) + TEST_ASSERT_NULL(cell_charger.charging, "cell charger still charging") + qdel(cell) + player.retrieve(screwdriver) + player.click_on(cell_charger) + player.put_away(screwdriver) + rped = player.spawn_obj_in_hand(/obj/item/storage/part_replacer/tier4) + player.click_on(cell_charger) + TEST_ASSERT_LAST_CHATLOG(player, "replaced with quadratic capacitor") + qdel(rped) + + player.puppet.forceMove(top_right.loc) + var/turf/wall = player.change_turf_nearby(/turf/simulated/wall, EAST) + player.spawn_obj_in_hand(/obj/item/mounted/frame/firealarm) + admin_area.requires_power = TRUE + player.click_on(wall) + admin_area.requires_power = FALSE + player.spawn_obj_in_hand(/obj/item/firealarm_electronics) + var/obj/firealarm_frame = player.find_nearby(/obj/machinery/firealarm) + player.click_on(firealarm_frame) + TEST_ASSERT_LAST_CHATLOG(player, "You insert the circuit") + var/obj/cables = player.spawn_obj_in_hand(/obj/item/stack/cable_coil/ten) + player.click_on(firealarm_frame) + TEST_ASSERT_LAST_CHATLOG(player, "You wire") + qdel(cables) + player.retrieve(screwdriver) + player.click_on(firealarm_frame) + TEST_ASSERT_LAST_CHATLOG(player, "You close the panel") + player.put_away(screwdriver) + + var/obj/protolathe = teleport_to_first(player, /obj/machinery/r_n_d/protolathe) + var/obj/item/reagent_containers/bottle = player.spawn_obj_in_hand(/obj/item/reagent_containers/glass/bottle/ammonia) + player.click_on(protolathe) + TEST_ASSERT_LAST_CHATLOG(player, "You transfer 10 units of the solution to Protolathe.") + + var/obj/imprinter = teleport_to_first(player, /obj/machinery/r_n_d/circuit_imprinter) + bottle.amount_per_transfer_from_this = 5 + player.click_on(imprinter) + TEST_ASSERT_LAST_CHATLOG(player, "You transfer 5 units of the solution to Circuit Imprinter.") diff --git a/code/tests/game_tests.dm b/code/tests/game_tests.dm index 0bbe3fff14c8..d482918253ff 100644 --- a/code/tests/game_tests.dm +++ b/code/tests/game_tests.dm @@ -6,6 +6,7 @@ #include "_game_test.dm" #include "atmos\test_ventcrawl.dm" #include "attack_chain\test_attack_chain_cult_dagger.dm" +#include "attack_chain\test_attack_chain_machinery.dm" #include "attack_chain\test_attack_chain_turf.dm" #include "attack_chain\test_attack_chain_vehicles.dm" #include "games\test_cards.dm" diff --git a/config/example/config.toml b/config/example/config.toml index e9d5932ff34a..5819604446c7 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -263,17 +263,18 @@ gamemode_probabilities = [ { gamemode = "changeling", probability = 0 }, { gamemode = "cult", probability = 3 }, { gamemode = "extend-a-traitormongous", probability = 2 }, # Autotraitor - { gamemode = "extended", probability = 3 }, + { gamemode = "extended", probability = 0 }, { gamemode = "nuclear", probability = 2 }, { gamemode = "raginmages", probability = 0 }, { gamemode = "revolution", probability = 0 }, - { gamemode = "traitor", probability = 2 }, - { gamemode = "traitorchan", probability = 3 }, - { gamemode = "traitorvamp", probability = 3 }, - { gamemode = "vampchan", probability = 3 }, - { gamemode = "vampire", probability = 3 }, + { gamemode = "traitor", probability = 0 }, + { gamemode = "traitorchan", probability = 0 }, + { gamemode = "traitorvamp", probability = 0 }, + { gamemode = "vampchan", probability = 0 }, + { gamemode = "vampire", probability = 0 }, { gamemode = "wizard", probability = 2 }, - { gamemode = "trifecta", probability = 3 }, + { gamemode = "trifecta", probability = 0 }, + { gamemode = "dynamic", probability = 20 }, ] # Do we want the amount of traitors to scale with population? traitor_scaling = true diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 54b957409181..fa7219fd1356 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -211,6 +211,7 @@ PRs. People included in this role are: - [AffectedArc07](https://github.com/AffectedArc07) - [Charliminator](https://github.com/hal9000PR) - [DGamerL](https://github.com/DGamerL) +- [FunnyMan3595](https://github.com/FunnyMan3595) - [lewcc](https://github.com/lewcc) - [S34N](https://github.com/S34NW) - [SteelSlayer](https://github.com/SteelSlayer) diff --git a/icons/_nanomaps/DeltaStation_nanomap_z1.png b/icons/_nanomaps/DeltaStation_nanomap_z1.png index 5e3142e7e691..30e35087458b 100644 Binary files a/icons/_nanomaps/DeltaStation_nanomap_z1.png and b/icons/_nanomaps/DeltaStation_nanomap_z1.png differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 6bb68da79e71..0439814e3101 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index 4cccc5ddfadf..360c77e14d5f 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 909a2f22a29f..0e34c8a1d89a 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/species/tajaran/mask.dmi b/icons/mob/clothing/species/tajaran/mask.dmi index 995c54a7c8f7..dd0cf49e6fad 100644 Binary files a/icons/mob/clothing/species/tajaran/mask.dmi and b/icons/mob/clothing/species/tajaran/mask.dmi differ diff --git a/icons/mob/human_races/vox/cyberlimbs/wardtakahashi.dmi b/icons/mob/human_races/vox/cyberlimbs/wardtakahashi.dmi index 02e08843ceea..f80576a2f2e9 100644 Binary files a/icons/mob/human_races/vox/cyberlimbs/wardtakahashi.dmi and b/icons/mob/human_races/vox/cyberlimbs/wardtakahashi.dmi differ diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi index 7e9553d5fc6d..95e835789f55 100644 Binary files a/icons/mob/robot_items.dmi and b/icons/mob/robot_items.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 30cfc1ceb279..f9a134556312 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 85f4cc2df1af..8abc0e30135b 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index ec827afe1c6f..40239587a352 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 18b2cabe3d57..336c85dedd7a 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 40822d164dab..62fa39874485 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index deedf5f28566..ce6214e90112 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index c72150b5abc7..25884cea23a9 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/flora/plants.dmi b/icons/obj/flora/plants.dmi index f1bcedaa312a..9f14a3cb960f 100644 Binary files a/icons/obj/flora/plants.dmi and b/icons/obj/flora/plants.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 7b8e4a277aa0..9fdfed83f5f3 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/robot_parts.dmi b/icons/obj/robot_parts.dmi index d243eed6ef63..83545e4d75d2 100644 Binary files a/icons/obj/robot_parts.dmi and b/icons/obj/robot_parts.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index e4782e846acb..dadcf4b78c9f 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 720c03b1c500..8d0bc1d7b9b9 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/walls/backrooms_wall.dmi b/icons/turf/walls/backrooms_wall.dmi new file mode 100644 index 000000000000..af01ff0a0140 Binary files /dev/null and b/icons/turf/walls/backrooms_wall.dmi differ diff --git a/paradise.dme b/paradise.dme index d4884cec3784..c8c21346afb6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -95,7 +95,7 @@ #include "code\__DEFINES\mob_defines.dm" #include "code\__DEFINES\mod.dm" #include "code\__DEFINES\move_force.dm" -#include "code\__DEFINES\movement_info.dm" +#include "code\__DEFINES\movement_defines.dm" #include "code\__DEFINES\muzzle_flash.dm" #include "code\__DEFINES\newscaster_defines.dm" #include "code\__DEFINES\particle_defines.dm" @@ -135,6 +135,7 @@ #include "code\__DEFINES\tgs.dm" #include "code\__DEFINES\tgui_defines.dm" #include "code\__DEFINES\tickets_defines.dm" +#include "code\__DEFINES\time_defines.dm" #include "code\__DEFINES\tools_defines.dm" #include "code\__DEFINES\turfs.dm" #include "code\__DEFINES\typeids.dm" @@ -160,6 +161,7 @@ #include "code\__DEFINES\dcs\machinery_signals.dm" #include "code\__DEFINES\dcs\mob_signals.dm" #include "code\__DEFINES\dcs\movable_signals.dm" +#include "code\__DEFINES\dcs\moveloop_signals.dm" #include "code\__DEFINES\dcs\obj_signals.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -336,7 +338,6 @@ #include "code\controllers\subsystem\SSrunechat.dm" #include "code\controllers\subsystem\SSsecurity_level.dm" #include "code\controllers\subsystem\SSshuttles.dm" -#include "code\controllers\subsystem\SSspacedrift.dm" #include "code\controllers\subsystem\SSstatpanel.dm" #include "code\controllers\subsystem\SSsun.dm" #include "code\controllers\subsystem\SStgui.dm" @@ -347,6 +348,9 @@ #include "code\controllers\subsystem\SSverb_manager.dm" #include "code\controllers\subsystem\SSvote.dm" #include "code\controllers\subsystem\SSweather.dm" +#include "code\controllers\subsystem\movement\movement_types.dm" +#include "code\controllers\subsystem\movement\SSmovement.dm" +#include "code\controllers\subsystem\movement\SSspacedrift.dm" #include "code\controllers\subsystem\non_firing\SSassets.dm" #include "code\controllers\subsystem\non_firing\SSatoms.dm" #include "code\controllers\subsystem\non_firing\SSchangelog.dm" @@ -402,6 +406,7 @@ #include "code\datums\logging.dm" #include "code\datums\mind.dm" #include "code\datums\mixed.dm" +#include "code\datums\move_manager.dm" #include "code\datums\movement_detector.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\ores.dm" @@ -418,7 +423,6 @@ #include "code\datums\ruins.dm" #include "code\datums\shuttles.dm" #include "code\datums\spawners_menu.dm" -#include "code\datums\spell.dm" #include "code\datums\station_state.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\verb_callbacks.dm" @@ -443,6 +447,7 @@ #include "code\datums\components\deadchat_control.dm" #include "code\datums\components\debris.dm" #include "code\datums\components\defibrillator.dm" +#include "code\datums\components\drift.dm" #include "code\datums\components\ducttape.dm" #include "code\datums\components\edit_complainer.dm" #include "code\datums\components\emissive_blocker.dm" @@ -450,6 +455,7 @@ #include "code\datums\components\forces_doors_open.dm" #include "code\datums\components\fullauto.dm" #include "code\datums\components\ghost_direct_control.dm" +#include "code\datums\components\jetpack_component.dm" #include "code\datums\components\label.dm" #include "code\datums\components\largeobjecttransparency.dm" #include "code\datums\components\material_container.dm" @@ -594,6 +600,7 @@ #include "code\datums\spell_targeting\aoe.dm" #include "code\datums\spell_targeting\click_spell_targeting.dm" #include "code\datums\spell_targeting\clicked_atom.dm" +#include "code\datums\spell_targeting\cone.dm" #include "code\datums\spell_targeting\matter_eater_targeting.dm" #include "code\datums\spell_targeting\reachable_turfs.dm" #include "code\datums\spell_targeting\remoteview_targeting.dm" @@ -636,6 +643,7 @@ #include "code\datums\spells\sentient_sword_lunge.dm" #include "code\datums\spells\shapeshift.dm" #include "code\datums\spells\spacetime_dist.dm" +#include "code\datums\spells\spell_base.dm" #include "code\datums\spells\summon_supermatter.dm" #include "code\datums\spells\summonitem.dm" #include "code\datums\spells\touch_attacks.dm" @@ -654,6 +662,7 @@ #include "code\datums\spells\alien_spells\tail_lash.dm" #include "code\datums\spells\alien_spells\transfer_plasma.dm" #include "code\datums\spells\alien_spells\whisper.dm" +#include "code\datums\spells\cones\cone_spell.dm" #include "code\datums\station_traits\_station_trait.dm" #include "code\datums\station_traits\admin_panel.dm" #include "code\datums\station_traits\negative_traits.dm" @@ -761,6 +770,8 @@ #include "code\game\gamemodes\cult\cult_structures.dm" #include "code\game\gamemodes\cult\ritual.dm" #include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\dynamic\antag_rulesets.dm" +#include "code\game\gamemodes\dynamic\dynamic.dm" #include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" @@ -957,6 +968,7 @@ #include "code\game\machinery\tcomms\tcomms_core.dm" #include "code\game\machinery\tcomms\tcomms_presets.dm" #include "code\game\machinery\vendors\contraband_vendors.dm" +#include "code\game\machinery\vendors\custom_vendors.dm" #include "code\game\machinery\vendors\departmental_vendors.dm" #include "code\game\machinery\vendors\generic_vendors.dm" #include "code\game\machinery\vendors\tilt_crits.dm" @@ -1066,6 +1078,7 @@ #include "code\game\objects\effects\spawners\random\toy_spawners.dm" #include "code\game\objects\effects\spawners\random\trash_spawners.dm" #include "code\game\objects\effects\spawners\random\pool\pool_spawner.dm" +#include "code\game\objects\effects\spawners\random\pool\space_loot.dm" #include "code\game\objects\effects\spawners\random\pool\spawn_pool.dm" #include "code\game\objects\effects\spawners\random\pool\spawn_pool_manager.dm" #include "code\game\objects\effects\spawners\random\traders\trader_department_spawners.dm" @@ -1521,8 +1534,8 @@ #include "code\modules\antagonists\_common\antag_hud.dm" #include "code\modules\antagonists\_common\antag_spawner.dm" #include "code\modules\antagonists\_common\antag_team.dm" -#include "code\modules\antagonists\abductor\team_abductor.dm" #include "code\modules\antagonists\abductor\datum_abductor.dm" +#include "code\modules\antagonists\abductor\team_abductor.dm" #include "code\modules\antagonists\antag_org\antag_org_datum.dm" #include "code\modules\antagonists\antag_org\antag_org_syndicate.dm" #include "code\modules\antagonists\changeling\changeling_power.dm" @@ -1996,6 +2009,7 @@ #include "code\modules\games\unum.dm" #include "code\modules\hallucinations\hallucination_manager.dm" #include "code\modules\hallucinations\hallucinations.dm" +#include "code\modules\hallucinations\effects\backrooms.dm" #include "code\modules\hallucinations\effects\blind_rush_hallucination.dm" #include "code\modules\hallucinations\effects\common.dm" #include "code\modules\hallucinations\effects\grenades.dm" @@ -2229,8 +2243,8 @@ #include "code\modules\mob\dead\observer\observer_login.dm" #include "code\modules\mob\dead\observer\observer_logout.dm" #include "code\modules\mob\dead\observer\observer_say.dm" +#include "code\modules\mob\dead\observer\observer_spells.dm" #include "code\modules\mob\dead\observer\orbit.dm" -#include "code\modules\mob\dead\observer\spells.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" @@ -2924,6 +2938,7 @@ #include "code\modules\surgery\robotics.dm" #include "code\modules\surgery\surgery.dm" #include "code\modules\surgery\surgery_helpers.dm" +#include "code\modules\surgery\tending.dm" #include "code\modules\surgery\tools.dm" #include "code\modules\surgery\organs\augments_arms.dm" #include "code\modules\surgery\organs\augments_eyes.dm" diff --git a/rustlibs.dll b/rustlibs.dll index 4f034d0014c6..a4b6dd3858ce 100644 Binary files a/rustlibs.dll and b/rustlibs.dll differ diff --git a/rustlibs_prod.dll b/rustlibs_prod.dll index 171ab58f9141..67b578febb52 100644 Binary files a/rustlibs_prod.dll and b/rustlibs_prod.dll differ diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 2d118c7a5b94..32bc61e25829 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -32,4 +32,4 @@ HONK. Solars probably give radiation poisoning or something, considering the other power sources are deadly in their own ways. Nanotrasen would like to remind you that the popular "Deathsquad" show is completely fictional. The Deathsquad is not real. Making any suggestion to the contrary is grounds for immediate termination. It's rumored that you can recolor the fur on station pets in washing machines by also throwing in a crayon. -Smoking is cool, but you have to light that cigarette before you can use it! How many ways to light a cigarette can you name? +Smoking is cool, but you have to light that cigarette before you can use it! How many ways to light a cigarette can you name? diff --git a/strings/tips.txt b/strings/tips.txt index 9aa338604e80..bf56b84d2461 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -130,8 +130,6 @@ As a Traitor, you can manufacture and recycle revolver bullets at a hacked autol As a Traitor, you may sometimes be assigned to hunt other traitors, and in turn be hunted by others. As a Traitor, the syndicate encryption key is very useful for coordinating plans with your fellow traitors -- or, of course, betraying them. As a Traitor, plasma can be injected into many things to sabotage them. Power cells, light bulbs, cigars and e-cigs will all explode when used. -As a Traitor, if you can find another Traitor and pool your TC you can buy a mega surplus crate, which costs 200 TC but contains a lot of random syndicate gear. -As a Traitor, you can eject someone from cloning early by disabling power in genetics. Note that they will suffer more genetic damage and may lose vital organs from this. As a Nuclear Operative, communication is key! Use ; to speak to your fellow operatives and coordinate an attack plan. As a Nuclear Operative, you should look into purchasing a syndicate cyborg, as they can provide heavy fire support, full access, are immune to conventional stuns, and can easily take down the AI. As a Nuclear Operative, stick together! While your equipment is robust, your fellow operatives are much better at saving your life: they can drag you away from danger while stunned and provide cover fire. diff --git a/tgui/packages/tgui/interfaces/EFTPOS.js b/tgui/packages/tgui/interfaces/EFTPOS.js index d72cb52bf190..2c32259dde4a 100644 --- a/tgui/packages/tgui/interfaces/EFTPOS.js +++ b/tgui/packages/tgui/interfaces/EFTPOS.js @@ -37,7 +37,7 @@ export const EFTPOS = (props, context) => { const LockedView = (props, context) => { const { act, data } = useBackend(context); - const { transaction_amount, transaction_paid } = data; + const { transaction_amount, transaction_paid, can_offer } = data; return ( <> { ? 'This transaction has been processed successfully ' : 'Swipe your card to finish this transaction.'} + {(can_offer && ( + +
    Antagonist Positions
    Antagonist Positions
    [replacetext(role, " ", " ")][replacetext(role, " ", " ")][replacetext(role, " ", " ")][replacetext(role, " ", " ")][replacetext(role, " ", " ")][replacetext(role, " ", " ")][replacetext(role, " ", " ")][replacetext(role, " ", " ")]