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} + + +