diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 86f6cb550b..c9ec41aeb3 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -850,6 +850,10 @@ /area/maintenance/fore) "acc" = ( /obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "solitarylock"; + name = "Brig Lockdown" + }, /turf/open/floor/plating, /area/security/brig) "acd" = ( @@ -1246,11 +1250,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/closet/crate/freezer, /obj/machinery/firealarm{ pixel_y = 26 }, -/obj/item/reagent_containers/food/snacks/meat/slab, +/obj/machinery/washing_machine, /turf/open/floor/plasteel, /area/crew_quarters/lounge) "acW" = ( @@ -2403,6 +2406,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/washing_machine, /turf/open/floor/plasteel/checker, /area/hallway/secondary/entry) "afP" = ( @@ -2636,9 +2640,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/mob/living/simple_animal/pet/redpanda{ - name = "Stinky" - }, /turf/open/floor/plasteel, /area/crew_quarters/lounge) "agt" = ( @@ -2667,6 +2668,11 @@ pixel_y = 28 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/displaycase/labcage{ + desc = "A glass lab container for storing smelly creatures."; + name = "stinky panda containment"; + start_showpiece_type = /mob/living/simple_animal/pet/redpanda/stinky + }, /turf/open/floor/plasteel, /area/crew_quarters/lounge) "agx" = ( @@ -3089,6 +3095,10 @@ /area/crew_quarters/kitchen) "ahy" = ( /obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "solitarylock"; + name = "Brig Lockdown" + }, /turf/open/floor/plating, /area/security/warden) "ahz" = ( @@ -3586,6 +3596,8 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/genpop, /turf/open/floor/plasteel, /area/security/brig) "aiL" = ( @@ -3791,6 +3803,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/washing_machine, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -3895,7 +3908,7 @@ /area/security/brig) "ajA" = ( /obj/effect/turf_decal/bot, -/obj/structure/closet/secure_closet/brig, +/obj/structure/closet/secure_closet/genpop, /turf/open/floor/plasteel, /area/security/brig) "ajB" = ( @@ -3905,6 +3918,10 @@ }, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/prison) "ajC" = ( @@ -9731,6 +9748,10 @@ /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/prison) "awI" = ( @@ -9820,6 +9841,10 @@ dir = 1 }, /obj/effect/turf_decal/tile/bar, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/main) "awR" = ( @@ -9903,13 +9928,21 @@ name = "Thermo-Electric Generator" }) "awY" = ( -/obj/structure/closet/wardrobe/orange, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "solitarylock"; + name = "Solitary Lockdown"; + pixel_x = -24; + req_access_txt = "2" + }, /turf/open/floor/plasteel, /area/security/brig) "awZ" = ( @@ -10015,7 +10048,7 @@ pixel_y = 28 }, /obj/effect/turf_decal/bot, -/obj/structure/closet/secure_closet/brig, +/obj/structure/closet/secure_closet/genpop, /turf/open/floor/plasteel, /area/security/brig) "axj" = ( @@ -10780,6 +10813,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/main) "ayP" = ( @@ -10943,6 +10980,7 @@ /area/maintenance/port/central) "aze" = ( /obj/machinery/power/apc{ + dir = 1; name = "AI Chamber APC"; pixel_y = 24 }, @@ -11617,13 +11655,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/item/gun/energy/e_gun/advtaser{ - pixel_y = 6 - }, -/obj/item/gun/energy/e_gun/advtaser, -/obj/item/gun/energy/e_gun/advtaser{ - pixel_y = -6 - }, /obj/machinery/vending/security, /turf/open/floor/plasteel, /area/security/brig) @@ -12159,6 +12190,10 @@ dir = 1 }, /obj/effect/turf_decal/tile/bar, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/main) "aBy" = ( @@ -12719,6 +12754,10 @@ }, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/prison) "aCI" = ( @@ -14374,7 +14413,9 @@ /turf/open/floor/plasteel, /area/storage/emergency/generic) "aFX" = ( -/obj/structure/filingcabinet, +/obj/machinery/computer/security/hos{ + dir = 4 + }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "aFY" = ( @@ -14809,7 +14850,9 @@ c_tag = "Security - Head of Security's Office"; pixel_x = 22 }, -/obj/machinery/computer/security/hos, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "aGL" = ( @@ -16299,8 +16342,9 @@ }, /obj/effect/turf_decal/tile/red, /obj/item/storage/belt/medical, -/obj/item/clothing/suit/space/hardsuit/medical, /obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/suit/space/eva/paramedic, +/obj/item/clothing/head/helmet/space/eva/paramedic, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2{ name = "Medbay Treatment Center" @@ -16481,11 +16525,28 @@ /turf/open/floor/plasteel, /area/security/main) "aJV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/closed/wall, -/area/security/prison) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) "aJW" = ( /obj/machinery/cryopod{ dir = 8 @@ -16773,7 +16834,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/flasher/portable, +/obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel, /area/security/brig) "aKz" = ( @@ -18308,7 +18369,7 @@ pixel_x = 22 }, /obj/machinery/power/apc/highcap/fifteen_k{ - areastring = "area/tcommsat/computer"; + areastring = "/area/tcommsat/server"; dir = 1; name = "Telecomms Server APC"; pixel_y = 24 @@ -18317,7 +18378,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/tcommsat/computer) +/area/tcommsat/server) "aND" = ( /turf/open/floor/plasteel/white, /area/medical{ @@ -19373,7 +19434,7 @@ icon_state = "4-8" }, /turf/open/floor/plating/airless, -/area/space/nearstation) +/area/crew_quarters/fitness/cogpool) "aPS" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, @@ -26413,6 +26474,7 @@ dir = 1 }, /obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, /turf/open/floor/plating, /area/crew_quarters/fitness/cogpool) "bfz" = ( @@ -26994,8 +27056,8 @@ /area/quartermaster/warehouse) "bgJ" = ( /obj/machinery/portable_atmospherics/pump, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plating, /area/crew_quarters/fitness/cogpool) @@ -29270,15 +29332,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/surgical_drapes, -/obj/item/scalpel, -/obj/item/circular_saw{ - pixel_y = 16 - }, -/obj/item/hemostat, -/obj/item/retractor, -/obj/item/surgicaldrill, -/obj/item/cautery, +/obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2{ name = "Medbay Treatment Center" @@ -31592,9 +31646,6 @@ dir = 1 }, /area/hallway/secondary/exit) -"bqq" = ( -/turf/closed/wall, -/area/science/robotics/lab) "bqr" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -31609,7 +31660,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/science/robotics/lab) +/area/maintenance/aft) "bqt" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red{ @@ -31623,7 +31674,6 @@ /obj/item/clothing/mask/surgical, /obj/item/healthanalyzer, /obj/item/clothing/neck/stethoscope, -/obj/item/razor, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2{ name = "Medbay Treatment Center" @@ -31693,8 +31743,8 @@ dir = 8 }, /obj/machinery/light, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 9 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) @@ -32186,9 +32236,26 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "brz" = ( -/obj/machinery/computer/rdconsole/robotics, -/turf/open/floor/circuit, -/area/science/robotics/lab) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/science/research"; + name = "Research Sector APC"; + pixel_y = -24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) "brA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32245,15 +32312,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/civilian) -"brF" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/white/full, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) "brG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32268,13 +32326,21 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brH" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/structure/closet/wardrobe/chemistry_white{ + anchored = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "brI" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -32292,32 +32358,21 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "brJ" = ( -/obj/machinery/vending/assist, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/medical/chemistry) "brK" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" +/obj/machinery/chem_heater, +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 1 }, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/item/healthanalyzer, -/obj/item/healthanalyzer, -/obj/item/healthanalyzer, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "brL" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -32838,42 +32893,37 @@ /turf/open/floor/grass, /area/hydroponics) "bsL" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/landmark/start/roboticist, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"bsM" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"bsN" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/trimline/yellow/filled/end, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 5 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) +"bsM" = ( +/turf/closed/wall, /area/science/robotics/lab) +"bsN" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/medical/chemistry) "bsO" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/closed/wall/r_wall, /area/hallway/secondary/civilian) -"bsP" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "bsQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall/r_wall, +/area/medical/chemistry) "bsR" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/grimy, @@ -32893,9 +32943,8 @@ /turf/open/space/basic, /area/space/nearstation) "bsU" = ( -/obj/effect/landmark/start/roboticist, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bsV" = ( /turf/closed/wall, @@ -33033,18 +33082,27 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "btn" = ( -/obj/machinery/computer/mech_bay_power_console, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bto" = ( -/turf/open/floor/mech_bay_recharge_floor, -/area/science/robotics/lab) -"btp" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics"; + name = "robotics lab shutters" }, /turf/open/floor/plating, /area/science/robotics/lab) +"bto" = ( +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"btp" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "btq" = ( /obj/machinery/vending/cigarette, /obj/effect/decal/cleanable/dirt, @@ -33066,9 +33124,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/chapel) -"bts" = ( -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "btt" = ( /obj/structure/chair{ dir = 8 @@ -33098,12 +33153,11 @@ /turf/closed/wall, /area/hallway/secondary/civilian) "btv" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/belt/utility, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/router/medsci) "btw" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -33321,16 +33375,16 @@ /turf/open/floor/plating, /area/router) "bua" = ( -/obj/machinery/camera{ - c_tag = "Robotics Backroom"; - dir = 8; - network = list("ss13","medbay"); - pixel_y = -22 +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/obj/structure/sign/poster/contraband/borg_fancy_2{ - pixel_x = 32 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/side, /area/science/robotics/lab) "bub" = ( /obj/effect/turf_decal/tile/yellow, @@ -33384,12 +33438,6 @@ "bui" = ( /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"buj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "buk" = ( /obj/structure/cable{ icon_state = "1-2" @@ -33404,15 +33452,13 @@ /turf/open/floor/plating, /area/router) "bul" = ( -/obj/machinery/light_switch{ - pixel_x = 24 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chem1"; + name = "chem lab shutters" }, -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/plating, +/area/medical/chemistry) "bum" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, @@ -34040,11 +34086,25 @@ /turf/open/floor/carpet/green, /area/crew_quarters/heads/hop) "bvK" = ( -/obj/structure/table/optable, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/glass, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/cable_coil/random, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "bvL" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -34222,9 +34282,26 @@ /turf/open/floor/plating, /area/maintenance/department/chapel) "bwf" = ( -/obj/machinery/computer/operating, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/chemistry, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "bwg" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -35355,12 +35432,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "byw" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 }, /turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/area/medical/chemistry) "byx" = ( /obj/machinery/telecomms/processor/preset_three, /turf/open/floor/circuit/telecomms/mainframe, @@ -35390,9 +35466,11 @@ /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "byD" = ( -/obj/effect/landmark/start/roboticist, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/area/medical/chemistry) "byE" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -35777,14 +35855,6 @@ }, /turf/open/floor/plasteel/white, /area/gateway) -"bzA" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/closed/wall, -/area/science/research{ - name = "Research Sector" - }) "bzB" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 6 @@ -35827,11 +35897,15 @@ /turf/open/floor/plating, /area/router) "bzG" = ( -/obj/machinery/light{ - dir = 8 +/obj/machinery/chem_dispenser, +/obj/item/radio/intercom{ + pixel_x = -25 }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "bzH" = ( /obj/structure/disposalpipe/segment, /obj/structure/grille/broken, @@ -35847,8 +35921,8 @@ /area/hallway/primary/aft) "bzJ" = ( /obj/structure/sign/warning/biohazard, -/turf/closed/wall, -/area/science/robotics/lab) +/turf/closed/wall/r_wall, +/area/medical/chemistry) "bzK" = ( /obj/machinery/disposal/bin{ name = "Chapel Corpse Delivery" @@ -36252,26 +36326,28 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bAC" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/chem_master, +/obj/machinery/requests_console{ + department = "Chemistry"; + departmentType = 2; + pixel_x = -30; + receive_ore_updates = 1 }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) -"bAD" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/effect/turf_decal/trimline/yellow/filled/end, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "bAE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/landmark/start/ai/secondary, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, +/obj/effect/turf_decal/trimline/yellow/filled/end, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "bAF" = ( /obj/machinery/gateway/centerstation, /turf/open/floor/engine, @@ -36332,6 +36408,7 @@ name = "Chief Medical Officer's Office APC"; pixel_y = 24 }, +/mob/living/simple_animal/pet/cat/Runtime, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) "bAK" = ( @@ -36620,12 +36697,11 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bBs" = ( -/obj/machinery/aug_manipulator, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/sign/warning/nosmoking{ + pixel_y = -32 }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/turf/open/floor/plasteel/dark, +/area/medical/chemistry) "bBt" = ( /obj/structure/cable{ icon_state = "4-8" @@ -36810,10 +36886,14 @@ "bBP" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, -/area/medical/chemistry) +/area/science/robotics/lab) "bBQ" = ( -/turf/closed/wall, -/area/medical/chemistry) +/obj/machinery/door/airlock/research{ + name = "Mech Bay"; + req_access_txt = "29" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bBR" = ( /obj/structure/cable{ icon_state = "0-8" @@ -36963,13 +37043,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) -"bCf" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/medical/chemistry) -"bCg" = ( -/turf/closed/wall/r_wall, -/area/medical/chemistry) "bCh" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -37291,10 +37364,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bCY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/robotics/lab) "bCZ" = ( /obj/machinery/conveyor{ dir = 8; @@ -37375,7 +37444,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/effect/decal/cleanable/dirt, -/obj/item/pipe_meter, +/obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/department/chapel) "bDk" = ( @@ -37459,7 +37528,7 @@ /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, -/obj/item/pipe_meter, +/obj/machinery/meter, /turf/closed/wall/r_wall, /area/crew_quarters/kitchen/backroom) "bDs" = ( @@ -37686,13 +37755,9 @@ /turf/open/floor/plasteel/stairs, /area/crew_quarters/bar) "bDT" = ( -/obj/machinery/chem_heater, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/machinery/mecha_part_fabricator, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bDU" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -38458,8 +38523,12 @@ "bFu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics"; + name = "robotics lab shutters" + }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/science/robotics/lab) "bFv" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -38479,18 +38548,33 @@ }, /obj/structure/cable, /obj/machinery/power/apc{ - areastring = "area/science/xenobiology"; + areastring = "/area/science/xenobiology"; name = "Xenobiology Lab APC"; pixel_y = -24 }, /turf/open/floor/plasteel, /area/science/xenobiology) "bFx" = ( -/obj/machinery/chem_dispenser, -/obj/effect/turf_decal/stripes/line, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1 + }, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/machinery/requests_console{ + department = "Robotics"; + departmentType = 2; + name = "Robotics RC"; + pixel_y = 31; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bFy" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -38518,33 +38602,22 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bFB" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/obj/effect/turf_decal/stripes/white/full, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bFC" = ( /obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/firealarm{ - pixel_y = 26 - }, -/obj/item/storage/fancy/donut_box, -/obj/item/storage/box/beakers, -/obj/item/clothing/glasses/science, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/mmi, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/storage/box/bodybags, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bFD" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -38555,11 +38628,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"bFE" = ( -/obj/machinery/smoke_machine, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/medical/chemistry) "bFF" = ( /obj/machinery/light_switch{ pixel_y = 24 @@ -38569,10 +38637,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"bFG" = ( -/obj/structure/sign/departments/chemistry, -/turf/closed/wall, -/area/medical/chemistry) "bFH" = ( /obj/machinery/power/apc{ name = "Customs APC"; @@ -38843,12 +38907,12 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/light_switch{ - pixel_y = 24 - }, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bGa" = ( @@ -39578,20 +39642,8 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bHD" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -39608,6 +39660,13 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 }, +/obj/machinery/camera{ + c_tag = "Medbay - Starboard"; + network = list("ss13","rd") + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bHF" = ( @@ -39634,9 +39693,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -39646,9 +39702,8 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/obj/machinery/camera{ - c_tag = "Medbay - Starboard"; - network = list("ss13","rd") +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -39675,6 +39730,9 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bHJ" = ( @@ -39805,52 +39863,40 @@ /obj/structure/disposalpipe/junction{ dir = 8 }, -/turf/open/floor/plating, -/area/medical/chemistry) -"bId" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics"; + name = "robotics lab shutters" }, +/turf/open/floor/plating, +/area/science/robotics/lab) +"bId" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark/side{ + dir = 9 + }, +/area/science/robotics/lab) +"bIe" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel/dark/side{ dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/mob/living/simple_animal/bot/firebot, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bIe" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/science/robotics/lab) "bIf" = ( /obj/effect/turf_decal/tile/purple{ - dir = 4 + dir = 8 }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark/side{ dir = 1 }, -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/science/robotics/lab) "bIg" = ( /obj/structure/table, /obj/effect/turf_decal/tile/purple{ @@ -39868,32 +39914,19 @@ name = "Research Sector" }) "bIh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bIi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bIj" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/door/window/southright, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bIk" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/turf/closed/wall, -/area/medical/chemistry) +/turf/closed/wall/r_wall, +/area/science/robotics/lab) "bIl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40113,19 +40146,6 @@ /obj/item/extinguisher, /turf/open/floor/plasteel, /area/science/xenobiology) -"bIL" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bIM" = ( -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "bIN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40302,16 +40322,6 @@ /obj/structure/window/reinforced/spawner, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bJd" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "bJe" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/tile/blue, @@ -40541,27 +40551,48 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bJC" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/button/door{ + id = "robotics2"; + name = "Shutters Control Button"; + pixel_x = 24; + pixel_y = -24; + req_access_txt = "29" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bJD" = ( -/obj/machinery/chem_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bJE" = ( -/obj/machinery/chem_dispenser, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10; + pixel_x = -5 }, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/stack/cable_coil/random{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bJF" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -40594,8 +40625,12 @@ /area/hallway/primary/central) "bJH" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics2"; + name = "robotics lab shutters" + }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/science/robotics/lab) "bJI" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -40767,30 +40802,47 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bKd" = ( -/obj/structure/closet/bombcloset, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bKe" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bKf" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "robotics"; + name = "Shutters Control Button"; + pixel_y = 8; + req_access_txt = "29"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/science/robotics/lab) +"bKe" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/science/robotics/lab) +"bKf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bKg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -41114,70 +41166,88 @@ /turf/open/floor/engine, /area/science/xenobiology) "bKN" = ( -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/table, +/obj/item/book/manual/wiki/robotics_cyborgs{ + pixel_x = -3; + pixel_y = -2 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/item/book/manual/ripley_build_and_repair{ + pixel_x = 3; + pixel_y = 2 }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/mmi/posibrain, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bKO" = ( -/obj/structure/closet/crate/medical, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/multitool{ + pixel_x = 3 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/item/multitool{ + pixel_x = 3 }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = -1 }, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/reagent_containers/glass/bottle/ammonia, -/obj/item/reagent_containers/glass/bottle/atropine, -/obj/item/reagent_containers/glass/bottle/bromine, -/obj/item/reagent_containers/glass/bottle/charcoal, -/obj/item/reagent_containers/glass/bottle/diethylamine, -/obj/item/reagent_containers/glass/bottle/epinephrine, -/obj/item/reagent_containers/glass/bottle/ethanol, -/obj/item/reagent_containers/glass/bottle/formaldehyde, -/obj/item/reagent_containers/glass/bottle/iron, -/obj/item/reagent_containers/glass/bottle/morphine, -/obj/item/reagent_containers/glass/bottle/salglu_solution, -/obj/item/reagent_containers/glass/bottle/toxin, -/obj/item/reagent_containers/glass/bottle/carbon, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bKP" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 8 +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_y = 3; + pixel_x = 4 }, -/obj/machinery/door/window/northright{ - name = "Emergency Shower" +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_x = -6; + pixel_y = 6 }, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/machinery/button/door{ + id = "robotics3"; + name = "Shutters Control Button"; + pixel_x = 24; + pixel_y = -24; + req_access_txt = "29" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bKQ" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/shower{ - dir = 8; - name = "emergency shower"; - pixel_y = -4 - }, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/machinery/droneDispenser, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bKR" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -43683,7 +43753,7 @@ pixel_x = 22 }, /obj/machinery/turretid{ - control_area = "area/ai_monitored/turret_protected/ai"; + control_area = "/area/ai_monitored/turret_protected/ai"; dir = 1; name = "AI Chamber turret control"; pixel_x = 5; @@ -43828,12 +43898,33 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "bQp" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_x = -26 +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/machinery/power/apc{ + areastring = "/area/medical/chemistry"; + dir = 1; + name = "Chemistry APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "bQq" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -44479,7 +44570,7 @@ dir = 1; network = list("minisat") }, -/turf/open/floor/circuit/green/telecomms, +/turf/open/floor/circuit/green, /area/science/server{ name = "Computer Core" }) @@ -44717,13 +44808,20 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/power/apc{ + areastring = "/area/science/robotics/lab"; + dir = 8; + name = "Robotics Lab APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plasteel, -/area/science/research{ - name = "Research Sector" - }) +/area/science/robotics/lab) "bRU" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -44731,11 +44829,15 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bRV" = ( -/obj/structure/sign/departments/chemistry, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/closed/wall, -/area/medical/chemistry) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics"; + name = "robotics lab shutters" + }, +/turf/open/floor/plating, +/area/science/robotics/lab) "bRW" = ( /obj/effect/turf_decal/bot, /obj/structure/cable{ @@ -44790,33 +44892,22 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bSd" = ( -/obj/structure/closet/secure_closet/chemical, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bSe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "Robotics"; - departmentType = 2; - name = "Robotics RC"; - pixel_x = -30; - receive_ore_updates = 1 +/obj/machinery/computer/rdconsole/robotics{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) @@ -45144,6 +45235,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/cell/high/plus, /obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil/red, /turf/open/floor/plasteel/white, /area/science/lab) "bSN" = ( @@ -45505,27 +45597,30 @@ }, /area/medical/medbay/lobby) "bTC" = ( -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bTD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/disposalpipe/junction{ + dir = 1 }, -/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark/side{ + dir = 5 + }, +/area/science/robotics/lab) +"bTD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bTE" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, @@ -47999,31 +48094,22 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bYo" = ( -/obj/structure/closet/emcloset, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/obj/machinery/computer/mech_bay_power_console, +/turf/open/floor/circuit/green, +/area/science/robotics/mechbay) "bYp" = ( -/obj/structure/rack, -/obj/item/clothing/suit/fire/firefighter, -/obj/item/clothing/mask/gas, -/obj/item/wrench, -/obj/item/light/tube, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/turf/open/floor/plasteel/recharge_floor, +/area/science/robotics/mechbay) "bYq" = ( /obj/machinery/light/small{ dir = 1 }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/obj/machinery/mech_bay_recharge_port{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/science/robotics/mechbay) "bYr" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -48098,9 +48184,7 @@ }) "bYv" = ( /turf/closed/wall, -/area/science/research{ - name = "Research Sector" - }) +/area/science/robotics/mechbay) "bYw" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -48120,10 +48204,8 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/turf/open/floor/circuit, +/area/science/robotics/mechbay) "bYy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48134,13 +48216,8 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/turf/open/floor/circuit, +/area/science/robotics/mechbay) "bYz" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 10 @@ -48164,24 +48241,9 @@ name = "Research Sector" }) "bYB" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/clothing/gloves/color/latex, -/obj/item/book/manual/wiki/chemistry, -/obj/item/reagent_containers/dropper, -/obj/item/radio/headset/headset_medsci, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "bYC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, @@ -48209,12 +48271,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "bYF" = ( -/obj/machinery/portable_atmospherics/pump, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/obj/structure/cable, +/obj/machinery/recharge_station, +/turf/open/floor/circuit/green, +/area/science/robotics/mechbay) "bYG" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -48231,78 +48292,36 @@ name = "Medbay Treatment Center" }) "bYH" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/obj/structure/sign/poster/contraband/kss13{ + pixel_y = -32 + }, +/obj/structure/cable, +/obj/machinery/recharge_station, +/turf/open/floor/circuit/green, +/area/science/robotics/mechbay) "bYI" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/storage/box/beakers, -/obj/item/assembly/timer{ - pixel_y = 6 - }, -/obj/item/assembly/timer{ - pixel_y = 6 - }, -/obj/item/assembly/timer{ - pixel_y = 6 - }, -/obj/item/assembly/timer{ - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_y = -4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bYJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/science/robotics/lab) +"bYJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"bYK" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - sortType = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bYL" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -48433,13 +48452,13 @@ name = "Computer Core" }) "bYY" = ( -/turf/open/floor/circuit/green/telecomms, +/turf/open/floor/circuit/green, /area/science/server{ name = "Computer Core" }) "bYZ" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/green/telecomms, +/turf/open/floor/circuit/green, /area/science/server{ name = "Computer Core" }) @@ -48470,7 +48489,7 @@ }, /obj/item/circuitboard/machine/rdserver, /obj/item/disk/tech_disk, -/turf/open/floor/circuit/green/telecomms, +/turf/open/floor/circuit/green, /area/science/server{ name = "Computer Core" }) @@ -48480,7 +48499,7 @@ }, /obj/machinery/light, /obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/green/telecomms, +/turf/open/floor/circuit/green, /area/science/server{ name = "Computer Core" }) @@ -48811,21 +48830,13 @@ /turf/closed/wall/r_wall, /area/library) "bZT" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/structure/table/optable{ + name = "Robotics Operating Table" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/storage/box/pillbottles, -/obj/item/hand_labeler, -/obj/item/clothing/glasses/science, -/obj/structure/sign/poster/official/safety_eye_protection{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "bZU" = ( /obj/structure/table/wood, /obj/machinery/door/window/northright{ @@ -48941,19 +48952,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"caj" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cak" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, @@ -49072,6 +49070,7 @@ pixel_y = 3 }, /obj/item/storage/toolbox/mechanical, +/obj/item/stack/cable_coil/red, /turf/open/floor/plasteel, /area/science/explab) "caD" = ( @@ -49101,32 +49100,11 @@ /area/engine/atmos) "caG" = ( /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 8 }, -/turf/open/floor/plasteel/dark/side{ - dir = 8 - }, +/turf/open/floor/plasteel/dark, /area/science/explab) -"caH" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/chair/office/light, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "caI" = ( /obj/structure/table/reinforced, /obj/item/integrated_electronics/analyzer, @@ -49165,15 +49143,9 @@ /turf/open/floor/engine/o2, /area/engine/atmos) "caO" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "caP" = ( /obj/structure/chair/office/light, /obj/effect/turf_decal/stripes/line, @@ -49558,19 +49530,6 @@ /area/engine/supermatter{ name = "Thermo-Electric Generator" }) -"cbK" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cbL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -49752,21 +49711,8 @@ /turf/open/floor/plating/airless, /area/router/aux) "ccd" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cce" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -49847,20 +49793,13 @@ /turf/open/floor/plasteel/stairs, /area/maintenance/department/chapel) "ccm" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics2"; + name = "robotics lab shutters" }, -/obj/machinery/mecha_part_fabricator, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass{ - amount = 20; - layer = 3.2 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/turf/open/floor/plating, +/area/router/medsci) "ccn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor/auto{ @@ -49924,9 +49863,7 @@ "cct" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, -/area/science/research{ - name = "Research Sector" - }) +/area/science/robotics/mechbay) "ccu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -50015,16 +49952,23 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/window/westleft{ - name = "Chemistry Desk"; - req_access_txt = "33" - }, /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics2"; + name = "robotics lab shutters" + }, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 8; + icon_state = "left"; + name = "Robotics Desk"; + req_access_txt = "29" + }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/science/robotics/lab) "ccC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -50728,46 +50672,12 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "ceb" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light{ - dir = 1 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics3"; + name = "robotics lab shutters" }, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/storage/belt/utility, -/obj/item/crowbar/large, -/obj/item/multitool, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/mecha_part_fabricator, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass{ - amount = 20; - layer = 3.2 - }, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/robotics/lab) "cec" = ( /obj/structure/table/glass, @@ -51813,28 +51723,25 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cgf" = ( -/obj/structure/table, -/obj/structure/table, -/obj/machinery/reagentgrinder, /obj/effect/turf_decal/tile/purple{ - dir = 4 + dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 9 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/science/robotics/lab) "cgg" = ( /obj/effect/landmark/start/atmospheric_technician, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -51934,19 +51841,17 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "cgr" = ( +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/science/robotics/mechbay"; + dir = 1; + name = "Mech Bay APC"; + pixel_y = 28 + }, /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/power/apc{ - areastring = "/area/science/research"; - dir = 1; - name = "Research Sector APC"; - pixel_y = 24 - }, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/turf/open/floor/plasteel/dark, +/area/science/robotics/mechbay) "cgs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52876,9 +52781,7 @@ dir = 4 }, /turf/closed/wall, -/area/science/research{ - name = "Research Sector" - }) +/area/science/robotics/mechbay) "cip" = ( /obj/machinery/mass_driver{ id = "cargo_in"; @@ -53164,7 +53067,7 @@ "ciW" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8; - sortType = 14 + sortType = 11 }, /obj/structure/cable{ icon_state = "4-8" @@ -53710,23 +53613,24 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cka" = ( -/obj/item/beacon, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "ckb" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/machinery/aug_manipulator, +/obj/machinery/camera/autoname{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "ckc" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/pipe/simple/general/visible, @@ -53758,10 +53662,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/science/research{ name = "Research Sector" @@ -53809,16 +53713,11 @@ c_tag = "Research Maintenance"; dir = 4 }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/department/science"; - dir = 8; - name = "Research Wing Maintenance APC"; - pixel_x = -24 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/turf/open/floor/circuit, +/area/science/robotics/mechbay) "ckl" = ( /turf/open/space/basic, /area/space/station_ruins) @@ -53847,18 +53746,6 @@ /area/engine/engineering{ name = "Engine Room" }) -"ckp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light, -/obj/structure/table, -/obj/item/book/manual/wiki/robotics_cyborgs, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, -/turf/open/floor/plasteel, -/area/science/robotics/lab) "ckq" = ( /obj/structure/closet/crate/hydroponics, /obj/machinery/light_switch{ @@ -53993,31 +53880,10 @@ /turf/open/floor/plasteel, /area/engine/teg_cold) "ckD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/crowbar/large, -/obj/item/multitool, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/machinery/chem_master, +/obj/effect/turf_decal/trimline/yellow/filled/end, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "ckE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -54418,20 +54284,9 @@ /area/library) "clv" = ( /obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/storage/box/syringes, -/obj/item/reagent_containers/dropper, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "clw" = ( /obj/effect/landmark/start/librarian, /obj/machinery/newscaster{ @@ -54899,18 +54754,6 @@ }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/bar) -"cmB" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/science/robotics/lab"; - dir = 4; - name = "Robotics Lab APC"; - pixel_x = 24 - }, -/turf/open/floor/plating, -/area/maintenance/aft) "cmC" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -55064,20 +54907,51 @@ /turf/open/floor/engine, /area/science/xenobiology) "cmR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cmS" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/rack, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cmT" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -55272,14 +55146,10 @@ name = "Research Observatory" }) "cnk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/structure/disposalpipe/segment, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "cnl" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -55770,23 +55640,6 @@ }, /turf/open/floor/plasteel, /area/engine/teg_hot) -"col" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"com" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Robotics Storage"; - req_access_txt = "29" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) "con" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55872,12 +55725,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"cov" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plating, -/area/science/robotics/lab) "cow" = ( /obj/machinery/door/airlock/external/glass{ name = "Asteroid Mining Access"; @@ -55897,11 +55744,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) -"cox" = ( -/obj/machinery/vending/wardrobe/robo_wardrobe, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel, -/area/science/robotics/lab) "coy" = ( /obj/structure/sign/poster/official/safety_internals{ pixel_x = -32 @@ -56008,9 +55850,15 @@ /area/science/explab) "coH" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics2"; + name = "robotics lab shutters" + }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/router/medsci) "coI" = ( /obj/structure/closet/secure_closet/medical1, /obj/effect/turf_decal/tile/yellow{ @@ -56207,6 +56055,8 @@ c_tag = "Medbay - Cryogenics"; dir = 1 }, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2{ name = "Medbay Treatment Center" @@ -56424,36 +56274,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "cpw" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/screwdriver, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Research - Chemistry Lab"; dir = 4 }, -/obj/machinery/requests_console{ - department = "Chemistry"; - departmentType = 1; - name = "Chemistry RC"; - pixel_x = -30; - receive_ore_updates = 1 +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/science/robotics/lab) "cpx" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/mineral/titanium/blue, @@ -56554,13 +56385,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cpI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) "cpJ" = ( /turf/closed/wall/r_wall/rust, /area/quartermaster/office) @@ -57028,28 +56852,11 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cqz" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/clothing/gloves/color/latex, -/obj/item/book/manual/wiki/cit/chem_recipies, -/obj/item/book/manual/wiki/cit/chemistry{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden, -/obj/item/paper/fluff/cogstation/chemists, -/obj/item/reagent_containers/dropper, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel, +/area/science/robotics/lab) "cqA" = ( /obj/structure/cable{ icon_state = "1-2" @@ -57362,24 +57169,9 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "crf" = ( -/obj/structure/cable, -/obj/machinery/power/apc{ - areastring = "/area/medical/chemistry"; - name = "Chemistry Lab APC"; - pixel_y = -26 - }, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) -"crg" = ( -/obj/structure/reagent_dispensers/fueltank/high, -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/dark, +/area/science/robotics/mechbay) "crh" = ( /obj/machinery/mass_driver{ dir = 1; @@ -57884,12 +57676,14 @@ /turf/open/floor/plasteel, /area/security/checkpoint/supply) "csi" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chem1"; + name = "chem lab shutters" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/plating, +/area/medical/chemistry) "csj" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -58189,9 +57983,8 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "csK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/closed/wall, -/area/science/robotics/lab) +/turf/closed/wall/r_wall, +/area/medical/chemistry) "csL" = ( /obj/effect/landmark/xmastree/rdrod, /turf/open/floor/carpet{ @@ -58260,19 +58053,13 @@ /turf/open/floor/plating, /area/storage/tech) "csV" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/mecha_part_fabricator, +/obj/machinery/camera{ + c_tag = "Robotics Lab"; + network = list("ss13","rd") }, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (Common)"; - pixel_y = 26 - }, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "csW" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, @@ -58290,10 +58077,11 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "csZ" = ( -/obj/machinery/holopad, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "cta" = ( /obj/effect/landmark/blobstart, /obj/effect/landmark/xeno_spawn, @@ -59003,20 +58791,9 @@ name = "Research Observatory" }) "cum" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/obj/structure/sign/poster/official/science{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/computer/operating, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cun" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/snacks/meat/steak, @@ -59034,21 +58811,16 @@ /turf/open/floor/plating, /area/hallway/primary/aft) "cup" = ( -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/item/scalpel, -/obj/item/circular_saw{ - pixel_y = 16 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/item/hemostat, -/obj/item/retractor, -/obj/item/cautery, -/obj/item/clothing/gloves/color/latex, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/closet/secure_closet/chemical, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "cuq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -59396,38 +59168,29 @@ /area/medical/medbay/central) "cuY" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Chemistry Lab"; - req_access_txt = "8;33;47" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/chemistry) +/obj/machinery/door/airlock/research{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cuZ" = ( /obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark/side{ + dir = 10 + }, +/area/science/robotics/lab) "cva" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -59577,22 +59340,33 @@ /area/medical/virology) "cvt" = ( /obj/effect/turf_decal/tile/purple{ - dir = 8 + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"cvu" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/dark/side, /area/science/robotics/lab) +"cvu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "cvv" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -59893,56 +59667,37 @@ /area/janitor) "cvQ" = ( /obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/chair/office/light, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"cvR" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/item/clothing/head/welding, -/obj/item/clothing/glasses/welding, -/obj/item/weldingtool, -/obj/machinery/camera{ - c_tag = "Robotics"; - dir = 8; - network = list("ss13","medbay"); - pixel_y = -22 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"cvS" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/item/clothing/glasses/science, -/obj/item/hand_labeler{ - pixel_y = 8 +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -32 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/science/robotics/lab) +"cvR" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/showroomfloor, /area/medical/chemistry) +"cvS" = ( +/obj/machinery/vending/wardrobe/robo_wardrobe, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cvT" = ( /obj/structure/extinguisher_cabinet, /turf/closed/wall, @@ -60062,23 +59817,18 @@ /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) "cwb" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_one_access_txt = "12;47" - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/door/airlock/research{ + name = "Mech Bay"; + req_access_txt = "29" }, -/turf/open/floor/plating, -/area/science/research{ - name = "Research Sector" - }) +/turf/open/floor/circuit, +/area/science/robotics/mechbay) "cwc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -60268,11 +60018,19 @@ /turf/open/floor/plasteel, /area/engine/workshop) "cws" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "cwt" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, @@ -60563,19 +60321,27 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "cxf" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"cxg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"cxh" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 + dir = 4 }, /turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/area/medical/chemistry) +"cxg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/chemistry) +"cxh" = ( +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "cxi" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/yellow{ @@ -61100,10 +60866,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 8; - icon_state = "intact" - }, /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -61181,6 +60943,7 @@ pixel_y = 24 }, /obj/machinery/power/apc{ + dir = 4; name = "Restrooms APC"; pixel_x = 24 }, @@ -61297,17 +61060,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plating, /area/maintenance/aft) -"cyC" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/maintenance/aft) "cyD" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -61408,15 +61160,15 @@ /area/maintenance/aft) "cyN" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Robotics Lab Maintenance"; - req_access_txt = "29" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, +/obj/machinery/door/airlock/maintenance{ + name = "Chemistry Maintenance"; + req_access_txt = "5; 33" + }, /turf/open/floor/plating, -/area/science/robotics/lab) +/area/medical/chemistry) "cyO" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -61782,15 +61534,15 @@ /area/crew_quarters/heads/cmo) "czv" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Morgue"; - req_access_txt = "5;29" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab"; + req_access_txt = "5; 33" + }, /turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/area/medical/chemistry) "czw" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -61898,6 +61650,9 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "czG" = ( @@ -61906,17 +61661,15 @@ /area/medical/morgue) "czH" = ( /obj/effect/turf_decal/tile/purple{ - dir = 8 + dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark/side{ + dir = 6 + }, +/area/science/robotics/lab) "czI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61951,9 +61704,8 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "czM" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/area/medical/chemistry) "czN" = ( /obj/structure/closet/crate/trashcart, /obj/structure/sign/departments/custodian{ @@ -61978,11 +61730,12 @@ /turf/open/floor/plating, /area/maintenance/disposal) "czP" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/area/medical/chemistry) "czQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -62064,10 +61817,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/door/airlock/research/glass{ - name = "Robotics Lab"; - req_access_txt = "29" - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -62075,8 +61824,16 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab"; + req_access_txt = "5; 33" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, -/area/science/robotics/lab) +/area/medical/chemistry) "czX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/orange/hidden, @@ -62142,6 +61899,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cAd" = ( @@ -63860,9 +63620,6 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 8 }, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "cCX" = ( @@ -64384,6 +64141,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/item/stack/cable_coil/red, +/obj/item/stack/cable_coil/red{ + pixel_x = 3 + }, /turf/open/floor/plasteel, /area/gateway) "cDU" = ( @@ -64993,15 +64754,18 @@ name = "Research Sector" }) "cEN" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, /obj/structure/disposalpipe/segment, /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/science/research{ name = "Research Sector" @@ -65012,37 +64776,24 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/airlock/research{ - name = "Chemistry Lab"; - req_access_txt = "8; 33" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, -/area/medical/chemistry) -"cEP" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/door/airlock/research{ + name = "Robotics Lab"; + req_access_txt = "29" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, /obj/structure/cable{ icon_state = "1-2" }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cEP" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cEQ" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -65393,16 +65144,8 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/surgical_drapes, -/obj/item/scalpel, -/obj/item/circular_saw{ - pixel_y = 16 - }, -/obj/item/hemostat, -/obj/item/retractor, -/obj/item/surgicaldrill, -/obj/item/cautery, /obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/plasteel/white, /area/medical/medbay/zone2{ name = "Medbay Treatment Center" @@ -65739,38 +65482,23 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "cFV" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 }, /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cFW" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) "cFX" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -65779,28 +65507,18 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/research/glass{ - name = "Chemistry Lab"; - req_access_txt = "33" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/door/airlock/research{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/turf/open/floor/plasteel/dark, +/area/router/medsci) "cFY" = ( /turf/open/floor/plasteel, /area/router/air) @@ -66424,6 +66142,7 @@ /obj/item/stock_parts/cell/high/plus, /obj/item/stock_parts/cell/high/plus, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/item/stack/cable_coil/red, /turf/open/floor/plasteel/white, /area/science/circuit) "cHg" = ( @@ -66578,14 +66297,8 @@ dir = 8; network = list("ss13","medbay") }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark/side{ - dir = 8 - }, +/turf/open/floor/plasteel/dark, /area/science/explab) "cHw" = ( /obj/structure/disposalpipe/segment, @@ -66660,10 +66373,6 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/power/apc{ areastring = "/area/science/explab"; dir = 4; @@ -66671,9 +66380,7 @@ pixel_x = 24 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel/dark/side{ - dir = 8 - }, +/turf/open/floor/plasteel/dark, /area/science/explab) "cHD" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -66866,14 +66573,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/security/checkpoint/supply) -"cHW" = ( -/obj/machinery/rnd/production/circuit_imprinter, -/obj/item/reagent_containers/glass/beaker, -/obj/structure/sign/poster/official/state_laws{ - pixel_y = 32 - }, -/turf/open/floor/circuit, -/area/science/robotics/lab) "cHX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -68197,12 +67896,24 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "cKi" = ( -/obj/structure/sign/poster/official/space_cops{ - pixel_y = 32 +/obj/machinery/button/door{ + id = "chem1"; + name = "Shutters Control Button"; + pixel_x = -8; + pixel_y = 24; + req_access_txt = "29" }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "cKj" = ( /obj/structure/closet/secure_closet/CMO, /obj/effect/turf_decal/tile/blue, @@ -69789,15 +69500,6 @@ /obj/item/stack/sheet/plasteel/fifty, /turf/open/floor/plating, /area/quartermaster/miningdock/airless) -"cNV" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/robotics/lab) "cNW" = ( /obj/structure/lattice/catwalk, /obj/machinery/camera{ @@ -70483,19 +70185,14 @@ icon_state = "4-8" }, /obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) -"cPw" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/sign/poster/contraband/kss13{ - pixel_y = -32 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plating, -/area/maintenance/department/science{ - name = "Research Maintenance" - }) +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"cPw" = ( +/turf/open/floor/plasteel/dark, +/area/science/robotics/mechbay) "cPx" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -70515,6 +70212,9 @@ /obj/structure/sign/poster/official/medical_green_cross{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cPy" = ( @@ -70714,45 +70414,15 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cPP" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 }, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stock_parts/cell/high/plus{ - pixel_y = 8 +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 }, -/obj/item/stock_parts/cell/high/plus{ - pixel_y = 8 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = -8; - pixel_y = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/chemistry) "cPQ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -71566,7 +71236,7 @@ icon_state = "1-8" }, /obj/machinery/turretid{ - control_area = "area/science/server"; + control_area = "/area/science/server"; icon_state = "control_stun"; name = "Computer Core turret control"; pixel_x = -3; @@ -71574,7 +71244,9 @@ req_access_txt = "65" }, /turf/open/floor/plasteel, -/area/ai_monitored/turret_protected/ai_upload_foyer) +/area/science/server{ + name = "Computer Core" + }) "cVq" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -95269,7 +94941,7 @@ adb anU aaR aqa -amZ +awY adO acN amZ @@ -95280,8 +94952,8 @@ alM axK axX azk -awY -awY +acN +acN azl aJw anU @@ -95375,12 +95047,12 @@ bYF bBP bFu bIc -bBQ -bBQ -bFG +btn +btn +bsM cuY -bCg -bCg +bIk +bIk cbB cbB cbB @@ -95630,14 +95302,14 @@ bYp bYx cPw bBQ -bFE +ccd bId -bIL +cpw cpw bKd cuZ bKN -bCg +bIk aaU aaU aaU @@ -95886,15 +95558,15 @@ bYv bYq cPv bYH -bBQ +bsM bDT bIe -bIM -bIM -bIM +bYB +bto +bYB cvt -bJD -bJH +bSe +ceb aaU aaa aaa @@ -96137,21 +95809,21 @@ bpz aaa aaU bXU -bKs -bKv +aJV +brz bYv cgr bYy crf -bBQ +bsM bFx bIf -bIM +bto csZ -bIM +bto cvQ -bJE -bJH +caO +ceb aaU aaa aaa @@ -96315,7 +95987,7 @@ aCH aew aIn aew -aJV +aFG aew aew ayT @@ -96397,18 +96069,18 @@ bXU bKs bLG bYv -bzA +bYv cwb bYv -bBQ +bsM csV bIe bYB cqz -bIM -cvt +bYB +bua cmS -bJH +ceb aaU aaa aaa @@ -96665,7 +96337,7 @@ cgf bKe czH bKO -bJH +ceb aaU aaa aaa @@ -96831,7 +96503,7 @@ aJt aJN aQg akv -aeJ +aew ayU aSQ aTg @@ -96922,7 +96594,7 @@ cka cmR cFV bKP -bJH +ceb aaU aaa aaa @@ -97088,7 +96760,7 @@ aLf aJO aQi alU -aeJ +aew ayW aSQ aAB @@ -97171,15 +96843,15 @@ cfZ bWX bWX ckf -bCf +bIk bFB bIh -bYK +ccd bJC bKf cFW bKQ -bCg +bIk aaU aaa aaa @@ -97345,7 +97017,7 @@ akv aKa aKw alU -aeJ +aew azc aSQ aAB @@ -97428,15 +97100,15 @@ bXU bXU bXU bWa -bCg +bIk bFC -bIi -caj +bIj +ccd bJD -bCg +btv cFX -bJH -bCg +ccm +cOI cOI cOI cOI @@ -97583,7 +97255,7 @@ alq alq apn aqF -aeJ +aew agD ahr aiH @@ -97685,12 +97357,12 @@ aaU aaU aaU aaU -bCg +bIk clv -bIi -caH +bsU +ccd bJE -bCg +btv cOx cOA cOE @@ -97942,10 +97614,10 @@ aaa aaa aaa aaU -bCg +bIk bZT -bIi -cbK +bsU +ccd ckb coH cOy @@ -98199,12 +97871,12 @@ aaU aaU aaU aaU -bCg +bIk cum bIj ccd cvS -bCg +cOI cOz cOC cOG @@ -98456,12 +98128,12 @@ brU cdZ brU brU -bCg -bFG +bIk +bIk bIk ccB bJH -bCg +cOI cGb bRI cOH @@ -102557,7 +102229,7 @@ bxM cyu cNJ cyB -cyC +cyB cyI cyL buS @@ -102814,7 +102486,7 @@ bbh ciQ bpD bpD -cmB +bpD bpD cyM cyB @@ -103069,16 +102741,16 @@ cgB bqx bbh bPw -bqq -bqq -bqq -bqq -bqq -bqq -bqq -bqq -bqq -bqq +bsZ +bsZ +bsZ +bsZ +csK +csK +csK +csK +csK +csK bHC cFe cFk @@ -103326,17 +102998,17 @@ cgB bqr bbh bPw -bqq -brz -bsL -bSe -bJd +bsZ +bim +bim +bim +csK bQp byw bzG bAC -bCY -bHD +csK +bHG cFf bEl aOF @@ -103583,17 +103255,17 @@ cgB bqr bbh bPw -bqq -cHW -bsM -btn -buj +bsZ +bim +bim +bim +bul bvK -bts -bts -bAD -bCY -bHD +czM +czM +czM +bsN +bHG cFf bJb bJJ @@ -103840,16 +103512,16 @@ cgB bqr bcT bPw -bqq -ccm -bsM -bto -buj +bsZ +bim +bim +bim +bul bwf byD -bts +brK bAE -bCY +bsQ bHE cAm cAt @@ -104095,18 +103767,18 @@ bdF cIL ciF bqz -bdu -caO -cov -ceb -bsN -btp -buj +bcT +bPw +bsZ +bim +bim +bim +bul cup -bts -bts -ckp -bqq +cxf +czM +czM +bsN bHG cFf bJc @@ -104355,15 +104027,15 @@ bqC bdu bXt bqs -brF -bsP +cnk +cnk cnk csi cvu cxf cxh ckD -bqq +csK cPx cFh bJe @@ -104611,19 +104283,19 @@ cjV bdu bdu bXu -bqq -brH -bsQ -col +bsZ +bim +bim +bim bul cws cxg czM bBs -bCY +csK bHI cFf -bJc +btp bJN cHO bKz @@ -104868,15 +104540,15 @@ cgB bTv bcT bQE -bqq -bqq -bqq -com -bqq -cws -byD +bsZ +bim +bim +bim +bul +brH +brJ +czP czP -cxf czW cAc cFi @@ -105125,16 +104797,16 @@ cgB bYW bcT bQE -bqq -cox -cNV -cpI +bsZ +bim +bim +bim csK cKi cvR cPP -bts -bCY +bsL +bul bHJ bIt bJf @@ -105382,16 +105054,16 @@ cgB bbh bbh bQE -bqq -brJ -bsU -crg -bqq +bsZ +bim +bim +bim +csK cyN -bqq +csK bzJ czv -bqq +csK bHK bIu bJh @@ -105639,11 +105311,11 @@ cgB bbh bpm bQE -bqq -brK -bua -btv -bqq +bsZ +bim +bim +bim +bsZ cyO byN bzK @@ -105896,11 +105568,11 @@ cmn bWZ bXj bXv -bqq -bqq -bqq -bqq -bqq +bsZ +bsZ +bsZ +bsZ +bsZ cyP byQ bzS diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm index d409eb1208..e0380d4689 100644 --- a/_maps/map_files/Snaxi/Snaxi.dmm +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -4558,7 +4558,6 @@ department = "Mining"; pixel_x = -30 }, -/obj/structure/closet/crate/bin, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bzj" = ( @@ -10026,6 +10025,7 @@ pixel_x = 32 }, /obj/effect/turf_decal/tile/brown, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/quartermaster/storage) "dDf" = ( @@ -14583,6 +14583,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "goM" = ( @@ -26008,13 +26012,6 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) -"nhO" = ( -/obj/machinery/airalarm/server{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/circuit/telecomms/mainframe, -/area/tcommsat/server) "nij" = ( /obj/machinery/light{ dir = 1 @@ -27176,7 +27173,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/closet/crate/bin, /turf/open/floor/plasteel/white, /area/medical/genetics) "nSf" = ( @@ -28198,7 +28194,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 23 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "ouE" = ( @@ -56119,7 +56117,7 @@ won evJ fsQ mxo -nhO +pTw apJ apJ apJ diff --git a/_maps/shuttles/whiteship_cog.dmm b/_maps/shuttles/whiteship_cog.dmm index 9410682219..9e4463df6b 100644 --- a/_maps/shuttles/whiteship_cog.dmm +++ b/_maps/shuttles/whiteship_cog.dmm @@ -32,11 +32,6 @@ "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{ @@ -64,6 +59,7 @@ /area/shuttle/abandoned) "m" = ( /obj/structure/bed, +/obj/item/bedsheet/orange, /turf/open/floor/plasteel, /area/shuttle/abandoned) "n" = ( @@ -130,7 +126,6 @@ /area/shuttle/abandoned) "x" = ( /obj/machinery/door/firedoor/border_only/closed{ - icon_state = "door_closed"; dir = 4 }, /obj/machinery/door/window/eastright, @@ -174,12 +169,12 @@ 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 }, +/obj/item/gun/energy/laser/retro, /turf/open/floor/plasteel, /area/shuttle/abandoned) "D" = ( @@ -191,7 +186,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/item/gun/energy/e_gun/stun, +/obj/item/gun/energy/laser/retro, /turf/open/floor/plasteel, /area/shuttle/abandoned) "E" = ( @@ -228,12 +223,14 @@ "I" = ( /obj/structure/table/reinforced, /obj/item/clothing/glasses/sunglasses, +/obj/item/gps{ + gpstag = "NTPRS" + }, /turf/open/floor/plasteel/grimy, /area/shuttle/abandoned) "J" = ( /obj/structure/curtain, /obj/machinery/shower{ - name = "shower"; pixel_y = 12 }, /obj/item/soap/nanotrasen, @@ -329,13 +326,13 @@ d "} (5,1,1) = {" d -h +g n n B H n -h +g d "} (6,1,1) = {" diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index b1324000b8..7daf9fa8a3 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -145,4 +145,19 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// If the thing can reflect light (lasers/energy) #define RICOCHET_SHINY (1<<0) /// If the thing can reflect matter (bullets/bomb shrapnel) -#define RICOCHET_HARD (1<<1) \ No newline at end of file +#define RICOCHET_HARD (1<<1) + +#define KEEP_TOGETHER_ORIGINAL "keep_together_original" + +//setter for KEEP_TOGETHER to allow for multiple sources to set and unset it +#define ADD_KEEP_TOGETHER(x, source)\ + if ((x.appearance_flags & KEEP_TOGETHER) && !HAS_TRAIT(x, TRAIT_KEEP_TOGETHER)) ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL); \ + ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\ + x.appearance_flags |= KEEP_TOGETHER + +#define REMOVE_KEEP_TOGETHER(x, source)\ + REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\ + if(HAS_TRAIT_FROM_ONLY(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL))\ + REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL);\ + else if(!HAS_TRAIT(x, TRAIT_KEEP_TOGETHER))\ + x.appearance_flags &= ~KEEP_TOGETHER diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm index c6a3886ed3..b3b65bcf59 100644 --- a/code/__DEFINES/_flags/item_flags.dm +++ b/code/__DEFINES/_flags/item_flags.dm @@ -52,3 +52,4 @@ #define ORGAN_VITAL (1<<4) //Currently only the brain #define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances #define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment. +#define ORGAN_EDIBLE (1<<5) //is a snack? :D \ No newline at end of file diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index db38f1961d..c6b008329a 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -35,6 +35,7 @@ #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) +#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) #define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, list/examine_return_text) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) //Positions for overrides list @@ -140,10 +141,10 @@ #define HEARING_SPEAKER 2 // #define HEARING_LANGUAGE 3 #define HEARING_RAW_MESSAGE 4 - /* #define HEARING_RADIO_FREQ 5 - #define HEARING_SPANS 6 +// #define HEARING_RADIO_FREQ 5 +// #define HEARING_SPANS 6 #define HEARING_MESSAGE_MODE 7 - #define HEARING_SOURCE 8*/ +// #define HEARING_SOURCE 8 #define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) #define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination) @@ -283,6 +284,7 @@ #define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) #define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) #define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable) +#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) #define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays) // THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm! #define COMSIG_ITEM_CHECK_BLOCK "check_block" //from base of obj/item/check_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index a347fd7327..77e8d82aca 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -18,4 +18,8 @@ #define DRINK_VERYGOOD 3 #define DRINK_FANTASTIC 4 #define FOOD_AMAZING 5 -#define RACE_DRINK 6 \ No newline at end of file +#define RACE_DRINK 6 + +#define FOOD_IN_CONTAINER (1<<0) + +#define STOP_SERVING_BREAKFAST (15 MINUTES) diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 5acda2274c..2dd66b9833 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -6,6 +6,7 @@ #define FOOTSTEP_GRASS "grass" #define FOOTSTEP_WATER "water" #define FOOTSTEP_LAVA "lava" +#define FOOTSTEP_MEAT "meat" //barefoot sounds #define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot" #define FOOTSTEP_WOOD_CLAW "woodclaw" @@ -89,6 +90,8 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) //bare footsteps lists @@ -131,6 +134,8 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) //claw footsteps lists @@ -173,6 +178,8 @@ GLOBAL_LIST_INIT(clawfootstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) //heavy footsteps list @@ -189,4 +196,6 @@ GLOBAL_LIST_INIT(heavyfootstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index de9ada7560..90c7c34f8d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -135,6 +135,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat)) +#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog)) + #define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi)) #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index e2ae22345f..72e827a7c8 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -4,8 +4,12 @@ /// Hard materials, such as iron or metal #define MAT_CATEGORY_RIGID "rigid material" +///Use this flag on TRUE if you want the basic recipes +#define MAT_CATEGORY_BASE_RECIPES "basic recipes" + /// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes. #define MATERIAL_COLOR (1<<0) #define MATERIAL_ADD_PREFIX (1<<1) -#define MATERIAL_EFFECTS (1<<2) -#define MATERIAL_AFFECT_STATISTICS (1<<3) \ No newline at end of file +#define MATERIAL_AFFECT_STATISTICS (1<<2) + +#define MATERIAL_SOURCE(mat) "[mat.name]_material" \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 1714bd597f..90bbc2c797 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -432,6 +432,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S //text files #define BRAIN_DAMAGE_FILE "traumas.json" #define ION_FILE "ion_laws.json" +#define REDPILL_FILE "redpill.json" #define PIRATE_NAMES_FILE "pirates.json" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 8d8b9f47ae..fa7758be1f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -98,6 +98,7 @@ #define BRAIN_TRAUMA_MILD /datum/brain_trauma/mild #define BRAIN_TRAUMA_SEVERE /datum/brain_trauma/severe #define BRAIN_TRAUMA_SPECIAL /datum/brain_trauma/special +#define BRAIN_TRAUMA_MAGIC /datum/brain_trauma/magic #define TRAUMA_RESILIENCE_BASIC 1 //Curable with chems #define TRAUMA_RESILIENCE_SURGERY 2 //Curable with brain surgery diff --git a/code/__DEFINES/mobs/slowdowns.dm b/code/__DEFINES/mobs/slowdowns.dm index 2d858e9509..4d9b4a0259 100644 --- a/code/__DEFINES/mobs/slowdowns.dm +++ b/code/__DEFINES/mobs/slowdowns.dm @@ -3,7 +3,7 @@ /// How much someone is slowed from fireman carrying a human #define FIREMAN_CARRY_SLOWDOWN 0 /// How much someone is slowed by piggybacking a human -#define PIGGYBACK_CARRY_SLOWDOWN 1 +#define PIGGYBACK_CARRY_SLOWDOWN 0 /// slowdown when in softcrit. Note that crawling slowdown will also apply at the same time! #define SOFTCRIT_ADD_SLOWDOWN 2 /// slowdown when crawling diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm index 659c0fe11b..60d2321927 100644 --- a/code/__DEFINES/skills/defines.dm +++ b/code/__DEFINES/skills/defines.dm @@ -100,4 +100,10 @@ ///Ascending priority defines. #define MODIFIER_SKILL_PRIORITY_LOW 100 #define MODIFIER_SKILL_PRIORITY_DEF 50 -#define MODIFIER_SKILL_PRIORITY_MAX 1 //max priority, meant for job/antag modifiers so they don't null out other (de)buffs \ No newline at end of file +#define MODIFIER_SKILL_PRIORITY_MAX 1 //max priority, meant for job/antag modifiers so they don't null out other (de)buffs + +// UI Defines +///Categories of skills, these will be displayed alphabetically. +#define SKILL_UI_CAT_ENG "Engineering" +#define SKILL_UI_CAT_MED "Medical" +#define SKILL_UI_CAT_MISC "Misc" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3977b3c085..eb86c52301 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -61,6 +61,12 @@ } while (0) #define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) +#define HAS_TRAIT_FROM_ONLY(target, trait, source) (\ + target.status_traits ?\ + (target.status_traits[trait] ?\ + ((source in target.status_traits[trait]) && (length(target.status_traits) == 1))\ + : FALSE)\ + : FALSE) #define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE) //mob traits @@ -226,6 +232,8 @@ #define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles #define INNATE_TRAIT "innate" +///Used for managing KEEP_TOGETHER in [appearance_flags] +#define TRAIT_KEEP_TOGETHER "keep-together" // item traits #define TRAIT_NODROP "nodrop" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index ba29205452..719735392d 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -69,7 +69,7 @@ /proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) var/total = input.len if (!total) - return "[nothing_text]" + return nothing_text else if (total == 1) return "[input[1]]" else if (total == 2) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 5fb4d05d42..dce4d554b7 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -120,3 +120,8 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_item_block_priority_asc(obj/item/A, obj/item/B) return A.block_priority - B.block_priority + +/proc/cmp_skill_categories(datum/skill/A, datum/skill/B) + if(A.ui_category == B.ui_category) + return sorttext(A.name, B.name) + return sorttext(A.ui_category, B.ui_category) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index fc79c546e7..045ca2c519 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -174,7 +174,7 @@ to_chat(world, "


The round has ended.") if(LAZYLEN(GLOB.round_end_notifiees)) - send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") + world.TgsTargetedChatBroadcast("[GLOB.round_end_notifiees.Join(", ")] the round has ended.", FALSE) for(var/I in round_end_events) var/datum/callback/cb = I diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 598fde2bc3..4c912b9c1e 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -224,5 +224,10 @@ GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these station GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARCHIVED\]", "\[EXPLETIVE DELETED\]", "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]", "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]", "\[ACCESS DENIED\]")) - GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) + +GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "declares", "bellows", "buzzes" ,"beeps", "chirps" ,"hisses" ,"poofs" ,"rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters")) + +GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc)) + + diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d4ec44a641..059f9d518e 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -108,7 +108,7 @@ A.attack_animal(src) /atom/proc/attack_animal(mob/user) - return + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) /mob/living/RestrainedClickOn(atom/A) return diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 8f34901d46..31431ddab9 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -104,7 +104,9 @@ var/list/lines = world.file2list("[directory]/[filename]") var/list/_entries = entries var/list/postload_required = list() + var/linenumber = 0 for(var/L in lines) + linenumber++ L = trim(L) if(!L) continue @@ -132,7 +134,7 @@ if(entry == "$include") if(!value) - log_config("Warning: Invalid $include directive: [value]") + log_config("LINE [linenumber]: Invalid $include directive: [value]") else LoadEntries(value, stack) ++. @@ -140,7 +142,7 @@ var/datum/config_entry/E = _entries[entry] if(!E) - log_config("Unknown setting in configuration: '[entry]'") + log_config("LINE [linenumber]: Unknown setting: '[entry]'") continue if(lockthis) @@ -150,7 +152,7 @@ var/datum/config_entry/new_ver = entries_by_type[E.deprecated_by] var/new_value = E.DeprecationUpdate(value) var/good_update = istext(new_value) - log_config("Entry [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]") + log_config("LINE [linenumber]: [entry] is deprecated and will be removed soon. Migrate to [new_ver.name]![good_update ? " Suggested new value is: [new_value]" : ""]") if(!warned_deprecated_configs) addtimer(CALLBACK(GLOBAL_PROC, /proc/message_admins, "This server is using deprecated configuration settings. Please check the logs and update accordingly."), 0) warned_deprecated_configs = TRUE @@ -162,10 +164,10 @@ var/validated = E.ValidateAndSet(value, TRUE) if(!validated) - log_config("Failed to validate setting \"[value]\" for [entry]") + log_config("LINE [linenumber]: Failed to validate setting \"[value]\" for [entry]") else if(E.modified && !E.dupes_allowed) - log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") + log_config("LINE [linenumber]: Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") if(E.postload_required) postload_required[E] = TRUE diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 435a35c05e..5765f291e9 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -168,12 +168,14 @@ /datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game -/datum/config_entry/flag/no_summon_guns //No +/datum/config_entry/flag/no_summon_guns //No /datum/config_entry/flag/no_summon_magic //Fun /datum/config_entry/flag/no_summon_events //Allowed +/datum/config_entry/flag/no_summon_traumas //! + /datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes. /datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index abc46cba25..2e4e728191 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(events) var/frequency_upper = 6000 //10 minutes upper bound. Basically an event will happen every 3 to 10 minutes. var/list/holidays //List of all holidays occuring today or null if no holidays - var/wizardmode = 0 + var/wizardmode = FALSE /datum/controller/subsystem/events/Initialize(time, zlevel) for(var/type in typesof(/datum/round_event_control)) @@ -91,6 +91,7 @@ SUBSYSTEM_DEF(events) if(. == EVENT_CANT_RUN)//we couldn't run this event for some reason, set its max_occurrences to 0 E.max_occurrences = 0 else if(. == EVENT_READY) + E.random = TRUE E.runEvent(TRUE) //allows a client to trigger an event diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 7c51ba4506..32936af9e9 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -64,19 +64,33 @@ SUBSYSTEM_DEF(input) // Misc macroset_classic_input["Tab"] = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_HOTKEYS] map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"" macroset_classic_input["Escape"] = "\".winset \\\"input.text=\\\"\\\"\\\"\"" - + // FINALLY, WE CAN DO SOMETHING MORE NORMAL FOR THE SNOWFLAKE-BUT-LESS KEYSET. + + // HAHA - SIKE. Because of BYOND weirdness (tl;dr not specifically binding this way results in potentially duplicate chatboxes when + // conflicts occur with something like say indicator vs say), we're going to snowflake this anyways + var/list/hard_binds = list( + "O" = "ooc", + "T" = "say", + "L" = "looc", + "M" = "me" + ) + var/list/hard_bind_anti_collision = list() + var/list/anti_collision_modifiers = list("Ctrl", "Alt", "Shift", "Ctrl+Alt", "Ctrl+Shift", "Alt+Shift", "Ctrl+Alt+Shift") + for(var/key in hard_binds) + for(var/modifier in anti_collision_modifiers) + hard_bind_anti_collision["[modifier]+[key]"] = ".NONSENSICAL_VERB_THAT_DOES_NOTHING" + macroset_classic_hotkey = list( "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", "Tab" = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_INPUT] input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", - "O" = "ooc", - "T" = "say", - "L" = "looc", - "M" = "me" ) + + macroset_classic_hotkey |= hard_binds + macroset_classic_hotkey |= hard_bind_anti_collision // And finally, the modern set. macroset_hotkey = list( @@ -85,11 +99,10 @@ SUBSYSTEM_DEF(input) "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", - "O" = "ooc", - "T" = "say", - "L" = "looc", - "M" = "me" ) + + macroset_hotkey |= hard_binds + macroset_hotkey |= hard_bind_anti_collision // Badmins just wanna have fun ♪ /datum/controller/subsystem/input/proc/refresh_client_macro_sets() @@ -104,3 +117,8 @@ SUBSYSTEM_DEF(input) for(var/i in 1 to clients.len) var/client/C = clients[i] C.keyLoop() + +/// *sigh +/client/verb/NONSENSICAL_VERB_THAT_DOES_NOTHING() + set name = ".NONSENSICAL_VERB_THAT_DOES_NOTHING" + set hidden = TRUE diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 96d733e8da..23d5a7a2b7 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -10,24 +10,52 @@ SUBSYSTEM_DEF(materials) var/list/materials ///Dictionary of category || list of material refs var/list/materials_by_category + ///Dictionary of category || list of material types, mostly used by rnd machines like autolathes. + var/list/materialtypes_by_category + ///A cache of all material combinations that have been used + var/list/list/material_combos ///List of stackcrafting recipes for materials using rigid materials var/list/rigid_stack_recipes = list( new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), new /datum/stack_recipe("toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), new /datum/stack_recipe("sink", /obj/structure/sink/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), + new /datum/stack_recipe("Floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE) ) ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() materials = list() materials_by_category = list() + materialtypes_by_category = list() + material_combos = list() for(var/type in subtypesof(/datum/material)) var/datum/material/ref = new type materials[type] = ref for(var/c in ref.categories) materials_by_category[c] += list(ref) + materialtypes_by_category[c] += list(type) /datum/controller/subsystem/materials/proc/GetMaterialRef(datum/material/fakemat) if(!materials) InitializeMaterials() - return materials[fakemat] || fakemat \ No newline at end of file + return materials[fakemat] || fakemat + + +///Returns a list to be used as an object's custom_materials. Lists will be cached and re-used based on the parameters. +/datum/controller/subsystem/materials/proc/FindOrCreateMaterialCombo(list/materials_declaration, multiplier) + if(!material_combos) + InitializeMaterials() + var/list/combo_params = list() + for(var/x in materials_declaration) + var/datum/material/mat = x + var/path_name = ispath(mat) ? "[mat]" : "[mat.type]" + combo_params += "[path_name]=[materials_declaration[mat] * multiplier]" + sortTim(combo_params, /proc/cmp_text_asc) // We have to sort now in case the declaration was not in order + var/combo_index = combo_params.Join("-") + var/list/combo = material_combos[combo_index] + if(!combo) + combo = list() + for(var/mat in materials_declaration) + combo[GetMaterialRef(mat)] = materials_declaration[mat] * multiplier + material_combos[combo_index] = combo + return combo diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index 249907a1b8..ff04ceead9 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -5,6 +5,61 @@ /datum/brain_trauma/magic resilience = TRAUMA_RESILIENCE_LOBOTOMY +/datum/brain_trauma/magic/lumiphobia + name = "Lumiphobia" + desc = "Patient has an inexplicable adverse reaction to light." + scan_desc = "light hypersensitivity" + gain_text = "You feel a craving for darkness." + lose_text = "Light no longer bothers you." + var/next_damage_warning = 0 + +/datum/brain_trauma/magic/lumiphobia/on_life() + ..() + var/turf/T = owner.loc + if(istype(T)) + var/light_amount = T.get_lumcount() + if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying + if(world.time > next_damage_warning) + to_chat(owner, "The light burns you!") + next_damage_warning = world.time + 100 //Avoid spamming + owner.take_overall_damage(0,3) + +/datum/brain_trauma/magic/poltergeist + name = "Poltergeist" + desc = "Patient appears to be targeted by a violent invisible entity." + scan_desc = "paranormal activity" + gain_text = "You feel a hateful presence close to you." + lose_text = "You feel the hateful presence fade away." + +/datum/brain_trauma/magic/poltergeist/on_life() + ..() + if(prob(4)) + var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else + var/obj/item/throwing + for(var/obj/item/I in view(5, get_turf(owner))) + if(I.anchored) + continue + if(I.throwforce > most_violent) + most_violent = I.throwforce + throwing = I + if(throwing) + throwing.throw_at(owner, 8, 2) + +/datum/brain_trauma/magic/antimagic + name = "Athaumasia" + desc = "Patient is completely inert to magical forces." + scan_desc = "thaumic blank" + gain_text = "You realize that magic cannot be real." + lose_text = "You realize that magic might be real." + +/datum/brain_trauma/magic/antimagic/on_gain() + ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAUMA_TRAIT) + ..() + +/datum/brain_trauma/magic/antimagic/on_lose() + REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAUMA_TRAIT) + ..() + /datum/brain_trauma/magic/stalker name = "Stalking Phantom" desc = "Patient is stalked by a phantom only they can see." diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index cd8612fd19..3ba00d305b 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -119,8 +119,9 @@ /datum/brain_trauma/severe/paralysis/spinesnapped random_gain = FALSE + clonable = FALSE paralysis_type = "legs" - resilience = TRAUMA_RESILIENCE_LOBOTOMY + resilience = TRAUMA_RESILIENCE_LOBOTOMY // It shouldn't fix severed spinal cords really, but there is no specific surgery for that yet. /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" diff --git a/code/datums/components/crafting/glassware/lens_crafting.dm b/code/datums/components/crafting/glassware/lens_crafting.dm index 117df25a30..98fa242058 100644 --- a/code/datums/components/crafting/glassware/lens_crafting.dm +++ b/code/datums/components/crafting/glassware/lens_crafting.dm @@ -92,7 +92,7 @@ qdel(src) /obj/item/glasswork/glasses - name = "Hand Made Glasses" - desc = "Hande made glasses that have not been polished at all making them useless. Selling them could still be worth a bit of credits." + name = "Handmade Glasses" + desc = "Handmade glasses that have not been polished at all making them useless. Selling them could still be worth a few credits." icon = 'icons/obj/glass_ware.dmi' icon_state = "frames_2" \ No newline at end of file diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index b076407efc..63ef711858 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -92,7 +92,7 @@ time = 150 subcategory = CAT_MISCELLANEOUS category = CAT_MISC - always_availible = FALSE // Disabled til learned + always_availible = FALSE // Disabled until learned /datum/crafting_recipe/bloodsucker/candelabrum diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm new file mode 100644 index 0000000000..47e60a1ee1 --- /dev/null +++ b/code/datums/components/edible.dm @@ -0,0 +1,244 @@ +/*! +This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items). +These items take a specific time to eat, and can do most of the things our original food items could. +Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else: + Components: + Drying component (jerky etc) + Customizable component (custom pizzas etc) + Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.) + Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents) + Misc: + Something for cakes (You can store things inside) +*/ +/datum/component/edible + ///Amount of reagents taken per bite + var/bite_consumption = 2 + ///Amount of bites taken so far + var/bitecount = 0 + ///Flags for food + var/food_flags = NONE + ///Bitfield of the types of this food + var/foodtypes = NONE + ///Amount of seconds it takes to eat this food + var/eat_time = 30 + ///Defines how much it lowers someones satiety (Need to eat, essentialy) + var/junkiness = 0 + ///Message to send when eating + var/list/eatverbs + ///Callback to be ran for when you take a bite of something + var/datum/callback/after_eat + ///Last time we checked for food likes + var/last_check_time + +/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, .proc/UseByAnimal) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/UseFromHand) + else if(isturf(parent)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/TryToEatTurf) + + src.bite_consumption = bite_consumption + src.food_flags = food_flags + src.foodtypes = foodtypes + src.eat_time = eat_time + src.eatverbs = eatverbs + src.junkiness = junkiness + src.after_eat = after_eat + + var/atom/owner = parent + + owner.create_reagents(volume, INJECTABLE) + + if(initial_reagents) + for(var/rid in initial_reagents) + var/amount = initial_reagents[rid] + if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) + owner.reagents.add_reagent(rid, amount, tastes.Copy()) + else + owner.reagents.add_reagent(rid, amount) + +/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) + if(!(food_flags & FOOD_IN_CONTAINER)) + switch (bitecount) + if (0) + return + if(1) + examine_list += "[parent] was bitten by someone!" + if(2,3) + examine_list += "[parent] was bitten [bitecount] times!" + else + examine_list += "[parent] was bitten multiple times!" + +/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) + return TryToEat(M, user) + +/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user) + return TryToEat(user, user) + +///All the checks for the act of eating itself and +/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder) + + set waitfor = FALSE + + var/atom/owner = parent + + if(feeder.a_intent == INTENT_HARM) + return + if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it. + to_chat(feeder, "None of [owner] left, oh no!") + if(isturf(parent)) + var/turf/T = parent + T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) + else + qdel(parent) + return + if(!CanConsume(eater, feeder)) + return + var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this + for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting + fullness += C.nutriment_factor * C.volume / C.metabolization_rate + + . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose + + if(eater == feeder)//If you're eating it yourself. + if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time + return + var/eatverb = pick(eatverbs) + if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) + to_chat(eater, "You don't feel like eating any more junk food at the moment!") + return + else if(fullness <= 50) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!") + else if(fullness > 50 && fullness < 150) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].") + else if(fullness > 150 && fullness < 500) + eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].") + else if(fullness > 500 && fullness < 600) + eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].") + else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat + eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!") + return + else //If you're feeding it to someone else. + if(isbrain(eater)) + to_chat(feeder, "[eater] doesn't seem to have a mouth!") + return + if(fullness <= (600 * (1 + eater.overeatduration / 1000))) + eater.visible_message("[feeder] attempts to feed [eater] [parent].", \ + "[feeder] attempts to feed you [parent].") + else + eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \ + "[feeder] cannot force any more of [parent] down your throat!") + return + if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed + return + + log_combat(feeder, eater, "fed", owner.reagents.log_list()) + eater.visible_message("[feeder] forces [eater] to eat [parent]!", \ + "[feeder] forces you to eat [parent]!") + + TakeBite(eater, feeder) + +///This function lets the eater take a bite and transfers the reagents to the eater. +/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder) + + var/atom/owner = parent + + if(!owner?.reagents) + return FALSE + if(eater.satiety > -200) + eater.satiety -= junkiness + playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) + if(owner.reagents.total_volume) + SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder) + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) + owner.reagents.reaction(eater, INGEST, fraction) + owner.reagents.trans_to(eater, bite_consumption) + bitecount++ + On_Consume(eater) + checkLiked(fraction, eater) + + //Invoke our after eat callback if it is valid + if(after_eat) + after_eat.Invoke(eater, feeder) + + return TRUE + +///Checks whether or not the eater can actually consume the food +/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder) + if(!iscarbon(eater)) + return FALSE + var/mob/living/carbon/C = eater + var/covered = "" + if(C.is_mouth_covered(head_only = 1)) + covered = "headgear" + else if(C.is_mouth_covered(mask_only = 1)) + covered = "mask" + if(covered) + var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" + to_chat(feeder, "You have to remove [who] [covered] first!") + return FALSE + return TRUE + +///Check foodtypes to see if we should send a moodlet +/datum/component/edible/proc/checkLiked(var/fraction, mob/M) + if(last_check_time + 50 > world.time) + return FALSE + if(!ishuman(M)) + return FALSE + var/mob/living/carbon/human/H = M + if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food) + to_chat(H, "You don't feel so good...") + H.adjust_disgust(25 + 30 * fraction) + else + if(foodtypes & H.dna.species.toxic_food) + to_chat(H,"What the hell was that thing?!") + H.adjust_disgust(25 + 30 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) + else if(foodtypes & H.dna.species.disliked_food) + to_chat(H,"That didn't taste very good...") + H.adjust_disgust(11 + 15 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) + else if(foodtypes & H.dna.species.liked_food) + to_chat(H,"I love this taste!") + H.adjust_disgust(-5 + -2.5 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) + if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) + last_check_time = world.time + +///Delete the item when it is fully eaten +/datum/component/edible/proc/On_Consume(mob/living/eater) + + var/atom/owner = parent + + if(!eater) + return + if(!owner.reagents.total_volume) + if(isturf(parent)) + var/turf/T = parent + T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) + else + qdel(parent) + +///Ability to feed food to puppers +/datum/component/edible/proc/UseByAnimal(datum/source, mob/user) + + var/atom/owner = parent + + if(!isdog(user)) + return + var/mob/living/L = user + if(bitecount == 0 || prob(50)) + L.emote("me", 1, "nibbles away at \the [parent]") + bitecount++ + . = COMPONENT_ITEM_NO_ATTACK + L.taste(owner.reagents) // why should carbons get all the fun? + if(bitecount >= 5) + var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was") + if(sattisfaction_text) + L.emote("me", 1, "[sattisfaction_text]") + qdel(parent) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index decc2dd65c..f12e8bf007 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -69,8 +69,9 @@ out += "[out ? " and it " : "[master] "]seems to be glowing a bit." if(RAD_AMOUNT_HIGH to INFINITY) //At this level the object can contaminate other objects out += "[out ? " and it " : "[master] "]hurts to look at." - else - out += "." + if(!LAZYLEN(out)) + return + out += "." examine_list += out.Join() /datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index d72dcbd362..e90eededd9 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -20,11 +20,11 @@ /datum/disease/transformation/Copy() var/datum/disease/transformation/D = ..() - D.stage1 = stage1.Copy() - D.stage2 = stage2.Copy() - D.stage3 = stage3.Copy() - D.stage4 = stage4.Copy() - D.stage5 = stage5.Copy() + D.stage1 = stage1?.Copy() + D.stage2 = stage2?.Copy() + D.stage3 = stage3?.Copy() + D.stage4 = stage4?.Copy() + D.stage5 = stage5?.Copy() D.new_form = D.new_form return D diff --git a/code/datums/elements/beauty.dm b/code/datums/elements/beauty.dm index 8acfda73e1..8895026967 100644 --- a/code/datums/elements/beauty.dm +++ b/code/datums/elements/beauty.dm @@ -8,8 +8,11 @@ if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target)) return ELEMENT_INCOMPATIBLE beauty = beautyamount - RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area) - RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area) + + if(ismovable(target)) + RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area) + RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area) + var/area/A = get_area(target) if(A) enter_area(null, A) diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index bafb6fbf0e..f110d5e8ed 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -23,10 +23,14 @@ var/end_sound var/chance var/volume = 100 + var/vary = FALSE var/max_loops var/direct + var/extra_range = 0 + var/falloff var/timerid + var/init_timerid /datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE) if(!mid_sounds) @@ -47,13 +51,15 @@ /datum/looping_sound/proc/start(atom/add_thing) if(add_thing) output_atoms |= add_thing - if(timerid) + if(timerid || init_timerid) return on_start() /datum/looping_sound/proc/stop(atom/remove_thing) if(remove_thing) output_atoms -= remove_thing + if(init_timerid) + deltimer(init_timerid) if(!timerid) return on_stop() @@ -80,7 +86,7 @@ if(direct) SEND_SOUND(thing, S) else - playsound(thing, S, volume) + playsound(thing, S, volume, vary, extra_range, falloff) /datum/looping_sound/proc/get_sound(starttime, _mid_sounds) . = _mid_sounds || mid_sounds @@ -92,7 +98,7 @@ if(start_sound) play(start_sound) start_wait = start_length - addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME) + init_timerid = addtimer(CALLBACK(src, .proc/sound_loop), start_wait, TIMER_CLIENT_TIME | TIMER_STOPPABLE) /datum/looping_sound/proc/on_stop() if(end_sound) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 1a8ce755e1..5148aab4ac 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -6,8 +6,6 @@ Simple datum which is instanced once per type and is used for every object of sa /datum/material var/name = "material" var/desc = "its..stuff." - ///Var that's mostly used by science machines to identify specific materials, should most likely be phased out at some point - var/id = "mat" ///Base color of the material, is used for greyscale. Item isn't changed in color if this is null. var/color ///Base alpha of the material, is used for greyscale icons. @@ -26,6 +24,20 @@ Simple datum which is instanced once per type and is used for every object of sa var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) ///How beautiful is this material per unit? var/beauty_modifier = 0 + ///Can be used to override the sound items make, lets add some SLOSHing. + var/item_sound_override + ///Can be used to override the stepsound a turf makes. MORE SLOOOSH + var/turf_sound_override + ///what texture icon state to overlay + var/texture_layer_icon_state + ///a cached filter for the texture icon + var/cached_texture_filter + +/datum/material/New() + . = ..() + if(texture_layer_icon_state) + var/texture_icon = icon('icons/materials/composite.dmi', texture_layer_icon_state) + cached_texture_filter = filter(type="layer", icon=texture_icon, blend_mode = BLEND_INSET_OVERLAY) ///This proc is called when the material is added to an object. /datum/material/proc/on_applied(atom/source, amount, material_flags) @@ -34,16 +46,27 @@ Simple datum which is instanced once per type and is used for every object of sa source.add_atom_colour(color, FIXED_COLOUR_PRIORITY) if(alpha) source.alpha = alpha + if(texture_layer_icon_state) + ADD_KEEP_TOGETHER(source, MATERIAL_SOURCE(src)) + source.filters += cached_texture_filter if(material_flags & MATERIAL_ADD_PREFIX) source.name = "[name] [source.name]" - if(istype(source, /obj)) //objs - on_applied_obj(source, amount, material_flags) - if(beauty_modifier) addtimer(CALLBACK(source, /datum.proc/_AddElement, list(/datum/element/beauty, beauty_modifier * amount)), 0) + if(istype(source, /obj)) //objs + on_applied_obj(source, amount, material_flags) + + else if(isturf(source, /turf)) //turfs + on_applied_turf(source, amount, material_flags) + + source.mat_update_desc(src) + +///This proc is called when a material updates an object's description +/atom/proc/mat_update_desc(/datum/material/mat) + return ///This proc is called when the material is added to an object specifically. /datum/material/proc/on_applied_obj(var/obj/o, amount, material_flags) if(material_flags & MATERIAL_AFFECT_STATISTICS) @@ -61,6 +84,24 @@ Simple datum which is instanced once per type and is used for every object of sa for(var/i in current_armor) temp_armor_list[i] = current_armor[i] * armor_modifiers[i] o.armor = getArmor(arglist(temp_armor_list)) + if(!isitem(o)) + return + var/obj/item/I = o + if(!item_sound_override) + return + I.hitsound = item_sound_override + I.usesound = item_sound_override + I.throwhitsound = item_sound_override + +/datum/material/proc/on_applied_turf(var/turf/T, amount, material_flags) + if(isopenturf(T)) + if(!turf_sound_override) + return + var/turf/open/O = T + O.footstep = turf_sound_override + O.barefootstep = turf_sound_override + O.clawfootstep = turf_sound_override + O.heavyfootstep = turf_sound_override ///This proc is called when the material is removed from an object. /datum/material/proc/on_removed(atom/source, material_flags) @@ -68,6 +109,9 @@ Simple datum which is instanced once per type and is used for every object of sa if(color) source.remove_atom_colour(FIXED_COLOUR_PRIORITY, color) source.alpha = initial(source.alpha) + if(texture_layer_icon_state) + source.filters -= cached_texture_filter + REMOVE_KEEP_TOGETHER(source, MATERIAL_SOURCE(src)) if(material_flags & MATERIAL_ADD_PREFIX) source.name = initial(source.name) @@ -75,10 +119,16 @@ Simple datum which is instanced once per type and is used for every object of sa if(istype(source, /obj)) //objs on_removed_obj(source, material_flags) + else if(istype(source, /turf)) //turfs + on_removed_turf(source, material_flags) + ///This proc is called when the material is removed from an object specifically. -/datum/material/proc/on_removed_obj(var/obj/o, amount, material_flags) +/datum/material/proc/on_removed_obj(obj/o, material_flags) if(material_flags & MATERIAL_AFFECT_STATISTICS) var/new_max_integrity = initial(o.max_integrity) o.modify_max_integrity(new_max_integrity) o.force = initial(o.force) o.throwforce = initial(o.throwforce) + +/datum/material/proc/on_removed_turf(turf/T, material_flags) + return diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index d4921a04d2..721af65449 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -1,21 +1,19 @@ ///Has no special properties. /datum/material/iron name = "iron" - id = "iron" desc = "Common iron ore often found in sedimentary and igneous layers of the crust." color = "#878687" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/metal value_per_unit = 0.0025 ///Breaks extremely easily but is transparent. /datum/material/glass name = "glass" - id = "glass" desc = "Glass forged by melting sand." color = "#88cdf1" alpha = 150 - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass value_per_unit = 0.0025 @@ -30,10 +28,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Has no special properties. Could be good against vampires in the future perhaps. /datum/material/silver name = "silver" - id = "silver" desc = "Silver" color = list(255/255, 284/255, 302/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver value_per_unit = 0.025 beauty_modifier = 0.075 @@ -41,11 +38,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Slight force increase /datum/material/gold name = "gold" - id = "gold" desc = "Gold" color = list(340/255, 240/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //gold is shiny, but not as bright as bananium strength_modifier = 1.2 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold value_per_unit = 0.0625 beauty_modifier = 0.15 @@ -54,11 +50,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Has no special properties /datum/material/diamond name = "diamond" - id = "diamond" desc = "Highly pressurized carbon" color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) alpha = 132 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond value_per_unit = 0.25 beauty_modifier = 0.3 @@ -67,10 +62,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Is slightly radioactive /datum/material/uranium name = "uranium" - id = "uranium" desc = "Uranium" color = rgb(48, 237, 26) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium value_per_unit = 0.05 beauty_modifier = 0.3 //It shines so beautiful @@ -88,10 +82,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Adds firestacks on hit (Still needs support to turn into gas on destruction) /datum/material/plasma name = "plasma" - id = "plasma" desc = "Isn't plasma a state of matter? Oh whatever." color = list(298/255, 46/255, 352/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma value_per_unit = 0.1 beauty_modifier = 0.15 @@ -111,7 +104,6 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) /datum/material/bluespace name = "bluespace crystal" - id = "bluespace_crystal" desc = "Crystals with bluespace properties" color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) alpha = 200 @@ -123,10 +115,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Honks and slips /datum/material/bananium name = "bananium" - id = "bananium" desc = "Material with hilarious properties" color = list(460/255, 464/255, 0, 0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //obnoxiously bright yellow - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium value_per_unit = 0.5 beauty_modifier = 0.5 @@ -146,11 +137,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Mediocre force increase /datum/material/titanium name = "titanium" - id = "titanium" desc = "Titanium" color = "#b3c0c7" strength_modifier = 1.3 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium value_per_unit = 0.0625 beauty_modifier = 0.05 @@ -158,11 +148,10 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/runite name = "runite" - id = "runite" desc = "Runite" color = "#3F9995" strength_modifier = 1.3 - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/runite beauty_modifier = 0.5 armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. @@ -170,7 +159,6 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Force decrease /datum/material/plastic name = "plastic" - id = "plastic" desc = "Plastic" color = "#caccd9" strength_modifier = 0.85 @@ -182,7 +170,6 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Force decrease and mushy sound effect. (Not yet implemented) /datum/material/biomass name = "biomass" - id = "biomass" desc = "Organic matter" color = "#735b4d" strength_modifier = 0.8 @@ -190,12 +177,11 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/wood name = "wood" - id = "wood" desc = "Flexible, durable, but flamable. Hard to come across in space." color = "#bb8e53" strength_modifier = 0.5 sheet_type = /obj/item/stack/sheet/mineral/wood - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) value_per_unit = 0.06 beauty_modifier = 0.1 armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 0.4, "energy" = 0.4, "bomb" = 1, "bio" = 0.2, "rad" = 0, "fire" = 0, "acid" = 0.3) @@ -215,11 +201,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Stronk force increase /datum/material/adamantine name = "adamantine" - id = "adamantine" desc = "A powerful material made out of magic, I mean science!" color = "#6d7e8e" strength_modifier = 1.5 - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/adamantine value_per_unit = 0.25 beauty_modifier = 0.4 @@ -228,10 +213,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///RPG Magic. (Admin only) /datum/material/mythril name = "mythril" - id = "mythril" desc = "How this even exists is byond me" color = "#f2d5d7" - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/mythril value_per_unit = 0.75 beauty_modifier = 0.5 @@ -246,3 +230,134 @@ Unless you know what you're doing, only use the first three numbers. They're in . = ..() if(istype(source, /obj/item)) qdel(source.GetComponent(/datum/component/fantasy)) + +//I don't like sand. It's coarse, and rough, and irritating, and it gets everywhere. +/datum/material/sand + name = "sand" + desc = "You know, it's amazing just how structurally sound sand can be." + color = "#EDC9AF" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/sandblock + value_per_unit = 0.001 + strength_modifier = 0.5 + integrity_modifier = 0.1 + armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 1.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = 0.25 + turf_sound_override = FOOTSTEP_SAND + texture_layer_icon_state = "sand" + +//And now for our lavaland dwelling friends, sand, but in stone form! Truly revolutionary. +/datum/material/sandstone + name = "sandstone" + desc = "Bialtaakid 'ant taerif ma hdha." + color = "#B77D31" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/mineral/sandstone + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 1.25, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = 0.3 + turf_sound_override = FOOTSTEP_WOOD + texture_layer_icon_state = "brick" + +/datum/material/snow + name = "snow" + desc = "There's no business like snow business." + color = "#FFFFFF" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/mineral/snow + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0.25, "acid" = 1.5) + beauty_modifier = 0.3 + turf_sound_override = FOOTSTEP_SAND + texture_layer_icon_state = "sand" + +/datum/material/runedmetal + name = "runed metal" + desc = "Mir'ntrath barhah Nar'sie." + color = "#3C3434" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/runed_metal + value_per_unit = 0.75 + armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = -0.15 + texture_layer_icon_state = "runed" + +/datum/material/bronze + name = "bronze" + desc = "Clock Cult? Never heard of it." + color = "#92661A" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/tile/bronze + value_per_unit = 0.025 + armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = 0.2 + +/datum/material/paper + name = "paper" + desc = "Ten thousand folds of pure starchy power." + color = "#E5DCD5" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/paperframes + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.1, "bullet" = 0.1, "laser" = 0.1, "energy" = 0.1, "bomb" = 0.1, "bio" = 0.1, "rad" = 1.5, "fire" = 0, "acid" = 1.5) + beauty_modifier = 0.3 + turf_sound_override = FOOTSTEP_SAND + texture_layer_icon_state = "paper" + +/datum/material/paper/on_applied_obj(obj/source, amount, material_flags) + . = ..() + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/paper = source + paper.resistance_flags |= FLAMMABLE + paper.obj_flags |= UNIQUE_RENAME + +/datum/material/paper/on_removed_obj(obj/source, material_flags) + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/paper = source + paper.resistance_flags &= ~FLAMMABLE + return ..() + +/datum/material/cardboard + name = "cardboard" + desc = "They say cardboard is used by hobos to make incredible things." + color = "#5F625C" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/cardboard + value_per_unit = 0.003 + armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0, "acid" = 1.5) + beauty_modifier = -0.1 + +/datum/material/cardboard/on_applied_obj(obj/source, amount, material_flags) + . = ..() + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/cardboard = source + cardboard.resistance_flags |= FLAMMABLE + cardboard.obj_flags |= UNIQUE_RENAME + +/datum/material/cardboard/on_removed_obj(obj/source, material_flags) + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/cardboard = source + cardboard.resistance_flags &= ~FLAMMABLE + return ..() + +/datum/material/bone + name = "bone" + desc = "Man, building with this will make you the coolest caveman on the block." + color = "#e3dac9" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/bone + value_per_unit = 0.05 + armor_modifiers = list("melee" = 1.2, "bullet" = 0.75, "laser" = 0.75, "energy" = 1.2, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = -0.2 + +/datum/material/bamboo + name = "bamboo" + desc = "If it's good enough for pandas, it's good enough for you." + color = "#339933" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/mineral/bamboo + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 0.5, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.51, "rad" = 1.5, "fire" = 0.5, "acid" = 1.5) + beauty_modifier = 0.2 + turf_sound_override = FOOTSTEP_WOOD + texture_layer_icon_state = "bamboo" diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm new file mode 100644 index 0000000000..14a373f2d2 --- /dev/null +++ b/code/datums/materials/meat.dm @@ -0,0 +1,32 @@ +///It's gross, gets the name of it's owner, and is all kinds of fucked up +/datum/material/meat + name = "meat" + desc = "Meat" + color = rgb(214, 67, 67) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/meat + value_per_unit = 0.05 + beauty_modifier = -0.3 + strength_modifier = 0.7 + armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1) + item_sound_override = 'sound/effects/meatslap.ogg' + turf_sound_override = FOOTSTEP_MEAT + texture_layer_icon_state = "meat" + +/datum/material/meat/on_removed(atom/source, material_flags) + . = ..() + qdel(source.GetComponent(/datum/component/edible)) + +/datum/material/meat/on_applied_obj(obj/O, amount, material_flags) + . = ..() + O.obj_flags |= UNIQUE_RENAME //So you can name it after the person its made from, a depressing comprimise. + make_edible(O, amount, material_flags) + +/datum/material/meat/on_applied_turf(turf/T, amount, material_flags) + . = ..() + make_edible(T, amount, material_flags) + +/datum/material/meat/proc/make_edible(atom/source, amount, material_flags) + var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT) + var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT) + source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, RAW | MEAT | GROSS, null, 30, list("Fleshy")) diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm new file mode 100644 index 0000000000..2a9542234f --- /dev/null +++ b/code/datums/materials/pizza.dm @@ -0,0 +1,30 @@ +/datum/material/pizza + name = "pizza" + desc = "~Jamme, jamme, n'coppa, jamme ja! Jamme, jamme, n'coppa jamme ja, funi-culi funi-cala funi-culi funi-cala!! Jamme jamme ja funiculi funicula!~" + color = "#FF9F23" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/pizza + value_per_unit = 0.05 + beauty_modifier = 0.1 + strength_modifier = 0.7 + armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1) + item_sound_override = 'sound/effects/meatslap.ogg' + turf_sound_override = FOOTSTEP_MEAT + texture_layer_icon_state = "pizza" + +/datum/material/pizza/on_removed(atom/source, material_flags) + . = ..() + qdel(source.GetComponent(/datum/component/edible)) + +/datum/material/pizza/on_applied_obj(obj/O, amount, material_flags) + . = ..() + make_edible(O, amount, material_flags) + +/datum/material/pizza/on_applied_turf(turf/T, amount, material_flags) + . = ..() + make_edible(T, amount, material_flags) + +/datum/material/pizza/proc/make_edible(atom/source, amount, material_flags) + var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT) + var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT) + source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat")) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 2a6835cc23..8ac9bc4276 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -67,7 +67,7 @@ var/datum/skill_holder/skill_holder /datum/mind/New(var/key) - skill_holder = new() + skill_holder = new(src) src.key = key soulOwner = src martial_art = default_martial_art diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 1475cfa356..335ecf889f 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -42,6 +42,7 @@ school = "evocation" charge_max = 600 clothes_req = NONE + antimagic_allowed = TRUE range = 20 base_icon_state = "fireball" action_icon_state = "fireball0" @@ -122,6 +123,7 @@ desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly." school = "evocation" clothes_req = NONE + antimagic_allowed = TRUE charge_max = 600 invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!" invocation_type = "shout" @@ -155,6 +157,7 @@ dropmessage = "You let the electricity from your hand dissipate." hand_path = /obj/item/melee/touch_attack/shock charge_max = 400 + antimagic_allowed = TRUE clothes_req = NONE action_icon_state = "zap" @@ -212,6 +215,7 @@ desc = "Get a scent off of the item you're currently holding to track it. With an empty hand, you'll track the scent you've remembered." charge_max = 100 clothes_req = NONE + antimagic_allowed = TRUE range = -1 include_user = TRUE action_icon_state = "nose" @@ -290,6 +294,7 @@ name = "Drop a limb" desc = "Concentrate to make a random limb pop right off your body." clothes_req = NONE + antimagic_allowed = TRUE charge_max = 100 action_icon_state = "autotomy" @@ -327,6 +332,7 @@ name = "Lay Web" desc = "Drops a web. Only you will be able to traverse your web easily, making it pretty good for keeping you safe." clothes_req = NONE + antimagic_allowed = TRUE charge_max = 4 SECONDS //the same time to lay a web action_icon = 'icons/mob/actions/actions_genetic.dmi' action_icon_state = "lay_web" @@ -368,6 +374,7 @@ name = "Launch spike" desc = "Shoot your tongue out in the direction you're facing, embedding it and dealing damage until they remove it." clothes_req = NONE + antimagic_allowed = TRUE charge_max = 100 action_icon = 'icons/mob/actions/actions_genetic.dmi' action_icon_state = "spike" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index b9aa7a2bc3..d6b73f96ed 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -465,6 +465,10 @@ suffix = "whiteship_pod" name = "Salvage Pod" +/datum/map_template/shuttle/whiteship/cog + suffix = "cog" + name = "NT Prisoner Transport" + /datum/map_template/shuttle/cargo/box suffix = "box" name = "supply shuttle (Box)" @@ -631,4 +635,4 @@ /datum/map_template/shuttle/hunter/bounty suffix = "bounty" - name = "Bounty Hunter Ship" \ No newline at end of file + name = "Bounty Hunter Ship" diff --git a/code/datums/skills/_check_skills.dm b/code/datums/skills/_check_skills.dm index a94c7c95ba..2421bd36ff 100644 --- a/code/datums/skills/_check_skills.dm +++ b/code/datums/skills/_check_skills.dm @@ -11,6 +11,66 @@ if(!mind.skill_holder) to_chat(usr, "How do you check the skills of [(usr == src)? "yourself when you are" : "something"] without the capability for skills? (PROBABLY A BUG, PRESS F1.)") return - var/datum/browser/B = new(usr, "skilldisplay_[REF(src)]", "Skills of [src]") - B.set_content(mind.skill_html_readout()) - B.open() + + mind.skill_holder.ui_interact(src) + +/datum/skill_holder/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "skillpanel", "[owner.name]'s Skills", 620, 580, master_ui, state) + ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input. + ui.open() + else if(need_static_data_update) + update_static_data(user) + need_static_data_update = FALSE + +/datum/skill_holder/ui_static_data(mob/user) + . = list() + .["skills"] = list() + for(var/path in GLOB.skill_datums) + var/datum/skill/S = GLOB.skill_datums[path] + var/list/dat = S.get_skill_data(src) + if(islist(dat["modifiers"])) + dat["modifiers"] = jointext(dat["modifiers"], ", ") + dat["percent_base"] = (dat["value_base"] / dat["max_value"]) + dat["percent_mod"] = (dat["value_mod"] / dat["max_value"]) + .["skills"] += list(dat) + +/datum/skill_holder/ui_data(mob/user) + . = list() + .["playername"] = owner.name + .["see_skill_mods"] = see_skill_mods + .["admin"] = check_rights(R_DEBUG) + +/datum/skill_holder/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("toggle_mods") + see_skill_mods = !see_skill_mods + return TRUE + if ("adj_exp") + if(!check_rights(R_DEBUG)) + return + var/skill = text2path(params["skill"]) + var/number = input("Please insert the amount of experience/progress you'd like to add/subtract:") as num|null + if (number) + owner.set_skill_value(skill, owner.get_skill_value(skill, FALSE) + number) + return TRUE + if ("set_exp") + if(!check_rights(R_DEBUG)) + return + var/skill = text2path(params["skill"]) + var/number = input("Please insert the number you want to set the player's exp/progress to:") as num|null + if (!isnull(number)) + owner.set_skill_value(skill, number) + return TRUE + if ("set_lvl") + if(!check_rights(R_DEBUG)) + return + var/datum/skill/level/S = GLOB.skill_datums[text2path(params["skill"])] + var/number = input("Please insert a whole number between 0[S.associative ? " ([S.unskilled_tier])" : ""] and [S.max_levels][S.associative ? " ([S.levels[S.max_levels]])" : ""] corresponding to the level you'd like to set the player to.") as num|null + if (number >= 0 && number <= S.max_levels) + owner.set_skill_value(S.type, S.get_skill_level_value(number)) + return TRUE diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index 571a8274d8..e3f1d00ae6 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) continue S = new path .[S.type] = S + . = sortTim(., /proc/cmp_skill_categories, TRUE) /** * Skill datums @@ -34,6 +35,8 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) var/competency_multiplier = 1 /// A list of ways this skill can affect or be affected through actions and skill modifiers. var/list/skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE) + /// Index of this skill in the UI + var/ui_category = SKILL_UI_CAT_MISC /** * Ensures what someone's setting as a value for this skill is valid. @@ -57,10 +60,28 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) return new_value > existing /** - * Standard value "render" + * Get a list of data used in the skill panel menu. */ -/datum/skill/proc/standard_render_value(value, level) - return value +/datum/skill/proc/get_skill_data(datum/skill_holder/H) + var/skill_value = H.owner.get_skill_value(type, FALSE) + . = list( + "name" = name, + "desc" = desc, + "path" = type, + "value_base" = skill_value, + "value_mod" = skill_value, + "modifiers" = "None", + "max_value" = 1 //To avoid division by zero later on. + ) + var/list/mods = LAZYACCESS(H.skill_value_mods, type) + if(mods) + var/list/mod_names = list() + for(var/k in mods) + var/datum/skill_modifier/M = GLOB.skill_modifiers[k] + mod_names |= M.name + skill_value = M.apply_modifier(skill_value, type, H, MODIFIER_TARGET_VALUE) + .["value_mod"] = skill_value + .["modifiers"] = mod_names //Will be jointext()'d later. // Just saying, the choice to use different sub-parent-types is to force coders to resolve issues as I won't be implementing custom procs to grab skill levels in a certain context. // Aka: So people don't forget to change checks if they change a skill's progression type. @@ -71,10 +92,12 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) competency_thresholds = list(THRESHOLD_COMPETENT = FALSE, THRESHOLD_EXPERT = TRUE, THRESHOLD_MASTER = TRUE) /datum/skill/binary/sanitize_value(new_value) - return new_value? TRUE : FALSE + return new_value >= 1 ? TRUE : FALSE -/datum/skill/binary/standard_render_value(value, level) - return value? "Yes" : "No" +/datum/skill/binary/get_skill_data(datum/skill_holder/H) + . = ..() + .["base_readout"] = .["value_base"] ? "Learned: Yes" : "Learned: No" + .["mod_readout"] = .["value_mod"] ? "Learned: Yes" : "Learned: No" /datum/skill/numerical abstract_type = /datum/skill/numerical @@ -84,14 +107,15 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) var/max_value = 100 /// Min value of this skill var/min_value = 0 - /// Display as a percent in standard_render_value? - var/display_as_percent = FALSE /datum/skill/numerical/sanitize_value(new_value) return clamp(new_value, min_value, max_value) -/datum/skill/numerical/standard_render_value(value, level) - return display_as_percent? "[round(value/max_value/100, 0.01)]%" : "[value] / [max_value]" +/datum/skill/numerical/get_skill_data(datum/skill_holder/H) + . = ..() + .["base_readout"] = "Skill Progress: \[[.["value_base"]] / [max_value]\]" + .["mod_readout"] = "Skill Progress: \[[.["value_mod"]] / [max_value]\]" + .["max_value"] = max_value /datum/skill/enum abstract_type = /datum/skill/enum @@ -123,13 +147,7 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) var/max_assoc = "" var/max_assoc_start = 1 for(var/lvl in 1 to max_levels) - var/value - switch(level_up_method) - if(STANDARD_LEVEL_UP) - value = XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl) - if(DWARFY_LEVEL_UP) - value = DORF_XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl) - value = round(value, 1) + var/value = round(get_skill_level_value(lvl), 1) if(!associative) levels += value continue @@ -167,8 +185,13 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) else if(. < 0) to_chat(M.current, "I feel like I've become worse at [name]!") -/datum/skill/level/standard_render_value(value, level) - var/current_lvl = associative ? (!level ? unskilled_tier : levels[level]) : level +/datum/skill/level/get_skill_data(datum/skill_holder/H) + . = ..() + var/skill_value_base = .["value_base"] + var/skill_value_mod = .["value_mod"] + .["level_based"] = TRUE + + var/level = LAZYACCESS(H.skill_levels, type) || 0 var/current_lvl_xp_sum = 0 if(level) current_lvl_xp_sum = associative ? levels[levels[level]] : levels[level] @@ -176,8 +199,50 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) var/next_lvl_xp = associative ? levels[levels[next_index]] : levels[next_index] if(next_lvl_xp > current_lvl_xp_sum) next_lvl_xp -= current_lvl_xp_sum + .["lvl_base_num"] = .["lvl_mod_num"] = level + .["lvl_base"] = .["lvl_mod"] = associative ? (!level ? unskilled_tier : levels[level]) : level + .["base_style"] = .["mod_style"] = "font-weight:bold; color:hsl([(level+1)*(350/max_levels+1)], 50%, 50%)" + .["xp_next_lvl_base"] = .["xp_next_lvl_mod"] = "\[[skill_value_base - current_lvl_xp_sum]/[next_lvl_xp]\]" - return "[associative ? current_lvl : "Lvl. [current_lvl]"] ([value - current_lvl_xp_sum]/[next_lvl_xp])[level == max_levels ? " \[MAX!\]" : ""]" + .["max_lvl"] = max_levels + var/max_value = associative ? levels[levels[max_levels]] : levels[max_levels] + .["max_value"] = max_value + + .["base_readout"] = "Overall Skill Progress: \[[skill_value_base]/[max_value]\]" + .["mod_readout"] = "Overall Skill Progress: \[[skill_value_mod]/[max_value]\]" + + var/list/mods = LAZYACCESS(H.skill_level_mods, type) + if(mods) //I'm not proud of doing the same-ish process twice a row but here we go. + var/list/mod_names = .["modifiers"] + if(!mod_names) + .["modifiers"] = mod_names = list() + for(var/k in mods) + var/datum/skill_modifier/M = GLOB.skill_modifiers[k] + mod_names |= M.name + level = M.apply_modifier(level, type, H, MODIFIER_TARGET_LEVEL) + + if(level) + current_lvl_xp_sum = associative ? levels[levels[level]] : levels[level] + else + current_lvl_xp_sum = 0 + next_index = min(max_levels, level+1) + next_lvl_xp = associative ? levels[levels[next_index]] : levels[next_index] + if(next_lvl_xp > current_lvl_xp_sum) + next_lvl_xp -= current_lvl_xp_sum + .["lvl_mod_num"] = level + .["lvl_mod"] = associative ? (!level ? unskilled_tier : levels[level]) : level + .["mod_style"] = "font-weight:bold; color:hsl([(level+1)*(300/(max_levels+1))], 50%, 50%)" + .["xp_next_lvl_mod"] = "\[[skill_value_mod - current_lvl_xp_sum]/[next_lvl_xp]\]" + +/** + * Gets the base value required to reach a level specified by the 'num' arg. + */ +/datum/skill/level/proc/get_skill_level_value(num) + switch(level_up_method) + if(STANDARD_LEVEL_UP) + . = XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, num) + if(DWARFY_LEVEL_UP) + . = DORF_XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, num) /datum/skill/level/job abstract_type = /datum/skill/level/job diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index 0a5c4f8f58..8357211463 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -20,6 +20,18 @@ var/list/original_values var/list/original_affinities var/list/original_levels + /// The mind datum this skill is associated with, only used for the check_skills UI + var/datum/mind/owner + /// For UI updates. + var/need_static_data_update = TRUE + /// Whether modifiers and final skill values or only base values are displayed. + var/see_skill_mods = TRUE + /// The current selected skill category. + var/selected_category + +/datum/skill_holder/New(owner) + ..() + src.owner = owner /** * Grabs the value of a skill. @@ -79,6 +91,7 @@ CRASH("Invalid set_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. var/datum/skill/S = GLOB.skill_datums[skill] value = S.sanitize_value(value) + skill_holder.need_static_data_update = TRUE if(!isnull(value)) LAZYINITLIST(skill_holder.skills) S.set_skill_value(skill_holder, value, src, silent) @@ -183,18 +196,3 @@ divisor++ if(divisor) . = modifier_is_multiplier ? value*(sum/divisor) : value/(sum/divisor) - -/** - * Generates a HTML readout of our skills. - * Port to tgui-next when? - */ -/datum/mind/proc/skill_html_readout() - var/list/out = list("

Skills


") - out += "" - for(var/path in GLOB.skill_datums) - var/datum/skill/S = GLOB.skill_datums[path] - var/skill_value = get_skill_value(path) - var/skill_level = get_skill_level(path, round = TRUE) - out += "" - out += "
SkillValue
[S.name][S.standard_render_value(skill_value, skill_level)]
" - return out.Join("") diff --git a/code/datums/skills/_skill_modifier.dm b/code/datums/skills/_skill_modifier.dm index a28cf3aebd..c38cbf23c6 100644 --- a/code/datums/skills/_skill_modifier.dm +++ b/code/datums/skills/_skill_modifier.dm @@ -7,6 +7,8 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) * and cause lots of edge cases. These are fairly simple overall... make a subtype though, don't use this one. */ /datum/skill_modifier + /// Name and description of the skill modifier, used in the UI + var/name = "???" /// flags for this skill modifier. var/modifier_flags = NONE /// target skills, can be a specific skill typepath or a list of skill traits. @@ -110,6 +112,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) if(M.modifier_flags & MODIFIER_SKILL_LEVEL) ADD_MOD_STEP(skill_holder.skill_level_mods, path, skill_holder.original_levels, get_skill_level(path, FALSE)) LAZYSET(skill_holder.all_current_skill_modifiers, id, TRUE) + skill_holder.need_static_data_update = TRUE if(M.modifier_flags & MODIFIER_SKILL_BODYBOUND) M.RegisterSignal(src, COMSIG_MIND_TRANSFER, /datum/skill_modifier.proc/on_mind_transfer) @@ -141,6 +144,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) if(M.modifier_flags & MODIFIER_SKILL_LEVEL && skill_holder.skill_level_mods) REMOVE_MOD_STEP(skill_holder.skill_level_mods, path, skill_holder.original_levels) LAZYREMOVE(skill_holder.all_current_skill_modifiers, id) + skill_holder.need_static_data_update = TRUE if(!mind_transfer && M.modifier_flags & MODIFIER_SKILL_BODYBOUND) M.UnregisterSignal(src, COMSIG_MIND_TRANSFER) @@ -165,11 +169,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) var/datum/skill/S = GLOB.skill_datums[skillpath] if(method == MODIFIER_TARGET_VALUE && S.progression_type == SKILL_PROGRESSION_LEVEL) var/datum/skill/level/L = S - switch(L.level_up_method) - if(STANDARD_LEVEL_UP) - mod = XP_LEVEL(L.standard_xp_lvl_up, L.xp_lvl_multiplier, S.competency_thresholds[mod]) - if(DWARFY_LEVEL_UP) - mod = DORF_XP_LEVEL(L.standard_xp_lvl_up, L.xp_lvl_multiplier, S.competency_thresholds[mod]) + mod = L.get_skill_level_value(L.competency_thresholds[mod]) else mod = S.competency_thresholds[mod] diff --git a/code/datums/skills/engineering.dm b/code/datums/skills/engineering.dm index db7b33450c..1226664953 100644 --- a/code/datums/skills/engineering.dm +++ b/code/datums/skills/engineering.dm @@ -1,5 +1,6 @@ /datum/skill/level/job/wiring name = "Wiring" - desc = "How proficient and knowledged you are at wiring beyond laying cables on the floor." + desc = "How proficient and knowledged you are at wiring beyond making post-futuristic wire art." name_color = COLOR_PALE_ORANGE skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE, SKILL_USE_TOOL, SKILL_TRAINING_TOOL) + ui_category = SKILL_UI_CAT_ENG diff --git a/code/datums/skills/medical.dm b/code/datums/skills/medical.dm index 404c141157..4cf10c4c96 100644 --- a/code/datums/skills/medical.dm +++ b/code/datums/skills/medical.dm @@ -1,5 +1,6 @@ /datum/skill/numerical/surgery name = "Surgery" - desc = "How proficient you are at doing surgery." + desc = "How proficient you are at performing surgical procedures." name_color = COLOR_PALE_BLUE_GRAY competency_multiplier = 1.5 // 60% surgery speed up at max value of 100, considering the base multiplier. + ui_category = SKILL_UI_CAT_MED diff --git a/code/datums/skills/modifiers/job.dm b/code/datums/skills/modifiers/job.dm index 7d79ae89b3..e989ab11e3 100644 --- a/code/datums/skills/modifiers/job.dm +++ b/code/datums/skills/modifiers/job.dm @@ -1,6 +1,7 @@ /// Jobbie skill modifiers. /datum/skill_modifier/job + name = "Job Training" modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_ORIGIN_DIFF priority = MODIFIER_SKILL_PRIORITY_MAX @@ -23,7 +24,7 @@ modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_ORIGIN_DIFF level_mod = JOB_SKILL_TRAINED -/datum/skill_modifier/job/level/New(id) +/datum/skill_modifier/job/level/New(id, register = FALSE) if(level_mod) value_mod = GET_STANDARD_LVL(level_mod) ..() diff --git a/code/datums/skills/modifiers/mood.dm b/code/datums/skills/modifiers/mood.dm index 30f24afcc4..a22b75d5b5 100644 --- a/code/datums/skills/modifiers/mood.dm +++ b/code/datums/skills/modifiers/mood.dm @@ -1,8 +1,10 @@ /datum/skill_modifier/bad_mood + name = "Mood (Dejected)" modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND target_skills = list(SKILL_SANITY) /datum/skill_modifier/great_mood + name = "Mood (Elated)" modifier_flags = MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND target_skills = list(SKILL_SANITY) affinity_mod = 1.2 diff --git a/code/datums/skills/modifiers/organs.dm b/code/datums/skills/modifiers/organs.dm index 13ebaf0658..313604f6b2 100644 --- a/code/datums/skills/modifiers/organs.dm +++ b/code/datums/skills/modifiers/organs.dm @@ -1,4 +1,5 @@ /datum/skill_modifier/brain_damage + name = "Brain Damage" target_skills = list(SKILL_INTELLIGENCE) modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND value_mod = 0.85 @@ -6,6 +7,7 @@ affinity_mod = 0.85 /datum/skill_modifier/heavy_brain_damage + name = "Brain Damage (Severe)" target_skills = list(SKILL_INTELLIGENCE) modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_BODYBOUND|MODIFIER_SKILL_HANDICAP|MODIFIER_USE_THRESHOLDS priority = MODIFIER_SKILL_PRIORITY_LOW diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 3493661028..f6cfc79879 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -711,8 +711,9 @@ datum/status_effect/pacify if(hearing_args[HEARING_SPEAKER] == owner) return var/mob/living/carbon/C = owner + var/hypnomsg = uncostumize_say(hearing_args[HEARING_RAW_MESSAGE], hearing_args[HEARING_MESSAGE_MODE]) C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis - addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 10) + addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hypnomsg), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8d78b2ec22..f2a0746d5d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -48,6 +48,7 @@ var/rad_insulation = RAD_NO_INSULATION ///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.) + ///The list referenced by this var can be shared by multiple objects and should not be directly modified. Instead, use [set_custom_materials][/atom/proc/set_custom_materials]. var/list/custom_materials ///Bitfield for how the atom handles materials. var/material_flags = NONE @@ -114,11 +115,8 @@ if (canSmoothWith) canSmoothWith = typelist("canSmoothWith", canSmoothWith) - var/temp_list = list() - for(var/i in custom_materials) - temp_list[SSmaterials.GetMaterialRef(i)] = custom_materials[i] //Get the proper instanced version - custom_materials = null //Null the list to prepare for applying the materials properly - set_custom_materials(temp_list) + // apply materials properly from the default custom_materials value + set_custom_materials(custom_materials) ComponentInitialize() @@ -438,7 +436,7 @@ var/blood_id = get_blood_id() if(!(blood_id in GLOB.blood_reagent_types)) return - return list("ANIMAL DNA" = "Y-") + return list("color" = list(BLOOD_COLOR_HUMAN), "ANIMAL DNA" = "Y-") /mob/living/carbon/get_blood_dna_list() var/blood_id = get_blood_id() @@ -446,13 +444,15 @@ return var/list/blood_dna = list() if(dna) + blood_dna["color"] = list(dna.species.exotic_blood_color) //so when combined, the list grows with the number of colors blood_dna[dna.unique_enzymes] = dna.blood_type else + blood_dna["color"] = list(BLOOD_COLOR_HUMAN) blood_dna["UNKNOWN DNA"] = "X*" return blood_dna /mob/living/carbon/alien/get_blood_dna_list() - return list("UNKNOWN DNA" = "X*") + return list("color" = list(BLOOD_COLOR_XENO), "UNKNOWN DNA" = "X*") //to add a mob's dna info into an object's blood_DNA list. /atom/proc/transfer_mob_blood_dna(mob/living/L) @@ -461,8 +461,10 @@ if(!new_blood_dna) return FALSE LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it. + LAZYINITLIST(blood_DNA["color"]) var/old_length = blood_DNA.len blood_DNA |= new_blood_dna + blood_DNA["color"] += new_blood_dna["color"] if(blood_DNA.len == old_length) return FALSE return TRUE @@ -470,9 +472,12 @@ //to add blood dna info to the object's blood_DNA list /atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases) LAZYINITLIST(blood_DNA) + LAZYINITLIST(blood_dna["color"]) + var/old_length = blood_DNA.len blood_DNA |= blood_dna if(blood_DNA.len > old_length) + blood_DNA["color"] += blood_dna["color"] return TRUE //some new blood DNA was added @@ -544,23 +549,22 @@ /atom/proc/blood_DNA_to_color() var/list/colors = list()//first we make a list of all bloodtypes present - for(var/bloop in blood_DNA) - if(colors[blood_DNA[bloop]]) - colors[blood_DNA[bloop]]++ + for(var/blood_color in blood_DNA["color"]) + if(colors[blood_color]) + colors[blood_color]++ else - colors[blood_DNA[bloop]] = 1 + colors[blood_color] = 1 var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up - if(colors.len) var/sum = 0 //this is all shitcode, but it works; trust me - final_rgb = bloodtype_to_color(colors[1]) + final_rgb = colors[1] sum = colors[colors[1]] if(colors.len > 1) var/i = 2 while(i <= colors.len) var/tmp = colors[colors[i]] - final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum)) + final_rgb = BlendRGB(final_rgb, colors[i], tmp/(tmp+sum)) sum += tmp i++ @@ -1008,26 +1012,21 @@ Proc for attack log creation, because really why not ///Sets the custom materials for an item. /atom/proc/set_custom_materials(var/list/materials, multiplier = 1) - - if(!materials) - materials = custom_materials - if(custom_materials) //Only runs if custom materials existed at first. Should usually be the case but check anyways for(var/i in custom_materials) var/datum/material/custom_material = SSmaterials.GetMaterialRef(i) custom_material.on_removed(src, material_flags) //Remove the current materials if(!length(materials)) + custom_materials = null return - custom_materials = list() //Reset the list + if(material_flags) + for(var/x in materials) + var/datum/material/custom_material = SSmaterials.GetMaterialRef(x) + custom_material.on_applied(src, materials[x] * multiplier * material_modifier, material_flags) - for(var/x in materials) - var/datum/material/custom_material = SSmaterials.GetMaterialRef(x) - - if(material_flags & MATERIAL_EFFECTS) - custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags) - custom_materials[custom_material] += materials[x] * multiplier + custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier) /** * Returns true if this atom has gravity for the passed in turf diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index ce864007f0..695fc79169 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -51,4 +51,4 @@ H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) - H.gain_trauma(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_LOBOTOMY, "clowns") //MWA HA HA + H.gain_trauma(/datum/brain_trauma/mild/phobia/clowns, TRAUMA_RESILIENCE_LOBOTOMY) //MWA HA HA diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 131e61c674..2280bd45d6 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -36,7 +36,7 @@ targetitem = /obj/item/gun/energy/e_gun/hos difficulty = 10 excludefromjob = list("Head Of Security") - altitems = list(/obj/item/gun/ballistic/revolver/mws, /obj/item/choice_beacon/hosgun) //We now look for eather the alt verson of the hos gun or the beacon picker. + altitems = list(/obj/item/gun/ballistic/revolver/mws, /obj/item/choice_beacon/hosgun) //We now look for either the alt verson of the hos gun or the beacon picker. /datum/objective_item/steal/handtele name = "a hand teleporter." diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 4eeb6b8b0f..1f0687151d 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -46,29 +46,16 @@ "Dinnerware", "Imported" ) - var/list/allowed_materials = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/gold, - /datum/material/silver, - /datum/material/diamond, - /datum/material/uranium, - /datum/material/plasma, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/runite, - /datum/material/plastic, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/wood - ) + var/list/allowed_materials /// Base print speed var/base_print_speed = 10 /obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, allowed_materials, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) + var/list/mats = allowed_materials + if(!mats) + mats = SSmaterials.materialtypes_by_category[MAT_CATEGORY_RIGID] + AddComponent(/datum/component/material_container, mats, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) stored_research = new stored_research diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 6d5cce1f3c..c78281da5e 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -109,7 +109,7 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance, list/traumas) if(panel_open) return FALSE if(mess || attempting) @@ -184,6 +184,12 @@ var/datum/quirk/Q = new V(H) Q.on_clone(quirks[V]) + for(var/t in traumas) + var/datum/brain_trauma/BT = t + var/datum/brain_trauma/cloned_trauma = BT.on_clone() + if(cloned_trauma) + H.gain_trauma(cloned_trauma, BT.resilience) + H.set_cloned_appearance() H.give_genitals(TRUE) @@ -246,9 +252,6 @@ var/obj/item/bodypart/BP = I BP.attach_limb(mob_occupant) - //Premature clones may have brain damage. - mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, -((speed_coeff / 2) * dmg_mult)) - use_power(7500) //This might need tweaking. else if((mob_occupant && mob_occupant.cloneloss <= (100 - heal_level))) @@ -374,6 +377,8 @@ to_chat(occupant, "There is a bright flash!
You feel like a new being.
") mob_occupant.flash_act() + mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, mob_occupant.getCloneLoss()) + occupant.forceMove(T) update_icon() mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. @@ -449,10 +454,9 @@ unattached_flesh.Cut() H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health - //H.setOrganLoss(ORGAN_SLOT_BRAIN, CLONE_INITIAL_DAMAGE) - // In addition to being cellularly damaged and having barely any - - // brain function, they also have no limbs or internal organs. + // In addition to being cellularly damaged, they also have no limbs or internal organs. + // Applying brainloss is done when the clone leaves the pod, so application of traumas can happen. + // based on the level of damage sustained. if(!HAS_TRAIT(H, TRAIT_NODISMEMBER)) var/static/list/zones = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 981a5643a8..7834d6f2a2 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -73,7 +73,7 @@ if(pod.occupant) continue //how though? - if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"])) + if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"])) temp = "[R.fields["name"]] => Cloning cycle in progress..." records -= R @@ -442,14 +442,17 @@ var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) var/datum/dna/dna var/datum/bank_account/has_bank_account + + // Do not use unless you know what they are. + var/mob/living/carbon/C = mob_occupant + var/mob/living/brain/B = mob_occupant + if(ishuman(mob_occupant)) - var/mob/living/carbon/C = mob_occupant dna = C.has_dna() var/obj/item/card/id/I = C.get_idcard() if(I) has_bank_account = I.registered_account if(isbrain(mob_occupant)) - var/mob/living/brain/B = mob_occupant dna = B.stored_dna if(!istype(dna)) @@ -497,11 +500,17 @@ R.fields["features"] = dna.features R.fields["factions"] = mob_occupant.faction R.fields["quirks"] = list() - R.fields["bank_account"] = has_bank_account for(var/V in mob_occupant.roundstart_quirks) var/datum/quirk/T = V R.fields["quirks"][T.type] = T.clone_data() + R.fields["traumas"] = list() + if(ishuman(mob_occupant)) + R.fields["traumas"] = C.get_traumas() + if(isbrain(mob_occupant)) + R.fields["traumas"] = B.get_traumas() + + R.fields["bank_account"] = has_bank_account if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning. R.fields["mind"] = "[REF(mob_occupant.mind)]" diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 1fb50e13c6..02a7e4ef97 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -18,7 +18,7 @@ var/secondsElectrified = 0 var/shockedby - var/visible = TRUE + var/visible = TRUE // To explain: Whether the door can block line of sight when closed or not. var/operating = FALSE var/glass = FALSE var/welded = FALSE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 492e90720c..c9c577231e 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -54,6 +54,15 @@ else icon_state = "[src.base_state]open" +/obj/machinery/door/window/update_atom_colour() + if((color && (color_hex2num(color) < 255))) + visible = TRUE + if(density) + set_opacity(TRUE) + else + visible = FALSE + set_opacity(density && visible) + /obj/machinery/door/window/proc/open_and_close() open() if(src.check_access(null)) @@ -143,16 +152,18 @@ do_animate("opening") playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) src.icon_state ="[src.base_state]open" - sleep(10) + addtimer(CALLBACK(src, .proc/finish_opening), 10) + return TRUE +/obj/machinery/door/window/proc/finish_opening() + operating = FALSE density = FALSE -// src.sd_set_opacity(0) //TODO: why is this here? Opaque windoors? ~Carn + if(visible) + set_opacity(FALSE) air_update_turf(1) update_freelook_sight() - if(operating == 1) //emag again operating = FALSE - return 1 /obj/machinery/door/window/close(forced=0) if (src.operating) @@ -171,10 +182,13 @@ density = TRUE air_update_turf(1) update_freelook_sight() - sleep(10) + addtimer(CALLBACK(src, .proc/finish_closing), 10) + return TRUE +/obj/machinery/door/window/proc/finish_closing() + if(visible) + set_opacity(TRUE) operating = FALSE - return 1 /obj/machinery/door/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm new file mode 100644 index 0000000000..7b83401194 --- /dev/null +++ b/code/game/machinery/sheetifier.dm @@ -0,0 +1,44 @@ +/obj/machinery/sheetifier + name = "Sheet-meister 2000" + desc = "A very sheety machine" + icon = 'icons/obj/machines/sheetifier.dmi' + icon_state = "base_machine" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 100 + circuit = /obj/item/circuitboard/machine/sheetifier + layer = BELOW_OBJ_LAYER + var/busy_processing = FALSE + +/obj/machinery/sheetifier/Initialize() + . = ..() + AddComponent(/datum/component/material_container, list(/datum/material/meat), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/reagent_containers/food/snacks/meat/slab, CALLBACK(src, .proc/CanInsertMaterials), CALLBACK(src, .proc/AfterInsertMaterials)) + +/obj/machinery/sheetifier/update_overlays() + . = ..() + if(stat & (BROKEN|NOPOWER)) + return + var/mutable_appearance/on_overlay = mutable_appearance(icon, "buttons_on") + . += on_overlay + +/obj/machinery/sheetifier/update_icon_state() + icon_state = "base_machine[busy_processing ? "_processing" : ""]" + +/obj/machinery/sheetifier/proc/CanInsertMaterials() + return !busy_processing + +/obj/machinery/sheetifier/proc/AfterInsertMaterials(item_inserted, id_inserted, amount_inserted) + busy_processing = TRUE + update_icon() + var/datum/material/last_inserted_material = id_inserted + var/mutable_appearance/processing_overlay = mutable_appearance(icon, "processing") + processing_overlay.color = last_inserted_material.color + flick_overlay_static(processing_overlay, src, 64) + addtimer(CALLBACK(src, .proc/finish_processing), 64) + +/obj/machinery/sheetifier/proc/finish_processing() + busy_processing = FALSE + update_icon() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + materials.retrieve_all() //Returns all as sheets diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 4ddb5281ea..c13cb1d1c6 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -388,7 +388,7 @@ /obj/item/mecha_parts/mecha_equipment/generator/get_equip_info() var/output = ..() if(output) - return "[output] \[[fuel]: [round(fuel.amount*fuel.mats_per_stack,0.1)] cm3\] - [equip_ready?"A":"Dea"]ctivate" + return "[output] \[[fuel]: [round(fuel.amount*MINERAL_MATERIAL_AMOUNT,0.1)] cm3\] - [equip_ready?"A":"Dea"]ctivate" /obj/item/mecha_parts/mecha_equipment/generator/action(target) if(chassis) @@ -398,9 +398,9 @@ /obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(var/obj/item/stack/sheet/P) if(P.type == fuel.type && P.amount > 0) - var/to_load = max(max_fuel - fuel.amount*fuel.mats_per_stack,0) + var/to_load = max(max_fuel - fuel.amount*MINERAL_MATERIAL_AMOUNT,0) if(to_load) - var/units = min(max(round(to_load / P.mats_per_stack),1),P.amount) + var/units = min(max(round(to_load / MINERAL_MATERIAL_AMOUNT),1),P.amount) fuel.amount += units P.use(units) occupant_message("[units] unit\s of [fuel] successfully loaded.") @@ -454,7 +454,7 @@ if(cur_charge < chassis.cell.maxcharge) use_fuel = fuel_per_cycle_active chassis.give_power(power_per_cycle) - fuel.amount -= min(use_fuel/fuel.mats_per_stack,fuel.amount) + fuel.amount -= min(use_fuel/MINERAL_MATERIAL_AMOUNT,fuel.amount) update_equip_info() return 1 diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index b1ab944b49..8b6146dee7 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -256,7 +256,7 @@ output_access_dialog(id_card, usr) if(href_list["del_req_access"] && add_req_access) - operation_req_access -= text2num(href_list["add_req_access"]) + operation_req_access -= text2num(href_list["del_req_access"]) output_access_dialog(id_card, usr) if(href_list["finish_req_access"]) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index a5acc7d394..fa16a95faf 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -91,7 +91,7 @@ var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes if(S && S.bloody_shoes[blood_state]) - if(color != bloodtype_to_color(S.last_bloodtype)) + if(color != S.last_blood_color) return S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) shoe_types |= S.type @@ -104,7 +104,7 @@ var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes if(S && S.bloody_shoes[blood_state]) - if(color != bloodtype_to_color(S.last_bloodtype))//last entry - we check its color + if(color != S.last_blood_color)//last entry - we check its color return S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) shoe_types |= S.type diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 57b25a8901..2c7f701a6e 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -451,7 +451,7 @@ lootcount = 1 spawn_on_turf = FALSE //Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that -//This is ment for "low" loot that anyone could fine in a toilet, for better gear use high loot toilet +//This is meant for "low" loot that anyone could find in a toilet, for better gear use high loot toilet loot = list("" = 30, /obj/item/lighter = 2, /obj/item/tape/random = 1, @@ -476,7 +476,7 @@ lootcount = 1 spawn_on_turf = FALSE //Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that -//This is ment for "prison" loot that is rather rare and ment for "prisoners if they get a crowbar to fine, or sec. +//This is meant for "prison" loot that is rather rare and meant for "prisoners if they get a crowbar to fine, or sec. loot = list("" = 10, /obj/item/lighter = 5, /obj/item/poster/random_contraband = 5, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 60bae4016a..79e0eceb8f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -778,6 +778,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb ..() /obj/item/proc/microwave_act(obj/machinery/microwave/M) + SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M) if(istype(M) && M.dirty < 100) M.dirty++ diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index ea839ae12d..56eb25f953 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -61,6 +61,14 @@ name = "Experimental Clone Pod (Machine Board)" build_path = /obj/machinery/clonepod/experimental +/obj/item/circuitboard/machine/sheetifier + name = "Sheet-meister 2000 (Machine Board)" + icon_state = "supply" + build_path = /obj/machinery/sheetifier + req_components = list( + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/matter_bin = 2) + /obj/item/circuitboard/machine/abductor name = "alien board (Report This)" icon_state = "abductor_mod" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index bd3ded5bbf..620fbbf100 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -737,12 +737,7 @@ to_chat(usr, "A color that dark on an object like this? Surely not...") return FALSE - - if(istype(target, /obj/structure/window)) - var/obj/structure/window/W = target - W.spraycan_paint(paint_color) - else - target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) + target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) . = use_charges(user, 2) var/fraction = min(1, . / reagents.maximum_volume) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 5728a97dda..6ac2d310a1 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -258,6 +258,9 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = "\proper mini Integrated Subspace Transceiver " subspace_transmission = FALSE +/obj/item/radio/headset/silicon/pai/ComponentInitialize() + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) /obj/item/radio/headset/silicon/ai name = "\proper Integrated Subspace Transceiver " diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index bafffa18e3..4ad71f7c46 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -510,7 +510,7 @@ oneuse = FALSE remarks = list("So that is how icing is made!", "Placing fruit on top? How simple...", "Huh layering cake seems harder then this...", "This book smells like candy", "A clown must have made this page, or they forgot to spell check it before printing...", "Wait, a way to cook slime to be safe?") -/obj/item/book/granter/crafting_recipe/coldcooking //IceCream +/obj/item/book/granter/crafting_recipe/coldcooking //Icecream name = "Cooking with Ice" desc = "A cook book that teaches you many old icecream treats." crafting_recipe_types = list(/datum/crafting_recipe/food/banana_split, /datum/crafting_recipe/food/root_float, /datum/crafting_recipe/food/bluecharrie_float, /datum/crafting_recipe/food/charrie_float) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 741607edc3..c6aa9f7bf4 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -689,7 +689,7 @@ item_state = "mace_greyscale" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Material type changes the prefix as well as the color. + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color. custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace. slot_flags = ITEM_SLOT_BELT force = 14 diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6fdea26683..efcc075110 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -17,7 +17,6 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=1000) - mats_per_stack = 1000 max_amount = 50 attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d28ae52b52..f5843a7df2 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -39,9 +39,11 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ item_state = "sheet-sandstone" throw_speed = 3 throw_range = 5 - custom_materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/sandstone=MINERAL_MATERIAL_AMOUNT) sheettype = "sandstone" merge_type = /obj/item/stack/sheet/mineral/sandstone + walltype = /turf/closed/wall/mineral/sandstone + material_type = /datum/material/sandstone /obj/item/stack/sheet/mineral/sandstone/get_main_recipes() . = ..() @@ -107,6 +109,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ point_value = 25 merge_type = /obj/item/stack/sheet/mineral/diamond material_type = /datum/material/diamond + walltype = /turf/closed/wall/mineral/diamond GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ @@ -135,6 +138,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/uranium material_type = /datum/material/uranium + walltype = /turf/closed/wall/mineral/uranium GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -163,6 +167,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/plasma material_type = /datum/material/plasma + walltype = /turf/closed/wall/mineral/plasma /obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -205,6 +210,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/gold material_type = /datum/material/gold + walltype = /turf/closed/wall/mineral/gold GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ @@ -236,6 +242,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ merge_type = /obj/item/stack/sheet/mineral/silver material_type = /datum/material/silver tableVariant = /obj/structure/table/optable + walltype = /turf/closed/wall/mineral/silver GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ @@ -266,6 +273,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ point_value = 50 merge_type = /obj/item/stack/sheet/mineral/bananium material_type = /datum/material/bananium + walltype = /turf/closed/wall/mineral/bananium GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -294,6 +302,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/titanium material_type = /datum/material/titanium + walltype = /turf/closed/wall/mineral/titanium GLOBAL_LIST_INIT(titanium_recipes, list ( \ new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \ @@ -324,6 +333,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT) point_value = 45 merge_type = /obj/item/stack/sheet/mineral/plastitanium + walltype = /turf/closed/wall/mineral/plastitanium /obj/item/stack/sheet/mineral/plastitanium/fifty amount = 50 @@ -390,11 +400,14 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( name = "snow" icon_state = "sheet-snow" item_state = "sheet-snow" + custom_materials = list(/datum/material/snow = MINERAL_MATERIAL_AMOUNT) singular_name = "snow block" force = 1 throwforce = 2 grind_results = list(/datum/reagent/consumable/ice = 20) merge_type = /obj/item/stack/sheet/mineral/snow + walltype = /turf/closed/wall/mineral/snow + material_type = /datum/material/snow GLOBAL_LIST_INIT(snow_recipes, list ( \ new/datum/stack_recipe("Snow Wall", /turf/closed/wall/mineral/snow, 5, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ad3e73a07f..ddfe3abda2 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -205,7 +205,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ desc = "This sheet is an alloy of iron and plasma." icon_state = "sheet-plasteel" item_state = "sheet-metal" - custom_materials = list(/datum/material/iron=2000, /datum/material/plasma=2000) + custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT) throwforce = 10 flags_1 = CONDUCT_1 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) @@ -290,6 +290,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ novariants = TRUE material_type = /datum/material/wood grind_results = list(/datum/reagent/carbon = 20) + walltype = /turf/closed/wall/mineral/wood /obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there. // Taken from /obj/item/stack/rods/attackby in [rods.dm] @@ -345,11 +346,13 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ icon_state = "sheet-bamboo" item_state = "sheet-bamboo" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/bamboo = MINERAL_MATERIAL_AMOUNT) throwforce = 15 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo grind_results = list(/datum/reagent/carbon = 5) + material_type = /datum/material/bamboo /obj/item/stack/sheet/mineral/bamboo/get_main_recipes() . = ..() @@ -514,12 +517,14 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ desc = "Large sheets of card, like boxes folded flat." singular_name = "cardboard sheet" icon_state = "sheet-card" + custom_materials = list(/datum/material/cardboard = MINERAL_MATERIAL_AMOUNT) item_state = "sheet-card" resistance_flags = FLAMMABLE force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cardboard novariants = TRUE + material_type = /datum/material/cardboard /obj/item/stack/sheet/cardboard/get_main_recipes() . = ..() @@ -559,10 +564,12 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ icon_state = "sheet-runed" item_state = "sheet-runed" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/runedmetal = MINERAL_MATERIAL_AMOUNT) sheettype = "runed" merge_type = /obj/item/stack/sheet/runed_metal novariants = TRUE grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15) + material_type = /datum/material/runedmetal /obj/item/stack/sheet/runed_metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -681,6 +688,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ icon_state = "sheet-brass" item_state = "sheet-brass" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/bronze = MINERAL_MATERIAL_AMOUNT) resistance_flags = FIRE_PROOF | ACID_PROOF throwforce = 10 max_amount = 50 @@ -691,6 +699,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ grind_results = list(/datum/reagent/iron = 5, /datum/reagent/copper = 3) //we have no "tin" reagent so this is the closest thing merge_type = /obj/item/stack/tile/bronze tableVariant = /obj/structure/table/bronze + material_type = /datum/material/bronze /obj/item/stack/tile/bronze/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message @@ -738,6 +747,7 @@ GLOBAL_LIST_INIT(bone_recipes, list( icon = 'icons/obj/mining.dmi' icon_state = "bone" item_state = "sheet-bone" + custom_materials = list(/datum/material/bone = MINERAL_MATERIAL_AMOUNT) singular_name = "bone" desc = "Someone's been drinking their milk." force = 7 @@ -748,6 +758,7 @@ GLOBAL_LIST_INIT(bone_recipes, list( throw_range = 3 grind_results = list(/datum/reagent/carbon = 10) merge_type = /obj/item/stack/sheet/bone + material_type = /datum/material/bone /obj/item/stack/sheet/bone/get_main_recipes() . = ..() @@ -775,6 +786,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( custom_materials = list(/datum/material/plastic=MINERAL_MATERIAL_AMOUNT) throwforce = 7 grind_results = list(/datum/reagent/glitter/white = 60) + material_type = /datum/material/plastic merge_type = /obj/item/stack/sheet/plastic /obj/item/stack/sheet/plastic/fifty @@ -800,9 +812,11 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra singular_name = "paper frame" icon_state = "sheet-paper" item_state = "sheet-paper" + custom_materials = list(/datum/material/paper = MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/paperframes resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/paperframes + material_type = /datum/material/paper /obj/item/stack/sheet/paperframes/get_main_recipes() . = ..() @@ -843,3 +857,55 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread + +/obj/item/stack/sheet/meat + name = "meat sheets" + desc = "Something's bloody meat compressed into a nice solid sheet" + singular_name = "meat sheet" + icon_state = "sheet-meat" + material_flags = MATERIAL_COLOR + custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/meat + material_type = /datum/material/meat + material_modifier = 1 //None of that wussy stuff + +/obj/item/stack/sheet/meat/fifty + amount = 50 +/obj/item/stack/sheet/meat/twenty + amount = 20 +/obj/item/stack/sheet/meat/five + amount = 5 + +/obj/item/stack/sheet/pizza + name = "pepperoni sheetzzas" + desc = "It's a delicious pepperoni sheetzza!" + singular_name = "pepperoni sheetzza" + icon_state = "sheet-pizza" + custom_materials = list(/datum/material/pizza = MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/pizza + material_type = /datum/material/pizza + material_modifier = 1 + +/obj/item/stack/sheet/pizza/fifty + amount = 50 +/obj/item/stack/sheet/pizza/twenty + amount = 20 +/obj/item/stack/sheet/pizza/five + amount = 5 + +/obj/item/stack/sheet/sandblock + name = "blocks of sand" + desc = "You're too old to be playing with sandcastles. Now you build... sandstations." + singular_name = "block of sand" + icon_state = "sheet-sandstone" + custom_materials = list(/datum/material/sand = MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/sandblock + material_type = /datum/material/sand + material_modifier = 1 + +/obj/item/stack/sheet/sandblock/fifty + amount = 50 +/obj/item/stack/sheet/sandblock/twenty + amount = 20 +/obj/item/stack/sheet/sandblock/five + amount = 5 diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index dfba533247..57c8ba75d8 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -10,10 +10,14 @@ throw_range = 3 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") novariants = FALSE - mats_per_stack = MINERAL_MATERIAL_AMOUNT - var/sheettype = null //this is used for girders in the creation of walls/false walls - var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity - var/shard_type // the shard debris typepath left over by solar panels and windows etc. + ///this is used for girders in the creation of walls/false walls + var/sheettype = null + ///turn-in value for the gulag stacker - loosely relative to its rarity + var/point_value = 0 + /// the shard debris typepath left over by solar panels and windows etc. + var/shard_type + ///What type of wall does this sheet spawn + var/walltype /obj/item/stack/sheet/Initialize(mapload, new_amount, merge) . = ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2c8e700316..16b46567c7 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -22,7 +22,7 @@ var/merge_type = null // This path and its children should merge with this stack, defaults to src.type var/full_w_class = WEIGHT_CLASS_NORMAL //The weight class the stack should have at amount > 2/3rds max_amount var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. - var/mats_per_stack = 0 + var/list/mats_per_unit //list that tells you how much is in a single unit. ///Datum material type that this stack is made of var/material_type //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() @@ -47,8 +47,11 @@ if(!merge_type) merge_type = type if(custom_materials && custom_materials.len) + mats_per_unit = list() + var/in_process_mat_list = custom_materials.Copy() for(var/i in custom_materials) - custom_materials[SSmaterials.GetMaterialRef(i)] = mats_per_stack * amount + mats_per_unit[SSmaterials.GetMaterialRef(i)] = in_process_mat_list[i] + custom_materials[i] *= amount . = ..() if(merge) for(var/obj/item/stack/S in loc) @@ -60,7 +63,7 @@ var/datum/material/M = SSmaterials.GetMaterialRef(material_type) //First/main material for(var/i in M.categories) switch(i) - if(MAT_CATEGORY_RIGID) + if(MAT_CATEGORY_BASE_RECIPES) var/list/temp = SSmaterials.rigid_stack_recipes.Copy() recipes += temp update_weight() @@ -315,10 +318,13 @@ if (amount < used) return FALSE amount -= used - if(check) - zero_amount() - for(var/i in custom_materials) - custom_materials[i] = amount * mats_per_stack + if(check && zero_amount()) + return TRUE + if(length(mats_per_unit)) + var/temp_materials = custom_materials.Copy() + for(var/i in mats_per_unit) + temp_materials[i] = mats_per_unit[i] * src.amount + set_custom_materials(temp_materials) update_icon() update_weight() return TRUE @@ -350,10 +356,11 @@ source.add_charge(amount * cost) else src.amount += amount - if(custom_materials && custom_materials.len) - for(var/i in custom_materials) - custom_materials[SSmaterials.GetMaterialRef(i)] = MINERAL_MATERIAL_AMOUNT * src.amount - set_custom_materials() //Refresh + if(length(mats_per_unit)) + var/temp_materials = custom_materials.Copy() + for(var/i in mats_per_unit) + temp_materials[i] = mats_per_unit[i] * src.amount + set_custom_materials(temp_materials) update_icon() update_weight() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 0635c55ca3..13fca1e8fe 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -9,16 +9,35 @@ throw_speed = 3 throw_range = 7 max_amount = 60 - mats_per_stack = 500 var/turf_type = null var/mineralType = null novariants = TRUE + var/human_maxHealth = 100 /obj/item/stack/tile/Initialize(mapload, amount) . = ..() pixel_x = rand(-3, 3) pixel_y = rand(-3, 3) //randomize a little +/obj/item/stack/tile/examine(mob/user) + . = ..() + if(throwforce && !is_cyborg) //do not want to divide by zero or show the message to borgs who can't throw + var/verb + switch(CEILING(human_maxHealth / throwforce, 1)) //throws to crit a human + if(1 to 3) + verb = "superb" + if(4 to 6) + verb = "great" + if(7 to 9) + verb = "good" + if(10 to 12) + verb = "fairly decent" + if(13 to 15) + verb = "mediocre" + if(!verb) + return + . += "Those could work as a [verb] throwing weapon." + /obj/item/stack/tile/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/weldingtool)) @@ -470,7 +489,7 @@ /obj/item/stack/tile/plasteel name = "floor tile" singular_name = "floor tile" - desc = "Those could work as a pretty decent throwing weapon." + desc = "The ground you walk on." icon_state = "tile" force = 6 custom_materials = list(/datum/material/iron=500) @@ -482,7 +501,15 @@ resistance_flags = FIRE_PROOF /obj/item/stack/tile/plasteel/cyborg - desc = "The ground you walk on." //Not the usual floor tile desc as that refers to throwing, Cyborgs can't do that - RR custom_materials = null // All other Borg versions of items have no Metal or Glass - RR is_cyborg = 1 cost = 125 + +/obj/item/stack/tile/material + name = "floor tile" + singular_name = "floor tile" + desc = "The ground you walk on." + throwforce = 10 + icon_state = "material_tile" + turf_type = /turf/open/floor/material + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index ee515d321f..aac642a05e 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -444,4 +444,22 @@ STR.max_combined_w_class = 30 STR.max_items = 3 STR.display_numerical_stacking = FALSE - STR.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing)) \ No newline at end of file + STR.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing)) + +/obj/item/storage/bag/material + name = "material pouch" + desc = "A pouch for sheets and RCD ammunition that manages to hang where you would normally put things in your pocket." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "materialpouch" + slot_flags = ITEM_SLOT_POCKET + w_class = WEIGHT_CLASS_BULKY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/material/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.max_combined_w_class = INFINITY + STR.max_items = 2 + STR.display_numerical_stacking = TRUE + STR.can_hold = typecacheof(list(/obj/item/rcd_ammo, /obj/item/stack/sheet)) \ No newline at end of file diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 826a00b90d..454475625d 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -106,10 +106,10 @@ /obj/item/storage/briefcase/medical name = "medical briefcase" icon_state = "medbriefcase" - desc = "A white with a blue cross brieface, this is ment to hold medical gear that would not be able to normally fit in a bag." + desc = "A white with a blue cross brieface, this is meant to hold medical gear that would not be able to normally fit in a bag." /obj/item/storage/briefcase/medical/PopulateContents() new /obj/item/clothing/neck/stethoscope(src) new /obj/item/healthanalyzer(src) - ..() //In case of paperwork + ..() //Incase of paperwork diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 37b6baaa0b..d7065df0f0 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -370,6 +370,14 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/breast_enlargement(src) +/obj/item/storage/pill_bottle/neurine + name = "bottle of neurine pills" + desc = "Contains pills to treat non-severe mental traumas." + +/obj/item/storage/pill_bottle/neurine/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/neurine(src) + ///////////// //Organ Box// ///////////// diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 7e89ddbd8d..fd50bd022f 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) icon_state = "toolbox_default" item_state = "toolbox_default" can_rubberify = FALSE - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS /obj/item/storage/toolbox/Initialize(mapload) if(has_latches) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 2225c4c0c2..299ba7b659 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -155,7 +155,7 @@ ///Material chair /obj/structure/chair/greyscale icon_state = "chair_greyscale" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS item_chair = /obj/item/chair/greyscale buildstacktype = null //Custom mats handle this @@ -384,7 +384,7 @@ /obj/item/chair/greyscale icon_state = "chair_greyscale_toppled" item_state = "chair_greyscale" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS origin_type = /obj/structure/chair/greyscale /obj/item/chair/stool diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index cacf361722..ff62b9cc48 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -170,7 +170,7 @@ qdel(src) return - if(S.sheettype && S.sheettype != "runed") + if(S.sheettype != "runed") var/M = S.sheettype if(state == GIRDER_DISPLACED) var/F = text2path("/obj/structure/falsewall/[M]") @@ -188,9 +188,13 @@ transfer_fingerprints_to(FW) qdel(src) else - var/F = text2path("/turf/closed/wall/mineral/[M]") + var/list/material_list + var/F = S.walltype if(!F) - return + F = /turf/closed/wall/material + if(S.material_type) + material_list = list() + material_list[SSmaterials.GetMaterialRef(S.material_type)] = MINERAL_MATERIAL_AMOUNT * 2 if(S.get_amount() < 2) to_chat(user, "You need at least two sheets to add plating!") return @@ -201,7 +205,9 @@ S.use(2) to_chat(user, "You add the plating.") var/turf/T = get_turf(src) - T.PlaceOnTop(F) + var/turf/newturf = T.PlaceOnTop(F) + if(material_list) + newturf.set_custom_materials(material_list) transfer_fingerprints_to(T) qdel(src) return diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 575310191a..777be608b5 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -220,7 +220,7 @@ /obj/structure/table/greyscale icon = 'icons/obj/smooth_structures/table_greyscale.dmi' icon_state = "table" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS buildstack = null //No buildstack, so generate from mat datums ///Table on wheels diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 5eecc6962a..acb88fbb1d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -157,7 +157,6 @@ secret_type = /obj/effect/spawner/lootdrop/prison_loot_toilet /obj/structure/toilet/greyscale - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR buildstacktype = null @@ -582,6 +581,12 @@ G.use(1) return + if(istype(O, /obj/item/stack/ore/glass)) + new /obj/item/stack/sheet/sandblock(loc) + to_chat(user, "You wet the sand in the sink and form it into a block.") + O.use(1) + return + if(!istype(O)) return if(O.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. @@ -673,7 +678,7 @@ if(steps == 4 && istype(S, /obj/item/stack/sheet/mineral/wood)) if(S.use(3)) steps = 5 - desc = "A dug out well, A dug out well with out rope. Just add some cloth!" + desc = "A dug out well, A dug out well without rope. Just add some cloth!" icon_state = "well_4" return TRUE else @@ -702,11 +707,6 @@ icon_state = "puddle" resistance_flags = UNACIDABLE -/obj/structure/sink/greyscale - icon_state = "sink_greyscale" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR - buildstacktype = null - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/sink/puddle/attack_hand(mob/M) icon_state = "puddle-splash" @@ -722,6 +722,7 @@ qdel(src) /obj/structure/sink/greyscale + icon_state = "sink_greyscale" material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR buildstacktype = null diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e896f8072b..17031a51df 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -271,29 +271,27 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) air_update_turf(TRUE) update_nearby_icons() -/obj/structure/window/proc/spraycan_paint(paint_color) - if(color_hex2num(paint_color) < 255) - set_opacity(255) - else - set_opacity(initial(opacity)) - add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) - /obj/structure/window/proc/electrochromatic_dim() if(electrochromatic_status == ELECTROCHROMATIC_DIMMED) return electrochromatic_status = ELECTROCHROMATIC_DIMMED - animate(src, color = "#222222", time = 2) - set_opacity(TRUE) + var/current = color + add_atom_colour("#222222", FIXED_COLOUR_PRIORITY) + var/newcolor = color + if(color != current) + color = current + animate(src, color = newcolor, time = 2) /obj/structure/window/proc/electrochromatic_off() if(electrochromatic_status == ELECTROCHROMATIC_OFF) return electrochromatic_status = ELECTROCHROMATIC_OFF var/current = color - update_atom_colour() + remove_atom_colour(FIXED_COLOUR_PRIORITY, "#222222") var/newcolor = color - color = current - animate(src, color = newcolor, time = 2) + if(color != current) + color = current + animate(src, color = newcolor, time = 2) /obj/structure/window/proc/remove_electrochromatic() electrochromatic_off() @@ -348,11 +346,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) GLOB.electrochromatic_window_lookup[electrochromatic_id] |= src /obj/structure/window/update_atom_colour() - if((electrochromatic_status != ELECTROCHROMATIC_OFF) && (electrochromatic_status != ELECTROCHROMATIC_DIMMED)) - return FALSE . = ..() - if(color && (color_hex2num(color) < 255)) - set_opacity(255) + if(electrochromatic_status == ELECTROCHROMATIC_DIMMED || (color && (color_hex2num(color) < 255))) + set_opacity(TRUE) else set_opacity(FALSE) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 75603a1116..bdca384bd0 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -189,9 +189,12 @@ if(user && !silent) to_chat(user, "You remove the floor tile.") if(floor_tile && make_tile) - new floor_tile(src) + spawn_tile() return make_plating() +/turf/open/floor/proc/spawn_tile() + new floor_tile(src) + /turf/open/floor/singularity_pull(S, current_size) . = ..() switch(current_size) @@ -293,3 +296,13 @@ return TRUE return FALSE + +/turf/open/floor/material + name = "floor" + icon_state = "materialfloor" + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + +/turf/open/floor/material/spawn_tile() + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 2f4e2e0eee..f940761ff8 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -157,7 +157,7 @@ planetary_atmos = TRUE floor_tile = null initial_gas_mix = FROZEN_ATMOS - slowdown = 1.5 //So digging it out paths are usefull. + slowdown = 1.5 //So digging it out paths are useful. bullet_sizzle = TRUE footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 8e0eace9cd..f26a4b827a 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -76,11 +76,15 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return - var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) - if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow - var/obj/item/stack/tile/light/L = W - var/turf/open/floor/light/F = T - F.state = L.state + if(istype(W, /obj/item/stack/tile/material)) + var/turf/newturf = PlaceOnTop(/turf/open/floor/material, flags = CHANGETURF_INHERIT_AIR) + newturf.set_custom_materials(W.custom_materials) + else if(W.turf_type) + var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) + if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow + var/obj/item/stack/tile/light/L = W + var/turf/open/floor/light/F = T + F.state = L.state playsound(src, 'sound/weapons/genhit.ogg', 50, 1) else to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") diff --git a/code/game/turfs/simulated/wall/material_walls.dm b/code/game/turfs/simulated/wall/material_walls.dm new file mode 100644 index 0000000000..d3952609e0 --- /dev/null +++ b/code/game/turfs/simulated/wall/material_walls.dm @@ -0,0 +1,22 @@ +/turf/closed/wall/material + name = "wall" + desc = "A huge chunk of material used to separate rooms." + icon = 'icons/turf/walls/materialwall.dmi' + icon_state = "wall" + canSmoothWith = list(/turf/closed/wall/material) + smooth = SMOOTH_TRUE + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + +/turf/closed/wall/material/break_wall() + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) + return new girder_type(src) + +/turf/closed/wall/material/devastate_wall() + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) + +/turf/closed/wall/material/mat_update_desc(mat) + desc = "A huge chunk of [mat] used to separate rooms." diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 88f6dd6962..5db289bd31 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -85,6 +85,9 @@ if (opacity) has_opaque_atom = TRUE + // apply materials properly from the default custom_materials value + set_custom_materials(custom_materials) + ComponentInitialize() return INITIALIZE_HINT_NORMAL diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index 9b15729a9e..7664d85b7d 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -84,7 +84,7 @@ GLOBAL_LIST(round_end_notifiees) if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted()) return "[sender.mention], the round has already ended!" LAZYINITLIST(GLOB.round_end_notifiees) - GLOB.round_end_notifiees["<@[sender.mention]>"] = TRUE + GLOB.round_end_notifiees[sender.mention] = TRUE return "I will notify [sender.mention] when the round ends." /datum/tgs_chat_command/sdql diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm index 24149e7e6c..4f518b7f8e 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm @@ -234,3 +234,7 @@ for(var/turf/T in v) . += T return pick(.) + +/proc/__nan() + var/list/L = json_decode("{\"value\":NaN}") + return L["value"] diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 60b52b7d34..8bff37ab03 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -95,6 +95,9 @@ GLOBAL_LIST_EMPTY(antagonists) if(skill_modifiers) for(var/A in skill_modifiers) ADD_SINGLETON_SKILL_MODIFIER(owner, A, type) + var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)] + if(istype(M)) + M.name = "[name] Training" SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src) /datum/antagonist/proc/is_banned(mob/M) diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm index 640c53946f..25de64fe34 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -31,10 +31,6 @@ beating = 0 var/fakingit = 0 -/obj/item/organ/heart/vampheart/prepare_eat() - ..() - // Do cool stuff for eating vamp heart? - /obj/item/organ/heart/vampheart/Restart() beating = 0 // DONT run ..(). We don't want to start beating again. return 0 diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm index 422d645ad2..b170b9d442 100644 --- a/code/modules/antagonists/bloodsucker/powers/veil.dm +++ b/code/modules/antagonists/bloodsucker/powers/veil.dm @@ -101,7 +101,7 @@ H.update_hair() H.update_body_parts() - // Wait here til we deactivate power or go unconscious + // Wait here until we deactivate power or go unconscious var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) while (ContinueActive(owner) && istype(bloodsuckerdatum))//active && owner && owner.stat == CONSCIOUS) bloodsuckerdatum.AddBloodVolume(-0.2) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 35639bfd97..3267f2bdc1 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -397,20 +397,31 @@ escape_objective_possible = FALSE break var/changeling_objective = rand(1,3) + var/generic_absorb_objective = FALSE + var/multiple_lings = length(get_antag_minds(/datum/antagonist/changeling,TRUE)) > 1 switch(changeling_objective) if(1) - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = owner - absorb_objective.gen_amount_goal(6, 8) - objectives += absorb_objective + generic_absorb_objective = TRUE if(2) - var/datum/objective/absorb_changeling/ac = new - ac.owner = owner - objectives += ac + if(multiple_lings) + var/datum/objective/absorb_changeling/ac = new + ac.owner = owner + objectives += ac + else + generic_absorb_objective = TRUE if(3) - var/datum/objective/absorb_most/ac = new - ac.owner = owner - objectives += ac + if(multiple_lings) + var/datum/objective/absorb_most/ac = new + ac.owner = owner + objectives += ac + else + generic_absorb_objective = TRUE + + if(generic_absorb_objective) + var/datum/objective/absorb/absorb_objective = new + absorb_objective.owner = owner + absorb_objective.gen_amount_goal(6, 8) + objectives += absorb_objective if(prob(60)) if(prob(85)) diff --git a/code/modules/antagonists/changeling/powers/spiders.dm b/code/modules/antagonists/changeling/powers/spiders.dm index 6bd15fea92..69900ea8f9 100644 --- a/code/modules/antagonists/changeling/powers/spiders.dm +++ b/code/modules/antagonists/changeling/powers/spiders.dm @@ -1,7 +1,7 @@ /obj/effect/proc_holder/changeling/spiders name = "Spread Infestation" desc = "Our form divides, creating arachnids which will grow into deadly beasts." - helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 3 DNA gained through Absorb, and not through DNA sting. This ability is very loud, and will guarantee that our blood will react violently to heat." + helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 3 DNA gained through Absorb (regardless of current amount), and not through DNA sting. This ability is very loud, and will guarantee that our blood will react violently to heat." chemical_cost = 45 dna_cost = 1 loudness = 4 diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index a9bc64a932..881e668d9b 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -560,6 +560,27 @@ . += "You cast it [times] times.
" return . +/datum/spellbook_entry/summon/curse_of_madness + name = "Curse of Madness" + desc = "Curses the station, warping the minds of everyone inside, causing lasting traumas. Warning: this spell can affect you if not cast from a safe distance." + cost = 4 + +/datum/spellbook_entry/summon/curse_of_madness/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + active = TRUE + var/message = stripped_input(user, "Whisper a secret truth to drive your victims to madness.", "Whispers of Madness") + if(!message) + return FALSE + curse_of_madness(user, message) + to_chat(user, "You have cast the curse of insanity!") + playsound(user, 'sound/magic/mandswap.ogg', 50, 1) + return TRUE + +/datum/spellbook_entry/summon/curse_of_madness/IsAvailible() + if(!SSticker.mode) // In case spellbook is placed on map + return FALSE + return (!CONFIG_GET(flag/no_summon_traumas) && ..()) + /obj/item/spellbook name = "spell book" desc = "An unearthly tome that glows with power." diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index fb254a2dcc..4d2e5e6fef 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital color = "#fcccb3" w_class = WEIGHT_CLASS_SMALL - organ_flags = ORGAN_NO_DISMEMBERMENT + organ_flags = ORGAN_NO_DISMEMBERMENT|ORGAN_EDIBLE 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 diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 8e3c7115e9..cf5bd2b4cc 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -367,7 +367,7 @@ "dna_discovered.gif" = 'html/dna_discovered.gif', "dna_undiscovered.gif" = 'html/dna_undiscovered.gif', "dna_extra.gif" = 'html/dna_extra.gif' - ) +) /datum/asset/simple/orbit assets = list( diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index a4632f7ed0..ffa608f8fd 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -119,7 +119,7 @@ /datum/bounty/item/science/noneactive_reactivearmor name = "Reactive Armor Shells" - description = "Do to the breakthroughs in anomalies, we can not keep up in making reactive armor shells, can you send us a few?" + description = "Due to the breakthroughs in anomalies, we can not keep up in making reactive armor shells, can you send us a few?" reward = 2000 required_count = 5 wanted_types = list(/obj/item/reactive_armour_shell, /obj/item/clothing/suit/armor/reactive) @@ -138,14 +138,14 @@ /datum/bounty/item/science/anomaly_neutralizer name = "Anomaly Neutralizers" - description = "An idea for a long time was to use an unstable Supermatter Shard to help create the breeding grounds for an unstable part of space to harvest any anomalies we want. It worked a little too well and now were out of anomaly neutralizers please send us a baker's dozen." + description = "An idea for a long time was to use an unstable Supermatter Shard to help create the breeding grounds for an unstable part of space to harvest any anomalies we want. It worked a little too well and now we're out of anomaly neutralizers, please send us a baker's dozen." reward = 2500 required_count = 13 wanted_types = list(/obj/item/anomaly_neutralizer) /datum/bounty/item/science/integrated_circuit_printer name = "Integrated Circuit Printer" - description = "due to a paperwork error, a newly made integrated circuit manufacturer line is missing three of its printers needed to operate. Until the paper work is corrected we are outsourcing this problem, so please send us three integrated circuit printers." + description = "Due to a paperwork error, a newly made integrated circuit manufacturer line is missing three of its printers needed to operate. Until the paper work is corrected we are outsourcing this problem, so please send us three integrated circuit printers." reward = 2000 required_count = 3 wanted_types = list(/obj/item/integrated_circuit_printer) @@ -159,7 +159,7 @@ /datum/bounty/item/science/nanite_trash name = "Nanite Based Gear" - description = "CC wants to make nanite based gear available to a new wing of devolvement but lacks the hand held tools to get it full up and running. Please send us any you have." + description = "CC wants to make nanite based gear available to a new wing of development but lacks the hand held tools to get it fully up and running. Please send us any you have." reward = 2500 required_count = 20 //Its just metal wanted_types = list( /obj/item/nanite_remote, /obj/item/nanite_remote/comm, /obj/item/nanite_scanner) diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 2b93a25a61..695dab8133 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -303,7 +303,7 @@ export_types = list(/obj/mecha/combat/durand) /datum/export/large/mech/phazon - cost = 35000 //Little over half do to needing a core + cost = 35000 //Little over half due to needing a core unit_name = "working phazon" export_types = list(/obj/mecha/combat/phazon) diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index a889f0ed13..6769dfec40 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -1,5 +1,5 @@ /datum/export/tool - k_elasticity = 1/500 //Tool selling almost allways fine a target + k_elasticity = 1/500 //Tool selling almost always find a target /datum/export/tool/toolbox cost = 6 diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index b4aac307f2..e4b8ed8483 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -267,9 +267,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) else prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs - if(SSinput.initialized) - set_macros() - update_movement_keys(prefs) + addtimer(CALLBACK(src, .proc/ensure_keys_set), 0) //prevents possible race conditions prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning @@ -463,6 +461,11 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) Master.UpdateTickRate() +/client/proc/ensure_keys_set() + if(SSinput.initialized) + set_macros() + update_movement_keys(prefs) + ////////////// //DISCONNECT// ////////////// diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 347a77059a..240b275084 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -162,6 +162,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE ) + var/custom_speech_verb = "default" //if your say_mod is to be something other than your races + var/custom_tongue = "default" //if your tongue is to be something other than your races var/list/custom_names = list() var/preferred_ai_core_display = "Blue" @@ -440,6 +442,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) else if(use_skintones || mutant_colors) dat += "" + dat += APPEARANCE_CATEGORY_COLUMN + dat += "

