diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index 4faed2fee9..8113c586ff 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -4,32 +4,32 @@ /area/template_noop) "ab" = ( /turf/closed/mineral/random/low_chance, -/area/ruin/space) +/area/ruin/unpowered) "ac" = ( /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/unpowered) "ad" = ( /obj/machinery/hydroponics/soil, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "ae" = ( /turf/closed/wall/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "af" = ( /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "ag" = ( /obj/structure/shuttle/engine/propulsion/right{ dir = 4 }, /turf/closed/wall/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "ah" = ( /obj/structure/table/wood, /obj/item/shovel, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "ai" = ( /obj/structure/lattice, /turf/template_noop, @@ -37,35 +37,33 @@ "aj" = ( /obj/machinery/computer/cryopod, /turf/closed/wall/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "ak" = ( /obj/structure/fluff/empty_cryostasis_sleeper, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "al" = ( /obj/machinery/status_display/shuttle, /turf/closed/wall/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "am" = ( -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/protolathe/department/science, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "an" = ( /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "ao" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "ap" = ( /obj/machinery/light{ dir = 1 }, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "aq" = ( /obj/machinery/computer{ desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; @@ -73,37 +71,38 @@ name = "Broken Computer" }, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "ar" = ( /obj/machinery/door/airlock/titanium{ name = "Escape Pod Airlock" }, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "as" = ( /obj/machinery/light, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "at" = ( /obj/structure/shuttle/engine/propulsion/left{ dir = 4 }, /turf/closed/wall/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "au" = ( /obj/item/seeds/tower, /obj/item/seeds/tower, /obj/item/seeds/tower, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "av" = ( /obj/structure/table/wood, /obj/item/paper/crumpled{ info = "

So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders." }, /obj/item/pen, +/obj/item/stock_parts/cell/hyper, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aw" = ( /obj/item/stack/sheet/mineral/wood, /obj/item/stack/sheet/mineral/wood, @@ -111,51 +110,53 @@ /obj/item/stack/sheet/mineral/wood, /obj/item/stack/sheet/mineral/wood, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "ax" = ( /obj/item/twohanded/spear, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "ay" = ( /obj/item/grown/log, /obj/item/grown/log, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "az" = ( /obj/structure/table/wood, /obj/item/storage/bag/plants/portaseeder, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aA" = ( /turf/open/floor/plating/asteroid/airless, -/area/ruin/space) +/area/ruin/unpowered) "aB" = ( /obj/item/seeds/banana, /obj/item/seeds/banana, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aC" = ( /obj/effect/mob_spawn/human/clown/corpse, /obj/structure/fans/tiny/invisible, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aD" = ( /obj/item/mining_scanner, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) +"aE" = ( +/turf/open/floor/plating/asteroid/airless, +/area/ruin/powered) "aF" = ( -/obj/item/pickaxe/emergency, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aG" = ( /obj/structure/sink/puddle, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aH" = ( /obj/structure/table/wood, /obj/item/storage/firstaid/regular, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aI" = ( /obj/effect/mob_spawn/human/corpse/assistant, /turf/template_noop, @@ -164,17 +165,17 @@ /obj/structure/table/wood, /obj/item/storage/bag/ore, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aK" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aL" = ( /obj/structure/table/wood, /obj/item/storage/toolbox/mechanical, /obj/item/clothing/head/welding, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aM" = ( /mob/living/simple_animal/hostile/carp, /turf/template_noop, @@ -182,38 +183,38 @@ "aN" = ( /obj/structure/mineral_door/sandstone, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aO" = ( /mob/living/simple_animal/hostile/carp, /turf/open/floor/plating/asteroid/airless, -/area/ruin/space) +/area/ruin/unpowered) "aP" = ( /obj/item/stack/ore/gold, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aQ" = ( /obj/item/stack/ore/gold, /obj/item/stack/ore/gold, /obj/item/stack/ore/gold, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aR" = ( /obj/item/stack/ore/iron, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aS" = ( /turf/closed/wall/mineral/iron, -/area/ruin/space) +/area/ruin/powered) "aT" = ( /obj/item/stack/ore/iron, /obj/item/stack/ore/iron, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aU" = ( /obj/item/flashlight/lamp, /obj/structure/table/wood, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "aV" = ( /obj/item/clothing/suit/space/orange, /turf/template_noop, @@ -232,76 +233,84 @@ job_description = "Space Hermit" }, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) +"aZ" = ( +/turf/closed/mineral/random/low_chance, +/area/ruin/powered) +"ba" = ( +/turf/closed/mineral/random/low_chance/earth_like, +/area/ruin/powered) +"bb" = ( +/turf/closed/mineral/random/earth_like, +/area/ruin/powered) "bc" = ( /obj/item/circuitboard/machine/circuit_imprinter, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bd" = ( /obj/item/grown/bananapeel, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "be" = ( /obj/effect/mob_spawn/human/corpse/cargo_tech, /obj/structure/fans/tiny/invisible, -/obj/effect/decal/cleanable/vomit, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bf" = ( /obj/item/clothing/glasses/meson, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bg" = ( -/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin/adv, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bh" = ( /obj/item/circuitboard/machine/autolathe, /turf/open/floor/mineral/titanium, -/area/ruin/space) +/area/ruin/powered) "bi" = ( -/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator/pico, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bj" = ( /obj/item/holosign_creator/atmos, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bk" = ( /obj/structure/holosign/barrier/atmos, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bl" = ( /obj/machinery/power/floodlight, /obj/structure/cable{ icon_state = "0-2" }, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bm" = ( /obj/structure/cable{ icon_state = "1-4" }, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bn" = ( /obj/structure/cable{ icon_state = "2-8" }, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bo" = ( /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bp" = ( /obj/item/stack/ore/iron, /obj/item/stack/ore/iron, /obj/item/stack/ore/iron, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bq" = ( /obj/structure/cable, /obj/machinery/power/port_gen/pacman{ @@ -310,20 +319,54 @@ sheets = 10 }, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "br" = ( /obj/item/stack/ore/iron, /obj/item/stack/sheet/mineral/plasma, /obj/item/stack/sheet/mineral/plasma, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bs" = ( /obj/item/flashlight/lamp/bananalamp, /turf/open/floor/plating/asteroid, -/area/ruin/space) +/area/ruin/powered) "bt" = ( /turf/closed/mineral/random/low_chance/earth_like, -/area/ruin/space) +/area/ruin/unpowered) +"bC" = ( +/obj/item/pickaxe/titanium, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"fp" = ( +/turf/closed/mineral/random/high_chance/earth_like, +/area/ruin/powered) +"jx" = ( +/turf/closed/mineral/silver/earth_like, +/area/ruin/powered) +"nc" = ( +/turf/closed/mineral/bscrystal/earth_like, +/area/ruin/powered) +"JZ" = ( +/turf/closed/mineral/titanium/earth_like, +/area/ruin/powered) +"Lt" = ( +/obj/structure/mirror, +/turf/closed/wall/mineral/iron, +/area/ruin/powered) +"PG" = ( +/turf/closed/mineral/gold/earth_like, +/area/ruin/powered) +"Ue" = ( +/turf/closed/mineral/diamond/earth_like, +/area/ruin/powered) +"VS" = ( +/turf/closed/mineral/uranium/earth_like, +/area/ruin/powered) +"WH" = ( +/obj/item/circuitboard/machine/mining_equipment_vendor/golem, +/obj/item/circuitboard/machine/ore_redemption, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) (1,1,1) = {" aa @@ -408,13 +451,13 @@ aA aA aA aA -ab -ab -ab -ab -ab -ab -ab +aZ +aZ +aZ +aZ +aZ +aZ +aZ aA aA aA @@ -455,20 +498,20 @@ aA aA aA ab -ab -ab -ab -ab -ab -bt -bt -bt -bt -bt -bt -bt -ab -ab +aZ +aZ +aZ +aZ +aZ +bb +bb +bb +bb +bb +bb +bb +aZ +aZ ab aA aA @@ -503,27 +546,27 @@ aa aa aa aA -ab -ab -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -ab +aZ +aZ +aZ +ba +ba +ba +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +ba +ba +ba +aZ +aZ aA aa aa @@ -554,29 +597,29 @@ aA aA aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab +aZ +ba +ba +ba +ba +ba +ba +ba +ba +fp +bb +bb +bb +bb +bb +bb +bb +ba +ba +ba +ba +ba +aZ aA aa aa @@ -600,36 +643,36 @@ aa aa aa aA -ab -ab -ab -ab +aZ +aZ +aZ +aZ aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab +aZ +ba +ba +fp +ba +bb +ba +bb +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +bb +bb +ba +ba +ba +ba +aZ aA aa aM @@ -651,38 +694,38 @@ aa aM aa aA -ab -bt -bt -bt -bt -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab +aZ +bb +bb +bb +bb +aZ +ba +fp +ba +ba +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +ba +bb +bb +bb +bb +ba +ba +aZ aA aa aa @@ -703,39 +746,39 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +ba +ba +ba +VS +ba +ba +ba +ba +bb +ba +bb +bb +JZ +bb +bb +bb +bb ae af ae -bt -bt -bt -bt -bt -bt -bt -ab +bb +bb +bb +bb +ba +ba +ba +aZ aA aa aa @@ -755,40 +798,40 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +fp +fp +fp +ba +ba +ba +ba +bb +bb +ba +JZ +ba +ba +ba +bb +bb +bb af aq af -bt -bt -bt -bt -bt -bt -bt -bt -ab +ba +bb +bb +bb +bb +fp +ba +ba +aZ aA aa aa @@ -807,40 +850,40 @@ aa aa aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +fp +VS +fp +ba +bb +fp +fp +bb +ba +bb +bb +bb +bb +fp +bb +bb ae ae ao ae ae -bt -bt -bt -bt -bt -bt -bt -ab +ba +fp +bb +bb +bb +bb +bb +aZ aA aa aa @@ -859,41 +902,41 @@ aa aa aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +ba +ba +bb +ba +Ue +ba +bb +bb +bb +bb +bb +bb +ba +ba +bb +bb af an an an af -bt -bt -bt -bt -bt -bt -bt -bt -ab +ba +fp +bb +bb +bb +fp +bb +ba +aZ aA aa "} @@ -912,25 +955,25 @@ aa aA aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +bb +Ue +ba +bb +ba +ba +bb +fp +bb +fp +fp +ba +ba +bb ae ae bh @@ -938,14 +981,14 @@ an an ae ae -bt -bt -bt -bt -bt -bt -bt -ab +fp +fp +bb +jx +fp +bb +ba +aZ aA aa "} @@ -964,25 +1007,25 @@ aa aA aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +bb +bb +ba +ba +ba +ba +bb +ba +bb +ba +ba +ba +ba +bb af aY ao @@ -990,14 +1033,14 @@ ao ao ak af -bt -bt -bt -bt -bt -bt -bt -ab +ba +bb +fp +bb +bb +bb +ba +aZ aA aa "} @@ -1016,25 +1059,25 @@ aa aA aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +bb +bb +bb +bb +fp +bb +ba +fp +ba +bb +bb +bb +ba +ba +ba +bb +bb al aj ap @@ -1042,14 +1085,14 @@ an as aj al -bt -bt -bt -bt -bt -bt -bt -ab +ba +bb +jx +bb +bb +fp +ba +aZ aA aa "} @@ -1068,25 +1111,25 @@ aa aA aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +bb +fp +bb +bb +bb +bb +bb +ba +ba +ba +fp +fp +fp +bb +bb +bb +bb +bb af ak ao @@ -1094,14 +1137,14 @@ ao ao ak af -ac -bt -bt -bt -bt -bt -bt -ab +aF +bb +bb +bb +bb +bb +ba +aZ aA aa "} @@ -1120,24 +1163,24 @@ aa aA aA ab -bt -bt -bt -bt -bt -bt -bt -bt +ba +bb +bb +bb +bb +bb +bb +bb ah az -bt -bt -bt -bt -bt -bt -bt -bt +ba +ba +ba +ba +ba +ba +ba +bb aR ae ae @@ -1146,14 +1189,14 @@ an an ae ae -ac -bt -bt -bt -bt -bt -bt -ab +aF +bb +bb +bb +bb +bb +bb +aZ aA aM "} @@ -1172,24 +1215,24 @@ aa aA aA ab -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac -bt -bt -bt -bt -bt -bt -bt -bt +ba +bb +bb +bb +bb +bb +bb +ba +aF +aF +ba +ba +ba +ba +ba +ba +ba +bb aR ag ag @@ -1198,14 +1241,14 @@ ar af at at -ac -bt -bt -bt -bt -bt -bt -ab +aF +bb +fp +bb +bb +bb +bb +aZ aA aa "} @@ -1224,40 +1267,40 @@ aa aA aA ab -bt -bt -bt -bt -bt -bt -bt +ba +bb +bb +bb +bb +bb +bb ad -ac -ac -ac -ac -bt +aF +aF +aF +aF +ba aH aJ aL -bt -bt +bb +bb aT -ac -ac -ac -ac -ac -ac -ac +aF +aF +aF +aF +aF +aF +aF aR -bt -bt -bt -bt -bt -bt -ab +bb +bb +bb +bb +bb +bb +aZ aA aa "} @@ -1273,43 +1316,43 @@ aa aa aa aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +ba +bb +bb +bb +bb +bb +bb ad au -ac +aF aB -am -ac -ac -ac -ac -bt -bt -ac -ac -ac -ac -ac -ac -ac -ac +aF +aF +aF +aF +aF +ba +bb +aF +aF +aF +aF +aF +aF +aF +aF bg -bt -bt -bt -bt -bt -bt -ab +bb +fp +jx +bb +bb +bb +aZ aA aa "} @@ -1325,43 +1368,43 @@ aa aa aa aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +ba +bb +bb +bb +bb +bb +bb ad aw bs aC -ac -ac -ac -ac -ac -bt -bt -bt -ac -ac -ac -ac -ac -ac -ac -bt -bt -bt -bt -bt -bt -bt -ab +bC +WH +aF +aF +aF +ba +bb +bb +aF +aF +aF +aF +aF +aF +aF +bb +bb +bb +bb +bb +bb +bb +aZ aA aa "} @@ -1377,43 +1420,43 @@ aM aa aa aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +bb +bb +bb +bb +bb +bb +bb ad ax -ac +aF aD aF -ac -ac -ac -bt -bt -bt +aF +aF +aF +bb +bb +bb aU bd -ac -ac +aF +aF bl bm -ac -ac -bt -bt -bt -bt -bt -bt -bt -ab +aF +aF +bb +bb +bb +bb +bb +bb +bb +aZ aA aa "} @@ -1429,43 +1472,43 @@ aa aa aa aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +bb +fp +bb +fp +bb +bb +bb ad ay -ac -ac -ac +aF +aF +aF aG -ac -ac -bt -bt -bt +aF +aF +bb +bb +ba av be -ac -ac -ac +aF +aF +aF bn bo bo bq -bt -bt -bt -bt -bt -bt -ab +bb +bb +bb +fp +ba +ba +aZ aA aa "} @@ -1481,43 +1524,43 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac -ac -ac -ac -ac -ac -bt -bt -bt +aZ +ba +ba +ba +bb +bb +bb +bb +bb +bb +ba +aF +aF +aF +aF +aF +aF +aF +bb +bb +bb bc bf -ac -ac -ac -ac -ac -ac +aF +aF +aF +aF +aF +aF br -bt -bt -bt -bt -bt -ab -aA +bb +bb +bb +bb +ba +aZ +aE aa aa "} @@ -1532,43 +1575,43 @@ aa aa aa aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -bt -ac -ac -ac -ac -ac -bt -bt -ac -ac -ac -ac -ac -ac -ac -ac -ac -bt -bt -bt -bt -bt -ab +aE +aZ +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +aF +aF +aF +aF +aF +bb +bb +aF +aF +aF +aF +aF +aF +aF +aF +aF +bb +bb +bb +fp +ba +aZ aA aa aa @@ -1584,42 +1627,42 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac -ac -ac -ac +aZ +ba +ba +ba +ba +bb +bb +bb +fp +bb +bb +bb +bb +bb +bb +aF +aF +aF +aF +aF aN -ac -ac -ac -ac +aF +aF +aF +aF aR -ac -ac -ac -ac -bt -bt -bt -bt -bt -ab +aF +aF +aF +aF +bb +bb +fp +bb +bb +aZ aA aa aa @@ -1636,42 +1679,42 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac -ac -bt -bt -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bt -bt -bt -ab +aZ +ba +ba +ba +bb +nc +bb +bb +bb +bb +bb +bb +bb +bb +bb +ba +aF +aF +aF +ba +ba +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +aF +ba +ba +ba +aZ aa aa aa @@ -1688,42 +1731,42 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +ba +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +ba +ba +ba aK -bt -bt -ac -ac -ac -ac -ac -ac -ac +ba +ba +aF +aF +aF +aF +aF +aF +aF bp -ac -ac +aF +aF aR -bt -bt -ab -aA +ba +ba +aZ +aE aa aa aa @@ -1740,41 +1783,41 @@ aa aa aa aa -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +ba +nc +bb +bb +fp +fp +bb +bb +fp +bb +bb +bb +bb +bb +fp +ba +fp +ba aP -ac -ac -ac -ac -ac -ac -ac -ac -ac +aF +aF +aF +aF +aF +aF +aF +aF +aF aR -bt -bt -ab +ba +ba +aZ aA aa aa @@ -1792,41 +1835,41 @@ aa aa aa aa -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +ba +ba +bb +bb +bb +fp +bb +fp +bb +bb +bb +bb +bb +bb +bb +ba +ba +ba aQ aP -ac -ac +aF +aF aR -ac -ac -ac -ac -bt -ac -bt -bt -ab +aF +aF +aF +aF +bb +aF +ba +ba +aZ aA aa aa @@ -1844,41 +1887,41 @@ aa aa aa aa -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac -ac -ac +aE +aZ +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +PG +bb +bb +ba +ba +ba +ba +ba +aF +aF +aF +aF aP -ac +aF bg -bt -bt -bt -bt -ab +bb +bb +bb +ba +aZ aa aa aa @@ -1896,41 +1939,41 @@ aa aa aa aa -aA -ab -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac -ac -ac -ac -ac +aE +aZ +aZ +ba +ba +bb +bb +bb +fp +bb +bb +bb +fp +bb +PG +fp +bb +bb +bb +bb +bb +ba +ba +aF +aF +aF +aF +aF +aF aS -bt -bt -bt -ab -aA +bb +fp +bb +aZ +aE aa aa aa @@ -1951,38 +1994,38 @@ aa aa aA aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aZ +ba +bb +bb +bb +fp +fp +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +ba bg -ac -ac -ac -ac -ac +aF +aF +aF +aF +aF aS -bt -bt -bt -ab -aA +bb +fp +bb +aZ +aE aa aa aO @@ -2003,38 +2046,38 @@ aa aa aa aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ac -ac +aZ +ba +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +bb +ba +bb +bb +fp +ba +aF +aF bj -ac -ac -ac +aF +aF +aF aS -bt -bt -bt -ab -aA +fp +bb +bb +aZ +aE aa aA ab @@ -2055,38 +2098,38 @@ aa aa aa aa -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt +aE +aZ +ba +ba +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +bb +ba +ba +ba +ba +ba aS bi -ac -ac -ac +aF +aF +aF aS aS -bt -bt -bt -ab -aA +bb +bb +bb +aZ +aE aa aA ab @@ -2108,36 +2151,36 @@ aa aa aM aa -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -bt +aE +aZ +ba +ba +ba +ba +bb +bb +bb +bb +bb +bb +bb +fp +ba +ba +ba +aZ +ba aS -ac -ac -ac -ac +aF +aF +aF +aF aS aS -bt -bt -ab -aA +ba +ba +aZ +aE aa aa aA @@ -2160,36 +2203,36 @@ aa aa aa aa -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -aA -aS +aE +aZ +ba +ba +ba +ba +bb +bb +bb +fp +bb +bb +bb +bb +ba +ba +aZ +aE aS aS +Lt bk bk aS aS aS aS -ab -ab -aA +aZ +aZ +aE aa aa aa @@ -2212,25 +2255,25 @@ aa aa aa aa -aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -aA -aA -aA +aE +aE +aZ +ba +ba +ba +bb +bb +bb +bb +bb +bb +fp +fp +ba +aZ +aE +aE +aE aS aS aS @@ -2238,10 +2281,10 @@ bk aS aS aS -aA -aA -ab -aA +aE +aE +aZ +aE aa aa aa @@ -2265,23 +2308,23 @@ aa aa aa aa -aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -aA -aA +aE +aE +aZ +ba +ba +bb +bb +bb +bb +bb +bb +bb +ba +ba +aZ +aE +aE ai ai ai @@ -2318,21 +2361,21 @@ aa aa aa aa -aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -aA +aE +aE +aZ +ba +fp +fp +bb +bb +bb +bb +bb +ba +ba +aZ +aE aa aa aa @@ -2371,21 +2414,21 @@ aa aa aa aa -aA -aA -ab -bt -bt -bt -bt -bt -bt -bt -bt -bt -bt -ab -ab +aE +aE +aZ +ba +ba +ba +ba +ba +bb +bb +ba +ba +ba +aZ +aZ aa aa aa @@ -2424,20 +2467,20 @@ aa aa aa aa -aA -aA -ab -ab -ab -ab -ab -ab -ab -ab -bt -bt -bt -ab +aE +aE +aZ +aZ +aZ +aZ +aZ +aZ +aZ +aZ +ba +ba +ba +aZ aa aa aa diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 6573e34c4d..d380d30d10 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -3512,15 +3512,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"agW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/command, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/hos) "agX" = ( /obj/machinery/door/poddoor/shutters{ id = "armory2"; @@ -6222,6 +6213,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "amd" = ( @@ -49556,6 +49550,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"cqQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cqR" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, @@ -49825,17 +49823,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"csK" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/door/window/northright{ - name = "Brig Operations"; - req_one_access_txt = "4; 1" - }, -/turf/open/floor/plasteel, -/area/security/brig) "csM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -53139,6 +53126,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit, /area/ai_monitored/nuke_storage) +"cKC" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) "cMC" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -53159,14 +53156,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"cME" = ( -/obj/structure/rack, -/obj/item/storage/firstaid, -/obj/item/clothing/glasses/hud/health, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) "cMQ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53337,6 +53326,22 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cOV" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/prison) "cPn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/freezer, @@ -53815,22 +53820,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"daA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, +"cZe" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, -/area/security/processing) +/area/security/brig) "daI" = ( /obj/structure/reagent_dispensers/foamtank, /obj/effect/turf_decal/tile/yellow{ @@ -53925,29 +53921,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"dmX" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - id = "Cell 2"; - name = "Cell 2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "dqb" = ( /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) @@ -53955,16 +53928,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"drO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) "dsC" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -54002,27 +53965,12 @@ }, /turf/closed/wall, /area/science/circuit) -"dys" = ( -/obj/effect/spawner/structure/window/reinforced, +"dyE" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/brig) -"dyB" = ( -/obj/effect/decal/cleanable/vomit, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "dyS" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -54073,24 +54021,18 @@ "dFX" = ( /turf/closed/wall, /area/crew_quarters/fitness/pool) -"dHU" = ( -/obj/structure/bed/dogbed{ - desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off."; - name = "pet bed" - }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) -"dIP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"dJL" = ( +/obj/structure/cable{ + icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "2-4" +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_access_txt = "58" }, -/turf/open/floor/plasteel, -/area/security/processing) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hos) "dKP" = ( /turf/closed/wall, /area/maintenance/bar) @@ -54124,6 +54066,12 @@ /obj/item/clothing/shoes/jackboots, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dPq" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) "dTI" = ( /obj/structure/urinal{ pixel_y = 32 @@ -54133,22 +54081,6 @@ "dVU" = ( /turf/open/floor/plating, /area/space/nearstation) -"dWM" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/recharger, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/turf/open/floor/plasteel, -/area/security/range) "dXq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -54159,8 +54091,9 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"dXP" = ( -/turf/closed/wall/r_wall, +"dYZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/security/range) "eaI" = ( /obj/structure/table/reinforced, @@ -54183,10 +54116,6 @@ dir = 4 }, /area/crew_quarters/fitness/pool) -"ecD" = ( -/obj/item/cigbutt/cigarbutt, -/turf/open/floor/plating, -/area/maintenance/fore) "edA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54228,6 +54157,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"ene" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "enB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -54262,6 +54197,27 @@ }, /turf/open/floor/plasteel/freezer, /area/security/prison) +"esK" = ( +/obj/machinery/door/airlock/maintenance/abandoned{ + name = "Chemical Storage"; + req_access_txt = "12" + }, +/obj/structure/barricade/wooden, +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/fore) +"esL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/open/floor/plasteel, +/area/security/brig) "esZ" = ( /obj/machinery/door/airlock{ desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; @@ -54300,6 +54256,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"eAG" = ( +/obj/item/clothing/under/pj/blue, +/obj/item/clothing/shoes/sneakers/white, +/turf/open/floor/plating, +/area/maintenance/fore) "eAJ" = ( /obj/structure/chair{ dir = 4 @@ -54335,27 +54296,6 @@ /obj/item/clothing/under/lawyer/red, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"eCQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/rack, -/obj/item/storage/box/zipties{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/storage/box/zipties{ - pixel_x = 1; - pixel_y = -1 - }, -/turf/open/floor/plasteel, -/area/security/brig) "eCR" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -54374,6 +54314,25 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"eFx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "eFW" = ( /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating/airless, @@ -54408,17 +54367,6 @@ "eQb" = ( /turf/open/floor/carpet, /area/crew_quarters/dorms) -"eRh" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/turf/open/floor/plating, -/area/security/brig) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -54452,6 +54400,23 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"eWL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/prison) +"eXz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + pixel_x = 0 + }, +/turf/open/floor/plasteel, +/area/security/processing) "fcn" = ( /obj/structure/lattice, /turf/closed/wall/r_wall, @@ -54462,6 +54427,11 @@ }, /turf/closed/wall/r_wall, /area/science/mixing) +"fdQ" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plating, +/area/maintenance/fore) "feE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54542,6 +54512,25 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"foT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/processing) "fpl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -54575,6 +54564,25 @@ dir = 1 }, /area/hallway/secondary/entry) +"fsa" = ( +/obj/machinery/button/door{ + id = "armory3"; + name = "Armory Shutters"; + pixel_y = 26; + req_access_txt = "3" + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "fsj" = ( /obj/structure/table, /obj/item/clothing/glasses/sunglasses{ @@ -54633,6 +54641,10 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"fxx" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/security/brig) "fxV" = ( /turf/closed/wall/r_wall, /area/hallway/primary/central) @@ -54675,16 +54687,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"fEw" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) "fFA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54709,21 +54711,26 @@ /obj/structure/lattice, /turf/open/floor/plating, /area/space/nearstation) +"fJY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/processing) "fKl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/circuit) -"fLS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/security/prison) +"fMp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "fOA" = ( /obj/machinery/door/airlock{ name = "Theatre Backstage"; @@ -54764,6 +54771,22 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"gav" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/processing) "gbd" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -54795,16 +54818,6 @@ /obj/effect/spawner/lootdrop/bedsheet, /turf/open/floor/plating, /area/security/prison) -"gbM" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/security/brig) "gbT" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -54854,21 +54867,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"gjc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = 20 - }, -/turf/open/floor/plasteel, -/area/security/brig) "gjl" = ( /turf/closed/wall, /area/quartermaster/warehouse) @@ -54909,34 +54907,12 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness) -"guS" = ( -/obj/machinery/light/small{ - dir = 8 +"gsM" = ( +/obj/machinery/door/airlock/maintenance/abandoned{ + req_access_txt = "12" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_x = -27; - pixel_y = -27; - prison_radio = 1 - }, -/obj/machinery/flasher{ - id = "Cell 3"; - pixel_x = -24; - pixel_y = -36 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - pixel_x = 0 - }, -/obj/structure/bed, -/obj/item/bedsheet/yellow, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plating, +/area/maintenance/fore) "gvX" = ( /turf/open/floor/plasteel/yellowsiding, /area/crew_quarters/fitness/pool) @@ -54962,6 +54938,10 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"gyr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/brig) "gzf" = ( /obj/structure/window/reinforced/tinted{ dir = 8 @@ -54972,24 +54952,16 @@ /obj/structure/curtain, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) +"gzY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/fore) "gBo" = ( /obj/structure/cable{ icon_state = "1-8" }, /turf/open/floor/wood, /area/maintenance/bar) -"gCm" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) "gCC" = ( /obj/structure/sign/poster/contraband/tools, /turf/closed/wall, @@ -54998,6 +54970,20 @@ /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"gDP" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28; + pixel_y = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/open/floor/plasteel, +/area/security/processing) "gIU" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -55008,6 +54994,16 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"gLz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) "gLH" = ( /obj/machinery/door/airlock/external{ name = "External Access"; @@ -55035,6 +55031,17 @@ }, /turf/open/floor/wood, /area/bridge/meeting_room) +"gNE" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/security/brig) "gOZ" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -55083,6 +55090,9 @@ }, /turf/open/floor/plating, /area/construction) +"gWo" = ( +/turf/closed/wall, +/area/security/range) "gXs" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -55094,20 +55104,6 @@ dir = 8 }, /area/medical/sleeper) -"gZQ" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig Infirmary"; - req_access_txt = "2"; - req_one_access_txt = "0" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/brig) "haL" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -55165,25 +55161,17 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/department/electrical) -"hkH" = ( -/obj/structure/cable{ - icon_state = "4-8" +"hlT" = ( +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock"; + req_access_txt = "2"; + shuttledocked = 1 }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plating, +/area/security/processing) "hlV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55206,21 +55194,6 @@ }, /turf/open/floor/plating, /area/security/range) -"hrE" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) "hrF" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -55241,43 +55214,15 @@ }, /turf/open/floor/plating, /area/space/nearstation) -"hwJ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - pixel_x = 0 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"hxc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "hzK" = ( /turf/open/floor/plasteel/yellowsiding/corner{ dir = 1 }, /area/crew_quarters/fitness/pool) +"hBw" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/maintenance/fore) "hBA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table, @@ -55316,43 +55261,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"hIS" = ( -/obj/machinery/vending/snack/random, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"hMo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Prisoner Processing"; - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/processing) -"hMM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/fore"; - dir = 1; - name = "Fore Maintenance APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/fore) "hOv" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -55397,6 +55305,21 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"hSl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "hSZ" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -55410,22 +55333,9 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"hXr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/maintenance/port/fore) -"iaX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, +"ibK" = ( /turf/open/floor/plasteel, -/area/security/brig) +/area/security/processing) "idK" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -55440,11 +55350,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/security/range) -"iiQ" = ( -/obj/structure/table/wood, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) "iiW" = ( /turf/open/floor/wood, /area/maintenance/bar) @@ -55481,6 +55386,20 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"inq" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) +"inw" = ( +/mob/living/simple_animal/hostile/retaliate/goose{ + desc = "Some evil loose goose."; + name = "Cere" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "inR" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -55501,17 +55420,13 @@ "ipA" = ( /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"iqU" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"itD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/security/processing) +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/security/brig) "itG" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -55544,18 +55459,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"iuJ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Prisoner Processing"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel, -/area/security/processing) "iuR" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -55573,6 +55476,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/port) +"izg" = ( +/obj/item/cigbutt/cigarbutt, +/turf/open/floor/plating, +/area/maintenance/fore) "izv" = ( /obj/machinery/vending/clothing, /obj/machinery/light/small{ @@ -55640,13 +55547,25 @@ /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) -"iSW" = ( -/mob/living/simple_animal/hostile/retaliate/goose{ - desc = "Some evil loose goose."; - name = "Cere" +"iPX" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + desc = "Used to grind things up into raw materials and liquids."; + pixel_y = 5 }, +/obj/item/lighter, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"iRj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "iTq" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -55712,6 +55631,14 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"jdj" = ( +/obj/docking_port/stationary/random{ + dir = 4; + id = "pod_lavaland3"; + name = "lavaland" + }, +/turf/open/space, +/area/space) "jex" = ( /obj/machinery/smartfridge/organ/preloaded, /turf/closed/wall, @@ -55740,15 +55667,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"jhb" = ( -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/security/brig) "jjC" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck, @@ -55770,30 +55688,6 @@ /obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/quartermaster/office) -"jmg" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Brig East"; - dir = 8 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/security/brig) "jmV" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -55818,10 +55712,6 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"jtV" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plating, -/area/maintenance/fore) "juG" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -55838,11 +55728,6 @@ /obj/structure/closet/athletic_mixed, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"jvO" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/structure/rack, -/turf/open/floor/plating, -/area/maintenance/fore) "jxF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55850,6 +55735,21 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/port) +"jyO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -55909,21 +55809,6 @@ dir = 1 }, /area/crew_quarters/fitness) -"jFe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) "jFH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -55962,16 +55847,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"jIr" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/processing) "jIs" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -55996,11 +55871,6 @@ }, /turf/open/floor/wood, /area/maintenance/port/aft) -"jKC" = ( -/obj/item/clothing/under/pj/blue, -/obj/item/clothing/shoes/sneakers/white, -/turf/open/floor/plating, -/area/maintenance/fore) "jKP" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -56011,12 +55881,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"jLl" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = 32 - }, -/turf/open/space, -/area/space) "jLn" = ( /obj/machinery/door/airlock/engineering{ name = "Gravity Generator"; @@ -56027,6 +55891,12 @@ }, /turf/open/floor/plasteel, /area/engine/engine_smes) +"jLv" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/turf/open/space, +/area/space) "jLT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -56044,25 +55914,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) -"jOY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) "jRw" = ( /obj/machinery/computer/arcade/minesweeper{ dir = 4 @@ -56099,6 +55950,29 @@ "kaq" = ( /turf/closed/wall/mineral/titanium, /area/space/nearstation) +"kbm" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 2"; + name = "Cell 2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "kdO" = ( /obj/machinery/pool/controller, /turf/open/floor/plasteel/yellowsiding, @@ -56110,10 +55984,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/range) -"kdS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/security/brig) "ker" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, @@ -56157,10 +56027,6 @@ }, /turf/open/floor/plating, /area/security/prison) -"kgH" = ( -/obj/structure/lattice, -/turf/closed/wall, -/area/maintenance/fore) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -56256,6 +56122,26 @@ "ktS" = ( /turf/open/space/basic, /area/space/nearstation) +"kuh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"kuA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/open/floor/plasteel, +/area/security/range) "kvl" = ( /obj/structure/grille, /turf/closed/wall/r_wall, @@ -56288,14 +56174,6 @@ dir = 4 }, /area/crew_quarters/fitness) -"kxG" = ( -/obj/item/cigbutt/cigarbutt, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "kyF" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/wood, @@ -56326,6 +56204,15 @@ /obj/structure/window, /turf/open/floor/wood, /area/crew_quarters/bar) +"kCa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/range) "kCo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -56346,17 +56233,6 @@ /obj/effect/landmark/stationroom/box/engine, /turf/open/space/basic, /area/space) -"kGl" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/door/window/northleft{ - name = "Brig Operations"; - req_one_access_txt = "4; 1" - }, -/turf/open/floor/plasteel, -/area/security/brig) "kGJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56373,6 +56249,23 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"kHd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Prisoner Processing"; + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/processing) "kMt" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer, /turf/open/floor/plasteel, @@ -56406,7 +56299,16 @@ /obj/structure/disposalpipe/junction/flip, /turf/open/floor/plasteel, /area/hallway/primary/central) -"kPY" = ( +"kQk" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"kQz" = ( /obj/structure/cable{ icon_state = "4-8" }, @@ -56421,15 +56323,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"kQk" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) "kQO" = ( /obj/structure/reagent_dispensers/keg/semen, /turf/open/floor/plating, @@ -56438,16 +56331,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"kTj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance/abandoned{ + name = "maintenance access"; + req_access_txt = "12" + }, +/obj/structure/barricade/wooden, +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/fore) +"kUC" = ( +/obj/machinery/chem_master/condimaster, +/turf/open/floor/plating, +/area/maintenance/fore) "kWp" = ( /obj/structure/shuttle/engine/heater{ dir = 1 }, /turf/closed/wall/mineral/titanium, /area/space/nearstation) -"kXd" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/maintenance/fore) "kYk" = ( /obj/machinery/door/firedoor, /obj/structure/sign/departments/evac{ @@ -56455,10 +56360,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"kZo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) +"kZS" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/brig) "laq" = ( /obj/structure/cable{ icon_state = "2-8" @@ -56469,28 +56386,22 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/range) -"lcu" = ( +"lfV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) -"lhh" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/firealarm{ + pixel_y = 24 }, /turf/open/floor/plasteel, /area/security/brig) @@ -56555,26 +56466,41 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"lAa" = ( -/turf/open/floor/plating, -/area/security/range) +"lwN" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) "lAB" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/science/circuit) -"lCf" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ +"lAH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, -/area/ai_monitored/security/armory) +/area/security/processing) +"lBz" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door/window/northleft{ + name = "Brig Operations"; + req_one_access_txt = "4; 1" + }, +/turf/open/floor/plasteel, +/area/security/brig) "lCi" = ( /obj/docking_port/stationary/public_mining_dock{ dir = 8 @@ -56596,16 +56522,31 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"lKL" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/security/brig) +"lJC" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Pod Three" + }, +/turf/open/floor/plating, +/area/security/main) "lMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, /area/science/circuit) +"lNH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/security/processing) "lPr" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "applebush" @@ -56616,6 +56557,16 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/science/circuit) +"lRb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/range) "lSa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -56635,12 +56586,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"lXX" = ( -/obj/effect/decal/cleanable/vomit, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) "lZl" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -56649,27 +56594,32 @@ /obj/item/coin/gold, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"lZn" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig Infirmary"; + req_access_txt = "2"; + req_one_access_txt = "0" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"lZs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) "lZK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/closed/wall, /area/crew_quarters/fitness/pool) -"lZR" = ( -/obj/structure/sign/plaques/golden{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) "mbU" = ( /obj/machinery/vr_sleeper{ dir = 8 @@ -56689,15 +56639,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/security/range) -"mdo" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ - name = "Chemical Storage"; - req_access_txt = "12" - }, -/obj/structure/barricade/wooden, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/fore) "meb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/bed, @@ -56729,18 +56670,63 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/crew_quarters/toilet) +"mkU" = ( +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/processing) +"mml" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "mnC" = ( /obj/structure/target_stake, /obj/item/target/syndicate, /turf/open/floor/plating, /area/security/range) -"mnQ" = ( +"mos" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = -27; + pixel_y = -27; + prison_radio = 1 + }, +/obj/machinery/flasher{ + id = "Cell 3"; + pixel_x = -24; + pixel_y = -36 + }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1; pixel_x = 0 }, +/obj/structure/bed, +/obj/item/bedsheet/yellow, /turf/open/floor/plasteel, -/area/security/processing) +/area/security/brig) "moD" = ( /obj/structure/table, /obj/item/reagent_containers/food/snacks/bluecherrycupcake{ @@ -56782,40 +56768,21 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"mxn" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Three" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/main) "myh" = ( /obj/structure/piano, /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/crew_quarters/theatre) -"mym" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_x = -27; - pixel_y = -27; - prison_radio = 1 - }, -/obj/machinery/flasher{ - id = "Cell 1"; - pixel_x = -24; - pixel_y = -36 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - pixel_x = 0 - }, -/obj/structure/bed, -/obj/item/bedsheet/green, -/turf/open/floor/plasteel, -/area/security/brig) "mzB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/window, @@ -56872,12 +56839,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) -"mNJ" = ( -/obj/item/radio/intercom{ - pixel_y = 20 - }, -/turf/open/floor/plating, -/area/security/vacantoffice/b) "mNW" = ( /obj/structure/sign/poster/official/fruit_bowl{ pixel_y = 32 @@ -56969,28 +56930,9 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"nat" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) "naI" = ( /turf/open/space, /area/space/station_ruins) -"nbK" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three" - }, -/turf/open/floor/plating, -/area/security/main) "nbT" = ( /obj/structure/cable{ icon_state = "0-8" @@ -57005,25 +56947,19 @@ }, /turf/open/floor/plating, /area/hallway/primary/central) +"nbY" = ( +/obj/item/melee/baton/cattleprod, +/obj/item/stock_parts/cell/high, +/obj/item/electropack, +/obj/structure/closet/secure_closet{ + name = "Persuasion Storage"; + req_access = "list(2)" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "ndq" = ( /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"ndJ" = ( -/obj/machinery/door/airlock/maintenance/abandoned{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"nea" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"neq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/security/courtroom) "nez" = ( /obj/structure/table/wood, /obj/item/instrument/piano_synth, @@ -57039,6 +56975,14 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"ngU" = ( +/obj/structure/rack, +/obj/item/storage/firstaid, +/obj/item/clothing/glasses/hud/health, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) "ngV" = ( /obj/structure/table/wood, /obj/item/instrument/guitar, @@ -57060,6 +57004,11 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"nnp" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/fore) "noy" = ( /obj/structure/sign/poster/contraband/smoke{ desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; @@ -57073,21 +57022,17 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) -"nqz" = ( -/obj/machinery/light/small{ - dir = 4 +"nss" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/fore) -"nrg" = ( -/obj/machinery/door/window/southright{ - name = "Target Storage" +/obj/machinery/door/window/northright{ + name = "Brig Operations"; + req_one_access_txt = "4; 1" }, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/syndicate, -/turf/open/floor/plating, -/area/security/range) +/turf/open/floor/plasteel, +/area/security/brig) "nsA" = ( /turf/closed/wall, /area/crew_quarters/abandoned_gambling_den) @@ -57114,14 +57059,22 @@ }, /turf/open/floor/plating, /area/construction) -"nBM" = ( -/obj/docking_port/stationary/random{ - dir = 4; - id = "pod_lavaland3"; - name = "lavaland" +"nBI" = ( +/obj/item/cigbutt/cigarbutt, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/chair{ + dir = 1 }, -/turf/open/space, -/area/space) +/turf/open/floor/plating, +/area/maintenance/port/fore) +"nEj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 0; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/security/processing) "nGf" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light{ @@ -57179,14 +57132,6 @@ /obj/machinery/recharge_station, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"nQM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 0; - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/security/processing) "nRG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -57205,35 +57150,21 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"nTG" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/processing) "nUV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, /area/hydroponics) -"nVk" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - id = "Cell 3"; - name = "Cell 3" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/security/brig) "nYe" = ( /obj/structure/safe, /obj/item/clothing/head/bearpelt, @@ -57287,21 +57218,21 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"oaZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +"oby" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, /turf/open/floor/plasteel, -/area/ai_monitored/security/armory) +/area/security/brig) "oce" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -57335,26 +57266,34 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) -"oiW" = ( -/obj/structure/cable{ - icon_state = "1-8" +"okK" = ( +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/green{ + dir = 8 }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = -27; + pixel_y = -27; + prison_radio = 1 + }, +/obj/machinery/flasher{ + id = "Cell 1"; + pixel_x = -24; + pixel_y = -36 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + pixel_x = 0 + }, +/obj/structure/bed, +/obj/item/bedsheet/green, /turf/open/floor/plasteel, /area/security/brig) -"okI" = ( -/obj/machinery/door/airlock/security{ - name = "Firing Range"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/security/range) "old" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -57369,6 +57308,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"omX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/security/prison) "omY" = ( /obj/item/flashlight/lamp/green{ pixel_x = -3; @@ -57413,6 +57362,22 @@ /obj/item/pen/fountain, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"ovv" = ( +/obj/structure/table, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/recharger, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/turf/open/floor/plasteel, +/area/security/range) "oxm" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -57471,6 +57436,10 @@ /obj/structure/fireplace, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"oDm" = ( +/obj/machinery/gulag_teleporter, +/turf/open/floor/plasteel, +/area/security/prison) "oDN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -57486,11 +57455,6 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"oFV" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/fore) "oHB" = ( /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) @@ -57530,49 +57494,23 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"oMS" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/processing) -"oMZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 20 - }, -/turf/open/floor/plasteel, -/area/security/brig) "oNz" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"oOt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 +"oSl" = ( +/obj/machinery/door/airlock/security{ + name = "Firing Range"; + req_access_txt = "2" }, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/red, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/security/processing) -"oRg" = ( -/obj/structure/bed, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/plating, -/area/maintenance/fore) +/area/security/range) "oTW" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -57595,23 +57533,6 @@ /obj/structure/pool/ladder, /turf/open/pool, /area/crew_quarters/fitness/pool) -"oWe" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"oWB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/security/main) "oZl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/pjs, @@ -57626,15 +57547,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"pek" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) "pem" = ( /obj/machinery/button/door{ desc = "Bolts the doors to the Private Study."; @@ -57656,6 +57568,11 @@ }, /turf/open/floor/plating, /area/security/range) +"pjg" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) "pkF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -57685,6 +57602,29 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"plS" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 1"; + name = "Cell 1" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "poc" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -57747,33 +57687,48 @@ dir = 1 }, /area/crew_quarters/fitness) -"pwd" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/obj/item/lighter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/fore) "pzk" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"pAK" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 3"; + name = "Cell 3" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) "pBp" = ( /obj/effect/landmark/event_spawn, /turf/closed/wall, /area/crew_quarters/fitness) -"pEL" = ( -/obj/machinery/light/small{ - dir = 8 +"pDe" = ( +/obj/machinery/door/window/southright{ + name = "Target Storage" }, -/obj/effect/decal/cleanable/dirt, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/syndicate, /turf/open/floor/plating, -/area/maintenance/fore) +/area/security/range) "pFX" = ( /obj/structure/table/wood/fancy, /obj/item/reagent_containers/food/drinks/soda_cans/starkist{ @@ -57833,22 +57788,6 @@ }, /turf/open/floor/wood, /area/library) -"pKR" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/sign/warning/securearea{ - pixel_x = -32 - }, -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "prison blast door" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/security/prison) "pLn" = ( /obj/machinery/conveyor/inverted{ dir = 5; @@ -57883,6 +57822,16 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness) +"pQr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) "pQN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -57907,17 +57856,16 @@ }, /turf/open/space, /area/solar/starboard/aft) -"pWM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-4" +"pUy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/turf/open/floor/plating, -/area/security/brig) +/turf/open/floor/plasteel, +/area/security/processing) "qaY" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -58001,23 +57949,6 @@ /obj/structure/table, /turf/open/floor/plasteel, /area/security/prison) -"qmV" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"qpg" = ( -/obj/structure/closet/secure_closet/chemical, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/fore) "qqs" = ( /obj/structure/mirror{ pixel_y = 32 @@ -58045,9 +57976,6 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) -"qxq" = ( -/turf/closed/wall, -/area/security/range) "qyj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, @@ -58057,15 +57985,6 @@ /obj/structure/lattice, /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain) -"qCC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/range) "qIw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58079,16 +57998,6 @@ }, /turf/open/space, /area/solar/port/aft) -"qLc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "prison blast door" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/security/prison) "qLR" = ( /obj/structure/mirror{ pixel_y = 32 @@ -58134,15 +58043,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"qUk" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/brig) "qVP" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -58166,6 +58066,32 @@ }, /turf/closed/wall/r_wall, /area/science/circuit) +"rcI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 1"; + name = "Cell 1 Locker" + }, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1; + pixel_x = 0 + }, +/turf/open/floor/plasteel, +/area/security/brig) "rdG" = ( /obj/machinery/hydroponics/constructable, /obj/item/radio/intercom{ @@ -58189,6 +58115,10 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"rhX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/processing) "rjQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, @@ -58291,6 +58221,10 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"rtC" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/fore) "ruo" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58337,17 +58271,44 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"rAR" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "rBq" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/maid, /obj/item/clothing/mask/muzzle, /turf/open/floor/plating, /area/maintenance/bar) -"rFw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"rCl" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/holopad, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, /turf/open/floor/plasteel, /area/security/brig) "rGq" = ( @@ -58367,16 +58328,30 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"rJv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/brig) +"rJw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/maintenance/port/fore) "rKP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, /turf/open/floor/plating, /area/construction) -"rKX" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/range) "rMN" = ( /obj/structure/bed, /obj/item/tank/internals/anesthetic, @@ -58404,6 +58379,13 @@ dir = 4 }, /area/crew_quarters/theatre) +"rQJ" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/fore) "rTu" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58414,6 +58396,11 @@ }, /turf/open/floor/plasteel/dark, /area/bridge/meeting_room) +"rTD" = ( +/obj/machinery/vending/snack/random, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "rXl" = ( /obj/structure/chair/office/light, /obj/machinery/firealarm{ @@ -58425,48 +58412,6 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"rYg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/processing) -"rZB" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - id = "Cell 1"; - name = "Cell 1" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -58504,16 +58449,6 @@ dir = 4 }, /area/crew_quarters/fitness) -"sea" = ( -/obj/item/melee/baton/cattleprod, -/obj/item/stock_parts/cell/high, -/obj/item/electropack, -/obj/structure/closet/secure_closet{ - name = "Persuasion Storage"; - req_access = "list(2)" - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) "seP" = ( /obj/structure/cable{ icon_state = "0-4" @@ -58531,6 +58466,10 @@ }, /turf/open/floor/plating, /area/security/brig) +"sfs" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) "shR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -58549,31 +58488,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"soA" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/turf/open/floor/plasteel, -/area/security/brig) +"sqg" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/pj/red, +/obj/item/clothing/shoes/sneakers/white, +/turf/open/floor/plating, +/area/maintenance/fore) "sqp" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58644,8 +58564,13 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"sAr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"sAk" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "sAM" = ( @@ -58839,6 +58764,9 @@ /obj/machinery/vending/boozeomat/all_access, /turf/closed/wall, /area/maintenance/bar) +"sXV" = ( +/turf/closed/wall/r_wall, +/area/security/range) "sYR" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" @@ -58850,22 +58778,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/service) -"tcg" = ( +"tgH" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"thB" = ( /obj/structure/sign/warning/securearea{ pixel_y = -32 }, /turf/open/space, /area/space) -"tfG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) -"tgH" = ( -/obj/structure/filingcabinet/employment, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) "tif" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59007,6 +58929,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"tHh" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) "tJi" = ( /obj/machinery/airalarm{ dir = 4; @@ -59043,6 +58977,12 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"tKb" = ( +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/open/floor/plating, +/area/security/vacantoffice/b) "tKk" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -59083,13 +59023,6 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) -"tQi" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) "tRe" = ( /obj/machinery/chem_master, /turf/open/floor/plasteel/white, @@ -59112,24 +59045,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"tXk" = ( -/obj/machinery/gulag_teleporter, -/turf/open/floor/plasteel, -/area/security/prison) "tXL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"tYH" = ( -/obj/structure/rack, -/obj/item/instrument/banjo, -/obj/item/instrument/harmonica, -/obj/item/instrument/accordion, -/obj/item/instrument/recorder, -/turf/open/floor/plating, -/area/maintenance/fore) "tZe" = ( /obj/effect/turf_decal/bot, /obj/structure/sign/poster/official/pda_ad{ @@ -59168,16 +59089,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"ubI" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light{ - light_color = "#cee5d2" - }, -/turf/open/floor/plasteel, -/area/security/processing) "ucq" = ( /obj/structure/sign/poster/contraband/red_rum{ pixel_y = 32 @@ -59272,19 +59183,9 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) -"usv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"usK" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/pj/red, -/obj/item/clothing/shoes/sneakers/white, +"usE" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/rack, /turf/open/floor/plating, /area/maintenance/fore) "usO" = ( @@ -59294,12 +59195,6 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"uto" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/brig) "uua" = ( /obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/plating, @@ -59323,21 +59218,6 @@ /obj/structure/mineral_door/wood, /turf/open/floor/wood, /area/maintenance/bar) -"uwb" = ( -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) -"uwq" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/security/brig) "uxY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -59372,6 +59252,21 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"uCo" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"uCU" = ( +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/brig) "uDO" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -59402,9 +59297,23 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"uFZ" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light{ + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/security/processing) "uGI" = ( /turf/open/floor/grass, /area/security/prison) +"uHp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/security/main) "uIO" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59492,6 +59401,19 @@ /obj/machinery/pool/drain, /turf/open/pool, /area/crew_quarters/fitness/pool) +"uTe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"uUi" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) "uVS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59504,6 +59426,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"uXt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/security/brig) "vae" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -59543,16 +59469,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"vcQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1; - light_color = "#d1dfff" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "vda" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -59570,22 +59486,36 @@ }, /turf/open/floor/wood, /area/security/vacantoffice) -"vdU" = ( -/obj/machinery/door/window/southleft{ - name = "Target Storage" - }, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target, -/obj/item/target, -/turf/open/floor/plating, -/area/security/range) "veS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall, /area/crew_quarters/fitness/pool) +"vfX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"vgJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/fore"; + dir = 1; + name = "Fore Maintenance APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "vhb" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -59655,6 +59585,14 @@ /obj/item/clothing/under/pj/blue, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"vqP" = ( +/obj/structure/bed/dogbed{ + desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off."; + name = "pet bed" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) "vsM" = ( /obj/machinery/power/apc/auto_name/south, /obj/structure/cable, @@ -59695,35 +59633,30 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"vxA" = ( +"vxX" = ( /obj/machinery/door/airlock/external{ - name = "Escape Pod Three" + name = "Labor Camp Shuttle Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/main) -"vyc" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plating, +/area/security/processing) "vyp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/crew_quarters/dorms) +"vyK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/brig) "vzp" = ( /obj/structure/table/reinforced, /obj/machinery/firealarm{ @@ -59824,6 +59757,18 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"vGn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prisoner Processing"; + req_access_txt = "2" + }, +/turf/open/floor/plasteel, +/area/security/processing) "vHj" = ( /obj/machinery/door/airlock/public/glass{ name = "Cryogenics " @@ -59872,6 +59817,30 @@ }, /turf/open/floor/plasteel, /area/security/range) +"vIo" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Brig East"; + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/brig) "vJu" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -59879,6 +59848,14 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"vLo" = ( +/obj/structure/closet/secure_closet/chemical, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/fore) "vOU" = ( /obj/structure/sign/warning/securearea, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -59897,10 +59874,16 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"vQo" = ( -/obj/effect/decal/cleanable/dirt, +"vTP" = ( +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plating, -/area/maintenance/fore) +/area/security/processing) "vZA" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -59912,15 +59895,6 @@ }, /turf/open/floor/wood, /area/library) -"vZS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "wag" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -59955,6 +59929,16 @@ "wcR" = ( /turf/open/floor/plasteel/yellowsiding/corner, /area/crew_quarters/fitness/pool) +"wdr" = ( +/obj/machinery/door/window/southleft{ + name = "Target Storage" + }, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target, +/obj/item/target, +/turf/open/floor/plating, +/area/security/range) "wdv" = ( /obj/structure/fans/tiny/invisible, /turf/open/space/basic, @@ -59963,33 +59947,6 @@ /obj/structure/girder, /turf/open/floor/plating/airless, /area/space/nearstation) -"weW" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 0; - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/security/processing) -"wfA" = ( -/obj/machinery/button/door{ - id = "armory3"; - name = "Armory Shutters"; - pixel_y = 26; - req_access_txt = "3" - }, -/obj/machinery/light{ - dir = 1; - light_color = "#cee5d2" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) "wfR" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, @@ -60001,9 +59958,21 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"wje" = ( +/obj/structure/rack, +/obj/item/instrument/banjo, +/obj/item/instrument/harmonica, +/obj/item/instrument/accordion, +/obj/item/instrument/recorder, +/turf/open/floor/plating, +/area/maintenance/fore) "wkN" = ( /turf/closed/wall, /area/science/circuit) +"wlI" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/showroomfloor, +/area/security/main) "woR" = ( /obj/machinery/cryopod{ dir = 1 @@ -60054,16 +60023,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"wsI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light_switch{ - pixel_x = 27 - }, -/turf/open/floor/plasteel, -/area/security/processing) "wvX" = ( /obj/structure/table/reinforced, /obj/machinery/light, @@ -60083,36 +60042,6 @@ }, /turf/closed/wall, /area/hallway/secondary/service) -"wBr" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance"; - req_access_txt = "1" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/main) -"wGf" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28; - pixel_y = 0 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/item/radio/intercom{ - pixel_y = 20 - }, -/turf/open/floor/plasteel, -/area/security/processing) "wHk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60137,22 +60066,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"wMI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/security/brig) -"wPh" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/range) "wQg" = ( /obj/structure/pool/ladder{ dir = 2; @@ -60189,10 +60102,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, /area/crew_quarters/theatre) -"wUV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/processing) "wUY" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -60200,17 +60109,6 @@ /obj/item/hand_labeler, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"wVh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/item/radio/intercom{ - pixel_y = 20 - }, -/turf/open/floor/plasteel, -/area/security/range) -"wWS" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel/showroomfloor, -/area/security/main) "wWT" = ( /obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel/white, @@ -60239,15 +60137,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"wZe" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/processing) "wZI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60257,6 +60146,17 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) +"xal" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/brig) "xaB" = ( /obj/structure/closet/athletic_mixed, /obj/item/toy/poolnoodle/red, @@ -60336,18 +60236,6 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) -"xhn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance/abandoned{ - name = "maintenance access"; - req_access_txt = "12" - }, -/obj/structure/barricade/wooden, -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/fore) "xhS" = ( /obj/structure/cable{ icon_state = "2-4" @@ -60393,12 +60281,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"xkL" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) "xmo" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -60418,6 +60300,15 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/grimy, /area/hallway/secondary/entry) +"xnm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "xqG" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -60462,6 +60353,9 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"xxp" = ( +/turf/open/floor/plating, +/area/security/range) "xzd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -60473,6 +60367,18 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"xzv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) "xAk" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -60502,13 +60408,6 @@ /obj/item/radio/headset/headset_cargo, /turf/open/floor/plasteel, /area/quartermaster/storage) -"xCp" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/security/brig) "xDM" = ( /obj/machinery/camera{ c_tag = "Locker Room South"; @@ -60517,9 +60416,6 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"xDQ" = ( -/turf/open/floor/plasteel, -/area/security/processing) "xEu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -60552,11 +60448,42 @@ /obj/machinery/vending/wardrobe/curator_wardrobe, /turf/open/floor/carpet, /area/library) +"xGQ" = ( +/obj/structure/sign/plaques/golden{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "xIa" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xJW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_access_txt = "1" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/main) "xLX" = ( /obj/structure/lattice/catwalk, /obj/item/stack/marker_beacon{ @@ -60607,6 +60534,34 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"xSW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"xTe" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "xTy" = ( /obj/structure/cable{ icon_state = "1-2" @@ -60636,6 +60591,35 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) +"xUX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/rack, +/obj/item/storage/box/zipties{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/storage/box/zipties{ + pixel_x = 1; + pixel_y = -1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"xWq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 0; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/security/processing) "xXi" = ( /obj/machinery/vending/clothing, /turf/open/floor/plasteel, @@ -60653,13 +60637,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) -"ybm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/brig) "ycd" = ( /obj/structure/toilet{ dir = 4 @@ -60690,11 +60667,40 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"ycY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"yds" = ( +/obj/effect/decal/cleanable/vomit, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "ydD" = ( /obj/effect/turf_decal/bot, /obj/machinery/suit_storage_unit/rd, /turf/open/floor/plasteel, /area/science/mixing) +"ydM" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"yhx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/security/brig) "yhz" = ( /obj/structure/table, /obj/item/folder/blue, @@ -79816,7 +79822,7 @@ alU amC alU aaH -hXr +rJw arO amC amC @@ -80074,7 +80080,7 @@ anK ali aaf alU -hXr +rJw alU atW atW @@ -80840,7 +80846,7 @@ aae aaa aaa ali -dyB +yds amC aon aoW @@ -81101,7 +81107,7 @@ aKY amC amC amC -ndJ +gsM aqR aqR aGh @@ -81354,7 +81360,7 @@ aaa aaa aaa ali -kxG +nBI anL aoo aoX @@ -81617,9 +81623,9 @@ alU alU arP aqR -tYH -pEL -lXX +wje +rQJ +uUi avZ xtP ayA @@ -81872,11 +81878,11 @@ aaa aaa aaa arP -dHU -iSW -vQo -kXd -ecD +vqP +inw +gzY +rtC +izg awa axq qyj @@ -82129,12 +82135,12 @@ aaa aaa aaa aqQ -nea -vQo -jKC +uCo +gzY +eAG aqR aqR -xhn +kTj xxi ayD cGz @@ -82388,9 +82394,9 @@ aaa aqQ aqR aqR -iiQ -usK -tQi +pjg +sqg +inq avZ xxi ayD @@ -82643,8 +82649,8 @@ aaa aaa aaa aqQ -nea -vQo +uCo +gzY arP arP arP @@ -83149,16 +83155,16 @@ aaa aaa aaa aiU -iqU +hlT aiU aaa aiU -oMS +vxX aiU gXs arP -tfG -nqz +lZs +dPq arP asP cya @@ -83392,16 +83398,16 @@ aaa aaa aaa aaa -jLl +jLv aaa aaa aaa -qxq -qxq -qxq -rKX -qxq -qxq +gWo +gWo +gWo +dYZ +gWo +gWo gXs gXs gXs @@ -83654,27 +83660,27 @@ abc abc afu abc -vdU +wdr itQ pgn tmO -qxq +gWo xUe aiU aiT -weW -nat +nEj +vTP aiU amK aiU -pek -nQM +mkU +xWq arP asR -vQo -oRg -cME -jtV +gzY +fdQ +ngU +kUC arP awc axt @@ -83911,13 +83917,13 @@ aea aeH aft abc -nrg +pDe dly mnC mcp -qxq -tXk -xDQ +gWo +oDm +ibK akb ahq akI @@ -83925,14 +83931,14 @@ ahU aiT aiD akI -ubI -kgH -qpg -vQo +uFZ +hBw +vLo +gzY aqR -vQo -vQo -mdo +gzY +gzY +esK awb axt ayG @@ -84170,25 +84176,25 @@ afw abc abc dly -lAa +xxp mcp -rKX +dYZ kMt -wZe -wUV +nTG +rhX ahr ahD ahV agr -oOt -mnQ -jIr +fJY +eXz +pUy arP arP arP arP -pwd -oFV +iPX +nnp arP awb axt @@ -84427,19 +84433,19 @@ afv agf abc dly -lAa +xxp mcp -qxq -wGf -dIP -wsI +gWo +gDP +lAH +lNH akG akG -hMo -iuJ -daA +kHd +vGn +gav cxP -jIr +pUy arP aqU arg @@ -84447,8 +84453,8 @@ arP arP arP arP -hMM -jFe +vgJ +hSl ayG azL aBf @@ -84683,10 +84689,10 @@ aeL afy agh abc -qCC +kCa hnU vda -dXP +sXV agv amM aiX @@ -84694,15 +84700,15 @@ aiX aiX aiX aiX -rYg -xDQ -jIr +foT +ibK +pUy arP aqR arl arP asS -uwb +sfs aqR awb axt @@ -84940,11 +84946,11 @@ aeK afx agg abc -dWM +ovv dCV idK age -vyc +kZS agu agj amL @@ -84958,7 +84964,7 @@ arP arc arP arP -jvO +usE aqR aqR awb @@ -85197,7 +85203,7 @@ aeN afA afA abc -wVh +kuA laq kdP mGw @@ -85452,15 +85458,15 @@ adF aef aeM afz -okI +oSl ail -wPh +lRb vIi fsj -dXP -vZS -qUk -jhb +sXV +xnm +rAR +uCU and arS anq @@ -85692,7 +85698,7 @@ aaa aaa aaa aag -tcg +thB aai aai aai @@ -85709,20 +85715,20 @@ adH aei aeO afJ -dXP -dXP -dXP -dXP -dXP -dXP -gjc +sXV +sXV +sXV +sXV +sXV +sXV +oby ajX agj amL asp -sea +nbY aiX -qmV +iRj anz aov cCi @@ -85972,14 +85978,14 @@ agY ahS aiI afn -usv +vfX akD agj agj agj agj aiX -vcQ +ycY anz aov cCi @@ -86228,14 +86234,14 @@ afI ahb ahZ aiL -gZQ +lZn akg -oWe +kuh aly anP -sAr -mym -pWM +gyr +okK +xal aqC anz aov @@ -86487,11 +86493,11 @@ aid aiM ajz alz -xCp +cZe alg -rZB -uto -drO +plS +dyE +pQr aou aqC anz @@ -86735,7 +86741,7 @@ abM acG adI aem -fLS +omX afG aim afL @@ -86743,18 +86749,18 @@ ahu aie aiO afn -iaX +xzv agL akT -uwq -fEw -hwJ +gNE +gLz +rcI seP aqC anz aov cCi -mNJ +tKb arT arT asn @@ -87001,7 +87007,7 @@ afn agj agj agM -oiW +sAk akp akQ amB @@ -87257,13 +87263,13 @@ afM aig agp agj -hkH +lfV akl akM amm -sAr +gyr anM -dys +rJv aqC anz aox @@ -87513,13 +87519,13 @@ ajg afM akU afM -kGl +lBz alA -hxc +ene alg -dmX -uto -lhh +kbm +dyE +cKC seP aqC anR @@ -87770,12 +87776,12 @@ ajL akj afM afM -csK -kPY +nss +kQz alB akT -uwq -fEw +gNE +gLz anB amR aqC @@ -88024,12 +88030,12 @@ aeV agj agj agj -gCm +tHh ahG ajY -lKL +fxx ako -hxc +ene amj akQ amB @@ -88279,7 +88285,7 @@ acd aeP afC agk -pKR +cOV agP ajJ agT @@ -88289,9 +88295,9 @@ aku akl amk amm -sAr -guS -dys +gyr +mos +rJv aqC anz aov @@ -88536,17 +88542,17 @@ acd aer afB agi -qLc +eWL afN ajK aiH akF aiy akv -kdS +uXt alg -nVk -uto +pAK +dyE anQ seP aqC @@ -88798,9 +88804,9 @@ afS ahx aiX aiQ -eCQ +xUX akx -ybm +uTe akT amx any @@ -89057,7 +89063,7 @@ aij aiR ajc akz -hxc +ene als akQ amB @@ -89314,7 +89320,7 @@ aim aiW ajc akz -hxc +ene alg alt amp @@ -89569,11 +89575,11 @@ agt aaZ aaZ aaZ -wfA +fsa akz -rFw +itD alg -eRh +vyK amI alg alv @@ -89826,14 +89832,14 @@ agz ahW ain aiZ -lcu +jyO ajC akC akX alw amJ aoY -soA +rCl aqE anz aoz @@ -89879,7 +89885,7 @@ aDt aEO aGc vOU -hIS +rTD dml dml oNz @@ -90083,7 +90089,7 @@ agH agH aip aja -lCf +xTe akz alg agn @@ -90340,7 +90346,7 @@ afd ahB aiq ajb -hrE +mml ajF akN akY @@ -90597,7 +90603,7 @@ agI ahQ ait aje -jOY +eFx alj afM akZ @@ -90854,7 +90860,7 @@ ahK ahR aiv adg -oaZ +xSW ajI alC ala @@ -91111,7 +91117,7 @@ agX aaZ aaZ aaZ -lZR +xGQ ajN amc alo @@ -91356,7 +91362,7 @@ aaf aaa adR abO -wWS +wlI abO abV ags @@ -91368,7 +91374,7 @@ akc aik akh adR -oMZ +esL aiG amf anr @@ -91626,7 +91632,7 @@ aju aki akk akq -gbM +lwN amq agn amb @@ -91884,7 +91890,7 @@ aia aiP aka akE -sAr +gyr alq amd anu @@ -92139,7 +92145,7 @@ agZ ahI aiw adR -jmg +vIo ake ame aaQ @@ -92398,7 +92404,7 @@ aiz adR akf akJ -wMI +yhx agn agn agn @@ -92918,7 +92924,7 @@ alI ams amZ amZ -kZo +cqQ anW aoH cSA @@ -93416,7 +93422,7 @@ abQ abU acj acv -agW +dJL afj afX agC @@ -93946,7 +93952,7 @@ ale alD ana ana -neq +fMp amu ajo aps @@ -94707,7 +94713,7 @@ aga abp ahj abp -wBr +xJW abp ajo ajo @@ -94959,11 +94965,11 @@ abp abp adR abp -nbK +lJC agj adR ahl -oWB +uHp aic ahT ahT @@ -94976,7 +94982,7 @@ alL ahT anb ahT -xkL +ydM anZ apu arf @@ -95226,8 +95232,8 @@ aif aif aif aif -fpz aif +fpz bkV jKP alK @@ -95473,7 +95479,7 @@ abp abp abp abp -vxA +mxn abp abp ahn @@ -96758,7 +96764,7 @@ aaa aaa bvG aaa -nBM +jdj aaa oyN aaa diff --git a/_maps/shuttles/arrival_cog.dmm b/_maps/shuttles/arrival_cog.dmm new file mode 100644 index 0000000000..2ecbccaaab --- /dev/null +++ b/_maps/shuttles/arrival_cog.dmm @@ -0,0 +1,278 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) +"c" = ( +/obj/structure/shuttle/engine/propulsion/right{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/arrival) +"d" = ( +/obj/structure/shuttle/engine/propulsion/left{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/arrival) +"e" = ( +/obj/docking_port/mobile/arrivals{ + dir = 2; + dwidth = 4; + height = 12; + name = "cog arrivals shuttle"; + width = 9 + }, +/turf/template_noop, +/area/template_noop) +"f" = ( +/turf/closed/wall/mineral/titanium/nosmooth, +/area/shuttle/arrival) +"g" = ( +/obj/structure/shuttle/engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/shuttle/arrival) +"h" = ( +/obj/structure/shuttle/engine/heater{ + dir = 1 + }, +/turf/closed/wall/mineral/titanium/nosmooth, +/area/shuttle/arrival) +"i" = ( +/obj/machinery/sleeper, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"j" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"k" = ( +/obj/structure/table/reinforced, +/obj/item/radio, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"l" = ( +/obj/machinery/sleeper, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/arrival) +"m" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"n" = ( +/obj/structure/window/shuttle, +/obj/structure/grille, +/turf/open/floor/plating, +/area/shuttle/arrival) +"o" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"p" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"q" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"r" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/arrival) +"s" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"t" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"u" = ( +/obj/structure/table/reinforced, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"v" = ( +/obj/structure/table/reinforced, +/obj/item/radio, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"w" = ( +/obj/machinery/computer{ + dir = 1; + name = "Shuttle computer" + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"x" = ( +/obj/machinery/computer{ + dir = 1; + name = "Shuttle computer" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"y" = ( +/obj/machinery/computer{ + dir = 1; + name = "Shuttle computer" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) + +(1,1,1) = {" +a +c +h +b +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +b +f +b +b +n +b +b +r +b +b +b +a +"} +(3,1,1) = {" +c +g +i +m +o +o +p +m +s +u +b +b +"} +(4,1,1) = {" +d +g +j +m +o +o +o +m +o +o +w +n +"} +(5,1,1) = {" +e +f +k +m +m +m +m +m +m +m +x +n +"} +(6,1,1) = {" +c +g +j +m +o +o +o +m +o +o +y +n +"} +(7,1,1) = {" +d +g +l +m +o +o +q +m +t +v +b +b +"} +(8,1,1) = {" +b +f +b +b +n +b +b +r +b +b +b +a +"} +(9,1,1) = {" +a +d +h +b +a +a +a +a +a +a +a +a +"} diff --git a/_maps/shuttles/emergency_cog.dmm b/_maps/shuttles/emergency_cog.dmm new file mode 100644 index 0000000000..ad71dba4bd --- /dev/null +++ b/_maps/shuttles/emergency_cog.dmm @@ -0,0 +1,546 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"c" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"d" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) +"e" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"f" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) +"g" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/escape) +"h" = ( +/obj/structure/table/reinforced, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"i" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"j" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"k" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"l" = ( +/obj/machinery/vending/wallmed, +/turf/closed/wall/mineral/titanium, +/area/shuttle/escape) +"m" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/escape) +"n" = ( +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"o" = ( +/obj/machinery/door/airlock/titanium{ + name = "Emergency Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/obj/docking_port/mobile/emergency{ + dheight = 0; + dir = 2; + dwidth = 9; + name = "NES Classic"; + width = 22 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"p" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"q" = ( +/obj/machinery/sleeper, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"r" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"s" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"t" = ( +/obj/structure/table/reinforced, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"u" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"v" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/radio, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"w" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Shuttle Infirmary" + }, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"x" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Shuttle Cockpit"; + req_access_txt = "19" + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"y" = ( +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"z" = ( +/obj/machinery/computer/emergency_shuttle{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"A" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"B" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/item/storage/firstaid/regular, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"C" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/structure/window/reinforced, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) +"D" = ( +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"H" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"J" = ( +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"K" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Shuttle Brig"; + req_access_txt = "2" + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"P" = ( +/obj/structure/table/optable, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"Q" = ( +/obj/machinery/light, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"R" = ( +/obj/machinery/light/small, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/mineral/titanium/white, +/area/shuttle/escape) +"T" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red/brig, +/area/shuttle/escape) +"V" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) +"W" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/escape) +"X" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/shuttle/escape) +"Y" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/shuttle/escape) + +(1,1,1) = {" +a +d +b +b +b +d +b +b +b +d +a +"} +(2,1,1) = {" +W +d +p +p +p +d +p +p +p +d +X +"} +(3,1,1) = {" +c +d +q +n +P +d +H +H +H +d +Y +"} +(4,1,1) = {" +d +l +q +n +R +d +T +J +H +d +d +"} +(5,1,1) = {" +d +d +d +w +f +d +f +K +d +d +d +"} +(6,1,1) = {" +d +t +t +r +s +s +s +r +s +s +d +"} +(7,1,1) = {" +g +r +r +r +s +s +s +r +s +s +m +"} +(8,1,1) = {" +m +r +r +Q +d +m +d +V +s +s +m +"} +(9,1,1) = {" +g +r +r +r +r +r +r +r +s +s +m +"} +(10,1,1) = {" +m +r +r +s +s +s +s +r +r +r +m +"} +(11,1,1) = {" +d +d +r +s +s +s +s +r +r +d +d +"} +(12,1,1) = {" +m +h +r +r +r +r +r +r +r +h +m +"} +(13,1,1) = {" +d +e +s +s +s +r +s +s +s +D +d +"} +(14,1,1) = {" +m +s +s +s +s +r +s +s +s +s +m +"} +(15,1,1) = {" +o +r +r +r +r +r +s +s +s +s +m +"} +(16,1,1) = {" +m +r +r +s +s +r +s +s +s +s +m +"} +(17,1,1) = {" +g +r +r +r +i +r +i +r +r +r +d +"} +(18,1,1) = {" +d +d +d +m +d +x +f +m +d +d +d +"} +(19,1,1) = {" +a +a +m +j +k +y +k +C +m +a +a +"} +(20,1,1) = {" +a +a +d +d +u +k +A +d +d +a +a +"} +(21,1,1) = {" +a +a +a +m +v +z +B +m +a +a +a +"} +(22,1,1) = {" +a +a +a +d +m +m +m +d +a +a +a +"} diff --git a/_maps/shuttles/labour_cog.dmm b/_maps/shuttles/labour_cog.dmm new file mode 100644 index 0000000000..10f6561ed3 --- /dev/null +++ b/_maps/shuttles/labour_cog.dmm @@ -0,0 +1,349 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/labor) +"b" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/labor) +"c" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/labor) +"d" = ( +/obj/structure/closet/crate/internals, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen/double{ + pixel_x = 3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"e" = ( +/turf/open/floor/plasteel, +/area/shuttle/labor) +"f" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"g" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/shuttle{ + id_tag = "prisonshuttle"; + name = "Labor Shuttle Airlock" + }, +/turf/open/floor/plating, +/area/shuttle/labor) +"h" = ( +/obj/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/labor) +"i" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"k" = ( +/obj/machinery/flasher{ + id = "gulagshuttleflasher"; + pixel_x = 25 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"l" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"m" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"n" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/labor) +"o" = ( +/obj/machinery/mineral/labor_claim_console{ + machinedir = 2; + pixel_x = 30 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"p" = ( +/turf/open/floor/plasteel/grimy, +/area/shuttle/labor) +"q" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/obj/machinery/button/flasher{ + dir = 1; + id = "gulagshuttleflasher"; + name = "Flash Control"; + pixel_y = 26; + req_access_txt = "1" + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/labor) +"r" = ( +/obj/docking_port/mobile{ + dir = 8; + dwidth = 2; + height = 5; + id = "laborcamp"; + name = "labor camp shuttle"; + port_direction = 4; + width = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/shuttle{ + name = "Labor Shuttle Airlock"; + req_access_txt = "2" + }, +/turf/open/floor/plating, +/area/shuttle/labor) +"s" = ( +/obj/machinery/computer/shuttle/labor{ + dir = 4 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = -31 + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/labor) +"t" = ( +/obj/structure/chair/office/dark, +/turf/open/floor/plasteel/grimy, +/area/shuttle/labor) +"u" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red, +/obj/item/restraints/handcuffs, +/turf/open/floor/plasteel/grimy, +/area/shuttle/labor) +"v" = ( +/obj/structure/window/shuttle, +/turf/open/floor/plating/airless, +/area/shuttle/labor) +"w" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Labor Shuttle Airlock"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"x" = ( +/obj/machinery/mineral/stacking_machine/laborstacker{ + input_dir = 2; + output_dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/labor) +"y" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 2; + pixel_x = 30; + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/labor) + +(1,1,1) = {" +a +a +a +h +a +a +h +a +a +"} +(2,1,1) = {" +b +a +d +j +l +w +p +s +v +"} +(3,1,1) = {" +b +c +f +e +m +n +q +t +v +"} +(4,1,1) = {" +b +a +i +k +o +x +y +u +v +"} +(5,1,1) = {" +a +a +g +a +a +a +r +a +a +"} diff --git a/_maps/shuttles/whiteship_cog.dmm b/_maps/shuttles/whiteship_cog.dmm new file mode 100644 index 0000000000..9410682219 --- /dev/null +++ b/_maps/shuttles/whiteship_cog.dmm @@ -0,0 +1,428 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/shuttle/engine/propulsion/left{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned) +"b" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium/nosmooth, +/area/shuttle/abandoned) +"c" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/shuttle/abandoned) +"d" = ( +/turf/template_noop, +/area/template_noop) +"e" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned) +"f" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium/interior, +/area/shuttle/abandoned) +"g" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned) +"h" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/abandoned) +"i" = ( +/obj/machinery/suit_storage_unit/security, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/airalarm/all_access{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/abandoned) +"j" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/abandoned) +"k" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/dark, +/area/shuttle/abandoned) +"l" = ( +/obj/structure/shuttle/engine/propulsion/right{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned) +"m" = ( +/obj/structure/bed, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"n" = ( +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"o" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"p" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"q" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/shuttle/abandoned) +"r" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"s" = ( +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"t" = ( +/turf/closed/wall/mineral/titanium/nosmooth, +/area/shuttle/abandoned) +"u" = ( +/obj/machinery/door/airlock/security, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"v" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"w" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"x" = ( +/obj/machinery/door/firedoor/border_only/closed{ + icon_state = "door_closed"; + dir = 4 + }, +/obj/machinery/door/window/eastright, +/turf/open/floor/plasteel/dark, +/area/shuttle/abandoned) +"y" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"z" = ( +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/abandoned) +"A" = ( +/obj/machinery/door/window/eastright, +/obj/structure/toilet{ + contents = newlist(/obj/item/toy/snappop/phoenix); + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"B" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/flasher{ + id = "cogws"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"C" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/crate/secure/weapon, +/obj/item/gun/energy/laser/carbine, +/obj/machinery/button/flasher{ + id = "cogws"; + pixel_x = -24; + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"D" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/crate/secure/weapon, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/gun/energy/e_gun/stun, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"E" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"F" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"G" = ( +/obj/machinery/computer/shuttle/white_ship{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"H" = ( +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/machinery/airalarm/all_access{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/shuttle/abandoned) +"I" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/sunglasses, +/turf/open/floor/plasteel/grimy, +/area/shuttle/abandoned) +"J" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + name = "shower"; + pixel_y = 12 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/white, +/area/shuttle/abandoned) +"K" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/abandoned) +"L" = ( +/obj/machinery/door/airlock/shuttle, +/turf/open/floor/plasteel/white, +/area/shuttle/abandoned) +"M" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/airalarm/all_access{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/shuttle/abandoned) +"N" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 7; + height = 9; + id = "whiteship"; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "Prisoner Transport"; + port_direction = 8; + preferred_direction = 4; + width = 13 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/abandoned) + +(1,1,1) = {" +a +e +l +g +c +g +a +e +l +"} +(2,1,1) = {" +b +f +f +t +A +t +f +f +b +"} +(3,1,1) = {" +c +g +m +n +n +n +m +g +c +"} +(4,1,1) = {" +d +c +m +n +n +n +m +c +d +"} +(5,1,1) = {" +d +h +n +n +B +H +n +h +d +"} +(6,1,1) = {" +d +g +c +u +c +g +c +g +d +"} +(7,1,1) = {" +c +c +o +v +C +c +J +c +c +"} +(8,1,1) = {" +c +i +p +w +D +c +K +M +c +"} +(9,1,1) = {" +c +g +q +x +c +g +L +g +c +"} +(10,1,1) = {" +d +j +r +s +E +s +s +j +d +"} +(11,1,1) = {" +d +N +s +s +F +s +s +k +d +"} +(12,1,1) = {" +d +j +j +y +G +I +j +j +d +"} +(13,1,1) = {" +d +d +j +z +z +z +j +d +d +"} diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index f1f0d45e90..7bcca68713 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -36,39 +36,38 @@ #define CAN_CLIMAX_WITH (1<<7) #define GENITAL_CAN_AROUSE (1<<8) + +#define DEF_VAGINA_SHAPE "Human" + #define COCK_SIZE_MIN 1 +#define COCK_SIZE_DEF 6 #define COCK_SIZE_MAX 20 #define COCK_DIAMETER_RATIO_MAX 0.42 #define COCK_DIAMETER_RATIO_DEF 0.25 #define COCK_DIAMETER_RATIO_MIN 0.15 -#define KNOT_GIRTH_RATIO_MAX 3 -#define KNOT_GIRTH_RATIO_DEF 2.1 -#define KNOT_GIRTH_RATIO_MIN 1.25 - +#define DEF_COCK_SHAPE "Human" #define BALLS_VOLUME_BASE 25 #define BALLS_VOLUME_MULT 1 +#define DEF_BALLS_SHAPE "Single" + #define BALLS_SIZE_MIN 1 #define BALLS_SIZE_DEF 2 #define BALLS_SIZE_MAX 3 -#define BALLS_SACK_SIZE_MIN 1 -#define BALLS_SACK_SIZE_DEF 8 -#define BALLS_SACK_SIZE_MAX 40 - #define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time? #define CUM_RATE_MULT 1 #define CUM_EFFICIENCY 1 //amount of nutrition required per life() -#define EGG_GIRTH_MIN 1//inches -#define EGG_GIRTH_DEF 6 -#define EGG_GIRTH_MAX 16 - #define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups. #define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume. +#define BREASTS_SIZE_DEF "c" //lowercase cause those sprite accessory don't use uppercased letters. + +#define DEF_BREASTS_SHAPE "Pair" + #define MILK_RATE 5 #define MILK_RATE_MULT 1 #define MILK_EFFICIENCY 1 @@ -83,8 +82,6 @@ //Citadel istypes #define isgenital(A) (istype(A, /obj/item/organ/genital)) -#define isborer(A) (istype(A, /mob/living/simple_animal/borer)) - #define CITADEL_MENTOR_OOC_COLOUR "#224724" //xenobio console upgrade stuff @@ -92,14 +89,6 @@ #define XENOBIO_UPGRADE_SLIMEBASIC 2 #define XENOBIO_UPGRADE_SLIMEADV 4 -//stamina stuff -#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement -#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit -#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations -#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT - -#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob - //Citadel toggles because bitflag memes #define MEDIHOUND_SLEEPER (1<<0) #define EATING_NOISES (1<<1) @@ -117,8 +106,6 @@ #define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT) //component stuff -#define COMSIG_COMBAT_TOGGLED "combatmode_toggled" //called by combat mode toggle on all equipped items. args: (mob/user, combatmode) - #define COMSIG_VORE_TOGGLED "voremode_toggled" // totally not copypasta //belly sound pref things diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 4304af77f3..c750119701 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -29,7 +29,54 @@ #define EFFECT_DROWSY "drowsy" #define EFFECT_JITTER "jitter" +// /mob/living/combat_flags +#define CAN_TOGGLE_COMBAT_MODE(mob) FORCE_BOOLEAN((mob.stat == CONSCIOUS) && !(mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) + +/// Default combat flags for those affected by ((stamina combat)) +#define COMBAT_FLAGS_DEFAULT NONE +/// Default combat flags for everyone else (so literally everyone but humans) +#define COMBAT_FLAGS_STAMSYSTEM_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_COMBAT_TOGGLED) +/// Default combat flags for those only affected by sprint (so just silicons) +#define COMBAT_FLAGS_STAMEXEMPT_YESSPRINT (COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_COMBAT_TOGGLED) + +/// The user wants combat mode on +#define COMBAT_FLAG_COMBAT_TOGGLED (1<<0) +/// The user wants sprint mode on +#define COMBAT_FLAG_SPRINT_TOGGLED (1<<1) +/// Combat mode is currently active +#define COMBAT_FLAG_COMBAT_ACTIVE (1<<2) +/// Sprint is currently active +#define COMBAT_FLAG_SPRINT_ACTIVE (1<<3) +/// Currently attempting to crawl under someone +#define COMBAT_FLAG_ATTEMPTING_CRAWL (1<<4) +/// Currently stamcritted +#define COMBAT_FLAG_HARD_STAMCRIT (1<<5) +/// Currently attempting to resist up from the ground +#define COMBAT_FLAG_RESISTING_REST (1<<6) +/// Intentionally resting +#define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<7) +/// Currently stamcritted but not as violently +#define COMBAT_FLAG_SOFT_STAMCRIT (1<<8) + +// Helpers for getting someone's stamcrit state. Cast to living. +#define NOT_STAMCRIT 0 +#define SOFT_STAMCRIT 1 +#define HARD_STAMCRIT 2 + +// Stamcrit check helpers +#define IS_STAMCRIT(mob) (CHECK_STAMCRIT(mob) != NOT_STAMCRIT) +#define CHECK_STAMCRIT(mob) ((mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)? HARD_STAMCRIT : ((mob.combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)? SOFT_STAMCRIT : NOT_STAMCRIT)) + +//stamina stuff +#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement +#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit +#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations +#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT + +#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob + //Bitflags defining which status effects could be or are inflicted on a mob +// This is a bit out of date/inaccurate in light of all the new status effects and is probably pending rework. #define CANSTUN (1<<0) #define CANKNOCKDOWN (1<<1) #define CANUNCONSCIOUS (1<<2) @@ -203,3 +250,5 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. #define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. #define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs. + + diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index c4e57154c2..3d76390ce1 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -186,6 +186,8 @@ #define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) +#define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced) +#define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of mob/living/disable_combat_mode() (was_forced) //ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! #define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) @@ -195,6 +197,7 @@ #define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) #define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) #define COMSIG_LIVING_STATUS_DAZE "living_daze" //from base of mob/living/Daze() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_STAGGER "living_stagger" //from base of mob/living/Stagger() (amount, update, ignore) #define COMPONENT_NO_STUN 1 //For all of them // /mob/living/carbon signals diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 939f6698cb..6d263473b0 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -201,4 +201,7 @@ #define RULE_OF_THREE(a, b, x) ((a*x)/b) // ) -#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) \ No newline at end of file +#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) + +/// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. +#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 49cfba8cd2..5775e128f8 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -81,7 +81,8 @@ //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam #define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen? -#define MAX_FAVOR_LEN 4096 //double the maximum message length. +#define MAX_FLAVOR_LEN 4096 //double the maximum message length. +#define MAX_TASTE_LEN 40 //lick... vore... ew... #define MAX_NAME_LEN 42 #define MAX_BROADCAST_LEN 512 #define MAX_CHARTER_LEN 80 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ef86db07cb..a7ffd1c543 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -53,6 +53,9 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep +/// Blocks sprint +#define STATUS_EFFECT_STAGGERED /datum/status_effect/staggered + #define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down #define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ba96b7cc7f..4f4b7c6baa 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -131,6 +131,8 @@ #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" #define TRAIT_SOOTHED_THROAT "soothed-throat" #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" +#define TRAIT_QUICK_CARRY "quick-carry" +#define TRAIT_QUICKER_CARRY "quicker-carry" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" #define TRAIT_MAGIC_CHOKE "magic_choke" @@ -144,6 +146,7 @@ #define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites. #define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat. #define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" +#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events // mobility flag traits // IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it) @@ -159,6 +162,15 @@ #define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking +/** + * COMBAT MODE/SPRINT MODE TRAITS + */ + +/// Prevents combat mode from being active. +#define TRAIT_COMBAT_MODE_LOCKED "combatmode_locked" +/// Prevents sprinting from being active. +#define TRAIT_SPRINT_LOCKED "sprint_locked" + //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it @@ -222,10 +234,13 @@ #define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention #define GHOSTROLE_TRAIT "ghostrole" #define APHRO_TRAIT "aphro" +#define BLOODSUCKER_TRAIT "bloodsucker" +#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves // unique trait sources, still defines #define STATUE_MUTE "statue" #define CLONING_POD_TRAIT "cloning-pod" +#define VIRTUAL_REALITY_TRAIT "vr_trait" #define CHANGELING_DRAIN "drain" #define CHANGELING_HIVEMIND_MUTE "ling_mute" #define ABYSSAL_GAZE_BLIND "abyssal_gaze" diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index ffc1bcc6b7..1954a159b3 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -139,18 +139,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) return TRUE return FALSE -/mob/living/carbon/proc/has_ovipositor() - var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_PENIS) - if(G && istype(G, /obj/item/organ/genital/ovipositor)) - return TRUE - return FALSE - -/mob/living/carbon/human/proc/has_eggsack() - var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_TESTICLES) - if(G && istype(G, /obj/item/organ/genital/eggsack)) - return TRUE - return FALSE - /mob/living/carbon/proc/is_groin_exposed(list/L) if(!L) L = get_equipped_items() diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 7852ab9d06..d847423853 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -181,35 +181,21 @@ "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = pick(GLOB.cock_shapes_list), - "cock_length" = 6, + "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "has_sheath" = FALSE, - "sheath_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_balls" = FALSE, "balls_internal" = FALSE, "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "balls_amount" = 2, - "balls_sack_size" = BALLS_SACK_SIZE_DEF, "balls_size" = BALLS_SIZE_DEF, - "balls_shape" = "Single", + "balls_shape" = DEF_BALLS_SHAPE, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, - "has_ovi" = FALSE, - "ovi_shape" = "knotted", - "ovi_length" = 6, - "ovi_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "has_eggsack" = FALSE, - "eggsack_internal" = TRUE, - "eggsack_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "eggsack_size" = BALLS_SACK_SIZE_DEF, - "eggsack_egg_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "eggsack_egg_size" = EGG_GIRTH_DEF, "has_breasts" = FALSE, "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "breasts_size" = pick(GLOB.breasts_size_list), - "breasts_shape" = "Pair", + "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = pick(GLOB.vagina_shapes_list), diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index b4cc682075..5367322d8e 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -238,5 +238,16 @@ GLOBAL_LIST_INIT(bitfields, list( "MOBILITY_PULL" = MOBILITY_PULL, "MOBILITY_HOLD" = MOBILITY_HOLD, "MOBILITY_RESIST" = MOBILITY_RESIST + ), + "combat_flags" = list( + "COMBAT_FLAG_COMBAT_TOGGLED" = COMBAT_FLAG_COMBAT_TOGGLED, + "COMBAT_FLAG_SPRINT_TOGGLED" = COMBAT_FLAG_SPRINT_TOGGLED, + "COMBAT_FLAG_COMBAT_ACTIVE" = COMBAT_FLAG_COMBAT_ACTIVE, + "COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE, + "COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL, + "COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT, + "COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT, + "COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING, + "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST ) )) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index a6d7286e80..490f0aa0f0 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -128,7 +128,7 @@ //CITADEL CHANGES - sprint button using = new /obj/screen/sprintbutton using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint") + using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") using.screen_loc = ui_movi using.hud = src static_inventory += using diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 2fa2a8e85f..fe407509fe 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -11,7 +11,7 @@ if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT) if(isliving(user)) var/mob/living/L = user - if(L.getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(L)) to_chat(L, "You are too exhausted to swing [src]!") return if(tool_behaviour && target.tool_act(user, src, tool_behaviour)) @@ -58,7 +58,7 @@ if(item_flags & NOBLUDGEON) return - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit + if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto return // CIT CHANGE - ditto @@ -88,7 +88,7 @@ return if(item_flags & NOBLUDGEON) return - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit + if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto return // CIT CHANGE - ditto user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss @@ -109,10 +109,8 @@ /mob/living/attacked_by(obj/item/I, mob/living/user) //CIT CHANGES START HERE - combatmode and resting checks var/totitemdamage = I.force - if(iscarbon(user)) - var/mob/living/carbon/tempcarb = user - if(!tempcarb.combatmode) - totitemdamage *= 0.5 + if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + totitemdamage *= 0.5 if(!CHECK_MOBILITY(user, MOBILITY_STAND)) totitemdamage *= 0.5 //CIT CHANGES END HERE diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 52d2fe45cd..13facc7666 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -257,8 +257,7 @@ SUBSYSTEM_DEF(air) T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY) #endif T.excited = TRUE - active_turfs |= T - SSair_turfs.currentrun |= T + active_turfs[T] = SSair_turfs.currentrun[T] = TRUE if(blockchanges && T.excited_group) T.excited_group.garbage_collect() add_to_react_queue(T) @@ -274,10 +273,9 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T) if(istype(T) && T.air) - turf_react_queue |= T + turf_react_queue[T] = TRUE if(currentpart == SSAIR_REACTQUEUE) - currentrun |= T - return + currentrun[T] = TRUE /datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T) turf_react_queue -= T diff --git a/code/controllers/subsystem/processing/status_effects.dm b/code/controllers/subsystem/processing/status_effects.dm new file mode 100644 index 0000000000..e8984a44cb --- /dev/null +++ b/code/controllers/subsystem/processing/status_effects.dm @@ -0,0 +1,3 @@ +PROCESSING_SUBSYSTEM_DEF(status_effects) + wait = 1 + flags = SS_TICKER diff --git a/code/datums/action.dm b/code/datums/action.dm index 144f5f7946..19e418579e 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -676,7 +676,8 @@ //Preset for general and toggled actions /datum/action/innate - check_flags = 0 + check_flags = NONE + required_mobility_flags = NONE var/active = 0 /datum/action/innate/Trigger() diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index 0c41fb3e52..aa3f2d3969 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -278,7 +278,7 @@ /datum/crafting_recipe/arrow name = "Arrow" - result = /obj/item/ammo_casing/caseless/arrow + result = /obj/item/ammo_casing/caseless/arrow/wood time = 30 reqs = list(/obj/item/stack/sheet/mineral/wood = 1, /obj/item/stack/sheet/silk = 1, @@ -293,17 +293,17 @@ always_availible = FALSE reqs = list(/obj/item/stack/sheet/bone = 1, /obj/item/stack/sheet/sinew = 1, - /obj/item/ammo_casing/caseless/arrow/ashen = 1) + /obj/item/ammo_casing/caseless/arrow/ash = 1) category = CAT_WEAPONRY subcategory = CAT_AMMO /datum/crafting_recipe/ashen_arrow name = "Fire Hardened Arrow" - result = /obj/item/ammo_casing/caseless/arrow/ashen + result = /obj/item/ammo_casing/caseless/arrow/ash tools = list(TOOL_WELDER) time = 30 always_availible = FALSE - reqs = list(/obj/item/ammo_casing/caseless/arrow = 1) + reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1) category = CAT_WEAPONRY subcategory = CAT_AMMO diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm index 7afe64994f..ede222d001 100644 --- a/code/datums/components/phantomthief.dm +++ b/code/datums/components/phantomthief.dm @@ -2,7 +2,7 @@ /datum/component/wearertargeting/phantomthief dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - signals = list(COMSIG_COMBAT_TOGGLED) + signals = list(COMSIG_LIVING_COMBAT_ENABLED) proctype = .proc/handlefilterstuff var/filter_x var/filter_y diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm index 63e4f4f092..9239d4c565 100644 --- a/code/datums/components/virtual_reality.dm +++ b/code/datums/components/virtual_reality.dm @@ -58,6 +58,7 @@ RegisterSignal(current_mind, COMSIG_PRE_MIND_TRANSFER, .proc/pre_player_transfer) if(mastermind?.current) mastermind.current.audiovisual_redirect = M + ADD_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT) /datum/component/virtual_reality/UnregisterFromParent() . = ..() @@ -69,6 +70,7 @@ current_mind = null if(mastermind?.current) mastermind.current.audiovisual_redirect = null + REMOVE_TRAIT(parent, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT) /** * Called when attempting to connect a mob to a virtual reality mob. @@ -235,7 +237,7 @@ qdel(src) /** - * Used for recursive virtual realities shenanigeans and should be called only through the above proc. + * Used for recursive virtual realities shenanigeans and should be called by the above proc. */ /datum/component/virtual_reality/proc/vr_in_a_vr(mob/player, deathcheck = FALSE, lethal_cleanup = FALSE) var/mob/M = parent diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index f5ad72e731..373647d6f5 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -7,10 +7,10 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/list/texts_by_atom = list() var/addendum = "This can also be used for OOC notes and preferences!" var/always_show = FALSE - var/max_len = MAX_FAVOR_LEN + var/max_len = MAX_FLAVOR_LEN var/can_edit = TRUE -/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FAVOR_LEN, _always_show = FALSE, _edit = TRUE) +/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE) . = ..() if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too. @@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code //subtypes with additional hooks for DNA and preferences. /datum/element/flavor_text/carbon -/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FAVOR_LEN, _always_show = FALSE, _edit = TRUE) +/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE) if(!iscarbon(target)) return ELEMENT_INCOMPATIBLE . = ..() diff --git a/code/datums/elements/sword_point.dm b/code/datums/elements/sword_point.dm index 5eaa9eaa70..8e1d923e33 100644 --- a/code/datums/elements/sword_point.dm +++ b/code/datums/elements/sword_point.dm @@ -15,4 +15,4 @@ /datum/element/sword_point/proc/point(datum/source, atom/target, mob/user, proximity_flag, params) if(!proximity_flag && ismob(target)) - user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].") + user.visible_message("[user] points the tip of [source] at [target].", "You point the tip of [src] at [target].") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index edd5c25e2e..57b9a25904 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -95,8 +95,7 @@ SStgui.on_transfer(current, new_character) if(iscarbon(current)) var/mob/living/carbon/C = current - if(C.combatmode) - C.toggle_combat_mode(TRUE, TRUE) + C.disable_intentional_combat_mode(TRUE) if(!language_holder) var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE) language_holder = mob_holder.copy(src) diff --git a/code/datums/mutations/combined.dm b/code/datums/mutations/combined.dm index 5fc9df7550..d3cc83f9c0 100644 --- a/code/datums/mutations/combined.dm +++ b/code/datums/mutations/combined.dm @@ -11,10 +11,6 @@ if(findtext(A, "[mutation1]") && findtext(A, "[mutation2]")) return GLOB.mutation_recipes[A] -/datum/generecipe/x_ray - required = "/datum/mutation/human/thermal; /datum/mutation/human/radioactive" - result = /datum/mutation/human/thermal/x_ray - /datum/generecipe/shock required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive" result = SHOCKTOUCH @@ -29,4 +25,4 @@ /datum/generecipe/tonguechem required = "/datum/mutation/human/tongue_spike; /datum/mutation/human/stimmed" - result = TONGUESPIKECHEM \ No newline at end of file + result = TONGUESPIKECHEM diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 779de8ff03..0a44954e51 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -480,6 +480,12 @@ admin_notes = "Comes with turrets that will target any simplemob." credit_cost = 12500 +/datum/map_template/shuttle/emergency/cog + suffix = "cog" + name = "NES Classic" + description = "A blast from the past! This recreation of the Nanotrasen Emergency Shuttle Port features the same focus on seating as the original, but on a slightly longer frame to better accommodate modern shuttle docks." + credit_cost = 750 + /datum/map_template/shuttle/arrival/box suffix = "box" name = "arrival shuttle (Box)" @@ -500,6 +506,10 @@ suffix = "kilo" name = "labour shuttle (Kilo)" +/datum/map_template/shuttle/labour/cog + suffix = "cog" + name = "labour shuttle (Cog)" + /datum/map_template/shuttle/infiltrator/basic suffix = "basic" name = "basic syndicate infiltrator" @@ -544,6 +554,10 @@ suffix = "omega" name = "arrival shuttle (Omega)" +/datum/map_template/shuttle/arrival/cog + suffix = "cog" + name = "arrival shuttle (Cog)" + /datum/map_template/shuttle/aux_base/default suffix = "default" name = "auxilliary base (Default)" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 43afcdd807..f9f9e22685 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -20,11 +20,11 @@ owner.adjustFireLoss(-15) /datum/status_effect/shadow_mend/on_remove() + . = ..() owner.visible_message("The violet light around [owner] glows black!", "The tendrils around you cinch tightly and reap their toll...") playsound(owner, 'sound/magic/teleport_diss.ogg', 50, 1) owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE) - /datum/status_effect/void_price id = "void_price" duration = 300 @@ -84,6 +84,7 @@ progbar.update(duration - world.time) /datum/status_effect/vanguard_shield/on_remove() + . = ..() var/vanguard = owner.stun_absorption["vanguard"] var/stuns_blocked = 0 if(vanguard) @@ -107,7 +108,6 @@ owner.visible_message("[owner]'s glowing aura fades!", message_to_owner) owner.log_message("lost Vanguard stun immunity[stuns_blocked ? "and was stunned for [stuns_blocked]":""]", LOG_ATTACK) - /datum/status_effect/inathneqs_endowment id = "inathneqs_endowment" duration = 150 @@ -133,12 +133,12 @@ return ..() /datum/status_effect/inathneqs_endowment/on_remove() + . = ..() owner.log_message("lost Inath-neq's invulnerability", LOG_ATTACK) owner.visible_message("The light around [owner] flickers and dissipates!", "You feel Inath-neq's power fade from your body!") owner.status_flags &= ~GODMODE playsound(owner, 'sound/magic/ethereal_exit.ogg', 50, 1) - /datum/status_effect/cyborg_power_regen id = "power_regen" duration = 100 @@ -210,11 +210,11 @@ owner.adjustStaminaLoss(-(grace_heal * 25)) /datum/status_effect/his_grace/on_remove() + . = ..() owner.log_message("lost His Grace's stun immunity", LOG_ATTACK) if(islist(owner.stun_absorption) && owner.stun_absorption["hisgrace"]) owner.stun_absorption -= "hisgrace" - /datum/status_effect/wish_granters_gift //Fully revives after ten seconds. id = "wish_granters_gift" duration = 50 @@ -225,6 +225,7 @@ return ..() /datum/status_effect/wish_granters_gift/on_remove() + . = ..() owner.revive(full_heal = TRUE, admin_revive = TRUE) owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.") @@ -366,6 +367,7 @@ last_health = owner.health /datum/status_effect/blooddrunk/on_remove() + . = ..() tick() owner.maxHealth *= 0.1 owner.bruteloss *= 0.1 @@ -404,7 +406,6 @@ playsound(owner, 'sound/weapons/fwoosh.wav', 75, 0) return ..() - /datum/status_effect/sword_spin/tick() playsound(owner, 'sound/weapons/fwoosh.wav', 75, 0) var/obj/item/slashy @@ -413,9 +414,9 @@ slashy.attack(M, owner) /datum/status_effect/sword_spin/on_remove() + . = ..() owner.visible_message("[owner]'s inhuman strength dissipates and the sword's runes grow cold!") - //Used by changelings to rapidly heal //Heals 10 brute and oxygen damage every second, and 5 fire //Being on fire will suppress this healing @@ -472,6 +473,7 @@ return ..() /datum/status_effect/hippocraticOath/on_remove() + . = ..() REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath") var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] H.remove_hud_from(owner) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index ce71bdb212..cf10244890 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -17,6 +17,7 @@ owner.update_stat() /datum/status_effect/incapacitating/on_remove() + . = ..() owner.update_mobility() if(needs_update_stat || issilicon(owner)) //silicons need stat updates in addition to normal canmove updates owner.update_stat() @@ -86,6 +87,15 @@ if(prob(10) && owner.health > owner.crit_threshold) owner.emote("snore") +/datum/status_effect/staggered + id = "staggered" + blocks_sprint = TRUE + +/datum/status_effect/staggered/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + return ..() + /obj/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." @@ -101,10 +111,6 @@ if(isnum(set_duration)) duration = set_duration . = ..() - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(C.combatmode) - C.toggle_combat_mode(TRUE) /datum/status_effect/no_combat_mode/mesmerize id = "Mesmerize" @@ -133,7 +139,7 @@ var/slowdown_priority = 50 //to make sure the stronger effect overrides var/affect_crawl = FALSE var/nextmove_modifier = 1 - var/stamdmg_per_ds = 1 //a 20 duration would do 20 stamdmg, disablers do 24 or something + var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it. /datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration) @@ -143,8 +149,6 @@ last_tick = world.time if(iscarbon(owner)) var/mob/living/carbon/C = owner - if(C.combatmode) - C.toggle_combat_mode(TRUE) C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING) /datum/status_effect/electrode/on_remove() @@ -172,15 +176,7 @@ slowdown_priority = 100 nextmove_modifier = 2 blocks_combatmode = TRUE - -/datum/status_effect/electrode/no_combat_mode/on_creation(mob/living/new_owner, set_duration) - . = ..() - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(HAS_TRAIT(C, TRAIT_TASED_RESISTANCE)) - return - if(C.combatmode) - C.toggle_combat_mode(TRUE) + stamdmg_per_ds = 1 //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace @@ -219,6 +215,7 @@ alerttooltipstyle = "clockcult" /datum/status_effect/belligerent/on_apply() + . = ..() return do_movement_toggle(TRUE) /datum/status_effect/belligerent/tick() @@ -249,6 +246,7 @@ /datum/status_effect/belligerent/on_remove() if(owner.m_intent == MOVE_INTENT_WALK) owner.toggle_move_intent() + return ..() /datum/status_effect/maniamotor id = "maniamotor" @@ -348,6 +346,7 @@ alert_type = null /datum/status_effect/cultghost/on_apply() + . = ..() owner.see_invisible = SEE_INVISIBLE_OBSERVER owner.see_in_dark = 2 @@ -369,6 +368,7 @@ hammer_synced = new_hammer_synced /datum/status_effect/crusher_mark/on_apply() + . = ..() if(owner.mob_size >= MOB_SIZE_LARGE) marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") marked_underlay.pixel_x = -owner.pixel_x @@ -450,6 +450,7 @@ qdel(src) /datum/status_effect/saw_bleed/on_remove() + . = ..() if(needs_to_bleed) var/turf/T = get_turf(owner) new /obj/effect/temp_visual/bleed/explode(T) @@ -508,6 +509,7 @@ return ..() /datum/status_effect/necropolis_curse/on_remove() + . = ..() remove_curse(curse_flags) /datum/status_effect/necropolis_curse/proc/apply_curse(set_curse) @@ -597,6 +599,7 @@ old_oxyloss = owner.getOxyLoss() /datum/status_effect/kindle/on_remove() + . = ..() owner.visible_message("The light in [owner]'s eyes fades!", \ "You snap out of your daze!") @@ -616,11 +619,13 @@ alert_type = /obj/screen/alert/status_effect/ichorial_stain /datum/status_effect/ichorial_stain/on_apply() + . = ..() owner.visible_message("[owner] gets back up, [owner.p_their()] body dripping blue ichor!", \ "Thick blue ichor covers your body; you can't be revived like this again until it dries!") return TRUE /datum/status_effect/ichorial_stain/on_remove() + . = ..() owner.visible_message("The blue ichor on [owner]'s body dries out!", \ "The ichor on your body is dry - you can now be revived by vitality matrices again!") @@ -642,6 +647,7 @@ owner.add_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF, multiplicative_slowdown = 1, movetypes = GROUND) /datum/status_effect/electrostaff/on_remove() + . = ..() owner.remove_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF) //GOLEM GANG @@ -693,6 +699,7 @@ datum/status_effect/pacify /datum/status_effect/pacify/on_remove() REMOVE_TRAIT(owner, TRAIT_PACIFISM, "status_effect") + return ..() /datum/status_effect/trance id = "trance" @@ -714,6 +721,7 @@ datum/status_effect/pacify owner.dizziness = 20 /datum/status_effect/trance/on_apply() + . = ..() if(!iscarbon(owner)) return FALSE RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize) @@ -734,6 +742,7 @@ datum/status_effect/pacify owner.dizziness = 0 owner.remove_client_colour(/datum/client_colour/monochrome/trance) to_chat(owner, "You snap out of your trance!") + return ..() /datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args) if(!owner.can_hear()) @@ -819,8 +828,9 @@ datum/status_effect/pacify return var/mob/living/carbon/human/H = owner H.something_horrible(kill_either_way) + return ..() /obj/screen/alert/status_effect/dna_melt name = "Genetic Breakdown" desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." - icon_state = "dna_melt" \ No newline at end of file + icon_state = "dna_melt" diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 608dbb2d7a..d3d39e625a 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -40,6 +40,7 @@ owner.adjust_bodytemperature(100) owner.update_mobility() UnregisterSignal(owner, COMSIG_LIVING_RESIST) + return ..() /datum/status_effect/freon/watcher duration = 8 diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index cb2b4174b5..5f59359193 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -46,7 +46,7 @@ /datum/status_effect/syphon_mark/on_remove() get_kill() - . = ..() + return ..() /obj/screen/alert/status_effect/in_love name = "In Love" @@ -81,5 +81,5 @@ ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") /datum/status_effect/throat_soothed/on_remove() - . = ..() - REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") \ No newline at end of file + REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") + return ..() diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 0d84aab763..e2114f0778 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -11,7 +11,10 @@ var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description - var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode? + /// If this is TRUE, the user will have combt mode forcefully disabled while this is active. + var/blocks_combatmode = FALSE + /// If this is TRUE, the user will have sprint forcefully disabled while this is active. + var/blocks_sprint = FALSE var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /datum/status_effect/New(list/arguments) @@ -32,11 +35,11 @@ var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to linked_alert = A //so we can reference the alert, if we need to - START_PROCESSING(SSfastprocess, src) + START_PROCESSING(SSstatus_effects, src) return TRUE /datum/status_effect/Destroy() - STOP_PROCESSING(SSfastprocess, src) + STOP_PROCESSING(SSstatus_effects, src) if(owner) owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) @@ -55,9 +58,21 @@ qdel(src) /datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself. + SHOULD_CALL_PARENT(TRUE) + if(blocks_combatmode) + ADD_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) + if(blocks_sprint) + ADD_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) return TRUE + /datum/status_effect/proc/tick() //Called every tick. + /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null + SHOULD_CALL_PARENT(TRUE) + REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) + REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) + return TRUE + /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 3247b890c6..b44778054e 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -94,7 +94,7 @@ if(is_ash_immune(L)) return if(is_species(L, /datum/species/lizard/ashwalker)) - if(L.getStaminaLoss() <= STAMINA_SOFTCRIT) + if(!IS_STAMCRIT(L)) L.adjustStaminaLossBuffered(4) return L.adjustFireLoss(4) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 039fc102e8..638d8b53b6 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -43,7 +43,7 @@ if (!istype(M, required_type)) trimmed_list.Remove(M) continue - if (M.GetComponent(/datum/component/virtual_reality)) + if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG)) trimmed_list.Remove(M) continue if (!M.client) // Are they connected? diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 632d59c84d..48a298984c 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -165,7 +165,7 @@ /datum/outfit/syndicate/full name = "Syndicate Operative - Full Kit" - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/syndicate mask = /obj/item/clothing/mask/gas/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi r_pocket = /obj/item/tank/internals/emergency_oxygen/engi @@ -180,7 +180,7 @@ /datum/outfit/syndicate/lone name = "Syndicate Operative - Lone" - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/syndicate mask = /obj/item/clothing/mask/gas/syndicate suit = /obj/item/clothing/suit/space/syndicate/black/red head = /obj/item/clothing/head/helmet/space/syndicate/black/red diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index d84c104a2f..2e5dae3e04 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -205,13 +205,18 @@ difficulty = 10 /datum/objective_item/special/boh - name = "a bag of holding." + name = "a type of bag of holding." targetitem = /obj/item/storage/backpack/holding difficulty = 10 -/datum/objective_item/special/hypercell - name = "a hyper-capacity power cell." - targetitem = /obj/item/stock_parts/cell/hyper +/datum/objective_item/special/adv_surgical_drapes + name = "a set of smart surgical drapes." + targetitem = /obj/item/surgical_drapes/advanced + difficulty = 10 //would be 15 but cmo rarely have it on themselfs and leave it in their lockers... + +/datum/objective_item/special/bluespace + name = "a bluespace power cell." + targetitem = /obj/item/stock_parts/cell/bluespace difficulty = 5 /datum/objective_item/special/laserpointer diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index eac94081cb..7654070cf1 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -219,7 +219,7 @@ if(!is_operational()) //Autoeject if power is lost if(mob_occupant) go_out() - mob_occupant.apply_vore_prefs() + mob_occupant.copy_from_prefs_vr() connected_message("Clone Ejected: Loss of power.") else if(mob_occupant && (mob_occupant.loc == src)) @@ -229,7 +229,7 @@ SPEAK("The cloning has been \ aborted due to unrecoverable tissue failure.") go_out() - mob_occupant.apply_vore_prefs() + mob_occupant.copy_from_prefs_vr() else if(mob_occupant.cloneloss > (100 - heal_level)) mob_occupant.Unconscious(80) @@ -275,7 +275,7 @@ BP.attach_limb(mob_occupant) go_out() - mob_occupant.apply_vore_prefs() + mob_occupant.copy_from_prefs_vr() else if (!mob_occupant || mob_occupant.loc != src) occupant = null @@ -323,7 +323,7 @@ SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.") to_chat(user, "You force an emergency ejection. ") go_out() - mob_occupant.apply_vore_prefs() + mob_occupant.copy_from_prefs_vr() else return ..() @@ -421,7 +421,7 @@ if(mob_occupant && prob(100/(severity*efficiency))) connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0)) - mob_occupant.apply_vore_prefs() + mob_occupant.copy_from_prefs_vr() go_out() /obj/machinery/clonepod/ex_act(severity, target) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 5662737ff7..b9bd3da95e 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -136,7 +136,7 @@ if(connected && connected.is_operational()) if(connected.occupant) //set occupant_status message viable_occupant = connected.occupant - if(viable_occupant.has_dna() && !HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification + if(viable_occupant.has_dna() && !HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification occupant_status += "[viable_occupant.name] => " switch(viable_occupant.stat) if(CONSCIOUS) @@ -948,7 +948,7 @@ var/mob/living/carbon/viable_occupant = null if(connected) viable_occupant = connected.occupant - if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE)) + if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE)) viable_occupant = null return viable_occupant diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 97c89c9168..3acbaba4fd 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -17,7 +17,7 @@ Buildable meters icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi' icon_state = "simple" item_state = "buildpipe" - w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_SMALL level = 2 var/piping_layer = PIPING_LAYER_DEFAULT var/RPD_type diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index bab5c4d93e..ff79038a96 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -409,7 +409,7 @@ if(iscarbon(A)) var/mob/living/carbon/C = A //If not emagged, only target non downed carbons - if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.recoveringstam))//CIT CHANGE - replaces check for lying with check for recoveringstam + if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || (C.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)))//CIT CHANGE - replaces check for lying with check for recoveringstam continue //If emagged, target all but dead carbons diff --git a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm index 49cdc3667c..9f2530e43e 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm @@ -52,9 +52,7 @@ pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1) /obj/effect/projectile_lighting - var/owner -/obj/effect/projectile_lighting/Initialize(mapload, color, range, intensity, owner_key) +/obj/effect/projectile_lighting/Initialize(mapload, color, range, intensity) . = ..() set_light(range, intensity, color) - owner = owner_key diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index bd2c6c6e87..eb50ae43a7 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -1,4 +1,4 @@ -/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! +/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, list/turfs) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! if(!istype(starting) || !istype(ending) || !ispath(beam_type)) return var/datum/point/midpoint = point_midpoint_points(starting, ending) @@ -9,17 +9,15 @@ . = PB if(light_range > 0 && light_intensity > 0) var/list/turf/line = getline(starting.return_turf(), ending.return_turf()) - tracing_line: - for(var/i in line) - var/turf/T = i - for(var/obj/effect/projectile_lighting/PL in T) - if(PL.owner == instance_key) - continue tracing_line - QDEL_IN(new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key), qdel_in > 0? qdel_in : 5) + for(var/i in line) + if(turfs[i]) + continue + turfs[i] = TRUE + QDEL_IN(new /obj/effect/projectile_lighting(i, light_color_override, light_range, light_intensity), qdel_in > 0? qdel_in : 5) line = null if(qdel_in) QDEL_IN(PB, qdel_in) - +d /obj/effect/projectile/tracer name = "beam" icon = 'icons/obj/projectiles_tracer.dmi' diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5c2f151e38..5a215f0396 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) //If this were before the above checks, then trying to click on items would act a little funky and signal overrides wouldn't work. if(iscarbon(usr)) var/mob/living/carbon/C = usr - if(C.combatmode && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess)))) + if((C.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess)))) if(!C.get_active_held_item()) C.UnarmedAttack(src, TRUE) if(C.get_active_held_item() == src) @@ -496,7 +496,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) to_chat(user, "You cannot locate any organic eyes on this brain!") return - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit + if(IS_STAMCRIT(user))//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return //CIT CHANGE - ditto @@ -855,4 +855,19 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return /obj/item/proc/unembedded() - return \ No newline at end of file + return + +/** + * Sets our slowdown and updates equipment slowdown of any mob we're equipped on. + */ +/obj/item/proc/set_slowdown(new_slowdown) + slowdown = new_slowdown + if(CHECK_BITFIELD(item_flags, IN_INVENTORY)) + var/mob/living/L = loc + if(istype(L)) + L.update_equipment_speed_mods() + +/obj/item/vv_edit_var(var_name, var_value) + . = ..() + if(var_name == NAMEOF(src, slowdown)) + set_slowdown(var_value) //don't care if it's a duplicate edit as slowdown'll be set, do it anyways to force normal behavior. diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8802698b5d..0e109cd400 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -803,7 +803,7 @@ SLIME SCANNER /obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user) add_fingerprint(user) - if (!HAS_TRAIT(M, TRAIT_RADIMMUNE)) //no scanning if its a husk or DNA-less Species + if (!HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT)) //no scanning if its a husk or DNA-less Species user.visible_message("[user] analyzes [M]'s genetic sequence.", \ "You analyze [M]'s genetic sequence.") gene_scan(M, user) @@ -879,4 +879,4 @@ SLIME SCANNER if(mutation in discovered) return "[HM.name] ([HM.alias])" else - return HM.alias \ No newline at end of file + return HM.alias diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 60b1e81c94..90c9d78272 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -20,7 +20,7 @@ return attack_hand(user) /obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user) - if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_NOCLONE)) + if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M, TRAIT_NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/HM in remove_mutations) @@ -525,7 +525,7 @@ var/filled = FALSE /obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user) - if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M,TRAIT_NOCLONE)) + if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M,TRAIT_NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/mutation in add_mutations) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 8e93aa4fb4..cbbd50b573 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -143,33 +143,61 @@ /obj/item/melee/rapier name = "plastitanium rapier" - desc = "A impossibly thin blade made of plastitanium with a tip made of diamond. It looks to be able to cut through any armor." + desc = "A thin blade made of plastitanium with a diamond tip. It appears to be coated in a persistent layer of an unknown substance." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "rapier" item_state = "rapier" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - force = 25 - throwforce = 35 - block_chance = 0 - armour_penetration = 100 + force = 15 + throwforce = 25 + block_chance = 50 + armour_penetration = 200 //Apparently this gives it the ability to pierce block flags_1 = CONDUCT_1 obj_flags = UNIQUE_RENAME w_class = WEIGHT_CLASS_BULKY sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_- - attack_verb = list("slashed", "cut", "pierces", "pokes") - total_mass = 3.4 + attack_verb = list("stabs", "punctures", "pierces", "pokes") + hitsound = 'sound/weapons/rapierhit.ogg' + total_mass = 0.4 /obj/item/melee/rapier/Initialize() . = ..() AddComponent(/datum/component/butchering, 20, 65, 0) +/obj/item/melee/rapier/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(attack_type == PROJECTILE_ATTACK) + final_block_chance = 0 + return ..() + +/obj/item/melee/rapier/on_exit_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/rapier/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/unsheath.ogg', 25, 1) + ..() + +/obj/item/melee/rapier/on_enter_storage(datum/component/storage/S) + var/obj/item/storage/belt/sabre/rapier/B = S.parent + if(istype(B)) + playsound(B, 'sound/items/sheath.ogg', 25, 1) + ..() + /obj/item/melee/rapier/get_belt_overlay() return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier") /obj/item/melee/rapier/get_worn_belt_overlay(icon_file) return mutable_appearance(icon_file, "-rapier") +/obj/item/melee/rapier/attack(mob/living/target, mob/living/user) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/H = target + var/loss = H.getStaminaLoss() + H.Dizzy(10) + H.adjustStaminaLoss(30) + if((loss > 40) && prob(loss)) // if above 40, roll for sleep using 1% every 1 stamina damage + H.Sleeping(180) + /obj/item/melee/classic_baton name = "police baton" desc = "A wooden truncheon for beating criminal scum." @@ -240,7 +268,7 @@ if(!on) return ..() - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes batons unusuable in stamina softcrit + if(IS_STAMCRIT(user))//CIT CHANGE - makes batons unusuable in stamina softcrit to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return //CIT CHANGE - ditto diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 233eabd4ca..3a06c7d7fe 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -42,7 +42,7 @@ var/mob/living/L = user - if(istype(L) && L.getStaminaLoss() >= STAMINA_SOFTCRIT) + if(istype(L) && IS_STAMCRIT(L)) to_chat(user, "You're too exhausted for that.") return diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index fe1f3ebd6c..0ca2fbd386 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -80,7 +80,7 @@ else user.visible_message("[user] hugs [M] to make [M.p_them()] feel better!", \ "You hug [M] to make [M.p_them()] feel better!") - if(M.resting && !M.recoveringstam) + if(M.resting && !(M.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) M.set_resting(FALSE, TRUE) else user.visible_message("[user] pets [M]!", \ @@ -99,7 +99,7 @@ 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...") - if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !M.recoveringstam) + if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !(M.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) M.set_resting(FALSE, TRUE) else user.visible_message("[user] bops [M] on the head!", \ diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 4e03d029a8..0a29562d6b 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -795,18 +795,12 @@ /obj/item/storage/belt/sabre/rapier name = "rapier sheath" - desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal." + desc = "A sinister, thin sheath, suitable for a rapier." icon_state = "rsheath" item_state = "rsheath" force = 5 throwforce = 15 - block_chance = 30 w_class = WEIGHT_CLASS_BULKY attack_verb = list("bashed", "slashes", "prods", "pokes") fitting_swords = list(/obj/item/melee/rapier) starting_sword = /obj/item/melee/rapier - -/obj/item/storage/belt/sabre/rapier/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(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 //To thin to block bullets - return ..() diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index c9c686414d..01193d0e21 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -189,7 +189,7 @@ new /obj/item/reagent_containers/medspray/silver_sulf(src) new /obj/item/healthanalyzer/advanced(src) new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for - new /obj/item/clothing/glasses/hud/health/night(src) + new /obj/item/clothing/glasses/hud/health/night/syndicate(src) /obj/item/storage/firstaid/tactical/nukeop name = "improved combat medical kit" @@ -204,7 +204,7 @@ new /obj/item/reagent_containers/medspray/silver_sulf(src) new /obj/item/healthanalyzer/advanced(src) new /obj/item/reagent_containers/syringe/lethal/choral(src) // what the fuck does anyone use this piece of shit for - new /obj/item/clothing/glasses/hud/health/night(src) + new /obj/item/clothing/glasses/hud/health/night/syndicate(src) /* * Pill Bottles diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 4f7948c738..68db9b4807 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -259,6 +259,42 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) new /obj/item/ammo_box/a762(src) new /obj/item/ammo_box/a762(src) +/obj/item/storage/toolbox/infiltrator + name = "insidious case" + desc = "Bearing the emblem of the Syndicate, this case contains a full infiltrator stealth suit, and has enough room to fit weaponry if necessary while being quite the heavy bludgeoning implement when in a pinch." + icon_state = "infiltrator_case" + item_state = "infiltrator_case" + force = 12 + throwforce = 16 + w_class = WEIGHT_CLASS_NORMAL + has_latches = FALSE + +/obj/item/storage/toolbox/infiltrator/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.silent = TRUE + STR.max_items = 10 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.can_hold = typecacheof(list( + /obj/item/clothing/head/helmet/infiltrator, + /obj/item/clothing/suit/armor/vest/infiltrator, + /obj/item/clothing/under/syndicate/bloodred, + /obj/item/clothing/gloves/color/latex/nitrile/infiltrator, + /obj/item/clothing/mask/infiltrator, + /obj/item/clothing/shoes/combat/sneakboots, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/ammo_box + )) + +/obj/item/storage/toolbox/infiltrator/PopulateContents() + new /obj/item/clothing/head/helmet/infiltrator(src) + new /obj/item/clothing/suit/armor/vest/infiltrator(src) + new /obj/item/clothing/under/syndicate/bloodred(src) + new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src) + new /obj/item/clothing/mask/infiltrator(src) + new /obj/item/clothing/shoes/combat/sneakboots(src) + /obj/item/storage/toolbox/plastitanium/gold_real name = "golden toolbox" desc = "A larger then normal toolbox made of gold plated plastitanium." diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index d4d45b603c..aeb7bc8f59 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -374,6 +374,12 @@ for(var/i in 1 to 3) new /obj/item/grenade/spawnergrenade/buzzkill(src) +/obj/item/storage/box/syndie_kit/sleepytime/PopulateContents() + new /obj/item/clothing/under/syndicate/bloodred/sleepytime(src) + new /obj/item/reagent_containers/food/drinks/mug/coco(src) + new /obj/item/toy/plush/carpplushie(src) + new /obj/item/bedsheet/syndie(src) + /obj/item/storage/box/syndie_kit/kitchen_gun name = "Kitchen Gun (TM) package" diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 78ba6d4f5f..f821f47466 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -153,7 +153,7 @@ return FALSE if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) clowning_around(user) - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CIT CHANGE - makes it impossible to baton in stamina softcrit + if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit to_chat(user, "You're too exhausted for that.") return TRUE if(ishuman(M)) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 2c31e4addf..b188250fff 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -58,7 +58,7 @@ var/obj/item/twohanded/offhand/O = user.get_inactive_held_item() if(O && istype(O)) O.unwield() - slowdown -= slowdown_wielded + set_slowdown(slowdown - slowdown_wielded) /obj/item/twohanded/proc/wield(mob/living/carbon/user) if(wielded) @@ -88,7 +88,7 @@ O.desc = "Your second grip on [src]." O.wielded = TRUE user.put_in_inactive_hand(O) - slowdown += slowdown_wielded + set_slowdown(slowdown + slowdown_wielded) /obj/item/twohanded/dropped(mob/user) . = ..() @@ -248,7 +248,7 @@ /obj/item/twohanded/fireaxe/afterattack(atom/A, mob/living/user, proximity) . = ..() - if(!proximity || (user.getStaminaLoss() > STAMINA_SOFTCRIT)) + if(!proximity || IS_STAMCRIT(user)) //don't make stamcrit message they'll already have gotten one from the primary attack. return if(wielded) //destroys windows and grilles in one hit (or more if it has a ton of health like plasmaglass) if(istype(A, /obj/structure/window)) @@ -1171,7 +1171,7 @@ turn_off() /obj/item/twohanded/electrostaff/attack(mob/living/target, mob/living/user) - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit + if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return //CIT CHANGE - ditto if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index e0c2d6e2c7..06c1d96711 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -101,7 +101,7 @@ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) to_chat(user, "You can't do that right now!") return TRUE - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted for that.") return TRUE var/mob/living/poordude = buckled_mobs[1] diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index b967b4efe1..da11f858f8 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -15,7 +15,7 @@ new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/storage/belt/military(src) new /obj/item/crowbar/red(src) - new /obj/item/clothing/glasses/night(src) + new /obj/item/clothing/glasses/night/syndicate(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 77416c45e5..711bc09069 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -195,9 +195,7 @@ return if(isgolem(user) && can_transfer) var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No") - if(transfer_choice != "Yes") - return - if(QDELETED(src) || uses <= 0) + if(transfer_choice != "Yes" || QDELETED(src) || uses <= 0 || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY, NO_TK)) return log_game("[key_name(user)] golem-swapped into [src]") user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!") @@ -680,8 +678,9 @@ new_spawn.AddElement(/datum/element/dusts_on_catatonia) new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type,/area/hilbertshotel)) ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) - ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) - ADD_TRAIT(new_spawn,TRAIT_PACIFISM,GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still elegible for ghost roles popups. + ADD_TRAIT(new_spawn, TRAIT_PACIFISM, GHOSTROLE_TRAIT) to_chat(new_spawn,"You may be sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!") to_chat(new_spawn,"You can turn yourself into a ghost and freely reenter your body with the ghost action.") var/datum/action/ghost/G = new(new_spawn) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 066249505d..d5b5cfc695 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -260,7 +260,7 @@ return FALSE if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING)) var/mob/living/carbon/human/H = C - if(!H.sprinting && H.getStaminaLoss() <= 20) + if(!(H.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && H.getStaminaLoss() <= 20) return FALSE if(!(lube&SLIDE_ICE)) to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!") diff --git a/code/modules/antagonists/blood_contract/blood_contract.dm b/code/modules/antagonists/blood_contract/blood_contract.dm index 4e7238647e..5d2fda08fc 100644 --- a/code/modules/antagonists/blood_contract/blood_contract.dm +++ b/code/modules/antagonists/blood_contract/blood_contract.dm @@ -27,7 +27,7 @@ INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H) //could use moving out from the mine for(var/mob/living/carbon/human/P in GLOB.player_list) - if(P == H) + if(P == H || HAS_TRAIT(P, TRAIT_NO_MIDROUND_ANTAG)) continue to_chat(P, "You have an overwhelming desire to kill [H]. [H.p_theyve(TRUE)] been marked red! Whoever [H.p_they()] [H.p_were()], friend or foe, go kill [H.p_them()]!") P.put_in_hands(new /obj/item/kitchen/knife/butcher(P), TRUE) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 4d06c127d4..755d12ae09 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -185,10 +185,10 @@ BuyPower(new /datum/action/bloodsucker/veil) // Traits for(var/T in defaultTraits) - ADD_TRAIT(owner.current, T, "bloodsucker") + ADD_TRAIT(owner.current, T, BLOODSUCKER_TRAIT) if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you had_toxlover = TRUE - REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, "species") + REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT) // Traits: Species if(ishuman(owner.current)) var/mob/living/carbon/human/H = owner.current @@ -235,9 +235,9 @@ // owner.RemoveSpell(power) // Traits for(var/T in defaultTraits) - REMOVE_TRAIT(owner.current, T, "bloodsucker") + REMOVE_TRAIT(owner.current, T, BLOODSUCKER_TRAIT) if(had_toxlover == TRUE) - ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, "species") + ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT) // Traits: Species if(ishuman(owner.current)) @@ -387,7 +387,7 @@ add_objective(heartthief_objective) /* else - + // Solars Objective, doesnt work due to TG updates. var/datum/objective/bloodsucker/solars/solars_objective = new solars_objective.owner = owner diff --git a/code/modules/antagonists/traitor/classes/freeform.dm b/code/modules/antagonists/traitor/classes/freeform.dm index f84eadb9f6..998373a77c 100644 --- a/code/modules/antagonists/traitor/classes/freeform.dm +++ b/code/modules/antagonists/traitor/classes/freeform.dm @@ -6,7 +6,7 @@ /datum/traitor_class/human/freeform/forge_objectives(datum/antagonist/traitor/T) var/datum/objective/escape/O = new - O.explanation_text = "You have no goals! Whatever you can do do antagonize Nanotrasen, do it! The gimmickier, the better! Make sure to escape alive, though!" + O.explanation_text = "You have no explicit goals! While we don't approve of mindless slaughter, you may antagonize nanotrasen any way you wish! Make sure to escape alive and not in custody, though!" O.owner = T.owner T.add_objective(O) return diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index c75a1c0bff..836dc044b7 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -211,7 +211,7 @@ /datum/export/weapon/arrows cost = 150 unit_name = "arrow" - export_types = list(/obj/item/ammo_casing/caseless/arrow, /obj/item/ammo_casing/caseless/arrow/bone, /obj/item/ammo_casing/caseless/arrow/ashen) + export_types = list(/obj/item/ammo_casing/caseless/arrow, /obj/item/ammo_casing/caseless/arrow/bone, /obj/item/ammo_casing/caseless/arrow/ash) /datum/export/weapon/bow_teaching cost = 500 diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index dc550179f8..84096b1367 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -223,7 +223,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) new /datum/admins(localhost_rank, ckey, 1, 1) //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) prefs = GLOB.preferences_datums[ckey] - prefs_vr = GLOB.vore_preferences_datums[ckey] //CITADEL EDIT bypassing a failing hook if(prefs) prefs.parent = src @@ -231,13 +230,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs - if(prefs_vr) //CITADEL EDIT bypassing a failing hook START - prefs_vr.client = src - else - prefs_vr = new/datum/vore_preferences(src) - GLOB.vore_preferences_datums[ckey] = prefs_vr - //CITADEL EDIT bypassing a failing hook END - prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning fps = prefs.clientfps diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a9deba070a..4629ed5c35 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -121,39 +121,25 @@ GLOBAL_LIST_EMPTY(preferences_datums) "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, - "cock_shape" = "Human", - "cock_length" = 6, + "cock_shape" = DEF_COCK_SHAPE, + "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "fff", - "has_sheath" = FALSE, - "sheath_color" = "fff", "has_balls" = FALSE, "balls_internal" = FALSE, "balls_color" = "fff", - "balls_amount" = 2, - "balls_sack_size" = BALLS_SACK_SIZE_DEF, - "balls_shape" = "Single", + "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, - "has_ovi" = FALSE, - "ovi_shape" = "knotted", - "ovi_length" = 6, - "ovi_color" = "fff", - "has_eggsack" = FALSE, - "eggsack_internal" = TRUE, - "eggsack_color" = "fff", - "eggsack_size" = BALLS_SACK_SIZE_DEF, - "eggsack_egg_color" = "fff", - "eggsack_egg_size" = EGG_GIRTH_DEF, "has_breasts" = FALSE, "breasts_color" = "fff", - "breasts_size" = "C", - "breasts_shape" = "Pair", + "breasts_size" = BREASTS_SIZE_DEF, + "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, - "vag_shape" = "Human", + "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "fff", "vag_clits" = 1, "vag_clit_diam" = 0.25, @@ -205,6 +191,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/action_buttons_screen_locs = list() + //bad stuff + var/digestable = FALSE + var/devourable = FALSE + var/feeding = FALSE + var/lickable = FALSE + var/list/belly_prefs = list() + var/vore_taste = "nothing in particular" + //backgrounds var/mutable_appearance/character_background var/icon/bgstate = "steel" @@ -1483,7 +1477,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("flavor_text") - var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FAVOR_LEN, TRUE) + var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FLAVOR_LEN, TRUE) if(!isnull(msg)) features["flavor_text"] = html_decode(msg) @@ -1916,6 +1910,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list if(new_dors) features["xenodorsal"] = new_dors + //Genital code if("cock_color") var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null @@ -1956,22 +1951,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_shape) features["balls_shape"] = new_shape - if("egg_size") - var/new_size - var/list/egg_sizes = list(1,2,3) - new_size = input(user, "Egg Diameter(inches):", "Egg Size") as null|anything in egg_sizes - if(new_size) - features["eggsack_egg_size"] = new_size - - if("egg_color") - var/new_egg_color = input(user, "Egg Color:", "Character Preference") as color|null - if(new_egg_color) - var/temp_hsv = RGBtoHSV(new_egg_color) - if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) - features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color) - else - to_chat(user,"Invalid color. Your color is not bright enough.") - if("breasts_size") var/new_size new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breasts_size_list @@ -2105,14 +2084,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["has_balls"] = FALSE if("has_balls") features["has_balls"] = !features["has_balls"] - if("has_ovi") - features["has_ovi"] = !features["has_ovi"] - if("has_eggsack") - features["has_eggsack"] = !features["has_eggsack"] if("balls_internal") features["balls_internal"] = !features["balls_internal"] - if("eggsack_internal") - features["eggsack_internal"] = !features["eggsack_internal"] if("has_breasts") features["has_breasts"] = !features["has_breasts"] if(features["has_breasts"] == FALSE) @@ -2301,16 +2274,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("load") load_preferences() load_character() - if(parent && parent.prefs_vr) - attempt_vr(parent.prefs_vr,"load_vore","") if("changeslot") if(!load_character(text2num(href_list["num"]))) random_character() real_name = random_unique_name(gender) save_character() - if(parent && parent.prefs_vr) - attempt_vr(parent.prefs_vr,"load_vore","") if("tab") if (href_list["tab"]) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 86148ee17c..63a9ca40e9 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 25 +#define SAVEFILE_VERSION_MAX 26 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -115,6 +115,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(digi == "Digitigrade Legs") WRITE_FILE(S["feature_lizard_legs"], "Digitigrade") + if(current_version < 26) + var/vr_path = "data/player_saves/[parent.ckey[1]]/[parent.ckey]/vore/character[default_slot].json" + if(fexists(vr_path)) + var/list/json_from_file = json_decode(file2text(vr_path)) + if(json_from_file) + digestable = json_from_file["digestable"] + devourable = json_from_file["devourable"] + feeding = json_from_file["feeding"] + lickable = json_from_file["lickable"] + belly_prefs = json_from_file["belly_prefs"] + vore_taste = json_from_file["vore_taste"] + + for(var/V in all_quirks) // quirk migration + switch(V) + if("Acute hepatic pharmacokinesis") + DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT) + DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT) + ENABLE_BITFIELD(cit_toggles,FORCED_FEM) + ENABLE_BITFIELD(cit_toggles,FORCED_MASC) + all_quirks -= V + if("Crocin Immunity") + ENABLE_BITFIELD(cit_toggles,NO_APHRO) + all_quirks -= V + if("Buns of Steel") + ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP) + all_quirks -= V + + if(features["meat_type"] == "Inesct") + features["meat_type"] = "Insect" + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -422,7 +452,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_balls_color"] >> features["balls_color"] S["feature_balls_size"] >> features["balls_size"] S["feature_balls_shape"] >> features["balls_shape"] - S["feature_balls_sack_size"] >> features["balls_sack_size"] //breasts features S["feature_has_breasts"] >> features["has_breasts"] S["feature_breasts_size"] >> features["breasts_size"] @@ -446,6 +475,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else //We have no old flavortext, default to new S["feature_flavor_text"] >> features["flavor_text"] + S["digestable"] >> digestable + S["devourable"] >> devourable + S["feeding"] >> feeding + S["vore_taste"] >> vore_taste + S["lickable"] >> lickable + S["belly_prefs"] >> belly_prefs //try to fix any outdated data if necessary if(needs_update >= 0) @@ -510,6 +545,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None") features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list) + features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breasts_size_list, BREASTS_SIZE_DEF) + features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE) + features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE) + features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, COCK_SIZE_DEF) + features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE) + features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE) + features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, FALSE, "FFF") + features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF") + features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF") + features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF") + + features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN) + joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) //Validate job prefs for(var/j in job_preferences) @@ -518,23 +566,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car all_quirks = SANITIZE_LIST(all_quirks) - for(var/V in all_quirks) // quirk migration - switch(V) - if("Acute hepatic pharmacokinesis") - DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT) - DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT) - ENABLE_BITFIELD(cit_toggles,FORCED_FEM) - ENABLE_BITFIELD(cit_toggles,FORCED_MASC) - all_quirks -= V - if("Crocin Immunity") - ENABLE_BITFIELD(cit_toggles,NO_APHRO) - all_quirks -= V - if("Buns of Steel") - ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP) - all_quirks -= V + lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable)) + devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable)) + digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable)) + feeding = sanitize_integer(feeding, FALSE, TRUE, initial(feeding)) + vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN) + belly_prefs = SANITIZE_LIST(belly_prefs) - if(features["meat_type"] == "Inesct") - features["meat_type"] = "Insect" cit_character_pref_load(S) return 1 @@ -613,6 +651,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) + WRITE_FILE(S["digestable"] , digestable) + WRITE_FILE(S["devourable"] , devourable) + WRITE_FILE(S["feeding"] , feeding) + WRITE_FILE(S["vore_taste"] , vore_taste) + WRITE_FILE(S["lickable"] , lickable) + WRITE_FILE(S["belly_prefs"] , belly_prefs) + cit_character_pref_save(S) return 1 diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index b67fe2b462..cbd1fcff87 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -447,7 +447,7 @@ permeability_coefficient = 0.01 flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH - var/vchange = 1 + var/voice_change = 1 ///This determines if the voice changer is on or off. var/datum/action/item_action/chameleon/change/chameleon_action @@ -470,15 +470,14 @@ chameleon_action.emp_randomise(INFINITY) /obj/item/clothing/mask/chameleon/attack_self(mob/user) - vchange = !vchange - to_chat(user, "The voice changer is now [vchange ? "on" : "off"]!") - + voice_change = !voice_change + to_chat(user, "The voice changer is now [voice_change ? "on" : "off"]!") /obj/item/clothing/mask/chameleon/drone //Same as the drone chameleon hat, undroppable and no protection armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // Can drones use the voice changer part? Let's not find out. - vchange = 0 + voice_change = 0 /obj/item/clothing/mask/chameleon/drone/Initialize() . = ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index d3ecccfcf8..66dcf89a7a 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -82,6 +82,7 @@ icon_state = "nvgmeson" item_state = "nvgmeson" darkness_view = 8 + flash_protect = -2 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE glass_colour_type = /datum/client_colour/glass_colour/green @@ -119,10 +120,11 @@ /obj/item/clothing/glasses/night name = "night vision goggles" - desc = "You can totally see in the dark now!" + desc = "You can totally see in the dark now! Just don't look too closely at bright lights. This lacks any flash correction." icon_state = "night" item_state = "glasses" darkness_view = 8 + flash_protect = -2 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE glass_colour_type = /datum/client_colour/glass_colour/green @@ -130,6 +132,12 @@ name = "prescription night vision goggles" desc = "NVGs but for those with nearsightedness." vision_correction = 1 + +/obj/item/clothing/glasses/night/syndicate + name = "combat night vision goggles" + desc = "See everything, without fear." + flash_protect = 1 + vision_correction = 1 /obj/item/clothing/glasses/science/suicide_act(mob/living/carbon/user) user.visible_message("[user] is tightening \the [src]'s straps around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 5c0bb33a29..c745cd74f0 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -63,12 +63,19 @@ /obj/item/clothing/glasses/hud/health/night name = "night vision health scanner HUD" - desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." + desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness." icon_state = "healthhudnight" item_state = "glasses" darkness_view = 8 + flash_protect = -2 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE glass_colour_type = /datum/client_colour/glass_colour/green + +/obj/item/clothing/glasses/hud/health/night/syndicate + name = "combat night vision health scanner HUD" + desc = "An advanced shielded medical heads-up display that allows soldiers to approximate how much lead poisoning their allies have suffered in complete darkness." + flash_protect = 1 + vision_correction = 1 /obj/item/clothing/glasses/hud/health/sunglasses name = "medical HUDSunglasses" @@ -126,6 +133,7 @@ icon_state = "diagnostichudnight" item_state = "glasses" darkness_view = 8 + flash_protect = -2 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE glass_colour_type = /datum/client_colour/glass_colour/green @@ -199,6 +207,7 @@ desc = "An advanced heads-up display which provides id data and vision in complete darkness." icon_state = "securityhudnight" darkness_view = 8 + flash_protect = -2 //You either are flashproof or you can see in the dark, pick one. lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE glass_colour_type = /datum/client_colour/glass_colour/green diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm index 96f5cfc201..1c9afcfd6f 100644 --- a/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -35,10 +35,10 @@ return if(slot != SLOT_GLASSES) return - RegisterSignal(user, COMSIG_COMBAT_TOGGLED, .proc/injectadrenaline) + RegisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED, .proc/injectadrenaline) /obj/item/clothing/glasses/phantomthief/syndicate/dropped(mob/user) . = ..() if(!istype(user)) return - UnregisterSignal(user, COMSIG_COMBAT_TOGGLED) + UnregisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index f4b04f5bfe..cf3541fd89 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -194,7 +194,7 @@ /obj/item/clothing/gloves/color/latex name = "latex gloves" - desc = "Cheap sterile gloves made from latex." + desc = "Cheap sterile gloves made from latex. Transfers basic paramedical knowledge to the wearer via the use of nanochips." icon_state = "latex" item_state = "lgloves" siemens_coefficient = 0.3 @@ -202,14 +202,34 @@ item_color="mime" transfer_prints = TRUE resistance_flags = NONE + var/carrytrait = TRAIT_QUICK_CARRY + +/obj/item/clothing/gloves/color/latex/equipped(mob/user, slot) + ..() + if(slot == SLOT_GLOVES) + ADD_TRAIT(user, carrytrait, CLOTHING_TRAIT) + +/obj/item/clothing/gloves/color/latex/dropped(mob/user) + ..() + REMOVE_TRAIT(user, carrytrait, CLOTHING_TRAIT) /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" - desc = "Pricy sterile gloves that are stronger than latex." + desc = "Pricy sterile gloves that are stronger than latex. Transfers advanced paramedical knowledge to the wearer via the use of nanochips." icon_state = "nitrile" item_state = "nitrilegloves" item_color = "cmo" transfer_prints = FALSE + carrytrait = TRAIT_QUICKER_CARRY + +/obj/item/clothing/gloves/color/latex/nitrile/infiltrator + name = "insidious combat gloves" + desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping knowledge to the user via the use of nanochips." + icon_state = "infiltrator" + item_state = "infiltrator" + siemens_coefficient = 0 + permeability_coefficient = 0.3 + resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/gloves/color/white name = "white gloves" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 3b1b92ea78..6e2e655c1b 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -256,6 +256,21 @@ strip_delay = 100 mutantrace_variation = STYLE_MUZZLE +/obj/item/clothing/head/helmet/infiltrator + name = "insidious helmet" + desc = "An insidious armored combat helmet signed with Syndicate insignia. The visor is coated with a resistant paste guaranteed to withstand bright flashes perfectly." + icon_state = "infiltrator" + item_state = "infiltrator" + armor = list("melee" = 40, "bullet" = 40, "laser" = 30, "energy" = 40, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + resistance_flags = FIRE_PROOF | ACID_PROOF + flash_protect = 2 + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + dynamic_hair_suffix = "" + dynamic_fhair_suffix = "" + strip_delay = 80 + mutantrace_variation = STYLE_MUZZLE + //LightToggle /obj/item/clothing/head/helment/ComponentInitialize() diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index dc151cdd42..a87c1cf82b 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -12,6 +12,20 @@ /obj/item/clothing/mask/balaclava/attack_self(mob/user) adjustmask(user) +/obj/item/clothing/mask/infiltrator + name = "insidious balaclava" + desc = "An incredibly suspicious balaclava made with Syndicate nanofibers to absorb impacts slightly while obfuscating the voice and face using a garbled vocoder." + icon_state = "syndicate_balaclava" + item_state = "syndicate_balaclava" + clothing_flags = ALLOWINTERNALS + flags_cover = HEADCOVERSEYES + flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + visor_flags_inv = HIDEFACE|HIDEFACIALHAIR + w_class = WEIGHT_CLASS_SMALL + armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 100, "acid" = 40) + resistance_flags = FIRE_PROOF | ACID_PROOF + var/voice_unknown = TRUE ///This makes it so that your name shows up as unknown when wearing the mask. + /obj/item/clothing/mask/luchador name = "Luchador Mask" desc = "Worn by robust fighters, flying high to defeat their foes!" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index c0e566cc0e..519e4e7fcd 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -19,6 +19,14 @@ permeability_coefficient = 0.05 //Thick soles, and covers the ankle pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes +/obj/item/clothing/shoes/combat/sneakboots + name = "insidious sneakboots" + desc = "A pair of insidious boots with special noise muffling soles which very slightly drown out your footsteps. They would be absolutely perfect for stealth operations were it not for the iconic Syndicate flairs." + icon_state = "sneakboots" + item_state = "sneakboots" + resistance_flags = FIRE_PROOF | ACID_PROOF + clothing_flags = TRAIT_SILENT_STEP + /obj/item/clothing/shoes/combat/swat //overpowered boots for death squads name = "\improper SWAT boots" desc = "High speed, no drag combat boots." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 3b84a227ef..9a43f77381 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -191,6 +191,15 @@ . = ..() allowed = GLOB.detective_vest_allowed +/obj/item/clothing/suit/armor/vest/infiltrator + name = "insidious combat vest" + desc = "An insidious combat vest designed using Syndicate nanofibers to absorb the supreme majority of kinetic blows. Although it doesn't look like it'll do too much for energy impacts." + icon_state = "infiltrator" + item_state = "infiltrator" + armor = list("melee" = 30, "bullet" = 40, "laser" = 20, "energy" = 30, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + resistance_flags = FIRE_PROOF | ACID_PROOF + strip_delay = 80 + //All of the armor below is mostly unused /obj/item/clothing/suit/armor/centcom diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 63e3a63968..ab85a1b59b 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -12,6 +12,7 @@ var/can_adjust = TRUE var/adjusted = NORMAL_STYLE var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only + var/dummy_thick = FALSE // is able to hold accessories on its item var/obj/item/clothing/accessory/attached_accessory var/mutable_appearance/accessory_overlay mutantrace_variation = STYLE_DIGITIGRADE @@ -82,6 +83,10 @@ if(user) to_chat(user, "[src] already has an accessory.") return + if(dummy_thick) + if(user) + to_chat(user, "[src] is too bulky and cannot have accessories attached to it!") + return else if(user && !user.temporarilyRemoveItemFromInventory(I)) return diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 37d2dcffbc..1250f4ed19 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -19,6 +19,25 @@ alt_covers_chest = TRUE fitted = FEMALE_UNIFORM_TOP +/obj/item/clothing/under/syndicate/bloodred + name = "blood-red sneaksuit" + desc = "An insidious armored jumpsuit lined with Syndicate nanofibers and prototype platings, slightly resistant to most forms of damage, but is far too bulky to have anything attached to it. It still counts as stealth if there are no witnesses." + icon_state = "bloodred_pajamas" + item_state = "bl_suit" + item_color = "bloodred_pajamas" + dummy_thick = TRUE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40) + resistance_flags = FIRE_PROOF | ACID_PROOF + can_adjust = FALSE + +/obj/item/clothing/under/syndicate/bloodred/sleepytime + name = "blood-red pajamas" + desc = "Do operatives dream of nuclear sheep?" + icon_state = "bloodred_pajamas" + item_state = "bl_suit" + item_color = "bloodred_pajamas" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) + /obj/item/clothing/under/syndicate/tacticool name = "tacticool turtleneck" desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." @@ -75,7 +94,7 @@ item_color = "rus_under" can_adjust = FALSE armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - resistance_flags = NONE + resistance_flags = NONE /obj/item/clothing/under/syndicate/baseball name = "major league, number unknown" diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index d3cbf03581..cb742ca27f 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -16,13 +16,14 @@ ..() for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) H.put_in_hands(new /obj/item/valentine) - var/obj/item/storage/backpack/b = locate() in H.contents - new /obj/item/reagent_containers/food/snacks/candyheart(b) - new /obj/item/storage/fancy/heart_box(b) + var/obj/item/storage/backpack/B = locate() in H.contents + if(B) + new /obj/item/reagent_containers/food/snacks/candyheart(B) + new /obj/item/storage/fancy/heart_box(B) var/list/valentines = list() for(var/mob/living/M in GLOB.player_list) - if(!M.stat && M.client && M.mind) + if(!M.stat && M.client && M.mind && !HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG)) valentines |= M diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 1186268e31..dc0b07b464 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -4,11 +4,26 @@ weight = 10 max_occurrences = 2 min_players = 1 + var/forced_hallucination + +/datum/round_event_control/mass_hallucination/admin_setup() + if(!check_rights(R_FUN)) + return + + forced_hallucination = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in subtypesof(/datum/hallucination) /datum/round_event/mass_hallucination fakeable = FALSE /datum/round_event/mass_hallucination/start() + var/datum/round_event_control/mass_hallucination/M = control + if(M.forced_hallucination) + for(var/mob/living/carbon/C in GLOB.alive_mob_list) + if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS)) + continue + new M.forced_hallucination(C, TRUE) + return + switch(rand(1,4)) if(1) //same sound for everyone var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla") @@ -37,4 +52,4 @@ for(var/mob/living/carbon/C in GLOB.alive_mob_list) if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS)) continue - new picked_hallucination(C, TRUE) \ No newline at end of file + new picked_hallucination(C, TRUE) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 1c31113332..11bb44ce97 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -49,6 +49,10 @@ to_chat(user, "You place [I] into [src] to start the fermentation process.") addtimer(CALLBACK(src, .proc/makeWine, fruit), rand(80, 120) * speed_multiplier) return TRUE + var/obj/item/W = I + if(W) + if(W.is_refillable()) + return FALSE //so we can refill them via their afterattack. else return ..() diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm index eef170cea9..e344bc9d20 100644 --- a/code/modules/keybindings/bindings_carbon.dm +++ b/code/modules/keybindings/bindings_carbon.dm @@ -4,6 +4,6 @@ toggle_throw_mode() return if("C") - toggle_combat_mode() + user_toggle_intentional_combat_mode() return return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm index ed033935b2..9569de338c 100644 --- a/code/modules/keybindings/bindings_human.dm +++ b/code/modules/keybindings/bindings_human.dm @@ -59,11 +59,11 @@ switch(_key) if("Shift") if(!user.prefs.sprint_spacebar) - user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works. + user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works. return if("Space") if(user.prefs.sprint_spacebar) - user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE) + user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE) return return ..() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index bf25bb9da8..a95c0e24ed 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -136,7 +136,7 @@ desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it." id = "bountymod" materials = list(/datum/material/iron = 4000, /datum/material/silver = 4000, /datum/material/gold = 4000, /datum/material/bluespace = 4000) - reagents_list = list("blood" = 40) + reagents_list = list(/datum/reagent/blood = 40) build_path = /obj/item/borg/upgrade/modkit/bounty //Spooky special loot diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index c569a2c59a..41f2c7142f 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -237,7 +237,7 @@ return /datum/reagent/blood/jellyblood if(dna?.species?.exotic_blood) return dna.species.exotic_blood - else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE))) + else if((dna && (NOBLOOD in dna.species.species_traits)) || HAS_TRAIT(src, TRAIT_NOCLONE)) return else return /datum/reagent/blood diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index fda136df0b..cdb8aff2c6 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -21,7 +21,7 @@ In all, this is a lot like the monkey code. /N return switch(M.a_intent) if (INTENT_HELP) - if(!recoveringstam) + if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) set_resting(FALSE, TRUE, FALSE) AdjustAllImmobility(-60, FALSE) AdjustUnconscious(-60, FALSE) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 4d362ca554..00d929a1e0 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -27,7 +27,7 @@ else if(stat == UNCONSCIOUS) stat = CONSCIOUS - if(!recoveringstam) + if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) set_resting(FALSE, TRUE) adjust_blindness(-1) update_mobility() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5bb1e6d17d..f5f9a734ae 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -153,7 +153,7 @@ return //CIT CHANGES - makes it impossible to throw while in stamina softcrit - if(getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(src)) to_chat(src, "You're too exhausted.") return var/random_turn = a_intent == INTENT_HARM @@ -448,7 +448,7 @@ modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! //CIT CHANGES START HERE - else if(combatmode) + else if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) modifier += 50 if(modifier < 100) @@ -820,15 +820,13 @@ return if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))) stat = UNCONSCIOUS + disable_intentional_combat_mode(FALSE, FALSE) if(!eye_blind) blind_eyes(1) - if(combatmode) - toggle_combat_mode(TRUE, TRUE) else if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) stat = SOFT_CRIT - if(combatmode) - toggle_combat_mode(TRUE, TRUE) + disable_intentional_combat_mode(FALSE, FALSE) else stat = CONSCIOUS adjust_blindness(-1) @@ -1011,8 +1009,7 @@ return TRUE /mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE) - if(combatmode) - toggle_combat_mode(TRUE, TRUE) + disable_intentional_combat_mode(TRUE, FALSE) return ..() /mob/living/carbon/can_see_reagents() diff --git a/code/modules/mob/living/carbon/carbon_combat.dm b/code/modules/mob/living/carbon/carbon_combat.dm new file mode 100644 index 0000000000..f43d850401 --- /dev/null +++ b/code/modules/mob/living/carbon/carbon_combat.dm @@ -0,0 +1,6 @@ +/mob/living/carbon/enable_intentional_combat_mode() + . = ..() + if(.) + if(voremode) + toggle_vore_mode() + diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8bd1a35e07..32d8d7e605 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -79,13 +79,11 @@ /mob/living/carbon/attacked_by(obj/item/I, mob/living/user) //CIT CHANGES START HERE - combatmode and resting checks var/totitemdamage = I.force - if(iscarbon(user)) - var/mob/living/carbon/tempcarb = user - if(!tempcarb.combatmode) - totitemdamage *= 0.5 + if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + totitemdamage *= 0.5 if(!CHECK_MOBILITY(user, MOBILITY_STAND)) totitemdamage *= 0.5 - if(!combatmode) + if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) totitemdamage *= 1.5 //CIT CHANGES END HERE if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) @@ -348,7 +346,7 @@ AdjustAllImmobility(-60, FALSE) AdjustUnconscious(-60, FALSE) AdjustSleeping(-100, FALSE) - if(recoveringstam) + if(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) adjustStaminaLoss(-15) else set_resting(FALSE, FALSE) diff --git a/code/modules/mob/living/carbon/carbon_sprint.dm b/code/modules/mob/living/carbon/carbon_sprint.dm new file mode 100644 index 0000000000..63d3e03356 --- /dev/null +++ b/code/modules/mob/living/carbon/carbon_sprint.dm @@ -0,0 +1,18 @@ +/// Sprint buffer /// +/mob/living/carbon/doSprintLossTiles(tiles) + doSprintBufferRegen(FALSE) //first regen. + if(sprint_buffer) + var/use = min(tiles, sprint_buffer) + sprint_buffer -= use + tiles -= use + update_hud_sprint_bar() + if(!tiles) //we had enough, we're done! + return + adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit. + +/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE) + var/diff = world.time - sprint_buffer_regen_last + sprint_buffer_regen_last = world.time + sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff) + if(updating) + update_hud_sprint_bar() diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index e0c394b2e0..28e0f2028d 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -7,8 +7,8 @@ if(!gibbed) emote("deathgasp") - if(combatmode) - toggle_combat_mode(TRUE, TRUE) + + disable_intentional_combat_mode(TRUE, FALSE) . = ..() @@ -67,6 +67,5 @@ BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) /mob/living/carbon/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE) - if(combatmode) - toggle_combat_mode(TRUE, TRUE) + disable_intentional_combat_mode(TRUE, FALSE) return ..() diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index efd81c1744..1ee3369701 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -90,7 +90,7 @@ if(digitalcamo) . += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner." - if(combatmode) + if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) . += "[t_He] [t_is] visibly tense[CHECK_MOBILITY(src, MOBILITY_STAND) ? "." : ", and [t_is] standing in combative stance."]" var/trait_exam = common_trait_examine() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 41f8283ab9..b2691f4474 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -29,7 +29,7 @@ . = ..() if(CONFIG_GET(flag/disable_stambuffer)) - togglesprint() + enable_intentional_sprint_mode() RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood) @@ -707,7 +707,7 @@ /mob/living/carbon/human/wash_cream() if(creamed) //clean both to prevent a rare bug - cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_snout")) cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) creamed = FALSE @@ -880,10 +880,20 @@ return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) /mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target) - if(can_be_firemanned(target)) - visible_message("[src] starts lifting [target] onto their back...", - "You start lifting [target] onto your back...") - if(do_after(src, 30, TRUE, target)) + var/carrydelay = 50 //if you have latex you are faster at grabbing + var/skills_space = "" //cobby told me to do this + if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY)) + carrydelay = 30 + skills_space = "expertly" + else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY)) + carrydelay = 40 + skills_space = "quickly" + if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) + visible_message("[src] starts [skills_space] lifting [target] onto their back..", + //Joe Medic starts quickly/expertly lifting Grey Tider onto their back.. + "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]") + //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...) + if(do_after(src, carrydelay, TRUE, target)) //Second check to make sure they're still valid to be carried if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) target.set_resting(FALSE, TRUE) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 63c7d8f668..2e5efa3105 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -6,6 +6,9 @@ can_buckle = TRUE buckle_lying = FALSE mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + /// Enable stamina combat + combat_flags = COMBAT_FLAGS_DEFAULT + //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" diff --git a/code/modules/mob/living/carbon/human/human_mobility.dm b/code/modules/mob/living/carbon/human/human_mobility.dm index 61ceb42336..dc498c4153 100644 --- a/code/modules/mob/living/carbon/human/human_mobility.dm +++ b/code/modules/mob/living/carbon/human/human_mobility.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) - if(!resting || stat || attemptingstandup) + if(!resting || stat || (combat_flags & COMBAT_FLAG_RESISTING_REST)) return FALSE if(ignoretimer) set_resting(FALSE, FALSE) @@ -13,10 +13,10 @@ return FALSE else var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest - if(getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(src)) to_chat(src, "You're too exhausted to get up!") return FALSE - attemptingstandup = TRUE + combat_flags |= COMBAT_FLAG_RESISTING_REST var/health_deficiency = max((maxHealth - (health - getStaminaLoss()))*0.5, 0) if(!has_gravity()) health_deficiency = health_deficiency*0.2 @@ -37,10 +37,11 @@ visible_message("[standupwarning]", usernotice, vision_distance = 5) if(do_after(src, totaldelay, target = src, required_mobility_flags = MOBILITY_RESIST)) set_resting(FALSE, TRUE) - attemptingstandup = FALSE + + combat_flags &= ~COMBAT_FLAG_RESISTING_REST return TRUE else - attemptingstandup = FALSE + combat_flags &= ~COMBAT_FLAG_RESISTING_REST if(resting) //we didn't shove ourselves up or something visible_message("[src] falls right back down.", "You fall right back down.") if(has_gravity()) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 608ad76128..b6cf0f5a82 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -9,6 +9,13 @@ /mob/living/carbon/human/movement_delay() . = ..() + if(CHECK_MOBILITY(src, MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI + if(!SSI) + SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase) + . -= SSI.config_entry_value + if(wrongdirmovedelay) + . += 1 if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP)) . -= 1.5 @@ -42,10 +49,18 @@ return ((shoes && shoes.negates_gravity()) || (dna.species.negates_gravity(src))) /mob/living/carbon/human/Move(NewLoc, direct) + var/oldpseudoheight = pseudo_z_axis . = ..() for(var/datum/mutation/human/HM in dna.mutations) HM.on_move(src, NewLoc) - + if(. && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && !(movement_type & FLYING) && CHECK_ALL_MOBILITY(src, MOBILITY_MOVE|MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby) + if(!HAS_TRAIT(src, TRAIT_FREESPRINT)) + doSprintLossTiles(1) + if((oldpseudoheight - pseudo_z_axis) >= 8) + to_chat(src, "You trip off of the elevated surface!") + for(var/obj/item/I in held_items) + accident(I) + DefaultCombatKnockdown(80) if(shoes) if(!lying && !buckled) if(loc == NewLoc) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1079c48bf9..d703f6a4e2 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -13,7 +13,7 @@ /mob/living/carbon/human/GetVoice() if(istype(wear_mask, /obj/item/clothing/mask/chameleon)) var/obj/item/clothing/mask/chameleon/V = wear_mask - if(V.vchange && wear_id) + if(V.voice_change && wear_id) var/obj/item/card/id/idcard = wear_id.GetID() if(istype(idcard)) return idcard.registered_name @@ -21,6 +21,12 @@ return real_name else return real_name + if(istype(wear_mask, /obj/item/clothing/mask/infiltrator)) + var/obj/item/clothing/mask/infiltrator/V = wear_mask + if(V.voice_unknown) + return ("Unknown") + else + return real_name if(mind) var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling && changeling.mimicing ) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index fc2817f134..18d2393470 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1450,15 +1450,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.grabbedby(user) return 1 - - - - /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm [target]!") return FALSE - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit + if(IS_STAMCRIT(user)) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit to_chat(user, "You're too exhausted.") //CITADEL CHANGE - ditto return FALSE //CITADEL CHANGE - ditto if(target.check_block()) @@ -1487,11 +1483,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh) //CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage - if(!target.combatmode && damage < user.dna.species.punchstunthreshold) + if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && damage < user.dna.species.punchstunthreshold) damage = user.dna.species.punchstunthreshold - 1 if(!CHECK_MOBILITY(user, MOBILITY_STAND)) damage *= 0.5 - if(!user.combatmode) + if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) damage *= 0.25 //END OF CITADEL CHANGES @@ -1540,12 +1536,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/aim_for_groin = user.zone_selected == "groin" var/target_aiming_for_groin = target.zone_selected == "groin" - if(target.check_block()) //END EDIT - target.visible_message("[target] blocks [user]'s disarm attempt!") - return 0 - else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted!") return FALSE + else if(target.check_block()) + target.visible_message("[target] blocks [user]'s disarm attempt!") + return FALSE else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth)) playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1) @@ -1605,11 +1601,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.forcesay(GLOB.hit_appends) log_combat(user, target, "pushed over") return*/ - if(!target.combatmode) // CITADEL CHANGE + if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) // CITADEL CHANGE randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed if(!CHECK_MOBILITY(user, MOBILITY_STAND)) //CITADEL CHANGE randn += 100 //CITADEL CHANGE - No kosher disarming if you're resting - if(!user.combatmode) //CITADEL CHANGE + if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CITADEL CHANGE randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode if(user.pulling == target) randn += -20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess @@ -1686,14 +1682,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) //CIT CHANGES START HERE - combatmode and resting checks var/totitemdamage = I.force - if(iscarbon(user)) - var/mob/living/carbon/tempcarb = user - if(!tempcarb.combatmode) - totitemdamage *= 0.5 + if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + totitemdamage *= 0.5 if(!CHECK_MOBILITY(user, MOBILITY_STAND)) totitemdamage *= 0.5 if(istype(H)) - if(!H.combatmode) + if(!(H.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) totitemdamage *= 1.5 //CIT CHANGES END HERE var/weakness = H.check_weakness(I, user) @@ -1803,9 +1797,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(user == target && istype(user)) - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted for that.") return + if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + to_chat(user, "You need combat mode to be active to that!") + return if(user.IsKnockdown() || user.IsParalyzed() || user.IsStun()) to_chat(user, "You can't seem to force yourself up right now!") return @@ -1818,7 +1815,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) /datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted.") return FALSE if(target.check_block()) diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 410ad05d93..8257238e9c 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -24,7 +24,7 @@ id = "spaceskeleton" limbs_id = "skeleton" blacklisted = 1 - inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT, TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) /datum/species/skeleton/space/check_roundstart_eligible() return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 4aae10c444..ebb5a3dd31 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -507,10 +507,10 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc.. /mob/living/carbon/handle_status_effects() ..() - if(getStaminaLoss() && !combatmode)//CIT CHANGE - prevents stamina regen while combat mode is active - adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke + if(getStaminaLoss() && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CIT CHANGE - prevents stamina regen while combat mode is active + adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke - if(!recoveringstam && incomingstammult != 1) + if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && incomingstammult != 1) incomingstammult = max(0.01, incomingstammult) incomingstammult = min(1, incomingstammult*2) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 3d567b0eff..edbd1562b3 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -35,7 +35,7 @@ gorillize() return if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB)) - if(!recoveringstam) + if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) emote("collapse") DefaultCombatKnockdown(RAD_MOB_KNOCKDOWN_AMOUNT) to_chat(src, "You feel weak.") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3544f1b82f..265d520749 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -118,22 +118,22 @@ if(!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(L, MOBILITY_STAND)) var/origtargetloc = L.loc if(!pulledby) - if(attemptingcrawl) + if(combat_flags & COMBAT_FLAG_ATTEMPTING_CRAWL) return TRUE - if(getStaminaLoss() >= STAMINA_SOFTCRIT) + if(IS_STAMCRIT(src)) to_chat(src, "You're too exhausted to crawl under [L].") return TRUE - attemptingcrawl = TRUE + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].") if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND)) - attemptingcrawl = FALSE + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) return TRUE var/src_passmob = (pass_flags & PASSMOB) pass_flags |= PASSMOB Move(origtargetloc) if(!src_passmob) pass_flags &= ~PASSMOB - attemptingcrawl = FALSE + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) return TRUE //END OF CIT CHANGES @@ -368,9 +368,8 @@ to_chat(src, "You have given up life and succumbed to death.") death() - /mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE) - if(stat || IsUnconscious() || IsStun() || IsParalyzed() || recoveringstam || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab))) + if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab))) return TRUE /mob/living/canUseStorage() diff --git a/code/modules/mob/living/living_combat.dm b/code/modules/mob/living/living_combat.dm new file mode 100644 index 0000000000..4cd2def5a8 --- /dev/null +++ b/code/modules/mob/living/living_combat.dm @@ -0,0 +1,88 @@ +/mob/living/ComponentInitialize() + . = ..() + RegisterSignal(src, SIGNAL_TRAIT(TRAIT_COMBAT_MODE_LOCKED), .proc/update_combat_lock) + +/mob/living/proc/update_combat_lock() + var/locked = HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED) + var/desired = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) + var/actual = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) + if(actual) + if(locked) + disable_combat_mode(FALSE, TRUE, FALSE, FALSE) + else if(!desired) + disable_combat_mode(TRUE, TRUE, FALSE, FALSE) + else + if(desired && !locked) + enable_combat_mode(FALSE, TRUE, FALSE, FALSE) + update_combat_mode_icon() + +/mob/living/proc/disable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE) + if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + return + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE) + SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_DISABLED, was_forced) + if(visible) + visible_message("[src] goes limp.", "Your muscles are forcibly relaxed!") + else if(!silent) + to_chat(src, was_forced? "Your muscles are forcibly relaxed!" : "You relax your muscles.") + if(update_icon) + update_combat_mode_icon() + +/mob/living/proc/enable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE) + if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) + return + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE) + SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_ENABLED, was_forced) + if(visible) + visible_message("[src] drops into a combative stance!", "You drop into a combative stance!") + else if(!silent) + to_chat(src, was_forced? "Your muscles reflexively tighten!" : "You tighten your muscles.") + if(update_icon) + update_combat_mode_icon() + +/// Updates the combat mode HUD icon. +/mob/living/proc/update_combat_mode_icon() + var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory + T?.update_icon_state() + +/// Enables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible. +/mob/living/proc/enable_intentional_combat_mode(silent = TRUE, visible = FALSE) + if((combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + return + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED) + if(!HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + enable_combat_mode(silent, FALSE, visible, FALSE) + update_combat_mode_icon() + client?.show_popup_menus = FALSE + return TRUE + +/// Disables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible. +/mob/living/proc/disable_intentional_combat_mode(silent = TRUE, visible = FALSE) + if(!(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + return + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED) + if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) + disable_combat_mode(silent, FALSE, visible, FALSE) + update_combat_mode_icon() + client?.show_popup_menus = TRUE + return TRUE + +/// Toggles whether the user is intentionally in combat mode. THIS should be the proc you generally use! Has built in visual/to other player feedback, as well as an audible cue to ourselves. +/mob/living/proc/user_toggle_intentional_combat_mode(visible = TRUE) + var/old = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) + if(old) + disable_intentional_combat_mode() + playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above! + else if(CAN_TOGGLE_COMBAT_MODE(src)) + enable_intentional_combat_mode() + var/current = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) //because we could be locked + if(current != old) //only sound effect if you succeeded. Could have the feedback system be better but shrug, someone else can do it. + if(current) + playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! + if(visible) + if(world.time >= combatmessagecooldown) + combatmessagecooldown = world.time + 10 SECONDS + if(a_intent != INTENT_HELP) + visible_message("[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].") + else + visible_message("[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].") diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ed46568489..0b4be7d463 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -118,3 +118,22 @@ /// Next world.time when we can get the "you can't move while buckled to [thing]" message. var/buckle_message_cooldown = 0 + + //// CITADEL STATION COMBAT //// + /// See __DEFINES/combat.dm + var/combat_flags = COMBAT_FLAGS_STAMSYSTEM_EXEMPT + /// Next world.time when we will show a visible message on entering combat mode voluntarily again. + var/combatmessagecooldown = 0 + + var/incomingstammult = 1 + var/bufferedstam = 0 + var/stambuffer = 20 + var/stambufferregentime + + //Sprint buffer--- + var/sprint_buffer = 42 //Tiles + var/sprint_buffer_max = 42 + var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond + var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math. + var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer. + //---End diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm index 8829e3a7f2..938a2355b4 100644 --- a/code/modules/mob/living/living_mobility.dm +++ b/code/modules/mob/living/living_mobility.dm @@ -33,9 +33,9 @@ set name = "Rest" set category = "IC" if(client?.prefs?.autostand) - intentionalresting = !intentionalresting - to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].") - if(intentionalresting && !resting) + TOGGLE_BITFIELD(combat_flags, COMBAT_FLAG_INTENTIONALLY_RESTING) + to_chat(src, "You are now attempting to [(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].") + if((combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && !resting) set_resting(TRUE, FALSE) else resist_a_rest() @@ -71,8 +71,8 @@ var/restrained = restrained() var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground var/has_limbs = has_arms || ignore_legs || has_legs - var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !recoveringstam - var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !recoveringstam + var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) + var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) if(canmove) mobility_flags |= MOBILITY_MOVE @@ -84,7 +84,7 @@ else mobility_flags &= ~MOBILITY_RESIST - var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !recoveringstam + var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) var/canstand = canstand_involuntary && !resting var/should_be_lying = !canstand @@ -107,7 +107,7 @@ else mobility_flags |= MOBILITY_UI|MOBILITY_PULL - var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !recoveringstam + var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) if(canitem_general) mobility_flags |= (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE | MOBILITY_HOLD) else @@ -149,7 +149,7 @@ lying_prev = lying //Handle citadel autoresist - if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !intentionalresting && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference + if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto // Movespeed mods based on arms/legs quantity diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 410e5b28db..ec291094fe 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -31,8 +31,16 @@ /mob/living/update_config_movespeed() update_move_intent_slowdown() + sprint_buffer_max = CONFIG_GET(number/movedelay/sprint_buffer_max) + sprint_buffer_regen_ds = CONFIG_GET(number/movedelay/sprint_buffer_regen_per_ds) + sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost) return ..() +/mob/living/movement_delay(ignorewalk = 0) + . = ..() + if(!CHECK_MOBILITY(src, MOBILITY_STAND)) + . += 6 + /// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc. /mob/living/proc/can_move_under_living(mob/living/other) return !density diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm new file mode 100644 index 0000000000..66aa3ebc6f --- /dev/null +++ b/code/modules/mob/living/living_sprint.dm @@ -0,0 +1,79 @@ +/mob/living/ComponentInitialize() + . = ..() + RegisterSignal(src, SIGNAL_TRAIT(TRAIT_SPRINT_LOCKED), .proc/update_sprint_lock) + +/mob/living/proc/update_sprint_icon() + var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory + S?.update_icon_state() + +/mob/living/proc/update_hud_sprint_bar() + hud_used?.sprint_buffer?.update_to_mob(src) + +/mob/living/proc/update_sprint_lock() + var/locked = HAS_TRAIT(src, TRAIT_SPRINT_LOCKED) + var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) + var/desired = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) + if(locked) + if(current) + disable_sprint_mode(FALSE) + else + if(current) + if(!desired) + disable_sprint_mode(FALSE) + else + if(desired) + enable_sprint_mode(FALSE) + update_sprint_icon() + +/mob/living/proc/enable_sprint_mode(update_icon = TRUE) + if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) + return + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE) + if(update_icon) + update_sprint_icon() + +/mob/living/proc/disable_sprint_mode(update_icon = TRUE) + if(!(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + return + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE) + if(update_icon) + update_sprint_icon() + +/mob/living/proc/enable_intentional_sprint_mode() + if((combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + return + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED) + if(!HAS_TRAIT(src, TRAIT_SPRINT_LOCKED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + enable_sprint_mode(FALSE) + update_sprint_icon() + return TRUE + +/mob/living/proc/disable_intentional_sprint_mode() + if(!(combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + return + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED) + if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) + disable_sprint_mode(FALSE) + update_sprint_icon() + +/mob/living/proc/user_toggle_intentional_sprint_mode() + var/old = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) + if(old) + disable_intentional_sprint_mode() + if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE)) + playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) + else + enable_intentional_sprint_mode() + if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE)) + playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE) + +/mob/living/proc/sprint_hotkey(targetstatus) + if(targetstatus != FORCE_BOOLEAN(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + default_toggle_sprint() + +/mob/living/proc/doSprintLossTiles(amount) + return + +// Silicons have snowflake behavior. +/mob/living/proc/default_toggle_sprint() + return user_toggle_intentional_sprint_mode() diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index f2e6fdce03..e0bd8a16b3 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -24,4 +24,4 @@ if(ranged_ability) ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!") if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing. - apply_vore_prefs() + copy_from_prefs_vr() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4f20a95dab..d3e7d7c395 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -913,8 +913,8 @@ /obj/item/crowbar/cyborg, /obj/item/reagent_containers/borghypo/syndicate, /obj/item/twohanded/shockpaddles/syndicate, - /obj/item/healthanalyzer, - /obj/item/surgical_drapes, + /obj/item/healthanalyzer/advanced, + /obj/item/surgical_drapes/advanced, /obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 623174157b..e3a640bca0 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -12,3 +12,15 @@ /mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction) if(!magpulse) return ..() + +/mob/living/silicon/robot/Move(NewLoc, direct) + . = ..() + if(. && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && !(movement_type & FLYING) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND | MOBILITY_MOVE)) + if(!(cell?.use(25))) + default_toggle_sprint(TRUE) + +/mob/living/silicon/robot/movement_delay() + . = ..() + if(!resting && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + . += 1 + . += speed diff --git a/code/modules/mob/living/silicon/robot/robot_sprint.dm b/code/modules/mob/living/silicon/robot/robot_sprint.dm new file mode 100644 index 0000000000..dff0d9dd0d --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_sprint.dm @@ -0,0 +1,12 @@ +/mob/living/silicon/robot/default_toggle_sprint(shutdown = FALSE) + var/current = (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) + if(current || shutdown || !cell || (cell.charge < 25) || !cansprint) + disable_intentional_sprint_mode() + if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE)) + if(shutdown) + playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE) + playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) + else + enable_intentional_sprint_mode() + if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE)) + playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 531faff056..aae020beb0 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -15,6 +15,8 @@ speech_span = SPAN_ROBOT flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 no_vore = TRUE + /// Enable sprint system but not stamina + combat_flags = COMBAT_FLAGS_STAMEXEMPT_YESSPRINT var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 2ab0f1721c..469a395169 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -276,7 +276,7 @@ Auto Patrol[]"}, if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if(!Adjacent(target) || !isturf(target.loc) || !target.recoveringstam || target.getStaminaLoss() <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks + if(!Adjacent(target) || !isturf(target.loc) || !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || target.getStaminaLoss() <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks back_to_hunt() return @@ -303,7 +303,7 @@ Auto Patrol[]"}, back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks back_to_hunt() return else diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 3ff97f2cc0..5754f8c3b2 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -312,7 +312,7 @@ Auto Patrol: []"}, if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if( !Adjacent(target) || !isturf(target.loc) || target.getStaminaLoss() <= 120 || !target.recoveringstam) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop + if( !Adjacent(target) || !isturf(target.loc) || target.getStaminaLoss() <= 120 || !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop back_to_hunt() return @@ -339,7 +339,7 @@ Auto Patrol: []"}, back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !(target.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && target.getStaminaLoss() <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check back_to_hunt() return else //Try arresting again if the target escapes. diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index fd3221d900..39b66fbdc2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -39,7 +39,8 @@ animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) - wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/) + wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/, /obj/item/bodypart, /obj/item/organ/appendix, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/heart, /obj/item/organ/liver, \ + /obj/item/organ/lungs, /obj/item/organ/stomach, /obj/item/organ/tongue) // So we dont eat implants or brains. Still can eat robotic stuff thats subtyped of base line but thats a issue for a nother day. var/obj/item/udder/gutlunch/udder = null /mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize() diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 40b4212aac..5cdeaecd37 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -30,45 +30,48 @@ /mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/stun/S = IsStun() - if(S) - S.duration = max(world.time + amount, S.duration) - else if(amount > 0) - S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating) - return S + if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/stun/S = IsStun() + if(S) + S.duration = max(world.time + amount, S.duration) + else if(amount > 0) + S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating) + return S /mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - var/datum/status_effect/incapacitating/stun/S = IsStun() - if(amount <= 0) - if(S) - qdel(S) + if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + var/datum/status_effect/incapacitating/stun/S = IsStun() + if(amount <= 0) + if(S) + qdel(S) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(S) + S.duration = world.time + amount else - if(absorb_stun(amount, ignore_canstun)) - return - if(S) - S.duration = world.time + amount - else - S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating) - return S + S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating) + return S /mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/stun/S = IsStun() - if(S) - S.duration += amount - else if(amount > 0) - S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating) - return S + if(!ignore_canstun && (!(status_flags & CANSTUN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/stun/S = IsStun() + if(S) + S.duration += amount + else if(amount > 0) + S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating) + return S ///////////////////////////////// KNOCKDOWN ///////////////////////////////////// @@ -84,45 +87,48 @@ /mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() - if(K) - K.duration = max(world.time + amount, K.duration) - else if(amount > 0) - K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) - return K + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() + if(K) + K.duration = max(world.time + amount, K.duration) + else if(amount > 0) + K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) + return K /mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() - if(amount <= 0) - if(K) - qdel(K) + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() + if(amount <= 0) + if(K) + qdel(K) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(K) + K.duration = world.time + amount else - if(absorb_stun(amount, ignore_canstun)) - return - if(K) - K.duration = world.time + amount - else - K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) - return K + K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) + return K /mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() - if(K) - K.duration += amount - else if(amount > 0) - K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) - return K + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() + if(K) + K.duration += amount + else if(amount > 0) + K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) + return K ///////////////////////////////// IMMOBILIZED //////////////////////////////////// /mob/living/proc/IsImmobilized() //If we're immobilized @@ -137,45 +143,48 @@ /mob/living/proc/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() - if(I) - I.duration = max(world.time + amount, I.duration) - else if(amount > 0) - I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) - return I + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(I) + I.duration = max(world.time + amount, I.duration) + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return I /mob/living/proc/SetImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() - if(amount <= 0) - if(I) - qdel(I) + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(amount <= 0) + if(I) + qdel(I) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(I) + I.duration = world.time + amount else - if(absorb_stun(amount, ignore_canstun)) - return - if(I) - I.duration = world.time + amount - else - I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) - return I + I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return I /mob/living/proc/AdjustImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() - if(I) - I.duration += amount - else if(amount > 0) - I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) - return I + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(I) + I.duration += amount + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return I ///////////////////////////////// PARALYZED ////////////////////////////////// /mob/living/proc/IsParalyzed() //If we're immobilized @@ -190,45 +199,48 @@ /mob/living/proc/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) - if(P) - P.duration = max(world.time + amount, P.duration) - else if(amount > 0) - P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) - return P + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) + if(P) + P.duration = max(world.time + amount, P.duration) + else if(amount > 0) + P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) + return P /mob/living/proc/SetParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) - if(amount <= 0) - if(P) - qdel(P) + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) + if(amount <= 0) + if(P) + qdel(P) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(P) + P.duration = world.time + amount else - if(absorb_stun(amount, ignore_canstun)) - return - if(P) - P.duration = world.time + amount - else - P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) - return P + P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) + return P /mob/living/proc/AdjustParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) - if(P) - P.duration += amount - else if(amount > 0) - P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) - return P + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) + if(P) + P.duration += amount + else if(amount > 0) + P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) + return P ///////////////////////////////// DAZED //////////////////////////////////// /mob/living/proc/IsDazed() //If we're Dazed @@ -243,45 +255,104 @@ /mob/living/proc/Daze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - if(absorb_stun(amount, ignore_canstun)) - return - var/datum/status_effect/incapacitating/dazed/I = IsDazed() - if(I) - I.duration = max(world.time + amount, I.duration) - else if(amount > 0) - I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating) - return I + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/dazed/I = IsDazed() + if(I) + I.duration = max(world.time + amount, I.duration) + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating) + return I /mob/living/proc/SetDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) - var/datum/status_effect/incapacitating/dazed/I = IsDazed() - if(amount <= 0) - if(I) - qdel(I) + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + var/datum/status_effect/incapacitating/dazed/I = IsDazed() + if(amount <= 0) + if(I) + qdel(I) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(I) + I.duration = world.time + amount else - if(absorb_stun(amount, ignore_canstun)) - return - if(I) - I.duration = world.time + amount - else - I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating) - return I + I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating) + return I /mob/living/proc/AdjustDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) return - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun) + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/dazed/I = IsDazed() + if(I) + I.duration += amount + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating) + return I + +///////////////////////////////// STAGGERED //////////////////////////////////// +/mob/living/proc/IsStaggered() //If we're Staggered + return has_status_effect(STATUS_EFFECT_STAGGERED) + +/mob/living/proc/AmountStaggered() //How many deciseconds remain in our Staggered status effect + var/datum/status_effect/staggered/I = IsStaggered() + if(I) + return I.duration - world.time + return 0 + +/mob/living/proc/Stagger(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/staggered/I = IsStaggered() + if(I) + I.duration = max(world.time + amount, I.duration) + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating) + return I + +/mob/living/proc/SetStaggered(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + var/datum/status_effect/staggered/I = IsStaggered() + if(amount <= 0) + if(I) + qdel(I) + else if(absorb_stun(amount, ignore_canstun)) return - var/datum/status_effect/incapacitating/dazed/I = IsDazed() if(I) - I.duration += amount - else if(amount > 0) - I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating) - return I + I.duration = world.time + amount + else + I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating) + return I + +/mob/living/proc/AdjustStaggered(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STAGGER, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(!ignore_canstun && (!(status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE))) + return + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/staggered/I = IsStaggered() + if(I) + I.duration += amount + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_STAGGERED, amount, updating) + return I //Blanket /mob/living/proc/AllImmobility(amount, updating, ignore_canstun = FALSE) @@ -290,6 +361,7 @@ Stun(amount, FALSE, ignore_canstun) Immobilize(amount, FALSE, ignore_canstun) Daze(amount, FALSE, ignore_canstun) + Stagger(amount, FALSE, ignore_canstun) if(updating) update_mobility() @@ -299,6 +371,7 @@ SetStun(amount, FALSE, ignore_canstun) SetImmobilized(amount, FALSE, ignore_canstun) SetDazed(amount, FALSE, ignore_canstun) + SetStaggered(amount, FALSE, ignore_canstun) if(updating) update_mobility() @@ -308,6 +381,7 @@ AdjustStun(amount, FALSE, ignore_canstun) AdjustImmobilized(amount, FALSE, ignore_canstun) AdjustDazed(amount, FALSE, ignore_canstun) + AdjustStaggered(amount, FALSE, ignore_canstun) if(updating) update_mobility() @@ -323,11 +397,13 @@ SetImmobilized(amount, FALSE, ignore_canstun) if(AmountDazed() > amount) SetImmobilized(amount, FALSE, ignore_canstun) + if(AmountStaggered() > amount) + SetStaggered(amount, FALSE, ignore_canstun) if(updating) update_mobility() /mob/living/proc/HighestImmobilityAmount() - return max(max(max(max(AmountStun(), AmountKnockdown()), AmountParalyzed()), AmountImmobilized()), AmountDazed()) + return max(AmountStun(), AmountKnockdown(), AmountParalyzed(), AmountImmobilized(), AmountDazed(), AmountStaggered()) //////////////////UNCONSCIOUS /mob/living/proc/IsUnconscious() //If we're unconscious diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index 323deed5c4..983ef0585a 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -2,7 +2,7 @@ name = "Space Ninja" uniform = /obj/item/clothing/under/color/black/trackless suit = /obj/item/clothing/suit/space/space_ninja - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/syndicate mask = /obj/item/clothing/mask/gas/space_ninja head = /obj/item/clothing/head/helmet/space/space_ninja ears = /obj/item/radio/headset diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 227e22d499..2b09954f08 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -204,7 +204,7 @@ w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embedding = embedding.setRating(embed_chance = 100) //rule of cool + embedding = list("embed_chance" = 100, "embedded_fall_chance" = 0)//rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm index 0543e48f96..08f6ba8c70 100644 --- a/code/modules/projectiles/ammunition/caseless/arrow.dm +++ b/code/modules/projectiles/ammunition/caseless/arrow.dm @@ -1,17 +1,21 @@ /obj/item/ammo_casing/caseless/arrow - name = "wooden arrow" - desc = "An arrow made of wood, typically fired from a bow." + name = "arrow of questionable material" + desc = "You shouldn't be seeing this arrow." projectile_type = /obj/item/projectile/bullet/reusable/arrow caliber = "arrow" icon_state = "arrow" throwforce = 3 //good luck hitting someone with the pointy end of the arrow throw_speed = 3 -/obj/item/ammo_casing/caseless/arrow/ashen +/obj/item/ammo_casing/caseless/arrow/wood + name = "wooden arrow" + desc = "An arrow made of wood, typically fired from a bow." + +/obj/item/ammo_casing/caseless/arrow/ash name = "ashen arrow" desc = "An arrow made of wood, hardened by fire." icon_state = "ashenarrow" - projectile_type = /obj/item/projectile/bullet/reusable/arrow/ashen + projectile_type = /obj/item/projectile/bullet/reusable/arrow/ash /obj/item/ammo_casing/caseless/arrow/bone name = "bone arrow" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 1f9f211154..d06ad972e6 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -168,7 +168,7 @@ return if(firing) return - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //respect stamina softcrit + if(IS_STAMCRIT(user)) //respect stamina softcrit to_chat(user, "You are too exhausted to fire [src]!") return if(flag) //It's adjacent, is the user, or is on the user's person @@ -562,11 +562,11 @@ update_icon() /obj/item/gun/proc/getinaccuracy(mob/living/user) - if(!iscarbon(user)) + if(!isliving(user)) return FALSE else - var/mob/living/carbon/holdingdude = user - if(istype(holdingdude) && holdingdude.combatmode) - return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier) + var/mob/living/holdingdude = user + if(istype(holdingdude) && (holdingdude.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + return 0 else return ((weapon_weight * 25) * inaccuracy_modifier) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 7f01db466f..56aebc891d 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -37,7 +37,7 @@ /obj/item/gun/ballistic/shotgun/attack_self(mob/living/user) if(recentpump > world.time) return - if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit + if(IS_STAMCRIT(user))//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return//CIT CHANGE - ditto pump(user, TRUE) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 2f0aa00027..7fa81f513f 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -28,6 +28,16 @@ /datum/duel/New() id = next_id++ +/datum/duel/Destroy() + if(gun_A) + gun_A.duel = null + gun_A = null + if(gun_B) + gun_B.duel = null + gun_B = null + STOP_PROCESSING(SSobj, src) + . = ..() + /datum/duel/proc/try_begin() //Check if both guns are held and if so begin. var/mob/living/A = get_duelist(gun_A) @@ -45,13 +55,13 @@ message_duelists("Set your gun setting and move [required_distance] steps away from your opponent.") - START_PROCESSING(SSobj,src) + START_PROCESSING(SSobj, src) -/datum/duel/proc/get_duelist(obj/gun) - var/mob/living/G = gun.loc - if(!istype(G) || !G.is_holding(gun)) - return null - return G +/datum/duel/proc/get_duelist(obj/item/gun/energy/dueling/G) + var/mob/living/L = G.loc + if(!istype(L) || !L.is_holding(G)) + return + return L /datum/duel/proc/message_duelists(message) var/mob/living/LA = get_duelist(gun_A) @@ -66,7 +76,7 @@ /datum/duel/proc/end() message_duelists("Duel finished. Re-engaging safety.") - STOP_PROCESSING(SSobj,src) + STOP_PROCESSING(SSobj, src) state = DUEL_IDLE /datum/duel/process() @@ -129,10 +139,11 @@ return FALSE if(!isturf(A.loc) || !isturf(B.loc)) return FALSE - if(get_dist(A,B) != required_distance) + if(get_dist(A, B) != required_distance) return FALSE - for(var/turf/T in getline(get_turf(A),get_turf(B))) - if(is_blocked_turf(T,TRUE)) + for(var/i in getline(A.loc, B.loc)) + var/turf/T = i + if(is_blocked_turf(T, TRUE)) return FALSE return TRUE @@ -180,7 +191,6 @@ return "duel_red" /obj/item/gun/energy/dueling/attack_self(mob/living/user) - . = ..() if(duel.state == DUEL_IDLE) duel.try_begin() else @@ -205,12 +215,9 @@ add_overlay(setting_overlay) /obj/item/gun/energy/dueling/Destroy() - . = ..() - if(duel.gun_A == src) - duel.gun_A = null - if(duel.gun_B == src) - duel.gun_B = null - duel = null + if(duel) + qdel(duel) + return ..() /obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user) . = ..() @@ -234,10 +241,8 @@ if(duel.state == DUEL_READY) duel.confirmations[src] = TRUE to_chat(user,"You confirm your readiness.") - return else if(!is_duelist(target)) //I kinda want to leave this out just to see someone shoot a bystander or missing. to_chat(user,"[src] safety system prevents shooting anyone but your designated opponent.") - return else duel.fired[src] = TRUE . = ..() diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index c295adde60..f230dc7fea 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -181,13 +181,6 @@ listeningTo = null return ..() -/obj/item/gun/energy/beam_rifle/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chambered = null - recharge_newshot() - /obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) var/diff = abs(aiming_lastangle - lastangle) if(!check_user()) @@ -302,7 +295,7 @@ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) return process_aim() - if(aiming_time_left <= aiming_time_fire_threshold && check_user() && ((lastfire + delay) <= world.time)) + if(fire_check()) sync_ammo() do_fire(M.client.mouseObject, M, FALSE, M.client.mouseParams, M.zone_selected) stop_aiming() @@ -310,11 +303,16 @@ return ..() /obj/item/gun/energy/beam_rifle/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0) + if(!fire_check()) + return . = ..() if(.) lastfire = world.time stop_aiming() +/obj/item/gun/energy/beam_rifle/proc/fire_check() + return (aiming_time_left <= aiming_time_fire_threshold) && check_user() && ((lastfire + delay) <= world.time) + /obj/item/gun/energy/beam_rifle/proc/sync_ammo() for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents) AC.sync_stats() @@ -531,21 +529,15 @@ tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle var/constant_tracer = FALSE -/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander) - set waitfor = FALSE - if(isnull(highlander)) - highlander = constant_tracer - if(highlander && istype(gun)) - QDEL_LIST(gun.current_tracers) - for(var/datum/point/p in beam_segments) - gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity) +/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, generation, highlander = constant_tracer) + if(!highlander) + return ..() else - for(var/datum/point/p in beam_segments) - generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity) - if(cleanup) - QDEL_LIST(beam_segments) - beam_segments = null - QDEL_NULL(beam_index) + duration = 0 + . = ..() + if(!generation) //first one + QDEL_LIST(gun.current_tracers) + gun.current_tracers += . /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam tracer_type = /obj/effect/projectile/tracer/tracer/aiming @@ -560,4 +552,5 @@ hitscan_light_color_override = "#99ff99" /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target) + qdel(src) return FALSE diff --git a/code/modules/projectiles/guns/misc/chameleon.dm b/code/modules/projectiles/guns/misc/chameleon.dm new file mode 100644 index 0000000000..d2afe2bd78 --- /dev/null +++ b/code/modules/projectiles/guns/misc/chameleon.dm @@ -0,0 +1,169 @@ +// this is all shitcode never ever add it to the game it's for debugging only. + +/datum/action/item_action/chameleon/change/gun/update_look(mob/user, obj/item/picked_item) + . = ..() + var/obj/item/gun/energy/laser/chameleon/CG = target + CG.get_chameleon_projectile(picked_item) + +/obj/item/gun/energy/laser/chameleon + name = "practice laser gun" + desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." + ammo_type = list(/obj/item/ammo_casing/energy/chameleon) + clumsy_check = 0 + item_flags = NONE + pin = /obj/item/firing_pin + cell_type = /obj/item/stock_parts/cell/bluespace + + var/datum/action/item_action/chameleon/change/gun/chameleon_action + var/list/chameleon_projectile_vars + var/list/chameleon_ammo_vars + var/list/chameleon_gun_vars + var/list/projectile_copy_vars + var/list/ammo_copy_vars + var/list/gun_copy_vars + var/badmin_mode = FALSE + var/can_hitscan = FALSE + var/hitscan_mode = FALSE + +/obj/item/gun/energy/laser/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/gun + chameleon_action.chameleon_name = "Gun" + chameleon_action.chameleon_blacklist = typecacheof(/obj/item/gun/magic, ignore_root_path = FALSE) + chameleon_action.initialize_disguises() + + projectile_copy_vars = list("name", "icon", "icon_state", "item_state", "speed", "color", "hitsound", "forcedodge", "impact_effect_type", "range", "suppressed", "hitsound_wall", "impact_effect_type", "pass_flags", "tracer_type", "muzzle_type", "impact_type") + chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser") + gun_copy_vars = list("fire_sound", "burst_size", "fire_delay") + chameleon_gun_vars = list() + ammo_copy_vars = list("firing_effect_type") + chameleon_ammo_vars = list() + recharge_newshot() + get_chameleon_projectile(/obj/item/gun/energy/laser) + +/obj/item/gun/energy/laser/chameleon/emp_act(severity) + return + +/obj/item/gun/energy/laser/chameleon/proc/reset_chameleon_vars() + chameleon_ammo_vars = list() + chameleon_gun_vars = list() + chameleon_projectile_vars = list() + var/static/list/blacklisted_vars = list("locs", "loc", "contents", "x", "y", "z", "parent_type", "type", "vars") + if(chambered) + for(var/v in ammo_copy_vars) + if(v in blacklisted_vars) //Just in case admins go crazy. + continue + chambered.vv_edit_var(v, initial(chambered.vars[v])) + for(var/v in gun_copy_vars) + if(v in blacklisted_vars) + continue + vv_edit_var(v, initial(vars[v])) + vars[v] = initial(vars[v]) + QDEL_NULL(chambered.BB) + chambered.newshot() + +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE) + if(!istype(AC)) + CRASH("[AC] is not /obj/item/ammo_casing!") + return FALSE + for(var/V in ammo_copy_vars) + if(AC.vars.Find(V)) + chameleon_ammo_vars[V] = AC.vars[V] + chambered?.vv_edit_var(V, AC.vars[V]) + if(passthrough) + var/obj/item/projectile/P = AC.BB + set_chameleon_projectile(P) + +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_projectile(obj/item/projectile/P) + if(!istype(P)) + CRASH("[P] is not /obj/item/projectile!") + return FALSE + chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser", "nodamage" = TRUE) + for(var/V in projectile_copy_vars) + if(P.vars.Find(V)) + chameleon_projectile_vars[V] = P.vars[V] + if(istype(chambered, /obj/item/ammo_casing/energy/chameleon)) + var/obj/item/ammo_casing/energy/chameleon/AC = chambered + AC.projectile_vars = chameleon_projectile_vars.Copy() + if(!P.tracer_type) + can_hitscan = FALSE + set_hitscan(FALSE) + else + can_hitscan = TRUE + if(badmin_mode) + qdel(chambered.BB) + chambered.projectile_type = P.type + chambered.newshot() + +/obj/item/gun/energy/laser/chameleon/proc/set_chameleon_gun(obj/item/gun/G , passthrough = TRUE) + if(!istype(G)) + CRASH("[G] is not /obj/item/gun!") + return FALSE + for(var/V in gun_copy_vars) + if(vars.Find(V) && G.vars.Find(V)) + chameleon_gun_vars[V] = G.vars[V] + vv_edit_var(V, G.vars[V]) + if(passthrough) + if(istype(G, /obj/item/gun/ballistic)) + var/obj/item/gun/ballistic/BG = G + var/obj/item/ammo_box/AB = new BG.mag_type(G) + qdel(BG) + if(!istype(AB)||!AB.ammo_type) + qdel(AB) + return FALSE + var/obj/item/ammo_casing/AC = new AB.ammo_type(G) + set_chameleon_ammo(AC) + else if(istype(G, /obj/item/gun/magic)) + var/obj/item/gun/magic/MG = G + var/obj/item/ammo_casing/AC = new MG.ammo_type(G) + set_chameleon_ammo(AC) + else if(istype(G, /obj/item/gun/energy)) + var/obj/item/gun/energy/EG = G + if(islist(EG.ammo_type) && EG.ammo_type.len) + var/obj/item/ammo_casing/AC = EG.ammo_type[1] + set_chameleon_ammo(AC) + else if(istype(G, /obj/item/gun/syringe)) + var/obj/item/ammo_casing/AC = new /obj/item/ammo_casing/syringegun(src) + set_chameleon_ammo(AC) + +/obj/item/gun/energy/laser/chameleon/attack_self(mob/user) + . = ..() + if(!can_hitscan) + to_chat(user, "[src]'s current disguised gun does not allow it to enable high velocity mode!") + return + if(!chambered) + to_chat(user, "Unknown error in energy lens: Please reset chameleon disguise and try again.") + return + set_hitscan(!hitscan_mode) + to_chat(user, "You toggle [src]'s high velocity beam mode to [hitscan_mode? "on" : "off"].") + +/obj/item/gun/energy/laser/chameleon/proc/set_hitscan(hitscan) + var/obj/item/ammo_casing/energy/chameleon/AC = chambered + AC.hitscan_mode = hitscan + hitscan_mode = hitscan + +/obj/item/gun/energy/laser/chameleon/proc/get_chameleon_projectile(guntype) + reset_chameleon_vars() + var/obj/item/gun/G = new guntype(src) + set_chameleon_gun(G) + qdel(G) + +/obj/item/ammo_casing/energy/chameleon + projectile_type = /obj/item/projectile/energy/chameleon + e_cost = 0 + var/hitscan_mode = FALSE + var/list/projectile_vars = list() + +/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + . = ..() + if(!BB) + newshot() + for(var/V in projectile_vars) + if(BB.vars.Find(V)) + BB.vv_edit_var(V, projectile_vars[V]) + if(hitscan_mode) + BB.hitscan = TRUE + +/obj/item/projectile/energy/chameleon + nodamage = TRUE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 139f5a051c..9b60f96d16 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -52,6 +52,8 @@ var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation. var/datum/point/beam_index + /// Used in generate_hitscan_tracers to determine which "cycle" we're on. + var/hitscan_effect_generation = 0 var/tracer_type var/muzzle_type var/impact_type @@ -89,10 +91,10 @@ var/decayedRange //stores original range var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/is_reflectable = FALSE // Can it be reflected or not? - + /// factor to multiply by for zone accuracy percent. var/zone_accuracy_factor = 1 - + //Effects var/stun = 0 var/knockdown = 0 @@ -656,18 +658,20 @@ if(trajectory && beam_index) var/datum/point/pcache = trajectory.copy_to() beam_segments[beam_index] = pcache - generate_hitscan_tracers(null, null, impacting) + generate_hitscan_tracers(null, null, impacting, hitscan_effect_generation++) -/obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE) +/obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE, generation) if(!length(beam_segments)) return + . = list() if(tracer_type) - var/tempref = REF(src) + var/list/turfs = list() for(var/datum/point/p in beam_segments) - generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref) + . += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, turfs) if(muzzle_type && duration > 0) var/datum/point/p = beam_segments[1] var/atom/movable/thing = new muzzle_type + . += thing p.move_atom_to_src(thing) var/matrix/M = new M.Turn(original_angle) @@ -678,6 +682,7 @@ if(impacting && impact_type && duration > 0) var/datum/point/p = beam_segments[beam_segments[beam_segments.len]] var/atom/movable/thing = new impact_type + . += thing p.move_atom_to_src(thing) var/matrix/M = new M.Turn(Angle) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 6ae6564671..e3449a0c1d 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -9,7 +9,8 @@ stutter = 10 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' - range = 7 + range = 14 + speed = 0.6 tracer_type = /obj/effect/projectile/tracer/stun muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun @@ -42,9 +43,9 @@ knockdown_stamoverride = 0 knockdown_stam_max = 0 strong_tase = FALSE - range = 12 /obj/item/projectile/energy/electrode/security/hos knockdown = 100 knockdown_stamoverride = 30 knockdown_stam_max = null + tase_duration = 10 diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm index d00de79eb1..7c1a06f72c 100644 --- a/code/modules/projectiles/projectile/reusable/arrow.dm +++ b/code/modules/projectiles/projectile/reusable/arrow.dm @@ -3,13 +3,13 @@ desc = "Woosh!" damage = 15 icon_state = "arrow" - ammo_type = /obj/item/ammo_casing/caseless/arrow + ammo_type = /obj/item/ammo_casing/caseless/arrow/wood -/obj/item/projectile/bullet/reusable/arrow/ashen +/obj/item/projectile/bullet/reusable/arrow/ash name = "ashen arrow" desc = "Fire harderned arrow." damage = 25 - ammo_type = /obj/item/ammo_casing/caseless/arrow/ashen + ammo_type = /obj/item/ammo_casing/caseless/arrow/ash /obj/item/projectile/bullet/reusable/arrow/bone //AP for ashwalkers name = "bone arrow" diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 2d177318aa..2974df29a6 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -356,7 +356,6 @@ replace_beaker(user, B) to_chat(user, "You add [B] to [src].") updateUsrDialog() - update_icon() else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag)) to_chat(user, "You can't load [I] into [src]!") return ..() diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 2c8be10ace..15842299e3 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -114,9 +114,12 @@ /datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, multiplier) var/location = get_turf(holder.my_atom) - // 100 multiplier = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. - // 200 multiplier = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(multiplier / 12), round(multiplier / 7), 1) + // 50 multiplier = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. + // 100 multiplier = 5 heavy range & 10 light range. + // 200 multiplier = 7 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. + // 300 multiplier = 8 heavy range & 17 light range. Still rather significant, considering that you can get dozens of bluespace beakers 30 minutes in with a competent crew. + // 900 multiplier = 12 heavy range & 30 light range. Still less than 300 before this commit. + empulse(location, round(multiplier ** (3/8)), round(multiplier ** (1/2)), 1) holder.clear_reagents() diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 0104bfba7b..be1b9460b0 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -55,6 +55,10 @@ Nothing else in the console has ID requirements. if (istype(ID, /datum/material)) var/datum/material/material = ID return material.name + + else if(GLOB.chemical_reagents_list[ID]) + var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID] + return reagent.name return ID /obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any). diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 9efbe58a29..b9897db303 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -27,6 +27,7 @@ REMOVE_TRAIT(owner, TRAIT_PACIFISM, "slimestatus") owner.visible_message("[owner] stops glowing, the rainbow light fading away.", "You no longer feel protected...") + return ..() /obj/screen/alert/status_effect/slimeskin name = "Adamantine Slimeskin" @@ -56,6 +57,7 @@ H.physiology.damage_resistance -= 10 owner.visible_message("[owner]'s gel coating liquefies and dissolves away.", "Your gel second-skin dissolves!") + return ..() /datum/status_effect/slimerecall id = "slime_recall" @@ -87,6 +89,7 @@ "The unknown force snatches briefly you from reality, and deposits you next to [target]!") do_sparks(3, TRUE, owner) owner.forceMove(target.loc) + return ..() /obj/screen/alert/status_effect/freon/stasis desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out." @@ -117,6 +120,7 @@ qdel(cube) owner.status_flags &= ~GODMODE UnregisterSignal(owner, COMSIG_LIVING_RESIST) + return ..() /datum/status_effect/slime_clone id = "slime_cloned" @@ -156,6 +160,7 @@ if(clone) clone.unequip_everything() qdel(clone) + return ..() /obj/screen/alert/status_effect/clone_decay name = "Clone Decay" @@ -195,6 +200,7 @@ /datum/status_effect/bloodchill/on_remove() owner.remove_movespeed_modifier("bloodchilled") + return ..() /obj/screen/alert/status_effect/bloodchill name = "Bloodchilled" @@ -218,6 +224,7 @@ /datum/status_effect/bonechill/on_remove() owner.remove_movespeed_modifier("bonechilled") + return ..() /obj/screen/alert/status_effect/bonechill name = "Bonechilled" @@ -249,6 +256,7 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/firecookie/on_remove() REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") + return ..() /datum/status_effect/watercookie id = "watercookie" @@ -266,6 +274,7 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/watercookie/on_remove() REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie") + return ..() /datum/status_effect/metalcookie id = "metalcookie" @@ -283,6 +292,7 @@ datum/status_effect/rebreathing/tick() if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.physiology.brute_mod /= 0.9 + return ..() /datum/status_effect/sparkcookie id = "sparkcookie" @@ -302,6 +312,7 @@ datum/status_effect/rebreathing/tick() if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.physiology.siemens_coeff = original_coeff + return ..() /datum/status_effect/toxincookie id = "toxincookie" @@ -315,6 +326,7 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/toxincookie/on_remove() REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") + return ..() /datum/status_effect/timecookie id = "timecookie" @@ -332,6 +344,7 @@ datum/status_effect/rebreathing/tick() if(ishuman(owner)) var/mob/living/carbon/human/H H.physiology.do_after_speed /= 0.95 + return ..() /datum/status_effect/lovecookie id = "lovecookie" @@ -377,6 +390,7 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/tarfoot/on_remove() owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT) + return ..() /datum/status_effect/spookcookie id = "spookcookie" @@ -392,6 +406,7 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/spookcookie/on_remove() owner.remove_alt_appearance("spookyscary") + return ..() /datum/status_effect/peacecookie id = "peacecookie" @@ -415,6 +430,7 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/plur/on_remove() REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") + return ..() /datum/status_effect/adamantinecookie id = "adamantinecookie" @@ -432,6 +448,7 @@ datum/status_effect/rebreathing/tick() if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.physiology.burn_mod /= 0.9 + return ..() /////////////////////////////////////////////////////// //////////////////STABILIZED EXTRACTS////////////////// @@ -513,6 +530,7 @@ datum/status_effect/rebreathing/tick() datum/status_effect/stabilized/blue/on_remove() REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") + return ..() /datum/status_effect/stabilized/metal id = "stabilizedmetal" @@ -536,7 +554,6 @@ datum/status_effect/stabilized/blue/on_remove() to_chat(owner, "[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!") return ..() - /datum/status_effect/stabilized/yellow id = "stabilizedyellow" colour = "yellow" @@ -591,6 +608,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/darkpurple/on_remove() REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") qdel(fire) + return ..() /datum/status_effect/stabilized/darkblue id = "stabilizeddarkblue" @@ -638,6 +656,7 @@ datum/status_effect/stabilized/blue/on_remove() if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.physiology.hunger_mod /= 0.8 + return ..() //Bluespace has an icon because it's kinda active. /obj/screen/alert/status_effect/bluespaceslime @@ -697,6 +716,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/sepia/on_remove() owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA) + return ..() /datum/status_effect/stabilized/cerulean id = "stabilizedcerulean" @@ -733,6 +753,7 @@ datum/status_effect/stabilized/blue/on_remove() clone.visible_message("[clone] dissolves into a puddle of goo!") clone.unequip_everything() qdel(clone) + return ..() /datum/status_effect/stabilized/pyrite id = "stabilizedpyrite" @@ -749,6 +770,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/pyrite/on_remove() owner.color = originalcolor + return ..() /datum/status_effect/stabilized/red id = "stabilizedred" @@ -760,6 +782,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/red/on_remove() owner.unignore_slowdown("slimestatus") + return ..() /datum/status_effect/stabilized/green id = "stabilizedgreen" @@ -791,6 +814,7 @@ datum/status_effect/stabilized/blue/on_remove() originalDNA.transfer_identity(H) H.real_name = originalname H.updateappearance(mutcolor_update=1) + return ..() /datum/status_effect/brokenpeace id = "brokenpeace" @@ -854,6 +878,7 @@ datum/status_effect/stabilized/blue/on_remove() for(var/i in owner.faction) if(i == faction_name) owner.faction -= faction_name + return ..() /datum/status_effect/stabilized/oil id = "stabilizedoil" @@ -947,6 +972,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/gold/on_remove() if(familiar) qdel(familiar) + return ..() /datum/status_effect/stabilized/adamantine/on_apply() if(ishuman(owner)) @@ -958,6 +984,7 @@ datum/status_effect/stabilized/blue/on_remove() if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.physiology.damage_resistance -= 5 + return ..() /datum/status_effect/stabilized/rainbow id = "stabilizedrainbow" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index af825eb5ee..967f874a02 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -705,8 +705,9 @@ desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems." /obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM) - var/obj/item/implant/radio/syndicate/imp = new - imp.implant(SM, user) + if(SM.can_be_implanted()) + var/obj/item/implant/radio/syndicate/imp = new + imp.implant(SM, user) SM.access_card = new /obj/item/card/id/syndicate(SM) ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) @@ -961,11 +962,12 @@ icon_state = "potgrey" /obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user) - if(!ismob(M)) - return if(!isanimal(M)) to_chat(user, "[M] is too complex for the potion!") return + if(!M.can_be_implanted()) + to_chat(user, "[M] is incompatible with the potion!") + return if(M.stat) to_chat(user, "[M] is dead!") return diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index ea131fb996..2beaa97b3d 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -163,7 +163,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) for(var/mob/living/carbon/human/H in GLOB.player_list) var/turf/T = get_turf(H) - if(T && is_away_level(T.z)) + if((T && is_away_level(T.z)) || HAS_TRAIT(H, TRAIT_NO_MIDROUND_ANTAG)) continue if(summon_type == SUMMON_MAGIC) give_magic(H) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 8dae96eaf9..287d9492fb 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -289,7 +289,7 @@ /obj/item/surgical_drapes/advanced name = "smart surgical drapes" - desc = "A quite quirky set of drapes with wireless synchronization to the station's research networks, with an integrated display allowing users to execute advanced surgeries without the aid of an operating computer." + desc = "A smart set of drapes with wireless synchronization to the station's research networks, with an integrated display allowing users to execute advanced surgeries without the aid of an operating computer." var/datum/techweb/linked_techweb /obj/item/surgical_drapes/advanced/Initialize(mapload) diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm index 8dc5afbadd..681efea5b3 100644 --- a/code/modules/uplink/uplink_items/uplink_badass.dm +++ b/code/modules/uplink/uplink_items/uplink_badass.dm @@ -75,3 +75,20 @@ item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 illegal_tech = FALSE + +/datum/uplink_item/badass/tactical_naptime + name = "Sleepy Time Pajama Bundle" + desc = "Even soldiers need to get a good nights rest. Comes with some cozy as heck sleeping wear, a blankie to keep yourself warm in deep space, a hot mug of cocoa for you and your fuzzy friend." + item = /obj/item/storage/box/syndie_kit/sleepytime + cost = 4 + limited_stock = 1 + cant_discount = TRUE + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + +/datum/uplink_item/badass/shades + name = "Big Sunglasses" + desc = "Prevents flashes and looks badbass with some Smokes." + item = /obj/item/clothing/glasses/sunglasses/big + cost = 1 + surplus = 5 + illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index fcbe0fb9a6..2a3fd9b8bd 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -9,18 +9,28 @@ /datum/uplink_item/suits/turtlenck name = "Tactical Turtleneck" - desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake." + desc = "A slightly armored conspicious jumpsuit that has no suit sensors attached to them, if someone sees you in this hope they think its a fake." item = /obj/item/clothing/under/syndicate cost = 1 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these /datum/uplink_item/suits/turtlenck_skirt name = "Tactical Skirtleneck" - desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake." + desc = "A slightly armored conspicious jumpsuit that has no suit sensors attached to them, if someone sees you in this hope they think its a fake." item = /obj/item/clothing/under/syndicate/skirt cost = 1 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these +/datum/uplink_item/suits/infiltrator_bundle + name = "Insidious Infiltration Gear Case" + desc = "Developed by Roseus Galactic in conjunction with the Gorlex Marauders to produce a functional suit for urban operations, \ + this suit proves to be cheaper than your standard issue hardsuit, with none of the movement restrictions (or the space proofing) of the outdated spacesuits employed by the company. \ + Comes with an armored vest, helmet, blood-red sneaksuit, sneakboots, specialized combat gloves and a high-tech balaclava which obfuscates both your voice and your face. The case is also rather useful as a storage container and bludgeoning implement." + item = /obj/item/storage/toolbox/infiltrator + cost = 3 + limited_stock = 1 //you only get one so you don't end up with too many gun cases + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + /datum/uplink_item/suits/padding name = "Soft Padding" desc = "An inconspicious soft padding meant to be worn underneath jumpsuits, will cushion the user from melee harm." diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm index 56ebda1af7..819ba51623 100644 --- a/code/modules/uplink/uplink_items/uplink_dangerous.dm +++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm @@ -147,9 +147,9 @@ /datum/uplink_item/dangerous/rapier name = "Rapier" - desc = "A fancy rapier with a diamond tip piercing anything that it comes into contack with. \ - The rapier comes with its own sheath, this is rather noticeable as only the captain is known to carry a sheath. \ - The sheath itself can be used to block melee attacks only. Its also jet black colours." + desc = "An elegant plastitanium rapier with a diamond tip and coated in a specialized knockout poison. \ + The rapier comes with its own sheath, and is capable of puncturing through almost any defense. \ + However, due to the size of the blade and obvious nature of the sheath, the weapon stands out as being obviously nefarious." item = /obj/item/storage/belt/sabre/rapier cost = 8 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index 05731722f7..06fd9aab43 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -139,7 +139,7 @@ name = "Headset Upgrader" desc = "A device that can be used to make one headset immune to flashbangs." item = /obj/item/headsetupgrader - cost = 3 + cost = 1 /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 114a6373f4..868610a149 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -27,9 +27,9 @@ /obj/vehicle/ridden/secway/relaymove(mob/user, direction) var/new_speed = normalspeed - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.sprinting && charge) + if(isliving(user)) + var/mob/living/L = user + if((L.combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && charge) charge-- new_speed = chargespeed var/datum/component/riding/D = GetComponent(/datum/component/riding) diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm index 2ab6a59c0a..c59662d5b6 100644 --- a/code/modules/vore/eating/living.dm +++ b/code/modules/vore/eating/living.dm @@ -41,7 +41,7 @@ return TRUE //We'll load our client's organs if we have one - if(client && client.prefs_vr) + if(client?.prefs) if(!copy_from_prefs_vr()) to_chat(src,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.") return FALSE @@ -262,47 +262,22 @@ else to_chat(src,"You aren't inside anyone, though, is the thing.") -// -// Verb for saving vore preferences to save file -// -/mob/living/proc/save_vore_prefs() - if(!client || !client.prefs_vr) - return FALSE - if(!copy_to_prefs_vr()) - return FALSE - if(!client.prefs_vr.save_vore()) - return FALSE - - return TRUE - -/mob/living/proc/apply_vore_prefs() - if(!client || !client.prefs_vr) - return FALSE - if(!client.prefs_vr.load_vore()) - return FALSE - if(!copy_from_prefs_vr()) - return FALSE - - return TRUE - /mob/living/proc/copy_to_prefs_vr() - if(!client || !client.prefs_vr) - to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.") + if(!client || !client.prefs) + to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.") return FALSE - var/datum/vore_preferences/P = client.prefs_vr - - P.digestable = src.digestable - P.devourable = src.devourable - P.feeding = src.feeding - P.vore_taste = src.vore_taste + client.prefs.digestable = digestable + client.prefs.devourable = devourable + client.prefs.feeding = feeding + client.prefs.vore_taste = vore_taste var/list/serialized = list() - for(var/belly in src.vore_organs) + for(var/belly in vore_organs) var/obj/belly/B = belly serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks. - P.belly_prefs = serialized + client.prefs.belly_prefs = serialized return TRUE @@ -310,21 +285,20 @@ // Proc for applying vore preferences, given bellies // /mob/living/proc/copy_from_prefs_vr() - if(!client || !client.prefs_vr) - to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.") + if(!client || !client.prefs) + to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.") return FALSE vorepref_init = TRUE - var/datum/vore_preferences/P = client.prefs_vr - digestable = P.digestable - devourable = P.devourable - feeding = P.feeding - vore_taste = P.vore_taste + digestable = client.prefs.digestable + devourable = client.prefs.devourable + feeding = client.prefs.feeding + vore_taste = client.prefs.vore_taste release_vore_contents(silent = TRUE) - vore_organs.Cut() - for(var/entry in P.belly_prefs) + QDEL_LIST(vore_organs) + for(var/entry in client.prefs.belly_prefs) list_to_object(entry,src) return TRUE @@ -376,23 +350,31 @@ // // Clearly super important. Obviously. // -/mob/living/proc/lick(var/mob/living/tasted in oview(1)) +/mob/living/proc/lick() set name = "Lick Someone" set category = "Vore" set desc = "Lick someone nearby!" - if(!istype(tasted)) + if(incapacitated(ignore_restraints = TRUE)) + to_chat(src, "You can't do that while incapacitated.") return - if(!tasted.client?.prefs_vr.lickable) + var/list/choices + for(var/mob/living/L in view(1)) + if(L != src && (!L.ckey || L.client?.prefs.lickable) && Adjacent(L)) + LAZYADD(choices, L) + + if(!choices) return - if(src == stat) + var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices + + if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE)) return - src.setClickCooldown(100) + setClickCooldown(100) - src.visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") + visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") /mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace) @@ -408,3 +390,11 @@ else taste_message += "a plain old normal [src]" return taste_message +// Check if an object is capable of eating things, based on vore_organs +// +/proc/is_vore_predator(var/mob/living/O) + if(istype(O)) + if(O.vore_organs.len > 0) + return TRUE + + return FALSE diff --git a/code/modules/vore/eating/vore.dm b/code/modules/vore/eating/vore.dm deleted file mode 100644 index abb5bbb988..0000000000 --- a/code/modules/vore/eating/vore.dm +++ /dev/null @@ -1,174 +0,0 @@ - -/* -VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE -V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E -V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E -V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E - V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE - V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E - V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE - V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E - V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E - V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE - V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E - V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE - V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E - V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E - V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E - VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE - --Aro <3 */ - -// -// Overrides/additions to stock defines go here, as well as hooks. Sort them by -// the object they are overriding. So all /mob/living together, etc. -// - -// -// The datum type bolted onto normal preferences datums for storing Vore stuff -// - -#define VORE_VERSION 4 - -GLOBAL_LIST_EMPTY(vore_preferences_datums) - -/client - var/datum/vore_preferences/prefs_vr - -/datum/vore_preferences - //Actual preferences - var/digestable = FALSE - var/devourable = FALSE - var/feeding = FALSE - var/lickable = FALSE -// var/allowmobvore = TRUE - var/list/belly_prefs = list() - var/vore_taste = "nothing in particular" -// var/can_be_drop_prey = FALSE -// var/can_be_drop_pred = FALSE - - //Mechanically required - var/path - var/slot - var/client/client - var/client_ckey - -/datum/vore_preferences/New(client/C) - if(istype(C)) - client = C - client_ckey = C.ckey - load_vore() - -// -// Check if an object is capable of eating things, based on vore_organs -// -/proc/is_vore_predator(var/mob/living/O) - if(istype(O,/mob/living)) - if(O.vore_organs.len > 0) - return TRUE - - return FALSE - -// -// Belly searching for simplifying other procs -// Mostly redundant now with belly-objects and isbelly(loc) -// -/proc/check_belly(atom/movable/A) - return isbelly(A.loc) - -// -// Save/Load Vore Preferences -// -/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json") - if(!ckey || !slot) return - path = "data/player_saves/[ckey[1]]/[ckey]/vore/[filename][slot].[ext]" - -/datum/vore_preferences/proc/load_vore() - if(!client || !client_ckey) - return FALSE //No client, how can we save? - if(!client.prefs || !client.prefs.default_slot) - return FALSE //Need to know what character to load! - - slot = client.prefs.default_slot - - load_path(client_ckey,slot) - - if(!path) return FALSE //Path couldn't be set? - if(!fexists(path)) //Never saved before - save_vore() //Make the file first - return TRUE - - var/list/json_from_file = json_decode(file2text(path)) - if(!json_from_file) - return FALSE //My concern grows - - var/version = json_from_file["version"] - json_from_file = patch_version(json_from_file,version) - - digestable = json_from_file["digestable"] - devourable = json_from_file["devourable"] - feeding = json_from_file["feeding"] - lickable = json_from_file["lickable"] - vore_taste = json_from_file["vore_taste"] - belly_prefs = json_from_file["belly_prefs"] - - //Quick sanitize - if(isnull(digestable)) - digestable = FALSE - if(isnull(devourable)) - devourable = FALSE - if(isnull(feeding)) - feeding = FALSE - if(isnull(lickable)) - lickable = FALSE - if(isnull(belly_prefs)) - belly_prefs = list() - - return TRUE - -/datum/vore_preferences/proc/save_vore() - if(!path) - return FALSE - - var/version = VORE_VERSION //For "good times" use in the future - var/list/settings_list = list( - "version" = version, - "digestable" = digestable, - "devourable" = devourable, - "feeding" = feeding, - "lickable" = lickable, - "vore_taste" = vore_taste, - "belly_prefs" = belly_prefs, - ) - - //List to JSON - var/json_to_file = json_encode(settings_list) - if(!json_to_file) - testing("Saving: [path] failed jsonencode") - return FALSE - - //Write it out -//#ifdef RUST_G -// call(RUST_G, "file_write")(json_to_file, path) -//#else - // Fall back to using old format if we are not using rust-g - if(fexists(path)) - fdel(path) //Byond only supports APPENDING to files, not replacing. - text2file(json_to_file, path) -//#endif - if(!fexists(path)) - testing("Saving: [path] failed file write") - return FALSE - - return TRUE - -/* commented out list things - "allowmobvore" = allowmobvore, - "can_be_drop_prey" = can_be_drop_prey, - "can_be_drop_pred" = can_be_drop_pred, */ - -//Can do conversions here -datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version) - return json_from_file - -#undef VORE_VERSION diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm index f34872bd25..9c1ff4a84e 100644 --- a/code/modules/vore/eating/vorepanel.dm +++ b/code/modules/vore/eating/vorepanel.dm @@ -6,7 +6,6 @@ #define BELLIES_NAME_MIN 2 #define BELLIES_NAME_MAX 12 #define BELLIES_DESC_MAX 1024 -#define FLAVOR_MAX 40 /mob/living/proc/insidePanel() set name = "Vore Panel" @@ -247,8 +246,8 @@ dat += "
Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])" dat += "
Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])" dat += "
Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])" - if(user.client.prefs_vr) - dat += "
Toggle Licking (Currently: [user.client.prefs_vr.lickable ? "ON" : "OFF"])" + if(user.client.prefs) + dat += "
Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])" //Returns the dat html to the vore_look return dat @@ -659,18 +658,19 @@ user.vore_selected = user.vore_organs[1] if(href_list["saveprefs"]) - if(!user.save_vore_prefs()) + if(!(user.client?.prefs)) + return FALSE + if(!user.client.prefs.save_character()) to_chat(user, "Belly Preferences not saved!") - + log_admin("Could not save vore prefs on USER: [user].") else to_chat(user, "Belly Preferences were saved!") - log_admin("Could not save vore prefs on USER: [user].") if(href_list["applyprefs"]) - var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel") + var/alert = alert("Are you sure you want to reload the current slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel") if(!alert == "Reload") return FALSE - if(!user.apply_vore_prefs()) + if(!user.copy_from_prefs_vr()) alert("ERROR: Vore preferences failed to apply!","Error") else to_chat(user,"Vore preferences applied from active slot!") @@ -681,13 +681,15 @@ return FALSE new_flavor = readd_quotes(new_flavor) - if(length(new_flavor) > FLAVOR_MAX) - alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") + if(length(new_flavor) > MAX_TASTE_LEN) + alert("Entered flavor/taste text too long. [MAX_TASTE_LEN] character limit.","Error!") return FALSE user.vore_taste = new_flavor if(href_list["toggledg"]) var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") + if(!user || !user.client) + return switch(choice) if("Cancel") return FALSE @@ -696,11 +698,12 @@ if("Prevent Digestion") user.digestable = FALSE - if(user.client.prefs_vr) - user.client.prefs_vr.digestable = user.digestable + user.client.prefs.digestable = user.digestable if(href_list["toggledvor"]) var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") + if(!user || !user.client) + return switch(choice) if("Cancel") return FALSE @@ -709,11 +712,12 @@ if("Prevent Devourment") user.devourable = FALSE - if(user.client.prefs_vr) - user.client.prefs_vr.devourable = user.devourable + user.client.prefs.devourable = user.devourable if(href_list["toggledfeed"]) var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") + if(!user || !user.client) + return switch(choice) if("Cancel") return FALSE @@ -722,19 +726,19 @@ if("Prevent Feeding") user.feeding = FALSE - if(user.client.prefs_vr) - user.client.prefs_vr.feeding = user.feeding + user.client.prefs.feeding = user.feeding if(href_list["toggledlickable"]) - if(user.client.prefs_vr) - var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs_vr.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking") - switch(choice) - if("Cancel") - return FALSE - if("Allow Licking") - user.client.prefs_vr.lickable = TRUE - if("Prevent Licking") - user.client.prefs_vr.lickable = FALSE + var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking") + if(!user || !user.client) + return + switch(choice) + if("Cancel") + return FALSE + if("Allow Licking") + user.client.prefs.lickable = TRUE + if("Prevent Licking") + user.client.prefs.lickable = FALSE //Refresh when interacted with, returning 1 makes vore_look.Topic update return TRUE diff --git a/html/changelogs/AutoChangeLog-pr-11351.yml b/html/changelogs/AutoChangeLog-pr-11351.yml new file mode 100644 index 0000000000..f4c3218a83 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11351.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "disabler taser alt fire shots are faster and have a 14 tile range now" diff --git a/html/changelogs/AutoChangeLog-pr-11352.yml b/html/changelogs/AutoChangeLog-pr-11352.yml new file mode 100644 index 0000000000..b7745a26e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11352.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "HoS taser now only applies tased effect for 1 second and warden's pump action stun blaster no longer applies it at all." diff --git a/html/changelogs/AutoChangeLog-pr-11375.yml b/html/changelogs/AutoChangeLog-pr-11375.yml new file mode 100644 index 0000000000..3e1fd45ac7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11375.yml @@ -0,0 +1,4 @@ +author: "Auris456852" +delete-after: True +changes: + - balance: "Made EMP reaction growth logarithmic." diff --git a/html/changelogs/AutoChangeLog-pr-11376.yml b/html/changelogs/AutoChangeLog-pr-11376.yml new file mode 100644 index 0000000000..fbb37ff40e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11376.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - refactor: "combat mode/sprint/resisting lying down/attempting to crawl under all refactored, added combat/sprint mode lockouts, being locked out of combat mode no longer disables it and allows right click interactions etc etc" diff --git a/html/changelogs/AutoChangeLog-pr-11491.yml b/html/changelogs/AutoChangeLog-pr-11491.yml new file mode 100644 index 0000000000..dedbe68dfd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11491.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "Mass hallucination can better be admemed" diff --git a/html/changelogs/AutoChangeLog-pr-11507.yml b/html/changelogs/AutoChangeLog-pr-11507.yml new file mode 100644 index 0000000000..b5b75bcd96 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11507.yml @@ -0,0 +1,5 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "Altered the plastitanium rapier from a perfect AP but weaker esword equivalent to a more unique sleep inducing melee weapon." + - rscadd: "Touched up all the relevant sprites." diff --git a/html/changelogs/AutoChangeLog-pr-11511.yml b/html/changelogs/AutoChangeLog-pr-11511.yml new file mode 100644 index 0000000000..db03ee30be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11511.yml @@ -0,0 +1,6 @@ +author: "EmeraldSundisk" +delete-after: True +changes: + - rscadd: "Adds CogStation's shuttles to-be." + - rscadd: "Adds the \"NES Classic\" escape shuttle." + - refactor: "Accounts for the new shuttles." diff --git a/html/changelogs/AutoChangeLog-pr-11512.yml b/html/changelogs/AutoChangeLog-pr-11512.yml new file mode 100644 index 0000000000..3652bca20e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11512.yml @@ -0,0 +1,4 @@ +author: "dapnee" +delete-after: True +changes: + - rscadd: "Lambdastation and it's accompanying files" diff --git a/html/changelogs/AutoChangeLog-pr-11516.yml b/html/changelogs/AutoChangeLog-pr-11516.yml new file mode 100644 index 0000000000..e4721b6d42 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11516.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - tweak: "Arrow crafting has been finagled with, preventing fire-hardened arrows from being fire-hardened repeatedly. Or something." diff --git a/html/changelogs/AutoChangeLog-pr-11517.yml b/html/changelogs/AutoChangeLog-pr-11517.yml new file mode 100644 index 0000000000..142759e66c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11517.yml @@ -0,0 +1,5 @@ +author: "Hatterhat" +delete-after: True +changes: + - bugfix: "Space hermits (those quirky fellas stuck in a rock with carp surrounding them) now have gravity! But they lost their perpetual generators." + - balance: "Space hermits now have to mine for their research tech (golem vendor board, ORM board). They have slightly less bad parts, though. And better(?) rocks." diff --git a/html/changelogs/AutoChangeLog-pr-11518.yml b/html/changelogs/AutoChangeLog-pr-11518.yml new file mode 100644 index 0000000000..b4ff6b0800 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11518.yml @@ -0,0 +1,4 @@ +author: "NecromancerAnne and goldnharl" +delete-after: True +changes: + - imageadd: "Sprite cleanups and animations for energy guns." diff --git a/html/changelogs/AutoChangeLog-pr-11519.yml b/html/changelogs/AutoChangeLog-pr-11519.yml new file mode 100644 index 0000000000..f932aced0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11519.yml @@ -0,0 +1,5 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "mentor de/rementor button" + - bugfix: "mentor !msg" diff --git a/html/changelogs/AutoChangeLog-pr-11520.yml b/html/changelogs/AutoChangeLog-pr-11520.yml new file mode 100644 index 0000000000..663e7d7e43 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11520.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - balance: "bloodsuckers being unable to accept genes" diff --git a/html/changelogs/AutoChangeLog-pr-11527.yml b/html/changelogs/AutoChangeLog-pr-11527.yml new file mode 100644 index 0000000000..72acad545e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11527.yml @@ -0,0 +1,6 @@ +author: "Ghommie (plus a fix originally done by Skogol)" +delete-after: True +changes: + - bugfix: "Drinks dispensers now only show the container they are holding." + - bugfix: "Ghost cafe patrons are warded against a few more events now." + - bugfix: "Fixed RnD machineries UI displaying designs' required reagents' typepaths instead of names." diff --git a/html/changelogs/AutoChangeLog-pr-11528.yml b/html/changelogs/AutoChangeLog-pr-11528.yml new file mode 100644 index 0000000000..795af7d387 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11528.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "beam rifles are less terrible code" diff --git a/html/changelogs/AutoChangeLog-pr-11529.yml b/html/changelogs/AutoChangeLog-pr-11529.yml new file mode 100644 index 0000000000..3000213bf3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11529.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - balance: "Pipes are small now" diff --git a/html/changelogs/AutoChangeLog-pr-11532.yml b/html/changelogs/AutoChangeLog-pr-11532.yml new file mode 100644 index 0000000000..b3bd048fac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11532.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "box station hos office" diff --git a/html/changelogs/AutoChangeLog-pr-11533.yml b/html/changelogs/AutoChangeLog-pr-11533.yml new file mode 100644 index 0000000000..3e293bdf87 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11533.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "Edaggers now enbed as intended" diff --git a/html/changelogs/AutoChangeLog-pr-11534.yml b/html/changelogs/AutoChangeLog-pr-11534.yml new file mode 100644 index 0000000000..5490304287 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11534.yml @@ -0,0 +1,4 @@ +author: "wesoda25" +delete-after: True +changes: + - code_imp: "You no longer hit fermenting barrels when taking reagents from them" diff --git a/html/changelogs/AutoChangeLog-pr-11537.yml b/html/changelogs/AutoChangeLog-pr-11537.yml new file mode 100644 index 0000000000..bcd3a9f2ac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11537.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "The sleeper agents can be outfitted with some larger then normal sunglasses for 1TC in Badass category" diff --git a/html/changelogs/AutoChangeLog-pr-11538.yml b/html/changelogs/AutoChangeLog-pr-11538.yml new file mode 100644 index 0000000000..2cb5aa37e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11538.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - imageadd: "Resprited some sprite_accessory icon states." diff --git a/html/changelogs/AutoChangeLog-pr-11539.yml b/html/changelogs/AutoChangeLog-pr-11539.yml new file mode 100644 index 0000000000..ffc727811a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11539.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "Waffle co objective rewritten to make more clear it's not a murderbone objective" diff --git a/html/changelogs/AutoChangeLog-pr-11540.yml b/html/changelogs/AutoChangeLog-pr-11540.yml new file mode 100644 index 0000000000..12aa207a93 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11540.yml @@ -0,0 +1,7 @@ +author: "NecromancerAnne and zawo and zeroisthebiggay and carlarctg" +delete-after: True +changes: + - rscadd: "The Infiltrator Bundle, an armor kit for 3TC. Murder people in style!" + - rscadd: "Some pajamas for nukies to get plenty of bed rest." + - rscadd: "halved firefight carry delay with latex or nitrile gloves" + - tweak: "headset upgrade is cheaper" diff --git a/html/changelogs/AutoChangeLog-pr-11541.yml b/html/changelogs/AutoChangeLog-pr-11541.yml new file mode 100644 index 0000000000..74ecaf278c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11541.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - balance: "removes xray from the gene pool" diff --git a/html/changelogs/AutoChangeLog-pr-11542.yml b/html/changelogs/AutoChangeLog-pr-11542.yml new file mode 100644 index 0000000000..d0d4ba42a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11542.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "The Syndi Medical borg has been outfitted with the newest and latest ~~Stolen~~ MediCo Gear on the market" diff --git a/html/changelogs/AutoChangeLog-pr-11544.yml b/html/changelogs/AutoChangeLog-pr-11544.yml new file mode 100644 index 0000000000..51a72f3e03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11544.yml @@ -0,0 +1,5 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Ninjas may be asked to steal the CMO's smart drapes" + - tweak: "Hyper Cell steal goal is upgraded to a bluespace cell, as well as the BoH goal now wants a type of BoH rather then the normal default one." diff --git a/html/changelogs/AutoChangeLog-pr-11545.yml b/html/changelogs/AutoChangeLog-pr-11545.yml new file mode 100644 index 0000000000..7a08ec08bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11545.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Gutlunches have gotten teeth now and will eat legs, arms, and organs! - Tho are picky and will not eat the brain just laying about!" diff --git a/html/changelogs/AutoChangeLog-pr-11547.yml b/html/changelogs/AutoChangeLog-pr-11547.yml new file mode 100644 index 0000000000..8fd683e8c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11547.yml @@ -0,0 +1,4 @@ +author: "YakumoChen" +delete-after: True +changes: + - server: "Templates Headers will now correctly use the Citadel Official Wiki Link" diff --git a/html/changelogs/AutoChangeLog-pr-11548.yml b/html/changelogs/AutoChangeLog-pr-11548.yml new file mode 100644 index 0000000000..542da5792c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11548.yml @@ -0,0 +1,5 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "Nightvision goggles are nerfed all-round. Flashes have actual use against people using nightvision, as do flashbangs." + - balance: "Syndicate nuclear agents get to live peacefully knowing their eyes are well protected by their special night vision goggles. Spider clan also get these goggles." diff --git a/html/changelogs/AutoChangeLog-pr-11553.yml b/html/changelogs/AutoChangeLog-pr-11553.yml new file mode 100644 index 0000000000..e7c8f67227 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11553.yml @@ -0,0 +1,5 @@ +author: "kevinz000" +delete-after: True +changes: + - code_imp: "slowdown on items should now be set by set_slowdown()." + - bugfix: "hypereutactic blades properly slow down their wielders when being used and vv-editing an item's slowdown will once again properly update someone's slowdown to take the new value into account." diff --git a/html/changelogs/AutoChangeLog-pr-11565.yml b/html/changelogs/AutoChangeLog-pr-11565.yml new file mode 100644 index 0000000000..ce1f59aa61 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11565.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed permanent slapstick comedy pie'd overlay for snouted humanoids." diff --git a/html/templates/header.html b/html/templates/header.html index 0792e0f025..29759234e2 100644 --- a/html/templates/header.html +++ b/html/templates/header.html @@ -25,7 +25,7 @@
Traditional Games Space Station 13
-

