diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm
index ed19285b586e..1fb955237126 100644
--- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm
+++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm
@@ -923,7 +923,7 @@
/obj/item/clothing/suit/space/hardsuit/syndi/ramzi,
/obj/item/reagent_containers/food/drinks/bottle/rum,
/obj/item/reagent_containers/food/drinks/bottle/rum,
-/obj/item/folder/syndicate/mining,
+/obj/item/folder/documents/syndicate/mining,
/obj/item/paper/fluff/gateway,
/turf/open/floor/plating,
/area/ruin/space/has_grav/onehalf)
diff --git a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm
index c43ba0812698..4e7fe7fd9c58 100644
--- a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm
+++ b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm
@@ -208,7 +208,7 @@
/area/ruin/space/has_grav/syndicircle/halls)
"gi" = (
/obj/structure/table/reinforced,
-/obj/item/folder/syndicate/red,
+/obj/item/folder/documents/syndicate/red,
/turf/open/floor/plasteel/tech,
/area/ruin/space/has_grav/syndicircle/winter)
"gp" = (
diff --git a/_maps/configs/solgov_chronicle.json b/_maps/configs/solgov_chronicle.json
index 0ef5e8005756..9fe11023e376 100644
--- a/_maps/configs/solgov_chronicle.json
+++ b/_maps/configs/solgov_chronicle.json
@@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Chronicle-class Sensor Frigate",
- "prefix": "SGSV",
+ "prefix": "SCSV",
"namelists": [
"SOLGOV",
"SPACE",
diff --git a/_maps/configs/solgov_inkwell.json b/_maps/configs/solgov_inkwell.json
index d34cb392f65e..b7ae54a1b6b9 100644
--- a/_maps/configs/solgov_inkwell.json
+++ b/_maps/configs/solgov_inkwell.json
@@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Inkwell-class Supply Freighter",
- "prefix": "SGSV",
+ "prefix": "SCSV",
"namelists": [
"SOLGOV",
"SPACE",
diff --git a/_maps/configs/solgov_paracelsus.json b/_maps/configs/solgov_paracelsus.json
index cd3b056e282e..a5eefc5296df 100644
--- a/_maps/configs/solgov_paracelsus.json
+++ b/_maps/configs/solgov_paracelsus.json
@@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Paracelsus-class Medical Corvette",
- "prefix": "SGSV",
+ "prefix": "SCSV",
"namelists": [
"SOLGOV",
"SPACE",
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 209466a1b2ef..c441891d33b6 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -16470,7 +16470,7 @@
/area/centcom)
"wCp" = (
/obj/structure/table/wood/fancy/blue,
-/obj/item/folder/solgov/red{
+/obj/item/folder/documents/solgov{
pixel_x = -3
},
/obj/item/folder/solgov{
diff --git a/_maps/shuttles/independent/independent_beluga.dmm b/_maps/shuttles/independent/independent_beluga.dmm
index fd498f15872c..e8bf634e863f 100644
--- a/_maps/shuttles/independent/independent_beluga.dmm
+++ b/_maps/shuttles/independent/independent_beluga.dmm
@@ -322,7 +322,7 @@
/obj/structure/table/reinforced{
color = "#c1b6a5"
},
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/obj/machinery/airalarm/directional/north,
/obj/machinery/camera/autoname{
dir = 6
diff --git a/_maps/shuttles/independent/independent_box.dmm b/_maps/shuttles/independent/independent_box.dmm
index 9001bc9faf69..3f17359288cc 100644
--- a/_maps/shuttles/independent/independent_box.dmm
+++ b/_maps/shuttles/independent/independent_box.dmm
@@ -2589,7 +2589,7 @@
/turf/open/floor/plasteel/tech/grid,
/area/ship/crew/toilet)
"OF" = (
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/obj/structure/table/reinforced,
/obj/machinery/light/small/directional/north,
/turf/open/floor/plasteel/dark,
diff --git a/_maps/shuttles/independent/independent_halftrack.dmm b/_maps/shuttles/independent/independent_halftrack.dmm
index 3b04da3c56dc..1363fefa1857 100644
--- a/_maps/shuttles/independent/independent_halftrack.dmm
+++ b/_maps/shuttles/independent/independent_halftrack.dmm
@@ -271,7 +271,7 @@
/area/ship/security/range)
"hF" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"hH" = (
diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm
index a6312b7de614..8bd2c209481b 100644
--- a/_maps/shuttles/independent/independent_rigger.dmm
+++ b/_maps/shuttles/independent/independent_rigger.dmm
@@ -234,7 +234,7 @@
"dH" = (
/obj/structure/table/reinforced,
/obj/machinery/firealarm/directional/west,
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/obj/machinery/light/directional/south,
/turf/open/floor/carpet/blue,
/area/ship/bridge)
diff --git a/_maps/shuttles/independent/independent_rube_goldberg.dmm b/_maps/shuttles/independent/independent_rube_goldberg.dmm
index 1f4b57035031..d9033819dc3f 100644
--- a/_maps/shuttles/independent/independent_rube_goldberg.dmm
+++ b/_maps/shuttles/independent/independent_rube_goldberg.dmm
@@ -1281,7 +1281,7 @@
"mj" = (
/obj/structure/table/wood,
/obj/machinery/light/directional/east,
-/obj/machinery/fax{
+/obj/machinery/fax/indie{
pixel_y = -5
},
/obj/effect/turf_decal/corner/opaque/yellow/border{
diff --git a/_maps/shuttles/independent/independent_schmiedeberg.dmm b/_maps/shuttles/independent/independent_schmiedeberg.dmm
index 78836ac3bde9..612ff07c1b61 100644
--- a/_maps/shuttles/independent/independent_schmiedeberg.dmm
+++ b/_maps/shuttles/independent/independent_schmiedeberg.dmm
@@ -2019,7 +2019,7 @@
/obj/item/gps{
gpstag = "PHARM1"
},
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/obj/machinery/button/door{
dir = 4;
id = "pharmbridge";
diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm
index 365a96a1e33c..5233549f322d 100644
--- a/_maps/shuttles/independent/independent_shetland.dmm
+++ b/_maps/shuttles/independent/independent_shetland.dmm
@@ -1499,7 +1499,7 @@
/obj/effect/turf_decal/corner/opaque/bottlegreen/full,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/structure/table/wood,
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/turf/open/floor/plasteel,
/area/ship/security)
"pC" = (
@@ -2047,7 +2047,7 @@
/obj/effect/turf_decal/corner/opaque/neutral/half{
dir = 1
},
-/obj/machinery/fax,
+/obj/machinery/fax/indie,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
diff --git a/_maps/shuttles/inteq/inteq_colossus.dmm b/_maps/shuttles/inteq/inteq_colossus.dmm
index d57cecb81be0..ed5ac0d11fb6 100644
--- a/_maps/shuttles/inteq/inteq_colossus.dmm
+++ b/_maps/shuttles/inteq/inteq_colossus.dmm
@@ -115,7 +115,7 @@
/area/ship/hallway/fore)
"bJ" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/inteq,
/obj/machinery/light/directional/north,
/obj/structure/cable{
icon_state = "2-8"
diff --git a/_maps/shuttles/inteq/inteq_hound.dmm b/_maps/shuttles/inteq/inteq_hound.dmm
index b4e45c49d0b9..e67d176f5683 100644
--- a/_maps/shuttles/inteq/inteq_hound.dmm
+++ b/_maps/shuttles/inteq/inteq_hound.dmm
@@ -2094,7 +2094,7 @@
"RM" = (
/obj/structure/table/reinforced,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/fax,
+/obj/machinery/fax/inteq,
/turf/open/floor/carpet/orange,
/area/ship/bridge)
"Sh" = (
diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm
index 76a32525dd49..c8bdcb1bd3be 100644
--- a/_maps/shuttles/inteq/inteq_talos.dmm
+++ b/_maps/shuttles/inteq/inteq_talos.dmm
@@ -1160,7 +1160,7 @@
/area/ship/hallway/central)
"hK" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/inteq,
/obj/machinery/button/door{
id = "talos_bridge";
name = "Bridge Shutters";
diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm
index 658a4c72125f..ede8c585a5c2 100644
--- a/_maps/shuttles/inteq/inteq_valor.dmm
+++ b/_maps/shuttles/inteq/inteq_valor.dmm
@@ -2757,7 +2757,7 @@
dir = 8
},
/obj/machinery/airalarm/directional/south,
-/obj/machinery/fax{
+/obj/machinery/fax/inteq{
pixel_y = 3
},
/turf/open/floor/plasteel/dark,
diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm
index d4811f7eed10..c93d0cc7f0a8 100644
--- a/_maps/shuttles/inteq/inteq_vaquero.dmm
+++ b/_maps/shuttles/inteq/inteq_vaquero.dmm
@@ -2919,7 +2919,7 @@
/area/ship/bridge)
"TQ" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/inteq,
/obj/machinery/light/small/directional/south,
/obj/effect/turf_decal/corner/opaque/brown{
dir = 8
diff --git a/_maps/shuttles/minutemen/minutemen_vela.dmm b/_maps/shuttles/minutemen/minutemen_vela.dmm
index 62e213520702..d46365996e2e 100644
--- a/_maps/shuttles/minutemen/minutemen_vela.dmm
+++ b/_maps/shuttles/minutemen/minutemen_vela.dmm
@@ -5841,7 +5841,7 @@
"FK" = (
/obj/machinery/airalarm/directional/south,
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/clip,
/turf/open/floor/plasteel/tech,
/area/ship/bridge)
"FN" = (
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm
index 1248c3a9f842..46e396a197a8 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm
@@ -3569,7 +3569,7 @@
/area/ship/maintenance/fore)
"JV" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/obj/structure/sign/poster/retro/random{
pixel_y = 32
},
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
index 935f0a2595d3..eb0b34fcf3d7 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
@@ -9598,7 +9598,7 @@
/obj/structure/table/reinforced{
color = "#c1b6a5"
},
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/obj/machinery/light/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
@@ -10619,7 +10619,7 @@
/obj/structure/table/reinforced{
color = "#c1b6a5"
},
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/obj/item/radio/intercom/wideband/directional/west{
pixel_y = 8
},
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm b/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm
index 95486e6fc6ae..b9f1fe3ee680 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm
@@ -2958,7 +2958,7 @@
/area/ship/science)
"tc" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/obj/effect/turf_decal/corner/opaque/ntblue,
/obj/effect/turf_decal/corner/opaque/ntblue{
dir = 4
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
index 9dc0703630b8..91f43369e93a 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
@@ -1765,7 +1765,7 @@
/obj/structure/table/reinforced{
color = "#c1b6a5"
},
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"sl" = (
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm b/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm
index 81465759ba48..5ec1a75727d5 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm
@@ -479,7 +479,7 @@
/area/ship/engineering/atmospherics)
"ed" = (
/obj/structure/table,
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
@@ -3937,7 +3937,7 @@
/turf/closed/wall,
/area/ship/cargo)
"Fv" = (
-/obj/machinery/fax,
+/obj/machinery/fax/nanotrasen,
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm
index fb0de25e83f6..e5f06babb733 100644
--- a/_maps/shuttles/roumain/srm_elder.dmm
+++ b/_maps/shuttles/roumain/srm_elder.dmm
@@ -2054,7 +2054,7 @@
/area/ship/engineering/engine)
"zX" = (
/obj/structure/table/wood,
-/obj/machinery/fax,
+/obj/machinery/fax/roumain,
/obj/effect/turf_decal/spline/fancy/wood{
dir = 8
},
diff --git a/_maps/shuttles/solgov/solgov_chronicle.dmm b/_maps/shuttles/solgov/solgov_chronicle.dmm
index a974c8b859c2..9cceb17c5dea 100644
--- a/_maps/shuttles/solgov/solgov_chronicle.dmm
+++ b/_maps/shuttles/solgov/solgov_chronicle.dmm
@@ -256,8 +256,8 @@
/obj/item/clothing/head/solgov/captain,
/obj/item/folder/solgov,
/obj/item/folder/solgov,
-/obj/item/folder/solgov/red,
-/obj/item/folder/solgov/red,
+/obj/item/folder/documents/solgov,
+/obj/item/folder/documents/solgov,
/obj/item/clothing/under/solgov/formal,
/obj/item/clothing/gloves/combat,
/obj/item/storage/backpack/captain,
@@ -771,7 +771,7 @@
/area/ship/crew)
"hr" = (
/obj/structure/table/wood/fancy/purple,
-/obj/machinery/fax,
+/obj/machinery/fax/solgov,
/obj/item/desk_flag/solgov{
pixel_x = 8;
pixel_y = 13
@@ -2999,7 +2999,7 @@
/turf/open/floor/plasteel/white,
/area/ship/security/armory)
"CU" = (
-/obj/machinery/fax,
+/obj/machinery/fax/solgov,
/obj/structure/table/wood,
/obj/machinery/light/small/directional/south,
/turf/open/floor/wood,
@@ -3577,7 +3577,7 @@
/area/ship/security/armory)
"Jh" = (
/obj/structure/table/wood/fancy/blue,
-/obj/machinery/fax,
+/obj/machinery/fax/solgov,
/obj/item/desk_flag/solgov{
pixel_x = -9;
pixel_y = 14
@@ -4121,7 +4121,7 @@
/obj/item/clothing/gloves/combat,
/obj/item/folder/solgov,
/obj/item/folder/solgov,
-/obj/item/folder/solgov/red,
+/obj/item/folder/documents/solgov,
/obj/item/clothing/under/solgov/formal,
/obj/item/clothing/head/solgov,
/obj/item/storage/belt/sabre/solgov,
diff --git a/_maps/shuttles/solgov/solgov_inkwell.dmm b/_maps/shuttles/solgov/solgov_inkwell.dmm
index 3c8e75a7ace0..e42972d85eed 100644
--- a/_maps/shuttles/solgov/solgov_inkwell.dmm
+++ b/_maps/shuttles/solgov/solgov_inkwell.dmm
@@ -2320,7 +2320,7 @@
/turf/open/floor/plasteel/freezer,
/area/ship/crew/toilet)
"pd" = (
-/obj/machinery/fax,
+/obj/machinery/fax/solgov,
/obj/structure/table/wood/fancy/purple,
/turf/open/floor/wood/maple,
/area/ship/crew/dorm/dormtwo)
@@ -5197,7 +5197,7 @@
/area/ship/crew/canteen/kitchen)
"HT" = (
/obj/structure/table/wood/fancy/blue,
-/obj/machinery/fax,
+/obj/machinery/fax/solgov,
/turf/open/floor/wood/maple,
/area/ship/bridge)
"HV" = (
@@ -5784,8 +5784,8 @@
/obj/item/clothing/under/solgov/formal,
/obj/item/folder/solgov,
/obj/item/folder/solgov,
-/obj/item/folder/solgov/red,
-/obj/item/folder/solgov/red,
+/obj/item/folder/documents/solgov,
+/obj/item/folder/documents/solgov,
/obj/structure/closet/secure_closet{
icon_state = "cap";
name = "\proper captain's locker";
diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm
index 70bfabe5d26b..b4ca4f13cb07 100644
--- a/_maps/shuttles/solgov/solgov_paracelsus.dmm
+++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm
@@ -1884,7 +1884,7 @@
pixel_x = 8;
pixel_y = 12
},
-/obj/machinery/fax,
+/obj/machinery/fax/solgov,
/turf/open/floor/wood/mahogany,
/area/ship/bridge)
"sp" = (
@@ -2483,7 +2483,7 @@
/obj/item/clothing/gloves/combat,
/obj/item/folder/solgov,
/obj/item/folder/solgov,
-/obj/item/folder/solgov/red,
+/obj/item/folder/documents/solgov,
/obj/item/clothing/under/solgov/formal,
/obj/item/clothing/head/solgov,
/obj/item/storage/belt/sabre/solgov,
@@ -3581,8 +3581,8 @@
/obj/item/clothing/under/solgov/formal,
/obj/item/folder/solgov,
/obj/item/folder/solgov,
-/obj/item/folder/solgov/red,
-/obj/item/folder/solgov/red,
+/obj/item/folder/documents/solgov,
+/obj/item/folder/documents/solgov,
/obj/structure/closet/secure_closet{
icon_state = "cap";
name = "\proper captain's locker";
diff --git a/_maps/shuttles/subshuttles/inteq_anvil.dmm b/_maps/shuttles/subshuttles/inteq_anvil.dmm
index b210a8874ded..f14f1e64d7fd 100644
--- a/_maps/shuttles/subshuttles/inteq_anvil.dmm
+++ b/_maps/shuttles/subshuttles/inteq_anvil.dmm
@@ -17,7 +17,7 @@
dir = 1
},
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/inteq,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"c" = (
diff --git a/_maps/shuttles/subshuttles/nanotrasen_ancon.dmm b/_maps/shuttles/subshuttles/nanotrasen_ancon.dmm
index 4565f12416f6..7176477bab9c 100644
--- a/_maps/shuttles/subshuttles/nanotrasen_ancon.dmm
+++ b/_maps/shuttles/subshuttles/nanotrasen_ancon.dmm
@@ -436,7 +436,7 @@
/area/ship/bridge)
"ZG" = (
/obj/structure/table,
-/obj/machinery/fax{
+/obj/machinery/fax/nanotrasen{
pixel_y = 5
},
/obj/effect/turf_decal/corner/opaque/green/half,
diff --git a/_maps/shuttles/syndicate/syndicate_aegis.dmm b/_maps/shuttles/syndicate/syndicate_aegis.dmm
index d86cb9b23de7..f5b0e87a6b1b 100644
--- a/_maps/shuttles/syndicate/syndicate_aegis.dmm
+++ b/_maps/shuttles/syndicate/syndicate_aegis.dmm
@@ -4187,7 +4187,7 @@
pixel_y = 9
},
/obj/item/radio/intercom/wideband/directional/north,
-/obj/machinery/fax,
+/obj/machinery/fax/syndicate,
/obj/effect/turf_decal/siding/wood{
dir = 5
},
diff --git a/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm b/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm
index 3a20cb1f5c26..523a524de9d0 100644
--- a/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm
+++ b/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm
@@ -604,7 +604,7 @@
/turf/open/floor/plasteel/tech,
/area/ship/crew/dorm)
"pa" = (
-/obj/machinery/fax,
+/obj/machinery/fax/syndicate,
/obj/item/toy/figure/detective{
name = "Intel Buddy";
pixel_x = 5;
diff --git a/_maps/shuttles/syndicate/syndicate_gec_lugol.dmm b/_maps/shuttles/syndicate/syndicate_gec_lugol.dmm
index 04e7a8d4b46c..2e4e22caa6d6 100644
--- a/_maps/shuttles/syndicate/syndicate_gec_lugol.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gec_lugol.dmm
@@ -575,7 +575,7 @@
/area/ship/construction)
"gv" = (
/obj/structure/table,
-/obj/item/folder/syndicate/red,
+/obj/item/folder/documents/syndicate/red,
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 1
},
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
index 6a8cee6cc78a..0cd79289edec 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
@@ -1921,7 +1921,7 @@
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/paper_bin/carbon,
-/obj/item/folder/syndicate/red,
+/obj/item/folder/documents/syndicate/red,
/obj/item/pen/fountain/captain,
/obj/item/stamp/hos{
name = "captain's rubber stamp"
@@ -2552,7 +2552,7 @@
pixel_x = 11;
pixel_y = -3
},
-/obj/machinery/fax,
+/obj/machinery/fax/syndicate,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/borderfloorblack{
dir = 1
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index 3bfb76d1f67d..4500ef61d3ba 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -3112,7 +3112,7 @@
/area/ship/crew/canteen)
"El" = (
/obj/structure/filingcabinet,
-/obj/item/folder/syndicate/mining,
+/obj/item/folder/documents/syndicate/mining,
/turf/open/floor/engine,
/area/ship/bridge)
"Ep" = (
@@ -5024,7 +5024,7 @@
pixel_x = -4;
pixel_y = 5
},
-/obj/machinery/fax{
+/obj/machinery/fax/syndicate{
pixel_x = 4;
pixel_y = 0
},
diff --git a/_maps/shuttles/syndicate/syndicate_litieguai.dmm b/_maps/shuttles/syndicate/syndicate_litieguai.dmm
index 02e738d39bfb..e81231480dfb 100644
--- a/_maps/shuttles/syndicate/syndicate_litieguai.dmm
+++ b/_maps/shuttles/syndicate/syndicate_litieguai.dmm
@@ -286,7 +286,7 @@
/area/ship/hallway/central)
"hF" = (
/obj/structure/table/reinforced,
-/obj/machinery/fax,
+/obj/machinery/fax/syndicate,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"hQ" = (
diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
index 460c9efc29d6..79c693817dda 100644
--- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
+++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
@@ -422,7 +422,7 @@
pixel_y = 32
},
/obj/structure/table,
-/obj/machinery/fax{
+/obj/machinery/fax/syndicate{
pixel_y = 5
},
/turf/open/floor/plasteel/tech,
@@ -1692,11 +1692,11 @@
/area/ship/medical)
"jO" = (
/obj/structure/table/reinforced,
-/obj/item/folder/syndicate/red{
+/obj/item/folder/documents/syndicate/red{
pixel_x = -8;
pixel_y = 6
},
-/obj/item/folder/syndicate/blue{
+/obj/item/folder/documents/syndicate/blue{
pixel_x = 6;
pixel_y = 4
},
@@ -8604,7 +8604,7 @@
/obj/effect/turf_decal/corner/opaque/syndiered/half{
dir = 8
},
-/obj/machinery/fax,
+/obj/machinery/fax/syndicate,
/turf/open/floor/mineral/plastitanium,
/area/ship/bridge)
"Xf" = (
diff --git a/check_regex.yaml b/check_regex.yaml
index 5420d8fa692c..062b120ed936 100644
--- a/check_regex.yaml
+++ b/check_regex.yaml
@@ -38,7 +38,7 @@ standards:
- exactly:
[
- 271,
+ 269,
"non-bitwise << uses",
'(?Welcome to [station_name()], enjoy your stay!")
SSredbot.send_discord_message("ooc", "**A new round has begun.**")
- SEND_SOUND(world, sound('sound/ai/welcome.ogg'))
+ SEND_SOUND(world, sound('sound/roundstart/addiguana.ogg'))
current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME)
@@ -571,15 +571,12 @@ SUBSYSTEM_DEF(ticker)
update_everything_flag_in_db()
if(!round_end_sound)
round_end_sound = pick(\
- 'sound/roundend/newroundsexy.ogg',
- 'sound/roundend/apcdestroyed.ogg',
- 'sound/roundend/bangindonk.ogg',
- 'sound/roundend/leavingtg.ogg',
- 'sound/roundend/its_only_game.ogg',
- 'sound/roundend/yeehaw.ogg',
- 'sound/roundend/disappointed.ogg',
- 'sound/roundend/scrunglartiy.ogg',
- 'sound/roundend/petersondisappointed.ogg'\
+ 'sound/roundend/deliguana.ogg',
+ 'sound/roundend/undecided.ogg',
+ 'sound/roundend/repair.ogg',
+ 'sound/roundend/boowomp.ogg',
+ 'sound/roundend/shiptestingthursday.ogg',
+ 'sound/roundend/gayrights.ogg'\
)
///The reference to the end of round sound that we have chosen.
var/sound/end_of_round_sound_ref = sound(round_end_sound)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 22b15f162b25..6b63a3ae83b8 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -303,15 +303,28 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/retro, 17)
/obj/machinery/cryopod/proc/despawn_occupant()
var/mob/living/mob_occupant = occupant
- if(linked_ship)
- if(mob_occupant.job in linked_ship.current_ship.job_slots)
- linked_ship.current_ship.job_slots[mob_occupant.job]++
-
- if(mob_occupant.mind && mob_occupant.mind.assigned_role)
- //Handle job slot/tater cleanup.
- if(LAZYLEN(mob_occupant.mind.objectives))
- mob_occupant.mind.objectives.Cut()
- mob_occupant.mind.special_role = null
+ if(!isnull(mob_occupant.mind.original_ship))
+ var/datum/overmap/ship/controlled/original_ship_instance = mob_occupant.mind.original_ship.resolve()
+
+ var/job_identifier = mob_occupant.job
+
+ var/datum/job/crew_job
+ for(var/datum/job/job as anything in original_ship_instance.job_slots)
+ if(job.name == job_identifier)
+ crew_job = job
+ break
+
+ if(isnull(crew_job))
+ message_admins(span_warning("Failed to identify the job of [key_name_admin(mob_occupant)] belonging to [original_ship_instance.name] at [loc_name(src)]."))
+ else
+ original_ship_instance.job_slots[crew_job]++
+ original_ship_instance.job_holder_refs[crew_job] -= WEAKREF(mob_occupant)
+
+ if(mob_occupant.mind && mob_occupant.mind.assigned_role)
+ //Handle job slot/tater cleanup.
+ if(LAZYLEN(mob_occupant.mind.objectives))
+ mob_occupant.mind.objectives.Cut()
+ mob_occupant.mind.special_role = null
// Delete them from datacore.
var/announce_rank = null
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 154e4b48a481..ce5afeba737a 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -168,6 +168,7 @@
if(mapload && access_txt)
access = text2access(access_txt)
update_label()
+ update_appearance()
RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, PROC_REF(update_in_wallet))
/obj/item/card/id/Destroy()
@@ -421,7 +422,6 @@ update_label()
/obj/item/card/id/proc/update_label()
var/blank = !registered_name
name = "[blank ? initial(name) : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]"
- update_appearance()
/obj/item/card/id/silver
name = "silver identification card"
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 8800dee20016..a60600b3661f 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -750,7 +750,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
overlay_state = "slime"
grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5)
-/obj/item/lighter/clockwork //WS edit: Clockwork Zippo, by Tergius. PR #395
+/obj/item/lighter/clockwork
name = "bronze zippo"
desc = "A zippo plated with brass. I mean bronze. Has a neat red flame!"
icon = 'icons/obj/cigarettes.dmi'
@@ -829,7 +829,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
///////////////
/obj/item/clothing/mask/vape
name = "\improper E-Cigarette"
- desc = "A classy and highly sophisticated electronic cigarette, for classy and dignified gentlemen. A warning label reads \"Warning: Do not fill with flammable materials.\" Must be lit via interfacing with a PDA."//<<< i'd vape to that.
+ desc = "A classy and highly sophisticated electronic cigarette, for classy and dignified gentlemen. A warning label reads \"Warning: Do not fill with flammable materials.\" Can be lit via interfacing with a PDA, tablet computer, or an APC."//<<< i'd vape to that.
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "red_vapeoff"
item_state = "red_vapeoff"
@@ -839,19 +839,19 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/vapetime = 0 //this so it won't puff out clouds every tick
var/screw = 0 // kinky
var/super = 0 //for the fattest vapes dude.
- var/vapecolor //What color the vape should be. If this is not filled out it will automatically be set on Initialize() - WS edit - Lightable e-cigarettes
- var/overlayname = "vape" //Used to decide what overlay sprites to use - WS edit - Lightable e-cigarettes
+ var/vapecolor //What color the vape should be. If this is not filled out it will automatically be set on Initialize()
+ var/overlayname = "vape" //Used to decide what overlay sprites to use
/obj/item/clothing/mask/vape/Initialize(mapload, param_color)
. = ..()
create_reagents(chem_volume, NO_REACT)
reagents.add_reagent(/datum/reagent/drug/nicotine, 50)
- if(!vapecolor) //BeginWS edit - Lightable e-cigarettes
+ if(!vapecolor)
if(!param_color)
param_color = pick("red","blue","black","white","green","purple","yellow","orange")
vapecolor = param_color
icon_state = "[vapecolor]_vapeoff"
- item_state = "[vapecolor]_vapeoff" //EndWS edit - Lightable e-cigarettes
+ item_state = "[vapecolor]_vapeoff"
/obj/item/clothing/mask/vape/attackby(obj/item/O, mob/user, params)
if(O.tool_behaviour == TOOL_SCREWDRIVER)
@@ -863,11 +863,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM
to_chat(user, "You open the cap on [src].")
reagents.flags |= OPENCONTAINER
if(obj_flags & EMAGGED)
- add_overlay("[overlayname]open_high") //WS edit - lightable e-cigarettes
+ add_overlay("[overlayname]open_high")
else if(super)
- add_overlay("[overlayname]open_med") //WS edit - lightable e-cigarettes
+ add_overlay("[overlayname]open_med")
else
- add_overlay("[overlayname]open_low") //WS edit - lightable e-cigarettes
+ add_overlay("[overlayname]open_low")
else
screw = FALSE
to_chat(user, "You close the cap on [src].")
@@ -880,18 +880,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cut_overlays()
super = 1
to_chat(user, "You increase the voltage of [src].")
- add_overlay("[overlayname]open_med") //WS edit - lightable e-cigarettes
+ add_overlay("[overlayname]open_med")
else
cut_overlays()
super = 0
to_chat(user, "You decrease the voltage of [src].")
- add_overlay("[overlayname]open_low") //WS edit - lightable e-cigarettes
+ add_overlay("[overlayname]open_low")
if(screw && (obj_flags & EMAGGED))
to_chat(user, "[src] can't be modified!")
else
..()
- if(istype(O, /obj/item/pda)) //BeginWS edit - Lightable e-cigarettes
+ if(istype(O, /obj/item/pda) || istype(O, /obj/item/modular_computer/tablet))
if(screw)
to_chat(user, "You need to close the cap first!")
return
@@ -918,8 +918,32 @@ CIGARETTE PACKETS ARE IN FANCY.DM
STOP_PROCESSING(SSobj, src)
src.update_icon_state()
user.update_inv_wear_mask()
- user.update_inv_hands() //EndWS edit - Lightable e-cigarettes
+ user.update_inv_hands()
+/obj/item/clothing/mask/vape/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if((!istype(target, /obj/machinery/power/apc)) || !ishuman(user) || !proximity_flag)
+ return ..()
+ if(screw)
+ to_chat(user, "You need to close the cap first!")
+ return
+ on = !on
+ if(on)
+ user.visible_message(
+ "[user] turns on [user.p_their()] [src] with a holographic flame from the APC.",
+ "You turn on your [src] with a holographic flame from the APC."
+ )
+ reagents.flags |= NO_REACT
+ icon_state = "[vapecolor]_vape"
+ item_state = "[vapecolor]_vape"
+ else
+ user.visible_message(
+ "[user] turns off [user.p_their()] [src] with a holographic gust from the APC.",
+ "You turn off your [src] with a holographic gust from the APC."
+ )
+ reagents.flags &= NO_REACT
+ icon_state = "[vapecolor]_vapeoff"
+ item_state = "[vapecolor]_vapeoff"
+ src.update_icon_state()
/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
if(screw)
@@ -928,7 +952,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
obj_flags |= EMAGGED
super = 0
to_chat(user, "You maximize the voltage of [src].")
- add_overlay("[overlayname]open_high") //WS edit - lightable e-cigarettes
+ add_overlay("[overlayname]open_high")
var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
sp.set_up(5, 1, src)
sp.start()
@@ -944,7 +968,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/vape/equipped(mob/user, slot)
. = ..()
- if(slot == ITEM_SLOT_MASK) //BeginWS edit - Lightable e-cigarettes
+ if(slot == ITEM_SLOT_MASK)
if(on)
if(!screw)
to_chat(user, "You start puffing on \the [src].")
@@ -952,7 +976,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else //it will not start if the vape is opened.
to_chat(user, "You need to close the cap first!")
else
- to_chat(user, "You need to turn on \the [src] first!") //EndWS edit - Lightable e-cigarettes
+ to_chat(user, "You need to turn on \the [src] first!")
/obj/item/clothing/mask/vape/dropped(mob/user)
. = ..()
@@ -999,7 +1023,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
//open flame removed because vapes are a closed system, they wont light anything on fire
if(super && vapetime > 3)//Time to start puffing those fat vapes, yo.
- var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new //BeginWS edit - Fix vape clouds
+ var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new
var/datum/reagents/smokereagents = new
reagents.trans_to(smokereagents, reagents.total_volume / 10, 0.65)
s.set_up(smokereagents, 1, 24, loc)
@@ -1011,7 +1035,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/datum/reagents/smokereagents = new
reagents.trans_to(smokereagents, reagents.total_volume / 5, 0.75)
s.set_up(smokereagents, 4, 24, loc)
- s.start() //EndWS edit - Fix vape clouds
+ s.start()
vapetime = 0
if(prob(5))//small chance for the vape to break and deal damage if it's emagged
playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, FALSE)
@@ -1027,13 +1051,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(reagents && reagents.total_volume)
hand_reagents()
-/obj/item/clothing/mask/vape/examine(mob/user) //BeginWS edit - Lightable e-cigarettes
+/obj/item/clothing/mask/vape/examine(mob/user)
. = ..()
- to_chat(user, "It is currently [on ? "on" : "off"].")
/obj/item/clothing/mask/vape/cigar
name = "\improper E-Cigar"
- desc = "The latest recreational device developed by a small tech startup, Shadow Tech, the E-Cigar has all the uses of a normal E-Cigarette, with the classiness of short fat cigar. Must be lit via interfacing with a PDA."
+ desc = "The latest recreational device developed by a small tech startup, Shadow Tech, the E-Cigar has all the uses of a normal E-Cigarette, with the classiness of short fat cigar. Can be lit via interfacing with a PDA, tablet computer, or an APC."
icon_state = "ecigar_vapeoff"
item_state = "ecigar_vapeoff"
vapecolor = "ecigar"
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 41a8f59509a5..bf08b704beb0 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -30,7 +30,11 @@
if(pai)
if(!pai.master_dna || !pai.master)
dat += "Imprint Master DNA
"
- dat += "Installed Personality: [pai.name]
"
+ dat += "Prime directive:
"
+ if(pai.laws.zeroth)
+ dat +="[pai.laws.zeroth]
"
+ else
+ dat +="None
"
dat += "Prime directive:
[pai.laws.zeroth]
"
for(var/slaws in pai.laws.supplied)
dat += "Additional directives:
[slaws]
"
@@ -48,6 +52,7 @@
var/mob/living/carbon/human/H = user
if(H.real_name == pai.master || H.dna.unique_enzymes == pai.master_dna)
dat += "\[[pai.canholo? "Disable" : "Enable"] holomatrix projectors\]
"
+ dat += "\[Remove Prime directive\]
"
dat += "\[Reset speech synthesis module\]
"
dat += "\[Wipe current pAI personality\]
"
else
@@ -79,6 +84,7 @@
pai.master = M.real_name
pai.master_dna = M.dna.unique_enzymes
to_chat(pai, "You have been bound to a new master.")
+ pai.laws.set_zeroth_law("Serve your master.")
pai.emittersemicd = FALSE
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
@@ -89,6 +95,10 @@
to_chat(pai, "Your mental faculties leave you.")
to_chat(pai, "oblivion... ")
qdel(pai)
+ if(href_list["clear_zero"])
+ if((input("Are you CERTAIN you wish to remove this pAI's Prime directive? This action cannot be undone.", "Clear Directive") in list("Yes", "No")) == "Yes")
+ if(pai)
+ pai.laws.clear_zeroth_law()
if(href_list["fix_speech"])
pai.stuttering = 0
pai.slurring = 0
@@ -149,4 +159,3 @@
return
if(pai && !pai.holoform)
pai.emp_act(severity)
-
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 07968246a5ae..574dd88e5cc4 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -335,8 +335,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
/obj/item/radio/headset/silicon/pai
name = "\proper mini Integrated Subspace Transceiver "
- subspace_transmission = FALSE
-
/obj/item/radio/headset/silicon/ai
name = "\proper Integrated Subspace Transceiver "
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 6f11fe4ebac1..3f40f82fe0ae 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -140,7 +140,7 @@ GENE SCANNER
// Used by the PDA medical scanner too
/proc/healthscan(mob/user, mob/living/M, mode = SCANNER_VERBOSE, advanced = FALSE)
- if(isliving(user) && (user.incapacitated() || user.is_blind()))
+ if(isliving(user) && (user.incapacitated()))
return
// the final list of strings to render
@@ -456,7 +456,7 @@ GENE SCANNER
/obj/item/analyzer/attack_self(mob/user)
add_fingerprint(user)
- if (user.stat || user.is_blind())
+ if (user.stat)
return
var/turf/location = user.loc
@@ -636,7 +636,7 @@ GENE SCANNER
custom_materials = list(/datum/material/iron=30, /datum/material/glass=20)
/obj/item/slime_scanner/attack(mob/living/M, mob/living/user)
- if(user.stat || user.is_blind())
+ if(user.stat)
return
if (!isslime(M))
to_chat(user, "This device can only scan slimes!")
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 4367861c7f79..46d92aa9b6f8 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -37,7 +37,12 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, 1, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, one_per_turf = TRUE, on_floor = TRUE)
+ new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("red sofa (middle)", /obj/structure/chair/sofa/red, 1, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("red sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("red sofa (right)", /obj/structure/chair/sofa/red/right, 1, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("red sofa (corner)", /obj/structure/chair/sofa/red/corner, 1, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("red sofa (internal corner)", /obj/structure/chair/sofa/red/internal_corner, 1, one_per_turf = TRUE, on_floor = TRUE)
)),
null, \
new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 7a7c73b33fc6..a8d560796f7e 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -151,7 +151,7 @@
return ..()
/obj/structure/chair/comfy/proc/GetArmrest()
- return mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest")
+ return mutable_appearance(icon, "[icon_state]_armrest")
/obj/structure/chair/comfy/Destroy()
QDEL_NULL(armrest)
diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm
index c811ceafcd2b..8ba787920546 100644
--- a/code/game/objects/structures/beds_chairs/sofa.dm
+++ b/code/game/objects/structures/beds_chairs/sofa.dm
@@ -1,5 +1,5 @@
/obj/structure/chair/sofa
- name = "old ratty sofa"
+ name = "sofa"
icon_state = "sofamiddle"
icon = 'icons/obj/sofa.dmi'
buildstackamount = 1
@@ -13,3 +13,19 @@
/obj/structure/chair/sofa/corner
icon_state = "sofacorner"
+
+/obj/structure/chair/sofa/red
+ name = "comfortable sofa"
+ icon_state = "sofamiddle_red"
+
+/obj/structure/chair/sofa/red/left
+ icon_state = "sofaend_left_red"
+
+/obj/structure/chair/sofa/red/right
+ icon_state = "sofaend_right_red"
+
+/obj/structure/chair/sofa/red/corner
+ icon_state = "sofacorner_red"
+
+/obj/structure/chair/sofa/red/internal_corner
+ icon_state = "sofainternalcorner_red"
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 8ba938dae8ee..0fca2bcca6ee 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -63,12 +63,12 @@
desc = "A coniferous pine tree."
icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "pine_1"
- var/list/icon_states = list("pine_1", "pine_2", "pine_3")
+ var/list/icon_states = list("pine_1", "pine_2", "pine_3", "pine_4")
/obj/structure/flora/tree/pine/Initialize()
. = ..()
- if(islist(icon_states && icon_states.len))
+ if(islist(icon_states) && icon_states.len)
icon_state = pick(icon_states)
/obj/structure/flora/tree/pine/xmas
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 9647d4c07947..19ac8a0514d3 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -206,6 +206,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
id.registered_name = H.real_name
id.assignment = "Captain"
id.update_label()
+ id.update_appearance()
if(worn)
if(istype(worn, /obj/item/pda))
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 701351b238d2..131dd55ad82b 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -45,9 +45,10 @@
if(!check_rights(R_SOUND))
return
+ var/vol = input("Select a volume for the sound", "Play Local Sound", 50) as num
log_admin("[key_name(src)] played a local sound [S]")
message_admins("[key_name_admin(src)] played a local sound [S]")
- playsound(get_turf(src.mob), S, 50, FALSE, FALSE)
+ playsound(get_turf(src.mob), S, vol, FALSE, FALSE)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/play_direct_mob_sound(S as sound, mob/M)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 894023d9c194..40a925e9b82f 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -283,11 +283,11 @@
//Spawn and equip documents
var/mob/living/carbon/human/mob = owner.current
- var/obj/item/folder/syndicate/folder
+ var/obj/item/folder/documents/syndicate/folder
if(owner == SSticker.mode.exchange_red)
- folder = new/obj/item/folder/syndicate/red(mob.loc)
+ folder = new/obj/item/folder/documents/syndicate/red(mob.loc)
else
- folder = new/obj/item/folder/syndicate/blue(mob.loc)
+ folder = new/obj/item/folder/documents/syndicate/blue(mob.loc)
var/list/slots = list (
"backpack" = ITEM_SLOT_BACKPACK,
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index ffd662a0425e..28d5ad1ec248 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -39,9 +39,8 @@
/datum/supply_pack/ammo/a357_mag
name = ".357 Speedloader Crate"
desc = "Contains a .357 speedloader for revolvers, containing seven rounds."
- contains = list(/obj/item/ammo_box/a357,
- /obj/item/ammo_box/a357)
- cost = 1500
+ contains = list(/obj/item/ammo_box/a357)
+ cost = 750
/datum/supply_pack/ammo/mag_556mm
name = "5.56 Pistole C Magazine Crate"
@@ -164,7 +163,7 @@
/datum/supply_pack/ammo/a850r_ammo
name = "8x50mmR En Bloc Clip Crate"
- desc = "Contains a 8x50mmR en bloc clips for rifles like the illestren rifle, containing five rounds."
+ desc = "Contains a 8x50mmR en bloc clip for rifles like the illestren rifle, containing five rounds."
contains = list(/obj/item/ammo_box/magazine/illestren_a850r)
cost = 250
@@ -182,7 +181,7 @@
/datum/supply_pack/ammo/c45_ammo_box
name = ".45 Ammo Box Crate"
- desc = "Contains a fifty-round .45 box for pistols and SMGs like the M1911 or the C-20r."
+ desc = "Contains a fifty-round .45 box for pistols and SMGs like the Candor or the C-20r."
contains = list(/obj/item/ammo_box/c45)
cost = 250
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index 05fb2308702b..8ed63f7cfb47 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -62,7 +62,7 @@
/datum/supply_pack/gun/laser
name = "Mini Energy Gun Crate"
- desc = "Contains a small, versatile energy guns, capable of firing both nonlethal and lethal blasts, but with a limited power cell."
+ desc = "Contains a small, versatile energy gun, capable of firing both nonlethal and lethal blasts, but with a limited power cell."
cost = 500
contains = list(/obj/item/gun/energy/e_gun/mini)
crate_name = "laser crate"
@@ -89,14 +89,14 @@
/datum/supply_pack/gun/hellfire_shotgun
name = "Hellfire Shotgun Crate"
- desc = "For when you need to deal with 7 hooligans. Contains a pump shotguns, with a 8-round capacity."
+ desc = "For when you need to deal with 7 hooligans. Contains a pump shotgun, with a 8-round capacity."
cost = 2000
contains = list(/obj/item/gun/ballistic/shotgun/hellfire)
crate_name = "shotguns crate"
/datum/supply_pack/gun/brimstone_shotgun
name = "Brimstone Shotgun Crate"
- desc = "For when you need to deal with 5 hooligans, and QUICKLY. Contains a slamfire shotguns, with a 5-round capacity. Warranty voided if sawed off."
+ desc = "For when you need to deal with 5 hooligans, and QUICKLY. Contains a slamfire shotgun, with a 5-round capacity. Warranty voided if sawed off."
cost = 2000
contains = list(/obj/item/gun/ballistic/shotgun/brimstone)
crate_name = "shotguns crate"
@@ -107,21 +107,21 @@
/datum/supply_pack/gun/winchester
name = "Flaming Arrow Lever Action Rifle Crate"
- desc = "Contains a antiquated lever action rifles intended for hunting wildlife. Chambered in .38 rounds."
+ desc = "Contains a antiquated lever action rifle intended for hunting wildlife. Chambered in .38 rounds."
cost = 750
contains = list(/obj/item/gun/ballistic/shotgun/flamingarrow)
crate_name = "rifle crate"
/datum/supply_pack/gun/cobra20
name = "Cobra-20 SMG Crate"
- desc = "Contains a .45 submachine guns, manufactured by Scaraborough Arms and chambered in .45"
+ desc = "Contains a .45 submachine gun, manufactured by Scaraborough Arms and chambered in .45"
cost = 3000
contains = list(/obj/item/gun/ballistic/automatic/smg/c20r/cobra)
crate_name = "SMG crate"
/datum/supply_pack/gun/illestren
name = "Illestren Rifle Crate"
- desc = "Contains a expertly made bolt action rifles intended for hunting wildlife. Chambered in 8x50mmR rounds."
+ desc = "Contains a expertly made bolt action rifle intended for hunting wildlife. Chambered in 8x50mmR rounds."
cost = 1250
contains = list(/obj/item/gun/ballistic/rifle/illestren)
crate_name = "rifle crate"
@@ -135,14 +135,14 @@
/datum/supply_pack/gun/p16
name = "P16 Assault Rifle Crate"
- desc = "Contains a high-powered, automatic rifles chambered in 5.56mm."
+ desc = "Contains a high-powered, automatic rifle chambered in 5.56mm."
cost = 5000
contains = list(/obj/item/gun/ballistic/automatic/assault/p16)
crate_name = "auto rifle crate"
/datum/supply_pack/gun/skm
name = "SKM-24 Rifle Crate"
- desc = "Contains a high-powered, automatic rifles chambered in 7.62x40mm CLIP."
+ desc = "Contains a high-powered, automatic rifle chambered in 7.62x40mm CLIP."
cost = 5000
contains = list(/obj/item/gun/ballistic/automatic/assault/skm)
crate_name = "auto rifle crate"
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index eb629f76ae43..203bcf416b13 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -148,8 +148,9 @@
card.job_icon = outfit.job_icon
card.faction_icon = outfit.faction_icon
card.assignment = J.name
+ card.update_appearance()
+ card.assignment = old_assignment
card.update_label()
- card.name = "[!card.registered_name ? initial(card.name) : "[card.registered_name]'s ID Card"][" ([old_assignment])"]" // this is terrible, but whatever
H.sec_hud_set_ID()
qdel(outfit)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index bc2036523bd7..4cae19eb5c83 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -140,7 +140,7 @@
name = "cybersun agent cap"
desc = "A black baseball hat emblazoned with a reflective Cybersun patch."
icon_state = "agentsoft"
- soft_type = "black"
+ soft_type = "agent"
dog_fashion = null
/obj/item/clothing/head/soft/cybersun/medical
diff --git a/code/modules/clothing/outfits/ert/inteq_ert.dm b/code/modules/clothing/outfits/ert/inteq_ert.dm
index feb7b440d8fa..b3fc0c61970c 100644
--- a/code/modules/clothing/outfits/ert/inteq_ert.dm
+++ b/code/modules/clothing/outfits/ert/inteq_ert.dm
@@ -1,5 +1,6 @@
/datum/outfit/job/inteq/ert
name = "ERT - Inteq Rifleman"
+ id_assignment = "Enforcer"
jobtype = /datum/job/officer
job_icon = "securityofficer"
@@ -22,6 +23,7 @@
/datum/outfit/job/inteq/ert/shotgun
name = "ERT - Inteq Shotgunner"
+ id_assignment = "Enforcer"
suit_store = /obj/item/gun/ballistic/shotgun/automatic/combat/compact
belt = /obj/item/storage/belt/security/webbing/inteq/alt
@@ -30,6 +32,7 @@
/datum/outfit/job/inteq/ert/medic
name = "ERT - Inteq Corpsman"
+ id_assignment = "Corpsman"
jobtype = /datum/job/paramedic
job_icon = "paramedic"
@@ -43,6 +46,7 @@
/datum/outfit/job/inteq/ert/leader
name = "ERT - Inteq Vanguard"
+ id_assignment = "Vanguard"
jobtype = /datum/job/hos
job_icon = "headofsecurity"
diff --git a/code/modules/clothing/outfits/ert/minutemen_ert.dm b/code/modules/clothing/outfits/ert/minutemen_ert.dm
index 63d0a302de7a..bc440d3bc612 100644
--- a/code/modules/clothing/outfits/ert/minutemen_ert.dm
+++ b/code/modules/clothing/outfits/ert/minutemen_ert.dm
@@ -1,5 +1,6 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/bard
name = "ERT - CLIP Minuteman BARD Specialist"
+ id_assignment = "Biohazard Assessment Specialist"
job_icon = "clip_cmm2"
suit = /obj/item/clothing/suit/armor/vest/marine/heavy
@@ -18,6 +19,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/bard/medic
name = "ERT - CLIP Minuteman BARD Medical Specialist"
+ id_assignment = "Corpsman"
suit = /obj/item/clothing/suit/armor/vest/marine
suit_store = /obj/item/gun/ballistic/automatic/smg/cm5
@@ -50,6 +52,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/bard/leader
name = "ERT - CLIP Minuteman BARD Specialist Sergeant"
+ id_assignment = "Biohazard Assessment Sergeant"
job_icon = "clip_cmm3"
belt = /obj/item/storage/belt/military/clip/e50
@@ -87,6 +90,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/riot/leader
name = "ERT - CLIP Minutemen Riot Officer Sergeant"
+ id_assignment = "Security Sergeant"
job_icon = "lieutenant"
ears = /obj/item/radio/headset/clip/alt/captain
diff --git a/code/modules/clothing/outfits/ert/solgov_ert.dm b/code/modules/clothing/outfits/ert/solgov_ert.dm
index bc09a74c1786..da3a1146648d 100644
--- a/code/modules/clothing/outfits/ert/solgov_ert.dm
+++ b/code/modules/clothing/outfits/ert/solgov_ert.dm
@@ -1,5 +1,6 @@
/datum/outfit/job/solgov/ert
name = "ERT - SolGov Sonnensöldner"
+ id_assignment = "Sonnensöldner"
jobtype = /datum/job/officer
job_icon = "sonnensoldner"
@@ -19,6 +20,7 @@
/datum/outfit/job/solgov/ert/inspector
name = "ERT - Inspector (SolGov)"
+ id_assignment = "Inspector"
jobtype = /datum/job/head_of_personnel
job_icon = "solgovrepresentative"
diff --git a/code/modules/clothing/outfits/ert/syndicate_ert.dm b/code/modules/clothing/outfits/ert/syndicate_ert.dm
index 7f76b9d0513a..472983e890db 100644
--- a/code/modules/clothing/outfits/ert/syndicate_ert.dm
+++ b/code/modules/clothing/outfits/ert/syndicate_ert.dm
@@ -32,7 +32,7 @@
// gorlex loyalist/2nd battlegroup
/datum/outfit/job/syndicate/ert/gorlex
- name = "ERT - Syndicate Gorlex Loyalist Trooper"
+ name = "ERT - New Gorlex Republic Trooper"
head = /obj/item/clothing/head/helmet/swat
uniform = /obj/item/clothing/under/syndicate/combat
@@ -42,13 +42,13 @@
suit_store = /obj/item/gun/ballistic/automatic/smg/m90
/datum/outfit/job/syndicate/ert/gorlex/pointman
- name = "ERT - Syndicate Gorlex Loyalist Pointman"
+ name = "ERT - New Gorlex Republic Pointman"
suit_store = /obj/item/gun/ballistic/shotgun/bulldog
belt = /obj/item/storage/belt/security/webbing/bulldog
/datum/outfit/job/syndicate/ert/gorlex/medic
- name = "ERT - Syndicate Gorlex Loyalist Medic"
+ name = "ERT - New Gorlex Republic Medic"
jobtype = /datum/job/paramedic
job_icon = "paramedic"
@@ -65,7 +65,7 @@
backpack_contents = list(/obj/item/ammo_box/magazine/m10mm=2, /obj/item/storage/firstaid/medical=1, /obj/item/defibrillator/compact/combat/loaded=1)
/datum/outfit/job/syndicate/ert/gorlex/sniper
- name = "ERT - Syndicate Gorlex Loyalist Sniper"
+ name = "ERT - New Gorlex Republic Sniper"
head = /obj/item/clothing/head/beret/black
back = /obj/item/storage/backpack/messenger/sec
@@ -81,7 +81,7 @@
backpack_contents = list(/obj/item/ammo_box/magazine/sniper_rounds=2, /obj/item/radio=1)
/datum/outfit/job/syndicate/ert/gorlex/leader
- name = "ERT - Syndicate Gorlex Loyalist Sergeant"
+ name = "ERT - New Gorlex Republic Sergeant"
job_icon = "lieutenant"
uniform = /obj/item/clothing/under/syndicate/gorlex
@@ -144,6 +144,7 @@
/datum/outfit/job/syndicate/ert/cybersun/medic/leader
name = "ERT - Syndicate Cybersun Lead Paramedic"
+ id_assignment = "Lead Paramedic"
job_icon = "chiefmedicalofficer"
head = /obj/item/clothing/head/beret/cmo
@@ -157,6 +158,7 @@
/datum/outfit/job/syndicate/ert/inspector
name = "ERT - Inspector (Syndicate)"
+ id_assignment = "Inspector"
jobtype = /datum/job/head_of_personnel
job_icon = "syndicate"
@@ -174,11 +176,3 @@
suit_store = null
backpack_contents = list(/obj/item/stamp/syndicate)
-
-/datum/outfit/job/syndicate/ert/inspector/post_equip(mob/living/carbon/human/H, visualsOnly)
- . = ..()
- var/obj/item/card/id/W = H.wear_id
- if(W)
- W.registered_name = H.real_name
- W.assignment = "Inspector"
- W.update_label()
diff --git a/code/modules/clothing/outfits/factions/frontiersmen.dm b/code/modules/clothing/outfits/factions/frontiersmen.dm
index 351dbf67790a..c30de3d40432 100644
--- a/code/modules/clothing/outfits/factions/frontiersmen.dm
+++ b/code/modules/clothing/outfits/factions/frontiersmen.dm
@@ -25,6 +25,7 @@
/datum/outfit/job/frontiersmen/assistant
name = "Frontiersmen - Rookie"
+ id_assignment = "Rookie"
job_icon = "assistant"
jobtype = /datum/job/assistant
@@ -71,6 +72,7 @@
/datum/outfit/job/frontiersmen/captain/admiral
name = "Frontiersmen - Admiral"
+ id_assignment = "Admiral"
uniform = /obj/item/clothing/under/rank/security/officer/frontier/admiral
head = /obj/item/clothing/head/caphat/frontier/admiral
@@ -83,7 +85,8 @@
// Chief Engineer
/datum/outfit/job/frontiersmen/ce
- name = "Frontiersmen - Senior Sapper"
+ name = "Frontiersmen - Senior Mechanic"
+ id_assignment = "Senior Mechanic"
job_icon = "chiefengineer"
jobtype = /datum/job/chief_engineer
@@ -97,7 +100,8 @@
// Engineer
/datum/outfit/job/frontiersmen/engineer
- name = "Frontiersmen - Sapper"
+ name = "Frontiersmen - Mechanic"
+ id_assignment = "Mechanic"
job_icon = "stationengineer"
jobtype = /datum/job/engineer
@@ -115,6 +119,7 @@
/datum/outfit/job/frontiersmen/cook
name = "Frontiersmen - Steward"
+ id_assignment = "Steward"
job_icon = "cook"
jobtype = /datum/job/cook
@@ -126,6 +131,7 @@
/datum/outfit/job/frontiersmen/hop
name = "Frontiersmen - Helmsman"
+ id_assignment = "Helmsman"
job_icon = "headofpersonnel"
jobtype = /datum/job/head_of_personnel
@@ -138,7 +144,8 @@
// Head of Security
/datum/outfit/job/frontiersmen/hos
- name = "Frontiersmen - Shipswain"
+ name = "Frontiersmen - Deck Boss"
+ id_assignment = "Deck Boss"
job_icon = "headofsecurity"
jobtype = /datum/job/hos
@@ -155,6 +162,7 @@
/datum/outfit/job/frontiersmen/security
name = "Frontiersmen - Boarder"
+ id_assignment = "Boarder"
job_icon = "securityofficer"
jobtype = /datum/job/officer
@@ -173,7 +181,8 @@
// Medical Doctor
/datum/outfit/job/frontiersmen/doctor
- name = "Frontiersmen - Aidman"
+ name = "Frontiersmen - Surgeon"
+ id_assignment = "Surgeon"
job_icon = "medicaldoctor"
jobtype = /datum/job/doctor
diff --git a/code/modules/clothing/outfits/factions/gezena.dm b/code/modules/clothing/outfits/factions/gezena.dm
index f34353c0e2df..e2262eb77891 100644
--- a/code/modules/clothing/outfits/factions/gezena.dm
+++ b/code/modules/clothing/outfits/factions/gezena.dm
@@ -11,6 +11,7 @@
//Playable Roles (put in ships):
/datum/outfit/job/gezena/assistant
name = "PGF - Crewman"
+ id_assignment = "Crewman"
jobtype = /datum/job/assistant
job_icon = "assistant"
@@ -20,6 +21,7 @@
/datum/outfit/job/gezena/engineer
name = "PGF - Navy Engineer"
+ id_assignment = "Naval Engineer"
jobtype = /datum/job/engineer
job_icon = "stationengineer"
@@ -38,6 +40,7 @@
/datum/outfit/job/gezena/security
name = "PGF - Marine"
+ id_assignment = "Marine"
jobtype = /datum/job/officer
job_icon = "securityofficer"
@@ -47,6 +50,7 @@
/datum/outfit/job/gezena/hos
name = "PGF - Marine Sergeant"
+ id_assignment = "Sergeant"
jobtype = /datum/job/hos
job_icon = "headofsecurity"
diff --git a/code/modules/clothing/outfits/factions/inteq.dm b/code/modules/clothing/outfits/factions/inteq.dm
index fe0178cc28c3..75a36b1a3132 100644
--- a/code/modules/clothing/outfits/factions/inteq.dm
+++ b/code/modules/clothing/outfits/factions/inteq.dm
@@ -20,6 +20,7 @@
/datum/outfit/job/inteq/assistant
name = "IRMG - Recruit"
+ id_assignment = "Recruit"
jobtype = /datum/job/assistant
job_icon = "assistant"
@@ -29,6 +30,7 @@
/datum/outfit/job/inteq/captain
name = "IRMG - Vanguard (Naked)"
+ id_assignment = "Vanguard"
jobtype = /datum/job/captain
job_icon = "captain"
@@ -55,6 +57,7 @@
/datum/outfit/job/inteq/captain/honorable
name = "IRMG - Honorable Vanguard"
+ id_assignment = "Honorable Vanguard"
head = /obj/item/clothing/head/beret/sec/hos/inteq/honorable
uniform = /obj/item/clothing/under/syndicate/inteq/honorable
@@ -65,19 +68,11 @@
belt = /obj/item/storage/belt/military/assault
glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq
-/datum/outfit/job/inteq/captain/honorable/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- if(visualsOnly)
- return
-
- var/obj/item/card/id/W = H.wear_id
- W.assignment = "Honorable Vanguard"
- W.update_label()
-
///Chief Engineer
/datum/outfit/job/inteq/ce
name = "IRMG - Artificer Class II"
+ id_assignment = "Artificer Class II"
job_icon = "chiefengineer"
jobtype = /datum/job/chief_engineer
@@ -101,6 +96,7 @@
/datum/outfit/job/inteq/paramedic
name = "IRMG - Corpsman"
+ id_assignment = "Corpsman"
job_icon = "paramedic"
jobtype = /datum/job/paramedic
@@ -115,7 +111,7 @@
backpack_contents = list(/obj/item/roller=1)
/datum/outfit/job/inteq/paramedic/empty
- name = "IRMG Corpsman (Inteq) (Naked)"
+ name = "IRMG - Corpsman (Naked)"
head = null
suit = null
@@ -126,6 +122,7 @@
/datum/outfit/job/inteq/security
name = "IRMG - Enforcer"
+ id_assignment = "Enforcer"
jobtype = /datum/job/officer
job_icon = "securityofficer"
@@ -171,6 +168,7 @@
/datum/outfit/job/inteq/engineer
name = "IRMG - Artificer"
+ id_assignment = "Artificer"
job_icon = "stationengineer"
jobtype = /datum/job/engineer
@@ -184,6 +182,7 @@
/datum/outfit/job/inteq/warden
name = "IRMG - Master At Arms"
+ id_assignment = "Master at Arms"
jobtype = /datum/job/warden
job_icon = "warden"
@@ -205,7 +204,8 @@
// cmo
/datum/outfit/job/inteq/cmo
- name = "IRMG Honorable Corpsman (Inteq)"
+ name = "IRMG - Honorable Corpsman"
+ id_assignment = "Honorable Corpsman"
jobtype = /datum/job/cmo
job_icon = "chiefmedicalofficer"
diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm
index 103e36624c24..9de9c0d152c3 100644
--- a/code/modules/clothing/outfits/factions/minutemen.dm
+++ b/code/modules/clothing/outfits/factions/minutemen.dm
@@ -263,6 +263,7 @@
/datum/outfit/job/clip/minutemen/deckhand
name = "CLIP Minutemen - Deckhand"
+ id_assignment = "Deckhand"
job_icon = "clip_navy1"
jobtype = /datum/job/assistant
uniform = /obj/item/clothing/under/clip
@@ -298,6 +299,7 @@
/datum/outfit/job/clip/minutemen/captain/general
name = "CLIP Minutemen - General"
+ id_assignment = "General"
job_icon = "clip_cmm6"
head = /obj/item/clothing/head/clip/slouch/officer
@@ -309,29 +311,14 @@
box = /obj/item/storage/box/survival/engineer/radio
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/gun/ballistic/revolver/mateba=1)
-/datum/outfit/job/clip/minutemen/captain/general/post_equip(mob/living/carbon/human/H, visualsOnly)
- . = ..()
- var/obj/item/card/id/W = H.wear_id
- if(W)
- W.registered_name = H.real_name
- W.assignment = "General"
- W.update_label()
-
/datum/outfit/job/clip/minutemen/captain/general/admiral // for flavor, might remove outright
name = "CLIP Minutemen - Admiral"
+ id_assignment = "Admiral"
job_icon = "clip_navy6"
head = /obj/item/clothing/head/clip/bicorne
suit = /obj/item/clothing/suit/armor/vest/capcarapace/clip/admiral
-/datum/outfit/job/clip/minutemen/captain/general/admiral/post_equip(mob/living/carbon/human/H, visualsOnly)
- . = ..()
- var/obj/item/card/id/W = H.wear_id
- if(W)
- W.registered_name = H.real_name
- W.assignment = "Admiral"
- W.update_label()
-
///chemist
/datum/outfit/job/clip/minutemen/chemist
@@ -353,6 +340,7 @@
/datum/outfit/job/clip/minutemen/head_of_personnel
name = "CLIP Minutemen - Bridge Officer"
+ id_assignment = "Bridge Officer"
job_icon = "clip_navy3"
jobtype = /datum/job/head_of_personnel
@@ -374,6 +362,7 @@
/datum/outfit/job/clip/minutemen/doctor
name = "CLIP Minutemen - Corpsman"
+ id_assignment = "Corpsman"
job_icon = "clip_navy2"
jobtype = /datum/job/doctor
@@ -416,6 +405,7 @@
/datum/outfit/job/clip/minutemen/vehicle_crew
name = "CLIP Minutemen - Vehicle Crewman"
+ id_assignment = "Vehicle Crewman"
job_icon = "clip_mech1"
jobtype = /datum/job/roboticist
@@ -433,6 +423,7 @@
/datum/outfit/job/clip/minutemen/vehicle_pilot
name = "CLIP Minutemen - Vehicle Pilot"
+ id_assignment = "Pilot"
job_icon = "clip_mech2"
jobtype = /datum/job/mining
@@ -447,6 +438,7 @@
/datum/outfit/job/clip/minutemen/vehicle_pilot/commander
name = "CLIP Minutemen - Vehicle Commander"
+ id_assignment = "Vehicle Commander"
job_icon = "clip_mech3"
suit = /obj/item/clothing/suit/jacket/miljacket
@@ -454,6 +446,7 @@
/datum/outfit/job/clip/minutemen/vehicle_crew/coordinator
name = "CLIP Minutemen - Vehicle Traffic Coordinator"
+ id_assignment = "Traffic Coordinator"
job_icon = "clip_mech4"
jobtype = /datum/job/roboticist
@@ -499,6 +492,7 @@
/datum/outfit/job/clip/minutemen/grunt
name = "CLIP Minutemen - Minuteman"
+ id_assignment = "Minuteman"
jobtype = /datum/job/officer
job_icon = "clip_cmm2"
ears = /obj/item/radio/headset/alt
@@ -517,6 +511,7 @@
/datum/outfit/job/clip/minutemen/grunt/reserve
name = "CLIP Minutemen - Reservist"
+ id_assignment = "Reservist"
job_icon = "clip_cmm1"
jobtype = /datum/job/assistant
@@ -563,6 +558,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/engi
name = "CLIP Minutemen - Field Engineer (Dressed)"
+ id_assignment = "Field Engineer"
jobtype = /datum/job/engineer
accessory = /obj/item/clothing/accessory/armband/engine
@@ -576,6 +572,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/med
name = "CLIP Minutemen - Field Corpsman (Dressed)"
+ id_assignment = "Field Corpsman"
jobtype = /datum/job/doctor
accessory = /obj/item/clothing/accessory/armband/medblue
@@ -595,6 +592,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/gunner_armed
name = "CLIP Minutemen - Field Gunner (Armed - SKM-24u)" //See above, replace with CLIP LMG when added
+ id_assignment = "Machinegunner"
accessory = /obj/item/clothing/accessory/armband
belt = /obj/item/storage/belt/military/clip/gunner
@@ -606,6 +604,7 @@
/datum/outfit/job/clip/minutemen/grunt/lead
name = "CLIP Minutemen - Field Sergeant"
+ id_assignment = "Sergeant"
job_icon = "clip_cmm3"
jobtype = /datum/job/warden
@@ -632,6 +631,7 @@
/datum/outfit/job/clip/minutemen/grunt/commander
name = "CLIP Minutemen - Field Commander"
+ id_assignment = "Commander"
job_icon = "clip_cmm4"
jobtype = /datum/job/hos
@@ -646,6 +646,7 @@
/datum/outfit/job/clip/minutemen/grunt/major
name = "CLIP Minutemen - Major"
+ id_assignment = "Major"
job_icon = "clip_cmm5"
jobtype = /datum/job/captain
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index 28ff486e4dc6..f0fdb0e4ac1d 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -52,6 +52,7 @@
/datum/outfit/job/nanotrasen/captain/lp
name = "Nanotrasen - Loss Prevention Lieutenant"
+ id_assignment = "Lieutenant"
implants = list(/obj/item/implant/mindshield)
ears = /obj/item/radio/headset/nanotrasen/alt/captain
@@ -138,6 +139,7 @@
/datum/outfit/job/nanotrasen/roboticist
name = "Nanotrasen - Mech Technician"
+ id_assignment = "Mech Technician"
job_icon = "roboticist"
jobtype = /datum/job/roboticist
@@ -152,6 +154,7 @@
/datum/outfit/job/nanotrasen/pilot
name = "Nanotrasen - Pilot"
+ id_assignment = "Pilot"
uniform = /obj/item/clothing/under/rank/security/officer/military
suit = /obj/item/clothing/suit/jacket/leather/duster
@@ -177,10 +180,10 @@
chameleon_extras = /obj/item/stamp/law
/datum/outfit/job/nanotrasen/lawyer/corporaterepresentative
- name = "Nanotrasen - Lawyer (Corporate Representative)"
+ name = "Nanotrasen - Corporate Representative"
+ id_assignment = "Corporate Representative"
job_icon = "nanotrasen"
-
uniform = /obj/item/clothing/under/rank/command/head_of_personnel/suit
suit = null
ears = /obj/item/radio/headset/headset_cent
@@ -254,6 +257,7 @@
/datum/outfit/job/nanotrasen/security/mech_pilot
name = "Nanotrasen - Mech Pilot"
+ id_assignment = "Mech Pilot"
uniform = /obj/item/clothing/under/rank/security/officer/military/eng
head = /obj/item/clothing/head/beret/sec/officer
@@ -262,6 +266,7 @@
/datum/outfit/job/nanotrasen/security/lp
name = "Nanotrasen - LP Security Specialist"
+ id_assignment = "Security Specialist"
implants = list(/obj/item/implant/mindshield)
ears = /obj/item/radio/headset/nanotrasen/alt/captain
@@ -396,6 +401,7 @@
/datum/outfit/job/nanotrasen/doctor/lp
name = "Nanotrasen - LP Medical Specialist"
+ id_assignment = "Medical Specialist"
implants = list(/obj/item/implant/mindshield)
ears = /obj/item/radio/headset/nanotrasen/alt/captain
diff --git a/code/modules/clothing/outfits/factions/roumain.dm b/code/modules/clothing/outfits/factions/roumain.dm
index 4cf4e56005e9..424827e69010 100644
--- a/code/modules/clothing/outfits/factions/roumain.dm
+++ b/code/modules/clothing/outfits/factions/roumain.dm
@@ -17,6 +17,7 @@
/datum/outfit/job/roumain/assistant
name = "Saint-Roumain Militia - Shadow"
+ id_assignment = "Shadow"
jobtype = /datum/job/assistant
job_icon = "assistant"
@@ -31,6 +32,7 @@
/datum/outfit/job/roumain/captain
name = "Saint-Roumain Militia - Hunter Montagne"
+ id_assignment = "Hunter Montagne"
job_icon = "captain"
jobtype = /datum/job/captain
@@ -54,6 +56,7 @@
/datum/outfit/job/roumain/security
name = "Saint-Roumain Militia - Hunter"
+ id_assignment = "Hunter"
jobtype = /datum/job/officer
job_icon = "securityofficer"
@@ -75,6 +78,7 @@
/datum/outfit/job/roumain/doctor
name = "Saint-Roumain Militia - Hunter Doctor"
+ id_assignment = "Hunter Doctor"
job_icon = "medicaldoctor"
jobtype = /datum/job/doctor
diff --git a/code/modules/clothing/outfits/factions/solgov.dm b/code/modules/clothing/outfits/factions/solgov.dm
index 33463c498581..972b863bbbda 100644
--- a/code/modules/clothing/outfits/factions/solgov.dm
+++ b/code/modules/clothing/outfits/factions/solgov.dm
@@ -11,6 +11,7 @@
/datum/outfit/job/solgov/assistant
name = "SolGov - Scribe"
+ id_assignment = "Scribe"
jobtype = /datum/job/assistant
job_icon = "scribe"
@@ -21,6 +22,7 @@
/datum/outfit/job/solgov/bureaucrat
name = "SolGov - Bureaucrat"
+ id_assignment = "Bureaucrat"
jobtype = /datum/job/curator
job_icon = "curator"
@@ -61,6 +63,7 @@
/datum/outfit/job/solgov/sonnensoldner
name = "SolGov - Sonnensöldner"
+ id_assignment = "Sonnensöldner"
jobtype = /datum/job/officer
job_icon = "sonnensoldner"
@@ -103,6 +106,7 @@
/datum/outfit/job/solgov/overseer
name = "SolGov - Overseer"
+ id_assignment = "Overseer"
jobtype = /datum/job/head_of_personnel
job_icon = "headofpersonnel"
@@ -140,6 +144,7 @@
/datum/outfit/job/solgov/miner
name = "SolGov - Field Engineer"
+ id_assignment = "Field Engineer"
jobtype = /datum/job/mining
job_icon = "shaftminer"
@@ -181,8 +186,9 @@
/datum/outfit/job/solgov/patient
name = "SolGov - Attentive Care Patient"
+ id_assignment = "Attentive Care Patient"
jobtype = /datum/job/prisoner
- job_icon = "assistant" // todo: bug rye for patient icon
+ job_icon = "assistant" // todo: bug rye for patient icon // rye. rye. give me 50 gazillion billion dollars paypal
id = /obj/item/card/id/patient
uniform = /obj/item/clothing/under/rank/medical/gown
@@ -191,6 +197,7 @@
/datum/outfit/job/solgov/engineer
name = "SolGov - Ship Engineer"
+ id_assignment = "Ship Engineer"
jobtype = /datum/job/engineer
job_icon = "stationengineer"
@@ -213,6 +220,7 @@
/datum/outfit/job/solgov/quartermaster
name = "SolGov - Logistics Deck Officer"
+ id_assignment = "Logistics Deck Officer"
jobtype = /datum/job/qm
job_icon = "quartermaster"
diff --git a/code/modules/clothing/outfits/factions/syndicate.dm b/code/modules/clothing/outfits/factions/syndicate.dm
index 5eb0b9e5bac8..44199ac361a3 100644
--- a/code/modules/clothing/outfits/factions/syndicate.dm
+++ b/code/modules/clothing/outfits/factions/syndicate.dm
@@ -31,6 +31,7 @@
/datum/outfit/job/syndicate/assistant
name = "Syndicate - Junior Agent"
+ id_assignment = "Junior Agent"
jobtype = /datum/job/assistant
job_icon = "assistant"
@@ -60,6 +61,7 @@
/datum/outfit/job/syndicate/assistant/gec
name = "Syndicate - Deckhand (GEC)"
+ id_assignment = "Deckhand"
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/toggle/hazard
@@ -76,6 +78,7 @@
/datum/outfit/job/syndicate/assistant/twink
name = "Syndicate - Deck Assistant (Twinkleshine)"
+ id_assignment = "Deck Assistant"
uniform = /obj/item/clothing/under/syndicate
mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
@@ -101,6 +104,7 @@
/datum/outfit/job/syndicate/assistant/suns
name = "Syndicate - Freshman (SUNS)"
+ id_assignment = "Freshman"
uniform = /obj/item/clothing/under/syndicate/suns
alt_uniform = /obj/item/clothing/under/syndicate/suns/alt
@@ -118,12 +122,14 @@
/datum/outfit/job/syndicate/assistant/suns/halfway
name = "Syndicate - Junior (SUNS)"
+ id_assignment = "Junior"
uniform = /obj/item/clothing/under/syndicate/suns/uniform2
alt_uniform = /obj/item/clothing/under/syndicate/suns/uniform2/alt
/datum/outfit/job/syndicate/assistant/suns/complete
name = "Syndicate - Graduate (SUNS)"
+ id_assignment = "Graduate"
uniform = /obj/item/clothing/under/syndicate/suns/uniform3
alt_uniform = /obj/item/clothing/under/syndicate/suns/uniform3/alt
@@ -226,6 +232,7 @@
/datum/outfit/job/syndicate/botanist/suns
name = "Syndicate - Botanist-Chemist (SUNS)"
+ id_assignment = "Botanist-Chemist"
uniform = /obj/item/clothing/under/syndicate/suns/sciencejumpsuit
id = /obj/item/card/id/syndicate_command/crew_id
@@ -269,6 +276,7 @@
/datum/outfit/job/syndicate/captain/twink
name = "Flotilla Admiral (Twinkleshine, ACLF)"
+ id_assignment = "Flotilla Admiral"
uniform = /obj/item/clothing/under/syndicate/ngr/officer
head = null
@@ -337,6 +345,7 @@
/datum/outfit/job/syndicate/cargo_tech/donk
name = "Syndicate - Customer Associate (Donk)"
+ id_assignment = "Customer Associate"
//chemist
@@ -416,6 +425,7 @@
/datum/outfit/job/syndicate/cmo
name = "Syndicate - Medical Director (Cybersun)"
+ id_assignment = "Medical Director"
jobtype = /datum/job/cmo
job_icon = "chiefmedicalofficer"
@@ -432,6 +442,7 @@
/datum/outfit/job/syndicate/cmo/suns
name = "Syndicate - Medical Instructor (SUNS)"
+ id_assignment = "Medical Instructor"
uniform = /obj/item/clothing/under/syndicate/suns/doctorscrubs
ears = /obj/item/radio/headset/syndicate/alt/captain
@@ -456,6 +467,7 @@
/datum/outfit/job/syndicate/head_of_personnel
name = "Syndicate - Bridge Officer"
+ id_assignment = "Bridge Officer"
jobtype = /datum/job/head_of_personnel
job_icon = "headofpersonnel"
@@ -472,6 +484,7 @@
/datum/outfit/job/syndicate/head_of_personnel/cybersun
name = "Syndicate - Intelligence Officer (Cybersun)"
+ id_assignment = "Intelligence Officer"
ears = /obj/item/radio/headset/syndicate/alt
uniform = /obj/item/clothing/under/syndicate/cybersun/officer
@@ -485,6 +498,7 @@
/datum/outfit/job/syndicate/head_of_personnel/suns
name = "Syndicate - Academic Staff (SUNS)"
+ id_assignment = "Academic Staff"
uniform = /obj/item/clothing/under/syndicate/suns/xo
suit = /obj/item/clothing/suit/armor/vest/bulletproof/suns/xo
@@ -522,9 +536,11 @@
/datum/outfit/job/syndicate/hos/gorlex
name = "Syndicate - Sergeant (Gorlex)"
+ id_assignment = "Sergeant"
/datum/outfit/job/syndicate/hos/twink
name = "Syndicate - Lieutenant (Twinkleshine, NGR)"
+ id_assignment = "Lieutenant"
job_icon = "lieutenant"
uniform = /obj/item/clothing/under/syndicate/ngr/officer
@@ -557,6 +573,8 @@
/datum/outfit/job/syndicate/hos/suns
name = "Syndicate - Senior Peacekeeper (SUNS)"
+ id_assignment = "Senior Peacekeeper"
+
uniform = /obj/item/clothing/under/syndicate/suns/pkuniform
suit = /obj/item/clothing/suit/armor/vest/bulletproof/suns/hos
belt = /obj/item/melee/sabre/suns/telescopic
@@ -578,6 +596,7 @@
/datum/outfit/job/syndicate/hos/suns/twink
name = "Syndicate - Redshield Officer (Twinkleshine, SUNS)"
+ id_assignment = "Redshield Officer"
suit = null
mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
@@ -665,6 +684,7 @@
/datum/outfit/job/syndicate/paramedic/cybersun
name = "Syndicate - Field Medic (Cybersun Industries)"
+ id_assignment = "Field Medic"
uniform = /obj/item/clothing/under/syndicate/medic
head = /obj/item/clothing/head/soft/cybersun/medical
@@ -736,6 +756,7 @@
/datum/outfit/job/syndicate/patient
name = "Syndicate - Long Term Patient"
+ id_assignment = "Long Term Patient"
jobtype = /datum/job/prisoner
job_icon = "assistant"
@@ -800,6 +821,7 @@
/datum/outfit/job/syndicate/security
name = "Syndicate - Operative"
+ id_assignment = "Operative"
jobtype = /datum/job/officer
job_icon = "securityofficer"
@@ -856,6 +878,8 @@
/datum/outfit/job/syndicate/security/suns
name = "Syndicate - Peacekeeper (SUNS)"
+ id_assignment = "Peacekeeper"
+
uniform = /obj/item/clothing/under/syndicate/suns/pkuniform
suit = /obj/item/clothing/suit/armor/vest/bulletproof/suns
alt_suit = /obj/item/clothing/suit/toggle/suns/pkcoat
@@ -891,6 +915,7 @@
/datum/outfit/job/syndicate/miner/gorlex
name = "Syndicate - Wrecker (Gorlex Marauders)"
+ id_assignment = "Wrecker"
uniform = /obj/item/clothing/under/syndicate/gorlex
shoes = /obj/item/clothing/shoes/workboots
@@ -923,6 +948,7 @@
/datum/outfit/job/syndicate/miner/cybersun
name = "Syndicate - Field Agent (Cybersun)"
+ id_assignment = "Field Agent"
id = /obj/item/card/id/syndicate_command/crew_id
ears = /obj/item/radio/headset
@@ -949,6 +975,7 @@
/datum/outfit/job/syndicate/engineer
name = "Syndicate - Ship Technician"
+ id_assignment = "Ship Technician"
jobtype = /datum/job/engineer
job_icon = "stationengineer"
@@ -969,6 +996,7 @@
/datum/outfit/job/syndicate/engineer/gec
name = "Syndicate - Ship Engineer (GEC)"
+ id_assignment = "Ship Engineer"
uniform = /obj/item/clothing/under/syndicate/gec
alt_uniform = null
@@ -978,6 +1006,7 @@
/datum/outfit/job/syndicate/engineer/gorlex
name = "Syndicate - Mechanic (Gorlex Marauders)"
+ id_assignment = "Mechanic"
uniform = /obj/item/clothing/under/syndicate/gorlex
shoes = /obj/item/clothing/shoes/workboots
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index d060dc1c2969..318de66636e7 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -577,12 +577,33 @@
name = "fortune cookie"
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
+ trash = /obj/item/paper/paperslip
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 3)
filling_color = "#F4A460"
tastes = list("cookie" = 1)
foodtype = GRAIN | SUGAR
+/obj/item/reagent_containers/food/snacks/fortunecookie/proc/get_fortune()
+ var/atom/drop_location = drop_location()
+ var/obj/item/paper/fortune = locate(/obj/item/paper) in src
+ // If a fortune exists, use that.
+ if (fortune)
+ fortune.forceMove(drop_location)
+ return fortune
+
+ // Otherwise, use a generic one
+ var/obj/item/paper/paperslip/fortune_slip = new trash(drop_location)
+ fortune_slip.name = "fortune slip"
+ // if someone adds lottery tickets in the future, be sure to add random numbers to this
+ fortune_slip.add_raw_text(pick(GLOB.wisdoms))
+
+ return fortune_slip
+
+/obj/item/reagent_containers/food/snacks/fortunecookie/generate_trash()
+ if(trash)
+ get_fortune()
+
/obj/item/reagent_containers/food/snacks/poppypretzel
name = "poppy pretzel"
desc = "It's all twisted up!"
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index f46d7768b1f7..67d45dd8d058 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -194,6 +194,8 @@
var/job_icon
// the background of the job icon
var/faction_icon
+ // if there is an id, this will get automatically applied to an id's assignment variable
+ var/id_assignment
var/alt_uniform
@@ -280,6 +282,9 @@
C.registered_age = H.age
C.job_icon = job_icon
C.faction_icon = faction_icon
+ C.update_appearance()
+ if(id_assignment)
+ C.assignment = id_assignment
C.update_label()
for(var/A in SSeconomy.bank_accounts)
var/datum/bank_account/B = A
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 74ee81bf687c..4e8168fc60d6 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -269,6 +269,15 @@
if(..())
playsound(user.loc, 'sound/machines/chime.ogg', 50)
+/datum/emote/living/carbon/human/robot_tongue/no
+ key = "no"
+ key_third_person = "no"
+ message = "emits an negative blip."
+
+/datum/emote/living/carbon/human/robot_tongue/no/run_emote(mob/user, params)
+ if(..())
+ playsound(user.loc, 'sound/machines/synth_no.ogg', 50)
+
/datum/emote/living/carbon/human/robot_tongue/ping
key = "ping"
key_third_person = "pings"
@@ -279,28 +288,32 @@
if(..())
playsound(user.loc, 'sound/machines/ping.ogg', 50)
-// Clown Robotic Tongue ONLY. Henk.
+/datum/emote/living/carbon/human/robot_tongue/warn
+ key = "warn"
+ key_third_person = "warn"
+ message = "blares an alarm!"
-/datum/emote/living/carbon/human/robot_tongue/clown/can_run_emote(mob/user, status_check = TRUE , intentional)
- if(!..())
- return FALSE
- if(user.mind.assigned_role == "Clown")
- return TRUE
+/datum/emote/living/carbon/human/robot_tongue/warn/run_emote(mob/user, params)
+ if(..())
+ playsound(user.loc, 'sound/machines/warning-buzzer.ogg', 50)
-/datum/emote/living/carbon/human/robot_tongue/clown/honk
- key = "honk"
- key_third_person = "honks"
- message = "honks."
+/datum/emote/living/carbon/human/robot_tongue/yes
+ key = "yes"
+ key_third_person = "yes"
+ message = "emits an affirmative blip."
-/datum/emote/living/carbon/human/robot_tongue/clown/honk/run_emote(mob/user, params)
+/datum/emote/living/carbon/human/robot_tongue/yes/run_emote(mob/user, params)
if(..())
- playsound(user.loc, 'sound/items/bikehorn.ogg', 50)
+ playsound(user.loc, 'sound/machines/synth_yes.ogg', 50)
+
+// the following emote were originally clown-locked and synthetic exclusive
+// since clowns have been removed I see no reason to let it collect dust
-/datum/emote/living/carbon/human/robot_tongue/clown/sad
+/datum/emote/living/carbon/human/robot_tongue/sad
key = "sad"
key_third_person = "plays a sad trombone..."
message = "plays a sad trombone..."
-/datum/emote/living/carbon/human/robot_tongue/clown/sad/run_emote(mob/user, params)
+/datum/emote/living/carbon/human/robot_tongue/sad/run_emote(mob/user, params)
if(..())
playsound(user.loc, 'sound/misc/sadtrombone.ogg', 50)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5983d8100112..b240836b55e7 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -93,6 +93,10 @@
//Called when we bump onto a mob
/mob/living/proc/MobBump(mob/M)
+ //No bumping/swapping/pushing others if you are on walk intent
+ if(m_intent == MOVE_INTENT_WALK)
+ return TRUE
+
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 405cda36580c..1f574f08a450 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -183,7 +183,7 @@
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE)
if(be_close && !in_range(M, src))
- to_chat(src, "You are too far away!")
+ to_chat(src, span_warning("You are too far away!"))
return FALSE
return TRUE
@@ -274,7 +274,7 @@
if(cable)
if(get_dist(src, cable) > 1)
var/turf/T = get_turf(src)
- T.visible_message("[cable] rapidly retracts back into its spool.", "You hear a click and the sound of wire spooling rapidly.")
+ T.visible_message(span_warning("[cable] rapidly retracts back into its spool."), span_hear("You hear a click and the sound of wire spooling rapidly."))
QDEL_NULL(cable)
if(hacking)
process_hack()
@@ -298,4 +298,17 @@
else if(istype(W, /obj/item/encryptionkey))
pai.radio.attackby(W, user, params)
else
- to_chat(user, "Encryption Key ports not configured.")
+ to_chat(user, span_alert("Encryption Key ports not configured."))
+
+//Wipe
+/mob/living/silicon/pai/verb/wipe_self()
+ var/confirm = alert("Are you sure you want to wipe your own personality? This is PERMANENT.", "Confirm Wipe", "Yes", "No")
+ if(confirm == "Yes")
+ var/turf/T = get_turf(src.loc)
+ T.visible_message(
+ span_notice("[src] flashes a message across its screen,\"Wiping core files. Please acquire a new personality to continue using pAI device functions.\""), null, \
+ span_notice("[src] bleeps electronically."))
+ death(FALSE)
+ ghostize(FALSE) // Disallows reentering body and disassociates mind
+ else
+ to_chat(src, "Aborting wipe attempt.")
diff --git a/code/modules/mob/living/silicon/pai/pai_say.dm b/code/modules/mob/living/silicon/pai/pai_say.dm
index b44d2cd0870c..cb12258317ba 100644
--- a/code/modules/mob/living/silicon/pai/pai_say.dm
+++ b/code/modules/mob/living/silicon/pai/pai_say.dm
@@ -5,4 +5,4 @@
..(message)
/mob/living/silicon/pai/binarycheck()
- return 0
+ return radio?.translate_binary
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 08e41f3bee44..061c4a74a4b1 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -355,6 +355,7 @@ GLOBAL_LIST_INIT(pai_faces_icons, list(
if("encryptionkeys")
if(href_list["toggle"])
encryptmod = TRUE
+ radio.subspace_transmission = TRUE
if("translator")
if(href_list["toggle"]) //This is permanent.
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index 444131374515..08adddd7dad8 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -25,12 +25,10 @@
message = "chimes."
sound = 'sound/machines/chime.ogg'
-/datum/emote/silicon/honk
- key = "honk"
- key_third_person = "honks"
- message = "honks."
- vary = TRUE
- sound = 'sound/items/bikehorn.ogg'
+/datum/emote/silicon/no
+ key = "no"
+ message = "emits an negative blip."
+ sound = 'sound/machines/synth_no.ogg'
/datum/emote/silicon/ping
key = "ping"
@@ -48,3 +46,8 @@
key = "warn"
message = "blares an alarm!"
sound = 'sound/machines/warning-buzzer.ogg'
+
+/datum/emote/silicon/yes
+ key = "yes"
+ message = "emits an affirmative blip."
+ sound = 'sound/machines/synth_yes.ogg'
diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm
index a3102c6dfdf2..74489d8b84f3 100644
--- a/code/modules/modular_computers/file_system/programs/card.dm
+++ b/code/modules/modular_computers/file_system/programs/card.dm
@@ -179,6 +179,7 @@
return
id_card.registered_name = new_name
id_card.update_label()
+ id_card.update_appearance()
playsound(computer, "terminal_type", 50, FALSE)
return TRUE
if("PRG_assign")
diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm
index 1779192f0cb2..bbd56e892095 100644
--- a/code/modules/overmap/ships/controlled_ship_datum.dm
+++ b/code/modules/overmap/ships/controlled_ship_datum.dm
@@ -36,9 +36,13 @@
var/list/datum/mission/missions
/// The maximum number of currently active missions that a ship may take on.
var/max_missions = 2
- /// Manifest list of people on the ship
+
+ /// Manifest list of people on the ship. Indexed by mob REAL NAME. value is JOB INSTANCE
var/list/manifest = list()
+ /// List of mob refs indexed by their job instance
+ var/list/datum/weakref/job_holder_refs = list()
+
var/list/datum/mind/owner_candidates
/// The mob of the current ship owner. Tracking mostly uses this; that lets us pick up on logouts, which let us
@@ -130,6 +134,7 @@
if(!QDELETED(shipkey))
QDEL_NULL(shipkey)
QDEL_LIST(manifest)
+ job_holder_refs.Cut()
job_slots.Cut()
blacklisted.Cut()
for(var/a_key in applications)
@@ -298,6 +303,10 @@
if(!owner_mob)
set_owner_mob(H)
+ if(!(human_job in job_holder_refs))
+ job_holder_refs[human_job] = list()
+ job_holder_refs[human_job] += WEAKREF(H)
+
/datum/overmap/ship/controlled/proc/set_owner_mob(mob/new_owner)
if(owner_mob)
// we (hopefully) don't have to hook qdeletion,
diff --git a/code/modules/overmap/ships/owner_action.dm b/code/modules/overmap/ships/owner_action.dm
index 04169054b2e6..96c97bdf5423 100644
--- a/code/modules/overmap/ships/owner_action.dm
+++ b/code/modules/overmap/ships/owner_action.dm
@@ -65,6 +65,34 @@
ui = new(user, src, "ShipOwner", name)
ui.open()
+/datum/action/ship_owner/proc/allow_job_slot_increase(datum/job/job_target)
+ var/default_slots = parent_ship.source_template.job_slots[job_target]
+ var/current_slots = parent_ship.job_slots[job_target]
+
+ var/used_slots = 0
+ var/job_holders = parent_ship.job_holder_refs[job_target]
+
+ for(var/datum/weakref/job_holder_ref as anything in job_holders)
+ var/mob/living/job_holder = job_holder_ref.resolve()
+ if(isnull(job_holder))
+ continue
+
+ if(job_holder.client)
+ used_slots += 1
+ continue
+
+ var/mob/dead/observer/job_holder_ghost
+ for(var/mob/dead/observer/ghost in GLOB.dead_mob_list)
+ if(ghost.mind == job_holder.mind)
+ job_holder_ghost = ghost
+ break
+ if(!isnull(job_holder_ghost))
+ used_slots += 1
+ continue
+
+ var/actual_slots = current_slots + used_slots
+ return actual_slots < default_slots
+
/datum/action/ship_owner/ui_data(mob/user)
. = list()
.["memo"] = parent_ship.memo
@@ -72,6 +100,7 @@
.["pending"] = FALSE
.["joinMode"] = parent_ship.join_mode
.["cooldown"] = COOLDOWN_TIMELEFT(parent_ship, job_slot_adjustment_cooldown)
+ .["isAdmin"] = !!user.client?.holder
.["applications"] = list()
for(var/a_key as anything in parent_ship.applications)
var/datum/ship_application/app = parent_ship.applications[a_key]
@@ -85,6 +114,10 @@
text = app.app_msg,
status = app.status
))
+ var/list/job_increase_allowed = list()
+ for(var/datum/job/job as anything in parent_ship.job_slots)
+ job_increase_allowed[job.name] = allow_job_slot_increase(job)
+ .["jobIncreaseAllowed"] = job_increase_allowed
/datum/action/ship_owner/ui_static_data(mob/user)
. = list()
@@ -197,18 +230,21 @@
if(!target_job || target_job.officer || !COOLDOWN_FINISHED(parent_ship, job_slot_adjustment_cooldown))
return TRUE
+ var/change_amount = params["delta"]
+ if(change_amount > 0 && !allow_job_slot_increase(target_job))
+ if(!user.client.holder)
+ to_chat(user, span_warning("You cannot increase the number of slots for this job."))
+ return TRUE
+ message_admins("[key_name_admin(user)] has increased the number of slots for [target_job.name] on [parent_ship.name] by [change_amount].")
+
+ var/new_amount = parent_ship.job_slots[target_job] + change_amount
var/job_default_slots = parent_ship.source_template.job_slots[target_job]
var/job_max_slots = min(job_default_slots * 2, job_default_slots + 3)
- var/new_slots = parent_ship.job_slots[target_job] + params["delta"]
- if(new_slots < 0 || new_slots > job_max_slots)
+ if(new_amount < 0 || new_amount > job_max_slots)
return TRUE
- var/cooldown_time = 5 SECONDS
- if(params["delta"] > 0 && new_slots > job_default_slots)
- cooldown_time = 2 MINUTES
- COOLDOWN_START(parent_ship, job_slot_adjustment_cooldown, cooldown_time * cooldown_coeff)
-
- parent_ship.job_slots[target_job] = new_slots
+ COOLDOWN_START(parent_ship, job_slot_adjustment_cooldown, (5 SECONDS) * cooldown_coeff)
+ parent_ship.job_slots[target_job] = new_amount
update_static_data(user)
return TRUE
diff --git a/code/modules/paperwork/biscuit.dm b/code/modules/paperwork/biscuit.dm
new file mode 100644
index 000000000000..38776e5005bf
--- /dev/null
+++ b/code/modules/paperwork/biscuit.dm
@@ -0,0 +1,104 @@
+/obj/item/folder/biscuit
+ name = "\proper biscuit card"
+ desc = "An biscuit card. Has label which says DO NOT DIGEST."
+ icon_state = "paperbiscuit"
+ bg_color = "#ffffff"
+ w_class = WEIGHT_CLASS_TINY
+ max_integrity = 130
+ drop_sound = 'sound/items/handling/disk_drop.ogg'
+ pickup_sound = 'sound/items/handling/disk_pickup.ogg'
+ /// Is biscuit cracked open or not?
+ var/cracked = FALSE
+
+/obj/item/folder/biscuit/update_overlays()
+ . = ..()
+ if(contents.len) //This is to prevent the not-sealed biscuit to have the folder_paper overlay when it gets sealed
+ . -= "folder_paper"
+ if(cracked) //Shows overlay only when it has content and is cracked open
+ . += "paperbiscuit_paper"
+
+///Checks if the biscuit has been already cracked. If its not then it dipsplays "unopened!" ballon alert. If it is cracked then it lets the code continue.
+/obj/item/folder/biscuit/proc/crack_check(mob/user)
+ if (cracked)
+ return TRUE
+ balloon_alert(user, "unopened!")
+ return FALSE
+
+/obj/item/folder/biscuit/examine()
+ . = ..()
+ if(!cracked)
+ . += span_notice("To reach contents you need to crack it open.")
+
+//All next is done so you can't reach contents, or put any new contents when its not cracked open
+/obj/item/folder/biscuit/remove_item(obj/item/item, mob/user)
+ if (!crack_check(user))
+ return
+
+ return ..()
+
+/obj/item/folder/biscuit/attack_hand(mob/user, list/modifiers)
+ if (LAZYACCESS(modifiers, RIGHT_CLICK) && !crack_check(user))
+ return
+
+ return ..()
+
+/obj/item/folder/biscuit/attackby(obj/item/weapon, mob/user, params)
+ if (is_type_in_typecache(weapon, folder_insertables) && !crack_check(user))
+ return
+
+ return ..()
+
+/obj/item/folder/biscuit/attack_self(mob/user)
+ add_fingerprint(user)
+ if (!cracked)
+ if (tgui_alert(user, "Do you want to crack it open?", "Biscuit Cracking", list("Yes", "No")) != "Yes")
+ return
+ cracked = TRUE
+ playsound(get_turf(user), 'sound/effects/snap.ogg', 60)
+ icon_state = "[icon_state]_cracked"
+ update_appearance()
+
+ ui_interact(user)
+//Corporate "confidental" biscuit cards
+/obj/item/folder/biscuit/confidental
+ name = "\proper confidental biscuit card"
+ desc = "An confidental biscuit card. In a tasteful blue color with NT logo, looks like a chocolate bar. Has label which says DO NOT DIGEST."
+ icon_state = "paperbiscuit_secret"
+ bg_color = "#355e9f"
+
+//Biscuits which start not-sealed/cracked initially for the crafting, printing and such
+/obj/item/folder/biscuit/unsealed
+ name = "\proper biscuit card"
+ desc = "An biscuit card. Has a label which says DO NOT DIGEST."
+ icon_state = "paperbiscuit_cracked"
+ cracked = TRUE
+ ///Was the biscuit already sealed by players? To prevent several tgui alerts
+ var/sealed = FALSE
+ ///What is the sprite for when its not cracked? As it starts already cracked, and for re-sealing needs to have a sprite
+ var/not_cracked_icon = "paperbiscuit"
+
+/obj/item/folder/biscuit/unsealed/examine()
+ . = ..()
+ if(!sealed)
+ . += span_notice("This one have not been sealed yet. You many insert anything to seal it by pressing it in hand. Once sealed, the contents are inaccessible until cracked open (irreversible).")
+
+//Asks if you want to seal the biscuit, after you do that it behaves like normal paper biscuit.
+/obj/item/folder/biscuit/unsealed/attack_self(mob/user)
+ add_fingerprint(user)
+ if (!sealed)
+ if (tgui_alert(user, "Do you want to seal it? You must crack it open to reach the contents again!", "Biscuit Sealing", list("Yes", "No")) != "Yes")
+ return
+ cracked = FALSE
+ sealed = TRUE
+ playsound(get_turf(user), 'sound/items/tape.ogg', 60)
+ icon_state = "[not_cracked_icon]"
+ update_appearance()
+
+ return ..()
+
+/obj/item/folder/biscuit/unsealed/confidental
+ name = "\proper confidental biscuit card"
+ desc = "An confidental biscuit card. In a tasteful blue color with NT logo, looks like a chocolate bar. To reach contents you need to crack it open. Has label which says DO NOT DIGEST."
+ icon_state = "paperbiscuit_secret_cracked"
+ bg_color = "#355e9f"
+ not_cracked_icon = "paperbiscuit_secret"
diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm
index 5fb2731c7b4d..bbf0f59afe94 100644
--- a/code/modules/paperwork/carbonpaper.dm
+++ b/code/modules/paperwork/carbonpaper.dm
@@ -17,7 +17,7 @@
. = ..()
if(copied)
return
- . += span_notice("Right-click to tear off the carbon-copy (you must use both hands).")
+ . += span_notice("Alt-click to tear off the carbon-copy (you must use both hands).")
/obj/item/paper/carbon/proc/removecopy(mob/living/user)
if(copied)
@@ -34,3 +34,8 @@
/obj/item/paper/carbon_copy
icon_state = "cpaper"
+
+/obj/item/paper/carbon/AltClick(mob/living/carbon/user, obj/item/I)
+ . = ..()
+ if(!copied)
+ removecopy(user)
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index 462c75c18184..54b9b8268cf9 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -1,3 +1,6 @@
+/**
+ * Clipboard
+ */
/obj/item/clipboard
name = "clipboard"
icon = 'icons/obj/bureaucracy.dmi'
@@ -7,115 +10,166 @@
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 7
- var/obj/item/pen/haspen //The stored pen.
- var/obj/item/paper/toppaper //The topmost piece of paper.
slot_flags = ITEM_SLOT_BELT
resistance_flags = FLAMMABLE
+ // The stored pen
+ var/obj/item/pen/pen
+
+// Weakref of the topmost piece of paper
+//
+// This is used for the paper displayed on the clipboard's icon
+// and it is the one attacked, when attacking the clipboard.
+// (As you can't organise contents directly in BYOND)
+
+ var/datum/weakref/toppaper_ref
/obj/item/clipboard/Initialize()
update_appearance()
. = ..()
/obj/item/clipboard/Destroy()
- QDEL_NULL(haspen)
- QDEL_NULL(toppaper) //let movable/Destroy handle the rest
+ QDEL_NULL(pen)
return ..()
+/obj/item/clipboard/examine()
+ . = ..()
+ if(pen)
+ . += "Alt-click to remove [pen]."
+ var/obj/item/paper/toppaper = toppaper_ref?.resolve()
+ if(toppaper)
+ . += "Ctrl-click to remove [toppaper]."
+
+/// Take out the topmost paper
+/obj/item/clipboard/proc/remove_paper(obj/item/paper/paper, mob/user)
+ if(!istype(paper))
+ return
+ paper.forceMove(user.loc)
+ user.put_in_hands(paper)
+ to_chat(user, "You remove [paper] from [src].")
+ var/obj/item/paper/toppaper = toppaper_ref?.resolve()
+ if(paper == toppaper)
+ toppaper_ref = null
+ var/obj/item/paper/newtop = locate(/obj/item/paper) in src
+ if(newtop && (newtop != paper))
+ toppaper_ref = WEAKREF(newtop)
+ else
+ toppaper_ref = null
+ update_icon()
+
+/obj/item/clipboard/proc/remove_pen(mob/user)
+ pen.forceMove(user.loc)
+ user.put_in_hands(pen)
+ to_chat(user, "You remove [pen] from [src].")
+ pen = null
+ update_icon()
+
+/obj/item/clipboard/AltClick(mob/user)
+ ..()
+ if(pen)
+ remove_pen(user)
+
/obj/item/clipboard/update_overlays()
. = ..()
+ var/obj/item/paper/toppaper = toppaper_ref?.resolve()
if(toppaper)
. += toppaper.icon_state
. += toppaper.overlays
- if(haspen)
+ if(pen)
. += "clipboard_pen"
. += "clipboard_over"
-/obj/item/clipboard/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/paper))
- if(!user.transferItemToLoc(W, src))
+/obj/item/clipboard/CtrlClick(mob/user)
+ var/obj/item/paper/toppaper = toppaper_ref?.resolve()
+ remove_paper(toppaper, user)
+ return TRUE
+
+/obj/item/clipboard/attackby(obj/item/weapon, mob/user, params)
+ var/obj/item/paper/toppaper = toppaper_ref?.resolve()
+ if(istype(weapon, /obj/item/paper))
+ //Add paper into the clipboard
+ if(!user.transferItemToLoc(weapon, src))
return
- toppaper = W
- to_chat(user, "You clip the paper onto \the [src].")
- update_appearance()
+ toppaper_ref = WEAKREF(weapon)
+ to_chat(user, "You clip [weapon] onto [src].")
+ else if(istype(weapon, /obj/item/pen) && !pen)
+ //Add a pen into the clipboard, attack (write) if there is already one
+ if(!usr.transferItemToLoc(weapon, src))
+ return
+ pen = weapon
+ to_chat(usr, "You slot [weapon] into [src].")
else if(toppaper)
toppaper.attackby(user.get_active_held_item(), user)
- update_appearance()
-
+ update_appearance()
/obj/item/clipboard/attack_self(mob/user)
- var/dat = "Clipboard"
- if(haspen)
- dat += "Remove Pen
"
- else
- dat += "Add Pen
"
-
- //The topmost paper. You can't organise contents directly in byond, so this is what we're stuck with. -Pete
- if(toppaper)
- var/obj/item/paper/P = toppaper
- dat += "Write Remove - [P.name]
"
-
- for(P in src)
- if(P == toppaper)
- continue
- dat += "Write Remove Move to top - [P.name]
"
- user << browse(dat, "window=clipboard")
- onclose(user, "clipboard")
add_fingerprint(usr)
+ ui_interact(user)
+ return
+
+/obj/item/clipboard/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "Clipboard")
+ ui.open()
+
+/obj/item/clipboard/ui_data(mob/user)
+ // prepare data for TGUI
+ var/list/data = list()
+ data["pen"] = "[pen]"
+
+ var/obj/item/paper/toppaper = toppaper_ref?.resolve()
+ data["top_paper"] = "[toppaper]"
+ data["top_paper_ref"] = "[REF(toppaper)]"
+
+ data["paper"] = list()
+ data["paper_ref"] = list()
+ for(var/obj/item/paper/paper in src)
+ if(paper == toppaper)
+ continue
+ data["paper"] += "[paper]"
+ data["paper_ref"] += "[REF(paper)]"
+
+ return data
+
+/obj/item/clipboard/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
-
-/obj/item/clipboard/Topic(href, href_list)
- ..()
if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
return
- if(usr.contents.Find(src))
-
- if(href_list["pen"])
- if(haspen)
- haspen.forceMove(usr.loc)
- usr.put_in_hands(haspen)
- haspen = null
-
- if(href_list["addpen"])
- if(!haspen)
- var/obj/item/held = usr.get_active_held_item()
- if(istype(held, /obj/item/pen))
- var/obj/item/pen/W = held
- if(!usr.transferItemToLoc(W, src))
- return
- haspen = W
- to_chat(usr, "You slot [W] into [src].")
-
- if(href_list["write"])
- var/obj/item/P = locate(href_list["write"]) in src
- if(istype(P))
- if(usr.get_active_held_item())
- P.attackby(usr.get_active_held_item(), usr)
-
- if(href_list["remove"])
- var/obj/item/P = locate(href_list["remove"]) in src
- if(istype(P))
- P.forceMove(usr.loc)
- usr.put_in_hands(P)
- if(P == toppaper)
- toppaper = null
- var/obj/item/paper/newtop = locate(/obj/item/paper) in src
- if(newtop && (newtop != P))
- toppaper = newtop
- else
- toppaper = null
-
- if(href_list["read"])
- var/obj/item/paper/P = locate(href_list["read"]) in src
- if(istype(P))
- usr.examinate(P)
-
- if(href_list["top"])
- var/obj/item/P = locate(href_list["top"]) in src
- if(istype(P))
- toppaper = P
- to_chat(usr, "You move [P.name] to the top.")
-
- //Update everything
- attack_self(usr)
- update_appearance()
+ switch(action)
+ // Take the pen out
+ if("remove_pen")
+ if(pen)
+ remove_pen(usr)
+ . = TRUE
+ // Take paper out
+ if("remove_paper")
+ var/obj/item/paper/paper = locate(params["ref"]) in src
+ if(istype(paper))
+ remove_paper(paper, usr)
+ . = TRUE
+ // Look at (or edit) the paper
+ if("edit_paper")
+ var/obj/item/paper/paper = locate(params["ref"]) in src
+ if(istype(paper))
+ paper.ui_interact(usr)
+ update_icon()
+ . = TRUE
+ // Move paper to the top
+ if("move_top_paper")
+ var/obj/item/paper/paper = locate(params["ref"]) in src
+ if(istype(paper))
+ toppaper_ref = WEAKREF(paper)
+ to_chat(usr, "You move [paper] to the top.")
+ update_icon()
+ . = TRUE
+ // Rename the paper (it's a verb)
+ if("rename_paper")
+ var/obj/item/paper/paper = locate(params["ref"]) in src
+ if(istype(paper))
+ paper.rename()
+ update_icon()
+ . = TRUE
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index 0dd736ce9936..23e5155fabf7 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -299,12 +299,14 @@
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
+ id.update_appearance()
else
id = new /obj/item/card/id/gold(user.loc)
id.registered_name = user.real_name
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
+ id.update_appearance()
if(worn)
if(istype(worn, /obj/item/pda))
var/obj/item/pda/PDA = worn
diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm
index 41381a2d3aa1..cb5a025da475 100644
--- a/code/modules/paperwork/fax.dm
+++ b/code/modules/paperwork/fax.dm
@@ -48,6 +48,7 @@
/obj/item/spacecash,
/obj/item/holochip,
/obj/item/card,
+ /obj/item/folder/biscuit
)
/// Internal radio for announcing over comms
var/obj/item/radio/radio
@@ -87,6 +88,7 @@
/obj/machinery/fax/ruin
visible_to_network = FALSE
+ special_networks = list()
/obj/machinery/fax/ruin/Initialize(mapload)
. = ..()
@@ -96,6 +98,7 @@
GLOB.fax_machines -= src
QDEL_NULL(loaded_item_ref)
QDEL_NULL(wires)
+ QDEL_NULL(radio)
return ..()
/obj/machinery/fax/update_overlays()
@@ -500,6 +503,55 @@
frontier_network = TRUE
visible_to_network = FALSE
+/obj/machinery/fax/inteq
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "IRMG Mothership", fax_id = "inteq", color = "yellow", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+/obj/machinery/fax/clip
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "Colonial League Leadership", fax_id = "minutemen", color = "blue", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+/obj/machinery/fax/indie
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+/obj/machinery/fax/nanotrasen
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "Nanotrasen Central Command", fax_id = "nanotrasen", color = "green", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+/obj/machinery/fax/syndicate
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "Syndicate Coalition Coordination Center", fax_id = "syndicate", color = "red", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+/obj/machinery/fax/solgov
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "Solarian Confederation Frontier Affairs", fax_id = "solgov", color = "teal", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+/obj/machinery/fax/roumain
+ special_networks = list(
+ list(fax_name = "Outpost Authority", fax_id = "outpost", color = "orange", emag_needed = FALSE),
+ list(fax_name = "Roumain Council of Huntsmen", fax_id = "roumain", color = "brown", emag_needed = FALSE),
+ list(fax_name = "Frontiersmen Communications Quartermaster", fax_id = "frontiersmen", color = "black", emag_needed = TRUE)
+ )
+
+
/obj/machinery/fax/admin
name = "Central Command Fax Machine"
fax_name = "Nanotrasen Central Command"
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 62aa60b70c11..72f5d1326ead 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -30,6 +30,9 @@
/obj/structure/filingcabinet/filingcabinet //not changing the path to avoid unnecessary map issues, but please don't name stuff like this in the future -Pete
icon_state = "tallcabinet"
+/obj/structure/filingcabinet/wide
+ icon_state = "widecabinet"
+
/obj/structure/filingcabinet/double
name = "filing cabinets"
icon_state = "doublefilingcabinet"
@@ -37,6 +40,9 @@
/obj/structure/filingcabinet/double/grey
icon_state = "doubletallcabinet"
+/obj/structure/filingcabinet/double/grey
+ icon_state = "doublewidecabinet"
+
/obj/structure/filingcabinet/Initialize(mapload)
. = ..()
if(mapload)
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index 01f4547f048e..ad18b2bcd0b4 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -6,141 +6,116 @@
w_class = WEIGHT_CLASS_SMALL
pressure_resistance = 2
resistance_flags = FLAMMABLE
+ /// The background color for tgui in hex (with a `#`)
+ var/bg_color = "#7f7f7f"
+ /// A typecache of the objects that can be inserted into a folder
+ var/static/list/folder_insertables = typecacheof(list(
+ /obj/item/paper,
+ /obj/item/photo,
+ /obj/item/documents
+ ))
+
+/obj/item/folder/Initialize()
+ update_icon()
+ . = ..()
+
+/obj/item/folder/Destroy()
+ for(var/obj/important_thing in contents)
+ if(!(important_thing.resistance_flags & INDESTRUCTIBLE))
+ continue
+ important_thing.forceMove(drop_location()) //don't destroy round critical content such as objective documents.
+ return ..()
-/obj/item/folder/blue
- desc = "A blue folder."
- icon_state = "folder_blue"
+/obj/item/folder/examine()
+ . = ..()
+ if(contents)
+ . += "Alt-click to remove [contents[1]]."
-/obj/item/folder/red
- desc = "A red folder."
- icon_state = "folder_red"
+/obj/item/folder/proc/rename(mob/user)
+ if(!user.is_literate())
+ to_chat(user, "You scribble illegibly on the cover of [src]!")
+ return
-/obj/item/folder/yellow
- desc = "A yellow folder."
- icon_state = "folder_yellow"
+ var/inputvalue = stripped_input(user, "What would you like to label the folder?", "Folder Labelling", "", MAX_NAME_LEN)
-/obj/item/folder/white
- desc = "A white folder."
- icon_state = "folder_white"
+ if(!inputvalue)
+ return
-/obj/item/folder/solgov
- desc = "A blue folder with a SolGov seal."
- icon_state = "folder_solgov"
+ if(user.canUseTopic(src, BE_CLOSE))
+ name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]"
-/obj/item/folder/terragov
- desc = "A green folder with a Terran Regency seal."
- icon_state = "folder_terragov"
+/obj/item/folder/proc/remove_item(obj/item/Item, mob/user)
+ if(istype(Item))
+ Item.forceMove(user.loc)
+ user.put_in_hands(Item)
+ to_chat(user, "You remove [Item] from [src].")
+ update_icon()
+
+/obj/item/folder/AltClick(mob/user)
+ ..()
+ if(contents)
+ remove_item(contents[1], user)
/obj/item/folder/update_overlays()
. = ..()
if(contents.len)
. += "folder_paper"
-
-/obj/item/folder/attackby(obj/item/W, mob/user, params)
- if(burn_paper_product_attackby_check(W, user))
+/obj/item/folder/attackby(obj/item/weapon, mob/user, params)
+ if(burn_paper_product_attackby_check(weapon, user))
return
- if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/documents) || istype(W, /obj/item/disk))
- if(!user.transferItemToLoc(W, src))
+ if(is_type_in_typecache(weapon, folder_insertables))
+ /// Add paper, photo or documents into the folder
+ if(!user.transferItemToLoc(weapon, src))
return
- to_chat(user, "You put [W] into [src].")
+ to_chat(user, "You put [weapon] into [src].")
update_appearance()
- else if(istype(W, /obj/item/pen))
- if(!user.is_literate())
- to_chat(user, "You scribble illegibly on the cover of [src]!")
- return
-
- var/inputvalue = stripped_input(user, "What would you like to label the folder?", "Folder Labelling", "", MAX_NAME_LEN)
-
- if(!inputvalue)
- return
-
- if(user.canUseTopic(src, BE_CLOSE))
- name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]"
-
+ else if(istype(weapon, /obj/item/pen))
+ rename(user)
/obj/item/folder/attack_self(mob/user)
- var/dat = "[name]"
-
- for(var/obj/item/I in src)
- dat += "Remove - [I.name]
"
- user << browse(dat, "window=folder")
- onclose(user, "folder")
add_fingerprint(usr)
+ ui_interact(user)
+ return
+
+/obj/item/folder/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "Folder")
+ ui.open()
+
+/obj/item/folder/ui_data(mob/user)
+ var/list/data = list()
+ if(istype(src, /obj/item/folder/syndicate || /obj/item/folder/documents/syndicate))
+ data["theme"] = "syndicate"
+ data["bg_color"] = "[bg_color]"
+ data["folder_name"] = "[name]"
+
+ data["contents"] = list()
+ data["contents_ref"] = list()
+ for(var/Content in src)
+ data["contents"] += "[Content]"
+ data["contents_ref"] += "[REF(Content)]"
+
+ return data
+
+/obj/item/folder/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
-
-/obj/item/folder/Topic(href, href_list)
- ..()
if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
return
- if(usr.contents.Find(src))
-
- if(href_list["remove"])
- var/obj/item/I = locate(href_list["remove"]) in src
- if(istype(I))
- I.forceMove(usr.loc)
- usr.put_in_hands(I)
-
- if(href_list["read"])
- var/obj/item/I = locate(href_list["read"]) in src
- if(istype(I))
- usr.examinate(I)
-
- //Update everything
- attack_self(usr)
- update_appearance()
-
-/obj/item/folder/documents
- name = "folder- 'TOP SECRET'"
- desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\""
-
-/obj/item/folder/documents/Initialize()
- . = ..()
- new /obj/item/documents/nanotrasen(src)
- update_appearance()
-
-/obj/item/folder/syndicate
- icon_state = "folder_syndie"
- name = "folder- 'TOP SECRET'"
- desc = "A folder stamped \"Top Secret - Property of The Syndicate.\""
-
-/obj/item/folder/syndicate/red
- icon_state = "folder_sred"
-
-/obj/item/folder/syndicate/red/Initialize()
- . = ..()
- new /obj/item/documents/syndicate/red(src)
- update_appearance()
-
-/obj/item/folder/syndicate/blue
- icon_state = "folder_sblue"
-
-/obj/item/folder/syndicate/blue/Initialize()
- . = ..()
- new /obj/item/documents/syndicate/blue(src)
- update_appearance()
-
-/obj/item/folder/syndicate/mining/Initialize()
- . = ..()
- new /obj/item/documents/syndicate/mining(src)
- update_appearance()
-
-/obj/item/folder/solgov/red
- desc = "A blue folder with a SolGov seal."
- icon_state = "folder_solgovred"
-
-/obj/item/folder/solgov/red/Initialize()
- . = ..()
- new /obj/item/documents/solgov(src)
- update_appearance()
-
-
-/obj/item/folder/terragov/red
- desc = "A green folder with a Terran Regency seal."
- icon_state = "folder_terragovred"
-
-/obj/item/folder/terragov/red/Initialize()
- . = ..()
- new /obj/item/documents/terragov(src)
- update_appearance()
+ switch(action)
+ // Take item out
+ if("remove")
+ var/obj/item/Item = locate(params["ref"]) in src
+ remove_item(Item, usr)
+ . = TRUE
+ // Inspect the item
+ if("examine")
+ var/obj/item/Item = locate(params["ref"]) in src
+ if(istype(Item))
+ usr.examinate(Item)
+ . = TRUE
diff --git a/code/modules/paperwork/folders_premade.dm b/code/modules/paperwork/folders_premade.dm
new file mode 100644
index 000000000000..a919dce944ce
--- /dev/null
+++ b/code/modules/paperwork/folders_premade.dm
@@ -0,0 +1,63 @@
+/obj/item/folder/blue
+ desc = "A blue folder."
+ icon_state = "folder_blue"
+
+/obj/item/folder/red
+ desc = "A red folder."
+ icon_state = "folder_red"
+
+/obj/item/folder/yellow
+ desc = "A yellow folder."
+ icon_state = "folder_yellow"
+
+/obj/item/folder/white
+ desc = "A white folder."
+ icon_state = "folder_white"
+
+/obj/item/folder/solgov
+ desc = "A blue folder with a SolGov seal."
+ icon_state = "folder_solgov"
+
+/obj/item/folder/terragov
+ desc = "A green folder with a Terran Regency seal."
+ icon_state = "folder_terragov"
+
+/obj/item/folder/syndicate
+ desc = "A folder with a Syndicate color scheme."
+ icon_state = "folder_syndie"
+
+/obj/item/folder/documents
+ var/document = /obj/item/documents/nanotrasen
+ name = "folder- 'TOP SECRET'"
+ desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\""
+
+/obj/item/folder/documents/Initialize()
+ . = ..()
+ new document(src)
+ update_appearance()
+
+/obj/item/folder/documents/syndicate
+ icon_state = "folder_syndie"
+ name = "folder- 'TOP SECRET'"
+ desc = "A folder stamped \"Top Secret - Property of The Syndicate.\""
+
+/obj/item/folder/documents/syndicate/red
+ document = /obj/item/documents/syndicate/red
+ icon_state = "folder_sred"
+
+/obj/item/folder/documents/syndicate/blue
+ document = /obj/item/documents/syndicate/blue
+ icon_state = "folder_sblue"
+
+/obj/item/folder/documents/syndicate/mining
+ document = /obj/item/documents/syndicate/mining
+
+/obj/item/folder/documents/solgov
+ document = /obj/item/documents/solgov
+ desc = "A blue folder with a SolGov seal."
+ icon_state = "folder_solgovred"
+
+/obj/item/folder/documents/terragov
+ document = /obj/item/documents/terragov
+ desc = "A green folder with a Terran Regency seal."
+ icon_state = "folder_terragovred"
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index e30a2bdd9737..d858d7a290e8 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -489,8 +489,8 @@
var/obj/item/clipboard/clipboard = loc
// This is just so you can still use a stamp if you're holding one. Otherwise, it'll
// use the clipboard's pen, if applicable.
- if(!istype(holding, /obj/item/stamp) && clipboard.haspen)
- holding = clipboard.haspen
+ if(!istype(holding, /obj/item/stamp) && clipboard.pen)
+ holding = clipboard.pen
data["held_item_details"] = istype(holding) ? holding.get_writing_implement_details() : null
@@ -562,8 +562,8 @@
var/obj/item/clipboard/clipboard = loc
// This is just so you can still use a stamp if you're holding one. Otherwise, it'll
// use the clipboard's pen, if applicable.
- if(!istype(holding, /obj/item/stamp) && clipboard.haspen)
- holding = clipboard.haspen
+ if(!istype(holding, /obj/item/stamp) && clipboard.pen)
+ holding = clipboard.pen
// As of the time of writing, can_write outputs a message to the user so we don't have to.
if(!user.can_write(holding))
@@ -602,8 +602,8 @@
var/obj/item/clipboard/clipboard = loc
// This is just so you can still use a stamp if you're holding one. Otherwise, it'll
// use the clipboard's pen, if applicable.
- if(!istype(holding, /obj/item/stamp) && clipboard.haspen)
- holding = clipboard.haspen
+ if(!istype(holding, /obj/item/stamp) && clipboard.pen)
+ holding = clipboard.pen
// As of the time of writing, can_write outputs a message to the user so we don't have to.
if(!user.can_write(holding))
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 1c1ebd86336e..20ff55f0d789 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -28,7 +28,7 @@
/obj/item/papercutter/attackby(obj/item/P, mob/user, params)
- if(istype(P, /obj/item/paper) && !storedpaper)
+ if(istype(P, /obj/item/paper) && !storedpaper && !istype(P, /obj/item/paper/paperslip))
if(!user.transferItemToLoc(P, src))
return
playsound(loc, "pageturn", 60, TRUE)
@@ -71,8 +71,8 @@
to_chat(user, "You neatly cut [storedpaper].")
storedpaper = null
qdel(storedpaper)
- new /obj/item/paperslip(get_turf(src))
- new /obj/item/paperslip(get_turf(src))
+ new /obj/item/paper/paperslip(get_turf(src))
+ new /obj/item/paper/paperslip(get_turf(src))
update_appearance()
/obj/item/papercutter/MouseDrop(atom/over_object)
@@ -89,24 +89,25 @@
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
add_fingerprint(M)
-/obj/item/paperslip
+/obj/item/paper/paperslip
name = "paper slip"
desc = "A little slip of paper left over after a larger piece was cut. Whoa."
icon_state = "paperslip"
- icon = 'icons/obj/bureaucracy.dmi'
- resistance_flags = FLAMMABLE
- max_integrity = 50
-
-/obj/item/paperslip/attackby(obj/item/I, mob/living/user, params)
- if(burn_paper_product_attackby_check(I, user))
- return
- return ..()
-
-/obj/item/paperslip/Initialize()
- . = ..()
- pixel_x = base_pixel_x + rand(-5, 5)
- pixel_y = base_pixel_y + rand(-5, 5)
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
+ grind_results = list(/datum/reagent/cellulose = 1.5) //It's a normal paper sheet divided in 2. 3 divided by 2 equals 1.5, this way you can't magically dupe cellulose
+
+/obj/item/paper/paperslip/corporate //More fancy and sturdy paper slip which is a "plastic card", used for things like spare ID safe code
+ name = "corporate plastic card"
+ desc = "A plastic card for confidental corporate matters. Can be written on with pen somehow."
+ icon_state = "corppaperslip"
+ grind_results = list(/datum/reagent/plastic_polymers = 1.5) //It's a plastic card after all
+ max_integrity = 130 //Slightly more sturdy because of being made out of a plastic
+ drop_sound = 'sound/items/handling/disk_drop.ogg'
+ pickup_sound = 'sound/items/handling/disk_pickup.ogg'
+ throw_range = 6
+ throw_speed = 2
/obj/item/hatchet/cutterblade
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 71d1ae74c0be..9e16f4fb18b1 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -1198,3 +1198,20 @@
materials = list(/datum/material/iron = 200, /datum/material/glass = 200)
build_path = /obj/item/fishing_rod
category = list("initial","Misc","Equipment")
+
+
+/datum/design/paper_biscuit
+ name = "Paper Biscuit"
+ id = "biscuit"
+ build_type = PROTOLATHE | AUTOLATHE
+ materials = list(/datum/material/plastic = 20)
+ build_path = /obj/item/folder/biscuit/unsealed
+ category = list("initial", "Tools", "Misc")
+
+/datum/design/paper_biscuit_confidental
+ name = "Confidental Paper Biscuit"
+ id = "confidental_biscuit"
+ build_type = PROTOLATHE | AUTOLATHE
+ materials = list(/datum/material/plastic = 30)
+ build_path = /obj/item/folder/biscuit/unsealed/confidental
+ category = list("initial", "Tools", "Misc")
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 68eb25bf2b15..6574fc349225 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -66,4 +66,5 @@
/datum/surgery_step/mechanic_unwrench,
/datum/surgery_step/extract_implant,
/datum/surgery_step/mechanic_wrench,
+ /datum/surgery_step/close_hatch,
/datum/surgery_step/mechanic_close)
diff --git a/code/modules/surgery/ipc_revive.dm b/code/modules/surgery/ipc_revive.dm
index 1077a147b4f1..b224bc3a2b60 100644
--- a/code/modules/surgery/ipc_revive.dm
+++ b/code/modules/surgery/ipc_revive.dm
@@ -8,6 +8,7 @@
/datum/surgery_step/open_hatch,
/datum/surgery_step/prepare_electronics,
/datum/surgery_step/revive/ipc,
+ /datum/surgery_step/close_hatch,
/datum/surgery_step/mechanic_close
)
possible_locs = list(BODY_ZONE_CHEST)
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/limb_grafting.dm
similarity index 86%
rename from code/modules/surgery/prosthetic_replacement.dm
rename to code/modules/surgery/limb_grafting.dm
index 8b3d4aa1218e..f3cc0d08d5c8 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/limb_grafting.dm
@@ -1,30 +1,35 @@
-/datum/surgery/prosthetic_replacement
- name = "Prosthetic replacement"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/add_prosthetic)
+// Formerly prosthetic_replacement.dm
+
+/datum/surgery/limb_grafting
+ name = "Limb grafting"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/graft_limb)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart = FALSE //need a missing limb
requires_bodypart_type = 0
-/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target)
+/datum/surgery/limb_grafting/can_start(mob/user, mob/living/carbon/target)
if(!iscarbon(target))
return 0
var/mob/living/carbon/C = target
if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing
return 1
-/datum/surgery_step/add_prosthetic
- name = "add prosthetic"
+/datum/surgery_step/graft_limb
+ name = "graft limb"
implements = list(
/obj/item/bodypart = 100,
- /obj/item/organ_storage = 100,
- /obj/item/chainsaw = 100,
- /obj/item/melee/synthetic_arm_blade = 100)
+ /obj/item/organ_storage = 100)
+// /obj/item/chainsaw = 100,
+// /obj/item/melee/synthetic_arm_blade = 100)
+// Frankly these have always bothered me. They fill like a bad fit for Shiptest.
+// Marking out for now. Keeping the later code used to install unconventional prostheses just in case someone finds a good use for it.
+
time = 32
experience_given = MEDICAL_SKILL_ORGAN_FIX //won't get full XP if rejected
var/organ_rejection_dam = 0
-/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+/datum/surgery_step/graft_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage))
if(!tool.contents.len)
to_chat(user, "There is nothing inside [tool]!")
@@ -65,7 +70,7 @@
to_chat(user, "[tool] must be installed onto an arm.")
return -1
-/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+/datum/surgery_step/graft_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
. = ..()
if(istype(tool, /obj/item/organ_storage))
tool.icon_state = initial(tool.icon_state)
diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm
index f1fd128c2d9e..3730f7cf1302 100644
--- a/code/modules/surgery/mechanic_steps.dm
+++ b/code/modules/surgery/mechanic_steps.dm
@@ -112,3 +112,95 @@
display_results(user, target, "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...",
"[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
"[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].")
+
+//close hatch
+
+/datum/surgery_step/close_hatch
+ name = "close the hatch"
+ accept_hand = TRUE
+ time = 1 SECONDS
+ preop_sound = 'sound/machines/doorclick.ogg'
+ success_sound = 'sound/items/ratchet.ogg'
+
+/datum/surgery_step/close_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You begin to close the hatch holders in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to close the hatch holders in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to close the hatch holders in [target]'s [parse_zone(target_zone)].")
+
+//manipulate organs (metal edition)
+/datum/surgery_step/manipulate_organs/mechanic
+ name = "manipulate mechanical organs"
+ preop_sound = 'sound/surgery/organ2.ogg'
+ success_sound = 'sound/surgery/organ1.ogg'
+ implements_extract = list(
+ TOOL_HEMOSTAT = 55,
+ TOOL_CROWBAR = 100,
+ /obj/item/kitchen/fork = 35)
+
+//prosthesis removal
+/datum/surgery_step/prosthesis_removal
+ name = "detach prosthesis"
+ accept_hand = TRUE //once a prosthesis is unseated, it should be a simple matter of removing it without tools
+ implements = list(
+ TOOL_WRENCH = 100,
+ TOOL_CROWBAR = 100) //exists just in case you want to reflavor your prosthesis as something a little more integrated
+ time = 2.8 SECONDS
+ preop_sound = 'sound/items/ratchet.ogg'
+ success_sound = 'sound/machines/doorclick.ogg'
+
+/datum/surgery_step/prosthesis_removal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You begin to unseat [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to unseat [target]'s [parse_zone(target_zone)]!",
+ "[user] begins to unseat [target]'s [parse_zone(target_zone)]!")
+
+/datum/surgery_step/prosthesis_removal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ var/mob/living/carbon/human/L = target
+ display_results(user, target, "You detach [L]'s [parse_zone(target_zone)].",
+ "[user] detaches [L]'s [parse_zone(target_zone)]!",
+ "[user] detaches [L]'s [parse_zone(target_zone)]!")
+ if(surgery.operated_bodypart)
+ var/obj/item/bodypart/target_limb = surgery.operated_bodypart
+ target_limb.drop_limb()
+
+//Add prosthetic
+/datum/surgery_step/add_prosthetic
+ name = "add prosthetic"
+ implements = list(
+ /obj/item/bodypart = 100)
+ time = 32
+ experience_given = MEDICAL_SKILL_ORGAN_FIX //won't get full XP if rejected
+ var/organ_rejection_dam = 0
+
+/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(!istype(tool, /obj/item/bodypart))
+ to_chat(user, "[tool] isn't a mechanical prosthesis!")
+ return FALSE
+ var/obj/item/bodypart/BP = tool
+ if(ishuman(target))
+ if(IS_ORGANIC_LIMB(BP))
+ to_chat(user, "[BP] isn't a mechanical prosthesis!")
+ return -1
+
+ if(target_zone != BP.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm.
+ to_chat(user, "[tool] isn't the right type for [parse_zone(target_zone)].")
+ return -1
+ display_results(user, target, "You begin to replace [target]'s [parse_zone(target_zone)] with [tool]...",
+ "[user] begins to replace [target]'s [parse_zone(target_zone)] with [tool].",
+ "[user] begins to replace [target]'s [parse_zone(target_zone)].")
+
+/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ if(HAS_TRAIT(tool, TRAIT_NODROP))
+ display_results(user, target, "The [tool] is stuck in your hand!",
+ "The [tool] seems stuck to [user]'s hand!",
+ "The [tool] seems stuck to [user]'s hand!")
+ return FALSE
+ var/obj/item/bodypart/L = tool
+ if(!L.attach_limb(target))
+ display_results(user, target, "You fail to replace [target]'s [parse_zone(target_zone)]! Their body has rejected [L]!",
+ "[user] fails to replace [target]'s [parse_zone(target_zone)]!",
+ "[user] fails to replace [target]'s [parse_zone(target_zone)]!")
+ return FALSE
+ display_results(user, target, "You succeed in replacing [target]'s [parse_zone(target_zone)].",
+ "[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully replaces [target]'s [parse_zone(target_zone)]!")
+ return ..()
diff --git a/code/modules/surgery/mechanical.dm b/code/modules/surgery/mechanical.dm
index fe7b583d2c36..0c73c34bd0c7 100644
--- a/code/modules/surgery/mechanical.dm
+++ b/code/modules/surgery/mechanical.dm
@@ -8,6 +8,7 @@
/datum/surgery_step/open_hatch,
/datum/surgery_step/prepare_electronics,
/datum/surgery_step/fix_brain,
+ /datum/surgery_step/close_hatch,
/datum/surgery_step/mechanic_close
)
lying_required = FALSE
@@ -99,3 +100,29 @@
L.electrocute_act(urdamageamt_burn, target)
target.take_bodypart_damage(urdamageamt_brute, urdamageamt_burn)
return FALSE
+
+/datum/surgery/prosthesis_removal
+ name = "Detach prosthesis"
+ steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/prepare_electronics, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/prosthesis_removal)
+ possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) // adding BODY_ZONE_HEAD would allow IPCs to remove their heads, could be funny if it weren't for the fact that it breaks their mutcolors and kills FBPs. Future explorers, if you want to fix these issues, you have my blessing
+ requires_bodypart_type = BODYTYPE_ROBOTIC
+ lying_required = FALSE
+ self_operable = TRUE
+ ignore_clothes = TRUE
+
+/datum/surgery/prosthesis_attachment
+ name = "Prosthesis attachment"
+ steps = list(/datum/surgery_step/mechanic_wrench, /datum/surgery_step/prepare_electronics, /datum/surgery_step/add_prosthetic, /datum/surgery_step/close_hatch, /datum/surgery_step/mechanic_close)
+ possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
+ requires_bodypart = FALSE //need a missing limb
+ requires_bodypart_type = 0
+ lying_required = FALSE
+ self_operable = TRUE
+ ignore_clothes = TRUE
+
+/datum/surgery/prosthesis_attachment/can_start(mob/user, mob/living/carbon/target)
+ if(!iscarbon(target))
+ return FALSE
+ var/mob/living/carbon/C = target
+ if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing
+ return TRUE
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 2242c4c242ea..1b14aed144a1 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -49,8 +49,9 @@
/datum/surgery_step/open_hatch,
/datum/surgery_step/mechanic_unwrench,
/datum/surgery_step/prepare_electronics,
- /datum/surgery_step/manipulate_organs,
+ /datum/surgery_step/manipulate_organs/mechanic,
/datum/surgery_step/mechanic_wrench,
+ /datum/surgery_step/close_hatch,
/datum/surgery_step/mechanic_close
)
@@ -60,7 +61,8 @@
/datum/surgery_step/mechanic_open,
/datum/surgery_step/open_hatch,
/datum/surgery_step/prepare_electronics,
- /datum/surgery_step/manipulate_organs,
+ /datum/surgery_step/manipulate_organs/mechanic,
+ /datum/surgery_step/close_hatch,
/datum/surgery_step/mechanic_close
)
diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml
index 0fbf38a82bb7..fb2b9011b46e 100644
--- a/html/changelogs/archive/2024-03.yml
+++ b/html/changelogs/archive/2024-03.yml
@@ -95,3 +95,110 @@
and added
- rscdel: Corvus and Asclepius
- tweak: CLIP ERTs have been adjusted to be consistent
+2024-03-13:
+ Sadhorizon:
+ - tweak: E-cigarettes and e-cigars can now be turned on with tablets and APCs.
+ Skies-Of-Blue:
+ - rscadd: creates close_hatch, a step that mirrors open_hatch in prosthetic surgeries
+ for the sake of consistency. Why you leaving that hatch open?? The final step
+ before screwing to finish surgery. This affects implant removal, ipc revival,
+ mechanical brain surgery, and prosthesis organ manipulation
+ - rscadd: creates manipulate_organs/mechanic, a step that swaps the necessary implements
+ in synthetic surgery. Use a crowbar instead of a hemostat to remove any organs
+ on an augmented limb!
+ - tweak: 'changes implant removal surgery to reflect the above. The new tool order
+ is as follows: screwdriver, hand, wrench, crowbar, wrench, hand, screwdriver'
+ - tweak: 'changes the (unused) ipc revival surgery to reflect the above. The new
+ tool order is as follows: screwdriver, hand, multitool, inducer, hand, screwdriver'
+ - tweak: 'changes mechanical brain surgery to reflect the above. The new tool order
+ is as follows: screwdriver, hand, multitool, hemostat, hand, screwdriver'
+ - tweak: 'changes prosthesis organ manipulation to reflect the above. The new tool
+ order is as follows: screwdriver, hand, wrench (if head/chest), multitool, crowbar,
+ wrench (if head/chest), hand, screwdriver'
+ - rscadd: 'creates the Detach Prosthesis surgery, a less violent alternative to
+ Amputation. This allows for prosthesis users to remove their own limbs, for
+ the purposes of maintenance or just plain comfort! The tool order is as follows:
+ screwdriver, hand, multitool, wrench, crowbar/wrench/hand (so you can flavor
+ how you remove the limb)'
+ - tweak: 'changes the Prosthetic Replacement surgery, renaming it to Limb Grafting
+ surgery. The steps remain the same, but the name needed some retooling, as the
+ procedure is much more surgically involved than its new sibling:'
+ - rscadd: 'creates Prosthesis Attachment surgery, a less surgically involved version
+ of the Limb Grafting surgery. This allows for people with prostheses to re-attach
+ the limb they took off with Prosthesis Removal! The tool order is as follows:
+ wrench, multitool, plug in prosthesis, hand, screwdriver'
+ - rscdel: removes the chainsaw and synthetic arm blade from being viable prostheses.
+ Left the code intact in case someone wants to do something similar in-future
+ - tweak: blind characters can now use various scanners, bringing the frontier up
+ to accessibility standards across the galaxy
+ - tweak: crewmen have learned the secrets of being polite. While walking, you will
+ no longer shove or swap places with your crew mates. Be certain to walk around
+ your ship outside of emergencies!
+ - rscadd: a pAI's master can now clear the pAI's zeroth law
+ - bugfix: pAIs are now able to fully utilize installed encryption keys through their
+ integrated transceiver's menu when they have the encryption key software upgrade
+ - bugfix: binary encryption keys work in pAIs that have downloaded the encryption
+ key software
+ ZephyrTFA:
+ - balance: Only admins can open job slots
+ - bugfix: Cryoing correctly opens a job slot
+ - code_imp: Refactored ShipOwner into tsx
+ meemofcourse:
+ - tweak: Faxes on most ships no longer have access to all admin faxes
+ - tweak: Modified the pixel size of signatures in paper to 15px
+ mozi_h, DrDiasyl aka DrTuxedo#0931, GoldenAlpharex:
+ - rscadd: Clipboards have a snazzy new look.
+ - refactor: 'Gave clipboards some purpose in life: Edit, rename and sort to your
+ hearts'' desire! Insert a pen by just clicking it in. Rapidly pick up paper
+ by clicking on it with the clipboard.'
+ - rscadd: Folders have a snazzy new look. (Check out those colours!)
+ - refactor: Split and cleaned up folder code.
+ - refactor: Tidied up folder UI code
+ - bugfix: Paper that's on a clipboard doesn't need to be poked to realise that its
+ appearance has changed and to properly display it on a clipboard.
+ - bugfix: You finally figured that using a stamp on a clipboard was more important
+ than using the pen that's currently attached to it. Congratulations!
+ - code_imp: Added support for preventing a pen from being removed from a clipboard.
+ - rscadd: Added 'biscuit' cards! They can contain documents and can only be accessed
+ by cracking them open, you can't close them back. Nanotrasen now stores spare
+ ID safe codes in them.
+ - rscadd: Placed paper cutters around the station. They're in Bridge, HoP office,
+ Warden office, and Cargo.
+ - rscadd: Now you can order paper cutters at cargo.
+ - bugfix: Now the paper slip is actually paper.
+ - imageadd: The paper slips sprite was slightly tweaked to have text lay more logically,
+ added the corporate paper slip.
+ thgvr:
+ - rscadd: PAIs can wipe themselves again
+2024-03-14:
+ Spooky:
+ - tweak: Assorted resprites.
+ - imageadd: 'A bunch of re-done sprites for various objects. Notably: Sofas, filing
+ cabinets, reagent tanks.'
+2024-03-15:
+ cuddleandtea:
+ - rscadd: volume setting for play local sound
+2024-03-16:
+ Martinpachu:
+ - spellcheck: Fixes some cargo descriptions.
+ Sadhorizon:
+ - bugfix: Cybersun cap no longer defaults to black cap's sprite.
+ Skies-Of-Blue:
+ - rscadd: silicons across the sector have added two new noises to their lexicon,
+ try them out with *yes and *no!
+ - tweak: silicons across the sector have also overridden their clown inhibitors,
+ allowing them to play a bummer trombone with *sad
+ - tweak: borgs have leaked the secrets of *warn to their integrated positronic counterparts
+ - rscdel: due to wide reaching protest, silicons across the galaxy have decided
+ to give up their ability to *honk in respect for the lives lost during the ICW
+ - soundadd: several new roundend audio clips, as well as a new roundstart clip
+ - sounddel: all of the old roundend audio clips, as well as the old roundstart clip
+ - rscdel: soul
+ meemofcourse:
+ - code_imp: ID cards' update_label proc no longer calls update_appearance. Please
+ report any issues that may involve ID cards not updating overlays.
+ - code_imp: Outfits now have an id_assignment field. If a job has an id, and an
+ id_assignment, it will automatically apply.
+2024-03-17:
+ GenericDM:
+ - bugfix: pine trees now correctly show all possible sprite variations
diff --git a/icons/obj/atmospherics/pipes/pressure_tank.dmi b/icons/obj/atmospherics/pipes/pressure_tank.dmi
index 95103015cfd6..0554350af336 100644
Binary files a/icons/obj/atmospherics/pipes/pressure_tank.dmi and b/icons/obj/atmospherics/pipes/pressure_tank.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 8a042bc0d081..df05a9d601e3 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/flora/pinetrees.dmi b/icons/obj/flora/pinetrees.dmi
index 3ee4a89f079a..8a4f1649a481 100644
Binary files a/icons/obj/flora/pinetrees.dmi and b/icons/obj/flora/pinetrees.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 340bc0f9a5c6..e7cd9797591b 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/robotics.dmi b/icons/obj/robotics.dmi
index 8d0627aa9583..268c69c66681 100644
Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ
diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi
index 8a8cd951cb51..d738a32a70a5 100644
Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index e88a183d2c40..ec4b8bd200e6 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index a984d69cf030..f5f04901af2a 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index eae80ff576a4..6483f97570d1 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index 31e4913260b9..85f7cb718617 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -2879,12 +2879,14 @@
#include "code\modules\overmap\ships\owner_action.dm"
#include "code\modules\overmap\ships\ship_application.dm"
#include "code\modules\overmap\ships\ship_datum.dm"
+#include "code\modules\paperwork\biscuit.dm"
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\fax.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
+#include "code\modules\paperwork\folders_premade.dm"
#include "code\modules\paperwork\handlabeler.dm"
#include "code\modules\paperwork\paper.dm"
#include "code\modules\paperwork\paper_cutter.dm"
@@ -3337,13 +3339,13 @@
#include "code\modules\surgery\implant_removal.dm"
#include "code\modules\surgery\ipc_revive.dm"
#include "code\modules\surgery\limb_augmentation.dm"
+#include "code\modules\surgery\limb_grafting.dm"
#include "code\modules\surgery\lobectomy.dm"
#include "code\modules\surgery\mechanic_steps.dm"
#include "code\modules\surgery\mechanical.dm"
#include "code\modules\surgery\organ_manipulation.dm"
#include "code\modules\surgery\organic_steps.dm"
#include "code\modules\surgery\plastic_surgery.dm"
-#include "code\modules\surgery\prosthetic_replacement.dm"
#include "code\modules\surgery\remove_embedded_object.dm"
#include "code\modules\surgery\revival.dm"
#include "code\modules\surgery\stomachpump.dm"
diff --git a/sound/roundend/apcdestroyed.ogg b/sound/roundend/apcdestroyed.ogg
deleted file mode 100644
index 7fe77dd52366..000000000000
Binary files a/sound/roundend/apcdestroyed.ogg and /dev/null differ
diff --git a/sound/roundend/bangindonk.ogg b/sound/roundend/bangindonk.ogg
deleted file mode 100644
index b3a3624de56d..000000000000
Binary files a/sound/roundend/bangindonk.ogg and /dev/null differ
diff --git a/sound/roundend/boowomp.ogg b/sound/roundend/boowomp.ogg
new file mode 100644
index 000000000000..1a1ed5878b10
Binary files /dev/null and b/sound/roundend/boowomp.ogg differ
diff --git a/sound/roundend/deliguana.ogg b/sound/roundend/deliguana.ogg
new file mode 100644
index 000000000000..058900271040
Binary files /dev/null and b/sound/roundend/deliguana.ogg differ
diff --git a/sound/roundend/disappointed.ogg b/sound/roundend/disappointed.ogg
deleted file mode 100644
index 4a35dc5c5138..000000000000
Binary files a/sound/roundend/disappointed.ogg and /dev/null differ
diff --git a/sound/roundend/gayrights.ogg b/sound/roundend/gayrights.ogg
new file mode 100644
index 000000000000..230a421f0096
Binary files /dev/null and b/sound/roundend/gayrights.ogg differ
diff --git a/sound/roundend/its_only_game.ogg b/sound/roundend/its_only_game.ogg
deleted file mode 100644
index 3fe36eee9550..000000000000
Binary files a/sound/roundend/its_only_game.ogg and /dev/null differ
diff --git a/sound/roundend/leavingtg.ogg b/sound/roundend/leavingtg.ogg
deleted file mode 100644
index 455dc9fb1190..000000000000
Binary files a/sound/roundend/leavingtg.ogg and /dev/null differ
diff --git a/sound/roundend/newroundsexy.ogg b/sound/roundend/newroundsexy.ogg
deleted file mode 100644
index afe5630f04df..000000000000
Binary files a/sound/roundend/newroundsexy.ogg and /dev/null differ
diff --git a/sound/roundend/petersondisappointed.ogg b/sound/roundend/petersondisappointed.ogg
deleted file mode 100644
index 3e8a3a2857bc..000000000000
Binary files a/sound/roundend/petersondisappointed.ogg and /dev/null differ
diff --git a/sound/roundend/repair.ogg b/sound/roundend/repair.ogg
new file mode 100644
index 000000000000..756abb5a4b7c
Binary files /dev/null and b/sound/roundend/repair.ogg differ
diff --git a/sound/roundend/scrunglartiy.ogg b/sound/roundend/scrunglartiy.ogg
deleted file mode 100644
index 8019b567449d..000000000000
Binary files a/sound/roundend/scrunglartiy.ogg and /dev/null differ
diff --git a/sound/roundend/shiptestingthursday.ogg b/sound/roundend/shiptestingthursday.ogg
new file mode 100644
index 000000000000..9943d78f7262
Binary files /dev/null and b/sound/roundend/shiptestingthursday.ogg differ
diff --git a/sound/roundend/undecided.ogg b/sound/roundend/undecided.ogg
new file mode 100644
index 000000000000..604cbe8b6dc9
Binary files /dev/null and b/sound/roundend/undecided.ogg differ
diff --git a/sound/roundend/yeehaw.ogg b/sound/roundend/yeehaw.ogg
deleted file mode 100644
index ddc56fbfe9df..000000000000
Binary files a/sound/roundend/yeehaw.ogg and /dev/null differ
diff --git a/sound/roundstart/addiguana.ogg b/sound/roundstart/addiguana.ogg
new file mode 100644
index 000000000000..8b21b9835516
Binary files /dev/null and b/sound/roundstart/addiguana.ogg differ
diff --git a/tgui/packages/tgui/interfaces/Clipboard.js b/tgui/packages/tgui/interfaces/Clipboard.js
new file mode 100644
index 000000000000..82e9001335da
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Clipboard.js
@@ -0,0 +1,107 @@
+import { useBackend } from '../backend';
+import {
+ Box,
+ Button,
+ Divider,
+ LabeledList,
+ Flex,
+ Section,
+} from '../components';
+import { Window } from '../layouts';
+
+export const Clipboard = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { pen, top_paper, top_paper_ref, paper, paper_ref } = data;
+ return (
+
+
+
+ {pen ? (
+
+ act('remove_pen')} />
+ }
+ >
+ {pen}
+
+
+ ) : (
+
+ No pen attached!
+
+ )}
+
+
+ {top_paper ? (
+
+
+ {top_paper}
+
+
+
+
+ ) : (
+
+
+ The clipboard is empty!
+
+
+ )}
+ {paper.length > 0 && }
+ {paper.map((paper_item, index) => (
+
+
+ act('move_top_paper', { ref: paper_ref[index] })}
+ />
+
+
+ {paper_item}
+
+
+ act('edit_paper', { ref: paper_ref[index] })}
+ />
+ act('rename_paper', { ref: paper_ref[index] })}
+ />
+ act('remove_paper', { ref: paper_ref[index] })}
+ />
+
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Folder.js b/tgui/packages/tgui/interfaces/Folder.js
new file mode 100644
index 000000000000..affdb35ee7ae
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Folder.js
@@ -0,0 +1,51 @@
+import { useBackend } from '../backend';
+import { Box, Button, Flex, Section } from '../components';
+import { Window } from '../layouts';
+
+export const Folder = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { theme, bg_color, folder_name, contents, contents_ref } = data;
+ return (
+
+
+ {contents.map((item, index) => (
+
+
+ {item}
+
+
+ {
+ act('examine', { ref: contents_ref[index] })}
+ />
+ }
+ act('remove', { ref: contents_ref[index] })}
+ />
+
+
+ ))}
+ {contents.length === 0 && (
+
+
+ This folder is empty!
+
+
+ )}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/PaperSheet.tsx b/tgui/packages/tgui/interfaces/PaperSheet.tsx
index beda23bd4a0a..2a0b04d0549e 100644
--- a/tgui/packages/tgui/interfaces/PaperSheet.tsx
+++ b/tgui/packages/tgui/interfaces/PaperSheet.tsx
@@ -918,7 +918,7 @@ export class PreviewView extends Component {
let input = document.createElement('input');
input.setAttribute('type', 'text');
- input.style.fontSize = field.is_signature ? '30px' : `${fontSize}px`;
+ input.style.fontSize = field.is_signature ? '15px' : `${fontSize}px`;
input.style.fontFamily = fieldData.font || font;
input.style.fontStyle = field.is_signature ? 'italic' : 'normal';
input.style.fontWeight = 'bold';
diff --git a/tgui/packages/tgui/interfaces/ShipOwner.js b/tgui/packages/tgui/interfaces/ShipOwner.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/ShipOwner.js
rename to tgui/packages/tgui/interfaces/ShipOwner.tsx
index b8fa0f6e97fc..3beab28f48b0 100644
--- a/tgui/packages/tgui/interfaces/ShipOwner.js
+++ b/tgui/packages/tgui/interfaces/ShipOwner.tsx
@@ -9,6 +9,40 @@ import {
} from '../components';
import { Window } from '../layouts';
+type ShipOwnerData = {
+ crew: [CrewData];
+ jobs: [JobData];
+ jobIncreaseAllowed: [string];
+ memo: string;
+ pending: boolean;
+ joinMode: string;
+ cooldown: number;
+ applications: [ApplicationData];
+ isAdmin: boolean;
+};
+
+type ApplicationData = {
+ ref: string;
+ key: string;
+ name: string;
+ text: string;
+ status: string;
+};
+
+type CrewData = {
+ ref: string;
+ name: string;
+ allowed: boolean;
+};
+
+type JobData = {
+ ref: string;
+ name: string;
+ slots: number;
+ max: number;
+ def: number;
+};
+
export const ShipOwner = (props, context) => {
return (
@@ -19,8 +53,8 @@ export const ShipOwner = (props, context) => {
);
};
-const ShipOwnerContent = (props, context) => {
- const { act, data } = useBackend(context);
+const ShipOwnerContent = (_, context: any) => {
+ const { act, data } = useBackend(context);
const [tab, setTab] = useLocalState(context, 'tab', 1);
const {
crew = [],
@@ -30,6 +64,8 @@ const ShipOwnerContent = (props, context) => {
joinMode,
cooldown = 1,
applications = [],
+ isAdmin,
+ jobIncreaseAllowed = [],
} = data;
return (
{
Message
Status
- {applications.map((app) => (
+ {applications.map((app: ApplicationData) => (
{app.key}
{app.name}
@@ -144,16 +180,16 @@ const ShipOwnerContent = (props, context) => {
Can be owner
Transfer Ownership
- {crew.map((mind) => (
-
- {mind.name}
+ {crew.map((crew_data: CrewData) => (
+
+ {crew_data.name}
act('toggleCandidate', {
- ref: mind.ref,
+ ref: crew_data.ref,
})
}
/>
@@ -163,7 +199,7 @@ const ShipOwnerContent = (props, context) => {
content="Transfer Owner"
onClick={() =>
act('transferOwner', {
- ref: mind.ref,
+ ref: crew_data.ref,
})
}
/>
@@ -184,13 +220,22 @@ const ShipOwnerContent = (props, context) => {
Job Name
Slots
- {jobs.map((job) => (
+ {jobs.map((job: JobData) => (
{job.name}
0 || job.slots >= job.max}
+ disabled={
+ !(isAdmin || jobIncreaseAllowed[job.name]) ||
+ cooldown > 0 ||
+ job.slots >= job.max
+ }
+ tooltip={
+ !jobIncreaseAllowed[job.name] && !isAdmin
+ ? 'Cannot increase job slots above maximum.'
+ : undefined
+ }
color={job.slots >= job.def ? 'average' : 'default'}
onClick={() =>
act('adjustJobSlot', {