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 += "| Skill | Value |
"
- 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 += "| [S.name] | [S.standard_render_value(skill_value, skill_level)] |
"
- out += "
"
- 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:
+
+ - Made teratomas from sdgf less powergame
+
+
timothyteakettle updated:
+
+ - slimes no longer have white blood by default
+
+
+
28 June 2020
+
Detective-Google updated:
+
+ - cog is less the suck
+ - piggybacking is no longer absolutely inferior
+
+
Ghommie updated:
+
+ - Fixing windows interaction with spraycans.
+ - Fixing kinetic accelerator guns not working well with gun circuitries.
+ - Fixing Zoomba borgs lights overlays.
+ - Fixing the "absorb another ling" and "absorb the most dna" objectives rolling when no other changeling is around.
+ - Clarified a pet peeve about the spread infestation ability.
+ - BEPIS nodes won't show up anymore in the expert mode ui of the r&d console anymore (good thing they weren't researchable).
+ - Hopefully fixing sound loop edge cases.
+ - Fixing pAI radios being permanently disabled by EMPs at times.
+ - Windoors can now be obscured with spraycans just like windows.
+
+
Ghommie porting PRs by Qustinnus/Floyd, Willow, cacogen, nemvar, Ghilker and EOBGames (Inept) updated:
+
+ - Fixes a material duplication bug.
+ - unique combinations of custom_materials lists are now shared between objects
+ - meat material. yes.
+ - materials can now be used to build walls/floors. meat house
+ - edible component now does not try to attack if you eat something with it
+ - Texture support for mat datums with thanks to 4DPlanner!
+ - you no longer hit yourself with organs when eating
+ - A whole bunch of materials are now datumised! Check out bronze, runed metal, sand, sandstone, snow, paper, cardboard, bone and bamboo. Oh, and pizza. Yes, pizza.
+ - Buffs material floor tiles' throwforces from 1 to 10 (same as iron) to better showcase the effect of different materials (e.g. meat vs. titanium)
+ - Radioactive items no longer output a single . when examined at a distance
+
+
MrJWhit updated:
+
+ - Removed air alarm in Snow Snaxi in Tcomms Sat
+ - Removed trash bins in genetics and mining
+ - Gives cargo techs a cargolathe
+
+
Putnam3145 updated:
+
+ - lost my mind just a couple of times
+
+
b1tt3r1n0 updated:
+
+ - pouches, again, and and material pouches.
+
+
timothyteakettle updated:
+
+ - support for custom blood colours implemented, slimes blood colour now equivalent to their body colour
+
+
+
27 June 2020
+
Detective-Google updated:
+
+
timothyteakettle updated:
+
+ - felinids now nya when tabled
+
+
26 June 2020
Ghommie updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 468ba0e049..a65ba322e7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -26084,3 +26084,56 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
of the same faction.
silicons:
- bugfix: soap cleans blood again
+2020-06-27:
+ Detective-Google:
+ - tweak: Lying down is better
+ timothyteakettle:
+ - rscadd: felinids now nya when tabled
+2020-06-28:
+ Detective-Google:
+ - bugfix: cog is less the suck
+ - tweak: piggybacking is no longer absolutely inferior
+ Ghommie:
+ - bugfix: Fixing windows interaction with spraycans.
+ - bugfix: Fixing kinetic accelerator guns not working well with gun circuitries.
+ - bugfix: Fixing Zoomba borgs lights overlays.
+ - bugfix: Fixing the "absorb another ling" and "absorb the most dna" objectives
+ rolling when no other changeling is around.
+ - spellcheck: Clarified a pet peeve about the spread infestation ability.
+ - bugfix: BEPIS nodes won't show up anymore in the expert mode ui of the r&d console
+ anymore (good thing they weren't researchable).
+ - bugfix: Hopefully fixing sound loop edge cases.
+ - bugfix: Fixing pAI radios being permanently disabled by EMPs at times.
+ - rscadd: Windoors can now be obscured with spraycans just like windows.
+ Ghommie porting PRs by Qustinnus/Floyd, Willow, cacogen, nemvar, Ghilker and EOBGames (Inept):
+ - bugfix: Fixes a material duplication bug.
+ - code_imp: unique combinations of custom_materials lists are now shared between
+ objects
+ - rscadd: meat material. yes.
+ - rscadd: materials can now be used to build walls/floors. meat house
+ - bugfix: edible component now does not try to attack if you eat something with
+ it
+ - rscadd: Texture support for mat datums with thanks to 4DPlanner!
+ - bugfix: you no longer hit yourself with organs when eating
+ - rscadd: A whole bunch of materials are now datumised! Check out bronze, runed
+ metal, sand, sandstone, snow, paper, cardboard, bone and bamboo. Oh, and pizza.
+ Yes, pizza.
+ - balance: Buffs material floor tiles' throwforces from 1 to 10 (same as iron) to
+ better showcase the effect of different materials (e.g. meat vs. titanium)
+ - bugfix: Radioactive items no longer output a single . when examined at a distance
+ MrJWhit:
+ - rscdel: Removed air alarm in Snow Snaxi in Tcomms Sat
+ - rscdel: Removed trash bins in genetics and mining
+ - tweak: Gives cargo techs a cargolathe
+ Putnam3145:
+ - bugfix: lost my mind just a couple of times
+ b1tt3r1n0:
+ - rscadd: pouches, again, and and material pouches.
+ timothyteakettle:
+ - rscadd: support for custom blood colours implemented, slimes blood colour now
+ equivalent to their body colour
+2020-06-29:
+ b1tt3r1n0:
+ - balance: Made teratomas from sdgf less powergame
+ timothyteakettle:
+ - bugfix: slimes no longer have white blood by default
diff --git a/html/changelogs/AutoChangeLog-pr-12390.yml b/html/changelogs/AutoChangeLog-pr-12390.yml
new file mode 100644
index 0000000000..372d14214a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12390.yml
@@ -0,0 +1,15 @@
+author: "Ghommie (porting PRs by XTDM, coiax, MrDoomBringer)"
+delete-after: True
+changes:
+ - tweak: "Random Events now have a follow link for ghosts!"
+ - rscadd: "Adds the Spontaneous Brain Trauma to the event pool. Sometimes your brain just goes a little wrong."
+ - rscadd: "Sometimes a low level cloning pod will make errors in replicating your brain,
+leaving you with a mild brain trauma."
+ - rscadd: "When a person is cloned, any mental traumas are cloned as well."
+ - rscadd: "The wizard federation announces that the Curse of Madness is out of beta and is now available for purchase for 4 points. It causes long-lasting brain traumas to all inhabitants of a target space station."
+ - rscadd: "The wizard federation declines responsibility for any self-harm caused by curses cast while inside the targeted station."
+ - rscadd: "Due to the extensive testing of the Curse of Madness some unique new trauma types have appeared across Nanotrasen-controlled space."
+ - rscadd: "Curse of Madness can now be triggered by a wizard's Summon Events,
+at the same chance as Summon Guns or Summon Magic."
+ - admin: "When an admin triggers Curse of Madness manually, they can
+specify their own dark truth to horrify the station with."
diff --git a/html/changelogs/AutoChangeLog-pr-12416.yml b/html/changelogs/AutoChangeLog-pr-12416.yml
new file mode 100644
index 0000000000..25d295457a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12416.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (inspired by MrDoomBringer's work on tgstation)"
+delete-after: True
+changes:
+ - rscadd: "New check skills UI."
diff --git a/html/changelogs/AutoChangeLog-pr-12595.yml b/html/changelogs/AutoChangeLog-pr-12595.yml
new file mode 100644
index 0000000000..20d018daf5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12595.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - soundadd: "*squish"
diff --git a/html/changelogs/AutoChangeLog-pr-12598.yml b/html/changelogs/AutoChangeLog-pr-12598.yml
new file mode 100644
index 0000000000..358bc96d81
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12598.yml
@@ -0,0 +1,5 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "you can now select your tongue and speech verb in the character customization menu!"
+ - rscadd: "skeleton is now split into two more types, greater and lesser"
diff --git a/html/changelogs/AutoChangeLog-pr-12605.yml b/html/changelogs/AutoChangeLog-pr-12605.yml
new file mode 100644
index 0000000000..1c514f15ac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12605.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "config errors now have line numbers."
diff --git a/html/changelogs/AutoChangeLog-pr-12622.yml b/html/changelogs/AutoChangeLog-pr-12622.yml
new file mode 100644
index 0000000000..9454154f66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12622.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - spellcheck: "fixed a bunch of grammar/spelling mistakes"
diff --git a/html/changelogs/AutoChangeLog-pr-12623.yml b/html/changelogs/AutoChangeLog-pr-12623.yml
new file mode 100644
index 0000000000..1e4b9638ca
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12623.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "outgoing mentorpms are now blue instead of green for the sender."
diff --git a/html/changelogs/AutoChangeLog-pr-12626.yml b/html/changelogs/AutoChangeLog-pr-12626.yml
new file mode 100644
index 0000000000..4fd9d4d2eb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12626.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - bugfix: "typing indicators no longer generates duplicate message boxes."
diff --git a/html/changelogs/AutoChangeLog-pr-12629.yml b/html/changelogs/AutoChangeLog-pr-12629.yml
new file mode 100644
index 0000000000..37ebb5d123
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12629.yml
@@ -0,0 +1,4 @@
+author: "Fikou"
+delete-after: True
+changes:
+ - rscadd: "spray cans, airlock painters, and decal painters added to engineering/service/autolathe (where applicable)"
diff --git a/html/changelogs/AutoChangeLog-pr-12592.yml b/html/changelogs/AutoChangeLog-pr-12644.yml
similarity index 53%
rename from html/changelogs/AutoChangeLog-pr-12592.yml
rename to html/changelogs/AutoChangeLog-pr-12644.yml
index 6f6fa81dcc..5e291eb25d 100644
--- a/html/changelogs/AutoChangeLog-pr-12592.yml
+++ b/html/changelogs/AutoChangeLog-pr-12644.yml
@@ -1,4 +1,4 @@
author: "timothyteakettle"
delete-after: True
changes:
- - rscadd: "felinids now nya when tabled"
+ - bugfix: "non-carbon blood is now not white"
diff --git a/html/changelogs/AutoChangeLog-pr-12645.yml b/html/changelogs/AutoChangeLog-pr-12645.yml
new file mode 100644
index 0000000000..ce62b0ae88
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12645.yml
@@ -0,0 +1,10 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed a gap on the male insect anthro torso sprite when facing south."
+ - bugfix: "Fixed mecha ID access not being removable."
+ - bugfix: "Fixed a peeve with the hypno trance status effect not sanitizing some heard hypnosis inputs (i.e. custom say messages like say\"honks*clownem ipsum dolor\")"
+ - bugfix: "fixed an issue about using stacks with only 1 amount left."
+ - bugfix: "Fixed a peeve on attack messages against carbons/humans."
+ - bugfix: "Fixed missing hypnochair board."
+ - bugfix: "Fixed material walls and tiles. My bad on that port."
diff --git a/icons/materials/composite.dmi b/icons/materials/composite.dmi
new file mode 100644
index 0000000000..a2a92b6eb7
Binary files /dev/null and b/icons/materials/composite.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 9bb41bf527..2bb8af7c61 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index fd9d310c73..2ea5554741 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index c5b2b3fc42..27de829f6e 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/machines/sheetifier.dmi b/icons/obj/machines/sheetifier.dmi
new file mode 100644
index 0000000000..46d8b06bab
Binary files /dev/null and b/icons/obj/machines/sheetifier.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index 3bf0c55576..ef3a98b875 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index ac6478928d..aa29bd63cc 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 09568ebea1..df080ce3e6 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 477120870b..20963e7fbe 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/walls/materialwall.dmi b/icons/turf/walls/materialwall.dmi
new file mode 100644
index 0000000000..c497f76c2e
Binary files /dev/null and b/icons/turf/walls/materialwall.dmi differ
diff --git a/modular_citadel/code/modules/mentor/mentorpm.dm b/modular_citadel/code/modules/mentor/mentorpm.dm
index d2d04495d4..3260e96767 100644
--- a/modular_citadel/code/modules/mentor/mentorpm.dm
+++ b/modular_citadel/code/modules/mentor/mentorpm.dm
@@ -67,7 +67,7 @@
if(C.is_mentor())
if(is_mentor())//both are mentors
to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
else //recipient is a mentor but sender is not
to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]")
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index 2be83733e5..e58c6bda30 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -244,3 +244,21 @@
user.nextsoundemote = world.time + 7
var/sound = pick('modular_citadel/sound/voice/bark1.ogg', 'modular_citadel/sound/voice/bark2.ogg')
playsound(user, sound, 50, 1, -1)
+
+/datum/emote/living/squish
+ key = "squish"
+ key_third_person = "squishes"
+ message = "squishes!"
+ emote_type = EMOTE_AUDIBLE
+ muzzle_ignore = FALSE
+ restraint_check = FALSE
+ mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
+
+/datum/emote/living/squish/run_emote(mob/living/user, params)
+ if(!(. = ..()))
+ return
+ if(user.nextsoundemote >= world.time)
+ return
+ user.nextsoundemote = world.time + 7
+ var/sound = pick('sound/voice/slime_squish.ogg')
+ playsound(user, sound, 50, 1, -1)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index ca6bb302da..56b2ad2a2c 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -200,10 +200,10 @@
/datum/reagent/fermi/zeolites
name = "Artificial Zeolites"
- description = "Lab made Zeolite, used to clear radiation form people and items alike! Splashing just a small amounts(5u) onto any item can clear away large amouts of contamination."
+ description = "Lab made Zeolite, used to clear radiation from people and items alike! Splashing just a small amount(5u) onto any item can clear away large amounts of contamination."
pH = 8
color = "#FFDADA"
- metabolization_rate = 8 * REAGENTS_METABOLISM //Lastes not long in body but heals a lot!
+ metabolization_rate = 8 * REAGENTS_METABOLISM //Metabolizes fast but heals a lot!
value = REAGENT_VALUE_COMMON
/datum/reagent/fermi/zeolites/on_mob_life(mob/living/carbon/M)
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index b2c80e4a16..a24a5beaad 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -165,7 +165,7 @@
if(amount_to_spawn <= 0)
amount_to_spawn = 1
for(var/i in 1 to amount_to_spawn)
- var/mob/living/simple_animal/slime/S = new(T,"green")
+ var/mob/living/simple_animal/slime/S = new(T,"pyrite")
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
S.name = "Living teratoma"
S.real_name = "Living teratoma"
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 95b121b453..6098dd3567 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/sound/effects/meatslap.ogg b/sound/effects/meatslap.ogg
new file mode 100644
index 0000000000..3d8ea7df1a
Binary files /dev/null and b/sound/effects/meatslap.ogg differ
diff --git a/sound/voice/slime_squish.ogg b/sound/voice/slime_squish.ogg
new file mode 100644
index 0000000000..60e118e217
Binary files /dev/null and b/sound/voice/slime_squish.ogg differ
diff --git a/strings/tips.txt b/strings/tips.txt
index b135692778..043405c7a0 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -37,7 +37,7 @@ As a Medical Doctor, treating plasmamen is not impossible! Salbutamol stops them
As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them.
As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step.
As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors!
-As a Medical Doctor, medical gauze stops bleeding as well as heals 5 brute damage, this even works on the dead! Make sure to always have some gauze on you to stop bleeding before dragging someone.
+As a Medical Doctor, medical gauze stops bleeding as well as healing 5 brute damage, this even works on the dead! Make sure to always have some gauze on you to stop bleeding before dragging someone.
As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment!
As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater.
As a Chemist, you will be expected to supply crew with certain chemicals. For example, clonexadone and mannitol for the cryo tubes, unstable mutagen and saltpetre for botany as well as healing pills and patches for the front desk.
@@ -265,7 +265,7 @@ As a Devil, as long as you control at least one other soul, you will automatical
At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other.
When hacking doors, cutting and mending the "test light wire" will restore power to the door.
-When hacking, remote singulars pluse when attached to a wire and pinged. This can allow you to hack things or set traps from far away.
+When hacking, remote singulars pulse when attached to a wire and pinged. This can allow you to hack things or set traps from far away.
When crafting most items, you can either manually combine parts or use the crafting menu.
Suit storage units not only remove blood and dirt from clothing, but also radiation!
Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes.
diff --git a/strings/traumas.json b/strings/traumas.json
index 833c786b75..f461c5f5fd 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -130,7 +130,8 @@
"@pick(semicolon)*awoo",
"@pick(semicolon)*merp",
"@pick(semicolon)*weh",
- "@pick(semicolon)My balls finally feel full, again."
+ "@pick(semicolon)My balls finally feel full, again.",
+ "@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)"
],
"mutations": [
diff --git a/tgstation.dme b/tgstation.dme
index e12b9cb9fc..2d5a95e4a6 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -406,6 +406,7 @@
#include "code\datums\components\construction.dm"
#include "code\datums\components\dejavu.dm"
#include "code\datums\components\earprotection.dm"
+#include "code\datums\components\edible.dm"
#include "code\datums\components\edit_complainer.dm"
#include "code\datums\components\embedded.dm"
#include "code\datums\components\explodable.dm"
@@ -580,6 +581,8 @@
#include "code\datums\martial\wrestling.dm"
#include "code\datums\materials\_material.dm"
#include "code\datums\materials\basemats.dm"
+#include "code\datums\materials\meat.dm"
+#include "code\datums\materials\pizza.dm"
#include "code\datums\mood_events\beauty_events.dm"
#include "code\datums\mood_events\drink_events.dm"
#include "code\datums\mood_events\drug_events.dm"
@@ -762,6 +765,7 @@
#include "code\game\machinery\rechargestation.dm"
#include "code\game\machinery\recycler.dm"
#include "code\game\machinery\requests_console.dm"
+#include "code\game\machinery\sheetifier.dm"
#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\Sleeper.dm"
#include "code\game\machinery\slotmachine.dm"
@@ -1275,6 +1279,7 @@
#include "code\game\turfs\simulated\floor\plating\asteroid.dm"
#include "code\game\turfs\simulated\floor\plating\dirt.dm"
#include "code\game\turfs\simulated\floor\plating\misc_plating.dm"
+#include "code\game\turfs\simulated\wall\material_walls.dm"
#include "code\game\turfs\simulated\wall\mineral_walls.dm"
#include "code\game\turfs\simulated\wall\misc_walls.dm"
#include "code\game\turfs\simulated\wall\reinf_walls.dm"
@@ -1961,6 +1966,7 @@
#include "code\modules\events\wizard\imposter.dm"
#include "code\modules\events\wizard\invincible.dm"
#include "code\modules\events\wizard\lava.dm"
+#include "code\modules\events\wizard\madness.dm"
#include "code\modules\events\wizard\magicarp.dm"
#include "code\modules\events\wizard\petsplosion.dm"
#include "code\modules\events\wizard\race.dm"
@@ -3201,6 +3207,7 @@
#include "code\modules\spells\spell_types\charge.dm"
#include "code\modules\spells\spell_types\conjure.dm"
#include "code\modules\spells\spell_types\construct_spells.dm"
+#include "code\modules\spells\spell_types\curse.dm"
#include "code\modules\spells\spell_types\devil.dm"
#include "code\modules\spells\spell_types\devil_boons.dm"
#include "code\modules\spells\spell_types\dumbfire.dm"