Speech preferences

" + dat += "Custom Speech Verb:
" + dat += "[custom_speech_verb]
" + dat += "Custom Tongue:
" + dat += "[custom_tongue]
" + if(HAIR in pref_species.species_traits) dat += APPEARANCE_CATEGORY_COLUMN @@ -2323,7 +2332,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_body_size = danger if(dorfy != "No") features["body_size"] = new_body_size - + if("tongue") + var/selected_custom_tongue = input(user, "Choose your desired tongue (none means your species tongue)", "Character Preference") as null|anything in GLOB.roundstart_tongues + if(selected_custom_tongue) + custom_tongue = selected_custom_tongue + if("speech_verb") + var/selected_custom_speech_verb = input(user, "Choose your desired speech verb (none means your species speech verb)", "Character Preference") as null|anything in GLOB.speech_verbs + if(selected_custom_speech_verb) + custom_speech_verb = selected_custom_speech_verb else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj @@ -2720,6 +2736,18 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.update_body_size(old_size) + //speech stuff + var/new_tongue = GLOB.roundstart_tongues[custom_tongue] + if(new_tongue) + var/obj/item/organ/tongue/T = character.getorganslot(ORGAN_SLOT_TONGUE) + if(T) + qdel(T) + var/obj/item/organ/tongue/new_custom_tongue = new new_tongue + new_custom_tongue.Insert(character) + if(custom_speech_verb != "default") + character.dna.species.say_mod = custom_speech_verb + + SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) //let's be sure the character updates diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 1ec3fc6404..aa1b6f801b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -194,7 +194,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(current_version < 31) S["wing_color"] >> features["wings_color"] S["horn_color"] >> features["horns_color"] - + if(current_version < 33) features["flavor_text"] = html_encode(features["flavor_text"]) features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"]) @@ -479,6 +479,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["backbag"] >> backbag S["jumpsuit_style"] >> jumpsuit_style S["uplink_loc"] >> uplink_spawn_loc + S["custom_speech_verb"] >> custom_speech_verb + S["custom_tongue"] >> custom_tongue S["feature_mcolor"] >> features["mcolor"] S["feature_lizard_tail"] >> features["tail_lizard"] S["feature_lizard_snout"] >> features["snout"] @@ -756,6 +758,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style) WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) WRITE_FILE(S["species"] , pref_species.id) + WRITE_FILE(S["custom_speech_verb"] , custom_speech_verb) + WRITE_FILE(S["custom_tongue"] , custom_tongue) WRITE_FILE(S["feature_mcolor"] , features["mcolor"]) WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"]) WRITE_FILE(S["feature_human_tail"] , features["tail_human"]) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 8f852356b7..662318fb82 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -244,7 +244,7 @@ icon_state = "knight_greyscale" item_state = "knight_greyscale" armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Can change color and add prefix + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix /obj/item/clothing/head/helmet/skull name = "skull helmet" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 5582947732..723fb93b78 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -238,7 +238,7 @@ item_state = "foilhat" armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) equip_delay_other = 140 - var/datum/brain_trauma/mild/phobia/paranoia + var/datum/brain_trauma/mild/phobia/conspiracies/paranoia var/warped = FALSE clothing_flags = IGNORE_HAT_TOSS @@ -255,7 +255,8 @@ return if(paranoia) QDEL_NULL(paranoia) - paranoia = new("conspiracies") + paranoia = new() + paranoia.clonable = FALSE user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 802dd7265e..447a531717 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -18,6 +18,7 @@ mutantrace_variation = STYLE_DIGITIGRADE var/last_bloodtype = "" //used to track the last bloodtype to have graced these shoes; makes for better performing footprint shenanigans var/last_blood_DNA = "" //same as last one + var/last_blood_color = "" /obj/item/clothing/shoes/ComponentInitialize() . = ..() @@ -48,6 +49,7 @@ if(blood_dna.len) last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works last_blood_DNA = blood_dna[blood_dna.len] + last_blood_color = blood_dna["color"] /obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 557b4860c9..0ef1a83bf5 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -286,7 +286,7 @@ icon_state = "knight_greyscale" item_state = "knight_greyscale" armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Can change color and add prefix + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix /obj/item/clothing/suit/armor/vest/durathread name = "makeshift vest" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 8eaaee9ebc..80bf04280a 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -537,7 +537,7 @@ /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" - desc = "A luxuriant winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor." + desc = "A luxurious winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor." icon_state = "coatcaptain" item_state = "coatcaptain" armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) @@ -565,7 +565,7 @@ /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" - desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs and got annoying after the first ten seconds." + desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs that get annoying after the first ten seconds." icon_state = "coatsecurity" item_state = "coatsecurity" armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index a8ab470d5d..b88bef1c87 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -17,9 +17,9 @@ var/holidayID = "" //string which should be in the SSeventss.holidays list if you wish this event to be holiday-specific //anything with a (non-null) holidayID which does not match holiday, cannot run. - var/wizardevent = 0 - - var/alertadmins = 1 //should we let the admins know this event is firing + var/wizardevent = FALSE + var/random = FALSE //If the event has occured randomly, or if it was forced by an admin or in-game occurance + var/alert_observers = TRUE //should we let the ghosts and admins know this event is firing //should be disabled on events that fire a lot var/list/gamemode_blacklist = list() // Event won't happen in these gamemodes @@ -33,7 +33,7 @@ min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1) /datum/round_event_control/wizard - wizardevent = 1 + wizardevent = TRUE var/can_be_midround_wizard = TRUE // Checks if the event can be spawned. Used by event controller and "false alarm" event. @@ -67,7 +67,7 @@ return EVENT_CANT_RUN triggering = TRUE - if (alertadmins) + if (alert_observers) message_admins("Random Event triggering in 10 seconds: [name] (CANCEL)") sleep(100) var/gamemode = SSticker.mode.config_tag @@ -92,7 +92,7 @@ log_admin_private("[key_name(usr)] cancelled event [name].") SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath) -/datum/round_event_control/proc/runEvent(random) +/datum/round_event_control/proc/runEvent() var/datum/round_event/E = new typepath() E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) E.control = src @@ -101,10 +101,9 @@ testing("[time2text(world.time, "hh:mm:ss")] [E.type]") if(random) - if(alertadmins) - deadchat_broadcast("[name] has just been randomly triggered!") //STOP ASSUMING IT'S BADMINS! log_game("Random Event triggering: [name] ([typepath])") - + if (alert_observers) + deadchat_broadcast("[name] has just been[random ? " randomly" : ""] triggered!") //STOP ASSUMING IT'S BADMINS! return E //Special admins setup @@ -140,6 +139,17 @@ /datum/round_event/proc/start() return +/** + * Called after something followable has been spawned by an event + * Provides ghosts a follow link to an atom if possible + * Only called once. + */ +/datum/round_event/proc/announce_to_ghosts(atom/atom_of_interest) + if(control.alert_observers) + if (atom_of_interest) + notify_ghosts("[control.name] has an object of interest: [atom_of_interest]!", source=atom_of_interest, action=NOTIFY_ORBIT, header="Something's Interesting!") + return + //Called when the tick is equal to the announceWhen variable. //Allows you to announce before starting or vice versa. //Only called once. diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index d8122eac75..394294db37 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -8,7 +8,7 @@ /datum/round_event/anomaly var/area/impact_area - var/obj/effect/anomaly/newAnomaly + var/obj/effect/anomaly/anomaly_path = /obj/effect/anomaly/flux announceWhen = 1 @@ -27,7 +27,7 @@ //Subtypes from the above that actually should explode. var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room)) - + allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) @@ -44,6 +44,9 @@ priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") /datum/round_event/anomaly/start() - var/turf/T = safepick(get_area_turfs(impact_area)) + var/turf/T = pick(get_area_turfs(impact_area)) + var/newAnomaly if(T) - newAnomaly = new /obj/effect/anomaly/flux(T) \ No newline at end of file + newAnomaly = new anomaly_path(T) + if (newAnomaly) + announce_to_ghosts(newAnomaly) diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index a6a0effa2b..395b3b88a5 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -1,6 +1,7 @@ /datum/round_event_control/anomaly/anomaly_bluespace name = "Anomaly: Bluespace" typepath = /datum/round_event/anomaly/anomaly_bluespace + max_occurrences = 1 weight = 5 gamemode_blacklist = list("dynamic") @@ -8,15 +9,10 @@ /datum/round_event/anomaly/anomaly_bluespace startWhen = 3 announceWhen = 10 - + anomaly_path = /obj/effect/anomaly/bluespace /datum/round_event/anomaly/anomaly_bluespace/announce(fake) if(prob(90)) priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else print_command_report("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Unstable bluespace anomaly") - -/datum/round_event/anomaly/anomaly_bluespace/start() - var/turf/T = safepick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/bluespace(T) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index f4c78c0ec4..a9a7ed50b9 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -10,14 +10,10 @@ /datum/round_event/anomaly/anomaly_flux startWhen = 10 announceWhen = 3 + anomaly_path = /obj/effect/anomaly/flux /datum/round_event/anomaly/anomaly_flux/announce(fake) if(prob(90)) priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else print_command_report("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].","Localized hyper-energetic flux wave") - -/datum/round_event/anomaly/anomaly_flux/start() - var/turf/T = safepick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/flux(T) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 8500b44597..cabd7face8 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -1,6 +1,7 @@ /datum/round_event_control/anomaly/anomaly_grav name = "Anomaly: Gravitational" typepath = /datum/round_event/anomaly/anomaly_grav + max_occurrences = 5 weight = 20 gamemode_blacklist = list("dynamic") @@ -9,14 +10,10 @@ /datum/round_event/anomaly/anomaly_grav startWhen = 3 announceWhen = 20 + anomaly_path = /obj/effect/anomaly/grav /datum/round_event/anomaly/anomaly_grav/announce(fake) if(prob(90)) priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else print_command_report("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Gravitational anomaly") - -/datum/round_event/anomaly/anomaly_grav/start() - var/turf/T = safepick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/grav(T) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 9594727784..8c8fbd6d36 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -1,6 +1,7 @@ /datum/round_event_control/anomaly/anomaly_pyro name = "Anomaly: Pyroclastic" typepath = /datum/round_event/anomaly/anomaly_pyro + max_occurrences = 5 weight = 20 gamemode_blacklist = list("dynamic") @@ -8,14 +9,10 @@ /datum/round_event/anomaly/anomaly_pyro startWhen = 3 announceWhen = 10 + anomaly_path = /obj/effect/anomaly/pyro /datum/round_event/anomaly/anomaly_pyro/announce(fake) if(prob(90)) priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else print_command_report("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Pyroclastic anomaly") - -/datum/round_event/anomaly/anomaly_pyro/start() - var/turf/T = safepick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/pyro(T) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index f6eaea40d5..96d084873d 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -10,14 +10,10 @@ /datum/round_event/anomaly/anomaly_vortex startWhen = 10 announceWhen = 3 + anomaly_path = /obj/effect/anomaly/bhole /datum/round_event/anomaly/anomaly_vortex/announce(fake) if(prob(90)) priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") else print_command_report("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name].","Vortex anomaly") - -/datum/round_event/anomaly/anomaly_vortex/start() - var/turf/T = safepick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/bhole(T) diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 9e8c7e483e..3e8182a827 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -30,4 +30,4 @@ BRAIN_TRAUMA_SPECIAL = 10 )) - H.gain_trauma_type(trauma_type, resistance) \ No newline at end of file + H.gain_trauma_type(trauma_type, resistance) diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index e61af1368d..da5b4c0cb2 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -54,6 +54,7 @@ vendingMachines.Remove(originMachine) originMachine.shut_up = 0 originMachine.shoot_inventory = 1 + announce_to_ghosts(originMachine) /datum/round_event/brand_intelligence/tick() diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm index e8556e9118..8d7ef3204c 100644 --- a/code/modules/events/camerafailure.dm +++ b/code/modules/events/camerafailure.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/camera_failure weight = 100 max_occurrences = 20 - alertadmins = 0 + alert_observers = FALSE /datum/round_event/camera_failure fakeable = FALSE diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index e6cb043165..2c553fc8a7 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -10,6 +10,7 @@ /datum/round_event/carp_migration announceWhen = 3 startWhen = 50 + var/hasAnnounced = FALSE /datum/round_event/carp_migration/setup() startWhen = rand(40, 60) @@ -22,10 +23,16 @@ /datum/round_event/carp_migration/start() + var/mob/living/simple_animal/hostile/carp/fish for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) if(prob(95)) - new /mob/living/simple_animal/hostile/carp(C.loc) + fish = new (C.loc) else - new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) - + fish = new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) + fishannounce(fish) //Prefer to announce the megacarps over the regular fishies + fishannounce(fish) +/datum/round_event/carp_migration/proc/fishannounce(atom/fish) + if (!hasAnnounced) + announce_to_ghosts(fish) //Only anounce the first fish + hasAnnounced = TRUE diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 802736d5d4..860685c787 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -4,7 +4,7 @@ weight = 200 max_occurrences = 1000 earliest_start = 0 MINUTES - alertadmins = 0 + alert_observers = FALSE gamemode_blacklist = list("dynamic") /datum/round_event/space_dust diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 6e6abb1cd4..5e5e318e3c 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -4,7 +4,7 @@ earliest_start = 10 MINUTES min_players = 5 weight = 40 - alertadmins = 0 + alert_observers = FALSE gamemode_blacklist = list("dynamic") /datum/round_event/electrical_storm diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm index e50d89a3a3..ae1d1320a5 100644 --- a/code/modules/events/ghost_role.dm +++ b/code/modules/events/ghost_role.dm @@ -37,7 +37,10 @@ signing up.") else if(status == SUCCESSFUL_SPAWN) message_admins("[role_name] spawned successfully.") - if(!spawned_mobs.len) + if(spawned_mobs.len) + for(var/mob/M in spawned_mobs) + announce_to_ghosts(M) + else message_admins("No mobs found in the `spawned_mobs` list, this is \ a bug.") else diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index a47a8b81b4..b3bc571a4a 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -20,4 +20,4 @@ var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants) var/datum/disease/D = new /datum/disease/heart_failure() winner.ForceContractDisease(D, FALSE, TRUE) - notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT) + announce_to_ghosts(winner) \ No newline at end of file diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index d4f51e995e..0ace65ffd3 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -35,7 +35,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) var/turf/startT = spaceDebrisStartLoc(startside, z) var/turf/endT = spaceDebrisFinishLoc(startside, z) - new /obj/effect/immovablerod(startT, endT, C.special_target) + var/atom/rod = new /obj/effect/immovablerod(startT, endT, C.special_target) + announce_to_ghosts(rod) /obj/effect/immovablerod name = "immovable rod" @@ -61,10 +62,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 z_original = z destination = end special_target = aimed_at - if(notify) - notify_ghosts("\A [src] is inbound!", - enter_link="(Click to orbit)", - source=src, action=NOTIFY_ORBIT) GLOB.poi_list += src var/special_target_valid = FALSE diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 44430086eb..f1803b03ee 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -80,8 +80,9 @@ var/mob/M = candidates[1] spawner.create(M.ckey) candidates -= M + announce_to_ghosts(M) else - notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) + announce_to_ghosts(spawner) priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index cf6223bf0d..22e475a8ef 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -30,6 +30,7 @@ /datum/round_event/processor_overload/start() for(var/obj/machinery/telecomms/processor/P in GLOB.telecomms_list) if(prob(10)) + announce_to_ghosts(P) // Damage the surrounding area to indicate that it popped explosion(get_turf(P), 0, 0, 2) // Only a level 1 explosion actually damages the machine diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 85bcf4959d..c592e06e0e 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -383,7 +383,9 @@ /datum/spacevine_controller/New(turf/location, list/muts, potency, production, datum/round_event/event = null) vines = list() growth_queue = list() - spawn_spacevine_piece(location, null, muts) + var/obj/structure/spacevine/SV = spawn_spacevine_piece(location, null, muts) + if (event) + event.announce_to_ghosts(SV) START_PROCESSING(SSobj, src) vine_mutations_list = list() init_subtypes(/datum/spacevine_mutation/, vine_mutations_list) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 2cba5fc529..d1c327e0f7 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -35,6 +35,6 @@ var/spawn_type = /obj/structure/spider/spiderling if(prob(66)) spawn_type = /obj/structure/spider/spiderling/nurse - spawn_atom_to_turf(spawn_type, vent, 1, FALSE) + announce_to_ghosts(spawn_atom_to_turf(spawn_type, vent, 1, FALSE)) vents -= vent spawncount-- diff --git a/code/modules/events/wizard/madness.dm b/code/modules/events/wizard/madness.dm new file mode 100644 index 0000000000..ac86236623 --- /dev/null +++ b/code/modules/events/wizard/madness.dm @@ -0,0 +1,28 @@ +/datum/round_event_control/wizard/madness + name = "Curse of Madness" + weight = 1 + typepath = /datum/round_event/wizard/madness + earliest_start = 0 MINUTES + + var/forced_secret + +/datum/round_event_control/wizard/madness/admin_setup() + if(!check_rights(R_FUN)) + return + + var/suggested = pick(strings(REDPILL_FILE, "redpill_questions")) + + forced_secret = (input(usr, "What horrifying truth will you reveal?", "Curse of Madness", sortList(suggested)) as text|null) || suggested + +/datum/round_event/wizard/madness/start() + var/datum/round_event_control/wizard/madness/C = control + + var/horrifying_truth + + if(C.forced_secret) + horrifying_truth = C.forced_secret + C.forced_secret = null + else + horrifying_truth = pick(strings(REDPILL_FILE, "redpill_questions")) + + curse_of_madness(null, horrifying_truth) diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 7361e50606..8e5069925f 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -94,7 +94,7 @@ list_reagents = list(/datum/reagent/consumable/nuka_cola = 50) /obj/item/reagent_containers/food/drinks/drinkingglass/filled/syndicatebomb - name = "Syndicat Bomb" + name = "Syndicate Bomb" list_reagents = list(/datum/reagent/consumable/ethanol/syndicatebomb = 50) /obj/item/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 203eb3eef6..f83a1222fd 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -6,7 +6,6 @@ /// get_random_food proc. //////////////////////////////////////////////////////////////////////////////// -#define STOP_SERVING_BREAKFAST (15 MINUTES) /obj/item/reagent_containers/food possible_transfer_amounts = list() @@ -51,5 +50,3 @@ if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) last_check_time = world.time - -#undef STOP_SERVING_BREAKFAST diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index b8fa64a7bc..a35dcc1dc4 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -1,6 +1,7 @@ /obj/item/reagent_containers/food/snacks/meat var/subjectname = "" var/subjectjob = null + custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4) /obj/item/reagent_containers/food/snacks/meat/slab name = "meat" diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm index f2253ee760..1117dbc3d3 100644 --- a/code/modules/food_and_drinks/food/snacks_cake.dm +++ b/code/modules/food_and_drinks/food/snacks_cake.dm @@ -312,7 +312,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake name = "pound cake" desc = "A condensed cake made for filling people up quickly." icon_state = "pound_cake" - slices_num = 7 //Its ment to feed the party + slices_num = 7 //Its meant to feed the party slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice bonus_reagents = list(/datum/reagent/consumable/nutriment = 60) tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1) diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm index b699477245..39c9c6c04f 100644 --- a/code/modules/food_and_drinks/food/snacks_frozen.dm +++ b/code/modules/food_and_drinks/food/snacks_frozen.dm @@ -91,7 +91,7 @@ icon = 'icons/obj/food/snowcones.dmi' icon_state = "flavorless_sc" trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups - bonus_reagents = list(/datum/reagent/water = 10) //Base line will allways give water + bonus_reagents = list(/datum/reagent/water = 10) //Base line will always give water list_reagents = list(/datum/reagent/water = 1) // We dont get food for water/juices filling_color = "#FFFFFF" //Ice is white tastes = list("ice" = 1, "water" = 1) diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm index ebc67a28c1..f30c182963 100644 --- a/code/modules/food_and_drinks/food/snacks_pizza.dm +++ b/code/modules/food_and_drinks/food/snacks_pizza.dm @@ -10,6 +10,17 @@ tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtype = GRAIN | DAIRY | VEGETABLES +/obj/item/reagent_containers/food/snacks/pizzaslice/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/kitchen/rollingpin)) + if(!isturf(loc)) + to_chat(user, "You need to put [src] on a surface to roll it out!") + return + new /obj/item/stack/sheet/pizza(loc) + to_chat(user, "You smoosh [src] into a cheesy sheet.") + qdel(src) + return + return ..() + /obj/item/reagent_containers/food/snacks/pizzaslice icon = 'icons/obj/food/pizzaspaghetti.dmi' list_reagents = list(/datum/reagent/consumable/nutriment = 5) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 48990d88c9..de27d1eed7 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -48,7 +48,7 @@ /obj/item/seeds/tea/catnip name = "pack of catnip seeds" icon_state = "seed-catnip" - desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it." + desc = "Long stocks with flowering tips that contain a chemical to make felines attracted to it." species = "catnip" plantname = "Catnip Plant" growthstages = 3 diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index fd4e6abfc5..aec4b404f3 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -78,7 +78,7 @@ for(var/i in 1 to length(harvest_output)) harvest_output[i] = WEAKREF(harvest_output[i]) - if(harvest_output.len) + if(length(harvest_output)) set_pin_data(IC_OUTPUT, 1, harvest_output) push_data() if(1) diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 3123eeabbe..f7dea13052 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -81,7 +81,7 @@ to_chat(user, "There's no weapon to remove from the mechanism.") /obj/item/integrated_circuit/weaponized/weapon_firing/do_work() - if(!assembly || !installed_gun) + if(!assembly || !installed_gun || !installed_gun.can_shoot()) return if(isliving(assembly.loc)) var/mob/living/L = assembly.loc diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index b4940e0085..3a47cd2315 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -91,6 +91,11 @@ if(!(next_move_dir_add & movement)) next_move_dir_sub |= movement + if(prefs.modless_key_bindings[_key]) + var/datum/keybinding/kb = GLOB.keybindings_by_name[prefs.modless_key_bindings[_key]] + if(kb.can_use(src)) + kb.up(src) + // We don't do full key for release, because for mod keys you // can hold different keys and releasing any should be handled by the key binding specifically for (var/kb_name in prefs.key_bindings[_key]) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 439929b9c1..1de3a86702 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -111,9 +111,6 @@ go_inert() return ..() -/obj/item/organ/regenerative_core/prepare_eat() - return null - /*************************Legion core********************/ /obj/item/organ/regenerative_core/legion desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index f6b7110803..36e607c0b8 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -17,7 +17,6 @@ var/points = 0 //How many points this ore gets you from the ore redemption machine var/refined_type = null //What this ore defaults to being refined into novariants = TRUE // Ore stacks handle their icon updates themselves to keep the illusion that there's more going - mats_per_stack = MINERAL_MATERIAL_AMOUNT var/list/stack_overlays /obj/item/stack/ore/update_overlays() @@ -335,7 +334,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ throwforce = 2 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = 400) - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS var/string_attached var/list/sideslist = list("heads","tails") var/cooldown = 0 diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 36babd9b95..6888a6590f 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -412,6 +412,8 @@ give_guns(humanc) if(GLOB.summon_magic_triggered) give_magic(humanc) + if(GLOB.curse_of_madness_triggered) + give_madness(humanc, GLOB.curse_of_madness_triggered) GLOB.joined_player_list += character.ckey GLOB.latejoiners += character diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 612358e802..8ca4e6a0e4 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -188,7 +188,7 @@ blood_data["viruses"] += D.Copy() blood_data["blood_DNA"] = dna.unique_enzymes - blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type) + blood_data["bloodcolor"] = dna.species.exotic_blood_color if(disease_resistances && disease_resistances.len) blood_data["resistances"] = disease_resistances.Copy() var/list/temp_chem = list() diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 08d415fc3c..be03827695 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -100,3 +100,9 @@ client.mouse_pointer_icon = M.mouse_pointer if (client && ranged_ability && ranged_ability.ranged_mousepointer) client.mouse_pointer_icon = ranged_ability.ranged_mousepointer + +/mob/living/brain/proc/get_traumas() + . = list() + if(istype(loc, /obj/item/organ/brain)) + var/obj/item/organ/brain/B = loc + . = B.traumas diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 687442c1f8..4fda02317e 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -76,9 +76,6 @@ REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, C) C.update_hair() -/obj/item/organ/brain/prepare_eat() - return // Too important to eat. - /obj/item/organ/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s brain" if(brainmob) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 8485fece85..8e3966eb03 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -1,7 +1,8 @@ /obj/item/organ/alien icon_state = "xgibmid2" + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/list/alien_powers = list() - organ_flags = ORGAN_NO_SPOIL + organ_flags = ORGAN_NO_SPOIL|ORGAN_EDIBLE /obj/item/organ/alien/Initialize() . = ..() @@ -26,12 +27,6 @@ owner.RemoveAbility(P) ..() -/obj/item/organ/alien/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - - /obj/item/organ/alien/plasmavessel name = "plasma vessel" icon_state = "plasma" @@ -39,17 +34,13 @@ zone = BODY_ZONE_CHEST slot = "plasmavessel" alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer) + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10) var/storedPlasma = 100 var/max_plasma = 250 var/heal_rate = 5 var/plasma_rate = 10 -/obj/item/organ/alien/plasmavessel/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10) - return S - /obj/item/organ/alien/plasmavessel/large name = "large plasma vessel" icon_state = "plasma_large" diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 9bb50bdf42..bb92eb79bd 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -4,6 +4,7 @@ name = "alien embryo" icon = 'icons/mob/alien.dmi' icon_state = "larva0_dead" + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/stage = 0 var/bursting = FALSE @@ -16,11 +17,6 @@ if(prob(10)) AttemptGrow(0) -/obj/item/organ/body_egg/alien_embryo/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - /obj/item/organ/body_egg/alien_embryo/on_life() . = ..() if(!owner) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 7ce0fd38da..bfa9c40a7c 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -76,7 +76,7 @@ if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) affecting = bodyparts[1] SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) - send_item_attack_message(I, user, affecting.name) + send_item_attack_message(I, user, affecting.name, totitemdamage) I.do_stagger_action(src, user, totitemdamage) if(I.force) apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index b5835aef52..becff250b9 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -265,46 +265,3 @@ if(update) update_damage_overlays() update_stamina() - -/* TO_REMOVE -/mob/living/carbon/getOrganLoss(ORGAN_SLOT_BRAIN) - . = 0 - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) - if(B) - . = B.get_brain_damage() - -//Some sources of brain damage shouldn't be deadly -/mob/living/carbon/adjustOrganLoss(ORGAN_SLOT_BRAIN, amount, maximum = BRAIN_DAMAGE_DEATH) - if(status_flags & GODMODE) - return FALSE - var/prev_brainloss = getOrganLoss(ORGAN_SLOT_BRAIN) - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) - if(!B) - return - B.adjust_brain_damage(amount, maximum) - if(amount <= 0) //cut this early - return - var/brainloss = getOrganLoss(ORGAN_SLOT_BRAIN) - if(brainloss > BRAIN_DAMAGE_MILD) - if(prob(amount * ((2 * (100 + brainloss - BRAIN_DAMAGE_MILD)) / 100))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 2% - gain_trauma_type(BRAIN_TRAUMA_MILD) - if(brainloss > BRAIN_DAMAGE_SEVERE) - if(prob(amount * ((2 * (100 + brainloss - BRAIN_DAMAGE_SEVERE)) / 100))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 2% - if(prob(20)) - gain_trauma_type(BRAIN_TRAUMA_SPECIAL) - else - gain_trauma_type(BRAIN_TRAUMA_SEVERE) - - if(prev_brainloss < BRAIN_DAMAGE_MILD && brainloss >= BRAIN_DAMAGE_MILD) - to_chat(src, "You feel lightheaded.") - else if(prev_brainloss < BRAIN_DAMAGE_SEVERE && brainloss >= BRAIN_DAMAGE_SEVERE) - to_chat(src, "You feel less in control of your thoughts.") - else if(prev_brainloss < (BRAIN_DAMAGE_DEATH - 20) && brainloss >= (BRAIN_DAMAGE_DEATH - 20)) - to_chat(src, "You can feel your mind flickering on and off...") - -/mob/living/carbon/setBrainLoss(amount) - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) - if(B) - var/adjusted_amount = amount - B.get_brain_damage() - B.adjust_brain_damage(adjusted_amount, null) -*/ diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b556c45301..d79a332431 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -984,7 +984,7 @@ if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) target.visible_message("[target] can't hang onto [src]!") return - buckle_mob(target, TRUE, TRUE, FALSE, 0, 2, FALSE) + buckle_mob(target, TRUE, TRUE, FALSE, 1, 2, FALSE) else visible_message("[target] fails to climb onto [src]!") else diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 63ca3f372e..ec19cec055 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -77,7 +77,7 @@ var/turf/T = get_turf(src) if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T - if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == bloodtype_to_color(S.last_bloodtype))) + if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == S.last_blood_color)) return S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) @@ -86,6 +86,7 @@ FP.bloodiness = S.bloody_shoes[S.blood_state] if(S.last_bloodtype) FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype) + FP.blood_DNA["color"] += S.last_blood_color FP.update_icon() update_inv_shoes() //End bloody footprints diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a676d1ede5..0b83c73dca 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/use_skintones = NO_SKINTONES // does it use skintones or not? (spoiler alert this is only used by humans) var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id. var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc) + var/exotic_blood_color = BLOOD_COLOR_HUMAN //assume human as the default blood colour, override this default by species subtypes var/meat = /obj/item/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing var/list/gib_types = list(/obj/effect/gibspawner/human, /obj/effect/gibspawner/human/bodypartless) var/skinned_type @@ -1728,7 +1729,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/weakness = H.check_weakness(I, user) apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H) //CIT CHANGE - replaces I.force with totitemdamage - H.send_item_attack_message(I, user, hit_area) + H.send_item_attack_message(I, user, hit_area, totitemdamage) I.do_stagger_action(H, user, totitemdamage) diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 595a83de9b..a79f9e2392 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -15,6 +15,7 @@ disliked_food = TOXIC icon_limbs = DEFAULT_BODYPART_ICON_CITADEL exotic_bloodtype = "BUG" + exotic_blood_color = BLOOD_COLOR_BUG /datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H) if(H) diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index bc5f198b4d..7ca057711e 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -89,11 +89,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // //These count in on_life ticks which should be 2 seconds per every increment of 1 in a perfect world. var/dwarf_eth_ticker = 0 //Currently set =< 1, that means this will fire the proc around every 2 seconds var/last_alcohol_spam - -/obj/item/organ/dwarfgland/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/consumable/ethanol, stored_alcohol/10) - return S + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/ethanol = 10) /obj/item/organ/dwarfgland/on_life() //Primary loop to hook into to start delayed loops for other loops.. . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index ee4ef83a44..dbf097196d 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -11,6 +11,7 @@ disliked_food = null liked_food = GROSS exotic_bloodtype = "BUG" + exotic_blood_color = BLOOD_COLOR_BUG /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(istype(chem, /datum/reagent/toxin/pestkiller)) diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index 94d5456c3d..96efaebd74 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -20,6 +20,7 @@ mutanteyes = /obj/item/organ/eyes/ipc exotic_bloodtype = "HF" + exotic_blood_color = BLOOD_COLOR_OIL var/datum/action/innate/monitor_change/screen diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 7b14d49f2a..ce4436a343 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -13,6 +13,7 @@ gib_types = list(/obj/effect/gibspawner/slime, /obj/effect/gibspawner/slime/bodypartless) exotic_blood = /datum/reagent/blood/jellyblood exotic_bloodtype = "GEL" + exotic_blood_color = "BLOOD_COLOR_SLIME" damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs var/datum/action/innate/slime_change/slime_change //CIT CHANGE @@ -41,6 +42,11 @@ slime_change.Grant(C) //CIT CHANGE C.faction |= "slime" +/datum/species/jelly/handle_body(mob/living/carbon/human/H) + . = ..() + //update blood color to body color + exotic_blood_color = "#" + H.dna.features["mcolor"] + /datum/species/jelly/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers return @@ -534,7 +540,7 @@ H.update_body() else if (select_alteration == "Markings") - var/list/snowflake_markings_list = list() + var/list/snowflake_markings_list = list("None") for(var/path in GLOB.mam_body_markings_list) var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path] if(istype(instance, /datum/sprite_accessory)) @@ -545,8 +551,6 @@ new_mam_body_markings = input(H, "Choose your character's body markings:", "Marking Alteration") as null|anything in snowflake_markings_list if(new_mam_body_markings) H.dna.features["mam_body_markings"] = new_mam_body_markings - if(new_mam_body_markings == "None") - H.dna.features["mam_body_markings"] = "Plain" for(var/X in H.bodyparts) //propagates the markings changes var/obj/item/bodypart/BP = X BP.update_limb(FALSE, H) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 196073773b..c42e0bf175 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -21,6 +21,7 @@ gib_types = list(/obj/effect/gibspawner/lizard, /obj/effect/gibspawner/lizard/bodypartless) skinned_type = /obj/item/stack/sheet/animalhide/lizard exotic_bloodtype = "L" + exotic_blood_color = BLOOD_COLOR_LIZARD disliked_food = GRAIN | DAIRY liked_food = GROSS | MEAT inert_mutation = FIREBREATH 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 8257238e9c..78efddf70d 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -1,20 +1,28 @@ /datum/species/skeleton - // 2spooky - name = "Spooky Scary Skeleton" + name = "Skeleton" id = "skeleton" say_mod = "rattles" blacklisted = 0 sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL) - inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) + inherent_traits = list(TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/tongue/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE liked_food = GROSS | MEAT | RAW | DAIRY + brutemod = 1.25 + burnmod = 1.25 -/datum/species/skeleton/check_roundstart_eligible() +/datum/species/skeleton/New() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) //skeletons are stronger during the spooky season! + inherent_traits |= list(TRAIT_RESISTHEAT,TRAIT_RESISTCOLD) + brutemod = 1 + burnmod = 1 + ..() + +/datum/species/skeleton/greater/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) return TRUE return ..() @@ -27,4 +35,4 @@ 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 + return FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index 408d264546..af2e83ee0f 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -18,7 +18,7 @@ mutanteyes = /obj/item/organ/eyes/ipc exotic_bloodtype = "S" - + exotic_blood_color = BLOOD_COLOR_OIL /datum/species/synthliz/qualifies_for_rank(rank, list/features) return TRUE diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 3f82033760..4209e020e4 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,9 +1,13 @@ /mob/living/carbon/BiologicalLife(seconds, times_fired) //Reagent processing needs to come before breathing, to prevent edge cases. handle_organs() + . = ..() // if . is false, we are dead. if(stat == DEAD) - return FALSE - if(!(. = ..())) + stop_sound_channel(CHANNEL_HEARTBEAT) + handle_death() + rot() + . = FALSE + if(!.) return handle_blood() // handle_blood *could* kill us. @@ -21,12 +25,6 @@ if(stat != DEAD) handle_liver() - if(stat == DEAD) - stop_sound_channel(CHANNEL_HEARTBEAT) - handle_death() - rot() - . = FALSE - //Updates the number of stored chemicals for powers handle_changeling() diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 4899067d7b..1a796fb2bc 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -68,7 +68,7 @@ var/dam_colors = "#E62525" if(ishuman(src)) var/mob/living/carbon/human/H = src - dam_colors = bloodtype_to_color(H.dna.blood_type) + dam_colors = H.dna.species.exotic_blood_color var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER, color = dam_colors) overlays_standing[DAMAGE_LAYER] = damage_overlay diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm index 32038a6102..654a979445 100644 --- a/code/modules/mob/living/living_mobility.dm +++ b/code/modules/mob/living/living_mobility.dm @@ -96,7 +96,13 @@ mobility_flags &= ~MOBILITY_STAND setMovetype(movement_type | CRAWLING) if(!lying) //force them on the ground - lying = pick(90, 270) + switch(dir) + if(NORTH, SOUTH) + lying = pick(90, 270) + if(EAST) + lying = 90 + else //West + lying = 270 if(has_gravity() && !buckled) playsound(src, "bodyfall", 20, 1) else diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index cb43a8489a..9e1e7a1b89 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -128,7 +128,7 @@ S.source = get_or_create_estorage(/datum/robot_energy_storage/wrapping_paper) if(S && S.source) - S.custom_materials = null + S.set_custom_materials(null) S.is_cyborg = 1 if(I.loc != src) diff --git a/code/modules/mob/living/simple_animal/friendly/panda.dm b/code/modules/mob/living/simple_animal/friendly/panda.dm index 7e523fea83..b3e8c1438f 100644 --- a/code/modules/mob/living/simple_animal/friendly/panda.dm +++ b/code/modules/mob/living/simple_animal/friendly/panda.dm @@ -21,3 +21,6 @@ response_harm_simple = "kick" gold_core_spawnable = FRIENDLY_SPAWN footstep_type = FOOTSTEP_MOB_CLAW + +/mob/living/simple_animal/pet/redpanda/stinky + name = "Stinky" 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 69d4ebe4df..0ccc4525c7 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 @@ -44,7 +44,7 @@ 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/, /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. + /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 another day. var/obj/item/udder/gutlunch/udder = null /mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 057a234bde..52b755d926 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -349,7 +349,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code return 1 -/proc/notify_ghosts(message, ghost_sound, enter_link, atom/source, mutable_appearance/alert_overlay, action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key, ignore_dnr_observers = FALSE) //Easy notification of ghosts. +/proc/notify_ghosts(message, ghost_sound, enter_link, atom/source, mutable_appearance/alert_overlay, action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key, ignore_dnr_observers = FALSE, header) //Easy notification of ghosts. if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load return for(var/mob/dead/observer/O in GLOB.player_list) @@ -366,6 +366,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(A) if(O.client.prefs && O.client.prefs.UI_style) A.icon = ui_style2icon(O.client.prefs.UI_style) + if (header) + A.name = header A.desc = message A.action = action A.target = source diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index a403845ee2..14ddc5c720 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -57,6 +57,12 @@ else return ..() +/proc/uncostumize_say(input, message_mode) + . = input + if(message_mode == MODE_CUSTOM_SAY) + var/customsayverb = findtext(input, "*") + return lowertext(copytext_char(input, 1, customsayverb)) + /mob/proc/whisper_keybind() var/message = input(src, "", "whisper") as text|null if(!length(message)) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 8ebddaa24f..9ea030da99 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -114,11 +114,13 @@ /obj/item/ammo_box/update_icon() . = ..() desc = "[initial(desc)] There [stored_ammo.len == 1 ? "is" : "are"] [stored_ammo.len] shell\s left!" - for (var/material in bullet_cost) - var/material_amount = bullet_cost[material] - material_amount = (material_amount*stored_ammo.len) + base_cost[material] - custom_materials[material] = material_amount - set_custom_materials(custom_materials)//make sure we setup the correct properties again + if(length(bullet_cost)) + var/temp_materials = custom_materials.Copy() + for (var/material in bullet_cost) + var/material_amount = bullet_cost[material] + material_amount = (material_amount*stored_ammo.len) + base_cost[material] + temp_materials[material] = material_amount + set_custom_materials(temp_materials) /obj/item/ammo_box/update_icon_state() switch(multiple_sprites) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 49c069ca62..0c723199a1 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -34,13 +34,6 @@ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' ammo_type = list(/obj/item/ammo_casing/energy/kinetic/premium) -/obj/item/gun/energy/kinetic_accelerator/premiumka/dropped(mob/user) - . = ..() - if(!QDELING(src) && !holds_charge) - // Put it on a delay because moving item from slot to hand - // calls dropped(). - addtimer(CALLBACK(src, .proc/empty_if_not_held), 1.60) - /obj/item/ammo_casing/energy/kinetic/premium projectile_type = /obj/item/projectile/kinetic/premium @@ -151,7 +144,7 @@ addtimer(CALLBACK(src, .proc/empty_if_not_held), 2) /obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held() - if(!ismob(loc)) + if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit)) empty() /obj/item/gun/energy/kinetic_accelerator/proc/empty() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index ce87eddc67..0c8a9deaf8 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -9,7 +9,7 @@ fire_sound = 'sound/weapons/emitter.ogg' flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_HUGE - var/checks_antimagic = FALSE + var/checks_antimagic = TRUE var/max_charges = 6 var/charges = 0 var/recharge_rate = 4 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f279047356..7c988ca730 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -239,7 +239,7 @@ else if(ishuman(target)) var/mob/living/carbon/human/H = target - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color(H.dna.blood_type)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, H.dna.species.exotic_blood_color) else new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color()) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index b22f34091f..385a82baa5 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2291,7 +2291,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/oil_drum name = "Oil Drum" color = "#000000" //(0, 0, 0) - description = "Industeral grade oil mixed with some ethanol to make it a drink. Somehow not known to be toxic." + description = "Industrial grade oil mixed with some ethanol to make it a drink. Somehow not known to be toxic." boozepwr = 45 taste_description = "oil spill" glass_icon_state = "oil_drum" @@ -2308,7 +2308,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/nord_king name = "Nord King" color = "#EB1010" //(235, 16, 16) - description = "Strong mead mixed with more honey and ethanol. Known to beloved by most palettes." + description = "Strong mead mixed with more honey and ethanol. Beloved by its human patrons." boozepwr = 50 //strong! taste_description = "honey and red wine" glass_icon_state = "nord_king" @@ -2347,7 +2347,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "grass and lime" glass_icon_state = "abduction_fruit" glass_name = "glass of Abduction Fruit" - glass_desc = "Mixed fruits that were never ment to be mixed..." + glass_desc = "Mixed fruits that were never meant to be mixed..." /datum/reagent/consumable/ethanol/abduction_fruit/on_mob_life(mob/living/carbon/M) if(isabductor(M) || isxenoperson(M)) @@ -2359,7 +2359,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bug_zapper name = "Bug Zapper" color = "#F5882A" //(222, 250, 205) - description = "Metals and lemon juice. Hardly even a drink." + description = "Copper and lemon juice. Hardly even a drink." boozepwr = 5 //No booze really taste_description = "copper and AC power" glass_icon_state = "bug_zapper" @@ -2381,7 +2381,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "dirt and iron" glass_icon_state = "mush_crush" glass_name = "glass of Mush Crush" - glass_desc = "Popular among people that want to grow their own food rather then drink the soil." + glass_desc = "Popular among people that want to grow their own food rather than drink the soil." /datum/reagent/consumable/ethanol/mush_crush/on_mob_life(mob/living/carbon/M) if(ispodperson(M) || ismush(M)) @@ -2456,7 +2456,7 @@ All effects don't start immediately, but rather get worse over time; the rate is quality = RACE_DRINK else M.adjust_disgust(25) - M.adjustToxLoss(1, 0) //Low tox do to being carp + jell toxins. + M.adjustToxLoss(1, 0) //Low tox due to being carp + jell toxins. return ..() /datum/reagent/consumable/ethanol/laval_spit //Yes Laval diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 117748afc0..93842a16c2 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -70,6 +70,8 @@ B = new(T) if(data["blood_DNA"]) B.blood_DNA[data["blood_DNA"]] = data["blood_type"] + if(!B.blood_DNA["color"]) + B.blood_DNA["color"] = list(data["bloodcolor"]) if(B.reagents) B.reagents.add_reagent(type, reac_volume) B.update_icon() @@ -77,7 +79,7 @@ /datum/reagent/blood/on_new(list/data) if(istype(data)) SetViruses(src, data) - color = bloodtype_to_color(data["blood_type"]) + color = data["bloodcolor"] if(data["blood_type"] == "SY") name = "Synthetic Blood" taste_description = "oil" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index df1b57c20b..a8aec91669 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -87,7 +87,7 @@ new /obj/item/stack/sheet/mineral/uranium(location) /datum/chemical_reaction/bluespacecrystalifaction - name = "Crystal Bluespace" + name = "Crystallized Bluespace" id = "crystalbluespace" required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/bluespace = 20, /datum/reagent/iron = 1) mob_react = FALSE diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index fca04f239e..ec1e7823ed 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -11,8 +11,8 @@ grind_results = list() var/apply_type = INGEST var/apply_method = "swallow" - var/roundstart = 0 - var/self_delay = 0 //pills are instant, this is because patches inheret their aplication from pills + var/roundstart = FALSE + var/self_delay = FALSE //pills are instant, this is because patches inheret their aplication from pills var/dissolvable = TRUE /obj/item/reagent_containers/pill/Initialize() @@ -83,119 +83,126 @@ desc = "Highly toxic." icon_state = "pill5" list_reagents = list(/datum/reagent/toxin = 50) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/cyanide name = "cyanide pill" desc = "Don't swallow this." icon_state = "pill5" list_reagents = list(/datum/reagent/toxin/cyanide = 50) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/adminordrazine name = "adminordrazine pill" desc = "It's magic. We don't have to explain it." icon_state = "pill16" list_reagents = list(/datum/reagent/medicine/adminordrazine = 50) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/morphine name = "morphine pill" desc = "Commonly used to treat insomnia." icon_state = "pill8" list_reagents = list(/datum/reagent/medicine/morphine = 30) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/stimulant name = "stimulant pill" desc = "Often taken by overworked employees, athletes, and the inebriated. You'll snap to attention immediately!" icon_state = "pill19" list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/medicine/antihol = 10, /datum/reagent/consumable/coffee = 30) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/salbutamol name = "salbutamol pill" desc = "Used to treat oxygen deprivation." icon_state = "pill16" list_reagents = list(/datum/reagent/medicine/salbutamol = 30) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/charcoal name = "charcoal pill" desc = "Neutralizes many common toxins." icon_state = "pill17" list_reagents = list(/datum/reagent/medicine/charcoal = 10) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/epinephrine name = "epinephrine pill" desc = "Used to stabilize patients." icon_state = "pill5" list_reagents = list(/datum/reagent/medicine/epinephrine = 15) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/mannitol name = "mannitol pill" desc = "Used to treat brain damage." icon_state = "pill17" list_reagents = list(/datum/reagent/medicine/mannitol = 25) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/mutadone name = "mutadone pill" desc = "Used to treat genetic damage." icon_state = "pill20" list_reagents = list(/datum/reagent/medicine/mutadone = 25) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/salicyclic name = "salicylic acid pill" desc = "Used to dull pain." icon_state = "pill9" list_reagents = list(/datum/reagent/medicine/sal_acid = 24) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/oxandrolone name = "oxandrolone pill" desc = "Used to stimulate burn healing." icon_state = "pill11" list_reagents = list(/datum/reagent/medicine/oxandrolone = 24) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/insulin name = "insulin pill" desc = "Handles hyperglycaemic coma." icon_state = "pill18" list_reagents = list(/datum/reagent/medicine/insulin = 50) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/psicodine name = "psicodine pill" - desc = "Used to treat mental instability and traumas." + desc = "Used to treat mental instability and phobias." list_reagents = list(/datum/reagent/medicine/psicodine = 10) icon_state = "pill22" - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/antirad name = "potassium iodide pill" desc = "Used to treat radition used to counter radiation poisoning." icon_state = "pill18" list_reagents = list(/datum/reagent/medicine/potass_iodide = 50) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/antirad_plus name = "prussian blue pill" desc = "Used to treat heavy radition poisoning." icon_state = "prussian_blue" list_reagents = list(/datum/reagent/medicine/prussian_blue = 25) - roundstart = 1 + roundstart = TRUE /obj/item/reagent_containers/pill/mutarad name = "radiation treatment deluxe pill" desc = "Used to treat heavy radition poisoning and genetic defects." icon_state = "anit_rad_fixgene" list_reagents = list(/datum/reagent/medicine/prussian_blue = 10, /datum/reagent/medicine/potass_iodide = 10, /datum/reagent/medicine/mutadone = 5) - roundstart = 1 + roundstart = TRUE + +/obj/item/reagent_containers/pill/neurine + name = "neurine pill" + desc = "Used to treat non-severe mental traumas." + list_reagents = list("neurine" = 10) + icon_state = "pill22" + roundstart = TRUE ///////////////////////////////////////// this pill is used only in a legion mob drop /obj/item/reagent_containers/pill/shadowtoxin diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm index 320f856b35..3c9c8f9aca 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm @@ -81,7 +81,16 @@ materials = list(/datum/material/iron = 50, /datum/material/glass = 50) build_path = /obj/item/airlock_painter category = list("initial", "Misc","Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SERVICE + +/datum/design/airlock_painter/decal + name = "Decal Painter" + id = "decal_painter" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/iron = 50, /datum/material/glass = 50) + build_path = /obj/item/airlock_painter/decal + category = list("initial","Tools","Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SERVICE /datum/design/cultivator name = "Cultivator" diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm index 516c91d426..1bb18482f3 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm @@ -148,7 +148,8 @@ build_type = AUTOLATHE materials = list(/datum/material/iron = 100, /datum/material/glass = 100) build_path = /obj/item/toy/crayon/spraycan - category = list("initial", "Tools") + category = list("initial", "Tools", "Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE /datum/design/geiger name = "Geiger Counter" diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm index 804556cb04..e0702be689 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm @@ -154,3 +154,12 @@ build_path = /obj/item/circuitboard/machine/shuttle/heater category = list ("Shuttle Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/sheetifier + name = "Sheetifier" + desc = "This machine turns weird things into sheets." + id = "sheetifier" + build_path = /obj/item/circuitboard/machine/sheetifier + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ALL + diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index a5df3f4d12..5a50120833 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -96,7 +96,7 @@ for(var/i in 1 to amount) var/obj/O = new path(get_turf(src)) if(efficient_with(O.type)) - O.set_custom_materials(matlist.Copy()) + O.set_custom_materials(matlist) O.rnd_crafted(src) SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 503bd8bae7..a0f0c651f0 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -24,10 +24,10 @@ var/list/tiers = list() //Assoc list, id = number, 1 is available, 2 is all reqs are 1, so on /datum/techweb/New() + hidden_nodes = SSresearch.techweb_nodes_hidden.Copy() for(var/i in SSresearch.techweb_nodes_starting) var/datum/techweb_node/DN = SSresearch.techweb_node_by_id(i) research_node(DN, TRUE, FALSE) - hidden_nodes = SSresearch.techweb_nodes_hidden.Copy() return ..() /datum/techweb/admin diff --git a/code/modules/research/techweb/nodes/engineering_nodes.dm b/code/modules/research/techweb/nodes/engineering_nodes.dm index eac8c2faf2..d024823c85 100644 --- a/code/modules/research/techweb/nodes/engineering_nodes.dm +++ b/code/modules/research/techweb/nodes/engineering_nodes.dm @@ -16,7 +16,9 @@ display_name = "Advanced Engineering" description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") - design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large") + design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", + "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", + "rcd_upgrade_simple_circuits", "rcd_ammo_large", "sheetifier") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) /datum/techweb_node/anomaly diff --git a/code/modules/research/techweb/nodes/tools_nodes.dm b/code/modules/research/techweb/nodes/tools_nodes.dm index 5d8d40f10d..b084979116 100644 --- a/code/modules/research/techweb/nodes/tools_nodes.dm +++ b/code/modules/research/techweb/nodes/tools_nodes.dm @@ -5,7 +5,7 @@ display_name = "Basic Tools" description = "Basic mechanical, electronic, surgical and botanical tools." prereq_ids = list("base") - design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash") + design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "decal_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash", "spraycan") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) /datum/techweb_node/basic_mining diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm index 6945c93427..f5ddf12182 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm @@ -58,7 +58,7 @@ . = ..() owner_rsd.overlay_holder.remove_client() eyeobj.invisibility = INVISIBILITY_MAXIMUM - if(user.client) + if(user?.client) user.client.images -= eyeobj.user_image /obj/machinery/computer/camera_advanced/shuttle_creator/attack_hand(mob/user) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm index 919b1f0221..83c03ed33c 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm @@ -12,8 +12,9 @@ holder.images += images /datum/shuttle_creator_overlay_holder/proc/remove_client() - holder.images -= images - holder = null + if(holder) + holder.images -= images + holder = null /datum/shuttle_creator_overlay_holder/proc/clear_highlights() if(holder) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 143fe508b6..21552f7e87 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -120,7 +120,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/list/mobs_blacklist //The opposite of the above. var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells var/phase_allowed = 0 // If true, the spell can be cast while phased, eg. blood crawling, ethereal jaunting - var/antimagic_allowed = TRUE // If false, the spell cannot be cast while under the effect of antimagic + var/antimagic_allowed = FALSE // If false, the spell cannot be cast while under the effect of antimagic var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell var/invocation_emote_self = null var/invocation_type = "none" //can be none, whisper, emote and shout diff --git a/code/modules/spells/spell_types/curse.dm b/code/modules/spells/spell_types/curse.dm new file mode 100644 index 0000000000..9449e4a5d0 --- /dev/null +++ b/code/modules/spells/spell_types/curse.dm @@ -0,0 +1,37 @@ +GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE) + +/proc/curse_of_madness(mob/user, message) + if(user) //in this case either someone holding a spellbook or a badmin + to_chat(user, "You sent a curse of madness with the message \"[message]\"!") + message_admins("[ADMIN_LOOKUPFLW(user)] sent a curse of madness with the message \"[message]\"!") + log_game("[key_name(user)] sent a curse of madness with the message \"[message]\"!") + + GLOB.curse_of_madness_triggered = message // So latejoiners are also afflicted. + + deadchat_broadcast("A Curse of Madness has stricken the station, shattering their minds with the awful secret: \"[message]\"") + + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(H.stat == DEAD) + continue + var/turf/T = get_turf(H) + if(T && !is_station_level(T.z)) + continue + if(H.anti_magic_check(TRUE, FALSE, TRUE)) + to_chat(H, "You have a strange feeling for a moment, but then it passes.") + continue + give_madness(H, message) + +/proc/give_madness(mob/living/carbon/human/H, message) + H.playsound_local(H,'sound/magic/curse.ogg',40,1) + to_chat(H, "[message]") + to_chat(H, "Your mind shatters!") + switch(rand(1,10)) + if(1 to 3) + H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY) + H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY) + if(4 to 6) + H.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) + if(7 to 8) + H.gain_trauma_type(BRAIN_TRAUMA_MAGIC, TRAUMA_RESILIENCE_LOBOTOMY) + if(9 to 10) + H.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_LOBOTOMY) diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index 8f39da5031..26a6b57b25 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -12,6 +12,7 @@ range = 0 cast_sound = null mobs_whitelist = list(/mob/living/carbon/human) + antimagic_allowed = TRUE action_icon_state = "mime" action_background_icon_state = "bg_mime" @@ -40,6 +41,7 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" + antimagic_allowed = TRUE /obj/effect/proc_holder/spell/targeted/mime/speak/Trigger(mob/user, skip_can_cast = TRUE) if(user.mind?.miming) @@ -76,6 +78,7 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" + antimagic_allowed = TRUE /obj/effect/proc_holder/spell/targeted/forcewall/mime/Trigger(mob/user, skip_can_cast = TRUE) if(user.mind) @@ -107,6 +110,7 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" base_icon_state = "mime" + antimagic_allowed = TRUE /obj/effect/proc_holder/spell/aimed/finger_guns/Trigger(mob/user, skip_can_cast = TRUE) @@ -137,6 +141,7 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" hand_path = /obj/item/melee/touch_attack/mimerope + antimagic_allowed = TRUE /obj/effect/proc_holder/spell/targeted/touch/mimerope/Trigger(mob/user, skip_can_cast = TRUE) if(user.mind) diff --git a/code/modules/spells/spell_types/santa.dm b/code/modules/spells/spell_types/santa.dm index 64ed925455..4f6957433b 100644 --- a/code/modules/spells/spell_types/santa.dm +++ b/code/modules/spells/spell_types/santa.dm @@ -13,3 +13,4 @@ summon_type = list("/obj/item/a_gift") summon_lifespan = 0 summon_amt = 5 + antimagic_allowed = TRUE diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index 83996b5bfb..1dd949caa0 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -12,6 +12,7 @@ action_icon = 'icons/mob/actions/actions_minor_antag.dmi' action_icon_state = "ninja_cloak" action_background_icon_state = "bg_alien" + antimagic_allowed = TRUE /obj/effect/proc_holder/spell/targeted/shadowwalk/cast(list/targets,mob/living/user = usr) var/L = user.loc diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm index 5b1e09565b..59826daf07 100644 --- a/code/modules/spells/spell_types/taeclowndo.dm +++ b/code/modules/spells/spell_types/taeclowndo.dm @@ -10,6 +10,7 @@ cooldown_min = 30 action_icon = 'icons/obj/food/piecake.dmi' action_icon_state = "pie" + antimagic_allowed = TRUE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -24,6 +25,7 @@ range = 7 selection_type = "view" projectile_type = null + antimagic_allowed = TRUE active_msg = "You focus, your mind reaching to the clown dimension, ready to make a peel matrialize wherever you want!" deactive_msg = "You relax, the peel remaining right in the \"thin air\" it would appear out of." @@ -62,6 +64,7 @@ charge_max = 100 clothes_req = NONE cooldown_min = 100 + antimagic_allowed = TRUE action_icon = 'icons/mecha/mecha_equipment.dmi' action_icon_state = "mecha_honker" @@ -76,6 +79,7 @@ charge_max = 450 clothes_req = NONE cooldown_min = 450 + antimagic_allowed = TRUE action_icon = 'icons/obj/food/piecake.dmi' action_icon_state = "frostypie" diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm index 4b4f91eb18..caf9ec79c6 100644 --- a/code/modules/spells/spell_types/telepathy.dm +++ b/code/modules/spells/spell_types/telepathy.dm @@ -8,6 +8,7 @@ action_icon = 'icons/mob/actions/actions_revenant.dmi' action_icon_state = "r_transmit" action_background_icon_state = "bg_spell" + antimagic_allowed = TRUE var/notice = "notice" var/boldnotice = "boldnotice" var/magic_check = FALSE diff --git a/code/modules/spells/spell_types/voice_of_god.dm b/code/modules/spells/spell_types/voice_of_god.dm index 495681a818..a920344adc 100644 --- a/code/modules/spells/spell_types/voice_of_god.dm +++ b/code/modules/spells/spell_types/voice_of_god.dm @@ -5,6 +5,7 @@ cooldown_min = 0 level_max = 1 clothes_req = NONE + antimagic_allowed = TRUE action_icon = 'icons/mob/actions/actions_items.dmi' action_icon_state = "voice_of_god" var/command diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index e9432e2f58..b104c2182a 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -306,6 +306,7 @@ sound = 'sound/magic/tail_swing.ogg' charge_max = 150 clothes_req = NONE + antimagic_allowed = TRUE range = 2 cooldown_min = 150 invocation_type = "none" diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index f493137424..4ce51ae119 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -61,7 +61,7 @@ time = 64 name = "manipulate organs" repeatable = 1 - implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100) + implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100) var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55) var/current_type var/obj/item/organ/I = null @@ -85,6 +85,10 @@ if(target_zone != I.zone || target.getorganslot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") return -1 + var/obj/item/organ/meatslab = tool + if(!meatslab.useable) + to_chat(user, "[I] seems to have been chewed on, you can't use this!") + return -1 display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...", "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") @@ -111,9 +115,6 @@ else return -1 - else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ)) - to_chat(user, "[tool] was bitten by someone! It's too damaged to use!") - return -1 /datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(current_type == "insert") if(istype(tool, /obj/item/organ_storage)) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index c737e8bc30..782991d79c 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -37,9 +37,3 @@ ..() if(inflamed) M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) - -/obj/item/organ/appendix/prepare_eat() - var/obj/S = ..() - if(inflamed) - S.reagents.add_reagent(/datum/reagent/toxin/bad_food, 5) - return S diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 465c10c4cd..e251abfd35 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -61,10 +61,10 @@ return "a healthy" return "an unstable" -/obj/item/organ/heart/prepare_eat() - var/obj/S = ..() - S.icon_state = "[icon_base]-off" - return S +/obj/item/organ/heart/OnEatFrom(eater, feeder) + . = ..() + beating = FALSE + update_icon() /obj/item/organ/heart/on_life() . = ..() diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index b24034ca4a..2465b63800 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -23,6 +23,7 @@ var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver var/filterToxins = TRUE //whether to filter toxins var/cachedmoveCalc = 1 + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5) /obj/item/organ/liver/on_life() . = ..() @@ -44,11 +45,6 @@ if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability to_chat(owner, "You feel a dull pain in your abdomen.") -/obj/item/organ/liver/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/iron, 5) - return S - /obj/item/organ/liver/applyOrganDamage(d, maximum = maxHealth) . = ..() if(!. || QDELETED(owner)) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index b3020ae13f..949eef62d0 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -24,6 +24,8 @@ now_fixed = "Your lungs seem to once again be able to hold air." high_threshold_cleared = "The constriction around your chest loosens as your breathing calms down." + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) + //Breath damage var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa @@ -458,11 +460,6 @@ else if(!(organ_flags & ORGAN_FAILING)) failed = FALSE -/obj/item/organ/lungs/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5) - return S - /obj/item/organ/lungs/ipc name = "ipc lungs" icon_state = "lungs-c" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 761ebc17a2..0378340117 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,7 +8,7 @@ var/zone = BODY_ZONE_CHEST var/slot // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! - var/organ_flags = NONE + var/organ_flags = ORGAN_EDIBLE var/maxHealth = STANDARD_ORGAN_THRESHOLD var/damage = 0 //total damage this organ has sustained ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick @@ -25,7 +25,23 @@ var/now_fixed var/high_threshold_cleared var/low_threshold_cleared - rad_flags = RAD_NO_CONTAMINATE + + ///When you take a bite you cant jam it in for surgery anymore. + var/useable = TRUE + var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) + +/obj/item/organ/Initialize() + . = ..() + if(organ_flags & ORGAN_EDIBLE) + AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GROSS, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom)) + START_PROCESSING(SSobj, src) + +/obj/item/organ/Destroy() + if(owner) + // The special flag is important, because otherwise mobs can die + // while undergoing transformation into different mobs. + Remove(TRUE) + return ..() /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) if(!iscarbon(M) || owner == M) @@ -157,47 +173,8 @@ if(damage > high_threshold) . += "[src] is starting to look discolored." - -/obj/item/organ/proc/prepare_eat() - var/obj/item/reagent_containers/food/snacks/organ/S = new - S.name = name - S.desc = desc - S.icon = icon - S.icon_state = icon_state - S.w_class = w_class - - return S - -/obj/item/reagent_containers/food/snacks/organ - name = "appendix" - icon_state = "appendix" - icon = 'icons/obj/surgery.dmi' - list_reagents = list(/datum/reagent/consumable/nutriment = 5) - foodtype = RAW | MEAT | GROSS - - -/obj/item/organ/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/organ/Destroy() - if(owner) - // The special flag is important, because otherwise mobs can die - // while undergoing transformation into different mobs. - Remove(TRUE) - return ..() - -/obj/item/organ/attack(mob/living/carbon/M, mob/user) - if(M == user && ishuman(user)) - var/mob/living/carbon/human/H = user - if(status == ORGAN_ORGANIC) - var/obj/item/reagent_containers/food/snacks/S = prepare_eat() - if(S) - qdel(src) - if(H.put_in_active_hand(S)) - S.attack(H, H) - else - ..() +/obj/item/organ/proc/OnEatFrom(eater, feeder) + useable = FALSE //You can't use it anymore after eating it you spaztic /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index f8547dda6e..1c4a2d3043 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -252,6 +252,7 @@ name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." status = ORGAN_ROBOTIC + organ_flags = ORGAN_NO_SPOIL icon_state = "tonguerobot" say_mod = "states" attack_verb = list("beeped", "booped") diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 5f51939909..e6cf779162 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -525,7 +525,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(4) // paralyze this binch // the new paraplegic gets like 4 lines of losing their legs so skip them visible_message("[C]'s spinal cord is obliterated with a sickening crunch!", ignored_mobs = list(C)) - C.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) + C.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped) if(5) // skull squish! var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD) if(O) diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 92e40bc3a8..29d1e760d4 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -14,8 +14,7 @@ /obj/item/stock_parts/cell/upgraded = 2) premium = list(/obj/item/stock_parts/cell/upgraded/plus = 2, /obj/item/flashlight/lantern = 2, - /obj/item/beacon = 2, - /obj/item/airlock_painter/decal = 5) + /obj/item/beacon = 2) product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/assist diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 50e0fb9cde..965ebddd15 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -15,7 +15,6 @@ /obj/item/electronics/airalarm = 10, /obj/item/electronics/firealarm = 10, /obj/item/electronics/firelock = 10, - /obj/item/airlock_painter/decal = 5, /obj/item/rcd_ammo = 3 ) contraband = list(/obj/item/stock_parts/cell/potato = 3, @@ -25,7 +24,8 @@ ) premium = list(/obj/item/storage/belt/utility = 3, /obj/item/storage/box/smart_metal_foam = 3, - /obj/item/rcd_ammo/large = 5 + /obj/item/rcd_ammo/large = 5, + /obj/item/storage/bag/material = 3 ) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/engivend diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index 24fb685eac..c416d87439 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -21,10 +21,10 @@ /obj/item/dildo/custom = 5, /obj/item/electropack/shockcollar = 3, /obj/item/assembly/signaler = 3, - /obj/item/clothing/under/shorts/polychromic/pantsu, - /obj/item/clothing/under/misc/poly_bottomless, - /obj/item/clothing/under/misc/poly_tanktop, - /obj/item/clothing/under/misc/poly_tanktop/female + /obj/item/clothing/under/shorts/polychromic/pantsu = 3, + /obj/item/clothing/under/misc/poly_bottomless = 3, + /obj/item/clothing/under/misc/poly_tanktop = 3, + /obj/item/clothing/under/misc/poly_tanktop/female = 3 ) contraband = list( /obj/item/clothing/neck/petcollar/locked = 2, diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 35e4b3232a..8ad4b0568c 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -15,8 +15,7 @@ /obj/item/secbat = 5) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, - /obj/item/ssword_kit = 1, - /obj/item/storage/bag/ammo = 1) + /obj/item/ssword_kit = 1) premium = list(/obj/item/coin/antagtoken = 1, /obj/item/clothing/head/helmet/blueshirt = 1, /obj/item/clothing/suit/armor/vest/blueshirt = 1, @@ -24,7 +23,7 @@ /obj/item/clothing/gloves/tackler = 5, /obj/item/grenade/stingbang = 1, /obj/item/ssword_kit = 1, - /obj/item/storage/bag/ammo = 2) + /obj/item/storage/bag/ammo = 3) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/security diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index c936d9c32c..2119197aed 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -18,8 +18,7 @@ /obj/item/clothing/gloves/color/fyellow = 4, /obj/item/multitool = 2) premium = list(/obj/item/clothing/gloves/color/yellow = 2, - /obj/item/weldingtool/hugetank = 2, - /obj/item/airlock_painter/decal = 3) + /obj/item/weldingtool/hugetank = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) refill_canister = /obj/item/vending_refill/tool resistance_flags = FIRE_PROOF diff --git a/html/changelog.html b/html/changelog.html index eb29a97c12..3ff7bdb144 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,76 @@ -->
+

29 June 2020

+

b1tt3r1n0 updated:

+ +

timothyteakettle updated:

+ + +

28 June 2020

+

Detective-Google updated:

+ +

Ghommie updated:

+ +

Ghommie porting PRs by Qustinnus/Floyd, Willow, cacogen, nemvar, Ghilker and EOBGames (Inept) updated:

+ +

MrJWhit updated:

+ +

Putnam3145 updated:

+ +

b1tt3r1n0 updated:

+ +

timothyteakettle updated:

+ + +

27 June 2020

+

Detective-Google updated:

+ +

timothyteakettle updated:

+ +

26 June 2020

Ghommie updated: