diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 40a57135fd..3c64b9f6ad 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -2878,7 +2878,6 @@
/turf/closed/wall/r_wall,
/area/security/processing)
"agX" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -4171,22 +4170,11 @@
/turf/open/floor/plasteel,
/area/construction/secondary)
"akg" = (
-/obj/machinery/power/solar_control{
- dir = 4;
- id = "foreport";
- name = "Port Bow Solar Control"
- },
-/obj/structure/sign/warning/electricshock{
- pixel_x = -32
- },
/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "1-2"
},
/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/area/maintenance/solars/starboard/fore)
"akh" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
@@ -4196,14 +4184,16 @@
/turf/open/floor/plating,
/area/construction/secondary)
"akj" = (
-/obj/structure/chair{
- dir = 8
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/door/airlock/external{
+ name = "Starboard Bow Solar Exterior Airlock";
+ req_access_txt = "10;13"
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/area/maintenance/solars/starboard/fore)
"akk" = (
/obj/item/stack/tile/plasteel{
pixel_x = 10;
@@ -4361,18 +4351,12 @@
/turf/open/floor/plasteel,
/area/security/warden)
"akz" = (
-/obj/machinery/light/small{
- dir = 1;
- light_color = "#ffc1c1"
+/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
-/obj/machinery/power/terminal{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/turf/open/floor/plasteel,
+/area/router/service)
"akA" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -6331,16 +6315,16 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aoW" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/external/glass{
- name = "Port Bow Solars External Access";
- req_access_txt = "10;13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/machinery/power/solar_control{
+ dir = 4;
+ id = "foreport";
+ name = "Port Bow Solar Control"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -7335,12 +7319,19 @@
/turf/open/floor/plasteel,
/area/security/brig)
"arr" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/chair{
+ dir = 8
},
-/obj/item/stock_parts/cell/high/plus,
/turf/open/floor/plating,
/area/maintenance/solars/port)
"ars" = (
@@ -7774,10 +7765,16 @@
/turf/open/floor/plasteel,
/area/security/prison)
"asl" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/camera{
- c_tag = "Port Bow Solar Maintenance";
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/external/glass{
+ name = "Port Bow Solars External Access";
+ req_access_txt = "10;13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -7991,12 +7988,18 @@
name = "Canister Storage"
})
"asH" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
+/obj/machinery/camera{
+ c_tag = "Port Bow Solar Maintenance";
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/obj/structure/sign/warning/electricshock{
+ pixel_y = -32
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -8236,12 +8239,16 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"atn" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 8
},
-/obj/machinery/door/airlock/external,
-/turf/open/floor/plasteel,
-/area/router/service)
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plating,
+/area/maintenance/solars/port)
"ato" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -10451,13 +10458,11 @@
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai)
"aya" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
},
-/obj/machinery/camera{
- c_tag = "AI Core Exterior";
- dir = 1
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -15104,19 +15109,19 @@
},
/area/chapel/main)
"aHj" = (
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- name = "Starboard Bow Solar Exterior Airlock";
- req_access_txt = "10;13"
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
},
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/turf/open/floor/plasteel,
+/area/tcommsat/computer)
"aHk" = (
/obj/structure/chair{
dir = 4
@@ -15272,13 +15277,14 @@
/area/bridge)
"aHE" = (
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aHF" = (
/turf/open/floor/plasteel/dark,
/area/bridge)
@@ -20986,19 +20992,18 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aTh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/external/glass{
+ name = "Telecommunications External Access";
+ req_access_txt = "61"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/obj/machinery/power/apc{
- name = "AI Upload Foyer APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aTi" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -22804,14 +22809,14 @@
/turf/open/floor/wood,
/area/library)
"aXf" = (
-/obj/structure/window/reinforced/spawner/east,
-/obj/structure/table/wood,
+/obj/machinery/photocopier,
/obj/machinery/light{
dir = 1;
- light_color = "#c1caff"
+ light_color = "#e8eaff"
},
-/turf/open/floor/carpet,
-/area/library)
+/obj/item/paper/fluff/cogstation/eva,
+/turf/open/floor/plasteel/dark,
+/area/security/checkpoint/customs)
"aXg" = (
/obj/machinery/vending/coffee,
/turf/open/floor/plasteel,
@@ -23913,35 +23918,20 @@
/turf/closed/wall,
/area/lawoffice)
"aZz" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/lattice,
+/obj/machinery/camera{
+ c_tag = "Routing Depot - Fore Exterior";
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/turf/open/space/basic,
+/area/maintenance/department/eva)
"aZA" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/computer/card{
dir = 8
},
+/obj/item/paper/guides/cogstation/job_changes,
/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/area/security/checkpoint/customs)
"aZB" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -23961,7 +23951,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/book/manual/wiki/security_space_law,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/structure/window/reinforced/spawner/north,
/turf/open/floor/plasteel/dark,
/area/lawoffice)
"aZD" = (
@@ -24018,13 +24010,21 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/civilian)
"aZI" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/landmark/start/lawyer,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/door/window/northleft{
+ name = "Law Office Counter";
+ req_access_txt = "38"
+ },
/turf/open/floor/plasteel/dark,
/area/lawoffice)
"aZJ" = (
@@ -24426,13 +24426,21 @@
/turf/open/floor/wood,
/area/library)
"baz" = (
-/obj/machinery/photocopier,
-/obj/machinery/light{
- dir = 1;
- light_color = "#e8eaff"
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/book/manual/wiki/security_space_law,
+/obj/structure/window/reinforced/spawner/north,
/turf/open/floor/plasteel/dark,
-/area/security/checkpoint/customs)
+/area/lawoffice)
"baA" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/item/folder/blue,
@@ -25282,11 +25290,17 @@
/turf/closed/wall/r_wall,
/area/science/mixing)
"bcz" = (
-/obj/machinery/computer/card{
- dir = 8
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/newscaster{
+ pixel_x = -30
},
/turf/open/floor/plasteel/dark,
-/area/security/checkpoint/customs)
+/area/lawoffice)
"bcA" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -26131,9 +26145,21 @@
/turf/open/floor/plasteel,
/area/quartermaster/office)
"beC" = (
-/obj/machinery/recharge_station,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/rack,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/radio/off,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/tcommsat/computer)
"beD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -26156,13 +26182,16 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"beG" = (
-/obj/structure/lattice,
-/obj/machinery/camera{
- c_tag = "Routing Depot - Fore Exterior";
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/landmark/start/lawyer,
+/obj/structure/chair/stool,
+/turf/open/floor/plasteel/dark,
+/area/lawoffice)
"beH" = (
/obj/structure/window/reinforced/spawner/east,
/obj/machinery/light{
@@ -30649,9 +30678,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bnS" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/cogpool)
"bnT" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
@@ -30768,17 +30799,17 @@
/turf/open/floor/plasteel,
/area/ai_monitored/nuke_storage)
"bof" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/obj/machinery/door/airlock/external/glass{
name = "Pool Exterior Access";
req_access_txt = "13"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
-/turf/open/floor/plating,
+/turf/open/space/basic,
/area/crew_quarters/fitness/cogpool)
"bog" = (
/obj/machinery/light{
@@ -32879,19 +32910,9 @@
/turf/open/floor/plasteel/stairs/left,
/area/hydroponics)
"bsx" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/external{
- name = "Recycler Exterior Access";
- req_one_access_txt = "13;50"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal)
+/obj/structure/lattice,
+/turf/closed/wall/r_wall,
+/area/crew_quarters/fitness/cogpool)
"bsy" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -33297,21 +33318,9 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"btw" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/light/small,
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/maintenance/department/eva)
+/obj/machinery/atmospherics/components/unary/outlet_injector/on,
+/turf/open/floor/plating/airless,
+/area/router)
"btx" = (
/obj/machinery/space_heater,
/turf/open/floor/plating,
@@ -34237,17 +34246,13 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"bvM" = (
-/obj/machinery/door/airlock/external/glass{
- name = "External Construction Access";
- req_one_access_txt = "10;31"
+/obj/structure/lattice,
+/obj/machinery/camera{
+ c_tag = "Routing Depot - Aft Exterior";
+ pixel_x = 22
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
+/turf/open/space/basic,
+/area/router)
"bvN" = (
/obj/machinery/atmospherics/components/binary/valve/digital/on{
dir = 4
@@ -34971,21 +34976,30 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/ai)
"bxm" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/tcommsat/computer)
-"bxn" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-4"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/maintenance/department/eva)
+"bxn" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/camera{
+ c_tag = "AI Core Exterior";
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/maintenance/department/eva)
"bxo" = (
/obj/machinery/door/airlock/external{
name = "Telecommunications External Access";
@@ -35048,18 +35062,13 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"bxt" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Telecommunications External Access";
- req_access_txt = "61"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
},
/turf/open/floor/plating,
-/area/tcommsat/computer)
+/area/maintenance/disposal)
"bxu" = (
/obj/structure/rack,
/obj/item/circuitboard/machine/telecomms/broadcaster,
@@ -35217,18 +35226,15 @@
/turf/open/floor/plasteel,
/area/tcommsat/computer)
"bxK" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/radio/off,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
/turf/open/floor/plasteel,
-/area/tcommsat/computer)
+/area/maintenance/disposal)
"bxL" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -35905,11 +35911,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"bzp" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/obj/structure/lattice/catwalk,
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/area/maintenance/disposal)
"bzq" = (
/obj/machinery/light{
dir = 8
@@ -37644,12 +37650,20 @@
/turf/open/floor/plasteel/showroomfloor,
/area/medical/morgue)
"bDb" = (
-/mob/living/simple_animal/mouse/white{
- desc = "Wubba lubba dub dub.";
- name = "Rick"
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/morgue)
+/obj/machinery/door/airlock/external{
+ name = "Recycler Exterior Access";
+ req_one_access_txt = "13;50"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/turf/open/floor/plasteel,
+/area/maintenance/disposal)
"bDc" = (
/obj/machinery/vending/security,
/obj/structure/disposalpipe/segment,
@@ -39183,23 +39197,9 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bFY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/structure/noticeboard{
- pixel_y = 28
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/obj/structure/lattice/catwalk,
+/turf/closed/wall/r_wall,
+/area/engine/atmos)
"bFZ" = (
/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
@@ -45857,11 +45857,11 @@
/area/engine/atmos)
"bTJ" = (
/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/violet/hidden{
- dir = 8
- },
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/disposal)
"bTK" = (
/turf/open/floor/engine/co2,
/area/engine/atmos)
@@ -46099,17 +46099,12 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bUj" = (
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/violet/hidden{
+ dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"bUk" = (
/obj/structure/closet/crate,
/obj/effect/decal/cleanable/cobweb,
@@ -46481,11 +46476,11 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bUV" = (
-/obj/structure/lattice,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/violet/hidden{
dir = 10
},
+/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space/nearstation)
"bUW" = (
@@ -46837,14 +46832,9 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bVD" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"bVE" = (
/obj/effect/landmark/start/atmospheric_technician,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -47270,13 +47260,16 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bWq" = (
-/obj/structure/lattice,
-/obj/machinery/camera{
- c_tag = "Routing Depot - Aft Exterior";
- pixel_x = 22
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 23
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"bWr" = (
/obj/structure/closet/l3closet/scientist,
/obj/effect/turf_decal/stripes/line,
@@ -47442,17 +47435,18 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bWJ" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/space/nearstation)
"bWK" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/orange/visible,
@@ -49080,14 +49074,15 @@
},
/area/library)
"bZV" = (
+/obj/structure/window/reinforced/spawner/east,
/obj/structure/table/wood,
-/obj/structure/window/reinforced/spawner/north,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
},
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/carpet,
/area/library)
"bZW" = (
/obj/structure/sign/warning/fire,
@@ -49805,18 +49800,24 @@
/turf/open/floor/plating,
/area/ai_monitored/storage/eva)
"cbI" = (
-/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Atmospherics External Airlock";
+ req_access_txt = "24"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"cbJ" = (
/obj/structure/table/reinforced,
/obj/item/analyzer,
@@ -49858,19 +49859,13 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbM" = (
@@ -51026,24 +51021,17 @@
/turf/closed/wall/r_wall,
/area/medical/medbay/lobby)
"cea" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/photocopier,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/table/wood,
+/obj/structure/window/reinforced/spawner/north,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- name = "Cargo RC";
- pixel_y = 30
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/carpet{
+ icon_state = "carpetsymbol"
},
-/obj/machinery/camera{
- c_tag = "Supply - Delivery Office Aft";
- network = list("ss13","rd")
- },
-/obj/item/paper/guides/cogstation/disposals,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
+/area/library)
"ceb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -55857,6 +55845,28 @@
},
/turf/open/floor/wood,
/area/library)
+"cnQ" = (
+/obj/structure/lattice,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/camera{
+ c_tag = "Supply - Warehouse Exterior";
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/quartermaster/warehouse)
+"cnR" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cnS" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -56625,18 +56635,25 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cpm" = (
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/delivery,
+/obj/machinery/photocopier,
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/machinery/requests_console{
+ department = "Cargo Bay";
+ departmentType = 2;
+ name = "Cargo RC";
+ pixel_y = 30
},
-/obj/machinery/newscaster{
- pixel_x = -30
+/obj/machinery/camera{
+ c_tag = "Supply - Delivery Office Aft";
+ network = list("ss13","rd")
},
-/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/obj/item/paper/guides/cogstation/disposals,
+/obj/item/paper/fluff/cogstation/mulebot,
+/turf/open/floor/plasteel,
+/area/quartermaster/sorting)
"cpn" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -58509,8 +58526,9 @@
req_access_txt = "5"
},
/obj/item/clipboard,
-/obj/item/clothing/glasses/hud/health,
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/paper/guides/cogstation/letter_med,
+/obj/item/clothing/glasses/hud/health,
/obj/item/pen,
/obj/item/clothing/glasses/hud/health,
/turf/open/floor/plasteel/white,
@@ -61375,6 +61393,16 @@
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
+"cyd" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cye" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -65719,19 +65747,24 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cFs" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red{
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/structure/noticeboard{
+ pixel_y = 28
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/item/paper/guides/cogstation/letter_med,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone2{
- name = "Medbay Treatment Center"
- })
+/area/medical/medbay/central)
"cFt" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -67921,6 +67954,11 @@
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
+"cJg" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/warehouse)
"cJh" = (
/obj/structure/table,
/obj/structure/bedsheetbin/towel,
@@ -68022,6 +68060,18 @@
/area/engine/engineering{
name = "Engine Room"
})
+"cJq" = (
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external/glass{
+ name = "External Construction Access";
+ req_one_access_txt = "10;31"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plasteel,
+/area/quartermaster/warehouse)
"cJr" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
@@ -68030,23 +68080,28 @@
/turf/open/space/basic,
/area/space/nearstation)
"cJs" = (
-/obj/structure/lattice/catwalk,
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
- dir = 4
- },
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/warehouse)
"cJt" = (
-/obj/structure/lattice/catwalk,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/power/apc{
+ name = "AI Upload Foyer APC";
+ pixel_y = -24
+ },
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 5
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cJu" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -69993,6 +70048,21 @@
"cNB" = (
/turf/open/floor/plating,
/area/quartermaster/miningdock/airless)
+"cNC" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cND" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
@@ -70935,15 +71005,25 @@
/turf/open/space/basic,
/area/space/nearstation)
"cPG" = (
-/obj/structure/lattice,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/camera{
- c_tag = "Supply - Warehouse Exterior";
- dir = 1
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/turretid{
+ control_area = "/area/science/server";
+ icon_state = "control_stun";
+ name = "Computer Core turret control";
+ pixel_x = -3;
+ pixel_y = -23;
+ req_access_txt = "65"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/science/server{
+ name = "Computer Core"
+ })
"cPH" = (
/obj/machinery/conveyor_switch{
id = "EngiCargoConveyer"
@@ -71796,9 +71876,6 @@
/obj/item/paper/guides/jobs/medical/cloning{
pixel_x = -4
},
-/obj/item/paper/fluff/cogstation/cloner{
- pixel_x = 6
- },
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"cRc" = (
@@ -71864,22 +71941,11 @@
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"cRh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
},
-/obj/machinery/turretid{
- control_area = "/area/science/server";
- icon_state = "control_stun";
- name = "Computer Core turret control";
- pixel_x = -3;
- pixel_y = -23;
- req_access_txt = "65"
- },
-/turf/open/floor/plasteel,
-/area/science/server{
- name = "Computer Core"
- })
+/turf/closed/wall/r_wall,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cRi" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
@@ -72023,6 +72089,53 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/lab)
+"cRs" = (
+/obj/machinery/recharge_station,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 9
+ },
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
+"cRt" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/quartermaster/warehouse)
+"cRu" = (
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/science/mixing)
+"cRv" = (
+/mob/living/simple_animal/opossum{
+ desc = "Wubba lubba dub dub.";
+ name = "Rick"
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/morgue)
+"cRw" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/paper/guides/cogstation/letter_med{
+ pixel_y = 4
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone2{
+ name = "Medbay Treatment Center"
+ })
"cVq" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
@@ -72130,14 +72243,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"frb" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/space/basic,
-/area/space/nearstation)
"fti" = (
/obj/machinery/atmospherics/components/binary/pump,
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
@@ -84950,7 +85055,7 @@ akI
aAJ
cMp
aYa
-bxm
+akI
akI
aNC
bxv
@@ -85206,7 +85311,7 @@ aLH
akI
aAK
aRC
-bxn
+aHj
akI
bxA
hiV
@@ -85723,7 +85828,7 @@ aXm
aXs
bxC
akI
-bxK
+beC
bxY
byh
byb
@@ -85977,7 +86082,7 @@ aaU
aaU
aEa
cMK
-bxt
+aHE
akI
akI
akI
@@ -86233,9 +86338,9 @@ aaU
aaa
aaU
aEa
-aHE
-bab
-aaa
+cMK
+aTh
+akI
aaa
aaU
aaa
@@ -86490,7 +86595,8 @@ aaU
aaU
aaU
aEb
-aPT
+aya
+bab
aaU
aaU
aye
@@ -86508,7 +86614,6 @@ aye
aye
aye
aye
-aye
aaa
aaa
aaa
@@ -90657,7 +90762,7 @@ aaa
aaa
aaa
aaa
-aaa
+aWj
aaU
aaa
aaU
@@ -90913,9 +91018,9 @@ aaa
aaa
aaa
aaa
-aaa
-aWj
-aaU
+bcw
+aUZ
+bcw
aaa
bcy
cnU
@@ -91171,7 +91276,7 @@ aaa
aaa
aaa
bcw
-aUZ
+cRu
bcw
aaa
bcy
@@ -91193,7 +91298,7 @@ aaa
aaa
aaU
aaa
-bAb
+brs
bxT
bFq
bHY
@@ -91363,10 +91468,10 @@ aaa
aaa
aaU
abx
-aqw
-aoW
-aqw
-aqw
+aiN
+alu
+aiN
+abx
aaU
aaa
aaa
@@ -91620,9 +91725,9 @@ aaa
aaa
aaU
abx
-akg
-apS
-arr
+aiN
+asl
+aiN
abx
aaU
aaa
@@ -91877,9 +91982,9 @@ aaa
aaa
aaU
aiN
-akj
-anV
-asl
+aoW
+apS
+asH
abx
aaU
aaU
@@ -92134,9 +92239,9 @@ aaa
aaa
aaU
aiN
-akz
+arr
aDO
-asH
+atn
awm
axc
awm
@@ -95499,7 +95604,7 @@ aNL
aNL
aVl
aYT
-baz
+aXf
bFH
aYT
aaU
@@ -97043,7 +97148,7 @@ aVL
aYT
baG
bbM
-bcz
+aZA
aYT
bdy
beM
@@ -98094,7 +98199,7 @@ bgA
bWf
bXm
bZQ
-ccN
+bWq
ccN
cei
ccN
@@ -99380,12 +99485,12 @@ bWh
csG
bQA
aZy
-aXf
+bZV
bZJ
bZF
cpu
bax
-bZV
+cea
bZX
ccY
cab
@@ -99628,8 +99733,8 @@ bnz
bpw
bQx
bll
-aZz
-cpm
+aZC
+bcz
bad
bah
baR
@@ -99885,8 +99990,8 @@ bnA
bpy
bQI
bll
-aZA
aZI
+beG
bae
chP
baS
@@ -100142,7 +100247,7 @@ bnD
bpC
bQx
bll
-aZC
+baz
aZN
bCS
bak
@@ -102760,7 +102865,7 @@ caR
czi
cKj
buS
-bFY
+cFs
cEX
bIU
aJE
@@ -103536,7 +103641,7 @@ cFe
cFk
cFm
cFq
-cFs
+cRw
cFz
bqt
blx
@@ -104781,8 +104886,8 @@ bLz
bNe
ajO
bQb
-bUj
-aTh
+cnR
+cJt
bfh
brb
bzN
@@ -105022,9 +105127,9 @@ bOV
aRq
cjD
bnU
-btw
+bxm
bns
-aya
+bxn
avy
alo
awn
@@ -105039,7 +105144,7 @@ bPp
bPU
bQi
bUU
-bWJ
+cNC
bWP
cbV
bzR
@@ -105279,7 +105384,7 @@ aSt
aSt
aSt
aSt
-cpG
+aWd
aSt
brs
avv
@@ -105296,7 +105401,7 @@ cRf
bPV
bQT
bVq
-cRh
+cPG
bfh
cbY
cdn
@@ -105523,7 +105628,7 @@ axV
aog
aog
aSH
-beG
+aZz
aaU
aaU
aaU
@@ -105535,9 +105640,9 @@ aRv
aaU
aaU
aaU
-aWj
-aSq
-aWj
+aSt
+cpG
+aSt
aaU
avv
ajO
@@ -105553,7 +105658,7 @@ ajO
ajO
aRy
bVC
-aRy
+cRh
bfh
bfh
bBR
@@ -105809,8 +105914,8 @@ bmH
aYZ
bht
bcY
-bVD
-beC
+cyd
+cRs
cgF
bfh
bBS
@@ -106033,7 +106138,7 @@ aOJ
aOJ
bmF
bnT
-aRJ
+bnT
aRJ
aRJ
chm
@@ -106289,13 +106394,13 @@ bfv
bfv
bkW
bmJ
+bnS
bof
aQJ
aQJ
aQJ
aQJ
aQJ
-aQJ
aRZ
aaU
aaa
@@ -106357,7 +106462,7 @@ cyP
byQ
bzS
czw
-bDb
+cRv
bBu
crX
czI
@@ -106547,7 +106652,7 @@ bjL
blD
bmK
boi
-aaU
+bsx
aaU
aaU
aaU
@@ -106805,7 +106910,7 @@ aOJ
aPN
bes
aaU
-aye
+bQe
aye
bQe
aye
@@ -107839,7 +107944,7 @@ aye
aye
aaU
aWj
-bnS
+btw
buq
bwC
bAr
@@ -108619,7 +108724,7 @@ bMS
bBv
bXM
bvB
-bWq
+bvM
acY
adz
bsz
@@ -109124,7 +109229,7 @@ aaa
aaa
aaU
aWj
-bnS
+btw
buq
bwZ
bBC
@@ -113190,7 +113295,7 @@ abe
aeP
agX
ajS
-aHj
+akg
bvm
ahP
aif
@@ -113448,7 +113553,7 @@ aaV
ahP
ahP
ahP
-bzp
+akj
ahP
aif
aiB
@@ -115821,10 +115926,10 @@ bra
bwW
bwW
aaU
-bdR
-cJr
-bTJ
-aaa
+anr
+aWj
+bUj
+bVD
aaa
cPz
aaa
@@ -116078,8 +116183,8 @@ brr
bCr
cwv
bAQ
-bAQ
-cJs
+bxt
+bzp
bUV
caf
bam
@@ -116089,7 +116194,7 @@ bYl
bam
bam
bam
-bam
+cJg
bbX
bbX
bcn
@@ -116335,8 +116440,8 @@ brP
brX
bsh
bsu
-bsx
-cJt
+bxK
+bDb
sVC
cdp
sVC
@@ -116346,8 +116451,8 @@ bZp
sVC
sVC
sVC
-frb
-bvM
+cJq
+cRt
bvW
bvX
bwd
@@ -116593,7 +116698,7 @@ bsi
bsv
bsy
bsy
-bsD
+bTJ
bsI
bRv
bsD
@@ -116602,8 +116707,8 @@ bsD
cPE
cPF
cPF
-cPF
-cPG
+cnQ
+cJs
bBL
bBL
bCm
@@ -118141,9 +118246,9 @@ bJv
aaU
cwJ
aaU
-cbG
-aaU
-aaU
+bWJ
+mIT
+cJr
aaU
bbT
bbT
@@ -118397,10 +118502,10 @@ bPA
wPS
aaa
cwI
-aaa
+cwA
cbI
-mIT
-cJr
+cwA
+anr
aaa
aaU
aaU
@@ -118654,9 +118759,9 @@ bgM
cwA
cwA
cwL
-cww
+cwA
cbL
-cww
+cwA
bdR
mIT
mIT
@@ -118670,7 +118775,7 @@ bgk
bbT
bkd
bbT
-cea
+cpm
bVG
cgn
cje
@@ -119876,7 +119981,7 @@ aaa
aaa
aaa
arM
-atn
+atl
arM
aaU
aaU
@@ -120132,9 +120237,9 @@ aaa
aaa
aaa
aaa
-aaa
-aWj
-aaU
+arM
+akz
+arM
aaU
aaU
aaU
@@ -120390,9 +120495,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+aWj
+aaU
+aaU
aaa
aaa
aaU
@@ -125338,11 +125443,11 @@ aWj
cww
cJm
cww
-aaU
-aaa
-aaa
-aaa
-aaa
+aWj
+aWj
+aWj
+aWj
+aWj
aaU
aaU
aaa
@@ -125593,9 +125698,9 @@ bal
aaU
aWj
cww
-cJn
+cJm
cww
-aaU
+aWj
bal
bal
bal
@@ -125849,10 +125954,10 @@ aaa
aaa
aaU
aWj
+bFY
+cJn
+cww
aWj
-aWj
-aaa
-aaa
aaa
aaa
aaa
@@ -126105,11 +126210,11 @@ aaa
aaa
aaa
aaU
-aaa
-aaa
-aaa
-aaa
-aaa
+aWj
+aWj
+aWj
+aWj
+aWj
bal
bal
bal
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 6338213195..fdc313c30a 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -7014,9 +7014,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
-"amG" = (
-/turf/closed/wall,
-/area/space)
"amH" = (
/obj/machinery/door/airlock/external{
req_one_access_txt = "13,8"
@@ -46794,7 +46791,7 @@
dir = 8
},
/turf/open/floor/plating,
-/area/space/nearstation)
+/area/maintenance/starboard/fore)
"bOZ" = (
/obj/machinery/chem_master/condimaster{
name = "CondiMaster Neo";
@@ -70554,7 +70551,7 @@
dir = 8
},
/turf/open/floor/plating,
-/area/space/nearstation)
+/area/maintenance/starboard/aft)
"cJg" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/item/bedsheet/medical,
@@ -81152,10 +81149,6 @@
/obj/machinery/vr_sleeper,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"evy" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/space)
"eEe" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -81385,10 +81378,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"hKW" = (
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/maintenance/aft)
"ioI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -82834,10 +82823,6 @@
},
/turf/open/floor/plating,
/area/security/prison)
-"wkz" = (
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space)
"wlH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -113085,7 +113070,7 @@ cCq
cgN
cMl
bTs
-hKW
+lMJ
aaf
aaf
aaf
@@ -113342,7 +113327,7 @@ cCq
cLA
bTs
bTs
-hKW
+lMJ
aaf
aaa
aaa
@@ -119762,9 +119747,9 @@ cEA
aaf
aaa
aaa
-blx
+dvY
cJf
-blx
+dvY
aaa
dbN
gsT
@@ -120019,9 +120004,9 @@ blx
aaa
aaa
aaa
-wkz
+ack
uim
-wkz
+ack
aaa
aaf
dbR
@@ -121287,7 +121272,7 @@ ciL
cgs
csc
dvY
-evy
+dxk
krD
lsv
txj
@@ -129695,8 +129680,8 @@ aaa
aaa
aaf
aaa
-amG
-blx
+dnh
+dnh
bOY
dqT
aaf
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 846fe48604..263cb44144 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -2822,7 +2822,7 @@
req_access_txt = "65"
},
/turf/open/floor/plating,
-/area/space/nearstation)
+/area/ai_monitored/turret_protected/aisat_interior)
"ahi" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -2923,8 +2923,15 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
"ahr" = (
-/turf/closed/wall/r_wall,
-/area/space)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "Security External Airlock";
+ req_access_txt = "63"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"ahs" = (
/obj/structure/lattice/catwalk,
/obj/structure/transit_tube,
@@ -4686,7 +4693,7 @@
pixel_y = 20
},
/turf/open/space,
-/area/space)
+/area/space/nearstation)
"alc" = (
/obj/structure/table,
/obj/item/storage/fancy/cigarettes/cigars,
@@ -6629,13 +6636,6 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"apn" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Security External Airlock";
- req_access_txt = "63"
- },
/turf/open/floor/plating,
/area/maintenance/fore)
"apo" = (
@@ -8698,9 +8698,18 @@
/turf/closed/wall,
/area/bridge)
"atZ" = (
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard)
"aua" = (
/obj/structure/closet/secure_closet/freezer/money,
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
@@ -23763,18 +23772,12 @@
/turf/open/floor/plating,
/area/bridge)
"bcO" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard)
+/turf/open/space,
+/area/space/nearstation)
"bcQ" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -39888,12 +39891,6 @@
/area/science/mixing)
"bMp" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "8"
- },
/turf/open/floor/plating,
/area/science/mixing)
"bMq" = (
@@ -40373,11 +40370,10 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"bNq" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
+/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+ dir = 1
},
-/turf/open/space,
+/turf/open/floor/plating/airless,
/area/science/mixing)
"bNr" = (
/obj/structure/window/reinforced{
@@ -40813,10 +40809,11 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"bOu" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
},
-/turf/open/floor/plating/airless,
+/turf/open/space,
/area/science/mixing)
"bOv" = (
/obj/structure/window/reinforced{
@@ -41104,12 +41101,15 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bPl" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ req_access_txt = "8"
+ },
+/turf/open/floor/plating,
+/area/science/mixing)
"bPn" = (
/obj/machinery/door/airlock/grunge{
name = "Chapel"
@@ -53174,10 +53174,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"dhS" = (
-/obj/structure/window/reinforced,
-/turf/open/space/basic,
-/area/space)
"dir" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
@@ -59590,7 +59586,7 @@
},
/obj/machinery/door/airlock/external,
/turf/open/floor/plating,
-/area/space/nearstation)
+/area/chapel/asteroid/monastery)
"rBh" = (
/obj/structure/mopbucket,
/obj/item/mop,
@@ -77801,7 +77797,7 @@ aiu
aiu
axC
axB
-rKr
+azN
axB
aaa
aaa
@@ -82501,8 +82497,8 @@ aht
aaa
aaa
abI
-dhS
-cqS
+bGI
+bNs
rzF
bNs
bOw
@@ -90640,9 +90636,9 @@ aaa
aaa
aaa
aaa
-aaa
-ahi
-ahi
+aoz
+ahr
+aoz
aqG
arD
asO
@@ -90898,8 +90894,8 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+cdm
+cdm
aqG
arE
arA
@@ -94741,7 +94737,7 @@ ags
adX
adX
adX
-ahr
+adX
aaa
aaa
aaa
@@ -94997,7 +94993,7 @@ cnC
adX
adX
adX
-shH
+adX
alb
aaa
aaa
@@ -95255,7 +95251,7 @@ agt
agD
agR
ahh
-atZ
+ahi
aaa
aaa
aaa
@@ -95511,7 +95507,7 @@ agg
adX
adX
adX
-shH
+adX
alb
aaa
aaa
@@ -95769,7 +95765,7 @@ ags
adX
adX
adX
-shH
+adX
aFj
aht
aht
@@ -105617,9 +105613,9 @@ bIN
dAF
bCV
bCV
-bNq
+bCV
bOu
-aht
+bNq
aaa
aaa
aaa
@@ -105875,8 +105871,8 @@ bJT
wOS
bMp
bPl
-mZE
-aht
+bcO
+aaa
aaa
aaa
aaa
@@ -106131,9 +106127,9 @@ fBz
bCV
bCV
bCV
+bCV
ahi
aht
-aht
abI
abI
abI
@@ -109182,7 +109178,7 @@ aXC
aYF
baG
sut
-bcO
+oCX
rWE
baG
dsv
@@ -109439,7 +109435,7 @@ aEl
aEl
baG
rWE
-oCX
+atZ
rWE
baG
aEj
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 6ddd269b4b..9c39446a67 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -64,7 +64,6 @@
#define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
-#define DEFAULT_BODYPART_ICON_CITADEL 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
@@ -333,4 +332,4 @@
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
-#define SILENCE_RANGED_MESSAGE (1<<0)
+#define SILENCE_RANGED_MESSAGE (1<<0)
diff --git a/code/__DEFINES/rockpaperscissors.dm b/code/__DEFINES/rockpaperscissors.dm
new file mode 100644
index 0000000000..77ba81938d
--- /dev/null
+++ b/code/__DEFINES/rockpaperscissors.dm
@@ -0,0 +1,7 @@
+#define ROCKPAPERSCISSORS_RANGE 3
+#define ROCKPAPERSCISSORS_TIME_LIMIT 20 SECONDS
+
+#define ROCKPAPERSCISSORS_LOSE "lose"
+#define ROCKPAPERSCISSORS_WIN "win"
+#define ROCKPAPERSCISSORS_TIE "tie"
+#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided"
\ No newline at end of file
diff --git a/code/__DEFINES/storage/volumetrics.dm b/code/__DEFINES/storage/volumetrics.dm
index c3f45976ce..e6b732e083 100644
--- a/code/__DEFINES/storage/volumetrics.dm
+++ b/code/__DEFINES/storage/volumetrics.dm
@@ -24,7 +24,10 @@ GLOBAL_LIST_INIT(default_weight_class_to_volume, list(
// Let's keep all of this in one place. given what we put above anyways..
// volume amount for items
+/// volume for a data disk
#define ITEM_VOLUME_DISK 1
+/// volume for a shotgun stripper clip holding 4 shells
+#define ITEM_VOLUME_STRIPPER_CLIP (DEFAULT_VOLUME_NORMAL * 0.5)
// #define SAMPLE_VOLUME_AMOUNT 2
diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm
index bdff20553a..4305fb1ed5 100644
--- a/code/__HELPERS/donator_groupings.dm
+++ b/code/__HELPERS/donator_groupings.dm
@@ -17,9 +17,9 @@ For fast lookups, this is generated using regenerate_donator_grouping_list()
/proc/regenerate_donator_grouping_list()
GLOB.donators_by_group = list() //reinit everything
var/list/donator_list = GLOB.donators_by_group //cache
- var/list/tier_1 = TIER_1_DONATORS
- donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
- var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
+ var/list/tier_3 = TIER_3_DONATORS
+ donator_list[DONATOR_GROUP_TIER_3] = tier_3.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
+ var/list/tier_2 = tier_3 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
donator_list[DONATOR_GROUP_TIER_2] = tier_2
- var/list/tier_3 = tier_2 + TIER_3_DONATORS
- donator_list[DONATOR_GROUP_TIER_3] = tier_3
+ var/list/tier_1 = tier_2 + TIER_1_DONATORS
+ donator_list[DONATOR_GROUP_TIER_1] = tier_1
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 8225725ffd..71c2b2e13b 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -278,3 +278,8 @@ GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Ta
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
//parts in either of the above two lists that require a second option that allows them to be coloured
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
+
+//species ids that have greyscale sprites
+GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic"))
+
+//species ids that need snowflake coloring applied
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 4de7c88bf7..fee70ee3d5 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -41,3 +41,6 @@ GLOBAL_LIST_EMPTY(ai_status_displays)
GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects
GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert
+
+//list of everyone playing rock paper scissors
+GLOBAL_LIST_EMPTY(rockpaperscissors_players)
diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm
index 8ace273dd8..419524c871 100644
--- a/code/_onclick/overmind.dm
+++ b/code/_onclick/overmind.dm
@@ -32,4 +32,4 @@
/mob/camera/blob/AltClickOn(atom/A) //Remove a blob
var/turf/T = get_turf(A)
if(T)
- remove_blob(T)
\ No newline at end of file
+ remove_blob(T)
diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm
index a4e0d7703f..ee0fd1ea00 100644
--- a/code/controllers/subsystem/processing/instruments.dm
+++ b/code/controllers/subsystem/processing/instruments.dm
@@ -4,16 +4,26 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
init_order = INIT_ORDER_INSTRUMENTS
flags = SS_KEEP_TIMING
priority = FIRE_PRIORITY_INSTRUMENTS
- var/static/list/datum/instrument/instrument_data = list() //id = datum
+ /// List of all instrument data, associative id = datum
+ var/static/list/datum/instrument/instrument_data = list()
+ /// List of all song datums.
var/static/list/datum/song/songs = list()
+ /// Max lines in songs
var/static/musician_maxlines = 600
+ /// Max characters per line in songs
var/static/musician_maxlinechars = 300
+ /// Deciseconds between hearchecks. Too high and instruments seem to lag when people are moving around in terms of who can hear it. Too low and the server lags from this.
var/static/musician_hearcheck_mindelay = 5
+ /// Maximum instrument channels total instruments are allowed to use. This is so you don't have instruments deadlocking all sound channels.
var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS
+ /// Current number of channels allocated for instruments
var/static/current_instrument_channels = 0
+ /// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer.
+ var/static/list/synthesizer_instrument_ids
/datum/controller/subsystem/processing/instruments/Initialize()
initialize_instrument_data()
+ synthesizer_instrument_ids = get_allowed_instrument_ids()
return ..()
/datum/controller/subsystem/processing/instruments/proc/on_song_new(datum/song/S)
@@ -29,7 +39,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
continue
I = new path
I.Initialize()
- instrument_data[I.id || "[I.type]"] = I
+ if(!I.id)
+ qdel(I)
+ continue
+ instrument_data[I.id] = I
CHECK_TICK
/datum/controller/subsystem/processing/instruments/proc/get_instrument(id_or_path)
diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm
index dc9569a4d5..246226ceba 100644
--- a/code/datums/explosion.dm
+++ b/code/datums/explosion.dm
@@ -103,13 +103,21 @@ GLOBAL_LIST_EMPTY(explosions)
// 3/7/14 will calculate to 80 + 35
var/far_dist = 0
- far_dist += heavy_impact_range * 5
+ far_dist += heavy_impact_range * 15 // Large explosions carry further
far_dist += devastation_range * 20
if(!silent)
var/frequency = get_rand_frequency()
var/sound/explosion_sound = sound(get_sfx("explosion"))
var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg')
+ var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking"))
+ var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking"))
+ var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg')
+ var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION)
+ var/creaking_explosion = FALSE
+
+ if(prob(devastation_range*30+heavy_impact_range*5) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might.
+ creaking_explosion = TRUE // prob over 100 always returns true
for(var/mob/M in GLOB.player_list)
// Double check for client
@@ -126,11 +134,29 @@ GLOBAL_LIST_EMPTY(explosions)
shake_camera(M, 25, clamp(baseshakeamount, 0, 10))
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
else if(dist <= far_dist)
- var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
- far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
- M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound)
- if(baseshakeamount > 0)
+ var/far_volume = clamp(far_dist/2, 40, 60) // Volume is based on explosion size and dist
+ if(creaking_explosion)
+ M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, distance_multiplier = 0)
+ else if(prob(75))
+ M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, distance_multiplier = 0) // Far sound
+ else
+ M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) // Echo sound
+
+ if(baseshakeamount > 0 || devastation_range)
+ if(!baseshakeamount) // Devastating explosions rock the station and ground
+ baseshakeamount = devastation_range*3
shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
+
+ else if(M.can_hear() && !isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull
+ var/echo_volume = 40
+ if(devastation_range)
+ baseshakeamount = devastation_range
+ shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
+ echo_volume = 60
+ M.playsound_local(epicenter, null, echo_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0)
+
+ if(creaking_explosion) // 5 seconds after the bang, the station begins to creak
+ addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(25, 40), 1, frequency, null, null, FALSE, hull_creaking_sound, null, null, null, null, 0), 5 SECONDS)
EX_PREPROCESS_CHECK_TICK
//postpone processing for a bit
diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm
index 978802fd80..ad08b8ebdc 100644
--- a/code/datums/mutations/antenna.dm
+++ b/code/datums/mutations/antenna.dm
@@ -90,6 +90,8 @@
to_chat(user, "You catch some drifting memories of their past conversations...")
for(var/spoken_memory in recent_speech)
to_chat(user, "[recent_speech[spoken_memory]]")
+ if(usr in GLOB.rockpaperscissors_players)
+ to_chat(user, "They're planning on playing [GLOB.rockpaperscissors_players[usr][1]]")
if(iscarbon(M))
var/mob/living/carbon/human/H = M
to_chat(user, "You find that their intent is to [H.a_intent]...")
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index 6cef7ac50f..179adf46bd 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -53,8 +53,6 @@
/datum/wires/airlock/interactable(mob/user)
var/obj/machinery/door/airlock/A = holder
- if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100))
- return FALSE
if(A.panel_open)
return TRUE
@@ -73,6 +71,8 @@
/datum/wires/airlock/on_pulse(wire)
set waitfor = FALSE
var/obj/machinery/door/airlock/A = holder
+ if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100))
+ return FALSE
switch(wire)
if(WIRE_POWER1, WIRE_POWER2) // Pulse to loose power.
A.loseMainPower()
@@ -127,6 +127,8 @@
/datum/wires/airlock/on_cut(wire, mend)
var/obj/machinery/door/airlock/A = holder
+ if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100))
+ return FALSE
switch(wire)
if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power.
if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2))
@@ -174,4 +176,4 @@
A.update_icon()
if(WIRE_ZAP1, WIRE_ZAP2) // Ouch.
if(isliving(usr))
- A.shock(usr, 50)
\ No newline at end of file
+ A.shock(usr, 50)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index bf71786a05..ff6f96a29f 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -3,13 +3,14 @@
/obj/machinery/iv_drip
name = "\improper IV drip"
- desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate."
+ desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. Alt-Click to change the transfer rate."
icon = 'icons/obj/iv_drip.dmi'
icon_state = "iv_drip"
anchored = FALSE
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/mob/living/carbon/attached
var/mode = IV_INJECTING
+ var/dripfeed = FALSE
var/obj/item/reagent_containers/beaker
var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/food,
@@ -132,9 +133,11 @@
if(mode)
if(beaker.reagents.total_volume)
var/transfer_amount = 5
+ if (dripfeed)
+ transfer_amount = 1
if(istype(beaker, /obj/item/reagent_containers/blood))
// speed up transfer on blood packs
- transfer_amount = 10
+ transfer_amount *= 2
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
@@ -169,6 +172,16 @@
else
toggle_mode()
+/obj/machinery/iv_drip/AltClick(mob/living/user)
+ if(!user.canUseTopic(src, be_close=TRUE))
+ return
+ if(dripfeed)
+ dripfeed = FALSE
+ to_chat(usr, "You loosen the valve to speed up the [src].")
+ else
+ dripfeed = TRUE
+ to_chat(usr, "You tighten the valve to slowly drip-feed the contents of [src].")
+
/obj/machinery/iv_drip/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
@@ -227,7 +240,7 @@
/obj/machinery/iv_drip/telescopic
name = "telescopic IV drip"
- desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down."
+ desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down.Alt-Click with a beaker attached to change the transfer rate."
icon_state = "iv_drip"
/obj/machinery/iv_drip/telescopic/update_icon_state()
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index 19b0dc76dd..a388d3bc67 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -63,3 +63,23 @@
/datum/effect_system/lightning_spread
effect_type = /obj/effect/particle_effect/sparks/electricity
+
+//fake sparks, not subtyped because we don't want light/heat, nor checks inside an often used proc for a rare subcase for saving like 10 lines of code
+/obj/effect/particle_effect/fake_sparks
+ name = "lightning"
+ icon_state = "electricity"
+
+/obj/effect/particle_effect/fake_sparks/Initialize()
+ . = ..()
+ flick(icon_state, src) // replay the animation
+ playsound(src, "sparks", 100, TRUE)
+ QDEL_IN(src, 20)
+
+/datum/effect_system/fake_spark_spread
+ effect_type = /obj/effect/particle_effect/fake_sparks
+
+/proc/do_fake_sparks(n, c, source)
+ var/datum/effect_system/fake_spark_spread/sparks = new
+ sparks.set_up(n, c, source)
+ sparks.autocleanup = TRUE
+ sparks.start()
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index a7f7e3152c..6f1aec287b 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -47,8 +47,11 @@
spawn_option(stored_options[choice],M)
qdel(src)
-/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M)
- var/obj/new_item = new choice()
+/obj/item/choice_beacon/proc/create_choice_atom(atom/choice, mob/owner)
+ return new choice()
+
+/obj/item/choice_beacon/proc/spawn_option(atom/choice,mob/living/M)
+ var/obj/new_item = create_choice_atom(choice, M)
var/obj/structure/closet/supplypod/bluespacepod/pod = new()
pod.explosionSize = list(0,0,0,0)
new_item.forceMove(pod)
@@ -152,10 +155,50 @@
augment_list[initial(A.name)] = A
return augment_list
-/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M)
+/obj/item/choice_beacon/augments/spawn_option(atom/choice,mob/living/M)
new choice(get_turf(M))
to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")
+/obj/item/choice_beacon/pet //donator beacon that summons a small friendly animal
+ name = "pet beacon"
+ desc = "Straight from the outerspace pet shop to your feet."
+ var/static/list/pets = list("Crab" = /mob/living/simple_animal/crab,
+ "Cat" = /mob/living/simple_animal/pet/cat,
+ "Space cat" = /mob/living/simple_animal/pet/cat/space,
+ "Kitten" = /mob/living/simple_animal/pet/cat/kitten,
+ "Dog" = /mob/living/simple_animal/pet/dog,
+ "Corgi" = /mob/living/simple_animal/pet/dog/corgi,
+ "Pug" = /mob/living/simple_animal/pet/dog/pug,
+ "Exotic Corgi" = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi,
+ "Fox" = /mob/living/simple_animal/pet/fox,
+ "Red Panda" = /mob/living/simple_animal/pet/redpanda,
+ "Possum" = /mob/living/simple_animal/opossum)
+ var/pet_name
+
+/obj/item/choice_beacon/pet/generate_display_names()
+ return pets
+
+/obj/item/choice_beacon/pet/create_choice_atom(atom/choice, mob/owner)
+ var/mob/living/simple_animal/new_choice = new choice()
+ new_choice.butcher_results = null //please don't eat your pet, chef
+ var/obj/item/pet_carrier/donator/carrier = new() //a donator pet carrier is just a carrier that can't be shoved in an autolathe for metal
+ carrier.add_occupant(new_choice)
+ new_choice.mob_size = MOB_SIZE_TINY //yeah we're not letting you use this roundstart pet to hurt people / knock them down
+ new_choice.pass_flags = PASSTABLE | PASSMOB //your pet is not a bullet/person shield
+ new_choice.density = FALSE
+ new_choice.blood_volume = 0 //your pet cannot be used to drain blood from for a bloodsucker
+ new_choice.desc = "A pet [initial(choice.name)], owned by [owner]!"
+ new_choice.can_have_ai = FALSE //no it cant be sentient damnit
+ if(pet_name)
+ new_choice.name = pet_name
+ new_choice.unique_name = TRUE
+ return carrier
+
+/obj/item/choice_beacon/pet/spawn_option(atom/choice,mob/living/M)
+ pet_name = input(M, "What would you like to name the pet? (leave blank for default name)", "Pet Name")
+ ..()
+
+//choice boxes (they just open in your hand instead of making a pod)
/obj/item/choice_beacon/box
name = "choice box (default)"
desc = "Think really hard about what you want, and then rip it open!"
@@ -163,21 +206,17 @@
icon_state = "deliverypackage3"
item_state = "deliverypackage3"
-/obj/item/choice_beacon/box/spawn_option(obj/choice,mob/living/M)
- to_chat(M, "The box opens, revealing the [choice]!")
+/obj/item/choice_beacon/box/spawn_option(atom/choice,mob/living/M)
+ var/choice_text = choice
+ if(ispath(choice_text))
+ choice_text = initial(choice.name)
+ to_chat(M, "The box opens, revealing the [choice_text]!")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
M.temporarilyRemoveItemFromInventory(src, TRUE)
M.put_in_hands(new choice)
qdel(src)
-/obj/item/choice_beacon/box/plushie
- name = "choice box (plushie)"
- desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
- icon = 'icons/obj/plushes.dmi'
- icon_state = "box"
- item_state = "box"
-
-/obj/item/choice_beacon/box/spawn_option(choice,mob/living/M)
+/obj/item/choice_beacon/box/plushie/spawn_option(choice,mob/living/M)
if(ispath(choice, /obj/item/toy/plush))
..() //regular plush, spawn it naturally
else
@@ -188,6 +227,31 @@
M.put_in_hands(new choice)
qdel(src)
+/obj/item/choice_beacon/box/carpet //donator carpet beacon
+ name = "choice box (carpet)"
+ desc = "Contains 50 of a selected carpet inside!"
+ var/static/list/carpet_list = list(/obj/item/stack/tile/carpet/black/fifty = "Black Carpet",
+ "Black & Red Carpet" = /obj/item/stack/tile/carpet/blackred/fifty,
+ "Monochrome Carpet" = /obj/item/stack/tile/carpet/monochrome/fifty,
+ "Blue Carpet" = /obj/item/stack/tile/carpet/blue/fifty,
+ "Cyan Carpet" = /obj/item/stack/tile/carpet/cyan/fifty,
+ "Green Carpet" = /obj/item/stack/tile/carpet/green/fifty,
+ "Orange Carpet" = /obj/item/stack/tile/carpet/orange/fifty,
+ "Purple Carpet" = /obj/item/stack/tile/carpet/purple/fifty,
+ "Red Carpet" = /obj/item/stack/tile/carpet/red/fifty,
+ "Royal Black Carpet" = /obj/item/stack/tile/carpet/royalblack/fifty,
+ "Royal Blue Carpet" = /obj/item/stack/tile/carpet/royalblue/fifty)
+
+/obj/item/choice_beacon/box/carpet/generate_display_names()
+ return carpet_list
+
+/obj/item/choice_beacon/box/plushie
+ name = "choice box (plushie)"
+ desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
+ icon = 'icons/obj/plushes.dmi'
+ icon_state = "box"
+ item_state = "box"
+
/obj/item/choice_beacon/box/plushie/generate_display_names()
var/list/plushie_list = list()
//plushie set 1: just subtypes of /obj/item/toy/plush
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index a4b12dd629..ef2fb44d3d 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -29,6 +29,9 @@
var/has_lock_sprites = TRUE //whether to load the lock overlays or not
var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it?
+/obj/item/pet_carrier/donator
+ custom_materials = null //you cant just use the loadout item to get free metal!
+
/obj/item/pet_carrier/Destroy()
if(occupants.len)
for(var/V in occupants)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index a6b34c59e3..73246276c2 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -281,6 +281,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/clothing/suit/armor/vest/infiltrator,
/obj/item/clothing/under/syndicate/bloodred,
/obj/item/clothing/gloves/color/latex/nitrile/infiltrator,
+ /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator,
/obj/item/clothing/mask/infiltrator,
/obj/item/clothing/shoes/combat/sneakboots,
/obj/item/gun/ballistic/automatic/pistol,
@@ -292,7 +293,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
new /obj/item/clothing/head/helmet/infiltrator(src)
new /obj/item/clothing/suit/armor/vest/infiltrator(src)
new /obj/item/clothing/under/syndicate/bloodred(src)
- new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src)
+ new /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator(src)
new /obj/item/clothing/mask/infiltrator(src)
new /obj/item/clothing/shoes/combat/sneakboots(src)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index f462050789..653e95c21e 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -291,7 +291,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
- force = 9
+ force = 7 //how much harm mode damage we do
+ var/stamina_damage_increment = 4 //how much extra damage do we do when in non-harm mode
throwforce = 10
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
@@ -342,17 +343,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/melee/bokken/Initialize()
. = ..()
AddElement(/datum/element/sword_point)
+ if(!harm) //if initialised in non-harm mode, setup force accordingly
+ force = force + stamina_damage_increment
/obj/item/melee/bokken/attack_self(mob/user)
harm = !harm
if(harm)
- force -= 2
+ force -= stamina_damage_increment
damtype = BRUTE
attack_verb = list("bashed", "smashed", "attacked")
bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked
wound_bonus = 0
else
- force += 2
+ force += stamina_damage_increment
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
bare_wound_bonus = 0
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 45cac650b8..c36fba96cb 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -243,10 +243,24 @@ LINEN BINS
/obj/item/bedsheet/random/Initialize()
..()
- var/type = pick(typesof(/obj/item/bedsheet) - /obj/item/bedsheet/random)
+ var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon))
new type(loc)
return INITIALIZE_HINT_QDEL
+/obj/item/bedsheet/chameleon //donator chameleon bedsheet
+ name = "chameleon bedsheet"
+ desc = "Bedsheet technology has truly gone too far."
+ var/datum/action/item_action/chameleon/change/chameleon_action
+
+/obj/item/bedsheet/chameleon/New()
+ ..()
+ chameleon_action = new(src)
+ chameleon_action.chameleon_type = /obj/item/bedsheet
+ chameleon_action.chameleon_name = "Bedsheet"
+ chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random), only_root_path = TRUE)
+ chameleon_action.initialize_disguises()
+
+//bedsheet bin
/obj/structure/bedsheetbin
name = "linen bin"
desc = "It looks rather cosy."
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 36e4f825da..7853b9619c 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -86,6 +86,10 @@
/obj/structure/grille/attack_animal(mob/user)
. = ..()
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ user.DelayNextAction(flush = TRUE)
+ user.do_attack_animation(src)
if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille)
take_damage(rand(5,10), BRUTE, "melee", 1)
@@ -114,12 +118,12 @@
/obj/structure/grille/attack_alien(mob/living/user)
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
return
+ user.DelayNextAction(flush = TRUE)
user.do_attack_animation(src)
user.visible_message("[user] mangles [src].", null, null, COMBAT_MESSAGE_RANGE)
if(!shock(user, 70))
take_damage(20, BRUTE, "melee", 1)
-
/obj/structure/grille/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGRILLE))
return TRUE
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 0feb01c223..b012ba4e2a 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -130,6 +130,10 @@
/proc/get_sfx(soundin)
if(istext(soundin))
switch(soundin)
+ if ("explosion_creaking") // from skyrat-ss13/skyrat13/pull/3295
+ soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg')
+ if ("hull_creaking") // from skyrat-ss13/skyrat13/pull/3295
+ soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg')
if ("shatter")
soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg')
if ("explosion")
diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm
index 24cad2a188..740ec81782 100644
--- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm
+++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm
@@ -54,7 +54,7 @@
REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude")
REMOVE_TRAIT(user, TRAIT_NODISMEMBER, "fortitude")
REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude")
- REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude")
+ REMOVE_TRAIT(user, TRAIT_NORUNNING, "fortitude")
if(!ishuman(owner))
return
var/mob/living/carbon/human/H = owner
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 480ebda4f8..2fe674e59e 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -246,6 +246,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)]
var/scars_index = 1
+ var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded
+
/datum/preferences/New(client/C)
parent = C
@@ -521,6 +523,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
+ if(length(pref_species.allowed_limb_ids))
+ if(!chosen_limb_id || !(chosen_limb_id in pref_species.allowed_limb_ids))
+ chosen_limb_id = pref_species.id
+ dat += "
Body sprite
"
+ dat += "[chosen_limb_id]"
+
if(mutant_category)
dat += ""
mutant_category = 0
@@ -801,7 +809,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!subcategories.Find(gear_subcategory))
gear_subcategory = subcategories[1]
- var/firstsubcat = FALSE
+ var/firstsubcat = TRUE
for(var/subcategory in subcategories)
if(firstsubcat)
firstsubcat = FALSE
@@ -2092,8 +2100,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
features["body_model"] = chosengender
gender = chosengender
- facial_hair_style = random_facial_hair_style(gender)
- hair_style = random_hair_style(gender)
if("body_size")
var/min = CONFIG_GET(number/body_size_min)
@@ -2119,6 +2125,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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
+
+ if("bodysprite")
+ var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids
+ if(selected_body_sprite)
+ chosen_limb_id = selected_body_sprite //this gets sanitized before loading
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
@@ -2510,6 +2521,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.features = features.Copy()
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
+ if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids))
+ character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id
character.dna.real_name = character.real_name
character.dna.nameless = character.nameless
character.dna.custom_species = character.custom_species
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index a8183e4940..55a594cf21 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -514,6 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["scars3"] >> scars_list["3"]
S["scars4"] >> scars_list["4"]
S["scars5"] >> scars_list["5"]
+ S["chosen_limb_id"] >> chosen_limb_id
//Custom names
@@ -844,6 +845,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
+ WRITE_FILE(S["chosen_limb_id"], chosen_limb_id)
+
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 1c3ac0f340..b5d92fb780 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -199,12 +199,16 @@
/obj/item/clothing/gloves/evening
name = "evening gloves"
- desc = "Thin, pretty gloves intended for use in regal feminine attire, but knowing Space China these are just for some maid fetish."
+ desc = "Thin, pretty gloves intended for use in regal feminine attire. A tag on the hem claims they were 'maid' in Space China, these were probably intended for use in some maid fetish."
icon_state = "evening"
item_state = "evening"
- strip_delay = 40
- equip_delay_other = 20
+ transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
strip_mod = 0.9
- custom_price = PRICE_ALMOST_CHEAP
+
+/obj/item/clothing/gloves/evening/black
+ name = "midnight gloves"
+ desc = "Thin, pretty gloves intended for use in sexy feminine attire. A tag on the hem claims they pair great with black stockings."
+ icon_state = "eveningblack"
+ item_state = "eveningblack"
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index 11b2afa968..f4b4140a1a 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -72,6 +72,25 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
+/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator
+ name = "insidious guerrilla gloves"
+ desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping and tackling knowledge to the user via the use of nanochips."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ var/carrytrait = TRAIT_QUICKER_CARRY
+
+/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_GLOVES)
+ ADD_TRAIT(user, carrytrait, GLOVE_TRAIT)
+
+/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user, carrytrait, GLOVE_TRAIT)
+
/obj/item/clothing/gloves/tackler/rocket
name = "rocket gloves"
desc = "The ultimate in high risk, high reward, perfect for when you need to stop a criminal from fifty feet away or die trying. Banned in most Spinward gridiron football and rugby leagues."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6364a9a1c1..d6853f52ca 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -625,7 +625,7 @@
desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. Snazzy."
icon_state = "coatmedical"
item_state = "coatmedical"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
@@ -638,7 +638,7 @@
desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur."
icon_state = "coatcmo"
item_state = "coatcmo"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
@@ -651,7 +651,7 @@
desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go."
icon_state = "coatchemistry"
item_state = "coatchemistry"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
@@ -664,7 +664,7 @@
desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage."
icon_state = "coatviro"
item_state = "coatviro"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
@@ -677,7 +677,7 @@
desc = "A winter coat with blue markings. Warm, but probably won't protect from biological agents. For the cozy doctor on the go."
icon_state = "coatparamed"
item_state = "coatparamed"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/paramedic
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 895699434a..4d5f4e2dd0 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -97,9 +97,12 @@ All foods are distributed among various categories. Use common sense.
return
-/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, def_zone)
+/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(user.a_intent == INTENT_HARM)
return ..()
+ INVOKE_ASYNC(src, .proc/attempt_forcefeed, M, user)
+
+/obj/item/reagent_containers/food/snacks/proc/attempt_forcefeed(mob/living/M, mob/living/user)
if(!eatverb)
eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp")
if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it.
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index abf6632939..f6be9db9a2 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -103,6 +103,7 @@
throwforce = 5
throw_speed = 2
throw_range = 3
+ attack_speed = CLICK_CD_MELEE
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
armour_penetration = 20
@@ -125,9 +126,12 @@
playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
-/obj/item/scythe/pre_attack(atom/A, mob/living/user, params)
+/obj/item/scythe/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier)
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
- return ..()
+ return
else
var/turf/user_turf = get_turf(user)
var/dir_to_target = get_dir(user_turf, get_turf(A))
@@ -138,11 +142,12 @@
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
for(var/obj/structure/spacevine/V in T)
if(user.Adjacent(V))
- melee_attack_chain(user, V)
+ melee_attack_chain(user, V, attackchain_flags = ATTACK_IGNORE_CLICKDELAY)
stam_gain += 5 //should be hitcost
swiping = FALSE
stam_gain += 2 //Initial hitcost
user.adjustStaminaLoss(-stam_gain)
+ user.DelayNextAction()
// *************************************
// Nutrient defines for hydroponics
@@ -192,4 +197,4 @@
/obj/item/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
- list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
\ No newline at end of file
+ list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm
index d842dbc003..a0d96658e6 100644
--- a/code/modules/instruments/songs/_song.dm
+++ b/code/modules/instruments/songs/_song.dm
@@ -2,6 +2,12 @@
#define MUSIC_MAXLINES 1000
#define MUSIC_MAXLINECHARS 300
+/**
+ * # Song datum
+ *
+ * These are the actual backend behind instruments.
+ * They attach to an atom and provide the editor + playback functionality.
+ */
/datum/song
/// Name of the song
var/name = "Untitled"
@@ -15,6 +21,9 @@
/// delay between notes in deciseconds
var/tempo = 5
+ /// How far we can be heard
+ var/instrument_range = 15
+
/// Are we currently playing?
var/playing = FALSE
@@ -53,17 +62,24 @@
/////////////////// Playing variables ////////////////
/**
- * Only used in synthesized playback - The chords we compiled. Non assoc list of lists:
- * list(list(key1, key2, key3..., tempo_divisor), list(key1, key2..., tempo_divisor), ...)
- * tempo_divisor always exists
- * if key1 (and so if there's no keys) doesn't exist it's a rest
+ * Build by compile_chords()
+ * Must be rebuilt on instrument switch.
* Compilation happens when we start playing and is cleared after we finish playing.
+ * Format: list of chord lists, with chordlists having (key1, key2, key3, tempodiv)
*/
var/list/compiled_chords
+ /// Current section of a long chord we're on, so we don't need to make a billion chords, one for every unit ticklag.
+ var/elapsed_delay
+ /// Amount of delay to wait before playing the next chord
+ var/delay_by
+ /// Current chord we're on.
+ var/current_chord
/// Channel as text = current volume percentage but it's 0 to 100 instead of 0 to 1.
var/list/channels_playing = list()
/// List of channels that aren't being used, as text. This is to prevent unnecessary freeing and reallocations from SSsounds/SSinstruments.
var/list/channels_idle = list()
+ /// Person playing us
+ var/mob/user_playing
//////////////////////////////////////////////////////
/// Last world.time we checked for who can hear us
@@ -72,8 +88,6 @@
var/list/hearing_mobs
/// If this is enabled, some things won't be strictly cleared when they usually are (liked compiled_chords on play stop)
var/debug_mode = FALSE
- /// Last time we processed decay
- var/last_process_decay
/// Max sound channels to occupy
var/max_sound_channels = CHANNELS_PER_INSTRUMENT
/// Current channels, so we can save a length() call.
@@ -113,7 +127,7 @@
var/cached_exponential_dropoff = 1.045
/////////////////////////////////////////////////////////////////////////
-/datum/song/New(atom/parent, list/instrument_ids)
+/datum/song/New(atom/parent, list/instrument_ids, new_range)
SSinstruments.on_song_new(src)
lines = list()
tempo = sanitize_tempo(tempo)
@@ -125,6 +139,8 @@
hearing_mobs = list()
volume = clamp(volume, min_volume, max_volume)
update_sustain()
+ if(new_range)
+ instrument_range = new_range
/datum/song/Destroy()
stop_playing()
@@ -135,12 +151,15 @@
parent = null
return ..()
+/**
+ * Checks and stores which mobs can hear us. Terminates sounds for mobs that leave our range.
+ */
/datum/song/proc/do_hearcheck()
last_hearcheck = world.time
var/list/old = hearing_mobs.Copy()
hearing_mobs.len = 0
var/turf/source = get_turf(parent)
- for(var/mob/M in get_hearers_in_view(15, source))
+ for(var/mob/M in get_hearers_in_view(instrument_range, source))
if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS))
continue
hearing_mobs[M] = get_dist(M, source)
@@ -148,10 +167,15 @@
for(var/i in exited)
terminate_sound_mob(i)
-/// I can either be a datum, id, or path (if the instrument has no id).
+/**
+ * Sets our instrument, caching anything necessary for faster accessing. Accepts an ID, typepath, or instantiated instrument datum.
+ */
/datum/song/proc/set_instrument(datum/instrument/I)
+ terminate_all_sounds()
+ var/old_legacy
if(using_instrument)
using_instrument.songs_using -= src
+ old_legacy = (using_instrument.instrument_flags & INSTRUMENT_LEGACY)
using_instrument = null
cached_samples = null
cached_legacy_ext = null
@@ -162,7 +186,7 @@
if(istype(I))
using_instrument = I
I.songs_using += src
- var/instrument_legacy = CHECK_BITFIELD(I.instrument_flags, INSTRUMENT_LEGACY)
+ var/instrument_legacy = (I.instrument_flags & INSTRUMENT_LEGACY)
if(instrument_legacy)
cached_legacy_ext = I.legacy_instrument_ext
cached_legacy_dir = I.legacy_instrument_path
@@ -170,23 +194,37 @@
else
cached_samples = I.samples
legacy = FALSE
+ if(isnull(old_legacy) || (old_legacy != instrument_legacy))
+ if(playing)
+ compile_chords()
-/// THIS IS A BLOCKING CALL.
+/**
+ * Attempts to start playing our song.
+ */
/datum/song/proc/start_playing(mob/user)
if(playing)
return
if(!using_instrument?.ready())
to_chat(user, "An error has occured with [src]. Please reset the instrument.")
return
+ compile_chords()
+ if(!length(compiled_chords))
+ to_chat(user, "Song is empty.")
+ return
playing = TRUE
- updateDialog()
+ updateDialog(user_playing)
//we can not afford to runtime, since we are going to be doing sound channel reservations and if we runtime it means we have a channel allocation leak.
//wrap the rest of the stuff to ensure stop_playing() is called.
- last_process_decay = world.time
+ do_hearcheck()
+ elapsed_delay = 0
+ delay_by = 0
+ current_chord = 1
+ user_playing = user
START_PROCESSING(SSinstruments, src)
- . = do_play_lines(user)
- stop_playing()
+/**
+ * Stops playing, terminating all sounds if in synthesized mode. Clears hearing_mobs.
+ */
/datum/song/proc/stop_playing()
if(!playing)
return
@@ -196,42 +234,93 @@
STOP_PROCESSING(SSinstruments, src)
terminate_all_sounds(TRUE)
hearing_mobs.len = 0
- updateDialog()
+ user_playing = null
-/// THIS IS A BLOCKING CALL.
-/datum/song/proc/do_play_lines(user)
- if(!playing)
+/**
+ * Processes our song.
+ */
+/datum/song/proc/process_song(wait)
+ if(!length(compiled_chords) || should_stop_playing(user_playing))
+ stop_playing()
return
- do_hearcheck()
- if(legacy)
- do_play_lines_legacy(user)
- else
- do_play_lines_synthesized(user)
+ var/list/chord = compiled_chords[current_chord]
+ if(++elapsed_delay >= delay_by)
+ play_chord(chord)
+ elapsed_delay = 0
+ delay_by = tempodiv_to_delay(chord[length(chord)])
+ current_chord++
+ if(current_chord > length(compiled_chords))
+ if(repeat)
+ repeat--
+ current_chord = 1
+ return
+ else
+ stop_playing()
+ return
+/**
+ * Converts a tempodiv to ticks to elapse before playing the next chord, taking into account our tempo.
+ */
+/datum/song/proc/tempodiv_to_delay(tempodiv)
+ if(!tempodiv)
+ tempodiv = 1 // no division by 0. some song converters tend to use 0 for when it wants to have no div, for whatever reason.
+ return max(1, round((tempo/tempodiv) / world.tick_lag, 1))
+
+/**
+ * Compiles chords.
+ */
+/datum/song/proc/compile_chords()
+ legacy? compile_legacy() : compile_synthesized()
+
+/**
+ * Plays a chord.
+ */
+/datum/song/proc/play_chord(list/chord)
+ // last value is timing information
+ for(var/i in 1 to (length(chord) - 1))
+ legacy? playkey_legacy(chord[i][1], chord[i][2], chord[i][3], user_playing) : playkey_synth(chord[i], user_playing)
+
+/**
+ * Checks if we should halt playback.
+ */
/datum/song/proc/should_stop_playing(mob/user)
return QDELETED(parent) || !using_instrument || !playing
+/**
+ * Sanitizes tempo to a value that makes sense and fits the current world.tick_lag.
+ */
/datum/song/proc/sanitize_tempo(new_tempo)
new_tempo = abs(new_tempo)
return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS)
+/**
+ * Gets our beats per minute based on our tempo.
+ */
/datum/song/proc/get_bpm()
return 600 / tempo
+/**
+ * Sets our tempo from a beats-per-minute, sanitizing it to a valid number first.
+ */
/datum/song/proc/set_bpm(bpm)
tempo = sanitize_tempo(600 / bpm)
-/// Updates the window for our user. Override in subtypes.
-/datum/song/proc/updateDialog(mob/user = usr)
+/**
+ * Updates the window for our users. Override down the line.
+ */
+/datum/song/proc/updateDialog(mob/user)
ui_interact(user)
/datum/song/process(wait)
if(!playing)
return PROCESS_KILL
- var/delay = world.time - last_process_decay
- process_decay(delay)
- last_process_decay = world.time
+ // it's expected this ticks at every world.tick_lag. if it lags, do not attempt to catch up.
+ process_song(world.tick_lag)
+ process_decay(world.tick_lag)
+/**
+ * Updates our cached linear/exponential falloff stuff, saving calculations down the line.
+ */
/datum/song/proc/update_sustain()
// Exponential is easy
cached_exponential_dropoff = sustain_exponential_dropoff
@@ -241,21 +330,33 @@
var/volume_decrease_per_decisecond = volume_diff / target_duration
cached_linear_dropoff = volume_decrease_per_decisecond
+/**
+ * Setter for setting output volume.
+ */
/datum/song/proc/set_volume(volume)
src.volume = clamp(volume, max(0, min_volume), min(100, max_volume))
update_sustain()
updateDialog()
+/**
+ * Setter for setting how low the volume has to get before a note is considered "dead" and dropped
+ */
/datum/song/proc/set_dropoff_volume(volume)
sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100)
update_sustain()
updateDialog()
+/**
+ * Setter for setting exponential falloff factor.
+ */
/datum/song/proc/set_exponential_drop_rate(drop)
sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX)
update_sustain()
updateDialog()
+/**
+ * Setter for setting linear falloff duration.
+ */
/datum/song/proc/set_linear_falloff_duration(duration)
sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN)
update_sustain()
@@ -277,10 +378,8 @@
// subtype for handheld instruments, like violin
/datum/song/handheld
-/datum/song/handheld/updateDialog(mob/user = usr)
- if(user.machine != src)
- return
- parent.ui_interact(user)
+/datum/song/handheld/updateDialog(mob/user)
+ parent.ui_interact(user || usr)
/datum/song/handheld/should_stop_playing(mob/user)
. = ..()
@@ -292,10 +391,8 @@
// subtype for stationary structures, like pianos
/datum/song/stationary
-/datum/song/stationary/updateDialog(mob/user = usr)
- if(user.machine != src)
- return
- parent.ui_interact(user)
+/datum/song/stationary/updateDialog(mob/user)
+ parent.ui_interact(user || usr)
/datum/song/stationary/should_stop_playing(mob/user)
. = ..()
diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm
index fa64656ebc..eee9be3cc7 100644
--- a/code/modules/instruments/songs/play_legacy.dm
+++ b/code/modules/instruments/songs/play_legacy.dm
@@ -1,48 +1,52 @@
-/// Playing legacy instruments - None of the "advanced" like sound reservations and decay are invoked.
-/datum/song/proc/do_play_lines_legacy(mob/user)
- while(repeat >= 0)
- var/cur_oct[7]
- var/cur_acc[7]
- for(var/i = 1 to 7)
- cur_oct[i] = 3
- cur_acc[i] = "n"
+/**
+ * Compiles our lines into "chords" with filenames for legacy playback. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
+ */
+/datum/song/proc/compile_legacy()
+ if(!length(src.lines))
+ return
+ var/list/lines = src.lines //cache for hyepr speed!
+ compiled_chords = list()
+ var/list/octaves = list(3, 3, 3, 3, 3, 3, 3)
+ var/list/accents = list("n", "n", "n", "n", "n", "n", "n")
+ for(var/line in lines)
+ var/list/chords = splittext(lowertext(line), ",")
+ for(var/chord in chords)
+ var/list/compiled_chord = list()
+ var/tempodiv = 1
+ var/list/notes_tempodiv = splittext(chord, "/")
+ var/len = length(notes_tempodiv)
+ if(len >= 2)
+ tempodiv = text2num(notes_tempodiv[2])
+ if(len) //some dunkass is going to do ,,,, to make 3 rests instead of ,/1 because there's no standardization so let's be prepared for that.
+ var/list/notes = splittext(notes_tempodiv[1], "-")
+ for(var/note in notes)
+ if(length(note) == 0)
+ continue
+ // 1-7, A-G
+ var/key = text2ascii(note) - 96
+ if((key < 1) || (key > 7))
+ continue
+ for(var/i in 2 to length(note))
+ var/oct_acc = copytext(note, i, i + 1)
+ var/num = text2num(oct_acc)
+ if(!num) //it's an accidental
+ accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks.
+ else //octave
+ octaves[key] = clamp(num, octave_min, octave_max)
+ compiled_chord[++compiled_chord.len] = list(key, accents[key], octaves[key])
+ compiled_chord += tempodiv //this goes last
+ if(length(compiled_chord))
+ compiled_chords[++compiled_chords.len] = compiled_chord
- for(var/line in lines)
- for(var/beat in splittext(lowertext(line), ","))
- if(should_stop_playing(user))
- return
- var/list/notes = splittext(beat, "/")
- if(length(notes)) //because some jack-butts are going to do ,,,, to symbolize 3 rests instead of something reasonable like ,/1.
- for(var/note in splittext(notes[1], "-"))
- if(length(note) == 0)
- continue
- var/cur_note = text2ascii(note) - 96
- if(cur_note < 1 || cur_note > 7)
- continue
- for(var/i=2 to length(note))
- var/ni = copytext(note,i,i+1)
- if(!text2num(ni))
- if(ni == "#" || ni == "b" || ni == "n")
- cur_acc[cur_note] = ni
- else if(ni == "s")
- cur_acc[cur_note] = "#" // so shift is never required
- else
- cur_oct[cur_note] = text2num(ni)
- playnote_legacy(cur_note, cur_acc[cur_note], cur_oct[cur_note])
- if(notes.len >= 2 && text2num(notes[2]))
- sleep(sanitize_tempo(tempo / text2num(notes[2])))
- else
- sleep(tempo)
- if(should_stop_playing(user))
- return
- repeat--
- updateDialog()
- repeat = 0
-
-// note is a number from 1-7 for A-G
-// acc is either "b", "n", or "#"
-// oct is 1-8 (or 9 for C)
-/datum/song/proc/playnote_legacy(note, acc as text, oct)
+/**
+ * Proc to play a legacy note. Just plays the sound to hearing mobs (and does hearcheck if necessary), no fancy channel/sustain/management.
+ *
+ * Arguments:
+ * * note is a number from 1-7 for A-G
+ * * acc is either "b", "n", or "#"
+ * * oct is 1-8 (or 9 for C)
+ */
+/datum/song/proc/playkey_legacy(note, acc as text, oct, mob/user)
// handle accidental -> B<>C of E<>F
if(acc == "b" && (note == 3 || note == 6)) // C or F
if(note == 3)
diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm
index 5e7c5652a0..4df54f5e6b 100644
--- a/code/modules/instruments/songs/play_synthesized.dm
+++ b/code/modules/instruments/songs/play_synthesized.dm
@@ -1,27 +1,7 @@
-/datum/song/proc/do_play_lines_synthesized(mob/user)
- compile_lines()
- while(repeat >= 0)
- if(should_stop_playing(user))
- return
- var/warned = FALSE
- for(var/_chord in compiled_chords)
- if(should_stop_playing(user))
- return
- var/list/chord = _chord
- var/tempodiv = chord[chord.len]
- for(var/i in 1 to chord.len - 1)
- var/key = chord[i]
- if(!playkey_synth(key))
- if(!warned)
- warned = TRUE
- to_chat(user, "Your instrument has ran out of channels. You might be playing your song too fast or be setting sustain to too high of a value. This warning will be suppressed for the rest of this cycle.")
- sleep(sanitize_tempo(tempo / (tempodiv || 1)))
- repeat--
- updateDialog()
- repeat = 0
-
-/// C-Db2-A-A4/2,A-B#4-C/3,/4,A,A-B-C as an example
-/datum/song/proc/compile_lines()
+/**
+ * Compiles our lines into "chords" with numbers. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
+ */
+/datum/song/proc/compile_synthesized()
if(!length(src.lines))
return
var/list/lines = src.lines //cache for hyepr speed!
@@ -57,10 +37,12 @@
compiled_chord += tempodiv //this goes last
if(length(compiled_chord))
compiled_chords[++compiled_chords.len] = compiled_chord
- CHECK_TICK
- return compiled_chords
-/datum/song/proc/playkey_synth(key)
+/**
+ * Plays a specific numerical key from our instrument to anyone who can hear us.
+ * Does a hearing check if enough time has passed.
+ */
+/datum/song/proc/playkey_synth(key, mob/user)
if(can_noteshift)
key = clamp(key + note_shift, key_min, key_max)
if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
@@ -83,6 +65,9 @@
M.playsound_local(get_turf(parent), null, volume, FALSE, K.frequency, INSTRUMENT_DISTANCE_NO_FALLOFF, channel, null, copy, distance_multiplier = INSTRUMENT_DISTANCE_FALLOFF_BUFF)
// Could do environment and echo later but not for now
+/**
+ * Stops all sounds we are "responsible" for. Only works in synthesized mode.
+ */
/datum/song/proc/terminate_all_sounds(clear_channels = TRUE)
for(var/i in hearing_mobs)
terminate_sound_mob(i)
@@ -93,10 +78,16 @@
using_sound_channels = 0
SSsounds.free_datum_channels(src)
+/**
+ * Stops all sounds we are responsible for in a given person. Only works in synthesized mode.
+ */
/datum/song/proc/terminate_sound_mob(mob/M)
for(var/channel in channels_playing)
M.stop_sound_channel(text2num(channel))
+/**
+ * Pops a channel we have reserved so we don't have to release and re-request them from SSsounds every time we play a note. This is faster.
+ */
/datum/song/proc/pop_channel()
if(length(channels_idle)) //just pop one off of here if we have one available
. = text2num(channels_idle[1])
@@ -108,6 +99,12 @@
if(!isnull(.))
using_sound_channels++
+/**
+ * Decays our channels and updates their volumes to mobs who can hear us.
+ *
+ * Arguments:
+ * * wait_ds - the deciseconds we should decay by. This is to compensate for any lag, as otherwise songs would get pretty nasty during high time dilation.
+ */
/datum/song/proc/process_decay(wait_ds)
var/linear_dropoff = cached_linear_dropoff * wait_ds
var/exponential_dropoff = cached_exponential_dropoff ** wait_ds
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index c31008fa62..c17b62ba6c 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -35,18 +35,20 @@
return destinations
-/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
+/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent, force_entry = FALSE)
if(!turf_check(user))
return
var/list/L = get_destinations(user)
if(!L.len)
- to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
+ to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.")
return
var/chosen_beacon = pick(L)
- var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon))
+ var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), 100, null, FALSE, get_turf(chosen_beacon))
if(adjacent)
try_move_adjacent(J)
+ if(force_entry)
+ J.teleport(user, force = TRUE)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
@@ -73,7 +75,7 @@
if(user.get_item_by_slot(SLOT_BELT) == src)
to_chat(user, "Your [name] activates, saving you from the chasm!")
SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation
- activate(user, FALSE)
+ activate(user, FALSE, TRUE)
else
to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
@@ -84,9 +86,10 @@
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
mech_sized = TRUE //save your ripley
+ teleport_channel = TELEPORT_CHANNEL_WORMHOLE
innate_accuracy_penalty = 6
-/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
+/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M, force = FALSE)
. = ..()
if(.)
// KERPLUNK
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm
index 899bf91081..d1f7f15ac9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm
@@ -14,14 +14,14 @@
name = "Standard"
icon_state = "standard"
-/datum/sprite_accessory/xeno_dorsal/royal
- name = "Royal"
- icon_state = "royal"
-
/datum/sprite_accessory/xeno_dorsal/down
name = "Dorsal Down"
icon_state = "down"
+/datum/sprite_accessory/xeno_dorsal/royal
+ name = "Royal"
+ icon_state = "royal"
+
/******************************************
************* Xeno Tails ******************
*******************************************/
@@ -57,14 +57,14 @@
name = "Standard"
icon_state = "standard"
-/datum/sprite_accessory/xeno_head/royal
- name = "royal"
- icon_state = "royal"
-
/datum/sprite_accessory/xeno_head/hollywood
name = "hollywood"
icon_state = "hollywood"
+/datum/sprite_accessory/xeno_head/royal
+ name = "royal"
+ icon_state = "royal"
+
/datum/sprite_accessory/xeno_head/warrior
name = "warrior"
icon_state = "warrior"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index a04838a360..5286acb33a 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -16,6 +16,12 @@
icon_state = "dtiger"
gender_specific = 1
+/datum/sprite_accessory/body_markings/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+
/datum/sprite_accessory/body_markings/ltiger
name = "Light Tiger Body"
icon_state = "ltiger"
@@ -49,11 +55,6 @@
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
relevant_layers = null
-/datum/sprite_accessory/mam_body_markings/plain
- name = "Plain"
- icon_state = "plain"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
icon_state = "redpanda"
@@ -77,14 +78,14 @@
icon_state = "bellyslim"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-/datum/sprite_accessory/mam_body_markings/corgi
- name = "Corgi"
- icon_state = "corgi"
-
/datum/sprite_accessory/mam_body_markings/cow
name = "Bovine"
icon_state = "bovine"
+/datum/sprite_accessory/mam_body_markings/corgi
+ name = "Corgi"
+ icon_state = "corgi"
+
/datum/sprite_accessory/mam_body_markings/corvid
name = "Corvid"
icon_state = "corvid"
@@ -139,15 +140,19 @@
name = "Hyena"
icon_state = "hyena"
-/datum/sprite_accessory/mam_body_markings/lab
- name = "Lab"
- icon_state = "lab"
-
/datum/sprite_accessory/mam_body_markings/insect
name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+/datum/sprite_accessory/mam_body_markings/lab
+ name = "Lab"
+ icon_state = "lab"
+
+/datum/sprite_accessory/mam_body_markings/orca
+ name = "Orca"
+ icon_state = "orca"
+
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
icon_state = "otie"
@@ -156,14 +161,15 @@
name = "Otter"
icon_state = "otter"
-/datum/sprite_accessory/mam_body_markings/orca
- name = "Orca"
- icon_state = "orca"
-
/datum/sprite_accessory/mam_body_markings/panther
name = "Panther"
icon_state = "panther"
+/datum/sprite_accessory/mam_body_markings/plain
+ name = "Plain"
+ icon_state = "plain"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+
/datum/sprite_accessory/mam_body_markings/possum
name = "Possum"
icon_state = "possum"
@@ -172,6 +178,10 @@
name = "Raccoon"
icon_state = "raccoon"
+/datum/sprite_accessory/mam_body_markings/sergal
+ name = "Sergal"
+ icon_state = "sergal"
+
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
@@ -181,18 +191,14 @@
name = "Shark"
icon_state = "shark"
-/datum/sprite_accessory/mam_body_markings/skunk
- name = "Skunk"
- icon_state = "skunk"
-
-/datum/sprite_accessory/mam_body_markings/sergal
- name = "Sergal"
- icon_state = "sergal"
-
/datum/sprite_accessory/mam_body_markings/shepherd
name = "Shepherd"
icon_state = "shepherd"
+/datum/sprite_accessory/mam_body_markings/skunk
+ name = "Skunk"
+ icon_state = "skunk"
+
/datum/sprite_accessory/mam_body_markings/tajaran
name = "Tajaran"
icon_state = "tajaran"
@@ -232,75 +238,10 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/insect_fluff/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/insect_fluff/reddish
- name = "Reddish"
- icon_state = "redish"
-
-/datum/sprite_accessory/insect_fluff/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/insect_fluff/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/insect_fluff/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/insect_fluff/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
/datum/sprite_accessory/insect_fluff/punished
name = "Burnt Off"
icon_state = "punished"
-/datum/sprite_accessory/insect_fluff/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/insect_fluff/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/insect_fluff/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/insect_fluff/ragged
- name = "Ragged"
- icon_state = "ragged"
-
-/datum/sprite_accessory/insect_fluff/moonfly
- name = "Moon Fly"
- icon_state = "moonfly"
-
-/datum/sprite_accessory/insect_fluff/snow
- name = "Snow"
- icon_state = "snow"
-
-/datum/sprite_accessory/insect_fluff/oakworm
- name = "Oak Worm"
- icon_state = "oakworm"
-
-/datum/sprite_accessory/insect_fluff/jungle
- name = "Jungle"
- icon_state = "jungle"
-
-/datum/sprite_accessory/insect_fluff/witchwing
- name = "Witch Wing"
- icon_state = "witchwing"
-
-/datum/sprite_accessory/insect_fluff/colored
- name = "Colored (Hair)"
- icon_state = "snow"
- color_src = HAIR
-
/datum/sprite_accessory/insect_fluff/colored1
name = "Colored (Primary)"
icon_state = "snow"
@@ -314,4 +255,69 @@
/datum/sprite_accessory/insect_fluff/colored3
name = "Colored (Tertiary)"
icon_state = "snow"
- color_src = MUTCOLORS3
\ No newline at end of file
+ color_src = MUTCOLORS3
+
+/datum/sprite_accessory/insect_fluff/colored
+ name = "Colored (Hair)"
+ icon_state = "snow"
+ color_src = HAIR
+
+/datum/sprite_accessory/insect_fluff/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/insect_fluff/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/insect_fluff/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/insect_fluff/jungle
+ name = "Jungle"
+ icon_state = "jungle"
+
+/datum/sprite_accessory/insect_fluff/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/insect_fluff/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/insect_fluff/oakworm
+ name = "Oak Worm"
+ icon_state = "oakworm"
+
+/datum/sprite_accessory/insect_fluff/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/insect_fluff/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/insect_fluff/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/insect_fluff/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/insect_fluff/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/insect_fluff/snow
+ name = "Snow"
+ icon_state = "snow"
+
+/datum/sprite_accessory/insect_fluff/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
+
+/datum/sprite_accessory/insect_fluff/witchwing
+ name = "Witch Wing"
+ icon_state = "witchwing"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 1e6c797364..7515ce560a 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -41,7 +41,7 @@
extra = TRUE
extra_color_src = NONE
-/datum/sprite_accessory/ears/human/bigwolfdark
+/datum/sprite_accessory/ears/human/bigwolfdark //ignore alphabetical sort here for ease-of-use
name = "Dark Big Wolf"
icon_state = "bigwolfdark"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
@@ -55,6 +55,12 @@
extra = TRUE
extra_color_src = NONE
+/datum/sprite_accessory/ears/bunny
+ name = "Bunny"
+ icon_state = "bunny"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+
/datum/sprite_accessory/ears/cat
name = "Cat"
icon_state = "cat"
@@ -74,6 +80,12 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MUTCOLORS3
+/datum/sprite_accessory/ears/lab
+ name = "Dog, Floppy"
+ icon_state = "lab"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+
/datum/sprite_accessory/ears/human/eevee
name = "Eevee"
icon_state = "eevee"
@@ -115,12 +127,6 @@
icon_state = "jellyfish"
color_src = HAIR
-/datum/sprite_accessory/ears/lab
- name = "Dog, Floppy"
- icon_state = "lab"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
@@ -133,18 +139,18 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-/datum/sprite_accessory/ears/human/pede
- name = "Scolipede"
- icon_state = "pede"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+/datum/sprite_accessory/ears/human/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
+
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -169,12 +175,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-/datum/sprite_accessory/ears/bunny
- name = "Bunny"
- icon_state = "bunny"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
/******************************************
*************** Furry Ears ****************
*******************************************/
@@ -216,7 +216,7 @@
extra = TRUE
extra_color_src = NONE
-/datum/sprite_accessory/ears/mam_ears/bigwolfdark
+/datum/sprite_accessory/ears/mam_ears/bigwolfdark //alphabetical sort ignored here for ease-of-use
name = "Dark Big Wolf"
icon_state = "bigwolfdark"
@@ -226,6 +226,10 @@
extra = TRUE
extra_color_src = NONE
+/datum/sprite_accessory/ears/mam_ears/bunny
+ name = "Bunny"
+ icon_state = "bunny"
+
/datum/sprite_accessory/ears/mam_ears/cat
name = "Cat"
icon_state = "cat"
@@ -256,13 +260,11 @@
name = "Eevee"
icon_state = "eevee"
-
/datum/sprite_accessory/ears/mam_ears/elf
name = "Elf"
icon_state = "elf"
color_src = MUTCOLORS3
-
/datum/sprite_accessory/ears/mam_ears/elephant
name = "Elephant"
icon_state = "elephant"
@@ -283,15 +285,15 @@
name = "Husky"
icon_state = "wolf"
-/datum/sprite_accessory/ears/mam_ears/kangaroo
- name = "kangaroo"
- icon_state = "kangaroo"
-
/datum/sprite_accessory/ears/mam_ears/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
+/datum/sprite_accessory/ears/mam_ears/kangaroo
+ name = "kangaroo"
+ icon_state = "kangaroo"
+
/datum/sprite_accessory/ears/mam_ears/lab
name = "Dog, Long"
icon_state = "lab"
@@ -304,18 +306,14 @@
name = "Otusian"
icon_state = "otie"
-/datum/sprite_accessory/ears/mam_ears/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
+/datum/sprite_accessory/ears/mam_ears/rabbit
+ name = "Rabbit"
+ icon_state = "rabbit"
/datum/sprite_accessory/ears/mam_ears/pede
name = "Scolipede"
icon_state = "pede"
-/datum/sprite_accessory/ears/mam_ears/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
-
/datum/sprite_accessory/ears/mam_ears/sergal
name = "Sergal"
icon_state = "sergal"
@@ -324,10 +322,10 @@
name = "skunk"
icon_state = "skunk"
+/datum/sprite_accessory/ears/mam_ears/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+
/datum/sprite_accessory/ears/mam_ears/wolf
name = "Wolf"
icon_state = "wolf"
-
-/datum/sprite_accessory/ears/mam_ears/bunny
- name = "Bunny"
- icon_state = "bunny"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
index 18a76df116..49013161a9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
@@ -11,6 +11,10 @@
icon_state = "none"
relevant_layers = null
+/datum/sprite_accessory/frills/aquatic
+ name = "Aquatic"
+ icon_state = "aqua"
+
/datum/sprite_accessory/frills/simple
name = "Simple"
icon_state = "simple"
@@ -18,7 +22,3 @@
/datum/sprite_accessory/frills/short
name = "Short"
icon_state = "short"
-
-/datum/sprite_accessory/frills/aquatic
- name = "Aquatic"
- icon_state = "aqua"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
index 34988f5656..a07fdaa5d3 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
@@ -6,6 +6,10 @@
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
// please make sure they're sorted alphabetically and categorized
+/datum/sprite_accessory/facial_hair/shaved //this is exempt from the alphabetical sort
+ name = "Shaved"
+ icon_state = null
+ gender = NEUTER
/datum/sprite_accessory/facial_hair/threeoclock
name = "Beard (3 o\'Clock)"
@@ -135,11 +139,6 @@
name = "Mutton Chops with Moustache"
icon_state = "facial_muttonmus"
-/datum/sprite_accessory/facial_hair/shaved
- name = "Shaved"
- icon_state = null
- gender = NEUTER
-
/datum/sprite_accessory/facial_hair/sideburn
name = "Sideburns"
icon_state = "facial_sideburns"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index 138704067d..8e4e6ad617 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -9,6 +9,10 @@
// try to spell
// you do not need to define _s or _l sub-states, game automatically does this for you
+/datum/sprite_accessory/hair/bald //this is exempt from the alphabetical sort
+ name = "Bald"
+ icon_state = "bald"
+
/datum/sprite_accessory/hair/afro
name = "Afro"
icon_state = "hair_afro"
@@ -25,10 +29,6 @@
name = "Ahoge"
icon_state = "hair_antenna"
-/datum/sprite_accessory/hair/bald
- name = "Bald"
- icon_state = "bald"
-
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
index 3a65eaebfa..aff342c7a6 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
@@ -12,22 +12,10 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/horns/simple
- name = "Simple"
- icon_state = "simple"
-
-/datum/sprite_accessory/horns/short
- name = "Short"
- icon_state = "short"
-
/datum/sprite_accessory/horns/curled
name = "Curled"
icon_state = "curled"
-/datum/sprite_accessory/horns/ram
- name = "Ram"
- icon_state = "ram"
-
/datum/sprite_accessory/horns/angler
name = "Angeler"
icon_state = "angler"
@@ -40,3 +28,15 @@
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
icon_state = "guilmon"
+
+/datum/sprite_accessory/horns/ram
+ name = "Ram"
+ icon_state = "ram"
+
+/datum/sprite_accessory/horns/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/horns/short
+ name = "Short"
+ icon_state = "short"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
index 110ac69201..6019245b80 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
@@ -11,96 +11,90 @@
name = "Blank"
icon_state = "blank"
-/datum/sprite_accessory/screen/pink
- name = "Pink"
- icon_state = "pink"
-
-/datum/sprite_accessory/screen/green
- name = "Green"
- icon_state = "green"
-
-/datum/sprite_accessory/screen/red
- name = "Red"
- icon_state = "red"
-
/datum/sprite_accessory/screen/blue
name = "Blue"
icon_state = "blue"
-/datum/sprite_accessory/screen/yellow
- name = "Yellow"
- icon_state = "yellow"
-
-/datum/sprite_accessory/screen/shower
- name = "Shower"
- icon_state = "shower"
-
-/datum/sprite_accessory/screen/nature
- name = "Nature"
- icon_state = "nature"
-
-/datum/sprite_accessory/screen/eight
- name = "Eight"
- icon_state = "eight"
-
-/datum/sprite_accessory/screen/goggles
- name = "Goggles"
- icon_state = "goggles"
-
-/datum/sprite_accessory/screen/heart
- name = "Heart"
- icon_state = "heart"
-
-/datum/sprite_accessory/screen/monoeye
- name = "Mono eye"
- icon_state = "monoeye"
-
/datum/sprite_accessory/screen/breakout
name = "Breakout"
icon_state = "breakout"
-/datum/sprite_accessory/screen/purple
- name = "Purple"
- icon_state = "purple"
-
-/datum/sprite_accessory/screen/scroll
- name = "Scroll"
- icon_state = "scroll"
+/datum/sprite_accessory/screen/bsod
+ name = "BSOD"
+ icon_state = "bsod"
/datum/sprite_accessory/screen/console
name = "Console"
icon_state = "console"
-/datum/sprite_accessory/screen/rgb
- name = "RGB"
- icon_state = "rgb"
+/datum/sprite_accessory/screen/eight
+ name = "Eight"
+ icon_state = "eight"
+
+/datum/sprite_accessory/screen/eyes
+ name = "Eyes"
+ icon_state = "eyes"
+
+/datum/sprite_accessory/screen/ecgwave
+ name = "ECG wave"
+ icon_state = "ecgwave"
+
+/datum/sprite_accessory/screen/green
+ name = "Green"
+ icon_state = "green"
+
+/datum/sprite_accessory/screen/goggles
+ name = "Goggles"
+ icon_state = "goggles"
/datum/sprite_accessory/screen/golglider
name = "Gol Glider"
icon_state = "golglider"
+/datum/sprite_accessory/screen/heart
+ name = "Heart"
+ icon_state = "heart"
+
+/datum/sprite_accessory/screen/pink
+ name = "Pink"
+ icon_state = "pink"
+
+/datum/sprite_accessory/screen/red
+ name = "Red"
+ icon_state = "red"
+
+/datum/sprite_accessory/screen/monoeye
+ name = "Mono eye"
+ icon_state = "monoeye"
+
+/datum/sprite_accessory/screen/nature
+ name = "Nature"
+ icon_state = "nature"
+
+/datum/sprite_accessory/screen/purple
+ name = "Purple"
+ icon_state = "purple"
+
/datum/sprite_accessory/screen/rainbow
name = "Rainbow"
icon_state = "rainbow"
-/datum/sprite_accessory/screen/sunburst
- name = "Sunburst"
- icon_state = "sunburst"
-
-/datum/sprite_accessory/screen/static
- name = "Static"
- icon_state = "static"
-
-//Oracle Station sprites
-
-/datum/sprite_accessory/screen/bsod
- name = "BSOD"
- icon_state = "bsod"
-
/datum/sprite_accessory/screen/redtext
name = "Red Text"
icon_state = "retext"
+/datum/sprite_accessory/screen/rgb
+ name = "RGB"
+ icon_state = "rgb"
+
+/datum/sprite_accessory/screen/scroll
+ name = "Scroll"
+ icon_state = "scroll"
+
+/datum/sprite_accessory/screen/shower
+ name = "Shower"
+ icon_state = "shower"
+
/datum/sprite_accessory/screen/sinewave
name = "Sine wave"
icon_state = "sinewave"
@@ -109,22 +103,25 @@
name = "Square wave"
icon_state = "squarwave"
-/datum/sprite_accessory/screen/ecgwave
- name = "ECG wave"
- icon_state = "ecgwave"
+/datum/sprite_accessory/screen/stars
+ name = "Stars"
+ icon_state = "stars"
-/datum/sprite_accessory/screen/eyes
- name = "Eyes"
- icon_state = "eyes"
+/datum/sprite_accessory/screen/static
+ name = "Static"
+ icon_state = "static"
+
+/datum/sprite_accessory/screen/sunburst
+ name = "Sunburst"
+ icon_state = "sunburst"
/datum/sprite_accessory/screen/textdrop
name = "Text drop"
icon_state = "textdrop"
-/datum/sprite_accessory/screen/stars
- name = "Stars"
- icon_state = "stars"
-
+/datum/sprite_accessory/screen/yellow
+ name = "Yellow"
+ icon_state = "yellow"
/******************************************
************** IPC Antennas ***************
@@ -145,14 +142,6 @@
name = "Angled Antennae"
icon_state = "antennae"
-/datum/sprite_accessory/antenna/tvantennae
- name = "TV Antennae"
- icon_state = "tvantennae"
-
-/datum/sprite_accessory/antenna/cyberhead
- name = "Cyberhead"
- icon_state = "cyberhead"
-
/datum/sprite_accessory/antenna/antlers
name = "Antlers"
icon_state = "antlers"
@@ -160,3 +149,11 @@
/datum/sprite_accessory/antenna/crowned
name = "Crowned"
icon_state = "crowned"
+
+/datum/sprite_accessory/antenna/cyberhead
+ name = "Cyberhead"
+ icon_state = "cyberhead"
+
+/datum/sprite_accessory/antenna/tvantennae
+ name = "TV Antennae"
+ icon_state = "tvantennae"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
index d41f5ace22..6f7b955d8f 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
@@ -49,6 +49,13 @@
relevant_layers = null
hide_legs = FALSE
+/datum/sprite_accessory/taur/canine
+ name = "Canine"
+ icon_state = "canine"
+ taur_mode = STYLE_PAW_TAURIC
+ color_src = MUTCOLORS
+ extra = TRUE
+
/datum/sprite_accessory/taur/cow
name = "Cow"
icon_state = "cow"
@@ -95,6 +102,13 @@
color_src = MUTCOLORS
extra = TRUE
+/datum/sprite_accessory/taur/feline
+ name = "Feline"
+ icon_state = "feline"
+ taur_mode = STYLE_PAW_TAURIC
+ color_src = MUTCOLORS
+ extra = TRUE
+
/datum/sprite_accessory/taur/horse
name = "Horse"
icon_state = "horse"
@@ -126,17 +140,3 @@
taur_mode = STYLE_SNEK_TAURIC
color_src = MUTCOLORS
hide_legs = USE_SNEK_CLIP_MASK
-
-/datum/sprite_accessory/taur/canine
- name = "Canine"
- icon_state = "canine"
- taur_mode = STYLE_PAW_TAURIC
- color_src = MUTCOLORS
- extra = TRUE
-
-/datum/sprite_accessory/taur/feline
- name = "Feline"
- icon_state = "feline"
- taur_mode = STYLE_PAW_TAURIC
- color_src = MUTCOLORS
- extra = TRUE
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
index f514ef54db..99d2c67cc9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
@@ -7,14 +7,19 @@
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
-/datum/sprite_accessory/snouts/sharp
- name = "Sharp"
- icon_state = "sharp"
+/datum/sprite_accessory/snout/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
/datum/sprite_accessory/snouts/round
name = "Round"
icon_state = "round"
+/datum/sprite_accessory/snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+
/datum/sprite_accessory/snouts/sharplight
name = "Sharp + Light"
icon_state = "sharplight"
@@ -23,11 +28,6 @@
name = "Round + Light"
icon_state = "roundlight"
-/datum/sprite_accessory/snout/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
-
//christ this was a mistake, but it's here just in case someone wants to selectively fix -- Pooj
/************* Lizard compatable snoots ***********
/datum/sprite_accessory/snouts/bird
@@ -192,11 +192,19 @@
extra = TRUE
extra_color_src = MUTCOLORS3
-/datum/sprite_accessory/snouts/mam_snouts/skulldog
- name = "Skulldog"
- icon_state = "skulldog"
+/datum/sprite_accessory/snouts/mam_snouts/husky
+ name = "Husky"
+ icon_state = "husky"
+
+/datum/sprite_accessory/snouts/mam_snouts/rhino
+ name = "Horn"
+ icon_state = "rhino"
extra = TRUE
- extra_color_src = MATRIXED
+ extra = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/mam_snouts/rodent
+ name = "Rodent"
+ icon_state = "rodent"
/datum/sprite_accessory/snouts/mam_snouts/lcanid
name = "Mammal, Long"
@@ -226,32 +234,20 @@
name = "Mammal, Thick ALT"
icon_state = "wolfalt"
-/datum/sprite_accessory/snouts/mam_snouts/redpanda
- name = "WahCoon"
- icon_state = "wah"
-
-/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
- name = "WahCoon ALT"
- icon_state = "wahalt"
-
-/datum/sprite_accessory/snouts/mam_snouts/rhino
- name = "Horn"
- icon_state = "rhino"
- extra = TRUE
- extra = MUTCOLORS3
-
-/datum/sprite_accessory/snouts/mam_snouts/rodent
- name = "Rodent"
- icon_state = "rodent"
-
-/datum/sprite_accessory/snouts/mam_snouts/husky
- name = "Husky"
- icon_state = "husky"
-
/datum/sprite_accessory/snouts/mam_snouts/otie
name = "Otie"
icon_state = "otie"
+/datum/sprite_accessory/snouts/mam_snouts/round
+ name = "Round"
+ icon_state = "round"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/snouts/mam_snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
+ color_src = MUTCOLORS
+
/datum/sprite_accessory/snouts/mam_snouts/pede
name = "Scolipede"
icon_state = "pede"
@@ -268,30 +264,33 @@
name = "hShark"
icon_state = "hshark"
-/datum/sprite_accessory/snouts/mam_snouts/toucan
- name = "Toucan"
- icon_state = "toucan"
-
/datum/sprite_accessory/snouts/mam_snouts/sharp
name = "Sharp"
icon_state = "sharp"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/round
- name = "Round"
- icon_state = "round"
- color_src = MUTCOLORS
-
/datum/sprite_accessory/snouts/mam_snouts/sharplight
name = "Sharp + Light"
icon_state = "sharplight"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/roundlight
- name = "Round + Light"
- icon_state = "roundlight"
- color_src = MUTCOLORS
+/datum/sprite_accessory/snouts/mam_snouts/skulldog
+ name = "Skulldog"
+ icon_state = "skulldog"
+ extra = TRUE
+ extra_color_src = MATRIXED
+/datum/sprite_accessory/snouts/mam_snouts/toucan
+ name = "Toucan"
+ icon_state = "toucan"
+
+/datum/sprite_accessory/snouts/mam_snouts/redpanda
+ name = "WahCoon"
+ icon_state = "wah"
+
+/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
+ name = "WahCoon ALT"
+ icon_state = "wahalt"
/******************************************
**************** Snouts *******************
@@ -318,6 +317,16 @@
extra = TRUE
extra_color_src = MUTCOLORS3
+/datum/sprite_accessory/snouts/mam_snouts/frhino
+ name = "Horn (Top)"
+ icon_state = "frhino"
+ extra = TRUE
+ extra = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/mam_snouts/fhusky
+ name = "Husky (Top)"
+ icon_state = "fhusky"
+
/datum/sprite_accessory/snouts/mam_snouts/flcanid
name = "Mammal, Long (Top)"
icon_state = "flcanid"
@@ -346,27 +355,23 @@
name = "Mammal, Thick ALT (Top)"
icon_state = "fwolfalt"
-/datum/sprite_accessory/snouts/mam_snouts/fredpanda
- name = "WahCoon (Top)"
- icon_state = "fwah"
-
-/datum/sprite_accessory/snouts/mam_snouts/frhino
- name = "Horn (Top)"
- icon_state = "frhino"
- extra = TRUE
- extra = MUTCOLORS3
+/datum/sprite_accessory/snouts/mam_snouts/fotie
+ name = "Otie (Top)"
+ icon_state = "fotie"
/datum/sprite_accessory/snouts/mam_snouts/frodent
name = "Rodent (Top)"
icon_state = "frodent"
-/datum/sprite_accessory/snouts/mam_snouts/fhusky
- name = "Husky (Top)"
- icon_state = "fhusky"
+/datum/sprite_accessory/snouts/mam_snouts/fround
+ name = "Round (Top)"
+ icon_state = "fround"
+ color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/fotie
- name = "Otie (Top)"
- icon_state = "fotie"
+/datum/sprite_accessory/snouts/mam_snouts/froundlight
+ name = "Round + Light (Top)"
+ icon_state = "froundlight"
+ color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/fpede
name = "Scolipede (Top)"
@@ -380,26 +385,20 @@
name = "Shark (Top)"
icon_state = "fshark"
-/datum/sprite_accessory/snouts/mam_snouts/ftoucan
- name = "Toucan (Top)"
- icon_state = "ftoucan"
-
/datum/sprite_accessory/snouts/mam_snouts/fsharp
name = "Sharp (Top)"
icon_state = "fsharp"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/fround
- name = "Round (Top)"
- icon_state = "fround"
- color_src = MUTCOLORS
-
/datum/sprite_accessory/snouts/mam_snouts/fsharplight
name = "Sharp + Light (Top)"
icon_state = "fsharplight"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/froundlight
- name = "Round + Light (Top)"
- icon_state = "froundlight"
- color_src = MUTCOLORS
+/datum/sprite_accessory/snouts/mam_snouts/ftoucan
+ name = "Toucan (Top)"
+ icon_state = "ftoucan"
+
+/datum/sprite_accessory/snouts/mam_snouts/fredpanda
+ name = "WahCoon (Top)"
+ icon_state = "fwah"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
index 19ec677a72..ffb808eede 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
@@ -20,6 +20,10 @@
name = "Knee-high - Bee"
icon_state = "bee_knee"
+/datum/sprite_accessory/underwear/socks/christmas_knee
+ name = "Knee-High - Christmas"
+ icon_state = "christmas_knee"
+
/datum/sprite_accessory/underwear/socks/commie_knee
name = "Knee-High - Commie"
icon_state = "commie_knee"
@@ -32,6 +36,14 @@
name = "Knee-high - Rainbow"
icon_state = "rainbow_knee"
+/datum/sprite_accessory/underwear/socks/candycaner_knee
+ name = "Knee-High - Red Candy Cane"
+ icon_state = "candycaner_knee"
+
+/datum/sprite_accessory/underwear/socks/candycaneg_knee //ignore alphabetisation for ease of use in scenarios like this
+ name = "Knee-High - Green Candy Cane"
+ icon_state = "candycaneg_knee"
+
/datum/sprite_accessory/underwear/socks/striped_knee
name = "Knee-high - Striped"
icon_state = "striped_knee"
@@ -46,18 +58,6 @@
name = "Knee-High - UK"
icon_state = "uk_knee"
-/datum/sprite_accessory/underwear/socks/christmas_knee
- name = "Knee-High - Christmas"
- icon_state = "christmas_knee"
-
-/datum/sprite_accessory/underwear/socks/candycaner_knee
- name = "Knee-High - Red Candy Cane"
- icon_state = "candycaner_knee"
-
-/datum/sprite_accessory/underwear/socks/candycaneg_knee
- name = "Knee-High - Green Candy Cane"
- icon_state = "candycaneg_knee"
-
/datum/sprite_accessory/underwear/socks/socks_norm
name = "Normal"
icon_state = "socks_norm"
@@ -129,22 +129,34 @@
name = "Thigh-high - Bee"
icon_state = "bee_thigh"
+/datum/sprite_accessory/underwear/socks/christmas_thigh
+ name = "Thigh-high - Christmas"
+ icon_state = "christmas_thigh"
+
/datum/sprite_accessory/underwear/socks/commie_thigh
name = "Thigh-high - Commie"
icon_state = "commie_thigh"
-/datum/sprite_accessory/underwear/socks/usa_thigh
- name = "Thigh-high - Freedom"
- icon_state = "assblastusa_thigh"
-
/datum/sprite_accessory/underwear/socks/fishnet
name = "Thigh-high - Fishnet"
icon_state = "fishnet"
+/datum/sprite_accessory/underwear/socks/usa_thigh
+ name = "Thigh-high - Freedom"
+ icon_state = "assblastusa_thigh"
+
/datum/sprite_accessory/underwear/socks/rainbow_thigh
name = "Thigh-high - Rainbow"
icon_state = "rainbow_thigh"
+/datum/sprite_accessory/underwear/socks/candycaner_thigh
+ name = "Thigh-high - Red Candy Cane"
+ icon_state = "candycaner_thigh"
+
+/datum/sprite_accessory/underwear/socks/candycaneg_thigh
+ name = "Thigh-high - Green Candy Cane"
+ icon_state = "candycaneg_thigh"
+
/datum/sprite_accessory/underwear/socks/striped_thigh
name = "Thigh-high - Striped"
icon_state = "striped_thigh"
@@ -157,16 +169,4 @@
/datum/sprite_accessory/underwear/socks/uk_thigh
name = "Thigh-high - UK"
- icon_state = "uk_thigh"
-
-/datum/sprite_accessory/underwear/socks/christmas_thigh
- name = "Thigh-high - Christmas"
- icon_state = "christmas_thigh"
-
-/datum/sprite_accessory/underwear/socks/candycaner_thigh
- name = "Thigh-high - Red Candy Cane"
- icon_state = "candycaner_thigh"
-
-/datum/sprite_accessory/underwear/socks/candycaneg_thigh
- name = "Thigh-high - Green Candy Cane"
- icon_state = "candycaneg_thigh"
\ No newline at end of file
+ icon_state = "uk_thigh"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
index 83415ed375..5d7207c934 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
@@ -21,21 +21,13 @@
name = "None"
icon_state = "none"
-/datum/sprite_accessory/spines/short
- name = "Short"
- icon_state = "short"
+/datum/sprite_accessory/spines/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
-/datum/sprite_accessory/spines_animated/short
- name = "Short"
- icon_state = "short"
-
-/datum/sprite_accessory/spines/shortmeme
- name = "Short + Membrane"
- icon_state = "shortmeme"
-
-/datum/sprite_accessory/spines_animated/shortmeme
- name = "Short + Membrane"
- icon_state = "shortmeme"
+/datum/sprite_accessory/spines_animated/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
/datum/sprite_accessory/spines/long
name = "Long"
@@ -53,10 +45,18 @@
name = "Long + Membrane"
icon_state = "longmeme"
-/datum/sprite_accessory/spines/aqautic
- name = "Aquatic"
- icon_state = "aqua"
+/datum/sprite_accessory/spines/short
+ name = "Short"
+ icon_state = "short"
-/datum/sprite_accessory/spines_animated/aqautic
- name = "Aquatic"
- icon_state = "aqua"
+/datum/sprite_accessory/spines_animated/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines_animated/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
index 16531d8f06..9addd15dca 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
@@ -25,12 +25,6 @@
icon_state = "synthliz_tertunder"
//Synth body markings
-/datum/sprite_accessory/mam_body_markings/synthliz
- recommended_species = list("synthliz")
- icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
- name = "Synthetic Lizard - Plates"
- icon_state = "synthlizscutes"
-
/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecs
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Pecs"
@@ -41,6 +35,12 @@
name = "Synthetic Lizard - Pecs Light"
icon_state = "synthlizpecslight"
+/datum/sprite_accessory/mam_body_markings/synthliz
+ recommended_species = list("synthliz")
+ icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
+ name = "Synthetic Lizard - Plates"
+ icon_state = "synthlizscutes"
+
//Synth tails
/datum/sprite_accessory/tails/mam_tails/synthliz
recommended_species = list("synthliz")
@@ -70,17 +70,17 @@
name = "Synthetic Lizard - Curled"
icon_state = "synth_curled"
-/datum/sprite_accessory/antenna/synthliz/synthliz_thick
+/datum/sprite_accessory/antenna/synthliz/synth_horns
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MUTCOLORS
- name = "Synthetic Lizard - Thick"
- icon_state = "synth_thick"
+ name = "Synthetic Lizard - Horns"
+ icon_state = "synth_horns"
-/datum/sprite_accessory/antenna/synthliz/synth_thicklight
+/datum/sprite_accessory/antenna/synthliz/synth_hornslight
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MATRIXED
- name = "Synthetic Lizard - Thick Light"
- icon_state = "synth_thicklight"
+ name = "Synthetic Lizard - Horns Light"
+ icon_state = "synth_hornslight"
/datum/sprite_accessory/antenna/synthliz/synth_short
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
@@ -100,17 +100,17 @@
name = "Synthetic Lizard - Sharp Light"
icon_state = "synth_sharplight"
-/datum/sprite_accessory/antenna/synthliz/synth_horns
+/datum/sprite_accessory/antenna/synthliz/synthliz_thick
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MUTCOLORS
- name = "Synthetic Lizard - Horns"
- icon_state = "synth_horns"
+ name = "Synthetic Lizard - Thick"
+ icon_state = "synth_thick"
-/datum/sprite_accessory/antenna/synthliz/synth_hornslight
+/datum/sprite_accessory/antenna/synthliz/synth_thicklight
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MATRIXED
- name = "Synthetic Lizard - Horns Light"
- icon_state = "synth_hornslight"
+ name = "Synthetic Lizard - Thick Light"
+ icon_state = "synth_thicklight"
//Synth Taurs (Ported from Virgo)
/datum/sprite_accessory/taur/synthliz
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 812e0c052c..d9e2de1525 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -18,38 +18,7 @@
/datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"])
-/datum/sprite_accessory/tails/lizard/smooth
- name = "Smooth"
- icon_state = "smooth"
-
-/datum/sprite_accessory/tails_animated/lizard/smooth
- name = "Smooth"
- icon_state = "smooth"
-
-/datum/sprite_accessory/tails/lizard/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails_animated/lizard/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails/lizard/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails_animated/lizard/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails/lizard/spikes
- name = "Spikes"
- icon_state = "spikes"
-
-/datum/sprite_accessory/tails_animated/lizard/spikes
- name = "Spikes"
- icon_state = "spikes"
-
+//this goes first regardless of alphabetical order
/datum/sprite_accessory/tails/lizard/none
name = "None"
icon_state = "None"
@@ -72,11 +41,13 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/body_markings/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+/datum/sprite_accessory/tails/lizard/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails_animated/lizard/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
/datum/sprite_accessory/tails/lizard/guilmon
name = "Guilmon"
@@ -90,6 +61,30 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/lizard/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/lizard/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails/lizard/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails_animated/lizard/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails/lizard/spikes
+ name = "Spikes"
+ icon_state = "spikes"
+
+/datum/sprite_accessory/tails_animated/lizard/spikes
+ name = "Spikes"
+ icon_state = "spikes"
+
/******************************************
************** Human Tails ****************
*******************************************/
@@ -107,18 +102,6 @@
/datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"])
-/datum/sprite_accessory/tails/human/ailurus
- name = "Red Panda"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/ailurus
- name = "Red Panda"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -199,6 +182,14 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/tails/human/corvid
+ name = "Corvid"
+ icon_state = "crow"
+
+/datum/sprite_accessory/tails_animated/human/corvid
+ name = "Corvid"
+ icon_state = "crow"
+
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -211,13 +202,25 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-/datum/sprite_accessory/tails/human/corvid
- name = "Corvid"
- icon_state = "crow"
+/datum/sprite_accessory/tails/human/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
-/datum/sprite_accessory/tails_animated/human/corvid
- name = "Corvid"
- icon_state = "crow"
+/datum/sprite_accessory/tails_animated/human/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails/human/datashark
+ name = "datashark"
+ icon_state = "datashark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/human/datashark
+ name = "datashark"
+ icon_state = "datashark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
@@ -298,7 +301,7 @@
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/insect
- name = "insect"
+ name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
@@ -315,6 +318,14 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/human/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/human/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -327,18 +338,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
/datum/sprite_accessory/tails/orca
name = "Orca"
icon_state = "orca"
@@ -351,15 +350,15 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails/human/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails/human/otie
+ name = "Otusian"
+ icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails_animated/human/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails_animated/human/otie
+ name = "Otusian"
+ icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
@@ -375,6 +374,30 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/human/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/tails_animated/human/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/tails/human/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/human/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -387,6 +410,18 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/human/shark
+ name = "Shark"
+ icon_state = "shark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/human/shark
+ name = "Shark"
+ icon_state = "shark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -415,30 +450,6 @@
name = "Spikes"
icon_state = "spikes"
-/datum/sprite_accessory/tails/human/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/datashark
- name = "datashark"
- icon_state = "datashark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/datashark
- name = "datashark"
- icon_state = "datashark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
/datum/sprite_accessory/tails/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
@@ -495,22 +506,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails/human/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails_animated/human/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails/human/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails_animated/human/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
@@ -554,16 +549,6 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/tails/mam_tails/ailurus
- name = "Red Panda"
- icon_state = "wah"
- extra = TRUE
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
- name = "Red Panda"
- icon_state = "wah"
- extra = TRUE
-
/datum/sprite_accessory/tails/mam_tails/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -638,6 +623,18 @@
name = "Cow"
icon_state = "cow"
+/datum/sprite_accessory/tails/mam_tails/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
/datum/sprite_accessory/tails/mam_tails/eevee
name = "Eevee"
icon_state = "eevee"
@@ -728,6 +725,18 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Lab"
icon_state = "lab"
+/datum/sprite_accessory/tails/mam_tails/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
/datum/sprite_accessory/tails/mam_tails/murid
name = "Murid"
icon_state = "murid"
@@ -736,14 +745,6 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Murid"
icon_state = "murid"
-/datum/sprite_accessory/tails/mam_tails/otie
- name = "Otusian"
- icon_state = "otie"
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
- name = "Otusian"
- icon_state = "otie"
-
/datum/sprite_accessory/tails/mam_tails/orca
name = "Orca"
icon_state = "orca"
@@ -752,13 +753,13 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Orca"
icon_state = "orca"
-/datum/sprite_accessory/tails/mam_tails/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails/mam_tails/otie
+ name = "Otusian"
+ icon_state = "otie"
-/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
+ name = "Otusian"
+ icon_state = "otie"
/datum/sprite_accessory/tails/mam_tails/rabbit
name = "Rabbit"
@@ -768,6 +769,24 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Rabbit"
icon_state = "rabbit"
+/datum/sprite_accessory/tails/mam_tails/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ extra = TRUE
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ extra = TRUE
+
+/datum/sprite_accessory/tails/mam_tails/pede
+ name = "Scolipede"
+ icon_state = "pede"
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
+ name = "Scolipede"
+ icon_state = "pede"
+
/datum/sprite_accessory/tails/mam_tails/sergal
name = "Sergal"
icon_state = "sergal"
@@ -776,6 +795,22 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Sergal"
icon_state = "sergal"
+/datum/sprite_accessory/tails/mam_tails/shark
+ name = "Shark"
+ icon_state = "shark"
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
+ name = "Shark"
+ icon_state = "shark"
+
+/datum/sprite_accessory/tails/mam_tails/shepherd
+ name = "Shepherd"
+ icon_state = "shepherd"
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
+ name = "Shepherd"
+ icon_state = "shepherd"
+
/datum/sprite_accessory/tails/mam_tails/skunk
name = "Skunk"
icon_state = "skunk"
@@ -808,22 +843,6 @@ datum/sprite_accessory/tails/mam_tails/insect
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
-/datum/sprite_accessory/tails/mam_tails/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/tails/mam_tails/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
/datum/sprite_accessory/tails/mam_tails/straighttail
name = "Straight Tail"
icon_state = "straighttail"
@@ -864,30 +883,6 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Tiger"
icon_state = "tiger"
-/datum/sprite_accessory/tails/mam_tails/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails/mam_tails/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
/datum/sprite_accessory/tails/mam_tails/wolf
name = "Wolf"
icon_state = "wolf"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
index b8282931d2..1be02c207e 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
@@ -12,6 +12,38 @@
// please make sure they're sorted alphabetically and categorized
+/datum/sprite_accessory/underwear/top/cowboyshirt
+ name = "Cowboy Shirt Black"
+ icon_state = "cowboyshirt"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/red
+ name = "Cowboy Shirt Red"
+ icon_state = "cowboyshirt_red"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/navy
+ name = "Cowboy Shirt Navy"
+ icon_state = "cowboyshirt_navy"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/white
+ name = "Cowboy Shirt White"
+ icon_state = "cowboyshirt_white"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/s
+ name = "Cowboy Shirt Shortsleeved Black"
+ icon_state = "cowboyshirt_s"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/red/s
+ name = "Cowboy Shirt Shortsleeved Red"
+ icon_state = "cowboyshirt_reds"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s
+ name = "Cowboy Shirt Shortsleeved Navy"
+ icon_state = "cowboyshirt_navys"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/white/s
+ name = "Cowboy Shirt Shortsleeved White"
+ icon_state = "cowboyshirt_whites"
+
/datum/sprite_accessory/underwear/top/longjon
name = "Long John Shirt"
icon_state = "ljont"
@@ -30,36 +62,6 @@
icon_state = "undershirt"
has_color = TRUE
-/datum/sprite_accessory/underwear/top/bowlingw
- name = "Shirt - Bowling"
- icon_state = "bowlingw"
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/top/bowling
- name = "Shirt, Bowling - Red"
- icon_state = "bowling"
-
-/datum/sprite_accessory/underwear/top/bowlingp
- name = "Shirt, Bowling - Pink"
- icon_state = "bowlingp"
-
-/datum/sprite_accessory/underwear/top/bowlinga
- name = "Shirt, Bowling - Aqua"
- icon_state = "bowlinga"
-
-/datum/sprite_accessory/underwear/top/bluejersey
- name = "Shirt, Jersey - Blue"
- icon_state = "shirt_bluejersey"
-
-/datum/sprite_accessory/underwear/top/redjersey
- name = "Shirt, Jersey - Red"
- icon_state = "shirt_redjersey"
-
-/datum/sprite_accessory/underwear/top/polo
- name = "Shirt - Polo"
- icon_state = "polo"
- has_color = TRUE
-
/datum/sprite_accessory/underwear/top/alienshirt
name = "Shirt - Alien"
icon_state = "shirt_alien"
@@ -72,6 +74,23 @@
name = "Shirt - Bee"
icon_state = "bee_shirt"
+/datum/sprite_accessory/underwear/top/bowlingw
+ name = "Shirt - Bowling"
+ icon_state = "bowlingw"
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/top/bowlinga
+ name = "Shirt, Bowling - Aqua"
+ icon_state = "bowlinga"
+
+/datum/sprite_accessory/underwear/top/bowling
+ name = "Shirt, Bowling - Red"
+ icon_state = "bowling"
+
+/datum/sprite_accessory/underwear/top/bowlingp
+ name = "Shirt, Bowling - Pink"
+ icon_state = "bowlingp"
+
/datum/sprite_accessory/underwear/top/clownshirt
name = "Shirt - Clown"
icon_state = "shirt_clown"
@@ -88,6 +107,14 @@
name = "Shirt - I Love NT"
icon_state = "ilovent"
+/datum/sprite_accessory/underwear/top/bluejersey
+ name = "Shirt, Jersey - Blue"
+ icon_state = "shirt_bluejersey"
+
+/datum/sprite_accessory/underwear/top/redjersey
+ name = "Shirt, Jersey - Red"
+ icon_state = "shirt_redjersey"
+
/datum/sprite_accessory/underwear/top/lover
name = "Shirt - Lover"
icon_state = "lover"
@@ -112,6 +139,11 @@
name = "Shirt - Pogoman"
icon_state = "pogoman"
+/datum/sprite_accessory/underwear/top/polo
+ name = "Shirt - Polo"
+ icon_state = "polo"
+ has_color = TRUE
+
/datum/sprite_accessory/underwear/top/question
name = "Shirt - Question"
icon_state = "shirt_question"
@@ -120,6 +152,23 @@
name = "Shirt - Skull"
icon_state = "shirt_skull"
+/datum/sprite_accessory/underwear/top/shortsleeve
+ name = "Shirt - Short Sleeved"
+ icon_state = "shortsleeve"
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/top/blueshirtsport
+ name = "Shirt, Sports - Blue"
+ icon_state = "blueshirtsport"
+
+/datum/sprite_accessory/underwear/top/greenshirtsport
+ name = "Shirt, Sports - Green"
+ icon_state = "greenshirtsport"
+
+/datum/sprite_accessory/underwear/top/redshirtsport
+ name = "Shirt, Sports - Red"
+ icon_state = "redshirtsport"
+
/datum/sprite_accessory/underwear/top/ss13
name = "Shirt - SS13"
icon_state = "shirt_ss13"
@@ -141,27 +190,6 @@
name = "Shirt - USA"
icon_state = "shirt_assblastusa"
-/datum/sprite_accessory/underwear/top/shortsleeve
- name = "Shirt - Short Sleeved"
- icon_state = "shortsleeve"
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/top/blueshirtsport
- name = "Shirt, Sports - Blue"
- icon_state = "blueshirtsport"
-
-/datum/sprite_accessory/underwear/top/greenshirtsport
- name = "Shirt, Sports - Green"
- icon_state = "greenshirtsport"
-
-/datum/sprite_accessory/underwear/top/redshirtsport
- name = "Shirt, Sports - Red"
- icon_state = "redshirtsport"
-
-/datum/sprite_accessory/underwear/top/tankfire
- name = "Tank Top - Fire"
- icon_state = "tank_fire"
-
/datum/sprite_accessory/underwear/top/tanktop
name = "Tank Top"
icon_state = "tanktop"
@@ -172,6 +200,10 @@
icon_state = "tanktop_alt"
has_color = TRUE
+/datum/sprite_accessory/underwear/top/tankfire
+ name = "Tank Top - Fire"
+ icon_state = "tank_fire"
+
/datum/sprite_accessory/underwear/top/tanktop_midriff
name = "Tank Top - Midriff"
icon_state = "tank_midriff"
@@ -192,6 +224,8 @@
name = "Tank top - Sun"
icon_state = "tank_sun"
+//feminine accessories from here on
+
/datum/sprite_accessory/underwear/top/babydoll
name = "Baby-Doll"
icon_state = "babydoll"
@@ -210,15 +244,25 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/top/bra_thin
- name = "Bra - Thin"
- icon_state = "bra_thin"
- has_color = TRUE
+/datum/sprite_accessory/underwear/top/bra_beekini
+ name = "Bra - Bee-kini"
+ icon_state = "bra_bee-kini"
gender = FEMALE
-/datum/sprite_accessory/underwear/top/bra_kinky
- name = "Bra - Kinky Black"
- icon_state = "bra_kinky"
+/datum/sprite_accessory/underwear/top/bra_binder
+ name = "Bra (binder)"
+ icon_state = "bra_binder"
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/top/bra_binder_strapless
+ name = "Bra (binder, strapless)"
+ icon_state = "bra_binder_strapless"
+ has_color = TRUE
+
+
+/datum/sprite_accessory/underwear/top/bra_commie
+ name = "Bra - Commie"
+ icon_state = "bra_commie"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_freedom
@@ -226,33 +270,17 @@
icon_state = "bra_assblastusa"
gender = FEMALE
-/datum/sprite_accessory/underwear/top/bra_commie
- name = "Bra - Commie"
- icon_state = "bra_commie"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/bra_beekini
- name = "Bra - Bee-kini"
- icon_state = "bra_bee-kini"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/bra_uk
- name = "Bra - UK"
- icon_state = "bra_uk"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/bra_neko
- name = "Bra - Neko"
- icon_state = "bra_neko"
- has_color = TRUE
- gender = FEMALE
-
/datum/sprite_accessory/underwear/top/halterneck_bra
name = "Bra - Halterneck"
icon_state = "halterneck_bra"
has_color = TRUE
gender = FEMALE
+/datum/sprite_accessory/underwear/top/bra_kinky
+ name = "Bra - Kinky Black"
+ icon_state = "bra_kinky"
+ gender = FEMALE
+
/datum/sprite_accessory/underwear/top/sports_bra
name = "Bra, Sports"
icon_state = "sports_bra"
@@ -283,9 +311,21 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/top/fishnet_sleeves
- name = "Fishnet - sleeves"
- icon_state = "fishnet_sleeves"
+/datum/sprite_accessory/underwear/top/bra_thin
+ name = "Bra - Thin"
+ icon_state = "bra_thin"
+ has_color = TRUE
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/top/bra_neko
+ name = "Bra - Neko"
+ icon_state = "bra_neko"
+ has_color = TRUE
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/top/bra_uk
+ name = "Bra - UK"
+ icon_state = "bra_uk"
gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_gloves
@@ -293,6 +333,11 @@
icon_state = "fishnet_gloves"
gender = FEMALE
+/datum/sprite_accessory/underwear/top/fishnet_sleeves
+ name = "Fishnet - sleeves"
+ icon_state = "fishnet_sleeves"
+ gender = FEMALE
+
/datum/sprite_accessory/underwear/top/fishnet_base
name = "Fishnet - top"
icon_state = "fishnet_body"
@@ -315,45 +360,3 @@
icon_state = "tubetop"
has_color = TRUE
gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/cowboyshirt
- name = "Cowboy Shirt Black"
- icon_state = "cowboyshirt"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/s
- name = "Cowboy Shirt Shortsleeved Black"
- icon_state = "cowboyshirt_s"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/white
- name = "Cowboy Shirt White"
- icon_state = "cowboyshirt_white"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/white/s
- name = "Cowboy Shirt Shortsleeved White"
- icon_state = "cowboyshirt_whites"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/navy
- name = "Cowboy Shirt Navy"
- icon_state = "cowboyshirt_navy"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s
- name = "Cowboy Shirt Shortsleeved Navy"
- icon_state = "cowboyshirt_navys"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/red
- name = "Cowboy Shirt Red"
- icon_state = "cowboyshirt_red"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/red/s
- name = "Cowboy Shirt Shortsleeved Red"
- icon_state = "cowboyshirt_reds"
-
-/datum/sprite_accessory/underwear/top/bra_binder
- name = "Bra (binder)"
- icon_state = "bra_binder"
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/top/bra_binder_strapless
- name = "Bra (binder, strapless)"
- icon_state = "bra_binder_strapless"
- has_color = TRUE
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
index 58d5e1ba88..edfeba79f1 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
@@ -10,18 +10,6 @@
icon_state = null
covers_groin = FALSE
-/datum/sprite_accessory/underwear/bottom/mankini
- name = "Mankini"
- icon_state = "mankini"
- has_color = TRUE
- gender = MALE
-
-/datum/sprite_accessory/underwear/bottom/male_kinky
- name = "Jockstrap"
- icon_state = "jockstrap"
- has_color = TRUE
- gender = MALE
-
/datum/sprite_accessory/underwear/bottom/briefs
name = "Briefs"
icon_state = "briefs"
@@ -77,6 +65,26 @@
has_digitigrade = TRUE
has_color = TRUE
+/datum/sprite_accessory/underwear/bottom/male_kinky
+ name = "Jockstrap"
+ icon_state = "jockstrap"
+ has_color = TRUE
+ gender = MALE
+
+/datum/sprite_accessory/underwear/bottom/longjon
+ name = "Long John Bottoms"
+ icon_state = "ljonb"
+ has_digitigrade = TRUE
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/bottom/mankini
+ name = "Mankini"
+ icon_state = "mankini"
+ has_color = TRUE
+ gender = MALE
+
+//feminine underwear from here on
+
/datum/sprite_accessory/underwear/bottom/panties
name = "Panties"
icon_state = "panties"
@@ -89,11 +97,6 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/bottom/fishnet_lower
- name = "Panties - Fishnet"
- icon_state = "fishnet_lower"
- gender = FEMALE
-
/datum/sprite_accessory/underwear/bottom/female_beekini
name = "Panties - Bee-kini"
icon_state = "panties_bee-kini"
@@ -104,6 +107,11 @@
icon_state = "panties_commie"
gender = FEMALE
+/datum/sprite_accessory/underwear/bottom/fishnet_lower
+ name = "Panties - Fishnet"
+ icon_state = "fishnet_lower"
+ gender = FEMALE
+
/datum/sprite_accessory/underwear/bottom/female_usastripe
name = "Panties - Freedom"
icon_state = "panties_assblastusa"
@@ -114,11 +122,6 @@
icon_state = "panties_kinky"
gender = FEMALE
-/datum/sprite_accessory/underwear/bottom/panties_uk
- name = "Panties - UK"
- icon_state = "panties_uk"
- gender = FEMALE
-
/datum/sprite_accessory/underwear/bottom/panties_neko
name = "Panties - Neko"
icon_state = "panties_neko"
@@ -149,17 +152,10 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/bottom/longjon
- name = "Long John Bottoms"
- icon_state = "ljonb"
- has_digitigrade = TRUE
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/bottom/swimsuit_red
- name = "Swimsuit, One Piece - Red"
- icon_state = "swimming_red"
+/datum/sprite_accessory/underwear/bottom/panties_uk
+ name = "Panties - UK"
+ icon_state = "panties_uk"
gender = FEMALE
- covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit
name = "Swimsuit, One Piece - Black"
@@ -173,6 +169,12 @@
gender = FEMALE
covers_chest = TRUE
+/datum/sprite_accessory/underwear/bottom/swimsuit_red
+ name = "Swimsuit, One Piece - Red"
+ icon_state = "swimming_red"
+ gender = FEMALE
+ covers_chest = TRUE
+
/datum/sprite_accessory/underwear/bottom/thong
name = "Thong"
icon_state = "thong"
@@ -184,5 +186,3 @@
icon_state = "thong_babydoll"
has_color = TRUE
gender = FEMALE
-
-
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index fb03df88a1..fb71bb483d 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -58,6 +58,10 @@
dimension_y = 34
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
+/datum/sprite_accessory/deco_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
@@ -66,6 +70,10 @@
name = "Bee"
icon_state = "bee"
+/datum/sprite_accessory/deco_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
/datum/sprite_accessory/deco_wings/fairy
name = "Fairy"
icon_state = "fairy"
@@ -74,14 +82,6 @@
name = "Feathery"
icon_state = "feathery"
-/datum/sprite_accessory/deco_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/deco_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -150,6 +150,10 @@
icon_state = "none"
relevant_layers = null
+/datum/sprite_accessory/insect_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
/datum/sprite_accessory/insect_wings/bat
name = "Bat"
icon_state = "bat"
@@ -158,6 +162,10 @@
name = "Bee"
icon_state = "bee"
+/datum/sprite_accessory/insect_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
/datum/sprite_accessory/insect_wings/fairy
name = "Fairy"
icon_state = "fairy"
@@ -166,14 +174,6 @@
name = "Feathery"
icon_state = "feathery"
-/datum/sprite_accessory/insect_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/insect_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -182,6 +182,10 @@
name = "Gothic"
icon_state = "gothic"
+/datum/sprite_accessory/insect_wings/jungle
+ name = "Jungle"
+ icon_state = "jungle"
+
/datum/sprite_accessory/insect_wings/lovers
name = "Lovers"
icon_state = "lovers"
@@ -198,6 +202,10 @@
name = "Moon Fly"
icon_state = "moonfly"
+/datum/sprite_accessory/insect_wings/oakworm
+ name = "Oak Worm"
+ icon_state = "oakworm"
+
/datum/sprite_accessory/insect_wings/plain
name = "Plain"
icon_state = "plain"
@@ -230,14 +238,6 @@
name = "White Fly"
icon_state = "whitefly"
-/datum/sprite_accessory/insect_wings/oakworm
- name = "Oak Worm"
- icon_state = "oakworm"
-
-/datum/sprite_accessory/insect_wings/jungle
- name = "Jungle"
- icon_state = "jungle"
-
/datum/sprite_accessory/insect_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index edb681e60f..b7d67e49a6 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -87,7 +87,7 @@
if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM))
for(var/datum/surgery/S in surgeries)
if(S.next_step(user,user.a_intent))
- return 1
+ return STOP_ATTACK_PROC_CHAIN
if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src))
return ..()
@@ -95,7 +95,7 @@
for(var/i in shuffle(all_wounds))
var/datum/wound/W = i
if(W.try_treating(I, user))
- return 1
+ return STOP_ATTACK_PROC_CHAIN
return ..()
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index cb0dbef332..04747ffcb4 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -7,6 +7,11 @@
message = "cries."
emote_type = EMOTE_AUDIBLE
+/datum/emote/living/carbon/human/cry/run_emote(mob/user, params)
+ . = ..()
+ if(. && isipcperson(user))
+ do_fake_sparks(5,FALSE,user)
+
/datum/emote/living/carbon/human/dap
key = "dap"
key_third_person = "daps"
@@ -187,3 +192,71 @@
key_third_person = "chimes"
message = "chimes."
sound = 'sound/machines/chime.ogg'
+
+//rock paper scissors emote handling
+/mob/living/carbon/human/proc/beginRockPaperScissors(var/chosen_move)
+ GLOB.rockpaperscissors_players[src] = list(chosen_move, ROCKPAPERSCISSORS_NOT_DECIDED)
+ do_after_advanced(src, ROCKPAPERSCISSORS_TIME_LIMIT, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT|DO_AFTER_NO_PROGRESSBAR|DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER, CALLBACK(src, .proc/rockpaperscissors_tick))
+ var/new_entry = GLOB.rockpaperscissors_players[src]
+ if(new_entry[2] == ROCKPAPERSCISSORS_NOT_DECIDED)
+ to_chat(src, "You put your hand back down.")
+ GLOB.rockpaperscissors_players -= src
+
+/mob/living/carbon/human/proc/rockpaperscissors_tick() //called every cycle of the progress bar for rock paper scissors while waiting for an opponent
+ var/mob/living/carbon/human/opponent
+ for(var/mob/living/carbon/human/potential_opponent in (GLOB.rockpaperscissors_players - src)) //dont play against yourself
+ if(get_dist(src, potential_opponent) <= ROCKPAPERSCISSORS_RANGE)
+ opponent = potential_opponent
+ break
+ if(opponent)
+ //we found an opponent before they found us
+ var/move_to_number = list("rock" = 0, "paper" = 1, "scissors" = 2)
+ var/our_move = move_to_number[GLOB.rockpaperscissors_players[src][1]]
+ var/their_move = move_to_number[GLOB.rockpaperscissors_players[opponent][1]]
+ var/result_us = ROCKPAPERSCISSORS_WIN
+ var/result_them = ROCKPAPERSCISSORS_LOSE
+ if(our_move == their_move)
+ result_us = ROCKPAPERSCISSORS_TIE
+ result_them = ROCKPAPERSCISSORS_TIE
+ else
+ if(((our_move + 1) % 3) == their_move)
+ result_us = ROCKPAPERSCISSORS_LOSE
+ result_them = ROCKPAPERSCISSORS_WIN
+ //we decided our results so set them in the list
+ GLOB.rockpaperscissors_players[src][2] = result_us
+ GLOB.rockpaperscissors_players[opponent][2] = result_them
+
+ //show what happened
+ src.visible_message("[src] makes [GLOB.rockpaperscissors_players[src][1]] with their hand!")
+ opponent.visible_message("[opponent] makes [GLOB.rockpaperscissors_players[opponent][1]] with their hands!")
+ switch(result_us)
+ if(ROCKPAPERSCISSORS_TIE)
+ src.visible_message("It was a tie!")
+ if(ROCKPAPERSCISSORS_WIN)
+ src.visible_message("[src] wins!")
+ if(ROCKPAPERSCISSORS_LOSE)
+ src.visible_message("[opponent] wins!")
+
+ //make the progress bar end so that each player can handle the result
+ return DO_AFTER_STOP
+
+ //no opponent was found, so keep searching
+ return DO_AFTER_PROCEED
+
+//the actual emotes
+/datum/emote/living/carbon/human/rockpaperscissors
+ message = "is attempting to play rock paper scissors!"
+
+/datum/emote/living/carbon/human/rockpaperscissors/rock
+ key = "rock"
+
+/datum/emote/living/carbon/human/rockpaperscissors/paper
+ key = "paper"
+
+/datum/emote/living/carbon/human/rockpaperscissors/scissors
+ key = "scissors"
+
+/datum/emote/living/carbon/human/rockpaperscissors/run_emote(mob/living/carbon/human/user, params)
+ if(!(user in GLOB.rockpaperscissors_players)) //no using the emote again while already playing!
+ . = ..()
+ user.beginRockPaperScissors(key)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 230a634e0e..ed509f900a 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -114,6 +114,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/// Our default override for typing indicator state
var/typing_indicator_state
+ //the ids you can use for your species, if empty, it means default only and not changeable
+ var/list/allowed_limb_ids
+
///////////
// PROCS //
///////////
@@ -121,7 +124,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/New()
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
- limbs_id = id
+ mutant_bodyparts["limbs_id"] = id //done this way to be non-intrusive to the existing system
+ else
+ mutant_bodyparts["limbs_id"] = limbs_id
..()
//update our mutant bodyparts to include unlocked ones
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 2a955e28a4..16b371c772 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -13,10 +13,11 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
liked_food = MEAT | FRUIT
disliked_food = TOXIC
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
exotic_bloodtype = "BUG"
exotic_blood_color = BLOOD_COLOR_BUG
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
- species_type = "insect"
\ No newline at end of file
+ species_type = "insect"
+
+ allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale")
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 7706d4a9d5..534536d6e7 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -2,7 +2,6 @@
name = "Anthromorph"
id = "mammal"
default_color = "4B4B4B"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
@@ -17,3 +16,5 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_type = "furry"
+
+ allowed_limb_ids = list("mammal","aquatic","avian")
\ No newline at end of file
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 3aef14c256..806782a8b2 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -3,7 +3,6 @@
id = "ipc"
say_mod = "beeps"
default_color = "00FF00"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
blacklisted = 0
sexes = 0
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE)
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index f5a2f807e4..0f62953e6c 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -21,6 +21,8 @@
species_type = "plant"
+ allowed_limb_ids = list("pod","mush")
+
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "plants"
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 173411eaa1..70afa2f476 100644
--- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
@@ -1,7 +1,6 @@
/datum/species/synthliz
name = "Synthetic Lizardperson"
id = "synthliz"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
say_mod = "beeps"
default_color = "00FF00"
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,HAS_FLESH,HAS_BONE)
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index c10521dfd9..3d55ce1027 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -61,7 +61,7 @@
mutant_organs = S.mutant_organs.Copy()
nojumpsuit = S.nojumpsuit
no_equip = S.no_equip.Copy()
- limbs_id = S.limbs_id
+ limbs_id = S.mutant_bodyparts["limbs_id"]
use_skintones = S.use_skintones
fixed_mut_color = S.fixed_mut_color
hair_color = S.hair_color
diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm
index db34d1ae45..ddd1c86f0a 100644
--- a/code/modules/mob/living/carbon/human/species_types/xeno.dm
+++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm
@@ -4,7 +4,6 @@
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR)
mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade")
attack_verb = "slash"
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e399ddf872..9b39438563 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -660,7 +660,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
//produces a key based on the human's limbs
/mob/living/carbon/human/generate_icon_render_key()
- . = "[dna.species.limbs_id]"
+ . = "[dna.species.mutant_bodyparts["limbs_id"]]"
if(dna.check_mutation(HULK))
. += "-coloured-hulk"
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index ad1a3bc9b9..fe5a78de21 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -8,8 +8,6 @@
spill_organs(no_brain, no_organs, no_bodyparts)
- release_vore_contents(silent = TRUE) // return of the bomb safe internals.
-
if(!no_bodyparts)
spread_bodyparts(no_brain, no_organs)
@@ -46,7 +44,6 @@
buckled.unbuckle_mob(src, force = TRUE)
dust_animation()
- release_vore_contents(silent = TRUE) //technically grief protection, I guess? if they're SM'd it doesn't matter seconds after anyway.
spawn_dust(just_ash)
QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes.
@@ -103,5 +100,5 @@
for(var/s in sharedSoullinks)
var/datum/soullink/S = s
S.sharerDies(gibbed)
-
+ release_vore_contents(silent = TRUE)
return TRUE
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 97de8bfd6c..a735baceae 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -9,6 +9,11 @@
key_third_person = "blushes"
message = "blushes."
+/datum/emote/living/blush/run_emote(mob/user, params)
+ . = ..()
+ if(. && isipcperson(user))
+ do_fake_sparks(5,FALSE,user)
+
/datum/emote/living/bow
key = "bow"
key_third_person = "bows"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 9018c49b2c..d8299d42ad 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -289,50 +289,57 @@
return FALSE
return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range)
-/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
+/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user)
+ if (!getBruteLoss())
+ to_chat(user, "[src] is already in good condition!")
+ return
+ if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
+ return
+ user.DelayNextAction(CLICK_CD_MELEE)
+ if(src == user)
+ to_chat(user, "You start fixing yourself...")
+ if(!W.use_tool(src, user, 50))
+ return
+ adjustBruteLoss(-10)
+ else
+ to_chat(user, "You start fixing [src]...")
+ if(!do_after(user, 30, target = src))
+ return
+ adjustBruteLoss(-30)
+ updatehealth()
+ add_fingerprint(user)
+ visible_message("[user] has fixed some of the dents on [src].")
+
+/mob/living/silicon/robot/proc/attempt_cable_repair(obj/item/stack/cable_coil/W, mob/user)
+ if (getFireLoss() > 0 || getToxLoss() > 0)
user.DelayNextAction(CLICK_CD_MELEE)
- if (!getBruteLoss())
- to_chat(user, "[src] is already in good condition!")
- return
- if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
- return
if(src == user)
to_chat(user, "You start fixing yourself...")
- if(!W.use_tool(src, user, 50))
+ if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
+ to_chat(user, "You need more cable to repair [src]!")
return
- adjustBruteLoss(-10)
+ adjustFireLoss(-10)
+ adjustToxLoss(-10)
else
to_chat(user, "You start fixing [src]...")
- if(!do_after(user, 30, target = src))
+ if(!W.use_tool(src, user, 30, 1))
+ to_chat(user, "You need more cable to repair [src]!")
return
- adjustBruteLoss(-30)
- updatehealth()
- add_fingerprint(user)
- visible_message("[user] has fixed some of the dents on [src].")
+ adjustFireLoss(-30)
+ adjustToxLoss(-30)
+ updatehealth()
+ user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].")
+ else
+ to_chat(user, "The wires seem fine, there's no need to fix them.")
+
+/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
+ INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user)
return
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
- user.DelayNextAction(CLICK_CD_MELEE)
- if (getFireLoss() > 0 || getToxLoss() > 0)
- if(src == user)
- to_chat(user, "You start fixing yourself...")
- if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
- to_chat(user, "You need more cable to repair [src]!")
- return
- adjustFireLoss(-10)
- adjustToxLoss(-10)
- else
- to_chat(user, "You start fixing [src]...")
- if(!W.use_tool(src, user, 30, 1))
- to_chat(user, "You need more cable to repair [src]!")
- return
- adjustFireLoss(-30)
- adjustToxLoss(-30)
- updatehealth()
- user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].")
- else
- to_chat(user, "The wires seem fine, there's no need to fix them.")
+ INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user)
+ return
else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover
if(opened)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 525388fa61..bd3a6e8232 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -661,7 +661,7 @@ Difficulty: Normal
continue
to_chat(M.occupant, "Your [M.name] is struck by a [name]!")
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
- M.take_damage(damage, BURN, 0, 0)
+ M.take_damage(damage, BURN, 0, 0, null, 50)
/obj/effect/hierophant
name = "hierophant beacon"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index 12f0b41d4e..fa67fd8e3b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -200,6 +200,8 @@
L.Stun(75)
L.adjustBruteLoss(rand(15,20)) // Less stun more harm
latched = TRUE
+ for(var/obj/mecha/M in loc)
+ M.take_damage(20, BRUTE, null, null, null, 25)
if(!latched)
retract()
else
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 36a596f42e..6661d0ccea 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -19,8 +19,11 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
to_chat(src, "You can't vent crawl while you're restrained!")
return
if(has_buckled_mobs())
- to_chat(src, "You can't vent crawl with other creatures on you!")
- return
+ // attempt once
+ unbuckle_all_mobs()
+ if(has_buckled_mobs())
+ to_chat(src, "You can't vent crawl with other creatures on you!")
+ return
if(buckled)
to_chat(src, "You can't vent crawl while buckled!")
return
diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm
index cb2d49fc64..470b34e82c 100644
--- a/code/modules/newscaster/newscaster_machine.dm
+++ b/code/modules/newscaster/newscaster_machine.dm
@@ -95,6 +95,10 @@ GLOBAL_LIST_EMPTY(allCasters)
. = ..()
update_icon()
+/obj/machinery/newscaster/attack_ghost(mob/dead/observer/user)
+ if(istype(user))
+ user.read_news()
+
/obj/machinery/newscaster/ui_interact(mob/user)
. = ..()
if(ishuman(user) || issilicon(user))
diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm
index 414026924a..392eba5f56 100644
--- a/code/modules/paperwork/paper_premade.dm
+++ b/code/modules/paperwork/paper_premade.dm
@@ -96,7 +96,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/job_changes
name = "MEMO: Job Changes"
- info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
\n
\n- Scientists are to have access to chemistry in order to reach the MedSci router.
\n
\n- Chemists should at the very least be provided with an encryption key for the Science channel, if not basic access to the Research department at large.
\n- Roboticists are to have basic Medical and Morgue access.
\n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
\n- The Cook should not have Morgue access
\n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
\n
\nGenerated by Organic Resources Bot #2053"
+ info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
\n
\n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
\n- The Cook should not have Morgue access.
\n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
\n
\nGenerated by Organic Resources Bot #2053"
/obj/item/paper/guides/cogstation/letter_sec
name = "To future Security personnel"
@@ -104,7 +104,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/disposals
name = "Regarding the disposal system:"
- info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
\n
\n- WHITE/GRAY STRIPES is for DELIVERIES.
\n- RED STRIPES is for CORPSES.
\n- EVERYTHING ELSE is for TRASH, barring a few exceptions that should be labeled as such.
\n
\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
\n
\n-C. Donnelly
Architectural Analyst"
+ info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
\n
\n- WHITE/GRAY STRIPES are for DELIVERIES.
\n- RED STRIPES are for CORPSES.
\n- EVERYTHING ELSE is for TRASH, barring a few exceptions that should be labeled as such.
\n
\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
\n
\n-C. Donnelly
Architectural Analyst"
/obj/item/paper/guides/cogstation/janitor
name = "a quick tip"
@@ -128,7 +128,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/letter_eng
name = "To future Engineering staff:"
- info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
\n
\n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of shielding out there.
\n
\nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
\n
\nGood luck. You're gonna need it.
\n
\n-C. Donnelly
Architectural Analyst"
+ info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
\n
\n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of protection out there.
\n
\nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
\n
\nGood luck. You're gonna need it.
\n
\n-C. Donnelly
Architectural Analyst"
/obj/item/paper/guides/cogstation/letter_atmos
name = "To future Atmospheric Technicians:"
@@ -140,15 +140,15 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/letter_hos
name = "To the future HoS"
- info = "I'm gonna be rather disappointed if CentCom doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
\n
\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
\n
-LC"
+ info = "I'm gonna be rather disappointed if Central Command doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
\n
\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
\n
-LC"
/obj/item/paper/guides/cogstation/letter_supp
name = "To future Supply Staff:"
- info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
\n
\nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
\n
\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
\n
\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
\n
\n-C. Donnelly
\nArchitectural Analyst"
+ info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
\n
\nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
\n
\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. It also isn't fully space-proofed, meanin it may not be the best choice for livestock, monkey cubes, or clowns. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
\n
\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
\n
\n-C. Donnelly
\nArchitectural Analyst"
-/obj/item/paper/fluff/cogstation/sleepers
- name = "Re: Sleepers?"
- info = "Yes, the sleepers are meant to be publicly accessible. Policies in this station's original location encouraged crew to visit the clinic or treat themselves when it came to minor injuries.
\n
\nThis is no excuse for you not to do your jobs. You may wish to keep an eye on the sleepers as to ensure they're being used responsibly. Remember, allowing an overdose to happen under your watch isn't much different from administering that overdose yourself.
\n
\n- Dr. Halley"
+/obj/item/paper/guides/cogstation/letter_med
+ name = "Re: Future Medical Staff"
+ info = "With this station nearing approval for regular use, I've been told to consolidate anything noteworthy about its general medical department into a single document. As you may be able to guess, this is that document.
\n
\n- First, you should know a medical clinic is present in the civilian (starboard bow) wing. If you have personnel to spare, it's recommended you have someone staff it - that way people with minor injuries can report there instead of clogging up the research wing.
\n
\n- Despite recent renovations to bring this station in line with regional policy, you'll still find the robotics lab directly adjacent to your department. I advise you take full advantage of this, whether it's requesting prosthetics in advance or harvesting organs from those who have undergone more...permanent procedures.
\n
\n- Lastly, please make a habit of checking the morgue on a regular basis. Thanks to the Corpse Disposal Network (or CDN for short), you may find the station's deceased delivered directly to you. Some may be employees capable of being revived - more information can be found in the morgue itself.
\n
\n- Dr. Halley"
/obj/item/paper/fluff/cogstation/cloner
name = "Re: Issue with the cloner?"
@@ -172,7 +172,7 @@ Accidental Reentry:
/obj/item/paper/fluff/cogstation/letter_chap
name = "A message from the DHDA"
- info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
\n
\nSoulstone Obelisk
\n
\nDepartment of Higher-Dimensional Affairs"
+ info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
\n
\nSoulstone Obelisk
\n
\nDepartment of Higher-Dimensional Affairs"
/obj/item/paper/fluff/cogstation/cluwne
name = "Mysterious Note"
@@ -184,7 +184,7 @@ Accidental Reentry:
/obj/item/paper/fluff/cogstation/eva
name = "MEMO: Spacesuits"
- info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
\n
\n-Generated by Organic Resources Bot #2053"
+ info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
\n
\nGenerated by Organic Resources Bot #2053"
/obj/item/paper/fluff/cogstation/chemists
name = "Re: Scientists?!"
@@ -214,9 +214,9 @@ Accidental Reentry:
name = "ROUTER STATUS: LIMITED"
info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. Cargo and the recycler are the only points currently accepting deliveries from here, although manual input from the routing depot is currently required.
\n
\n-C. Donnelly
\n
\nArchitectural Analyst"
-/obj/item/paper/fluff/cogstation/router_cargo
- name = "ROUTER STATUS: VERY LIMITED"
- info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. It is not yet capable of making deliveries, beyond sending items to the recycler.
\n
\n-C. Donnelly
\n
\nArchitectural Analyst"
+/obj/item/paper/fluff/cogstation/mulebot
+ name = "MEMO: MULEbots"
+ info = "As you may know, MULEbots have been coded to minimize travel distance for maximum efficiency. In the case of this station, that may include travelling through depressurized areas exposed to space. Please bear this in mind before using them to transport living tissue.
\n
\nGenerated by Organic Resources Bot #2053"
/////////// CentCom
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 78a20e5b62..54b1362518 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -66,7 +66,7 @@
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
var/heat = energy_transfer*(1-efficiency)
- lastgen += energy_transfer*efficiency
+ lastgen += LOGISTIC_FUNCTION(1000000,0.0034,delta_temperature,2000)
hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity)
cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 0b00c89c02..8cd49bdf16 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -149,6 +149,9 @@
icon = 'icons/obj/ammo.dmi'
icon_state = "shotgunclip"
caliber = "shotgun" // slapped in to allow shell mix n match
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET
+ w_class = WEIGHT_CLASS_NORMAL
+ w_volume = ITEM_VOLUME_STRIPPER_CLIP
ammo_type = /obj/item/ammo_casing/shotgun
max_ammo = 4
var/pixeloffsetx = 4
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 9b25a80680..926ed27854 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -19,6 +19,10 @@
var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
var/spray_delay = 3 //The amount of sleep() delay between each chempuff step.
+ /// Last world.time of spray
+ var/last_spray = 0
+ /// Spray cooldown
+ var/spray_cooldown = CLICK_CD_MELEE
var/can_fill_from_container = TRUE
amount_per_transfer_from_this = 5
volume = 250
@@ -27,8 +31,6 @@
/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user)
. = ..()
- if(!user.CheckActionCooldown(CLICK_CD_MELEE))
- return
if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return
@@ -49,7 +51,8 @@
to_chat(user, "[src] is empty!")
return
- spray(A)
+ if(!spray(A))
+ return
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
user.last_action = world.time
@@ -64,10 +67,10 @@
if(reagents.has_reagent(/datum/reagent/lube))
message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [ADMIN_VERBOSEJMP(T)].")
log_game("[key_name(user)] fired Space lube from \a [src] at [AREACOORD(T)].")
- return
-
/obj/item/reagent_containers/spray/proc/spray(atom/A)
+ if((last_spray + spray_cooldown) > world.time)
+ return
var/range = clamp(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE)
@@ -79,10 +82,11 @@
reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
D.color = mix_color_from_reagents(D.reagents.reagent_list)
var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2)
- do_spray(A, wait_step, D, range, puff_reagent_left)
+ last_spray = world.time
+ INVOKE_ASYNC(src, .proc/do_spray, A, wait_step, D, range, puff_reagent_left)
+ return TRUE
/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left)
- set waitfor = FALSE
var/range_left = range
for(var/i=0, i 125)
+ to_chat(user, "A color that saturated? Surely not!")
+ return
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
if(!isnum(range))
return
@@ -396,4 +400,4 @@
#undef BLURRY_VISION_ONE
#undef BLURRY_VISION_TWO
-#undef BLIND_VISION_THREE
\ No newline at end of file
+#undef BLIND_VISION_THREE
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index a43e3fc2ce..58cb43996d 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -177,6 +177,7 @@
organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
item = /obj/item/storage/box/syndie_kit/guardian
cost = 15
+ limited_stock = 1 // you can only have one holopara apparently?
refundable = TRUE
cant_discount = TRUE
surplus = 0
diff --git a/code/modules/uplink/uplink_items/uplink_explosives.dm b/code/modules/uplink/uplink_items/uplink_explosives.dm
index 6cc1c9fe05..f44966fb3b 100644
--- a/code/modules/uplink/uplink_items/uplink_explosives.dm
+++ b/code/modules/uplink/uplink_items/uplink_explosives.dm
@@ -80,6 +80,7 @@
item = /obj/item/cartridge/virus/syndicate
cost = 5
restricted = TRUE
+ limited_stock = 1
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm
index dc4f4e9273..a78a4e6ef4 100644
--- a/code/modules/vending/kinkmate.dm
+++ b/code/modules/vending/kinkmate.dm
@@ -36,6 +36,7 @@
/obj/item/clothing/under/misc/keyholesweater = 2,
/obj/item/clothing/under/misc/stripper/mankini = 2,
/obj/item/clothing/under/costume/jabroni = 2,
+ /obj/item/clothing/gloves/evening/black = 2,
/obj/item/dildo/flared/huge = 3
)
premium = list(
diff --git a/html/changelog.html b/html/changelog.html
index 52dd778623..edaf74afca 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,103 @@
-->
+
28 August 2020
+
EmeraldSundisk updated:
+
+ - Adds more paper to the library
+ - The law office now has a desk window
+ - Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding areas to accommodate this.
+ - Updates some of CogStation's paperwork
+ - The rat in the morgue turned themselves into a possum. Funniest shit I've ever seen.
+ - Adjusts some area designations so cameras should receive power properly
+ - Cleans up an errant decal
+
+
Hatterhat updated:
+
+ - Traitor holoparasites can now only be bought once, because apparently you can only have one active holopara.
+ - PDA bombs can now only be bought once per uplink.
+
+
lolman360 updated:
+
+ - atmos = radiation = chemistry.
+
+
shellspeed1 updated:
+
+ - Adds slow mode for iv drips
+
+
timothyteakettle updated:
+
+ - an ancient game over a thousand years old has re-emerged among crewmembers - rock paper scissors
+ - customization features appear in alphabetical order where necessary
+ - bokken do two more stamina damage now
+ - you can now choose a body sprite as an anthromorph or anthromorphic insect, and can choose from aquatic/avian and apid respectively (and obviously back to the defaults too)
+
+
+
27 August 2020
+
silicons updated:
+
+ - eyebeam lighting can only have 128 maximum HSV saturation now.
+ - no more shotgun stripper clips in boxes.
+ - goliath tentacles now do 20 damage to mechs at 25% ap
+
+
timothyteakettle updated:
+
+ - changing your character's gender won't randomize its hairstyle and facial hairstyle now
+
+
+
26 August 2020
+
ancientpower updated:
+
+ - Ghosts can read newscasters by clicking on them.
+
+
silicons updated:
+
+ - hierophant vortex blasts now have 50% armor penetration vs mecha
+ - ventcrawling now kicks off every attached/buckled mob, even for non humans.
+
+
+
25 August 2020
+
Hatterhat updated:
+
+ - Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.
+
+
Literallynotpickles updated:
+
+ - You can now equip handheld crew monitors on all medical-related winter coats.
+
+
Putnam3145 updated:
+
+ - vore now ejects occupants on death
+
+
raspy-on-osu updated:
+
+ - Thermoelectric Generator power output
+
+
timothyteakettle updated:
+
+ - I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
+
+
+
24 August 2020
+
MrJWhit updated:
+
+ - Fixes areas on expanded airlocks
+
+
silicons updated:
+
+ - wormhole jaunters work
+ - wormhole jaunters no longer get interference from bags of holding
+ - airlocks now only shock on pulse/wirecutters instead of on tgui panel open.
+
+
timothyteakettle updated:
+
+ - three new items are in the loadout for all donators
+
+
zeroisthebiggay updated:
+
+ - contraband black evening gloves in kinkvend
+
+
23 August 2020
DeltaFire15 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index d4243a01ec..139ca99af0 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -27060,3 +27060,70 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: suiciding with the temporal katana omae wa mou shinderius you into the
shadow realm
- soundadd: twilight isnt earrape
+2020-08-24:
+ MrJWhit:
+ - bugfix: Fixes areas on expanded airlocks
+ silicons:
+ - bugfix: wormhole jaunters work
+ - tweak: wormhole jaunters no longer get interference from bags of holding
+ - bugfix: airlocks now only shock on pulse/wirecutters instead of on tgui panel
+ open.
+ timothyteakettle:
+ - rscadd: three new items are in the loadout for all donators
+ zeroisthebiggay:
+ - rscadd: contraband black evening gloves in kinkvend
+2020-08-25:
+ Hatterhat:
+ - rscadd: Insidious combat gloves have been replaced by insidious guerilla gloves.
+ They're generally the same, except now you can tackle with them.
+ Literallynotpickles:
+ - tweak: You can now equip handheld crew monitors on all medical-related winter
+ coats.
+ Putnam3145:
+ - tweak: vore now ejects occupants on death
+ raspy-on-osu:
+ - tweak: Thermoelectric Generator power output
+ timothyteakettle:
+ - tweak: I.P.Cs now short their circuits when expressing emotion, causing sparks
+ to appear around them.
+2020-08-26:
+ ancientpower:
+ - tweak: Ghosts can read newscasters by clicking on them.
+ silicons:
+ - balance: hierophant vortex blasts now have 50% armor penetration vs mecha
+ - balance: ventcrawling now kicks off every attached/buckled mob, even for non humans.
+2020-08-27:
+ silicons:
+ - tweak: eyebeam lighting can only have 128 maximum HSV saturation now.
+ - balance: no more shotgun stripper clips in boxes.
+ - balance: goliath tentacles now do 20 damage to mechs at 25% ap
+ timothyteakettle:
+ - tweak: changing your character's gender won't randomize its hairstyle and facial
+ hairstyle now
+2020-08-28:
+ EmeraldSundisk:
+ - rscadd: Adds more paper to the library
+ - rscadd: The law office now has a desk window
+ - tweak: Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding
+ areas to accommodate this.
+ - tweak: Updates some of CogStation's paperwork
+ - tweak: The rat in the morgue turned themselves into a possum. Funniest shit I've
+ ever seen.
+ - bugfix: Adjusts some area designations so cameras should receive power properly
+ - bugfix: Cleans up an errant decal
+ Hatterhat:
+ - tweak: Traitor holoparasites can now only be bought once, because apparently you
+ can only have one active holopara.
+ - balance: PDA bombs can now only be bought once per uplink.
+ lolman360:
+ - rscadd: atmos = radiation = chemistry.
+ shellspeed1:
+ - rscadd: Adds slow mode for iv drips
+ timothyteakettle:
+ - rscadd: an ancient game over a thousand years old has re-emerged among crewmembers
+ - rock paper scissors
+ - tweak: customization features appear in alphabetical order where necessary
+ - tweak: bokken do two more stamina damage now
+ - rscadd: you can now choose a body sprite as an anthromorph or anthromorphic insect,
+ and can choose from aquatic/avian and apid respectively (and obviously back
+ to the defaults too)
diff --git a/html/changelogs/AutoChangeLog-pr-13282.yml b/html/changelogs/AutoChangeLog-pr-13282.yml
new file mode 100644
index 0000000000..877c0f79d5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13282.yml
@@ -0,0 +1,6 @@
+author: "raspy-on-osu"
+delete-after: True
+changes:
+ - rscadd: "new explosion echoes"
+ - tweak: "explosion echo range"
+ - soundadd: "5 new explosion related sounds"
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index 755280b332..44499649f9 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 916686e63f..60978d55a2 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 989ec8049c..794074bfe4 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index ace37b1f17..4523403344 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 874f0d3660..c0f78ee604 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 378c70d187..06783df03d 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -7,6 +7,27 @@
category = LOADOUT_CATEGORY_DONATOR
ckeywhitelist = list("This entry should never appear with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard
+/datum/gear/donator/pet
+ name = "Pet Beacon"
+ slot = SLOT_IN_BACKPACK
+ path = /obj/item/choice_beacon/pet
+ ckeywhitelist = list()
+ donator_group_id = DONATOR_GROUP_TIER_1 // can be accessed by all donators
+
+/datum/gear/donator/carpet
+ name = "Carpet Beacon"
+ slot = SLOT_IN_BACKPACK
+ path = /obj/item/choice_beacon/box/carpet
+ ckeywhitelist = list()
+ donator_group_id = DONATOR_GROUP_TIER_1
+
+/datum/gear/donator/chameleon_bedsheet
+ name = "Chameleon Bedsheet"
+ slot = SLOT_NECK
+ path = /obj/item/bedsheet/chameleon
+ ckeywhitelist = list()
+ donator_group_id = DONATOR_GROUP_TIER_1
+
/datum/gear/donator/donortestingbikehorn
name = "Donor item testing bikehorn"
slot = SLOT_IN_BACKPACK
diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm
index ffa4724f63..09694ddec7 100644
--- a/modular_citadel/code/modules/client/loadout/gloves.dm
+++ b/modular_citadel/code/modules/client/loadout/gloves.dm
@@ -9,6 +9,10 @@
/datum/gear/gloves/evening
name = "Evening gloves"
path = /obj/item/clothing/gloves/evening
+
+/datum/gear/gloves/midnight
+ name = "Midnight gloves"
+ path = /obj/item/clothing/gloves/evening/black
/datum/gear/gloves/goldring
name = "A gold ring"
diff --git a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi b/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi
deleted file mode 100644
index c8d5ceb0a6..0000000000
Binary files a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
deleted file mode 100644
index 6098dd3567..0000000000
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and /dev/null differ
diff --git a/sound/effects/creak1.ogg b/sound/effects/creak1.ogg
new file mode 100644
index 0000000000..0cad4802ff
Binary files /dev/null and b/sound/effects/creak1.ogg differ
diff --git a/sound/effects/creak2.ogg b/sound/effects/creak2.ogg
new file mode 100644
index 0000000000..707bf39e33
Binary files /dev/null and b/sound/effects/creak2.ogg differ
diff --git a/sound/effects/creak3.ogg b/sound/effects/creak3.ogg
new file mode 100644
index 0000000000..88ff37a339
Binary files /dev/null and b/sound/effects/creak3.ogg differ
diff --git a/sound/effects/explosioncreak1.ogg b/sound/effects/explosioncreak1.ogg
new file mode 100644
index 0000000000..474f5febb5
Binary files /dev/null and b/sound/effects/explosioncreak1.ogg differ
diff --git a/sound/effects/explosioncreak2.ogg b/sound/effects/explosioncreak2.ogg
new file mode 100644
index 0000000000..75d323eb06
Binary files /dev/null and b/sound/effects/explosioncreak2.ogg differ
diff --git a/strings/traumas.json b/strings/traumas.json
index 58170bd55a..f8fed95c98 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -131,7 +131,8 @@
"@pick(semicolon)*weh",
"@pick(semicolon)My balls finally feel full, again.",
"@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)",
- ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP"
+ ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP",
+ "@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!"
],
"mutations": [
@@ -199,7 +200,7 @@
"abdoocters",
"revinent"
],
-
+
"bug": [
"",
"IS TIS A BUG??",
@@ -207,7 +208,7 @@
"BUG!!!",
"HUE, FEATURE!!"
],
-
+
"semicolon": [
"",
";",
@@ -271,7 +272,7 @@
"arrdee",
"sek"
],
-
+
"cargo": [
"GUNS",
"HATS",
@@ -279,7 +280,7 @@
"MEMES",
"GLOWY CYSTAL"
],
-
+
"s_roles": [
"ert",
"shadowlig",
diff --git a/tgstation.dme b/tgstation.dme
index 79c4274722..de6ee1a6bf 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -96,6 +96,7 @@
#include "code\__DEFINES\reagents_specific_heat.dm"
#include "code\__DEFINES\research.dm"
#include "code\__DEFINES\robots.dm"
+#include "code\__DEFINES\rockpaperscissors.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\say.dm"