Forum | Wiki | Source

+

Forum | Wiki | Source

diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 070034d778..fd3016ac89 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index b3960f4db6..578970a21c 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi index 78f50519fa..fbc105b634 100644 Binary files a/icons/mob/feet_digi.dmi and b/icons/mob/feet_digi.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 63263b835c..e7068a1854 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index be8f7c6c94..c499c236e3 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/head_muzzled.dmi b/icons/mob/head_muzzled.dmi index f1fb09651f..16cc63a13e 100644 Binary files a/icons/mob/head_muzzled.dmi and b/icons/mob/head_muzzled.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi index 06cdd60168..b7907d5bac 100644 Binary files a/icons/mob/inhands/equipment/toolbox_lefthand.dmi and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi index acb93257c9..100c065ba3 100644 Binary files a/icons/mob/inhands/equipment/toolbox_righthand.dmi and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 2169b87580..1e48d57ac7 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index f054d8f744..5a5ee6f3db 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index a4ff676bd0..da61ca93be 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/mask_muzzled.dmi b/icons/mob/mask_muzzled.dmi index 92e6149bb1..ed74796c03 100644 Binary files a/icons/mob/mask_muzzled.dmi and b/icons/mob/mask_muzzled.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index c1912d74cc..a65ac3f926 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 40ebcaeb4c..195e4ecd67 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi index 0d34d379a8..67ad9f7e1a 100644 Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index e675a8d647..2e8fde527a 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi index 82dc09e43e..80e8f80b94 100644 Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index da8ff0a20b..7e09d425fb 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 1ff87b26e4..c106bd12fc 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 515d6212c0..e937842275 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 2afeb5f19b..07d9c8cee6 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 245b44e56b..64e165213d 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 1105e30ae7..bd8d52a1e6 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index ebd0e725e8..530cd61e6f 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 090003011b..66f3811a81 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 20fe8272da..ba8111bb00 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index c1d41591a2..acf6bb4021 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 33cb08b738..a719356804 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm index 6ad0603c49..bcb44af84b 100644 --- a/modular_citadel/code/_onclick/hud/screen_objects.dm +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -16,14 +16,16 @@ /obj/screen/combattoggle/Click() if(iscarbon(usr)) var/mob/living/carbon/C = usr - C.toggle_combat_mode() + C.user_toggle_intentional_combat_mode() /obj/screen/combattoggle/update_icon_state() var/mob/living/carbon/user = hud?.mymob if(!istype(user)) return - if(user.combatmode) + if((user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) icon_state = "combat" + else if(HAS_TRAIT(user, TRAIT_COMBAT_MODE_LOCKED)) + icon_state = "combat_locked" else icon_state = "combat_off" @@ -41,7 +43,7 @@ var/mob/living/carbon/user = hud?.mymob if(!istype(user)) return - if(user.voremode && !user.combatmode) + if(user.voremode && !(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) icon_state = "nom" else icon_state = "nom_off" diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm index c1c81b6d5b..7199f0286e 100644 --- a/modular_citadel/code/_onclick/hud/sprint.dm +++ b/modular_citadel/code/_onclick/hud/sprint.dm @@ -10,14 +10,16 @@ /obj/screen/sprintbutton/Click() if(ishuman(usr)) var/mob/living/carbon/human/H = usr - H.togglesprint() + H.default_toggle_sprint() /obj/screen/sprintbutton/update_icon_state() var/mob/living/user = hud?.mymob if(!istype(user)) return - if(user.sprinting) + if(user.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) icon_state = "act_sprint_on" + else if(HAS_TRAIT(user, TRAIT_SPRINT_LOCKED)) + icon_state = "act_sprint_locked" else icon_state = "act_sprint" diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm index 0515b9d762..a7b9a79ecd 100644 --- a/modular_citadel/code/_onclick/hud/stamina.dm +++ b/modular_citadel/code/_onclick/hud/stamina.dm @@ -17,7 +17,7 @@ var/mob/living/carbon/user = hud?.mymob if(!user) return - if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2)) + if(user.stat == DEAD || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2)) icon_state = "staminacrit" else if(user.hal_screwyhud == 5) icon_state = "stamina0" @@ -37,7 +37,7 @@ var/mob/living/carbon/user = hud?.mymob if(!user) return - if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2)) + if(user.stat == DEAD || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2)) icon_state = "stambuffer7" else if(user.hal_screwyhud == 5) icon_state = "stambuffer0" diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index e32d226595..82b3c39bb6 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -29,6 +29,7 @@ to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.") to_chat(M, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.") fermi_Clone = null + return ..() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -95,6 +96,7 @@ to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.") owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED) sizeMoveMod(1) + return ..() /datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value) if(cachedmoveCalc == value) @@ -164,6 +166,7 @@ log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]") owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) owner.ResetBloodVol() + return ..() /////////////////////////////////////////////// // Astral INSURANCE @@ -192,15 +195,14 @@ /datum/status_effect/chem/astral_insurance/on_remove(mob/living/carbon/M) //God damnit get them home! if(owner.mind == originalmind) //If they're home, HOORAY - return + return ..() if(owner.mind) var/mob/living/simple_animal/astral/G = new(get_turf(M.loc)) owner.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end. to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'") log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!") originalmind.transfer_to(original) - - + return ..() /*////////////////////////////////////////// Mind control functions! @@ -603,7 +605,7 @@ REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") to_chat(owner, "You're now free of [master]'s influence, and fully independent!'") UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) - + return ..() /datum/status_effect/chem/enthrall/proc/owner_hear(datum/source, list/hearing_args) if(lewd == FALSE) diff --git a/modular_citadel/code/game/objects/cit_screenshake.dm b/modular_citadel/code/game/objects/cit_screenshake.dm index ddb417e06e..188b8a48f9 100644 --- a/modular_citadel/code/game/objects/cit_screenshake.dm +++ b/modular_citadel/code/game/objects/cit_screenshake.dm @@ -1,6 +1,7 @@ //we vlambeer now /obj/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit + set waitfor = FALSE if(!M || !M.client || duration <= 0) return var/client/C = M.client diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm index 1ebf6fb2a6..bd5bd06df7 100644 --- a/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm +++ b/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm @@ -2,4 +2,4 @@ name = "soul death" icon = 'modular_citadel/icons/effects/souldeath.dmi' icon_state = "souldeath" - duration = 30 \ No newline at end of file + duration = 30 diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index 7cf8fb8ff9..6f0588f76e 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital color = "#fcccb3" w_class = WEIGHT_CLASS_NORMAL - var/shape = "human" + var/shape var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code var/genital_flags //see citadel_defines.dm var/masturbation_verb = "masturbate" @@ -208,12 +208,6 @@ give_genital(/obj/item/organ/genital/breasts) if(dna.features["has_cock"]) give_genital(/obj/item/organ/genital/penis) - /* - if(dna.features["has_ovi"]) - give_genital(/obj/item/organ/genital/ovipositor) - if(dna.features["has_eggsack"]) - give_genital(/obj/item/organ/genital/eggsack) - */ /mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G) if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot))) diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm index 594fc83e46..07453facdf 100644 --- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm @@ -137,14 +137,3 @@ /datum/sprite_accessory/breasts/sextuple icon_state = "sextuple" name = "Sextuple" - -//OVIPOSITORS BE HERE -/datum/sprite_accessory/ovipositor - icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' - icon_state = null - name = "Ovipositor" //the preview name of the accessory - color_src = "cock_color" - -/datum/sprite_accessory/ovipositor/knotted - icon_state = "knotted" - name = "Knotted" diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index f3ce834838..bfa506da6d 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -8,10 +8,10 @@ icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_BREASTS - size = "c" //refer to the breast_values static list below for the cups associated number values + size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values fluid_id = /datum/reagent/consumable/milk fluid_rate = MILK_RATE - shape = "pair" + shape = DEF_BREASTS_SHAPE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE masturbation_verb = "massage" arousal_verb = "Your breasts start feeling sensitive" diff --git a/modular_citadel/code/modules/arousal/organs/eggsack.dm b/modular_citadel/code/modules/arousal/organs/eggsack.dm deleted file mode 100644 index ebdefd2371..0000000000 --- a/modular_citadel/code/modules/arousal/organs/eggsack.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/organ/genital/eggsack - name = "Egg sack" - desc = "An egg producing reproductive organ." - icon_state = "egg_sack" - icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi' - zone = BODY_ZONE_PRECISE_GROIN - slot = ORGAN_SLOT_TESTICLES - genital_flags = GENITAL_INTERNAL|GENITAL_BLACKLISTED //unimplemented - linked_organ_slot = ORGAN_SLOT_PENIS - color = null //don't use the /genital color since it already is colored - var/egg_girth = EGG_GIRTH_DEF - var/cum_mult = CUM_RATE_MULT - var/cum_rate = CUM_RATE - var/cum_efficiency = CUM_EFFICIENCY diff --git a/modular_citadel/code/modules/arousal/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm deleted file mode 100644 index 07a9e89746..0000000000 --- a/modular_citadel/code/modules/arousal/organs/ovipositor.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/item/organ/genital/ovipositor - name = "Ovipositor" - desc = "An egg laying reproductive organ." - icon_state = "ovi_knotted_2" - icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi' - zone = BODY_ZONE_PRECISE_GROIN - slot = ORGAN_SLOT_PENIS - genital_flags = GENITAL_BLACKLISTED //unimplemented - shape = "knotted" - size = 3 - layer_index = PENIS_LAYER_INDEX - var/length = 6 //inches - var/girth = 0 - var/girth_ratio = COCK_DIAMETER_RATIO_DEF //citadel_defines.dm for these defines - var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF - var/list/oviflags = list() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index c9eb0769cf..294ac6c877 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -11,6 +11,7 @@ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE linked_organ_slot = ORGAN_SLOT_TESTICLES fluid_transfer_factor = 0.5 + shape = DEF_COCK_SHAPE size = 2 //arbitrary value derived from length and diameter for sprites. layer_index = PENIS_LAYER_INDEX var/length = 6 //inches diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index eb6c1536cb..cf4480ff1f 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -11,8 +11,7 @@ linked_organ_slot = ORGAN_SLOT_PENIS genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION var/size_name = "average" - shape = "Single" - var/sack_size = BALLS_SACK_SIZE_DEF + shape = DEF_BALLS_SHAPE fluid_id = /datum/reagent/consumable/semen masturbation_verb = "massage" layer_index = TESTICLES_LAYER_INDEX @@ -64,7 +63,6 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[D.features["balls_color"]]" - sack_size = D.features["balls_sack_size"] shape = D.features["balls_shape"] if(D.features["balls_shape"] == "Hidden") ENABLE_BITFIELD(genital_flags, GENITAL_INTERNAL) diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 311afe75b0..91c3b8b8e9 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -6,6 +6,7 @@ zone = BODY_ZONE_PRECISE_GROIN slot = "vagina" size = 1 //There is only 1 size right now + shape = DEF_VAGINA_SHAPE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE masturbation_verb = "finger" arousal_verb = "You feel wetness on your crotch" diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 334f301dca..80e20c9f48 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -50,13 +50,11 @@ WRITE_FILE(S["feature_cock_color"], features["cock_color"]) WRITE_FILE(S["feature_cock_length"], features["cock_length"]) WRITE_FILE(S["feature_cock_girth"], features["cock_girth"]) - WRITE_FILE(S["feature_has_sheath"], features["sheath_color"]) //balls features WRITE_FILE(S["feature_has_balls"], features["has_balls"]) WRITE_FILE(S["feature_balls_color"], features["balls_color"]) WRITE_FILE(S["feature_balls_size"], features["balls_size"]) WRITE_FILE(S["feature_balls_shape"], features["balls_shape"]) - WRITE_FILE(S["feature_balls_sack_size"], features["balls_sack_size"]) //breasts features WRITE_FILE(S["feature_has_breasts"], features["has_breasts"]) WRITE_FILE(S["feature_breasts_size"], features["breasts_size"]) diff --git a/modular_citadel/code/modules/mentor/dementor.dm b/modular_citadel/code/modules/mentor/dementor.dm new file mode 100644 index 0000000000..8acd07f9a3 --- /dev/null +++ b/modular_citadel/code/modules/mentor/dementor.dm @@ -0,0 +1,19 @@ +/client/proc/cmd_mentor_dementor() + set category = "Mentor" + set name = "dementor" + if(!is_mentor()) + return + remove_mentor_verbs() + if (/client/proc/mentor_unfollow in verbs) + mentor_unfollow() + GLOB.mentors -= src + verbs += /client/proc/cmd_mentor_rementor + +/client/proc/cmd_mentor_rementor() + set category = "Mentor" + set name = "rementor" + if(!is_mentor()) + return + add_mentor_verbs() + GLOB.mentors += src + verbs -= /client/proc/cmd_mentor_rementor diff --git a/modular_citadel/code/modules/mentor/mentor_verbs.dm b/modular_citadel/code/modules/mentor/mentor_verbs.dm index 716a484ee2..534b877399 100644 --- a/modular_citadel/code/modules/mentor/mentor_verbs.dm +++ b/modular_citadel/code/modules/mentor/mentor_verbs.dm @@ -1,6 +1,7 @@ GLOBAL_LIST_INIT(mentor_verbs, list( /client/proc/cmd_mentor_say, - /client/proc/show_mentor_memo + /client/proc/show_mentor_memo, + /client/proc/cmd_mentor_dementor )) GLOBAL_PROTECT(mentor_verbs) diff --git a/modular_citadel/code/modules/mentor/mentorpm.dm b/modular_citadel/code/modules/mentor/mentorpm.dm index cb39f02092..d2d04495d4 100644 --- a/modular_citadel/code/modules/mentor/mentorpm.dm +++ b/modular_citadel/code/modules/mentor/mentorpm.dm @@ -38,8 +38,9 @@ if(!msg) msg = input(src,"Message:", "Private message") as text|null - if(!msg && is_mentor(whom)) - to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") + if(!msg) + if (is_mentor(whom)) + to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") return if(!C) @@ -54,10 +55,10 @@ return msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN)) - if(!msg && is_mentor(whom)) - to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") + if(!msg) + if (is_mentor(whom)) + to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") return - log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]") msg = emoji_parse(msg) diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index 44512ac0c7..e95948e562 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -1,73 +1,29 @@ /mob/living/carbon - var/combatmode = FALSE //literally lifeweb var/lastmousedir var/wrongdirmovedelay - var/lastdirchange - var/combatmessagecooldown //oh no vore time var/voremode = FALSE -/mob/living/carbon/proc/toggle_combat_mode(forced, silent) - if(!forced) - if(recoveringstam || stat != CONSCIOUS) - return TRUE - for(var/i in status_effects) - var/datum/status_effect/S = i - if(S.blocks_combatmode) - return TRUE - combatmode = !combatmode - if(voremode) - toggle_vore_mode() - if(!silent) - if(combatmode) - if(world.time >= combatmessagecooldown) - if(a_intent != INTENT_HELP) - visible_message("[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].") - else - visible_message("[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].") - playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! - else - playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above! - if(client) - client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting - var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory - T?.update_icon_state() - combatmessagecooldown = 10 SECONDS + world.time //This is set 100% of the time to make sure squeezing regen out of process cycles doesn't result in the combat mode message getting spammed - SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode) - return TRUE - -mob/living/carbon/proc/toggle_vore_mode() +/mob/living/carbon/proc/toggle_vore_mode() voremode = !voremode var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory T?.update_icon_state() - if(combatmode) + if(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) return FALSE //let's not override the main draw of the game these days SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode) return TRUE /mob/living/carbon/Move(atom/newloc, direct = 0) - var/currentdirection = dir . = ..() wrongdirmovedelay = FALSE - if(combatmode && client && lastmousedir) + if((combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && client && lastmousedir) if(lastmousedir != dir) wrongdirmovedelay = TRUE setDir(lastmousedir, ismousemovement = TRUE) - if(currentdirection != dir) - lastdirchange = world.time - /mob/living/carbon/onMouseMove(object, location, control, params) - if(!combatmode) + if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) return mouse_face_atom(object) lastmousedir = dir - -/mob/living/carbon/setDir(newdir, ismousemovement = FALSE) - if(!combatmode || ismousemovement) - if(dir != newdir) - lastdirchange = world.time - . = ..() - else - return diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm index eaf5899d82..a2b9c601dc 100644 --- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm +++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm @@ -15,24 +15,6 @@ if(!forced && (status_flags & GODMODE)) return FALSE apply_damage(amount > 0 ? amount*incomingstammult : amount, STAMINA, affected_zone) - if(recoveringstam && amount > 20) + if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && amount > 20) incomingstammult = max(0.01, incomingstammult/(amount*0.05)) return amount - -/mob/living/carbon/doSprintLossTiles(tiles) - doSprintBufferRegen(FALSE) //first regen. - if(sprint_buffer) - var/use = min(tiles, sprint_buffer) - sprint_buffer -= use - tiles -= use - update_hud_sprint_bar() - if(!tiles) //we had enough, we're done! - return - adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit. - -/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE) - var/diff = world.time - sprint_buffer_regen_last - sprint_buffer_regen_last = world.time - sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff) - if(updating) - update_hud_sprint_bar() diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm deleted file mode 100644 index 2223b0816a..0000000000 --- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm +++ /dev/null @@ -1,37 +0,0 @@ -/mob/living/carbon/human/Move(NewLoc, direct) - var/oldpseudoheight = pseudo_z_axis - . = ..() - if(. && sprinting && !(movement_type & FLYING) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_MOVE|MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby) - if(!HAS_TRAIT(src, TRAIT_FREESPRINT)) - doSprintLossTiles(1) - if((oldpseudoheight - pseudo_z_axis) >= 8) - to_chat(src, "You trip off of the elevated surface!") - for(var/obj/item/I in held_items) - accident(I) - DefaultCombatKnockdown(80) - -/mob/living/carbon/human/movement_delay() - . = 0 - if((mobility_flags & MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && sprinting) - var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI - if(!SSI) - SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase) - . -= SSI.config_entry_value - if(wrongdirmovedelay) - . += 1 - . += ..() - -/mob/living/carbon/human/proc/togglesprint() // If you call this proc outside of hotkeys or clicking the HUD button, I'll be disappointed in you. - sprinting = !sprinting - if((m_intent == MOVE_INTENT_RUN) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE)) - if(sprinting) - playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE) - else - playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) - var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory - S?.update_icon_state() - return TRUE - -/mob/living/carbon/human/proc/sprint_hotkey(targetstatus) - if(targetstatus ? !sprinting : sprinting) - togglesprint() diff --git a/modular_citadel/code/modules/mob/living/damage_procs.dm b/modular_citadel/code/modules/mob/living/damage_procs.dm index c2ce8fd24c..a399c17c71 100644 --- a/modular_citadel/code/modules/mob/living/damage_procs.dm +++ b/modular_citadel/code/modules/mob/living/damage_procs.dm @@ -1,5 +1,2 @@ /mob/living/proc/adjustStaminaLossBuffered(amount, updating_health = TRUE, forced = FALSE) return - -/mob/living/proc/doSprintLossTiles(amount) - return diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm index c0e045365f..3baab2ad86 100644 --- a/modular_citadel/code/modules/mob/living/living.dm +++ b/modular_citadel/code/modules/mob/living/living.dm @@ -1,32 +1,4 @@ /mob/living - var/sprinting = FALSE - var/recoveringstam = FALSE - var/incomingstammult = 1 - var/bufferedstam = 0 - var/stambuffer = 20 - var/stambufferregentime - var/attemptingstandup = FALSE - var/intentionalresting = FALSE - var/attemptingcrawl = FALSE - - //Sprint buffer--- - var/sprint_buffer = 42 //Tiles - var/sprint_buffer_max = 42 - var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond - var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math. - var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer. - //---End - -/mob/living/update_config_movespeed() - . = ..() - sprint_buffer_max = CONFIG_GET(number/movedelay/sprint_buffer_max) - sprint_buffer_regen_ds = CONFIG_GET(number/movedelay/sprint_buffer_regen_per_ds) - sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost) - -/mob/living/movement_delay(ignorewalk = 0) - . = ..() - if(!CHECK_MOBILITY(src, MOBILITY_STAND)) - . += 6 /atom var/pseudo_z_axis @@ -55,22 +27,23 @@ /mob/living/carbon/update_stamina() var/total_health = getStaminaLoss() + if(total_health >= STAMINA_SOFTCRIT) + if(!(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)) + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT) + else + if(combat_flags & COMBAT_FLAG_SOFT_STAMCRIT) + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SOFT_STAMCRIT) if(total_health) - if(!recoveringstam && total_health >= STAMINA_CRIT && !stat) + if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health >= STAMINA_CRIT && !stat) to_chat(src, "You're too exhausted to keep going...") set_resting(TRUE, FALSE, FALSE) - if(combatmode) - toggle_combat_mode(TRUE) - recoveringstam = TRUE + disable_intentional_combat_mode(TRUE, FALSE) + ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT) filters += CIT_FILTER_STAMINACRIT update_mobility() - if(recoveringstam && total_health <= STAMINA_SOFTCRIT) + if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_SOFTCRIT) to_chat(src, "You don't feel nearly as exhausted anymore.") - recoveringstam = FALSE + DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT | COMBAT_FLAG_SOFT_STAMCRIT) filters -= CIT_FILTER_STAMINACRIT update_mobility() update_health_hud() - -/mob/living/proc/update_hud_sprint_bar() - if(hud_used && hud_used.sprint_buffer) - hud_used.sprint_buffer.update_to_mob(src) diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm deleted file mode 100644 index 526ea497c4..0000000000 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm +++ /dev/null @@ -1,30 +0,0 @@ -/mob/living/silicon/robot/Move(NewLoc, direct) - . = ..() - if(. && sprinting && !(movement_type & FLYING) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND | MOBILITY_MOVE)) - if(!(cell?.use(25))) - togglesprint(TRUE) - -/mob/living/silicon/robot/movement_delay() - . = ..() - if(!resting && !sprinting) - . += 1 - . += speed - -/mob/living/silicon/robot/proc/togglesprint(shutdown = FALSE) //Basically a copypaste of the proc from /mob/living/carbon/human - if(!shutdown && (!cell || cell.charge < 25) || !cansprint) - return FALSE - sprinting = shutdown ? FALSE : !sprinting - if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE)) - if(sprinting) - playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE) - else - if(shutdown) - playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE) - playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) - var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory - S?.update_icon_state() - return TRUE - -/mob/living/silicon/robot/proc/sprint_hotkey(targetstatus) - if(targetstatus ? !sprinting : sprinting) - togglesprint() diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index 0850a95c47..05b5c195c2 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -192,6 +192,8 @@ stamina = 18 stutter = 5 jitter = 20 + strong_tase = FALSE + tase_duration = 0 hitsound = 'sound/weapons/taserhit.ogg' range = 3 strong_tase = FALSE diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 578086c4c3..3f3bcf5bd7 100644 Binary files a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi and b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/ovipositor.dmi b/modular_citadel/icons/obj/genitals/ovipositor.dmi deleted file mode 100644 index 81d857417f..0000000000 Binary files a/modular_citadel/icons/obj/genitals/ovipositor.dmi and /dev/null differ diff --git a/modular_citadel/icons/ui/screen_clockwork.dmi b/modular_citadel/icons/ui/screen_clockwork.dmi index 2b70d37f1e..3a7ba8338f 100644 Binary files a/modular_citadel/icons/ui/screen_clockwork.dmi and b/modular_citadel/icons/ui/screen_clockwork.dmi differ diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi index 396fd4a36e..a730c591ba 100644 Binary files a/modular_citadel/icons/ui/screen_midnight.dmi and b/modular_citadel/icons/ui/screen_midnight.dmi differ diff --git a/modular_citadel/icons/ui/screen_operative.dmi b/modular_citadel/icons/ui/screen_operative.dmi index a2c9420b77..cb08f08ceb 100644 Binary files a/modular_citadel/icons/ui/screen_operative.dmi and b/modular_citadel/icons/ui/screen_operative.dmi differ diff --git a/modular_citadel/icons/ui/screen_plasmafire.dmi b/modular_citadel/icons/ui/screen_plasmafire.dmi index abbb8f0cd1..5f8cd9d93c 100644 Binary files a/modular_citadel/icons/ui/screen_plasmafire.dmi and b/modular_citadel/icons/ui/screen_plasmafire.dmi differ diff --git a/modular_citadel/icons/ui/screen_slimecore.dmi b/modular_citadel/icons/ui/screen_slimecore.dmi index 15651808ec..f2f0c88782 100644 Binary files a/modular_citadel/icons/ui/screen_slimecore.dmi and b/modular_citadel/icons/ui/screen_slimecore.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 8b04b3deac..825910b716 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -312,6 +312,7 @@ #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" #include "code\controllers\subsystem\processing\quirks.dm" +#include "code\controllers\subsystem\processing\status_effects.dm" #include "code\controllers\subsystem\processing\weather.dm" #include "code\controllers\subsystem\processing\wet_floors.dm" #include "code\datums\action.dm" @@ -2194,10 +2195,12 @@ #include "code\modules\mob\living\emote.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_combat.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_mobility.dm" #include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_sprint.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\say.dm" @@ -2215,9 +2218,11 @@ #include "code\modules\mob\living\brain\say.dm" #include "code\modules\mob\living\brain\status_procs.dm" #include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_combat.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_movement.dm" +#include "code\modules\mob\living\carbon\carbon_sprint.dm" #include "code\modules\mob\living\carbon\damage_procs.dm" #include "code\modules\mob\living\carbon\death.dm" #include "code\modules\mob\living\carbon\emote.dm" @@ -2356,6 +2361,7 @@ #include "code\modules\mob\living\silicon\robot\robot_mobility.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\robot_sprint.dm" #include "code\modules\mob\living\silicon\robot\say.dm" #include "code\modules\mob\living\silicon\robot\update_icons.dm" #include "code\modules\mob\living\simple_animal\animal_defense.dm" @@ -2734,6 +2740,7 @@ #include "code\modules\projectiles\guns\magic\wand.dm" #include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\misc\chameleon.dm" #include "code\modules\projectiles\guns\misc\chem_gun.dm" #include "code\modules\projectiles\guns\misc\grenade_launcher.dm" #include "code\modules\projectiles\guns\misc\medbeam.dm" @@ -3183,7 +3190,6 @@ #include "code\modules\vore\eating\bellymodes.dm" #include "code\modules\vore\eating\digest_act.dm" #include "code\modules\vore\eating\living.dm" -#include "code\modules\vore\eating\vore.dm" #include "code\modules\vore\eating\voreitems.dm" #include "code\modules\vore\eating\vorepanel.dm" #include "code\modules\VR\vr_mob.dm" @@ -3214,8 +3220,6 @@ #include "modular_citadel\code\modules\arousal\genitals.dm" #include "modular_citadel\code\modules\arousal\genitals_sprite_accessories.dm" #include "modular_citadel\code\modules\arousal\organs\breasts.dm" -#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" -#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" #include "modular_citadel\code\modules\arousal\organs\penis.dm" #include "modular_citadel\code\modules\arousal\organs\testicles.dm" #include "modular_citadel\code\modules\arousal\organs\vagina.dm" @@ -3252,6 +3256,7 @@ #include "modular_citadel\code\modules\custom_loadout\custom_items.dm" #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" #include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" +#include "modular_citadel\code\modules\mentor\dementor.dm" #include "modular_citadel\code\modules\mentor\follow.dm" #include "modular_citadel\code\modules\mentor\mentor.dm" #include "modular_citadel\code\modules\mentor\mentor_memo.dm" @@ -3268,9 +3273,7 @@ #include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm" #include "modular_citadel\code\modules\projectiles\gun.dm" #include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" #include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm"