diff --git a/README.md b/README.md
index dade37afd8e..5a182f9ddfd 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
[](http://forthebadge.com)
[](http://forthebadge.com)
-[Website](http://www.nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/gXZMc?utm_source=Discord%20Widget&utm_medium=Connect)
+[Website](https://nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/gXZMc?utm_source=Discord%20Widget&utm_medium=Connect)
---
diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index bd90e0be9f0..8cf94d61835 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -266,7 +266,7 @@ CREATE TABLE `player` (
`UI_style` varchar(10) DEFAULT 'Midnight',
`UI_style_color` varchar(7) DEFAULT '#ffffff',
`UI_style_alpha` smallint(4) DEFAULT '255',
- `be_role` mediumtext NOT NULL,
+ `be_role` mediumtext,
`default_slot` smallint(4) DEFAULT '1',
`toggles` mediumint(8) DEFAULT '383',
`sound` mediumint(8) DEFAULT '31',
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index 94010ad1b74..d1b62ae3767 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -265,7 +265,7 @@ CREATE TABLE `SS13_player` (
`UI_style` varchar(10) DEFAULT 'Midnight',
`UI_style_color` varchar(7) DEFAULT '#ffffff',
`UI_style_alpha` smallint(4) DEFAULT '255',
- `be_role` mediumtext NOT NULL,
+ `be_role` mediumtext,
`default_slot` smallint(4) DEFAULT '1',
`toggles` mediumint(8) DEFAULT '383',
`sound` mediumint(8) DEFAULT '31',
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index e6e04b560fb..872d4aa1ea9 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -990,6 +990,7 @@
"atb" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/range)
"atc" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"atd" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/brig)
+"ate" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
"atf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig)
"atg" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
"ath" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig)
@@ -1473,7 +1474,7 @@
"aCr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prison/cell_block/B)
"aCs" = (/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 6"; name = "Cell 6"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
"aCt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/prison/cell_block/B)
-"aCu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison/cell_block/B)
+"aCu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
"aCv" = (/obj/structure/stool/bed/chair,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Interrogation Observation"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aCw" = (/obj/structure/stool/bed/chair,/obj/machinery/light_switch{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
"aCx" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/interrogation)
@@ -1719,6 +1720,7 @@
"aHd" = (/obj/structure/stool/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aHe" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"aHf" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aHg" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"aHh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aHi" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
"aHj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
@@ -2474,7 +2476,7 @@
"aVF" = (/obj/machinery/camera{c_tag = "Bar Storage"; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aVG" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aVH" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aVI" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
+"aVI" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"aVJ" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aVK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aVL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
@@ -2608,7 +2610,6 @@
"aYj" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/bridge)
"aYk" = (/obj/machinery/door/window/eastright{name = "Coroner Office"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/morgue)
"aYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
-"aYm" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"aYn" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aYo" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes/stokcubes,/obj/item/weapon/storage/box/monkeycubes/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/wolpincubes,/obj/item/weapon/storage/box/monkeycubes/farwacubes,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
"aYp" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
@@ -5703,7 +5704,6 @@
"chi" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"chj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "paramedic"; name = "Paramedic Garage"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
"chk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/paramedic)
-"chl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/diamond{name = "Paramedic"; req_access_txt = "66"},/turf/simulated/floor/plasteel,/area/medical/paramedic)
"chm" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
"chn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acutesep"; name = "Acute Separation Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper)
"cho" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/sleeper)
@@ -9067,7 +9067,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazeazgazhaxiaaaaxkazfazjaziaxkalwaabarXarXarXarXarXaaaatHaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauvaxoawzaxmatIatMatNazVauyawBaudaudaudaznazXazWazsazrawKazYazZawWaAcaAaawWaAdaAqaxLaAraBHaAsaxLazyaAtaxpaAuaAvaxpaAwavnaxvaAyaACaAAaAEaADaAHaAGawlaAIaAKaAJawlaydavqavqaxhaxhaxhdmoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarUazUaAbaraaraaraazbaraaraaraaraazbaraaraaraaraaALaaaaaaamWaaaaAfaAfaAgaAgaAgaAgaAgaAgaAfaAfaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaAhazgazhaxiaaaaxkaAiaykaykaxkalwaaaasMasLasLasLasLasNasPasOasQasQasQasQasRaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIaymawzawzayhauyayoaAMauCaAmaAnaAlaAnaApaApaANaApaAoaElaAOaAPawKaxSaARawKaATaAVaAUaAWaxLaAZaAXaBbaBaawHaBiayeawHaBraBpaBsaBsaBsaBsaBsawVaBuaBtawlaBvaBRaBvawlaBwavqavqatGaupaurauqauqausaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaAYaBxaByaabaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaamWaAfaAfaBdaBcaBeaBgaBhaBfaBjaBeaAfaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaAhazgazhaxiaaaaxkaBkaykaBlaxkaabaBmatFatFatFatFatFaaaatHaaaatFatFatFatFatFaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatIazkazkazkatIatMaBAaBzaBBaAmaCaaAnaAnaBCaApaBDaBqaBoaElaBEaBFauZavcaBGauZaAdaxLaxLaBJaBIaBKaxLaxLazxavlaBLavmavlaBNaBMaBPaBOaBSaBQaBsaCcaCfaCeaZIaCgavqaSPavqaChavqavqavsavqavtavpavuavwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaBTaabaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaAfaAfaAfaAfaBUaBgaBVaBgaBVaBXaBgaBgaBgaBWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazgazgazgaBYaaaaxkaBkaykaBlaxkalwaaaaaaaabaaaaabaaaaaaaBZaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaAkaAkaAkaAjaaaaaaaaaaaaaBnaAnaAnaAnaCiaCkaCjaCdaCbaElavPaCmaClavTaCnaCoavdaxLaEBaCpaEBaCqaEBaxLaAzazAaCrawdaCsaCuaCtaBsaCvaCxaCwaBsaCzaCBaCAaCCaZIaZIaCgavqavqaybaycatGavqawkauqauqawmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaCLaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaAfaCNaCOaCPaCMaCRaCQaCSaBgaBgaCUaCVaBgaCWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiazgazgazgaBYaaaaxkaBkaykaBlaxkalwaaaaaaaabaaaaabaaaaaaaBZaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaAkaAkaAkaAjaaaaaaaaaaaaaBnaAnaAnaAnaCiaCkaCjaCdaCbaElavPaCmaClavTaCnaCoavdaxLaEBaCpaEBaCqaEBaxLaAzazAaCrawdaCsateaCtaBsaCvaCxaCwaBsaCzaCBaCAaCCaZIaZIaCgavqavqaybaycatGavqawkauqauqawmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaCLaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaAfaCNaCOaCPaCMaCRaCQaCSaBgaBgaCUaCVaBgaCWaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaCTazgazgaCXaaaaxkaCYaykaykaCZalwalwalwaabaabaabaabaDbaDaaDbaabaabaabaabalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBnaDdaDcaCEaCDaCGaCFaCHaDiaElauYaCIawWaCKaCJawWaDeaDfaEBaDgaFFaDhaEBaDkaDjaxpaDlaDmaxpaDoaDnaBsaDpaDraDqaBsaDsaDNaDNaDNaDNaDPaDPaDRaDRaDRaDRatGatGatGatGaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaDSaDKaDSaabaabaaaaabaaaaaaaabaabaaaaaaaaaaaaaaaaaaaAfaDUaDTaDWaDVaDYaDXaBgaBgaBgaDZaEaaBgaEcaAfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxiaEbazgaEeaxiaaaaxkaEfaykaykaxkaabaaaaabaaaaaaaabaaaaDbaEgaEdaaaaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaEiaEiaEiaEiaEiaEiaAmaElaElaElaDtaElaElaElaDuaAmaAxaAxaAxaAxaAxaAxaEBaEBaDvaDgaFFaDhaDvaDvaDvaEpaEpaEpaEpaDxaDwaBsaDyaDAaDzaBsaDsaDNaELaEMaEKaDPaENaDBaEOaEQaDRaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaabaabaaaaabaabaabaabaabaaaaDSaERaDSaaaaabaaaaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaAfaETaESaCPaEUaEWaEVaEXaBgaEZaEYaFbaFaaAfaFdaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeaFfaFcaFfaFgaaaaFiaFhaykaFkaFiaabaaaaabaaaaaaaabaDbaDbaFjaFmaDbaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEiaFlaFoaDCaDDaFvaFwaFsaDFaDEaDDaDGaFvaFvaDIaDHaFBaFAaFyaFyaFyaFyaFyaFyaFyaDJaDLaGraDMaEjaDOavqavqavqavqavqaBsaDQaEkaEhaEnaEmaBsaEoaDNaFTaFUaFPaDPaFVaEqaFWaFYaDPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaabaDSaDSaFZaDSaDSaabaaaaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaAfaGbaGaaCPaAfaCPaCPaGdaGcaAfaAfaAfaAfaAfaAfaabaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9114,7 +9114,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKybKxbKpaQZaQZaQZbndaSfaSfbCfbKCbCfbKDbKsbKtbKEbCfblQbKvbKvbKwbKFbKwbKwbKwbKFbKwblQblQbxbbxbbxbbKGbxbbKzbKzbKzbKzbKzbKzbJfbKAbKBbKHbzFbKIbKKbKJbKMbKLbKObKNbKQbKPbKSbKRbKVbKUbKXbKXbLabKZbKTbLbbLfbKWbLgbKYbFCbLhbHDbLibHBbLkbFCaaabLcbLdbLebLnbLdbLdbLdbLdbLpbxvbLqbFObLrbLjbLsbLlbLmbLtbLobEobLvbLubLxbLwbLzbLybLBbLAbGabLDbEtaTHaTLaTKaTNaTMbHQaTObHQaSVbIbbHUbHQbIbbEubIebGqbLNbLEbLPbLSbLQbLIbLTbLKbLLbLMbLUbLObLVbEAbLXbLRbLYbEDbLZbMfbMabIpbLWbMgbEDbKubGGbMhbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbMjbMibKpaSeaSebMbbMcaSebMdbCfbMebIBbMlbMkbMnbMmbCfaaaaabaabbMpbMobMobMobMobMobMraaaaaabKBbMtbMsbMubMqbKzbKzbKzbKzbKzbKzbMwbMvbMzbMybMDbMBbMxbDXbzJbzJbMFbMAbzJbzJbMJbMCbMLbMEbMMbMGbMGbMHbMGbMIbMNbMGbMKbKYbFCbMObFEbFEbFEbMPbFCaaabLcbLdbMRbMQbMVbMTbMWbMSbNbbMUbNcbFObNdbEobMXbMYbMZbNabNfbNebNjbNgbNlbNkbNhbNibNnbNmbNqbNpbNrbLFaTQaTPbEtaTRaTTaTSaTUaSVbNAaTVaTWbGvbEubNKbNzbNLbNBbNBbNMbNDbNEbNFbNGbNHbNIbNJbNObNNbEAbNQbLRbNRbEDbNSbNPbNTbIpbIpbNUbEDbIzbGGbNWbGHaaaaaaaaaaaaaabbNXbNZbNVbNZbNVbNZbOaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbKpbKpbObaSdaSdbjQaLdaSdaSdbCfbOdbIBbIBbIBbCfbCfbCfaaaaaaaaabOebOcbOcbOfbOcbOcbOeaaaaaabKBbOgbKzbOibOhbOhbOhbOhbOhbOkbOjbOhbOlbOnbOmbOpbOobOrbOqbzJbOtbBnbOvbOsbDXbOwbOubOxbMEbMEbMGbOAbOybOCbOBbODbMGbFBbKYbFCbOEbOHbOFbOObOMbFCaaabOGbLdbOPbOIbOJbOKbOLbOKbOSbONbOXbFObOYbEobOQbOQbORbPabOTbOUbOVbOWbPcbPbbOZbOZbPebPdbPhbPfbEtbNoaUOaTYbEtbEubPgbEubEuaUPbEubEubEubEubPrbPmbGqbPvbLEbLPbPxbNBbNEbPnbPobPobPpbIdbPqbPybPsbPtbIrbPubEDbPzbPwbIpbPHbPBbPJbEDbKubPAbGHbGHaaaaaaaaaaaaaabbPKbPCbPDbPEbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbPUbPObPPbPQbPQbPQbPObKzbJfbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebPXbBnbBnbPYbDXbOwbOubQhbQfbQbbQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObQAbEobQDbQBbQGbQEbQHbQCbQJbQIbQFbQFbQMbQKbQFbQFbQObQNbQPbQLaVyaVxbQTbQSaWIaVIaYmaYlaWObQVbRebQXbRgbRfbGqbRabRbbRcbRjbRibIabRkbPobPobRlbRhbPqbRmbEAbRnbRnbRobEDbRpbRybRqbRzbIpbREbEDbKubRFbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbPIbPIbPIbPNbPMbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbPUbPObPPbPQbPQbPQbPObKzbJfbKAbKzbKzbKBbPZbPSbQcbQdbPVbQebPXbBnbBnbPYbDXbOwbOubQhbQfbQbbQibQkbOzbQlbQgbQnbMGbQobQjbHmbQpbQqbQmbQsbQrbHsbHtbQtbLdbQvbQubQwbOKbQxbOKbQybONbQzbFObQAbEobQDbQBbQGbQEbQHbQCbQJbQIbQFbQFbQMbQKbQFbQFbQObQNbQPbQLaVyaVxbQTbQSaWIaHgaVIaYlaWObQVbRebQXbRgbRfbGqbRabRbbRcbRjbRibIabRkbPobPobRlbRhbPqbRmbEAbRnbRnbRobEDbRpbRybRqbRzbIpbREbEDbKubRFbGHaaaaaaaaaaaaaaaaabbRrbRsbPDbPFbPDbRtbNVaabaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbRubRvbRwbRxbRGbRHbRAbRGbRBbRCbRDbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbRJbRIbRKbRIbRSbRRbRTbRRbRRbRRbRRbRUbJfbKAbRLbxbbxbbRMbBnbzFbQdbRNbDXbRObRPbRPbRQbNYbRYbRXbRZbRVbRWbSbbSdbScbSabQgbSebMGbMKbKYbFCbSfbShbSgbSlbSkbFCaaabOGbSibSjbSibSibSibSibSibSmbSibSpbFObQAbEobSqbSnbSnbSobSrbOUbStbSsbSvbSubSxbSwbSybSvbSAbSzbSDbSBaWSaWRbSGbSGbSEbSHbSJbSIbSLbSKbSNbSMbSPbSObSRbSQbSQbSSbSUbSTbIabSWbIdbIdbSXbSVbPqbSYbTabSZbTfbTcbTbbTgbTdbTebTjbTebEDbEDbTkbPtbThbTibTibTibTibTibThbPKbPFbPDbPFbPFbPGbPKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbRAbRAbRAbTlbRGbTnbTnbRGbTobRAbRAbTpbWLbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbTtbTrbTqbTrbTubKzbPPbPQbPQbPQbKzbKzbJfbKAbTsbTxbxbbTAbBnbTBbQdbTvbDXbTwbBnbBobBnbPWbOwbTybTzbRVbRWbTCbTEbTDbTKbTFbTLbTGbTHbTIbTJbTJbTNbTMbTPbFCbFCaaabOGbSibTQbTObTSbTRbTVbTTbTWbTUbTXbFObQAbNebTZbTYbUbbUabUcbOUbUebUdbUibUhbUfbUgbUkbUjbUmbUlbUobUnbUqbUpbUsbUrbUubUtbUybUvbUDbQVbUwbQXbUxbUGbGrbUzbUAbUBbUCbUCbIabUIbUEbUFbIabUJbPqbUHbIabUKbUMbULbUObUNbUQbUPbUSbURbUUbUTbUWbUVbUYbUXbUXbUZbVbbVabQabVcbNZbNVbVdbNVbNZbVjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbVebVfbVgbVhbVibRGbVkbRAbVlbRAbRAbRAbRAbRAbTlbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebVmbOcbOcbOcbVnbOebPTbKBbKBbVobKzbPPbKzbKzbKzbKzbKzbJfbKAbTsbVpbxbbVrbBnbVqbVsbBnbVwbzEbBnbBnbVtbDXbOwbTybTzbRVbRWbMGbVubVvbVybVxbVzbMHbVBbVAbVDbVCbHsbVEbVFbHsbHtbHtbVGbSibVIbVHbVKbVJbVLbVLbVNbVMbVObFObVPbEobOUbVQbOQbVSbVRbOUbUebVUbVTbVVbVXbVWbVYbVTbUebVZbWebWabWbbWabWcbWabWdbWdbWhbWfbWgbWgbWgbWmbWgbWgbWibWibWjbWkbWjbWjbIabIabIabIabIabWlbWnbLIbIabWobWrbWpbWqbWqbWvbWsbWtbWubWxbWwbWzbWybWBbWAbWAbWCbWEbWDbThbQabQabQabWFbThaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9124,7 +9124,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQcbScbVcbTcbUcbWcbYcbXccacbZcccccbccfccdcceccgccjcchccicckccqcclccmbEnccnbFOccoccpccrbFOccscaAccvcctccuccwccxbUecczccyccBccAccDccCccFccEccHccGccIbWaccKbZuccJccMccLccOccNccPbXNccQbXQbXQbXQccRbWgcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfcdecdhcdgcdjcdicdkbYjcdnbGHaaaaaaaaabThbThbThbThaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwcdGcdFbTybTycdHcdKcdIcdJcclcdOcdLcdOcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdScdNcclccmbEncdVcdUcdXcdWcdZcdYbFOcaAcebcctceaccucedbUececceecegcefceicehcekcejbUecelcembWaceocencencercepceqcetcesbXNceucevbXQcexcewbWgcbdcezceyceBceAceDceCceGcbfceEccZceFceFcbjceHceJceIceLceKceNceMcePceOceSbYjcacbGHceQaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGceRceRceRceRceRceTbRAbRAbRGbPIbPIbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceVceUceUceUceWaaaaaaaaaaaaaaaaaaaaaceXceZceYceZcfaaaaaaaaaacamcamcamcffcfbcdAcfcbYLcfdcbMcfecfgbYMbOwcfhcfjcficflcfkcfncfmcfpcfocfrcfqcfucfscftcftcfxcfvcfvcfvcfvcfvcfvcfwcfAcfycfzcfBcfDcfCcfFcfEcfHcfGcfIcaAcfJcctccucfKcedbUececceecfMcfLcfOcfNcfQcfPbUmcfRcfSbWabWacfUcfUbWacepbWdcfTcfVbWgcfXcfWcfZcfYcgabWgcbdcgccgbcgecgdcghcgfcggcbfcgiccZceFceFcbjcgjcgmcgkcglcgncgpcgocgrcgqcgvbYjcaccgscgtcgscgucgycgucgucguaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhchlchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFchDchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMcgRcgQcgTcgScgScgUcgXcgVcgScgWcgWcgYchbcgZcgWcgWchacclcclchechcchcchcchdchgchcchcchfchichhchhchjchhaCuchkchhchnchmchpcaAchochqcecchschrchtchvchuchwchrbUecelchychxchAchzchCchBchFchDchEchGchLchHchIchJchKchNbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXchWbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRGbRAbRAcikbRAbRAbRAciobRAcilbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPcipciqcamcitcfbcircisciyciubYMcivciwcixcizbYMcgQcgQciCcgSciAciBciEciDciHcgWciFciGciJciIciKcgWciMciLciNchcciPciOciSciQciRciTciVciUciXciWciZciYcjbcjacjdcjccjgcjecjfcjhcjjcjicjkceecjocjlcjmcjncjqcjpbUmcjrcjtcjscjuchCcjvcjvcjxcjwbWgcjycjAcjzcjCcjBcjEaYobWicjFcjHcjGcjIcjGcjGcjLcjJcjKcjPcjMcjNcjOcbjcjQcjRcbnbPtbGGcjTcjScjUcjUcjScjUcjYcgscjVcjWchZciackecjXcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckfbRGbRAbRAbRGckgbRAbRAckjckhbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFckicimcimckkcklcfbcfbckmckncfbcfbcisckqckobYMbYMbYMbYMbYMbYMckpcgQcksckrckxcktcktcktckucgWckvckwckwckwckzckyckBckAckDckCckFckEckHckGckJckIchcchfckKchhckMckLckOckNckPchhcebccuceaccuckRckQckUckSckTckVckXckWckYchrclackZclcclbclecldclgclfcljclhbWgbWgbWgbWgbWgclicllclkbWiclncjGcjGclmclocjGcltclpcbjclqccZclrclrcbjcbmclscbnbPtcgsclvcgscgscgscgscgscgscgscluclwcguclxclzclycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOclBcjZcjZclAciecieckbckbclHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRGbRAclFbRGclGclIbRAbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclJclMclKckncfbcfbclLclOclNclQclPclPclPclTcgQcgQcgQciCcgSclRcktclScktclVcgWckvckwclUckwclWcgWclYclXclZchccmccmacmbcmecmdcmhcmfcmgcmjcmicmlcmkcmocmmcmnchhcfJccuccucmpckRckQcmrcmqcmucjlcmscmtaYqcmvcmycmxcmAcmzcmCcmBcmEcmDcjvcmHchxcmFcmGcmJcmIcmKcmNcmLclpclncmMcjGcjGcjGcmQcmOclpcbjcmPccZclrclrcbjcmTcmRcbnbPtcmScmVcmUcgscmWcmYcmXcnbcmZcnacnfcgucnccndcnecgucgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacnkcieclBciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm
new file mode 100644
index 00000000000..64b903a78f5
--- /dev/null
+++ b/_maps/map_files/shuttles/emergency_dept.dmm
@@ -0,0 +1,127 @@
+"aa" = (/turf/space,/area/space)
+"ab" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
+"ac" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/shuttle/escape)
+"ad" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
+"ae" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"af" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"},/area/shuttle/escape)
+"ag" = (/obj/machinery/computer/emergency_shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"ah" = (/turf/simulated/shuttle/wall{icon_state = "swallc3"},/area/shuttle/escape)
+"ai" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"aj" = (/obj/machinery/computer/communications,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"ak" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost")},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"al" = (/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"am" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"an" = (/obj/machinery/computer/crew,/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"ao" = (/obj/machinery/computer/robotics,/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"ap" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"aq" = (/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"ar" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"as" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"at" = (/obj/structure/stool/bed/chair/comfy/red{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"au" = (/obj/structure/stool/bed/chair/comfy/teal{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"av" = (/obj/structure/stool/bed/chair/comfy/purp{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"aw" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"ax" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"ay" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"az" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aA" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aB" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/floor/plating,/area/shuttle/escape)
+"aC" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aD" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aE" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aF" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aG" = (/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aH" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aI" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aJ" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape)
+"aK" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aL" = (/obj/machinery/chem_dispenser/beer,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aM" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/floor/plating,/area/shuttle/escape)
+"aN" = (/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/clothing/mask/cigarette/cigar,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aO" = (/obj/machinery/chem_dispenser/soda,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aP" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape)
+"aQ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aR" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
+"aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"aT" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; timid = 1; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"aU" = (/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"aV" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"aW" = (/obj/machinery/door/window/northleft{req_access_txt = "32"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"aX" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"aY" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"aZ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"ba" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bb" = (/obj/machinery/door/window/northleft{req_access_txt = "47"},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bd" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"be" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bf" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bg" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape)
+"bh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bi" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bj" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bk" = (/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bl" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bm" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bn" = (/obj/machinery/door/window/southright{req_access_txt = "32"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bo" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bp" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bq" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"br" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bs" = (/obj/machinery/door/window/southright{req_access_txt = "47"},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bt" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape)
+"bu" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bv" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bw" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
+"bx" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"by" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bz" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bA" = (/obj/machinery/door/window/northleft{req_access_txt = "5"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bB" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bC" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bD" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
+"bE" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
+"bF" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bG" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bH" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"bI" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/sleeper,/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bJ" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bK" = (/obj/structure/closet/cardboard,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bL" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bM" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bN" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bO" = (/obj/machinery/sleeper,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape)
+"bP" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
+"bQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape)
+"bR" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape)
+"bS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
+"bT" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape)
+"bU" = (/turf/space,/area/shuttle/escape)
+
+(1,1,1) = {"
+aaaaaaaaaaabacadaaaaaaaaaa
+aaaaabaeaeafagahaeaeadaaaa
+aaabafaiajakalamanaoahadaa
+aaapaqarasataqaqauavaqapaa
+aaapaqaqaqaqaqaqaqaqaqapaa
+abawaeaeaeaxayaeaeaeaeawad
+apazaAazazaBaCaDaEaCaFaGap
+apaHaIaIaIaJaCaDaEaCaKaLap
+apaIaIaIaIaMaCaDaEaCaNaOap
+aPaIaIaQaQaBaCaDaEaCaRaRac
+aSaeaeaeaeaJaCaDaEaCaCaCap
+aTaUaUaUaUaUaUaUaUaUaUaUap
+apaVaWaXaBaYaUaZaBbabbbcap
+aBbdbebfbgbhaUbibgbjbkblaB
+bgbdbebfbgbhaUbibgbjbkblbg
+aJbmbnboaJbpaUbqaJbrbsbtaJ
+apbuaUaUaUaUaUaUaUaUaUbvap
+bwaUaUaUaUaUaUaUaUaUaUaUac
+aSaebxbyaBbzbAbBaBbCacaebD
+bEaUaUaUbgbFbGbHbgaUaUbIap
+acaUaUaUbgbFbGbHbgaUaUbJap
+apbKbLbLaJbFbGbHaJbNbMbOap
+bPaxbQbQawaeaeaeawbRbRaxbS
+aabPbTbTbSbUbUbUbPbTbTbSaa
+"}
+
diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm
new file mode 100644
index 00000000000..4ba11cef609
--- /dev/null
+++ b/_maps/map_files/templates/shelter_2.dmm
@@ -0,0 +1,41 @@
+"a" = (/turf/simulated/wall/survival,/area/survivalpod)
+"b" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/survival,/area/survivalpod)
+"c" = (/obj/machinery/smartfridge/survival_pod/loaded,/turf/simulated/floor/pod,/area/survivalpod)
+"d" = (/turf/simulated/floor/pod,/area/survivalpod)
+"e" = (/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"f" = (/obj/machinery/light,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"g" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/survival,/area/survivalpod)
+"h" = (/obj/structure/fans,/turf/simulated/floor/pod,/area/survivalpod)
+"i" = (/obj/machinery/sleeper/survival_pod,/turf/simulated/floor/pod,/area/survivalpod)
+"j" = (/obj/structure/table/survival_pod,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/brute{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/pod,/area/survivalpod)
+"k" = (/obj/structure/table/wood/fancy/black{pixel_y = -9},/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/machinery/microwave,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"l" = (/obj/structure/sink/kitchen{dir = 4; pixel_x = -11},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/survival,/area/survivalpod)
+"n" = (/obj/structure/curtain/black,/obj/machinery/shower{pixel_y = 20},/turf/simulated/floor/pod{pixel_y = 0},/area/survivalpod)
+"o" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"p" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"q" = (/obj/structure/window/reinforced/survival_pod{dir = 9},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"r" = (/turf/simulated/floor/carpet/black,/area/survivalpod)
+"s" = (/obj/item/device/gps/computer,/turf/simulated/floor/pod,/area/survivalpod)
+"t" = (/obj/structure/stool/bed/pod,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/pod,/area/survivalpod)
+"u" = (/obj/structure/tubes,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/pod,/area/survivalpod)
+"v" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/displaycase{desc = "A display case containing an expensive forgery, probably."; locked = 1; pixel_y = -4; req_access_txt = "48"; start_showpiece_type = /obj/item/fakeartefact},/turf/simulated/floor/carpet/black{dir = 1},/area/survivalpod)
+"w" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod,/turf/simulated/floor/pod,/area/survivalpod)
+"x" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/survival,/area/survivalpod)
+"y" = (/obj/structure/toilet/secret{pixel_y = 12},/turf/simulated/floor/pod,/area/survivalpod)
+"z" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/item/cardboard_cutout{desc = "A cardboard cutout of a xenomorph maid."; icon_state = "cutout_lusty"; name = "lusty xenomorph maid"}, /turf/simulated/floor/carpet/black,/area/survivalpod)
+"A" = (/obj/structure/table/wood/fancy/black,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"B" = (/obj/structure/table/wood/fancy/black,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 1},/obj/effect/spawner/lootdrop/three_course_meal,/turf/simulated/floor/carpet/black,/area/survivalpod)
+"C" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod)
+"D" = (/obj/structure/sign/mining,/turf/simulated/wall/survival,/area/survivalpod)
+
+(1,1,1) = {"
+agagaga
+bhcsnyx
+aidtoza
+bjdupAx
+akevqBa
+blfrrCx
+amawaDa
+"}
+
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 8e7be007d12..4f07d54ee01 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -96,6 +96,7 @@
#define NUTRITION_LEVEL_FED 350
#define NUTRITION_LEVEL_HUNGRY 250
#define NUTRITION_LEVEL_STARVING 150
+#define NUTRITION_LEVEL_CURSED 0
//Blood levels
#define BLOOD_VOLUME_NORMAL 560
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 99079fd81bb..a2f487086ae 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -332,4 +332,6 @@
#define STATION_GOAL_BUDGET 1
#define FIRST_DIAG_STEP 1
-#define SECOND_DIAG_STEP 2
\ No newline at end of file
+#define SECOND_DIAG_STEP 2
+
+#define ARBITRARY_VIEWRANGE_NOHUD 2
\ No newline at end of file
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index c2295b9c5dc..36fffdd907a 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -92,10 +92,14 @@
#define APPEARANCE_ALL 32767
// Intents
-#define I_HELP "help"
-#define I_DISARM "disarm"
-#define I_GRAB "grab"
-#define I_HARM "harm"
+#define INTENT_HELP "help"
+#define INTENT_DISARM "disarm"
+#define INTENT_GRAB "grab"
+#define INTENT_HARM "harm"
+
+// Movement Intents
+#define MOVE_INTENT_WALK "walk"
+#define MOVE_INTENT_RUN "run"
// AI wire/radio settings
#define AI_CHECK_WIRELESS 1
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 0abf2ac1af3..f20be8c1c0b 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -464,3 +464,7 @@ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=nul
set hidden = 1
set name = ".mouse"
LogMouseMacro(".mouse", params)
+
+/proc/update_all_mob_security_hud()
+ for(var/mob/living/carbon/human/H in mob_list)
+ H.sec_hud_set_security_status()
\ No newline at end of file
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 58928da83e0..b4bb8292ca2 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -169,7 +169,7 @@
/mob/proc/RangedAttack(var/atom/A, var/params)
if(!mutations.len)
return
- if((LASER in mutations) && a_intent == I_HARM)
+ if((LASER in mutations) && a_intent == INTENT_HARM)
LaserEyes(A) // moved into a proc below
return
else
diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm
index 79d109c0c57..ff8b856e797 100644
--- a/code/_onclick/hud/alien.dm
+++ b/code/_onclick/hud/alien.dm
@@ -41,14 +41,14 @@
static_inventory += using
using = new /obj/screen/act_intent/alien()
- using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent)
+ using.icon_state = (mymob.a_intent == "hurt" ? INTENT_HARM : mymob.a_intent)
using.screen_loc = ui_acti
static_inventory += using
action_intent = using
using = new /obj/screen/mov_intent()
using.icon = 'icons/mob/screen_alien.dmi'
- using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
static_inventory += using
move_intent = using
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index c4f453077ef..9e57fd9429b 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -14,7 +14,7 @@
using = new /obj/screen/mov_intent()
using.icon = 'icons/mob/screen_alien.dmi'
- using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
static_inventory += using
move_intent = using
@@ -36,4 +36,4 @@
mymob.zone_sel = new /obj/screen/zone_sel/alien()
mymob.zone_sel.update_icon(mymob)
- static_inventory += mymob.zone_sel
\ No newline at end of file
+ static_inventory += mymob.zone_sel
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 2e1d87f605e..f4b43516cd0 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -100,6 +100,15 @@
if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
display_hud_version = 1
+ if(mymob.client.view < world.view)
+ if(mymob.client.view < ARBITRARY_VIEWRANGE_NOHUD)
+ to_chat(mymob, "HUD is unavailable with this view range.")
+ display_hud_version = HUD_STYLE_NOHUD
+ else
+ if(display_hud_version == HUD_STYLE_STANDARD)
+ to_chat(mymob, "Standard HUD mode is unavailable with a smaller-than-normal view range.")
+ display_hud_version = HUD_STYLE_REDUCED
+
switch(display_hud_version)
if(HUD_STYLE_STANDARD) //Default HUD
hud_shown = 1 //Governs behavior of other procs
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index d543ce9c416..d309cc37e0f 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -81,7 +81,7 @@
using = new /obj/screen/mov_intent()
using.icon = ui_style
- using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
using.color = ui_color
using.alpha = ui_alpha
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index e5d1e15512a..ae0fb3e1263 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -17,7 +17,7 @@
using = new /obj/screen/mov_intent()
using.icon = ui_style
- using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
using.color = ui_color
using.alpha = ui_alpha
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index cf0247e847a..260df783bf9 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -70,14 +70,14 @@
var/_y = text2num(params2list(params)["icon-y"])
if(_x<=16 && _y<=16)
- usr.a_intent_change(I_HARM)
+ usr.a_intent_change(INTENT_HARM)
else if(_x<=16 && _y>=17)
- usr.a_intent_change(I_HELP)
+ usr.a_intent_change(INTENT_HELP)
else if(_x>=17 && _y<=16)
- usr.a_intent_change(I_GRAB)
+ usr.a_intent_change(INTENT_GRAB)
else if(_x>=17 && _y>=17)
- usr.a_intent_change(I_DISARM)
+ usr.a_intent_change(INTENT_DISARM)
else
usr.a_intent_change("right")
@@ -199,15 +199,15 @@
var/mob/living/carbon/C = usr
if(C.legcuffed)
to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!")
- C.m_intent = "walk" //Just incase
+ C.m_intent = MOVE_INTENT_WALK //Just incase
C.hud_used.move_intent.icon_state = "walking"
return 1
switch(usr.m_intent)
- if("run")
- usr.m_intent = "walk"
+ if(MOVE_INTENT_RUN)
+ usr.m_intent = MOVE_INTENT_WALK
usr.hud_used.move_intent.icon_state = "walking"
- if("walk")
- usr.m_intent = "run"
+ if(MOVE_INTENT_WALK)
+ usr.m_intent = MOVE_INTENT_RUN
usr.hud_used.move_intent.icon_state = "running"
if(istype(usr,/mob/living/carbon/alien/humanoid))
usr.update_icons()
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index ea9de45f295..87b78259593 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -30,7 +30,7 @@
/mob/living/carbon/human/RangedAttack(var/atom/A)
if(!gloves && !mutations.len) return
var/obj/item/clothing/gloves/G = gloves
- if((LASER in mutations) && a_intent == I_HARM)
+ if((LASER in mutations) && a_intent == INTENT_HARM)
LaserEyes(A) // moved into a proc below
else if(istype(G) && G.Touch(A,0)) // for magic gloves
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index 2d7fb9467df..b5249e11740 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -28,22 +28,25 @@ Bonus
/datum/symptom/visionloss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
+ var/mob/living/carbon/M = A.affected_mob
+ var/obj/item/organ/internal/eyes/eyes = M.get_int_organ(/obj/item/organ/internal/eyes)
+ if(!eyes) //NO EYES, NO PROBLEM! Rip out your eyes today to prevent future blindness!
+ return
switch(A.stage)
if(1, 2)
to_chat(M, "Your eyes itch.")
if(3, 4)
to_chat(M, "Your eyes burn!")
- M.blur_eyes(10)
- M.adjust_eye_damage(1)
+ M.EyeBlurry(20)
+ eyes.take_damage(1)
else
to_chat(M, "Your eyes burn horrificly!")
- M.blur_eyes(20)
- M.adjust_eye_damage(5)
- if(M.eye_damage >= 10)
- M.become_nearsighted()
- if(prob(M.eye_damage - 10 + 1))
- if(M.become_blind())
+ M.EyeBlurry(30)
+ eyes.take_damage(5)
+ if(eyes.damage >= 10)
+ M.BecomeNearsighted()
+ if(prob(eyes.damage - 10 + 1))
+ if(M.BecomeBlind())
to_chat(M, "You go blind!")
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 5c11c42930a..40c38ac0627 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -1173,3 +1173,39 @@
suit = /obj/item/clothing/suit/wizrobe/marisa
shoes = /obj/item/clothing/shoes/sandal/marisa
head = /obj/item/clothing/head/wizard/marisa
+
+
+/datum/outfit/admin/dark_priest
+ name = "Dark Priest"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
+ back = /obj/item/weapon/storage/backpack
+ head = /obj/item/clothing/head/chaplain_hood
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ id = /obj/item/weapon/card/id/syndicate
+ r_hand = /obj/item/weapon/nullrod/armblade
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1,
+ )
+
+/datum/outfit/admin/dark_priest/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Dark Priest", "syndie")
+ var/obj/item/weapon/nullrod/armblade/B = H.r_hand
+ if(istype(B))
+ B.force = 20
+ B.name = "blessing of the reaper"
+ B.desc = "Sometimes, someone's just gotta die."
+ var/obj/item/device/radio/headset/R = H.l_ear
+ if(istype(R))
+ R.flags |= NODROP
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
\ No newline at end of file
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 24007dbafee..3d0f877a3aa 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -39,6 +39,12 @@
suffix = "cyb"
name = "emergency shuttle (Cyberiad)"
+/datum/map_template/shuttle/emergency/dept
+ suffix = "dept"
+ name = "emergency shuttle (department)"
+ description = "Features include: areas for each department, and a small bar."
+ admin_notes = "Designed to reduce chaos. Each dept requires dept access."
+
/datum/map_template/shuttle/emergency/clown
suffix = "clown"
name = "Snappop(tm)!"
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1cf08abebd0..1aa65685d5e 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -922,6 +922,15 @@ var/list/uplink_items = list()
cost = 2
surplus = 30
+/datum/uplink_item/stealthy_tools/cutouts
+ name = "Adaptive Cardboard Cutouts"
+ desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \
+ spraycan for changing their appearances."
+ reference = "ADCC"
+ item = /obj/item/weapon/storage/box/syndie_kit/cutouts
+ cost = 1
+ surplus = 20
+
// DEVICE AND TOOLS
/datum/uplink_item/device_tools
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index eb743afad62..140b6116cd6 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -307,7 +307,7 @@
var/mob/living/L = A
if(!L.ckey) return
- if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together.
+ if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == MOVE_INTENT_RUN)) // Being ready when you change areas gives you a chance to avoid falling all together.
thunk(L)
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
@@ -344,7 +344,7 @@
if(istype(get_turf(M), /turf/space)) // Can't fall onto nothing.
return
- if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == "run")).
+ if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN)).
M.Stun(5)
M.Weaken(5)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 5d1dd5c74fb..292ad651235 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -34,6 +34,9 @@
//Detective Work, used for the duplicate data points kept in the scanners
var/list/original_atom
+ //Detective Work, used for allowing a given atom to leave its fibers on stuff. Allowed by default
+ var/can_leave_fibers = TRUE
+
var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
@@ -469,4 +472,4 @@
/atom/on_varedit(modified_var)
if(!Debug2)
admin_spawned = TRUE
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index 16f8dad4bdb..52b62f6cabf 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -600,13 +600,13 @@
thoughts = "haunted by their own mortality"
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
to_chat(user, "Mood: You sense benevolent thoughts from [M.name].")
- if(I_DISARM)
+ if(INTENT_DISARM)
to_chat(user, "Mood: You sense cautious thoughts from [M.name].")
- if(I_GRAB)
+ if(INTENT_GRAB)
to_chat(user, "Mood: You sense hostile thoughts from [M.name].")
- if(I_HARM)
+ if(INTENT_HARM)
to_chat(user, "Mood: You sense cruel thoughts from [M.name].")
for(var/mob/living/L in view(7,M))
if(L == M)
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index ea92b93f473..a9975618435 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -68,7 +68,7 @@
icon_living = "brainslug"
icon_dead = "brainslug_dead"
speed = 5
- a_intent = I_HARM
+ a_intent = INTENT_HARM
stop_automated_movement = 1
status_flags = CANPUSH
attacktext = "nips"
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index 39acdabacc5..4825dea6ebb 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -11,7 +11,7 @@
icon_living = "magicOrange"
icon_dead = "magicOrange"
speed = 0
- a_intent = I_HARM
+ a_intent = INTENT_HARM
stop_automated_movement = 1
floating = 1
attack_sound = 'sound/weapons/punch1.ogg'
@@ -218,7 +218,7 @@
//Fire. Low damage, low resistance, sets mobs on fire when bumping
/mob/living/simple_animal/hostile/guardian/fire
- a_intent = I_HELP
+ a_intent = INTENT_HELP
melee_damage_lower = 10
melee_damage_upper = 10
attack_sound = 'sound/items/Welder.ogg'
@@ -340,7 +340,7 @@
//Healer
/mob/living/simple_animal/hostile/guardian/healer
- a_intent = I_HARM
+ a_intent = INTENT_HARM
friendly = "heals"
speed = 0
melee_damage_lower = 15
@@ -362,7 +362,7 @@
icon_state = "seal"
attacktext = "slaps"
speak_emote = list("barks")
- a_intent = I_HARM
+ a_intent = INTENT_HARM
friendly = "heals"
speed = 0
melee_damage_lower = 0
@@ -398,7 +398,7 @@
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
if(src.loc == summoner)
if(toggle)
- a_intent = I_HARM
+ a_intent = INTENT_HARM
speed = 0
damage_transfer = 0.7
if(src.adminseal)
@@ -408,7 +408,7 @@
to_chat(src, "You switch to combat mode.")
toggle = FALSE
else
- a_intent = I_HELP
+ a_intent = INTENT_HELP
speed = 1
damage_transfer = 1
if(src.adminseal)
@@ -490,7 +490,7 @@
armour_penetration = 100
/mob/living/simple_animal/hostile/guardian/ranged
- a_intent = I_HELP
+ a_intent = INTENT_HELP
friendly = "quietly assesses"
melee_damage_lower = 10
melee_damage_upper = 10
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index be21008d5f2..28ca711946a 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -11,7 +11,7 @@
icon_living = "morph"
icon_dead = "morph_dead"
speed = 2
- a_intent = "harm"
+ a_intent = INTENT_HARM
stop_automated_movement = 1
status_flags = CANPUSH
pass_flags = PASSTABLE
@@ -168,4 +168,3 @@
eat(I)
return
target.attack_animal(src)
-
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 19411dee6de..8fbc0563181 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -14,7 +14,7 @@
icon_state = "daemon"
icon_living = "daemon"
speed = 1
- a_intent = I_HARM
+ a_intent = INTENT_HARM
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/misc/demon_attack1.ogg'
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index e60b564f5d0..6cb2f8d6db6 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -11,7 +11,7 @@
name = "traitor"
config_tag = "traitor"
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
- protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Internal Affairs Agent", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer")
+ protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer")
required_players = 0
required_enemies = 1
recommended_enemies = 4
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index f3dc8e4e41a..406f21bdcdb 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -10,7 +10,7 @@
config_tag = "vampire"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer")
- protected_species = list("Machine", "Plasmaman")
+ protected_species = list("Machine")
required_players = 15
required_enemies = 1
recommended_enemies = 4
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index e5c9d1a0804..721372b56f5 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -332,7 +332,7 @@
while((progress / milestone) > INSTALLED && LAZYLEN(missing_organs))
var/obj/item/organ/I = pick_n_take(missing_organs)
- I.replaced(occupant)
+ I.safe_replace(occupant)
#undef INSTALLED
@@ -377,7 +377,7 @@
return
else
connected_message("Authorized Ejection")
- announce_radio_message("An authorized ejection of [occupant.real_name] has occured")
+ announce_radio_message("An authorized ejection of [(occupant) ? occupant.real_name : "the malfunctioning pod"] has occured")
to_chat(user, "You force an emergency ejection.")
go_out()
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index e343135b246..17147954372 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -135,7 +135,7 @@
return
/obj/machinery/computer/attack_alien(mob/living/user)
- if(isalien(user) && user.a_intent == I_HELP)
+ if(isalien(user) && user.a_intent == INTENT_HELP)
var/mob/living/carbon/alien/humanoid/xeno = user
if(xeno.has_fine_manipulation)
return attack_hand(user)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 16efcb7de76..fca20841cfa 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -485,10 +485,6 @@
/obj/machinery/computer/secure_data/proc/setTemp(text, list/buttons = list())
temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
-/obj/machinery/computer/secure_data/proc/update_all_mob_security_hud()
- for(var/mob/living/carbon/human/H in mob_list)
- H.sec_hud_set_security_status()
-
/obj/machinery/computer/secure_data/proc/create_record_photo(datum/data/record/R)
// basically copy-pasted from the camera code but different enough that it has to be redone
var/icon/photoimage = get_record_photo(R)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index dd3c1be36da..24f5c88695c 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -612,7 +612,7 @@ to destroy them and players will be able to make replacements.
name = "Circuit Board (PACMAN-type Generator)"
build_path = /obj/machinery/power/port_gen/pacman
board_type = "machine"
- origin_tech = "programming=2:powerstorage=3;plasmatech=3;engineering=3"
+ origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3"
frame_desc = "Requires 1 Matter Bin, 1 Micro-Laser, 2 Pieces of Cable, and 1 Capacitor."
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index a24af37dc72..68987b63ebd 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -29,32 +29,51 @@
var/timetoset = 0 // Used to set releasetime upon starting the timer
var/obj/item/device/radio/Radio
var/printed = 0
+ var/datum/data/record/prisoner
maptext_height = 26
maptext_width = 32
/obj/machinery/door_timer/proc/print_report()
- var/logname = input(usr, "Name of the guilty?","[id] log name")
- var/logcharges = stripped_multiline_input(usr, "What have they been charged with?","[id] log charges")
+ var/logname = input(usr, "Name of the guilty?","[id] log name")
+ var/logcharges = stripped_multiline_input(usr, "What have they been charged with?","[id] log charges")
- if(!logname || !logcharges)
- return 0
+ if(!logname || !logcharges)
+ return 0
- for(var/obj/machinery/computer/prisoner/C in prisoncomputer_list)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
- P.name = "[id] log - [logname] [worldtime2text()]"
- P.info = "
[id] - Brig record
"
- P.info += {"[station_name()] - Security Department
- Admission data:
- Log generated at: [worldtime2text()]
- Detainee: [logname]
- Duration: [timetoset/10] seconds
- Charge(s): [logcharges]
- Arresting Officer: [usr.name]
- This log file was generated automatically upon activation of a cell timer."}
+ for(var/obj/machinery/computer/prisoner/C in prisoncomputer_list)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
+ P.name = "[id] log - [logname] [worldtime2text()]"
+ P.info = "[id] - Brig record
"
+ P.info += {"[station_name()] - Security Department
+ Admission data:
+ Log generated at: [worldtime2text()]
+ Detainee: [logname]
+ Duration: [timetoset/10] seconds
+ Charge(s): [logcharges]
+ Arresting Officer: [usr.name]
+ This log file was generated automatically upon activation of a cell timer."}
- playsound(C.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- cell_logs += P
- return 1
+ playsound(C.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ cell_logs += P
+
+ var/datum/data/record/R = find_security_record("name", logname)
+ Radio.autosay("Detainee [logname] has been incarcerated for [timetoset/10] seconds for the charges of, '[logcharges]'. \
+ Arresting Officer: [usr.name].[R ? "" : " Detainee record not found, manual record update required."]", name, "Security", list(z))
+
+ if(R)
+ prisoner = R
+ R.fields["criminal"] = "Incarcerated"
+ var/mob/living/carbon/human/M = usr
+ var/rank = "UNKNOWN RANK"
+ if(istype(M) && M.wear_id)
+ var/obj/item/weapon/card/id/I = M.wear_id
+ rank = I.assignment
+ if(!R.fields["comments"] || !islist(R.fields["comments"])) //copied from security computer code because apparently these need to be initialized
+ R.fields["comments"] = list()
+ R.fields["comments"] += "Autogenerated by [name] on [current_date_string] [worldtime2text()]
Sentenced to [timetoset/10] seconds for the charges of \"[logcharges]\" by [rank] [usr.name]."
+ update_all_mob_security_hud()
+
+ return 1
/obj/machinery/door_timer/initialize()
..()
@@ -91,6 +110,7 @@
/obj/machinery/door_timer/Destroy()
QDEL_NULL(Radio)
targets.Cut()
+ prisoner = null
return ..()
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
@@ -166,6 +186,10 @@
// Reset releasetime
releasetime = 0
printed = 0
+ if(prisoner)
+ prisoner.fields["criminal"] = "Released"
+ update_all_mob_security_hud()
+ prisoner = null
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(!door.density)
@@ -294,6 +318,7 @@
timer_start()
else
timer_end()
+ Radio.autosay("Timer stopped manually by [usr.name].", name, "Security", list(z))
else
if(href_list["tp"]) //adjust timer, close door if not already closed
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 7ecf1f17920..bda658ef128 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -112,7 +112,7 @@
add_fingerprint(user)
user.changeNext_move(CLICK_CD_MELEE)
- if(can_force && (!glass || user.a_intent != I_HELP))
+ if(can_force && (!glass || user.a_intent != INTENT_HELP))
user.visible_message("[user] begins forcing \the [src].", \
"You begin forcing \the [src].")
if(do_after(user, force_open_time, target = src))
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index a4d70d78023..1d392d187cf 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -88,7 +88,7 @@
overlays += I
/obj/item/hair_dye_bottle/attack(mob/living/carbon/M as mob, mob/user as mob)
- if(user.a_intent != "help")
+ if(user.a_intent != INTENT_HELP)
..()
return
if(!(M in view(1)))
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 1b685f50197..58e4525a30c 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -51,7 +51,7 @@
/obj/machinery/flasher/attack_ai(mob/user)
if(anchored)
return flash()
-
+
/obj/machinery/flasher/attack_ghost(mob/user)
if(anchored && user.can_advanced_admin_interact())
return flash()
@@ -92,7 +92,7 @@
if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
- if((M.m_intent != "walk") && (anchored))
+ if((M.m_intent != MOVE_INTENT_WALK) && (anchored))
flash()
/obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
@@ -119,11 +119,11 @@
anchored = 1.0
use_power = 1
idle_power_usage = 2
- active_power_usage = 4
-
+ active_power_usage = 4
+
/obj/machinery/flasher_button/attack_ai(mob/user as mob)
return attack_hand(user)
-
+
/obj/machinery/flasher_button/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
return attack_hand(user)
@@ -150,4 +150,4 @@
sleep(50)
icon_state = "launcherbtt"
- active = 0
\ No newline at end of file
+ active = 0
diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm
index 3abbcef84ae..5ce444bcc09 100644
--- a/code/game/machinery/holosign.dm
+++ b/code/game/machinery/holosign.dm
@@ -36,7 +36,7 @@
/obj/machinery/holosign_switch
name = "holosign switch"
icon = 'icons/obj/power.dmi'
- icon_state = "light1"
+ icon_state = "light0"
desc = "A remote control switch for holosign."
var/id = null
var/active = 0
diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm
index 6b6b1938de9..039e894b86d 100644
--- a/code/game/machinery/programmable_unloader.dm
+++ b/code/game/machinery/programmable_unloader.dm
@@ -501,7 +501,7 @@
to_chat(H, "The boxing machine refuses to acknowledge you unless you face it head on!")
return
var/damage = 0
- if(H.a_intent != I_HARM)
+ if(H.a_intent != INTENT_HARM)
damage += rand(0,5)
else
damage += rand(0,10)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 1a901f4a71e..a08f4bea77a 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -157,10 +157,10 @@
log_message("Toggled zoom mode.")
occupant_message("Zoom mode [zoom?"en":"dis"]abled.")
if(zoom)
- occupant.client.view = 12
+ occupant.client.AddViewMod("mecha", 12)
to_chat(occupant, sound('sound/mecha/imag_enh.ogg',volume=50))
else
- occupant.client.view = initial(occupant.client.view)
+ occupant.client.RemoveViewMod("mecha")
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 81fba15d1e8..4421eba9aae 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -51,7 +51,7 @@
else if(istype(target,/mob/living))
var/mob/living/M = target
if(M.stat == DEAD) return
- if(chassis.occupant.a_intent == I_HARM)
+ if(chassis.occupant.a_intent == INTENT_HARM)
M.take_overall_damage(dam_force)
if(!M)
return
@@ -101,11 +101,11 @@
else if(istype(target,/mob/living))
var/mob/living/M = target
if(M.stat == DEAD) return
- if(chassis.occupant.a_intent == I_HARM)
+ if(chassis.occupant.a_intent == INTENT_HARM)
target.visible_message("[chassis] destroys [target] in an unholy fury.",
"[chassis] destroys [target] in an unholy fury.")
M.gib()
- /*if(chassis.occupant.a_intent == I_DISARM)
+ /*if(chassis.occupant.a_intent == INTENT_DISARM)
target.visible_message("[chassis] rips [target]'s arms off.",
"[chassis] rips [target]'s arms off.")*/
else
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 9c554407afa..77bcc4c1966 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -77,6 +77,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
name = "CH-PD Disabler"
+ origin_tech = "combat=3"
projectile = /obj/item/projectile/beam/disabler
projectiles_per_shot = 2
projectile_delay = 1
@@ -104,7 +105,7 @@
name = "P-X Tesla Cannon"
desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine"
icon_state = "mecha_laser"
- origin_tech = "materials=4;combat=5;magnets=4"
+ origin_tech = "materials=4;engineering=4;combat=6;magnets=6"
energy_drain = 500
projectile = /obj/item/projectile/energy/shock_revolver
fire_sound = 'sound/magic/lightningbolt.ogg'
@@ -129,7 +130,7 @@
name = "ZFI Immolation Beam Gun"
desc = "A weapon for combat exosuits. Fires beams of extreme heat that set targets on fire."
icon_state = "mecha_laser"
- origin_tech = "materials=4;combat=4;magnets=3;plasmatech=2"
+ origin_tech = "materials=4;engineering=4;combat=6;magnets=6"
energy_drain = 80
projectile = /obj/item/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 9eab3e88cee..975ecdc1e84 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -748,7 +748,7 @@
to_chat(user, "There's not enough wire to finish the task.")
return
- else if(isscrewdriver(W) && user.a_intent != I_HARM)
+ else if(isscrewdriver(W) && user.a_intent != INTENT_HARM)
if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
to_chat(user, "You repair the damaged temperature controller.")
@@ -776,7 +776,7 @@
to_chat(user, "There's already a powercell installed.")
return
- else if(iswelder(W) && user.a_intent != I_HARM)
+ else if(iswelder(W) && user.a_intent != INTENT_HARM)
var/obj/item/weapon/weldingtool/WT = W
if(health18, knife 10->30, hatchet 12->36
if(I.damtype != STAMINA)
endurance -= damage_to_do
CheckEndurance()
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 7045a06a875..ebfd177959e 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -198,3 +198,27 @@
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
/obj/item/pizzabox = 3,
)
+
+/obj/effect/spawner/lootdrop/three_course_meal
+ name = "three course meal spawner"
+ lootcount = 3
+ lootdoubles = FALSE
+ var/soups = list(
+ /obj/item/weapon/reagent_containers/food/snacks/beetsoup,
+ /obj/item/weapon/reagent_containers/food/snacks/stew,
+ /obj/item/weapon/reagent_containers/food/snacks/hotchili,
+ /obj/item/weapon/reagent_containers/food/snacks/nettlesoup,
+ /obj/item/weapon/reagent_containers/food/snacks/meatballsoup)
+ var/salads = list(
+ /obj/item/weapon/reagent_containers/food/snacks/herbsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/validsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/aesirsalad)
+ var/mains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas,
+ /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat,
+ /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
+ /obj/item/weapon/reagent_containers/food/snacks/superbiteburger)
+
+/obj/effect/spawner/lootdrop/three_course_meal/New()
+ loot = list(pick(soups) = 1,pick(salads) = 1,pick(mains) = 1)
+ . = ..()
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
new file mode 100644
index 00000000000..b076b7be43c
--- /dev/null
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -0,0 +1,188 @@
+//Cardboard cutouts! They're man-shaped and can be colored with a crayon to look like a human in a certain outfit, although it's limited, discolored, and obvious to more than a cursory glance.
+/obj/item/cardboard_cutout
+ name = "cardboard cutout"
+ desc = "A vaguely humanoid cardboard cutout. It's completely blank."
+ icon = 'icons/obj/cardboard_cutout.dmi'
+ icon_state = "cutout_basic"
+ burn_state = FLAMMABLE
+ w_class = WEIGHT_CLASS_BULKY
+ var/list/possible_appearances = list("Assistant", "Clown", "Mime",
+ "Traitor", "Nuke Op", "Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer",
+ "Deathsquad Officer", "Ian", "Slaughter Demon",
+ "Laughter Demon", "Xenomorph Maid", "Security Officer", "Terror Spider")
+ var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
+ var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version
+ var/lastattacker = null
+
+/obj/item/cardboard_cutout/attack_hand(mob/living/user)
+ if(user.a_intent == INTENT_HELP || pushed_over)
+ return ..()
+ user.visible_message("[user] pushes over [src]!", "You push over [src]!")
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ push_over()
+
+/obj/item/cardboard_cutout/proc/push_over()
+ name = initial(name)
+ desc = "[initial(desc)] It's been pushed over."
+ icon = initial(icon)
+ icon_state = "cutout_pushed_over"
+ color = initial(color)
+ alpha = initial(alpha)
+ pushed_over = TRUE
+
+/obj/item/cardboard_cutout/attack_self(mob/living/user)
+ if(!pushed_over)
+ return
+ to_chat(user, "You right [src].")
+ desc = initial(desc)
+ icon = initial(icon)
+ icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting
+ pushed_over = FALSE
+
+/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/toy/crayon))
+ change_appearance(I, user)
+ return
+ // Why yes, this does closely resemble mob and object attack code.
+ if(I.flags & NOBLUDGEON)
+ return
+ if(!I.force)
+ playsound(loc, 'sound/weapons/tap.ogg', 20, 1, -1)
+ else if(I.hitsound)
+ playsound(loc, I.hitsound, 20, 1, -1)
+
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+
+ if(I.force)
+ user.visible_message("[user] has hit \
+ [src] with [I]!", "You hit [src] \
+ with [I]!")
+
+ if(prob(I.force))
+ push_over()
+
+/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P)
+ visible_message("[src] has been hit by [P]!")
+ playsound(src, 'sound/weapons/slice.ogg', 50, 1)
+ if(prob(P.damage))
+ push_over()
+
+/obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user)
+ if(!crayon || !user)
+ return
+ if(istype(crayon, /obj/item/toy/crayon/spraycan))
+ var/obj/item/toy/crayon/spraycan/can = crayon
+ if(can.capped)
+ to_chat(user, "The cap is on [src] remove it first!")
+ return
+ if(pushed_over)
+ to_chat(user, "Right [src] first!")
+ return
+ var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances
+ if(!new_appearance || !crayon)
+ return
+ if(!do_after(user, 10, FALSE, src, TRUE))
+ return
+ user.visible_message("[user] gives [src] a new look.", "Voila! You give [src] a new look.")
+ alpha = 255
+ icon = initial(icon)
+ if(!deceptive)
+ color = "#FFD7A7"
+ switch(new_appearance)
+ if("Assistant")
+ name = "[pick(first_names_male)] [pick(last_names)]"
+ desc = "A cardboard cutout of an assistant."
+ icon_state = "cutout_greytide"
+ if("Clown")
+ name = pick(clown_names)
+ desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner."
+ icon_state = "cutout_clown"
+ if("Mime")
+ name = pick(mime_names)
+ desc = "...(A cardboard cutout of a mime.)"
+ icon_state = "cutout_mime"
+ if("Traitor")
+ name = "[pick("Unknown", "Captain")]"
+ desc = "A cardboard cutout of a traitor."
+ icon_state = "cutout_traitor"
+ if("Nuke Op")
+ name = "[pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic", "Gonk op")]"
+ desc = "A cardboard cutout of a nuclear operative."
+ icon_state = "cutout_fluke"
+ if("Cultist")
+ name = "Unknown"
+ desc = "A cardboard cutout of a cultist."
+ icon_state = "cutout_cultist"
+ //if("Clockwork Cultist")
+ // name = "[random_name(pick(MALE,FEMALE))]"
+ // desc = "A cardboard cutout of a servant of Ratvar."
+ // icon_state = "cutout_servant"
+ if("Revolutionary")
+ name = "Unknown"
+ desc = "A cardboard cutout of a revolutionary."
+ icon_state = "cutout_viva"
+ if("Wizard")
+ name = "[pick(wizard_first)], [pick(wizard_second)]"
+ desc = "A cardboard cutout of a wizard."
+ icon_state = "cutout_wizard"
+ if("Shadowling")
+ name = "Unknown"
+ desc = "A cardboard cutout of a shadowling."
+ icon_state = "cutout_shadowling"
+ if("Xenomorph")
+ name = "alien hunter ([rand(1, 999)])"
+ desc = "A cardboard cutout of a xenomorph."
+ icon_state = "cutout_fukken_xeno"
+ if(prob(10))
+ alpha = 75 //Spooky sneaking!
+ if("Swarmer")
+ name = "Swarmer ([rand(1, 999)])"
+ desc = "A cardboard cutout of a swarmer."
+ icon_state = "cutout_swarmer"
+ //if("Ash Walker")
+ // name = random_name(pick(MALE,FEMALE),"Unathi")
+ // desc = "A cardboard cutout of an ash walker."
+ // icon_state = "cutout_free_antag"
+ if("Deathsquad Officer")
+ name = pick(commando_names)
+ desc = "A cardboard cutout of a death commando."
+ icon_state = "cutout_deathsquad"
+ if("Ian")
+ name = "Ian"
+ desc = "A cardboard cutout of the HoP's beloved corgi."
+ icon_state = "cutout_ian"
+ if("Slaughter Demon")
+ name = "slaughter demon"
+ desc = "A cardboard cutout of a slaughter demon."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "daemon"
+ dir = "SOUTH"
+ if("Laughter Demon")
+ name = "laughter demon"
+ desc = "A cardboard cutout of a laughter demon."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "bowmon"
+ dir = "SOUTH"
+ if("Xenomorph Maid")
+ name = "lusty xenomorph maid ([rand(1, 999)])"
+ desc = "A cardboard cutout of a xenomorph maid."
+ icon_state = "cutout_lusty"
+ if("Security Officer")
+ name = "Private Security Officer"
+ desc = "A cardboard cutout of a private security officer."
+ icon_state = "cutout_ntsec"
+ if("Terror Spider")
+ name = "Gray Terror Spider"
+ desc = "A cardboard cutout of a terror spider."
+ icon = 'icons/mob/terrorspider.dmi'
+ icon_state = "terror_gray"
+ dir = "SOUTH"
+
+ return 1
+
+/obj/item/cardboard_cutout/setDir()
+ dir = SOUTH
+
+/obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed
+ deceptive = TRUE
diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm
index 127f3f82c41..56fd5eadbad 100644
--- a/code/game/objects/items/policetape.dm
+++ b/code/game/objects/items/policetape.dm
@@ -162,7 +162,7 @@ var/list/tape_roll_applications = list()
breaktape(W, user)
/obj/item/tape/attack_hand(mob/user as mob)
- if(user.a_intent == I_HELP && src.allowed(user))
+ if(user.a_intent == INTENT_HELP && src.allowed(user))
user.visible_message("[user] lifts [src], allowing passage.", "You lift [src], allowing passage.")
src.density = 0
spawn(200)
@@ -174,7 +174,7 @@ var/list/tape_roll_applications = list()
breaktape(/obj/item/weapon/wirecutters,user)
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
- if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
+ if(user.a_intent == INTENT_HELP && ((!can_puncture(W) && src.allowed(user))))
to_chat(user, "You can't break the [src] with that!")
return
user.visible_message("[user] breaks the [src]!", "You break the [src]!")
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 858365f6d29..67755655fe3 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -237,6 +237,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
new /datum/stack_recipe("folder", /obj/item/weapon/folder),
new /datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube),
new /datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4),
+ new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5),
)
/obj/item/stack/sheet/cardboard //BubbleWrap
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 1fec38f491b..f982c89a8c3 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -100,6 +100,11 @@
turf_type = /turf/simulated/floor/carpet
burn_state = FLAMMABLE
+/obj/item/stack/tile/carpet/black
+ name = "black carpet"
+ icon_state = "tile-carpet-black"
+ turf_type = /turf/simulated/floor/carpet/black
+
//Plasteel
/obj/item/stack/tile/plasteel
name = "floor tiles"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 575cf09a6b1..83b6d31a0ea 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -283,7 +283,7 @@
/obj/item/toy/snappop/Crossed(H as mob|obj)
if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
- if(issilicon(H) || M.m_intent == "run")
+ if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN)
to_chat(M, "You step on the snap pop!")
pop_burst(2, 0)
diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm
index 250aff951fd..032decd7bc5 100644
--- a/code/game/objects/items/weapons/caution.dm
+++ b/code/game/objects/items/weapons/caution.dm
@@ -44,7 +44,7 @@
if(armed)
if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
var/mob/living/carbon/C = AM
- if(C.m_intent != "walk")
+ if(C.m_intent != MOVE_INTENT_WALK)
src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
explosion(src.loc,-1,0,2)
if(ishuman(C))
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 7be57f646c4..ad8a30bed07 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -19,7 +19,7 @@
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
if(user.client && (target in user.client.screen))
to_chat(user, "You need to take that [target.name] off before cleaning it.")
- else if(target == user && user.a_intent == I_GRAB && ishuman(target))
+ else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target))
var/mob/living/carbon/human/muncher = user
if(muncher && muncher.get_species() == "Drask")
to_chat(user, "You take a bite of the [src.name]. Delicious!")
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index ee7a6d4764b..8705b86ea3a 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -319,7 +319,7 @@
to_chat(user, "The instructions on [defib] don't mention how to revive that...")
return
else
- if(user.a_intent == I_HARM && !defib.safety)
+ if(user.a_intent == INTENT_HARM && !defib.safety)
busy = 1
H.visible_message("[user] has touched [H.name] with [src]!", \
"[user] has touched [H.name] with [src]!")
@@ -465,7 +465,7 @@
to_chat(user, "This unit is only designed to work on humanoid lifeforms.")
return
else
- if(user.a_intent == I_HARM && !safety)
+ if(user.a_intent == INTENT_HARM && !safety)
busy = 1
H.visible_message("[user] has touched [H.name] with [src]!", \
"[user] has touched [H.name] with [src]!")
diff --git a/code/game/objects/items/weapons/highlander_swords.dm b/code/game/objects/items/weapons/highlander_swords.dm
new file mode 100644
index 00000000000..22686b90c96
--- /dev/null
+++ b/code/game/objects/items/weapons/highlander_swords.dm
@@ -0,0 +1,50 @@
+
+//Highlander Style Martial Art
+// Prevents use of guns, but makes the highlander impervious to ranged attacks. Their bravery in battle shields them from the weapons of COWARDS!
+
+/datum/martial_art/highlander
+ name = "Highlander Style"
+ deflection_chance = 100
+ no_guns = TRUE
+ no_guns_message = "You'd never stoop so low as to use the weapon of a COWARD!"
+
+
+//Highlander Claymore
+// Grants the wielder the Highlander Style Martial Art
+
+/obj/item/weapon/claymore/highlander
+ name = "Highlander Claymore"
+ desc = "Imbues the wielder with legendary martial prowress and a nigh-unquenchable thirst for glorious battle!"
+ var/datum/martial_art/highlander/style = new
+
+/obj/item/weapon/claymore/highlander/Destroy()
+ if(ishuman(loc)) //just in case it gets destroyed while in someone's possession, such as due to acid or something?
+ var/mob/living/carbon/human/H = loc
+ style.remove(H)
+ QDEL_NULL(style)
+ return ..()
+
+/obj/item/weapon/claymore/highlander/equipped(mob/user, slot)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(slot == slot_r_hand || slot == slot_l_hand)
+ if(H.martial_art && H.martial_art != style)
+ style.teach(H, 1)
+ to_chat(H, "THERE CAN ONLY BE ONE!")
+ else if(H.martial_art && H.martial_art == style)
+ style.remove(H)
+ var/obj/item/weapon/claymore/highlander/sword = H.is_in_hands(/obj/item/weapon/claymore/highlander)
+ if(sword)
+ //if we have a highlander sword in the other hand, relearn the style from that sword.
+ sword.style.teach(H, 1)
+
+/obj/item/weapon/claymore/highlander/dropped(mob/user)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ style.remove(H)
+ var/obj/item/weapon/claymore/highlander/sword = H.is_in_hands(/obj/item/weapon/claymore/highlander)
+ if(sword)
+ //if we have a highlander sword in the other hand, relearn the style from that sword.
+ sword.style.teach(H, 1)
diff --git a/code/game/objects/items/weapons/implants/implant_track.dm b/code/game/objects/items/weapons/implants/implant_track.dm
index d0d1159a9c5..e0d44cdefcf 100644
--- a/code/game/objects/items/weapons/implants/implant_track.dm
+++ b/code/game/objects/items/weapons/implants/implant_track.dm
@@ -30,3 +30,11 @@
circuitry. As a result neurotoxins can cause massive damage.
Implant Specifics:
"}
return dat
+
+/obj/item/weapon/implantcase/track
+ name = "implant case - 'Tracking'"
+ desc = "A glass case containing a tracking implant."
+
+/obj/item/weapon/implantcase/track/New()
+ imp = new /obj/item/weapon/implant/tracking(src)
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index c3763f4924e..13bc85999e0 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -40,7 +40,7 @@
if(!istype(M))
return ..()
- if(user.a_intent != I_HELP)
+ if(user.a_intent != INTENT_HELP)
if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
if((CLUMSY in user.mutations) && prob(50))
M = user
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 5571640f08f..e5bd30fe609 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -20,7 +20,7 @@
toolspeed = 0.75
/obj/item/weapon/scissors/attack(mob/living/carbon/M as mob, mob/user as mob)
- if(user.a_intent != "help")
+ if(user.a_intent != INTENT_HELP)
..()
return
if(!(M in view(1))) //Adjacency test
@@ -101,7 +101,7 @@
var/is_cutting = 0 //to prevent spam clicking this for huge accumulation of losebreath.
/obj/item/weapon/scissors/safety/attack(mob/living/carbon/M as mob, mob/user as mob)
- if(user.a_intent != "help")
+ if(user.a_intent != INTENT_HELP)
..()
return
if(!(M in view(1)))
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
index f256c1695cd..29d4d310b5d 100644
--- a/code/game/objects/items/weapons/stock_parts.dm
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -179,7 +179,7 @@
name = "pico-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "pico_mani"
- origin_tech = "materials=4;programming=4,engineering=4"
+ origin_tech = "materials=4;programming=4;engineering=4"
rating = 3
materials = list(MAT_METAL=30)
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index d721cb46271..9efc5f625a6 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -216,3 +216,13 @@
B.deity_name = "Success"
B.icon_state = "greentext"
B.item_state = "greentext"
+
+
+/obj/item/weapon/storage/box/syndie_kit/cutouts
+ name = "Fortified Artistic Box"
+
+/obj/item/weapon/storage/box/syndie_kit/cutouts/New()
+ ..()
+ for(var/i in 1 to 3)
+ new/obj/item/cardboard_cutout/adaptive(src)
+ new/obj/item/toy/crayon/spraycan(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 9a01f150ea9..c4c29a9542f 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -118,7 +118,7 @@
var/mob/living/L = M
- if(user.a_intent != I_HARM)
+ if(user.a_intent != INTENT_HARM)
if(status)
user.do_attack_animation(L)
baton_stun(L, user)
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index e55b2451347..3ce0f32d47a 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -46,7 +46,7 @@
return
if(!isliving(target))
return
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
if(!..()) return
if(!isrobot(target)) return
else
diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm
index 684dbc688a1..7655fba3605 100644
--- a/code/game/objects/items/weapons/table_rack_parts.dm
+++ b/code/game/objects/items/weapons/table_rack_parts.dm
@@ -46,6 +46,18 @@
/obj/item/stack/sheet/wood,
/obj/item/stack/sheet/wood)
+/obj/item/weapon/table_parts/wood/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/stack/tile/carpet))
+ var/target = /obj/item/weapon/table_parts/fancy
+ if(istype(W, /obj/item/stack/tile/carpet/black))
+ target = /obj/item/weapon/table_parts/fancy/black
+ var/obj/item/stack/S = W
+ if(S.use(1))
+ new target(get_turf(src))
+ qdel(src)
+ else
+ . = ..()
+
/obj/item/weapon/table_parts/glass
name = "glass table parts"
desc = "fragile!"
@@ -57,6 +69,17 @@
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/metal)
+/obj/item/weapon/table_parts/fancy
+ name = "fancy table parts"
+ desc = "Pretty!"
+ icon_state = "fancy_tableparts"
+ result = /obj/structure/table/wood/fancy
+
+/obj/item/weapon/table_parts/fancy/black
+ name = "black fancy table parts"
+ icon_state = "black_fancy_tableparts"
+ result = /obj/structure/table/wood/fancy/black
+
/obj/item/weapon/rack_parts
name = "rack parts"
desc = "Parts of a rack."
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 3460699fbe4..8aabce1eb54 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -155,7 +155,7 @@
src.pixel_y = rand(0, 16)
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
- if(!istype(M) || user.a_intent == I_HELP)
+ if(!istype(M) || user.a_intent == INTENT_HELP)
return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
return ..()
@@ -404,7 +404,7 @@
if(!S)
return
- if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2)
+ if(!(S.status & ORGAN_ROBOT) || user.a_intent != INTENT_HELP || S.open == 2)
return ..()
if(!isOn()) //why wasn't this being checked already?
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 9636e1407b6..f3ab646c952 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -1,10 +1,3 @@
-/////////////////
-// NEW DEFINES //
-/////////////////
-
-/client
- var/viewingCanvas = 0 //If this is 1, as soon as client /TRIES/ to move the view resets.
-
///////////
// EASEL //
///////////
@@ -140,20 +133,4 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES]
icon = blank
user.visible_message("[user] cleans the canvas.","You clean the canvas.")
-//Examine to enlarge
-/obj/item/weapon/canvas/examine(mob/user)
- ..(user)
- if(in_range(user, src) && get_turf(src) && user.client && ishuman(user)) //Let only humans be the robust zoominators. I'm too spooked other mobs trying to use it may get broken huds.
- if(src.loc == user || get_turf(src) == get_turf(user))
- to_chat(user, "[src] has to be on the ground to focus on it!")
- return
- to_chat(user, "You focus on \the [src].")
- user.client.screen = list() //This is because screen objects go way past the view bounds we set, therefore not allowing stretch to fit to zoom in properly.
- user.client.reset_stretch = winget(user.client, "mapwindow.map", "icon-size") //Remember previous icon-size
- user.client.view = 3 //Decrease view
- winset(user.client, "mapwindow.map", "icon-size=0") //Enable stretch-to-fit
- user.client.viewingCanvas = 1 //Reset everything we just changed as soon as client tries to move
- else
- to_chat(user, "It is too far away.")
-
#undef AMT_OF_CANVASES
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 6db9a26fd8d..d5b966c7d98 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -193,6 +193,9 @@
L[tmpname] = R
var/desc = input("Please select a telepad.", "RCS") in L
E.pad = L[desc]
+ if(!Adjacent(user))
+ to_chat(user, "Unable to teleport, too far from crate.")
+ return
playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "Teleporting [name]...")
E.teleporting = 1
@@ -204,17 +207,22 @@
to_chat(user, "Error: User located in container--aborting for safety.")
playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
return
+ if(!(E.rcell && E.rcell.use(E.chargecost)))
+ to_chat(user, "Unable to teleport, insufficient charge.")
+ return
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, E.pad, 0)
- E.rcell.use(E.chargecost)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
else
E.rand_x = rand(50,200)
E.rand_y = rand(50,200)
var/L = locate(E.rand_x, E.rand_y, 6)
+ if(!Adjacent(user))
+ to_chat(user, "Unable to teleport, too far from crate.")
+ return
playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "Teleporting [name]...")
E.teleporting = 1
@@ -226,11 +234,13 @@
to_chat(user, "Error: User located in container--aborting for safety.")
playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
return
+ if(!(E.rcell && E.rcell.use(E.chargecost)))
+ to_chat(user, "Unable to teleport, insufficient charge.")
+ return
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, L)
- E.rcell.use(E.chargecost)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
else
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 76b69edc28c..ed2599e91dd 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -327,7 +327,7 @@
new /obj/item/clothing/suit/storage/det_suit(src)
new /obj/item/clothing/suit/storage/det_suit/forensics/blue(src)
new /obj/item/clothing/suit/storage/det_suit/forensics/red(src)
- new /obj/item/clothing/gloves/color/black(src)
+ new /obj/item/clothing/gloves/color/black/forensics(src)
new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/box/evidence(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 07a738a8c94..010da69a834 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -102,6 +102,9 @@
L[tmpname] = R
var/desc = input("Please select a telepad.", "RCS") in L
E.pad = L[desc]
+ if(!Adjacent(user))
+ to_chat(user, "Unable to teleport, too far from crate.")
+ return
playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "Teleporting [src.name]...")
E.teleporting = 1
@@ -109,17 +112,23 @@
E.teleporting = 0
return
E.teleporting = 0
+ if(!(E.rcell && E.rcell.use(E.chargecost)))
+ to_chat(user, "Unable to teleport, insufficient charge.")
+ return
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, E.pad, 0)
- E.rcell.use(E.chargecost)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
+
else
E.rand_x = rand(50,200)
E.rand_y = rand(50,200)
var/L = locate(E.rand_x, E.rand_y, 6)
+ if(!Adjacent(user))
+ to_chat(user, "Unable to teleport, too far from crate.")
+ return
playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "Teleporting [src.name]...")
E.teleporting = 1
@@ -127,11 +136,13 @@
E.teleporting = 0
return
E.teleporting = 0
+ if(!(E.rcell && E.rcell.use(E.chargecost)))
+ to_chat(user, "Unable to teleport, insufficient charge.")
+ return
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, L)
- E.rcell.use(E.chargecost)
to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
return
else
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index 104fac7fd69..0fbc7b97879 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -35,6 +35,44 @@
icon_state = "open"
layer = SHOWER_OPEN_LAYER
+/obj/structure/curtain/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/toy/crayon))
+ color = input(user, "Choose Color") as color
+ else if(isscrewdriver(W))
+ if(anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ if(!anchored)
+ return
+ anchored = FALSE
+ to_chat(user, "You unscrew [src] from the floor.")
+ else
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ if(anchored)
+ return
+ anchored = TRUE
+ to_chat(user, "You screw [src] to the floor.")
+ else if(istype(W, /obj/item/weapon/wirecutters))
+ if(!anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.")
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ if(anchored)
+ return
+ to_chat(user, "You cut apart [src].")
+ deconstruct()
+ else
+ . = ..()
+
+/obj/structure/curtain/proc/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/cloth(loc, 2)
+ new /obj/item/stack/sheet/plastic(loc, 2)
+ new /obj/item/stack/rods(loc, 1)
+ qdel(src)
+
/obj/structure/curtain/black
name = "black curtain"
color = "#222222"
@@ -59,4 +97,4 @@
color = "#000066"
#undef SHOWER_OPEN_LAYER
-#undef SHOWER_CLOSED_LAYER
\ No newline at end of file
+#undef SHOWER_CLOSED_LAYER
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 72638ff0943..858d0e83c6e 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -105,19 +105,21 @@ var/global/list/captain_display_cases = list()
var/ue = null
var/image/occupant_overlay = null
var/obj/item/weapon/airlock_electronics/circuit
+ var/start_showpiece_type = null //add type for items on display
+
+/obj/structure/displaycase/New()
+ . = ..()
+ if(start_showpiece_type)
+ occupant = new start_showpiece_type(src)
+ update_icon()
/obj/structure/displaycase/captains_laser
name = "captain's display case"
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
- burglar_alarm = 1
-
-/obj/structure/displaycase/captains_laser/New()
- captain_display_cases += src
- req_access = list(access_captain)
+ burglar_alarm = 1
locked = 1
- spawn(5)
- occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
- update_icon()
+ req_access = list(access_captain)
+ start_showpiece_type = /obj/item/weapon/gun/energy/laser/captain
/obj/structure/displaycase/Destroy()
dump()
@@ -259,7 +261,7 @@ var/global/list/captain_display_cases = list()
if(W.flags & ABSTRACT)
to_chat(user, "You can't put this into the case.")
return
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
if(locked && !destroyed)
src.health -= W.force
src.healthcheck()
@@ -283,14 +285,14 @@ var/global/list/captain_display_cases = list()
update_icon()
/obj/structure/displaycase/attack_hand(mob/user as mob)
- if(destroyed || (!locked && user.a_intent == I_HARM))
+ if(destroyed || (!locked && user.a_intent == INTENT_HARM))
if(occupant)
dump()
to_chat(user, "You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field.")
src.add_fingerprint(user)
update_icon()
else
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("[user.name] kicks \the [src]!", \
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 43d08cccee9..b53ca70f9da 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -136,7 +136,7 @@
if(do_after(user, digTool.digspeed * hardness, target = src) && src)
to_chat(user, "You finished digging.")
deconstruct(TRUE)
- else if(user.a_intent != I_HARM)
+ else if(user.a_intent != INTENT_HARM)
attack_hand(user)
else
attacked_by(W, user)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 55181579699..d6bec1019b2 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -412,6 +412,35 @@
/obj/structure/table/woodentable/poker/narsie_act()
return
+/*
+ * Fancy Tables
+ */
+
+/obj/structure/table/wood/fancy
+ name = "fancy table"
+ desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth."
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table"
+ parts = /obj/item/weapon/table_parts/fancy
+ canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black)
+
+/obj/structure/table/wood/fancy/New()
+ icon = 'icons/obj/smooth_structures/fancy_table.dmi' //so that the tables place correctly in the map editor
+ ..()
+
+/obj/structure/table/wood/fancy/black
+ icon_state = "fancy_table_black"
+ parts = /obj/item/weapon/table_parts/fancy/black
+
+/obj/structure/table/wood/fancy/black/New()
+ ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' //so that the tables place correctly in the map editor
+
+
+/*
+ * Glass Tables
+ */
+
/obj/structure/glasstable_frame
name = "glass table frame"
desc = "A metal frame for a glass table."
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index a43406eb3c7..d3cc48d46bf 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -120,6 +120,15 @@
to_chat(user, "You carefully place [I] into the cistern.")
return
+/obj/structure/toilet/secret
+ var/secret_type = null
+
+/obj/structure/toilet/secret/New()
+ . = ..()
+ if(secret_type)
+ var/obj/item/secret = new secret_type(src)
+ secret.desc += " It's a secret!"
+ w_items += secret.w_class
/obj/structure/urinal
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 9da30e5fe82..126dd6e3a38 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -133,7 +133,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]!")
destroy()
- else if(user.a_intent == I_HARM)
+ else if(user.a_intent == INTENT_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
user.visible_message("[user.name] bangs against the [src.name]!", \
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 94dc68b51f2..f4d281cdf68 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -145,6 +145,11 @@
burnt = 1
update_icon()
+/turf/simulated/floor/carpet/black
+ icon = 'icons/turf/floors/carpet_black.dmi'
+ floor_tile = /obj/item/stack/tile/carpet/black
+ canSmoothWith = list(/turf/simulated/floor/carpet/black)
+
/turf/simulated/floor/fakespace
icon = 'icons/turf/space.dmi'
icon_state = "0"
@@ -153,4 +158,4 @@
/turf/simulated/floor/fakespace/New()
..()
- icon_state = "[rand(0,25)]"
\ No newline at end of file
+ icon_state = "[rand(0,25)]"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 6853baf0755..d7de6dd6844 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -101,7 +101,9 @@ var/global/nologevent = 0
[check_rights(R_ADMIN,0) ? "Traitor panel | " : "" ]
Narrate to |
- Subtle message
+ Subtle message |
+ Bless |
+ Smite
"}
if(M.client)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index d6a5ede9ed8..4c9194d1225 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -229,7 +229,8 @@ var/list/admin_verbs_snpc = list(
verbs += /client/proc/togglebuildmodeself
if(holder.rights & R_ADMIN)
verbs += admin_verbs_admin
- control_freak = 0
+ spawn(1)
+ control_freak = 0
if(holder.rights & R_BAN)
verbs += admin_verbs_ban
if(holder.rights & R_EVENT)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 605c4acd1f3..b43001f3abc 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1546,7 +1546,7 @@
to_chat(X, take_msg)
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, take_msg)
- to_chat(M, "Your question is being attended to by [key_name(usr.client)]. Thanks for your patience!")
+ to_chat(M, "Your question is being attended to by [key_name(usr.client, null, 0)]. Thanks for your patience!")
else
to_chat(usr, "Unable to locate mob.")
@@ -1790,9 +1790,15 @@
H = M
ptypes += "Brain Damage"
ptypes += "Honk Tumor"
+ ptypes += "Hallucinate"
+ ptypes += "Cold"
+ ptypes += "Hunger"
ptypes += "Cluwne"
ptypes += "Mutagen Cookie"
ptypes += "Hellwater Cookie"
+ ptypes += "Assassin"
+ ptypes += "Priest"
+ ptypes += "Lynch"
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
@@ -1820,6 +1826,15 @@
to_chat(H, "Life seems funnier, somehow.")
organ.insert(H)
logmsg = "a honk tumor."
+ if("Hallucinate")
+ H.Hallucinate(1000)
+ logmsg = "hallucinations."
+ if("Hunger")
+ H.nutrition = NUTRITION_LEVEL_CURSED
+ logmsg = "starvation."
+ if("Cold")
+ H.reagents.add_reagent("frostoil", 40)
+ H.reagents.add_reagent("ice", 40)
if("Cluwne")
H.makeCluwne()
logmsg = "cluwned."
@@ -1828,6 +1843,7 @@
evilcookie.reagents.add_reagent("mutagen", 10)
evilcookie.desc = "It has a faint green glow."
evilcookie.bitesize = 100
+ evilcookie.flags = NODROP
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a mutagen cookie."
@@ -1836,9 +1852,92 @@
evilcookie.reagents.add_reagent("hell_water", 25)
evilcookie.desc = "Sulphur-flavored."
evilcookie.bitesize = 100
+ evilcookie.flags = NODROP
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
+ if("Priest")
+ logmsg = "priest."
+ H.mutations |= NOCLONE
+ message_admins("[key_name_admin(owner)] is sending a dark priest to assassinate [key_name_admin(M)]...")
+ var/list/candidates = pollCandidates("Do you want to play as a murderous dark priest?")
+ if(!candidates.len)
+ to_chat(usr, "ERROR: Could not create priest. No valid candidates.")
+ return
+ var/mob/C = pick(candidates)
+ var/key_of_priest = C.key
+ if(!key_of_priest)
+ to_chat(usr, "ERROR: Could not create priest. Could not pick key.")
+ return
+ var/datum/mind/priest_mind = new /datum/mind(key_of_priest)
+ priest_mind.active = 1
+ var/mob/living/carbon/human/priest_mob = new /mob/living/carbon/human(pick(latejoin))
+ priest_mind.transfer_to(priest_mob)
+ var/datum/outfit/admin/dark_priest/O = new /datum/outfit/admin/dark_priest
+ priest_mob.equipOutfit(O, FALSE)
+ var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(priest_mob)
+ priest_mob.equip_to_slot_or_del(N, slot_r_store)
+ N.active = 1
+ N.mode = 2
+ N.target = H
+ N.point_at(N.target)
+ N.flags |= NODROP
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = priest_mind
+ kill_objective.target = H.mind
+ kill_objective.explanation_text = "Murder [H.real_name], the [H.mind.assigned_role], in the name of the dark gods."
+ priest_mind.objectives += kill_objective
+ ticker.mode.traitors |= priest_mob.mind
+ to_chat(priest_mob, "ATTENTION: You are now a dark priest!")
+ to_chat(priest_mob, "Goal: MURDER [H.real_name], currently in [get_area(H.loc)], in the name of the dark gods. ");
+ to_chat(priest_mob, "The gods will prevent their revival.");
+ priest_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
+ var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
+ tatorhud.join_hud(priest_mob)
+ ticker.mode.set_antag_hud(priest_mob, "hudsyndicate")
+ if("Assassin")
+ logmsg = "assassin."
+ var/list/possible_traitors = list()
+ for(var/mob/living/player in living_mob_list)
+ if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H)
+ if(ishuman(player))
+ if(player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate"))
+ possible_traitors += player.mind
+ for(var/datum/mind/player in possible_traitors)
+ if(player.current)
+ if(ismindshielded(player.current))
+ possible_traitors -= player
+ if(possible_traitors.len)
+ var/datum/mind/newtraitormind = pick(possible_traitors)
+ var/mob/living/newtraitor = newtraitormind.current
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = newtraitormind
+ kill_objective.target = H.mind
+ kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]."
+ newtraitormind.objectives += kill_objective
+ ticker.mode.equip_traitor(newtraitor)
+ ticker.mode.traitors |= newtraitor.mind
+ to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...")
+ to_chat(newtraitor, "You are now a traitor.")
+ to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]");
+ newtraitor.mind.special_role = SPECIAL_ROLE_TRAITOR
+ var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
+ tatorhud.join_hud(newtraitor)
+ ticker.mode.set_antag_hud(newtraitor, "hudsyndicate")
+ else
+ to_chat(usr, "ERROR: Failed to create a traitor.")
+ return
+ if("Lynch")
+ logmsg = "lynch."
+ for(var/datum/mind/crew in ticker.minds)
+ if(!crew.current)
+ continue
+ if(!isliving(crew.current))
+ continue
+ if(crew == H.mind)
+ continue
+ to_chat(crew.current, "
The gods have given you a task: find [H.real_name], located in [get_area(H.loc)], and slay them!");
+ to_chat(crew.current, "Do not harm anyone other than [H.real_name] while carrying out this task.
");
if("Gib")
logmsg = "gibbed."
M.gib(FALSE)
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 9bfe544cef5..79914745e79 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -37,7 +37,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/weapon/claymore(H), slot_r_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/claymore/highlander(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(H.loc), slot_l_store)
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 7436d27a608..e22923fa965 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -101,7 +101,7 @@
if(armed)
if(ishuman(AM))
var/mob/living/carbon/H = AM
- if(H.m_intent == "run")
+ if(H.m_intent == MOVE_INTENT_RUN)
triggered(H)
H.visible_message("[H] accidentally steps on [src].", \
"You accidentally step on [src]")
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index d547a9a582f..ca3d17e9c50 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -76,8 +76,6 @@
"off" = "borgmacro")
)
- var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit.
-
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
@@ -93,7 +91,7 @@
// Donator stuff.
var/donator_level = DONATOR_LEVEL_NONE
-
+
// If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
var/advanced_admin_interaction = FALSE
diff --git a/code/modules/client/view.dm b/code/modules/client/view.dm
new file mode 100644
index 00000000000..f4e74e203e8
--- /dev/null
+++ b/code/modules/client/view.dm
@@ -0,0 +1,90 @@
+/*
+ * ViewMods Client module
+ * This should be used by anything that wants to change a client's view range.
+ * Also includes
+ */
+
+/* Defines */
+#define CUSTOM_VIEWRANGES list(1, 2, 3, 4, 5, 6, "RESET")
+
+/* Viewmods */
+/client
+ var/list/ViewMods = list()
+ var/ViewModsActive = FALSE
+ var/ViewPreferedIconSize = 0
+
+/client/proc/AddViewMod(id, size)
+ var/datum/viewmod/V = new /datum/viewmod(id, size)
+ ViewMods[V.id] = V
+ UpdateView()
+
+/client/proc/CheckViewMod(id)
+ . = 0
+ if(ViewMods[id])
+ . = 1
+
+/client/proc/RemoveViewMod(id)
+ if(CheckViewMod(id))
+ qdel(ViewMods[id])
+ ViewMods.Remove(id)
+ UpdateView()
+
+/client/proc/UpdateView()
+ if(!ViewModsActive)
+ ViewPreferedIconSize = winget(src, "mapwindow.map", "icon-size")
+
+ var/highest_range = 0
+ for(var/mod_id in ViewMods)
+ var/datum/viewmod/V = ViewMods[mod_id]
+ highest_range = max(highest_range, V.size)
+
+ SetView(highest_range ? highest_range : world.view)
+ ViewModsActive = (highest_range > 0)
+
+/client/proc/SetView(view_range)
+ if(view_range == world.view)
+ winset(src, "mapwindow.map", "icon-size=[ViewPreferedIconSize]")
+ else
+ winset(src, "mapwindow.map", "icon-size=0")
+
+ view = view_range
+
+ if(mob && mob.hud_used)
+ // If view range is less than world.view, assume the HUD will not fit under normal mode and turn it to reduced
+ if(view_range < world.view)
+ // If it's really tiny, turn their hud off completely
+ if(view_range <= ARBITRARY_VIEWRANGE_NOHUD)
+ mob.hud_used.show_hud(HUD_STYLE_NOHUD)
+ else
+ mob.hud_used.show_hud(HUD_STYLE_REDUCED)
+ else
+ mob.hud_used.show_hud(HUD_STYLE_STANDARD)
+
+/* Viewmod datums */
+/datum/viewmod
+ var/id = ""
+ var/size = -1
+
+/datum/viewmod/New(new_id, new_size = world.view)
+ . = ..()
+ id = new_id
+ size = new_size
+
+/* Client verbs */
+/proc/viewNum_to_text(view)
+ return "[(view * 2) + 1]x[(view * 2) + 1]"
+
+/client/verb/set_view_range(view_range as null|anything in CUSTOM_VIEWRANGES)
+ set name = "Set View Range"
+ set category = "Preferences"
+
+ if(!view_range)
+ return
+
+ RemoveViewMod("custom")
+ if(view_range == "RESET")
+ to_chat(src, "View range reset.")
+ return
+
+ to_chat(src, "View range set to [viewNum_to_text(view_range)]")
+ AddViewMod("custom", view_range)
\ No newline at end of file
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 2142d336fac..3d11f40b1c9 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -421,7 +421,7 @@ BLIND // can't see anything
if(!istype(H) || !istype(T))
return 0
- if(H.m_intent == "run")
+ if(H.m_intent == MOVE_INTENT_RUN)
if(shoe_sound_footstep >= 2)
if(T.shoe_running_volume)
playsound(src, shoe_sound, T.shoe_running_volume, 1)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index ee5022a1793..69588148b9d 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -17,6 +17,13 @@
icon_state = "black"
item_state = "r_hands"
+
+/obj/item/clothing/gloves/color/black/forensics
+ name = "forensics gloves"
+ desc = "These high-tech gloves don't leave any material traces on objects they touch. Perfect for leaving crime scenes undisturbed...both before and after the crime."
+ icon_state = "forensics"
+ can_leave_fibers = FALSE
+
/obj/item/clothing/gloves/combat
desc = "These tactical gloves are somewhat fire and impact resistant."
name = "combat gloves"
@@ -82,7 +89,7 @@
return FALSE
if(cell)
var/mob/living/carbon/human/H = loc
- if(H.a_intent == I_HARM)
+ if(H.a_intent == INTENT_HARM)
var/mob/living/carbon/C = A
if(cell.use(stun_cost))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -124,4 +131,4 @@
to_chat(user, "You cut [cell] away from [src].")
cell.forceMove(get_turf(loc))
cell = null
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 4c53d9c3c8d..69098f54138 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -60,7 +60,7 @@
if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj))
to_chat(user, "You need an empty hand to draw the [holstered]!")
else
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
usr.visible_message("[user] draws the [holstered], ready to shoot!", \
"You draw the [holstered], ready to shoot!")
else
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index ae964af74a8..6f266c121e1 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -307,9 +307,26 @@
/obj/item/weapon/bikehorn)
category = CAT_MISC
+/datum/crafting_recipe/blackcarpet
+ name = "Black Carpet"
+ result = /obj/item/stack/tile/carpet/black
+ time = 20
+ reqs = list(/obj/item/stack/tile/carpet = 1)
+ tools = list(/obj/item/toy/crayon)
+ category = CAT_MISC
+
+/datum/crafting_recipe/showercurtain
+ name = "Shower Curtains"
+ result = /obj/structure/curtain
+ time = 20
+ reqs = list(/obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/plastic = 2,
+ /obj/item/stack/rods = 1)
+ category = CAT_MISC
+
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60
reqs = list(/obj/item/weapon/grown/log = 5)
result = /obj/structure/bonfire
- category = CAT_PRIMAL
\ No newline at end of file
+ category = CAT_PRIMAL
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 9ddb90f7832..1d7ae95427c 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -30,7 +30,7 @@
usesound = 'sound/items/Welder2.ogg'
/obj/item/device/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob)
- if(user.a_intent == "harm")
+ if(user.a_intent == INTENT_HARM)
user.visible_message("[user] stabs [M] with the [src]!", "You stab [M] with the [src]!")
to_chat(M, "[user] stabs you with the [src]!
You feel a tiny prick!")
return
@@ -360,6 +360,68 @@
return
to_chat(user, "You can't modify [target]!")
+/obj/item/device/fluff/lighty_plasman_modkit // LightFire53: Ikelos
+ name = "plasmaman suit modkit"
+ desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
+ icon_state = "modkit"
+ w_class = 2
+ force = 0
+ throwforce = 0
+ var/picked_color = null
+ var/list/helmets = list(
+ "Blue" = "plasmaman_ikelosdefault_helmet",
+ "Gold" = "plasmaman_ikelosgold_helmet",
+ "Red" = "plasmaman_ikelossecurity_helmet")
+ var/list/suits = list(
+ "Blue" = "plasmaman_ikelosdefault",
+ "Gold" = "plasmaman_ikelosgold",
+ "Red" = "plasmaman_ikelossecurity")
+
+/obj/item/device/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+ var/mob/living/carbon/human/H = user
+
+ if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
+ if(used & USED_MOD_HELM)
+ to_chat(H, "The kit's helmet modifier has already been used.")
+ return
+
+ picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in helmets
+ var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
+
+ if(!picked_color)
+ return
+ P.icon_state = helmets[picked_color] + "[P.on]"
+ P.base_state = helmets[picked_color]
+
+ to_chat(H, "You modify the appearance of [target].")
+ P.icon = 'icons/obj/custom_items.dmi'
+ used |= USED_MOD_HELM
+
+ if(P == H.head)
+ H.update_inv_head()
+ return
+ if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
+ if(used & USED_MOD_SUIT)
+ to_chat(user, "The kit's suit modifier has already been used.")
+ return
+ picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in suits
+ var/obj/item/clothing/suit/space/eva/plasmaman/P = target
+
+ if(!picked_color)
+ return
+ P.icon_state = suits[picked_color]
+
+ to_chat(H, "You modify the appearance of [target].")
+ P.icon = 'icons/obj/custom_items.dmi'
+ used |= USED_MOD_SUIT
+
+ if(P == H.wear_suit)
+ H.update_inv_wear_suit()
+ return
+ to_chat(user, "You can't modify [target]!")
+
#undef USED_MOD_HELM
#undef USED_MOD_SUIT
@@ -706,6 +768,16 @@
item_state = "castile_dress"
item_color = "castile_dress"
+/obj/item/clothing/under/fluff/xantholne //Xantholne: Meex Zwichsnicrur
+ name = "Stripped Shorts and Shirt"
+ desc = "A silky pair of dark shorts with a matching shirt. The shirt's collar has a tag on the inside that reads 'Meexy' on it."
+ icon = 'icons/obj/custom_items.dmi'
+ lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
+ icon_state = "xantholne"
+ item_state = "xantholne"
+ item_color = "xantholne"
+
/obj/item/clothing/under/fluff/elishirt // FlattestGuitar9: Eli Randolph
name = "casual dress shirt"
desc = "A soft, white dress shirt paired up with black suit pants. The set looks comfortable."
diff --git a/code/modules/detective_work/detective_work.dm b/code/modules/detective_work/detective_work.dm
index 01267f2fb08..dd22a439c19 100644
--- a/code/modules/detective_work/detective_work.dm
+++ b/code/modules/detective_work/detective_work.dm
@@ -16,33 +16,33 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
var/item_multiplier = istype(src,/obj/item)?1.2:1
if(M.wear_suit)
fibertext = "Material from \a [M.wear_suit]."
- if(prob(10*item_multiplier) && !(fibertext in suit_fibers))
+ if(prob(10*item_multiplier) && !(fibertext in suit_fibers) && M.wear_suit.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & UPPER_TORSO))
if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
- if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed.
+ if(prob(12*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers) //Wearing a suit means less of the uniform exposed.
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & HANDS))
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
- if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+ if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += fibertext
else if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
- if(prob(15*item_multiplier) && !(fibertext in suit_fibers))
+ if(prob(15*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers)
// "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
- if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+ if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += "Material from a pair of [M.gloves.name]."
else if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
- if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+ if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
- suit_fibers += "Material from a pair of [M.gloves.name]."
\ No newline at end of file
+ suit_fibers += "Material from a pair of [M.gloves.name]."
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 45967dc8ac7..85ec9f292c4 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -513,7 +513,7 @@
/obj/machinery/fishtank/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/pet/cat))
- if(M.a_intent == I_HELP) //Cats can try to fish in open tanks on help intent
+ if(M.a_intent == INTENT_HELP) //Cats can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
M.visible_message("[M.name] stares at into \the [src] while sitting perfectly still.", "The lid is closed, so you stare into \the [src] intently.")
else
@@ -535,7 +535,7 @@
else
attack_generic(M, M.harm_intent_damage)
else if(istype(M, /mob/living/simple_animal/hostile/bear))
- if(M.a_intent == I_HELP) //Bears can try to fish in open tanks on help intent
+ if(M.a_intent == INTENT_HELP) //Bears can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
M.visible_message("[M.name] scrapes it's claws along \the [src]'s lid.", "The lid is closed, so you scrape your claws against \the [src]'s lid.")
else
@@ -555,7 +555,7 @@
else
if(M.melee_damage_upper > 0) //If the simple_animal has a melee_damage_upper defined, use that for the damage
attack_generic(M, M.melee_damage_upper)
- else if(M.a_intent == I_HARM) //Let any simple_animal try to break tanks when on harm intent
+ else if(M.a_intent == INTENT_HARM) //Let any simple_animal try to break tanks when on harm intent
if(M.harm_intent_damage <= 0) return //If it doesn't do damage, don't bother with the attack
attack_generic(M, M.harm_intent_damage)
check_health()
@@ -575,7 +575,7 @@
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]!")
destroy()
- else if(usr.a_intent == I_HARM)
+ else if(usr.a_intent == INTENT_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
usr.visible_message("[usr.name] bangs against the [src.name]!", \
@@ -611,7 +611,7 @@
//Welders repair damaged tanks on help intent, damage on all others
if(istype(O, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = O
- if(user.a_intent == I_HELP)
+ if(user.a_intent == INTENT_HELP)
if(W.isOn())
if(cur_health < max_health)
playsound(loc, W.usesound, 50, 1)
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index e1a517caaf3..011a4ffacde 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -47,7 +47,7 @@
if(!target)
return
- if(user.a_intent != I_HARM || !isGlass)
+ if(user.a_intent != INTENT_HARM || !isGlass)
return ..()
force = 15 //Smashing bottles over someoen's head hurts.
diff --git a/code/modules/food_and_drinks/drinks/drinks/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm
index 89deed5dedd..267b80aed20 100644
--- a/code/modules/food_and_drinks/drinks/drinks/cans.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/cans.dm
@@ -32,7 +32,7 @@
if(canopened == 0)
to_chat(user, "You need to open the drink!")
return
- else if(M == user && !reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head")
+ else if(M == user && !reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_sel.selecting == "head")
user.visible_message("[user] crushes ["\the [src]"] on \his forehead!", "You crush \the [src] on your forehead.")
crush(user)
return
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index deac3c6660d..b9bb541f77a 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -68,7 +68,7 @@
return
/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params)
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
return ..()
if(processing)
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 7f2c3587349..f5137d5743b 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -102,7 +102,7 @@
to_chat(user, "You add [O] to [name].")
updateUsrDialog()
return
- else if(user.a_intent != I_HARM)
+ else if(user.a_intent != INTENT_HARM)
to_chat(user, "You can't extract any seeds from \the [O.name]!")
else
return ..()
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index 3f1705f4651..075b3a14d9d 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -7,6 +7,8 @@
var/datum/martial_art/base = null // The permanent style
var/deflection_chance = 0 //Chance to deflect projectiles
var/help_verb = null
+ var/no_guns = FALSE //set to TRUE to prevent users of this style from using guns (sleeping carp, highlander). They can still pick them up, but not fire them.
+ var/no_guns_message = "" //message to tell the style user if they try and use a gun while no_guns = TRUE (DISHONORABRU!)
/datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
@@ -207,7 +209,7 @@
to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.")
return
switch(user.a_intent)
- if("disarm")
+ if(INTENT_DISARM)
if(!wielded)
return ..()
if(!ishuman(target))
diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm
index 960844a063a..c6af4679552 100644
--- a/code/modules/martial_arts/sleeping_carp.dm
+++ b/code/modules/martial_arts/sleeping_carp.dm
@@ -8,6 +8,8 @@
name = "The Sleeping Carp"
deflection_chance = 100
help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
+ no_guns = TRUE
+ no_guns_message = "Use of ranged weaponry would bring dishonor to the clan."
/datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(findtext(streak,WRIST_WRENCH_COMBO))
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 96735d1a078..7852fe0edd8 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -333,8 +333,28 @@
new /obj/effect/effect/harmless_smoke(get_turf(src))
qdel(src)
+/obj/item/weapon/survivalcapsule/luxury
+ name = "luxury bluespace shelter capsule"
+ desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
+ origin_tech = "engineering=3;bluespace=4"
+ template_id = "shelter_beta"
+
//Pod turfs and objects
+//Window
+/obj/structure/window/reinforced/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "pwindow"
+
+// This override can be removed whenever we get rid of the stupid fucking `dir = 9` = full tile!!!! shit
+/obj/structure/window/reinforced/survival_pod/CanPass(atom/movable/mover, turf/target, height=0)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir)
+ return !density
+ else
+ return 1
//Floors
/turf/simulated/floor/pod
@@ -364,6 +384,12 @@
base_icon_state = "survival_pod"
glass_type = "/survival_pod"
+//Windoor
+/obj/machinery/door/window/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "windoor"
+ base_state = "windoor"
+
//Table
/obj/structure/table/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
@@ -536,3 +562,31 @@
new /obj/item/stack/rods(loc)
qdel(src)
return ..()
+
+/obj/item/fakeartefact
+ name = "expensive forgery"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ var/possible = list(/obj/item/ship_in_a_bottle,
+ /obj/item/weapon/gun/energy/pulse,
+ /obj/item/weapon/sleeping_carp_scroll,
+ /obj/item/weapon/shield/changeling,
+ /obj/item/weapon/lava_staff,
+ /obj/item/weapon/katana/energy,
+ /obj/item/weapon/storage/toolbox/green/memetic,
+ /obj/item/weapon/gun/projectile/automatic/l6_saw,
+ /obj/item/weapon/gun/magic/staff/chaos,
+ /obj/item/weapon/gun/magic/staff/spellblade,
+ /obj/item/weapon/gun/magic/wand/death,
+ /obj/item/weapon/gun/magic/wand/fireball,
+ /obj/item/stack/telecrystal,
+ /obj/item/weapon/banhammer)
+
+/obj/item/fakeartefact/New()
+ . = ..()
+ var/obj/item/I = pick(possible)
+ name = initial(I.name)
+ icon = initial(I.icon)
+ desc = initial(I.desc)
+ icon_state = initial(I.icon_state)
+ item_state = initial(I.item_state)
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 575fbf3b5b6..a1e7e775e23 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -11,7 +11,7 @@
status_flags = CANSTUN|CANWEAKEN|CANPUSH
mouse_opacity = 1
faction = list("neutral")
- a_intent = I_HARM
+ a_intent = INTENT_HARM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
wander = 0
@@ -93,7 +93,7 @@
return
/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
- if(M.a_intent == I_HELP)
+ if(M.a_intent == INTENT_HELP)
toggle_mode()
switch(mode)
if(MINEDRONE_COLLECT)
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index 38750b12d19..2389470e7f5 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -40,3 +40,17 @@
/datum/map_template/shelter/alpha/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/simulated/mineral)
+
+/datum/map_template/shelter/beta
+ name = "Shelter Beta"
+ shelter_id = "shelter_beta"
+ description = "An extremly luxurious shelter, containing all \
+ the amenities of home, including carpeted floors, hot and cold \
+ running water, a gourmet three course meal, cooking facilities, \
+ and a deluxe companion to keep you from getting lonely during \
+ an ash storm."
+ mappath = "_maps/map_files/templates/shelter_2.dmm"
+
+/datum/map_template/shelter/beta/New()
+ . = ..()
+ whitelisted_turfs = typecacheof(/turf/simulated/mineral)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 568033f3606..062e1f4d44e 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -168,6 +168,7 @@
/mob/proc/hear_sleep(var/message)
var/heard = ""
if(prob(15))
+ message = strip_html_properly(message)
var/list/punctuation = list(",", "!", ".", ";", "?")
var/list/messages = splittext(message, " ")
var/R = rand(1, messages.len)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index b5fa736dfc3..eef224e8378 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -273,7 +273,7 @@ Des: Removes all infected images from the alien.
if(T.footstep_sounds["xeno"])
var/S = pick(T.footstep_sounds["xeno"])
if(S)
- if(m_intent == "run")
+ if(m_intent == MOVE_INTENT_RUN)
if(!(step_count % 2)) //every other turf makes a sound
return 0
@@ -281,7 +281,7 @@ Des: Removes all infected images from the alien.
range -= 0.666 //-(7 - 2) = (-5) = -5 | -5 - (0.666) = -5.666 | (7 + -5.666) = 1.334 | 1.334 * 3 = 4.002 | range(4.002) = range(4)
var/volume = 5
- if(m_intent == "walk")
+ if(m_intent == MOVE_INTENT_WALK)
return 0 //silent when walking
if(buckled || lying || throwing)
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index 65e32e2fae9..fef2e469848 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -15,7 +15,7 @@ In all, this is a lot like the monkey code. /N
return
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
AdjustSleeping(-5)
resting = 0
AdjustParalysis(-3)
@@ -23,7 +23,7 @@ In all, this is a lot like the monkey code. /N
AdjustWeakened(-3)
visible_message("[M.name] nuzzles [src] trying to wake it up!")
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
return 1
@@ -50,11 +50,11 @@ In all, this is a lot like the monkey code. /N
return 0 //this is horrible but 100% necessary
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
help_shake_act(M)
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
- if(I_HARM, I_DISARM)
+ if(INTENT_HARM, INTENT_DISARM)
return 1
return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 3782806db33..ddac1cc18e9 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -40,7 +40,7 @@
/mob/living/carbon/alien/humanoid/hunter/handle_environment()
- if(m_intent == "run" || resting)
+ if(m_intent == MOVE_INTENT_RUN || resting)
..()
else
adjustPlasma(-heal_rate)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index fff315c90e3..d37d83e8215 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -160,13 +160,13 @@
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
help_shake_act(M)
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
- if(I_HARM)
+ if(INTENT_HARM)
M.do_attack_animation(src)
var/damage = rand(1, 9)
if(prob(90))
@@ -191,7 +191,7 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[M] has attempted to punch [src]!")
- if(I_DISARM)
+ if(INTENT_DISARM)
if(!lying)
if(prob(5))//Very small chance to push an alien down.
Paralyse(2)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 0d6545d0a0f..f1bcfc0eeaf 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -33,7 +33,7 @@
else if(lying || resting)
icon_state = "alien[caste]_sleep"
- else if(m_intent == "run")
+ else if(m_intent == MOVE_INTENT_RUN)
icon_state = "alien[caste]_running"
else
icon_state = "alien[caste]_s"
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index df00e862b38..305f8ad45a9 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -127,10 +127,10 @@
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
help_shake_act(M)
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
else
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 141d760287a..2ef62eae6e9 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -34,9 +34,9 @@
if(.)
if(nutrition && stat != DEAD)
nutrition -= hunger_drain / 10
- if(m_intent == "run")
+ if(m_intent == MOVE_INTENT_RUN)
nutrition -= hunger_drain / 10
- if((FAT in mutations) && m_intent == "run" && bodytemperature <= 360)
+ if((FAT in mutations) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360)
bodytemperature += 2
// Moving around increases germ_level faster
@@ -936,7 +936,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
- if(flying || buckled || (walkSafely && m_intent == "walk"))
+ if(flying || buckled || (walkSafely && m_intent == MOVE_INTENT_WALK))
return 0
if((lying) && (!(tilesSlipped)))
return 0
diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm
index 1c911a3f661..c5c1e4917e4 100644
--- a/code/modules/mob/living/carbon/carbon_defenses.dm
+++ b/code/modules/mob/living/carbon/carbon_defenses.dm
@@ -20,7 +20,7 @@
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
if(lying)
if(surgeries.len)
- if(user != src && user.a_intent == "help")
+ if(user != src && user.a_intent == INTENT_HELP)
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
@@ -37,4 +37,4 @@
for(var/datum/disease/D in user.viruses)
if(D.IsSpreadByTouch())
ContractDisease(D)
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 000a7a52bd0..ba55801c522 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -335,7 +335,7 @@
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob)
switch(L.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[L] rubs its head against [src].")
@@ -1985,8 +1985,8 @@
to_chat(src, "Your fingers don't fit in the trigger guard!")
return 0
- if(martial_art && martial_art.name == "The Sleeping Carp") //great dishonor to famiry
- to_chat(src, "Use of ranged weaponry would bring dishonor to the clan.")
+ if(martial_art && martial_art.no_guns) //great dishonor to famiry
+ to_chat(src, "[martial_art.no_guns_message]")
return 0
return .
diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm
index 015c73455ba..7c4039789a9 100644
--- a/code/modules/mob/living/carbon/human/human_attackalien.dm
+++ b/code/modules/mob/living/carbon/human/human_attackalien.dm
@@ -4,13 +4,13 @@
return 0
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[M] caresses [src] with its scythe like arm.")
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
- if(I_HARM)
+ if(INTENT_HARM)
M.do_attack_animation(src)
if(w_uniform)
w_uniform.add_fingerprint(M)
@@ -33,7 +33,7 @@
apply_effect(4, WEAKEN, armor_block)
updatehealth()
- if(I_DISARM)
+ if(INTENT_DISARM)
M.do_attack_animation(src)
if(prob(80))
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index b0d2fb3e315..59c8f3efa63 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -18,7 +18,7 @@
..()
- if((M != src) && M.a_intent != "help" && check_shields(0, M.name, attack_type = UNARMED_ATTACK))
+ if((M != src) && M.a_intent != INTENT_HELP && check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_logs(M, src, "attempted to touch")
visible_message("[M] attempted to touch [src]!")
return 0
@@ -53,7 +53,7 @@
species.handle_attack_hand(src,M)
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
if(attacker_style && attacker_style.help_act(H, src))//adminfu only...
return 1
if(can_operate(src))
@@ -99,14 +99,14 @@
else
to_chat(M, "You need to stay still while performing CPR!")
- if(I_GRAB)
+ if(INTENT_GRAB)
if(attacker_style && attacker_style.grab_act(H, src))
return 1
else
src.grabbedby(M)
return 1
- if(I_HARM)
+ if(INTENT_HARM)
//Vampire code
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining && M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(species && species.flags & NO_BLOOD)//why this hell were we never checkinf for this?
@@ -168,7 +168,7 @@
forcesay(hit_appends)
- if(I_DISARM)
+ if(INTENT_DISARM)
if(attacker_style && attacker_style.disarm_act(H, src))
return 1
else
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 585ac587ffc..bbe57fa66f9 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -191,7 +191,7 @@ emp_act
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
- if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM)
+ if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == INTENT_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
newmeat.name = src.real_name + newmeat.name
newmeat.subjectname = src.real_name
@@ -378,7 +378,7 @@ emp_act
if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
- if(M.occupant.a_intent == I_HARM)
+ if(M.occupant.a_intent == INTENT_HARM)
if(M.damtype == "brute")
step_away(src,M,15)
var/obj/item/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 87176a7a02a..85dd6e81f3c 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -47,12 +47,12 @@
if(T.footstep_sounds["human"])
var/S = pick(T.footstep_sounds["human"])
if(S)
- if(m_intent == "run")
+ if(m_intent == MOVE_INTENT_RUN)
if(!(step_count % 2)) //every other turf makes a sound
return 0
var/range = -(world.view - 2)
- if(m_intent == "walk")
+ if(m_intent == MOVE_INTENT_WALK)
range -= 0.333
if(!shoes)
range -= 0.333
@@ -65,7 +65,7 @@
//-(7 - 2) = (-5) = -5 | -5 - (0.333 * 2) = -5.666 | (7 + -5.666) = 1.334 | 1.334 * 3 = 4.002 | range(4.002) = range(4)
var/volume = 13
- if(m_intent == "walk")
+ if(m_intent == MOVE_INTENT_WALK)
volume -= 4
if(!shoes)
volume -= 4
@@ -91,4 +91,4 @@
playsound(T, S, volume, 1, range)
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index ad4d8226c4a..eb7b767dc94 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -638,7 +638,7 @@
if(canmove)
if((graytide || (TRAITS & TRAIT_MEAN)) || retal)
interest += targetInterestShift
- a_intent = "harm"
+ a_intent = INTENT_HARM
zone_sel.selecting = pick("chest","r_leg","l_leg","r_arm","l_arm","head")
doing |= SNPC_FIGHTING
if(retal)
@@ -746,7 +746,7 @@
tryWalk(TARGET)
else
if(Adjacent(TARGET))
- a_intent = pick("disarm", "harm")
+ a_intent = pick(INTENT_DISARM, INTENT_HARM)
M.attack_hand(src)
timeout++
else if(timeout >= 10 || !(targetRange(M) > 14))
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index 9f27956b764..00b8e0a4544 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -431,7 +431,7 @@
var/mob/living/M = target
if(istype(M))
if(health > 0)
- if(M.a_intent == "help" && !incapacitated())
+ if(M.a_intent == INTENT_HELP && !incapacitated())
chatter()
if(istype(target, /mob/living/carbon) && !retal && prob(SNPC_FUZZY_CHANCE_LOW))
var/mob/living/carbon/C = target
@@ -439,7 +439,7 @@
tryWalk(target)
else
C.help_shake_act(src)
- if(M.a_intent == "harm")
+ if(M.a_intent == INTENT_HARM)
retal = 1
retal_target = target
@@ -658,7 +658,7 @@
if(grabbed_by.len > 0)
for(var/obj/item/weapon/grab/G in grabbed_by)
if(Adjacent(G))
- a_intent = "disarm"
+ a_intent = INTENT_DISARM
G.assailant.attack_hand(src)
inactivity_period = 10
diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm
index 4fcedc1844a..7fee37a17c2 100644
--- a/code/modules/mob/living/carbon/human/species/apollo.dm
+++ b/code/modules/mob/living/carbon/human/species/apollo.dm
@@ -58,7 +58,7 @@
/datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
- if(M.a_intent == I_HARM)
+ if(M.a_intent == INTENT_HARM)
if(H.handcuffed)
if(!H.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) return
var/turf/p_loc = M.loc
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 1cb97bb3e19..9a8a9b91404 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1092,8 +1092,8 @@ var/global/list/damage_icon_parts = list()
if(legcuffed)
overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1")
throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
- if(m_intent != "walk")
- m_intent = "walk"
+ if(m_intent != MOVE_INTENT_WALK)
+ m_intent = MOVE_INTENT_WALK
if(hud_used && hud_used.move_intent)
hud_used.move_intent.icon_state = "walking"
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 85fed33c156..94ae7482437 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -241,7 +241,7 @@
switch(L.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[L] rubs its head against [src].")
@@ -322,7 +322,7 @@
return
else
if(stat == DEAD && surgeries.len)
- if(M.a_intent == I_HELP)
+ if(M.a_intent == INTENT_HELP)
for(var/datum/surgery/S in surgeries)
if(S.next_step(M, src))
return 1
@@ -343,10 +343,10 @@
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
help_shake_act(M)
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
else
@@ -393,10 +393,10 @@
return
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[M] caresses [src] with its scythe like arm.")
- if(I_HARM)
+ if(INTENT_HARM)
M.do_attack_animation(src)
if(prob(95))
attacked += 10
@@ -416,10 +416,10 @@
visible_message("[M] has attempted to lunge at [name]!", \
"[M] has attempted to lunge at [name]!")
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
- if(I_DISARM)
+ if(INTENT_DISARM)
M.do_attack_animation(src)
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
var/damage = 5
@@ -460,7 +460,7 @@
/mob/living/carbon/slime/attackby(obj/item/W, mob/user, params)
if(stat == DEAD && surgeries.len)
- if(user.a_intent == I_HELP)
+ if(user.a_intent == INTENT_HELP)
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 06b6440f756..90003c12e65 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -60,10 +60,10 @@
if(!M.buckled && !M.has_buckled_mobs())
var/mob_swap
//the puller can always swap with it's victim if on grab intent
- if(M.pulledby == src && a_intent == I_GRAB)
+ if(M.pulledby == src && a_intent == INTENT_GRAB)
mob_swap = 1
//restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- else if((M.restrained() || M.a_intent == I_HELP) && (restrained() || a_intent == I_HELP))
+ else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
mob_swap = 1
if(mob_swap)
//switch our position with M
@@ -176,7 +176,7 @@
return 0
var/obj/item/hand_item = get_active_hand()
if(istype(hand_item, /obj/item/weapon/gun) && A != hand_item)
- if(a_intent == I_HELP || !ismob(A))
+ if(a_intent == INTENT_HELP || !ismob(A))
visible_message("[src] points to [A] with [hand_item]")
return 1
A.visible_message("[src] points [hand_item] at [A]!",
@@ -937,11 +937,11 @@
. += config.run_speed
else
switch(m_intent)
- if("run")
+ if(MOVE_INTENT_RUN)
if(drowsyness > 0)
. += 6
. += config.run_speed
- if("walk")
+ if(MOVE_INTENT_WALK)
. += config.walk_speed
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 3aec754eabb..548f1fb357b 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -108,7 +108,7 @@
/mob/living/mech_melee_attack(obj/mecha/M)
- if(M.occupant.a_intent == I_HARM)
+ if(M.occupant.a_intent == INTENT_HARM)
if(M.damtype == "brute")
step_away(src,M,15)
switch(M.damtype)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 06021939ac9..84f731d3669 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -677,7 +677,7 @@ var/list/ai_verbs_default = list(
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[M] caresses [src]'s plating with its scythe like arm.")
else //harm
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 3f1799c7c9f..3637b0e10b1 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -246,7 +246,7 @@
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("[M] caresses [src]'s casing with its scythe like arm."), 1)
@@ -508,7 +508,7 @@
/mob/living/silicon/pai/attack_hand(mob/user as mob)
if(stat == DEAD)
return
- if(user.a_intent == I_HELP)
+ if(user.a_intent == INTENT_HELP)
user.visible_message("[user] pets [src].")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
else
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index f9c711b4b17..ba4c616b2f3 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -44,7 +44,7 @@
//Actual picking-up event.
/mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob)
- if(M.a_intent == I_HELP)
+ if(M.a_intent == INTENT_HELP)
get_scooped(M)
..()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 9d93d0baa77..1f4430c3aea 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -575,7 +575,7 @@ var/list/robot_verbs_default = list(
return
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP)
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent == INTENT_HELP)
if(W == module_active)
return
if(!getBruteLoss())
@@ -594,7 +594,7 @@ var/list/robot_verbs_default = list(
return
- else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == I_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
+ else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
if(!getFireLoss())
to_chat(user, "Nothing to fix!")
return
@@ -818,15 +818,15 @@ var/list/robot_verbs_default = list(
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
for(var/mob/O in viewers(src, null))
if((O.client && !( O.blinded )))
O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1)
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
- if(I_HARM)
+ if(INTENT_HARM)
M.do_attack_animation(src)
var/damage = rand(10, 20)
if(prob(90))
@@ -842,7 +842,7 @@ var/list/robot_verbs_default = list(
visible_message("[M] took a swipe at [src]!", \
"[M] took a swipe at [src]!")
- if(I_DISARM)
+ if(INTENT_DISARM)
if(!(lying))
M.do_attack_animation(src)
if(prob(85))
@@ -923,7 +923,7 @@ var/list/robot_verbs_default = list(
diag_hud_set_borgcell()
if(!opened && (!istype(user, /mob/living/silicon)))
- if(user.a_intent == I_HELP)
+ if(user.a_intent == INTENT_HELP)
user.visible_message("[user] pets [src]!", \
"You pet [src]!")
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 063fc07badf..899608d0f1a 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -256,7 +256,7 @@
new /obj/effect/decal/cleanable/blood/oil(loc)
/mob/living/simple_animal/bot/attack_hand(mob/living/carbon/human/H)
- if(H.a_intent == "help")
+ if(H.a_intent == INTENT_HELP)
interact(H)
else
return ..()
@@ -329,7 +329,7 @@
ejectpai(user)
else
user.changeNext_move(CLICK_CD_MELEE)
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM)
if(health >= maxHealth)
to_chat(user, "[src] does not need a repair!")
return
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 8a160d25c4f..37699e820f2 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -161,13 +161,13 @@ Auto Patrol[]"},
mode = BOT_HUNT
/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H)
- if(H.a_intent == "harm")
+ if(H.a_intent == INTENT_HARM)
retaliate(H)
return ..()
/mob/living/simple_animal/bot/ed209/attackby(obj/item/weapon/W, mob/user, params)
..()
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
return
if(!istype(W, /obj/item/weapon/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina.
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index e95d2409921..9f8725067b0 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -18,7 +18,7 @@
health = 50
maxHealth = 50
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- a_intent = "harm" //No swapping
+ a_intent = INTENT_HARM //No swapping
buckle_lying = 0
mob_size = MOB_SIZE_LARGE
radio_channel = "Supply"
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index a77429eb631..46a8ec12f76 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -173,13 +173,13 @@ Auto Patrol: []"},
mode = BOT_HUNT
/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H)
- if(H.a_intent == "harm")
+ if(H.a_intent == INTENT_HARM)
retaliate(H)
return ..()
/mob/living/simple_animal/bot/secbot/attackby(obj/item/weapon/W, mob/user, params)
..()
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
return
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
retaliate(user)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 54cf810a081..3daacefb108 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -10,7 +10,7 @@
response_harm = "punches"
icon_dead = "shade_dead"
speed = 0
- a_intent = I_HARM
+ a_intent = INTENT_HARM
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/weapons/punch1.ogg'
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 95a1d100161..5f977bfd508 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -37,12 +37,85 @@
icon_resting = "cat_rest"
gender = FEMALE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ var/list/family = list()
+ var/memory_saved = 0
+ var/list/children = list() //Actual mob instances of children
+ var/cats_deployed = 0
+
+/mob/living/simple_animal/pet/cat/Runtime/New()
+ Read_Memory()
+ ..()
+
+/mob/living/simple_animal/pet/cat/Runtime/Life()
+ if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP)
+ Deploy_The_Cats()
+ if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved)
+ Write_Memory()
+ ..()
+
+/mob/living/simple_animal/pet/cat/Runtime/make_babies()
+ var/mob/baby = ..()
+ if(baby)
+ children += baby
+ return baby
+
+/mob/living/simple_animal/pet/cat/Runtime/death()
+ if(!memory_saved)
+ Write_Memory(1)
+ ..()
+
+/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
+ var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
+ S["family"] >> family
+
+ if(isnull(family))
+ family = list()
+
+/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead)
+ var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
+ family = list()
+ if(!dead)
+ for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
+ if(istype(C,type) || C.stat || !C.z || !C.butcher_results)
+ continue
+ if(C.type in family)
+ family[C.type] += 1
+ else
+ family[C.type] = 1
+ S["family"] << family
+ memory_saved = 1
+
+/mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats()
+ cats_deployed = 1
+ for(var/cat_type in family)
+ if(family[cat_type] > 0)
+ for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS)
+ new cat_type(loc)
+
/mob/living/simple_animal/pet/cat/handle_automated_action()
..()
+ if(prob(1))
+ custom_emote(1, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
+ icon_state = "[icon_living]_rest"
+ resting = 1
+ update_canmove()
+ else if (prob(1))
+ custom_emote(1, pick("sits down.", "crouches on its hind legs.", "looks alert."))
+ icon_state = "[icon_living]_sit"
+ resting = 1
+ update_canmove()
+ else if (prob(1))
+ if (resting)
+ custom_emote(1, pick("gets up and meows.", "walks around.", "stops resting."))
+ icon_state = "[icon_living]"
+ resting = 0
+ update_canmove()
+ else
+ custom_emote(1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
//MICE!
- if(eats_mice && loc && isturf(loc) && !incapacitated())
+ if(eats_mice && isturf(loc) && !incapacitated())
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M))
custom_emote(1, "splats \the [M]!")
@@ -50,13 +123,11 @@
movement_target = null
stop_automated_movement = 0
break
-
- //attempt to mate
make_babies()
/mob/living/simple_animal/pet/cat/handle_automated_movement()
..()
- if(eats_mice && !incapacitated())
+ if(!stat && !resting && !buckled)
turns_since_scan++
if(turns_since_scan > 5)
walk_to(src,0)
@@ -75,6 +146,7 @@
stop_automated_movement = 1
walk_to(src,movement_target,0,3)
+
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
@@ -102,4 +174,4 @@
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
eats_mice = 0
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
\ No newline at end of file
+ minbodytemp = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 97702a28027..bf4ac4a1664 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -557,8 +557,8 @@
/mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M)
. = ..()
switch(M.a_intent)
- if(I_HELP) wuv(1,M)
- if(I_HARM) wuv(-1,M)
+ if(INTENT_HELP) wuv(1,M)
+ if(INTENT_HARM) wuv(-1,M)
/mob/living/simple_animal/pet/corgi/proc/wuv(change, mob/M)
if(change)
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index e6e9d2f93f1..6bec35b98db 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -51,7 +51,7 @@
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M)
//Let people pick the little buggers up.
- if(M.a_intent == I_HELP)
+ if(M.a_intent == INTENT_HELP)
if(M.species && M.species.name == "Diona")
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 840c988dc98..4f3d4588378 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -136,7 +136,7 @@
milk_content = min(50, milk_content+rand(5, 10))
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
- if(!stat && M.a_intent == I_DISARM && icon_state != icon_dead)
+ if(!stat && M.a_intent == INTENT_DISARM && icon_state != icon_dead)
M.visible_message("[M] tips over [src].","You tip over [src].")
Weaken(30)
icon_state = icon_dead
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index fdcf39dd51b..17740441153 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -77,7 +77,7 @@
client.time_died_as_mouse = world.time
/mob/living/simple_animal/mouse/attack_hand(mob/living/carbon/human/M as mob)
- if(M.a_intent == I_HELP)
+ if(M.a_intent == INTENT_HELP)
get_scooped(M)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 85e0cba9073..88db29b88a7 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -18,7 +18,7 @@
melee_damage_upper = 25
attacktext = "slashes"
speak_emote = list("hisses")
- a_intent = I_HARM
+ a_intent = INTENT_HARM
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
@@ -141,7 +141,7 @@
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
- a_intent = "help"
+ a_intent = INTENT_HELP
friendly = "caresses"
environment_smash = 0
icon_state = "maid"
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index b6cda2e0e3c..746c1789e16 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -7,7 +7,7 @@
icon_dead = "null"
melee_damage_lower = 5
melee_damage_upper = 5
- a_intent = "harm"
+ a_intent = INTENT_HARM
attacktext = "gores"
maxHealth = 100
health = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index a8102b94b94..dba3121f3a7 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -5,7 +5,7 @@
desc = "Attack the weak point for massive damage."
health = 1000
maxHealth = 1000
- a_intent = "harm"
+ a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
environment_smash = 3
luminosity = 3
@@ -228,4 +228,4 @@
/proc/ClearScore(client/player)
world.SetScores(player.ckey, "", global.medal_hub, global.medal_pass)
-#undef MEDAL_PREFIX
\ No newline at end of file
+#undef MEDAL_PREFIX
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
index 3e6d98afd95..bd9c532bb45 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goldgrub.dm
@@ -19,7 +19,7 @@
melee_damage_upper = 0
attacktext = "barrels into"
attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = I_HELP
+ a_intent = INTENT_HELP
speak_emote = list("screeches")
throw_message = "sinks in slowly, before being pushed out of "
status_flags = CANPUSH
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 3298e334bd2..184f7b3ced3 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -11,7 +11,7 @@
response_disarm = "shoves"
response_harm = "strikes"
status_flags = 0
- a_intent = I_HARM
+ a_intent = INTENT_HARM
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
see_in_dark = 8
@@ -68,7 +68,7 @@
melee_damage_lower = 12
melee_damage_upper = 12
attacktext = "bites into"
- a_intent = I_HARM
+ a_intent = INTENT_HARM
speak_emote = list("chitters")
attack_sound = 'sound/weapons/bladeslice.ogg'
aggro_vision_range = 9
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index d7984031052..25311673076 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -138,7 +138,7 @@
/mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M as mob)
..()
- if(M.a_intent == I_HARM)
+ if(M.a_intent == INTENT_HARM)
Bruise()
/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index cce4b32235c..c2ba962e2e0 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -13,7 +13,7 @@
speak = list("HONK", "Honk!", "Welcome to clown planet!")
emote_see = list("honks")
speak_chance = 1
- a_intent = I_HARM
+ a_intent = INTENT_HARM
maxHealth = 75
health = 75
speed = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index df5b53f5368..d4a88b49e60 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -15,7 +15,7 @@
response_harm = "hits the"
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
- a_intent = I_HARM
+ a_intent = INTENT_HARM
stop_automated_movement_when_pulled = 0
health = 300
maxHealth = 300
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
index 5a0798874e4..687e0b7c73a 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
@@ -12,7 +12,7 @@
response_help = "pets"
emote_hear = list("chitters")
maxHealth = 250
- health = 200
+ health = 250
harm_intent_damage = 3
melee_damage_lower = 15
melee_damage_upper = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 30bdb8c95e2..2f639d9e6f7 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -18,7 +18,7 @@
melee_damage_upper = 15
attacktext = "punches"
attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = I_HARM
+ a_intent = INTENT_HARM
unsuitable_atmos_damage = 15
faction = list("russian")
status_flags = CANPUSH
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index b1393e84ef9..27bd2f3ee1c 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -28,7 +28,7 @@
maxbodytemp = 350
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- a_intent = I_HARM //so they don't get pushed around
+ a_intent = INTENT_HARM //so they don't get pushed around
environment_smash = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 168ed2d441c..6ddb86fd818 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -8,7 +8,7 @@
icon_living = "angel"
icon_dead = "angel"
gender = NEUTER
- a_intent = I_HARM
+ a_intent = INTENT_HARM
response_help = "touches"
response_disarm = "pushes"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 805059f25f7..469631951aa 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -18,7 +18,7 @@
melee_damage_upper = 10
attacktext = "punches"
attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = I_HARM
+ a_intent = INTENT_HARM
unsuitable_atmos_damage = 15
faction = list("syndicate")
check_friendly_fire = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index b4ac6212220..f27891f5965 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -56,7 +56,7 @@
harm_intent_damage = 5
melee_damage_lower = 25
melee_damage_upper = 25
- a_intent = I_HARM
+ a_intent = INTENT_HARM
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1aa6c82b4a8..72c416e8f23 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -304,12 +304,12 @@
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
if(health > 0)
visible_message(" [M] [response_help] [src].")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if(I_GRAB)
+ if(INTENT_GRAB)
if(M == src || anchored)
return
if(!(status_flags & CANPUSH))
@@ -326,7 +326,7 @@
visible_message("[M] has grabbed [src] passively!")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if(I_HARM, I_DISARM)
+ if(INTENT_HARM, INTENT_DISARM)
M.do_attack_animation(src)
visible_message("[M] [response_harm] [src]!")
playsound(loc, "punch", 25, 1, -1)
@@ -338,13 +338,13 @@
switch(M.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[M] caresses [src] with its scythe like arm.")
- if(I_GRAB)
+ if(INTENT_GRAB)
grabbedby(M)
- if(I_HARM, I_DISARM)
+ if(INTENT_HARM, INTENT_DISARM)
M.do_attack_animation(src)
var/damage = rand(15, 30)
visible_message("[M] has slashed at [src]!", \
@@ -357,7 +357,7 @@
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L as mob)
switch(L.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
visible_message("[L] rubs its head against [src].")
@@ -592,7 +592,7 @@
alone = 0
continue
if(alone && partner && children < 3)
- new childtype(loc)
+ return new childtype(loc)
/mob/living/simple_animal/say_quote(var/message)
var/verb = "says"
diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm
index 46a05daba98..22b5fb705a9 100644
--- a/code/modules/mob/living/simple_animal/spawner.dm
+++ b/code/modules/mob/living/simple_animal/spawner.dm
@@ -12,7 +12,7 @@
status_flags = 0
anchored = 1
AIStatus = AI_OFF
- a_intent = "harm"
+ a_intent = INTENT_HARM
stop_automated_movement = 1
wander = 0
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
@@ -81,4 +81,4 @@
/mob/living/simple_animal/hostile/spawner/mining/basilisk
name = "basilisk den"
desc = "A den housing a nest of basilisks, bring a coat."
- mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk
\ No newline at end of file
+ mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 2988363ffb9..959913972fa 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -75,8 +75,8 @@
var/overeatduration = 0 // How long this guy is overeating //Carbon
var/intent = null//Living
var/shakecamera = 0
- var/a_intent = I_HELP//Living
- var/m_intent = "run"//Living
+ var/a_intent = INTENT_HELP//Living
+ var/m_intent = MOVE_INTENT_RUN//Living
var/lastKnownIP = null
var/atom/movable/buckled = null//Living
var/obj/item/l_hand = null//Living
@@ -196,5 +196,5 @@
var/list/permanent_huds = list()
var/list/actions = list()
-
+
var/list/progressbars = null //for stacking do_after bars
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index fffd02adf0a..ecc987530ab 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -316,7 +316,7 @@
var/mob/living/carbon/human/affected = affecting
var/mob/living/carbon/human/attacker = assailant
switch(assailant.a_intent)
- if(I_HELP)
+ if(INTENT_HELP)
/*if(force_down)
to_chat(assailant, "You no longer pin [affecting] to the ground.")
force_down = 0
@@ -324,10 +324,10 @@
//This specific example would allow you to stop pinning people to the floor without moving away from them.
return
- if(I_GRAB)
+ if(INTENT_GRAB)
return
- if(I_HARM) //This checks that the user is on harm intent.
+ if(INTENT_HARM) //This checks that the user is on harm intent.
if(last_hit_zone == "head") //This checks the hitzone the user has selected. In this specific case, they have the head selected.
if(affecting.lying)
return
@@ -368,7 +368,7 @@
//This specific example would allow you to squish people's eyes with a GRAB_NECK.
- if(I_DISARM) //This checks that the user is on disarm intent.
+ if(INTENT_DISARM) //This checks that the user is on disarm intent.
/* if(state < GRAB_AGGRESSIVE)
to_chat(assailant, "You require a better grab to do this.")
return
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 6c443b4aa30..e1a1bdc1d8b 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -319,20 +319,20 @@ proc/muffledspeech(phrase)
return 0
//converts intent-strings into numbers and back
-var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
+var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
/proc/intent_numeric(argument)
if(istext(argument))
switch(argument)
- if(I_HELP) return 0
- if(I_DISARM) return 1
- if(I_GRAB) return 2
+ if(INTENT_HELP) return 0
+ if(INTENT_DISARM) return 1
+ if(INTENT_GRAB) return 2
else return 3
else
switch(argument)
- if(0) return I_HELP
- if(1) return I_DISARM
- if(2) return I_GRAB
- else return I_HARM
+ if(0) return INTENT_HELP
+ if(1) return INTENT_DISARM
+ if(2) return INTENT_GRAB
+ else return INTENT_HARM
//change a mob's act-intent. Input the intent as a string such as "help" or use "right"/"left
/mob/verb/a_intent_change(input as text)
@@ -341,7 +341,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
if(ishuman(src) || isalienadult(src) || isbrain(src))
switch(input)
- if(I_HELP,I_DISARM,I_GRAB,I_HARM)
+ if(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
a_intent = input
if("right")
a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4)
@@ -352,14 +352,14 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
else if(isrobot(src) || islarva(src))
switch(input)
- if(I_HELP)
- a_intent = I_HELP
- if(I_HARM)
- a_intent = I_HARM
+ if(INTENT_HELP)
+ a_intent = INTENT_HELP
+ if(INTENT_HARM)
+ a_intent = INTENT_HARM
if("right","left")
a_intent = intent_numeric(intent_numeric(a_intent) - 3)
if(hud_used && hud_used.action_intent)
- if(a_intent == I_HARM)
+ if(a_intent == INTENT_HARM)
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 03ba9618bd4..20e08001754 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -149,14 +149,6 @@
/client/Move(n, direct)
- if(viewingCanvas)
- view = world.view //Reset the view
- winset(src, "mapwindow.map", "icon-size=[src.reset_stretch]")
- viewingCanvas = 0
- mob.reset_perspective()
- if(mob.hud_used)
- mob.hud_used.show_hud(HUD_STYLE_STANDARD)
-
if(world.time < move_delay)
return
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index c21733a7a39..51890a7337f 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -128,7 +128,7 @@
if("Drone")
new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc)
- new_xeno.a_intent = I_HARM
+ new_xeno.a_intent = INTENT_HARM
new_xeno.key = key
to_chat(new_xeno, "You are now an alien.")
@@ -187,7 +187,7 @@
qdel(t)
var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc)
- new_corgi.a_intent = I_HARM
+ new_corgi.a_intent = INTENT_HARM
new_corgi.key = key
to_chat(new_corgi, "You are now a Corgi. Yap Yap!")
@@ -218,7 +218,7 @@
var/mob/new_mob = new mobpath(src.loc)
new_mob.key = key
- new_mob.a_intent = I_HARM
+ new_mob.a_intent = INTENT_HARM
to_chat(new_mob, "You suddenly feel more... animalistic.")
@@ -235,7 +235,7 @@
var/mob/new_mob = new mobpath(src.loc)
new_mob.key = key
- new_mob.a_intent = I_HARM
+ new_mob.a_intent = INTENT_HARM
to_chat(new_mob, "You feel more... animalistic")
new_mob.update_pipe_vision()
diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm
index 35969ab8d5e..1ea05b1073e 100644
--- a/code/modules/ninja/martial_art.dm
+++ b/code/modules/ninja/martial_art.dm
@@ -162,7 +162,7 @@
if(!istype(A, /mob/living/carbon/human)) // Special moves only work on humans.
user.pointed(A)
return 0
- if(user.a_intent == "help") // No special move for help intent.
+ if(user.a_intent == INTENT_HELP) // No special move for help intent.
user.pointed(A)
return 0
if(!(A in range(1,user))) // Is the target within one tile of us?
@@ -173,10 +173,10 @@
var/mob/living/carbon/human/target = A
switch(user.a_intent)
- if("disarm")
+ if(INTENT_DISARM)
user_martial_art.wrist_wrench(user, target)
- if("grab")
+ if(INTENT_GRAB)
user_martial_art.choke_hold(user, target)
- if("harm")
+ if(INTENT_HARM)
user_martial_art.palm_strike(user, target)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index b70e847cab4..705e4ad8ed7 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -525,7 +525,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
if(!S)
return
- if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2)
+ if(!(S.status & ORGAN_ROBOT) || user.a_intent != INTENT_HELP || S.open == 2)
return ..()
if(S.burn_dam)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 3f42b4d58ce..323d403d1cb 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -122,6 +122,7 @@
fixture_type = "bulb"
sheets_refunded = 1
+
// the standard tube light fixture
/obj/machinery/light
name = "light fixture"
@@ -149,6 +150,7 @@
// this is used to calc the probability the light burns out
var/rigged = 0 // true if rigged to explode
+ var/lightmaterials = list(MAT_GLASS=100) //stores the materials the light is made of to stop infinite glass exploit
// the smaller bulb light fixture
@@ -305,6 +307,7 @@
brightness_range = L.brightness_range
brightness_power = L.brightness_power
brightness_color = L.brightness_color
+ lightmaterials = L.materials
on = has_power()
update()
@@ -450,7 +453,7 @@
else if(TK in user.mutations)
to_chat(user, "You telekinetically remove the light [fitting].")
else
- if(user.a_intent == I_DISARM || user.a_intent == I_GRAB)
+ if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB)
to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!")
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
@@ -472,6 +475,7 @@
L.brightness_range = brightness_range
L.brightness_power = brightness_power
L.brightness_color = brightness_color
+ L.materials = lightmaterials
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
@@ -500,6 +504,7 @@
L.brightness_range = brightness_range
L.brightness_power = brightness_power
L.brightness_color = brightness_color
+ L.materials = lightmaterials
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
@@ -596,7 +601,7 @@
var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/base_state
var/switchcount = 0 // number of times switched
- materials = list(MAT_METAL=60)
+ materials = list(MAT_GLASS=100)
var/rigged = 0 // true if rigged to explode
var/brightness_range = 2 //how much light it gives off
var/brightness_power = 1
@@ -608,7 +613,6 @@
icon_state = "ltube"
base_state = "ltube"
item_state = "c_tube"
- materials = list(MAT_GLASS=100)
brightness_range = 8
/obj/item/weapon/light/tube/large
@@ -623,7 +627,6 @@
icon_state = "lbulb"
base_state = "lbulb"
item_state = "contvapour"
- materials = list(MAT_GLASS=100)
brightness_range = 5
brightness_color = "#a0a080"
@@ -637,7 +640,6 @@
icon_state = "fbulb"
base_state = "fbulb"
item_state = "egg4"
- materials = list(MAT_GLASS=100)
brightness_range = 5
// update the icon state and description of the light
@@ -694,7 +696,7 @@
if(!proximity) return
if(istype(target, /obj/machinery/light))
return
- if(user.a_intent != I_HARM)
+ if(user.a_intent != INTENT_HARM)
return
shatter()
diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm
index 0dc2bbb5f76..5f8f8c1b8e4 100644
--- a/code/modules/power/treadmill.dm
+++ b/code/modules/power/treadmill.dm
@@ -70,11 +70,11 @@
// a reasonable approximation of movement speed
var/mob_speed = M.movement_delay()
switch(M.m_intent)
- if("run")
+ if(MOVE_INTENT_RUN)
if(M.drowsyness > 0)
mob_speed += 6
mob_speed += config.run_speed - 1
- if("walk")
+ if(MOVE_INTENT_WALK)
mob_speed += config.walk_speed - 1
mob_speed = BASE_MOVE_DELAY / max(1, BASE_MOVE_DELAY + mob_speed)
speed = min(speed + inertia * mob_speed, mob_speed)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 0304f4a48a9..1baac918966 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -117,7 +117,7 @@
if(flag) //It's adjacent, is the user, or is on the user's person
if(target in user.contents) //can't shoot stuff inside us.
return
- if(!ismob(target) || user.a_intent == "harm") //melee attack
+ if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
return
if(target == user && user.zone_sel.selecting != "mouth") //so we can't shoot ourselves (unless mouth selected)
return
@@ -232,7 +232,7 @@ obj/item/weapon/gun/proc/newshot()
feedback_add_details("gun_fired","[type]")
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
- if(user.a_intent == "harm") //Flogging
+ if(user.a_intent == INTENT_HARM) //Flogging
..()
else
return
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index ef7a17fa28a..f5cfede882d 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -218,7 +218,7 @@
/obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)
if(flag)
if(!(target in user.contents) && ismob(target))
- if(user.a_intent == "harm") // Flogging action
+ if(user.a_intent == INTENT_HARM) // Flogging action
return
if(isliving(user))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 6cddc1c1b91..01dcbd5228d 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -130,7 +130,7 @@
/obj/item/projectile/beam/instakill/on_hit(atom/target)
. = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.visible_message("[M] explodes into a shower of gibs!")
- M.gib()
+ if(isliving(target))
+ var/mob/living/L = target
+ L.visible_message("[L] explodes!")
+ L.gib()
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 6d4976e1d53..ff274a48993 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -243,7 +243,7 @@ proc/wabbajack(mob/living/M)
M.create_attack_log("[M.real_name] ([M.ckey]) became [new_mob.real_name].")
new_mob.attack_log = M.attack_log
- new_mob.a_intent = I_HARM
+ new_mob.a_intent = INTENT_HARM
if(M.mind)
M.mind.transfer_to(new_mob)
else
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 2714b8d1b16..839ce9c0a8d 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -151,7 +151,7 @@
return 1
if (!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items))
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
return ..()
else
to_chat(user, "Cannot refine into a reagent!")
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index 89233789903..241370668e0 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -373,8 +373,8 @@
color = "#FF83A5"
/datum/reagent/love/on_mob_life(mob/living/M)
- if(M.a_intent == I_HARM)
- M.a_intent = I_HELP
+ if(M.a_intent == INTENT_HARM)
+ M.a_intent = INTENT_HELP
if(prob(8))
var/lovely_phrase = pick("appreciated", "loved", "pretty good", "really nice", "pretty happy with yourself, even though things haven't always gone as well as they could")
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 8896d939e2f..fc3baf62556 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -140,7 +140,7 @@
update_move_direction()
to_chat(user, "You rotate [src].")
- else if(user.a_intent != "harm")
+ else if(user.a_intent != INTENT_HARM)
if(user.drop_item())
I.forceMove(loc)
else
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 42b4151fcf0..7f47b68d76a 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -898,7 +898,7 @@
desc = "Allows for the construction of CH-PD Disabler."
id = "mech_laser"
build_type = MECHFAB
- req_tech = list("combat" = 3, "magnets" = 3)
+ req_tech = list("combat" = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -977,7 +977,7 @@
build_type = MECHFAB
req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
- materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000)
+ materials = list(MAT_METAL=20000,MAT_SILVER=8000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -986,9 +986,9 @@
desc = "Allows for the construction of ZFI Immolation Beam Gun."
id = "mech_tesla"
build_type = MECHFAB
- req_tech = list("combat" = 4, "materials" = 4, "plasmatech" = 2, "magnets" = 3)
+ req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
- materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_SILVER = 3000, MAT_PLASMA = 2000)
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 8000, MAT_PLASMA = 8000)
construction_time = 100
category = list("Exosuit Equipment")
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index c84c7c4c6c8..66c150f636d 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -394,22 +394,22 @@
build_path = /obj/item/weapon/implantcase
category = list("Medical")
-/datum/design/implant_freedom
- name = "Freedom Implant Case"
+/datum/design/implant_chem
+ name = "Chemical Implant Case"
desc = "A glass case containing an implant."
- id = "implant_freedom"
- req_tech = list("combat" = 6, "biotech" = 5, "magnets" = 3, "syndicate" = 3)
+ id = "implant_chem"
+ req_tech = list("materials" = 3, "biotech" = 5,)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 800, MAT_GLASS = 500, MAT_GOLD = 500)
- build_path = /obj/item/weapon/implantcase/freedom
+ materials = list(MAT_GLASS = 700)
+ build_path = /obj/item/weapon/implantcase/chem
category = list("Medical")
-/datum/design/implant_adrenalin
- name = "Adrenalin Implant Case"
+/datum/design/implant_tracking
+ name = "Tracking Implant Case"
desc = "A glass case containing an implant."
- id = "implant_adrenalin"
- req_tech = list("biotech" = 6, "combat" = 6, "syndicate" = 6)
+ id = "implant_tracking"
+ req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "programming" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 600, MAT_DIAMOND = 600)
- build_path = /obj/item/weapon/implantcase/adrenaline
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/weapon/implantcase/track
category = list("Medical")
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 5903035903b..3d459dd08a4 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -263,7 +263,7 @@
timer = world.time
priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.")
for(var/mob/M in player_list)
- if(!isnewplayer(M) && !M.client.karma_spent && !M.get_preference(DISABLE_KARMA_REMINDER))
+ if(!isnewplayer(M) && !M.client.karma_spent && !(M.client.ckey in karma_spenders) && !M.get_preference(DISABLE_KARMA_REMINDER))
to_chat(M, "You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under OOC tab, Award Karma.")
if(SHUTTLE_ESCAPE)
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index e05c7bc924a..d24853a7948 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -245,6 +245,7 @@
/obj/machinery/teleport/station,
/obj/machinery/teleport/hub,
/obj/machinery/telepad,
+ /obj/machinery/telepad_cargo,
/obj/machinery/clonepod,
/obj/effect/hierophant,
/obj/item/device/warp_cube,
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 2a111433948..c5dcf75c69a 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -296,7 +296,7 @@
to_chat(M, mymessage)
/obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params)
- if(user.a_intent == I_HARM)
+ if(user.a_intent == INTENT_HARM)
..()
deal_damage(W.force)
else
@@ -408,7 +408,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
cargo_hold.max_combined_w_class += SPE.storage_mod["w_class"]
/obj/spacepod/attack_hand(mob/user as mob)
- if(user.a_intent == I_GRAB && unlocked)
+ if(user.a_intent == INTENT_GRAB && unlocked)
var/mob/target
if(pilot)
target = pilot
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 045e34ea41e..fb52fba69f9 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -327,6 +327,10 @@ var/list/organ_cache = list()
/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target)
return // Nothing uses this, it is always overridden
+// A version of `replaced` that "flattens" the process of insertion, making organs "Plug'n'play"
+// (Particularly the heart, which stops beating when removed)
+/obj/item/organ/proc/safe_replace(var/mob/living/carbon/human/target)
+ replaced(target)
/obj/item/organ/proc/surgeryize()
return
@@ -370,4 +374,4 @@ I use this so that this can be made better once the organ overhaul rolls out --
// The only thing the official proc does is
//instantiate the list and call this proc
dna.deserialize(data["dna"])
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 05f06f4b030..071d579b0c0 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -170,6 +170,10 @@
if(!owner)
Stop()
+/obj/item/organ/internal/heart/safe_replace(mob/living/carbon/human/target)
+ Restart()
+ ..()
+
/obj/item/organ/internal/heart/proc/Stop()
beating = 0
update_icon()
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 05486c9046d..e44f20046db 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -305,8 +305,8 @@ var/static/regex/multispin_words = regex("like a record baby")
else if((findtext(message, walk_words)))
for(var/V in listeners)
var/mob/living/L = V
- if(L.m_intent != "walk")
- L.m_intent = "walk"
+ if(L.m_intent != MOVE_INTENT_WALK)
+ L.m_intent = MOVE_INTENT_WALK
if(L.hud_used)
L.hud_used.move_intent.icon_state = "walking"
next_command = world.time + cooldown_meme
@@ -315,8 +315,8 @@ var/static/regex/multispin_words = regex("like a record baby")
else if((findtext(message, run_words)))
for(var/V in listeners)
var/mob/living/L = V
- if(L.m_intent != "run")
- L.m_intent = "run"
+ if(L.m_intent != MOVE_INTENT_RUN)
+ L.m_intent = MOVE_INTENT_RUN
if(L.hud_used)
L.hud_used.move_intent.icon_state = "running"
next_command = world.time + cooldown_meme
@@ -324,25 +324,25 @@ var/static/regex/multispin_words = regex("like a record baby")
//HELP INTENT
else if((findtext(message, helpintent_words)))
for(var/mob/living/carbon/human/H in listeners)
- H.a_intent_change(I_HELP)
+ H.a_intent_change(INTENT_HELP)
next_command = world.time + cooldown_meme
//DISARM INTENT
else if((findtext(message, disarmintent_words)))
for(var/mob/living/carbon/human/H in listeners)
- H.a_intent_change(I_DISARM)
+ H.a_intent_change(INTENT_DISARM)
next_command = world.time + cooldown_meme
//GRAB INTENT
else if((findtext(message, grabintent_words)))
for(var/mob/living/carbon/human/H in listeners)
- H.a_intent_change(I_GRAB)
+ H.a_intent_change(INTENT_GRAB)
next_command = world.time + cooldown_meme
//HARM INTENT
else if((findtext(message, harmintent_words)))
for(var/mob/living/carbon/human/H in listeners)
- H.a_intent_change(I_HARM)
+ H.a_intent_change(INTENT_HARM)
next_command = world.time + cooldown_meme
//THROW/CATCH
@@ -452,4 +452,4 @@ var/static/regex/multispin_words = regex("like a record baby")
next_command = world.time + cooldown_none
message_admins("[key_name_admin(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
- log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
\ No newline at end of file
+ log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 127077a621d..48ee29f3f45 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -90,7 +90,7 @@
if(target_zone == surgery.location)
initiate(user, target, target_zone, tool, surgery)
return 1//returns 1 so we don't stab the guy in the dick or wherever.
- if(isrobot(user) && user.a_intent != I_HARM) //to save asimov borgs a LOT of heartache
+ if(isrobot(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
return 1
return 0
diff --git a/html/changelog.html b/html/changelog.html
index 9773490ef06..9af10b246e0 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,123 @@
-->
+
13 June 2017
+
KasparoVy updated:
+
+ - Moves a hidden emergency locker to where it is visible.
+
+
Vivalas updated:
+
+ - Brig timers will now update the records of those who are imprisoned in their cell, as long as their name is entered correctly.
+ - Sentences and arresting officers are announced over the security channel by brig timers, as well as the names of those who end timers manually.
+
+
+
10 June 2017
+
Alffd updated:
+
+ - Ports Incoming5643's persistence features for Runtime from TG
+ - Ports additional cat NPC emotes from TG
+
+
Citinited updated:
+
+ - Disconnecting before the shuttle leaves after having spent karma will no longer prompt you to spend karma.
+
+
FalseIncarnate updated:
+
+ - Adds Highlander Style, granted to the wielder of Highlander Claymores. This martial art allows you to deflect ranged attacks from the weapons of COWARDS. FOR THE HONOR OF THE HIGHLANDERS!
+ - Highlander now equips combatants with a Highlander claymore instead of a normal claymore. FIGHT ON BROTHERS!
+
+
+
09 June 2017
+
Alexshreds updated:
+
+ - Taking mhelps no longer gives mhelping players your IC name
+
+
FlattyPatty updated:
+
+ - Added forensics gloves for the Detective.
+
+
Fox McCloud updated:
+
+ - Paramedic door is no longer diamond
+ - Fixes the backwards health analyzer sprite
+ - Remove adrenaline and freedom implants from R&D
+ - Added chem and tracking implants to R&D
+
+
KasparoVy updated:
+
+ - Adds some sanity checking to the RCS.
+ - The cargo shuttle no longer permits RCS telepads.
+
+
Kyep updated:
+
+ - glowshrooms are now destroyable with two hits from a wirecutter.
+ - New 'department' shuttle, which can be sent by CC instead of the regular evac shuttle.
+ - The gods have grown tired of prayers requesting freebies, and developed some new curses with which to smite those who would treat them like miracle vending machines.
+
+
alexkar598 updated:
+
+ - Surgury holosign switch has correct icon at roundstart
+
+
tigercat2000 updated:
+
+ - You can now zoom in with the Set View Range option in your Preferences tab!
+
+
+
08 June 2017
+
Alexshreds updated:
+
+ - Hyphema and Ocular Restoration are now possible to evolve from viruses
+
+
+
07 June 2017
+
Fethas updated:
+
+ - adds cardboard cutouts..now you can trick the station into thinkings it shadowlings!
+
+
tigercat2000 updated:
+
+ - Luxury versions of the bluespace shelter capsule! Currently not obtainable.
+ - Black Carpet can now be crafted using a stack of carpet and a crayon.
+ - Black fancy tables can now be crafted using Black Carpet.
+ - Shower curtains can now be recoloured with crayons, unscrewed from the floor, disassembled with wire cutters, and reassembled using cloth, plastic, and a metal rod.
+
+
+
06 June 2017
+
DarkPyrolord updated:
+
+ - Plasmamen should be able to become vampires on normal vampire rounds.
+
+
Fox McCloud updated:
+
+ - adjust the mech tesla, immolator, and disabler techs to bring it in line with the tech refactor
+
+
Kyep updated:
+
+ - Instagib lasers now work against non-carbon mobs, such as animals and borgs.
+
+
imsxz updated:
+
+ - Sergeant Araneus now spawns at full HP.
+
+
+
04 June 2017
+
Crazylemon64 updated:
+
+ - Clone's hearts now start operational
+ - EMP'd clone pods can now be emptied again
+
+
FreeStylaLT updated:
+
+ - Cell 6 is now connected to the atmos system properly.
+
+
+
03 June 2017
+
FlattestGuitar updated:
+
+ - PACMAN boards and pico manipulators now have proper research levels
+
+
01 June 2017
Alexshreds updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index f11af979a99..441df3d78e7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -4835,3 +4835,83 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscdel: Removes the Autolathe from the RnD Room.
- rscdel: Removed the Forensic Scanner from RnD. Cargo can order a Forensics crate
now.
+2017-06-03:
+ FlattestGuitar:
+ - bugfix: PACMAN boards and pico manipulators now have proper research levels
+2017-06-04:
+ Crazylemon64:
+ - bugfix: Clone's hearts now start operational
+ - bugfix: EMP'd clone pods can now be emptied again
+ FreeStylaLT:
+ - bugfix: Cell 6 is now connected to the atmos system properly.
+2017-06-06:
+ DarkPyrolord:
+ - bugfix: Plasmamen should be able to become vampires on normal vampire rounds.
+ Fox McCloud:
+ - tweak: adjust the mech tesla, immolator, and disabler techs to bring it in line
+ with the tech refactor
+ Kyep:
+ - bugfix: Instagib lasers now work against non-carbon mobs, such as animals and
+ borgs.
+ imsxz:
+ - bugfix: Sergeant Araneus now spawns at full HP.
+2017-06-07:
+ Fethas:
+ - rscadd: adds cardboard cutouts..now you can trick the station into thinkings it
+ shadowlings!
+ tigercat2000:
+ - rscadd: Luxury versions of the bluespace shelter capsule! Currently not obtainable.
+ - rscadd: Black Carpet can now be crafted using a stack of carpet and a crayon.
+ - rscadd: Black fancy tables can now be crafted using Black Carpet.
+ - rscadd: Shower curtains can now be recoloured with crayons, unscrewed from the
+ floor, disassembled with wire cutters, and reassembled using cloth, plastic,
+ and a metal rod.
+2017-06-08:
+ Alexshreds:
+ - bugfix: Hyphema and Ocular Restoration are now possible to evolve from viruses
+2017-06-09:
+ Alexshreds:
+ - tweak: Taking mhelps no longer gives mhelping players your IC name
+ FlattyPatty:
+ - rscadd: Added forensics gloves for the Detective.
+ Fox McCloud:
+ - tweak: Paramedic door is no longer diamond
+ - bugfix: Fixes the backwards health analyzer sprite
+ - rscdel: Remove adrenaline and freedom implants from R&D
+ - rscadd: Added chem and tracking implants to R&D
+ KasparoVy:
+ - bugfix: Adds some sanity checking to the RCS.
+ - bugfix: The cargo shuttle no longer permits RCS telepads.
+ Kyep:
+ - rscadd: glowshrooms are now destroyable with two hits from a wirecutter.
+ - rscadd: New 'department' shuttle, which can be sent by CC instead of the regular
+ evac shuttle.
+ - rscadd: The gods have grown tired of prayers requesting freebies, and developed
+ some new curses with which to smite those who would treat them like miracle
+ vending machines.
+ alexkar598:
+ - bugfix: Surgury holosign switch has correct icon at roundstart
+ tigercat2000:
+ - rscadd: You can now zoom in with the Set View Range option in your Preferences
+ tab!
+2017-06-10:
+ Alffd:
+ - rscadd: Ports Incoming5643's persistence features for Runtime from TG
+ - rscadd: Ports additional cat NPC emotes from TG
+ Citinited:
+ - bugfix: Disconnecting before the shuttle leaves after having spent karma will
+ no longer prompt you to spend karma.
+ FalseIncarnate:
+ - rscadd: Adds Highlander Style, granted to the wielder of Highlander Claymores.
+ This martial art allows you to deflect ranged attacks from the weapons of COWARDS.
+ FOR THE HONOR OF THE HIGHLANDERS!
+ - tweak: Highlander now equips combatants with a Highlander claymore instead of
+ a normal claymore. FIGHT ON BROTHERS!
+2017-06-13:
+ KasparoVy:
+ - bugfix: Moves a hidden emergency locker to where it is visible.
+ Vivalas:
+ - rscadd: Brig timers will now update the records of those who are imprisoned in
+ their cell, as long as their name is entered correctly.
+ - rscadd: Sentences and arresting officers are announced over the security channel
+ by brig timers, as well as the names of those who end timers manually.
diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi
index 6e6ef4cce20..d7dd45e4227 100644
Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ
diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi
index 6bdb1530b48..96c023a0f40 100644
Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 6d0661c8911..08050649225 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 7dc7b163c54..90a218c7166 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
index 880e1e7c5eb..125be79a278 100644
Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
index fb428adaadc..827146bb24c 100644
Binary files a/icons/mob/species/plasmaman/suit.dmi and b/icons/mob/species/plasmaman/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 3ff998af6b7..f9bb3b2bbec 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/cardboard_cutout.dmi b/icons/obj/cardboard_cutout.dmi
new file mode 100644
index 00000000000..da5f58d7f7c
Binary files /dev/null and b/icons/obj/cardboard_cutout.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 82ce8437b28..42f1eda0e74 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index b78d7431d15..40d4ef11cc9 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 2735d145ac8..cb535c90165 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi
index fae242d524f..a4c207b402c 100644
Binary files a/icons/obj/lavaland/survival_pod.dmi and b/icons/obj/lavaland/survival_pod.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table.dmi b/icons/obj/smooth_structures/fancy_table.dmi
new file mode 100644
index 00000000000..a57b165f4ac
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi
new file mode 100644
index 00000000000..d4570e8a7c1
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_black.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 85788316c13..2c7fedf90b3 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index e4fedae838b..67cc9682cf8 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi
new file mode 100644
index 00000000000..d1174203aa9
Binary files /dev/null and b/icons/turf/floors/carpet_black.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 869bffe601b..71edb0e003d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -277,6 +277,7 @@
#include "code\datums\diseases\advance\symptoms\stimulant.dm"
#include "code\datums\diseases\advance\symptoms\symptoms.dm"
#include "code\datums\diseases\advance\symptoms\viral.dm"
+#include "code\datums\diseases\advance\symptoms\vision.dm"
#include "code\datums\diseases\advance\symptoms\voice_change.dm"
#include "code\datums\diseases\advance\symptoms\vomit.dm"
#include "code\datums\diseases\advance\symptoms\weakness.dm"
@@ -709,6 +710,7 @@
#include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\bodybag.dm"
#include "code\game\objects\items\candle.dm"
+#include "code\game\objects\items\cardboard_cutouts.dm"
#include "code\game\objects\items\changestone.dm"
#include "code\game\objects\items\contraband.dm"
#include "code\game\objects\items\control_wand.dm"
@@ -804,6 +806,7 @@
#include "code\game\objects\items\weapons\garrote.dm"
#include "code\game\objects\items\weapons\gift_wrappaper.dm"
#include "code\game\objects\items\weapons\handcuffs.dm"
+#include "code\game\objects\items\weapons\highlander_swords.dm"
#include "code\game\objects\items\weapons\holosign.dm"
#include "code\game\objects\items\weapons\holy_weapons.dm"
#include "code\game\objects\items\weapons\kitchen.dm"
@@ -1137,6 +1140,7 @@
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\message.dm"
+#include "code\modules\client\view.dm"
#include "code\modules\client\preference\preferences.dm"
#include "code\modules\client\preference\preferences_mysql.dm"
#include "code\modules\client\preference\preferences_spawnpoints.dm"