merge conflict fix

This commit is contained in:
FalseIncarnate
2017-10-28 18:38:20 -04:00
257 changed files with 4495 additions and 2115 deletions
+10 -10
View File
@@ -77,19 +77,19 @@ actual development.
do this:
```
/datum/datum1/proc/proc1()
if (thing1)
if (!thing2)
if (thing3 == 30)
if(thing1)
if(!thing2)
if(thing3 == 30)
do stuff
```
Instead, you should do this:
```
/datum/datum1/proc/proc1()
if (!thing1)
if(!thing1)
return
if (thing2)
if(thing2)
return
if (thing3 != 30)
if(thing3 != 30)
return
do stuff
```
@@ -101,7 +101,7 @@ actual development.
`visible_message()`.
- Bad:
```
for (var/mob/M in viewers(src))
for(var/mob/M in viewers(src))
M.show_message("<span class='warning'>Arbitrary text</span>")
```
- Good:
@@ -151,9 +151,9 @@ responsible for properly tagging new pull requests and issues, moderating commen
pull requests/issues, and merging/closing pull requests.
### Maintainer List
- [MarkvA](https://github.com/Markolie)
- [tigercat2000](https://github.com/tigercat2000)
- [Fox P McCloud](https://github.com/Fox-McCloud)
- [TheDZD](https://github.com/TheDZD)
- [Crazy Lemon](https://github.com/Crazylemon64)
### Maintainer instructions
- Do not `self-merge`; this refers to the practice of opening a pull request, then
@@ -168,4 +168,4 @@ pull requests/issues, and merging/closing pull requests.
- The shortest waiting period for -any- feature or balancing altering pull request is 24
hours, to allow other coders and the community time to discuss the proposed changes.
- If the discussion is active, or the change is controversial, the pull request is to be
put on hold until a consensus is reached.
put on hold until a consensus is reached.
@@ -7612,7 +7612,6 @@
"cQt" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/machinery/camera{c_tag = "Virology - Break Room"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
"cQu" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/table/glass,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology)
"cQv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cQw" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/wardrobe/black,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cQx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cQy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cQz" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
@@ -8028,7 +8027,6 @@
"cYt" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cYx" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"cYy" = (/obj/machinery/light/small,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"cYz" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=14.8-Dorms-Lockers"; location = "14.5-Recreation"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -8658,10 +8656,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIabqcCfcCfcCfcCfcCfaaaarBaaaabqaaaaaaaaabZUcPGcNacNbbZUcGZcEYcKzcKycKDcKAcGocKHcEYcKWcKXcFdcFdcFdcKecFdcFdcFdcKYcDecwqcKZcLbcLacLdcLccLecBvcBvcLfcDgcBvczCczCczCczCczCczCcLgcGqcGrcGscGtcGucGvcGwczMcGxcGycGzcGAcGBcGCcGDcdlcGFcGGcGHcGIcGIcGJcGKcGLcGMcGNcdncGPcGQcGRcGScGTcGUcGVcGVcGVcGWcBNabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcGYcFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaabqaaaabqaaaabqaaacmRaaaabqaaaabqabqabqabqaupaaaaaaaaaaaaabqbZUcNOcNPcNQbZUcEQcEYcLhcGocLicGocGocLjcEYcxpcLvcLkcLKcLwcLWcLwcLwcLwcLYcLXcxycKZcMacLZcLdcMbcMccImcMecMdcMrcMfcIocMwcIncMLcImcMScMTczGczHcHncHocHocHpcHqczMcHrcHscHtcDpcHvcHwcHxcdMcHzcHAcHBcHCceEcHEcHFcHGcHHcHIcHJceQcHLcHMcHNcHOcHPcHQcHRcHScHTcBNabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcHVcHWcHXcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacAfcAfcAfcAfcAfabqcHYabqcAfcAfcAfcAfcAfabqarBaaaaaaaaaaaaaaabZUcOJcOKcfbbZUcMUcEYcMWcMVcNccMXcNscNicEYcNIcNKcNJcNMcNLcNNcNKcNKcNScOqcNUcwqcKZcOIcOHcLdcOLcOUcImcPkcOYcPlcIncIocPucPwcPvcImcIscnscgxcItcBJcIucFOcIwcIucIxcIxcIxcIxcIxcIycxPcIzcEycIAcIAcIBcICcIDcIEcIFcIGcIHcIIcIJcEKcIKcILcIMcEycINcBNcBNcFHcBNcFHarAabqaaaaaaabqaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqcALcALcIOcIPcIPcIPcIQcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaaaaaaaaaaaaabZUbZUcfccPEcPFcPxcEYcEYcEYcEYcEYcEYcEYcEYcPycPycPycPzcPycPycPycPycPycPBcPAcPDcKZcKZcQbcLdcQfcLdcImcQwcMdcQzcIncIocQAcQCcQBcImcJgcnscgxcvmcwEcQKcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcXxcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcBdcBecBecBecBecBfckrcBgcBhcBhcBhcBhcBiabqarBaaaaaaaaaaaaaaabZUbZUcfccPEcPFcPxcEYcEYcEYcEYcEYcEYcEYcEYcPycPycPycPzcPycPycPycPycPycPBcPAcPDcKZcKZcQbcLdcQfcLdcImcyqcMdcQzcIncIocQAcQCcQBcImcJgcnscgxcvmcwEcQKcJicJjcJkcJlcJmcJncJocJpcJqcCOczQdgSdgSdgSdgSdgSdgScJrcJscJtcJucJvcJwcEKbZUcFGbZUcFHcJxcJycJzcJAcJBarAarAabqabqabqabqabqabqabqaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqcJCcJDcJCcIPcJEcIPcXxcJGcFNabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqcCfcCfcCfcCfcCfaaaclIaaacCfcCfcCfcCfcCfaaaaupaaaaaaaaaaaaaaaaaabZUbZUbZUbZUcJRcogcogcogcogcNTcogcogcQVcogcogcogcRkcNTcNTcRlcRocPycRpcNUcRLcREcwjcRMcwjcRMcSvcImcSBcMdcSCcIocSPcSMcTncTecImcMScEXcgxcvmcKpcTwcKrcKscKtcKtcKtcKucKvcJpcgCcCOcKwdgScKxcfHcfscgLdgTcYScKBbRzcKEcKFcEKcrUcKGccscfYcFHcFHcFHcFHcFHcHfcKIarAabqaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqabqcALcALcKJcIPcIPcIPcKKcALcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaaabqabqabqaaaaaacKLabqaaaaaaabqabqaaaaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaabZUbZUbZUbZUbZUbZUbZUbZUbZUbZUbZUcoDcuVcTFchycoDcTZcjicUacUocUecUqcUpcUpcUrcUpcUFcUVcUUcVbcUWcVmcVlcVucVtcVEcVvcWkcVKcWGcWlcWHcIxcIxcLlcLmcLncLocLpcLqcLrcJpcLscLtcLucBNcKxcfHchuchuchEcLxcLycLzcJucLAcEKcdNcLBceNchycLCbZUabqabqabqabqabqabqabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcHUcALcLDcLEcLFcALcHUabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaacHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaaaaaabqaaaabqabqabqaaabZUcWIchychychychycWTchycDUcWUcwncXrcXlcXlcXwcXAcXycXYcImcYocYncYwcIncYIcYycYNcYLcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcMtcMucMvcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcMycFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaacHZcHZcHZcFvcHZcHZcHZaaaabqaaaaaaaaaabqaaaabqabqabqaaabZUcWIchychychychycWTchycDUcWUcwncXrcXlcXlcXwcXAcXycXYcImcYocYncyFcIncYIcYycYNcYLcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqdgScKxcfHchuckedgTcYTcKBcMtcMucMvcEKcjnchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcALcFNcMycFNcALabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqcHZcIRcIScIRcITcIRcHZcHZcFvcHZcFvcHZcHZaaaaaaabqaaaaaacHZcHZcHZcHZcHZbZUcKVbZUcDUcYOcDecRLcRUcRUcRUcRUcRUcRUcRUcImcImcImcImcYWcImcImcImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhckzcNjcNkcNldgVdgUdgUdgUdgUdgUcNocNncNpcNqcNrcEKchychyceNchybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcALcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaacHZcJHcJIcJJcJKcJHcGXcJMcJNcJOcJPcJQcHZaaacZmcIacIacIacLRcLTcLUcLVcHZcZvcZqcZwcDUcZIcZycZQcZOcZXdeidafdaddakcRUcNRcmVcmVcmWdancjecmYcmYcmZcNVcNWcNXcBIcIxcNYcNZcOacOacOacObcOccOdcOecOfcOgcOhcOicOjcOkcOlcJLcOncOocOpclncOrcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqabqcHZcKMcHjcKOcHucKMcKMcKQcKRcKScKTcKUcHZaaadaodaucMMcMNcMOcMPcMBcMQcMRdaydaxdaMdaLdaOdaNdaPcYCdaUdaQdbbdaVdbfcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTdblcOVcOWcLpcOXclCcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdenclGcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8745,3 +8743,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+2 -1
View File
@@ -649,6 +649,7 @@
"my" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"mz" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"mA" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"mB" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
"mH" = (/obj/structure/lattice,/turf/space/transit,/area/wizard_station)
"mI" = (/obj/item/weapon/shard{color = "#008000"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station)
"mK" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
@@ -1050,7 +1051,7 @@ ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVilkFilililililililkGkHilililgVhKhfhYgYgYgYklhfhKgOabababgNkyibibibibibibibibibibibibibibibibibibibgNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVililililiAiliAililililililkUgVkVkVkWkXkYkZlakVkVkVabababgNkyibibibibibibibiLfZiLiMiLisisisiLfZiLfZiLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVloilillplplplpiBililililillrgVlsltlulvlwlxlultltkVabababgNlylzlzlzlAlBlClAicibiciKicabababicibicibicababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamawamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVlSiliClpjNjOlpilililililillWgVltlXlYlvlwlxlYlZltkVabababgNgNgNgNgNgNgNgNgNlDiNlDiNlDababablDfZlDfZlDababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamamamamawamamamamamamamamamamamamamamamamamamamiSababababababababababababababababababababababababababgVlSiliCmBjNjOlpilililililillWgVltlXlYlvlwlxlYlZltkVabababgNgNgNgNgNgNgNgNgNlDiNlDiNlDababablDfZlDfZlDababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamfmgmhmiaaaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamiSayiSayiSaCamaWiSayiSayiSaCamamamamamamamatamiSababababababababababababababababababababababababababgVmuilillplplplpiBilililililmvgVmwltmwlvlwlxmwltmwkVabababababababababababababababababababababiOabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHaamIgamKmLmMaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamamamaAmnaAmnaAaCamaWaAmnaAmnaAaCamamatamamamamamamiSababababababababababababababababababababababababababgVmYililiFiliFilililililililnagVnbltltlvlwlxltltnckVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaamHnlnmnnmKnonpaaaaaaaaaaaaaaaaaaaaabababababababiSamamamamamamamavamaBmnaBmnaBaEaxaDaBmnaBmnaBaEavaxaxamamavamamamiSababababababababababababababababababababababababababgVnBilililililililnCnDnEnFnanGgVnHnInIlvlwlxnJnJnKkVabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+30 -22
View File
@@ -770,7 +770,7 @@
"oP" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space)
"oQ" = (/obj/machinery/vending/syndisnack,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"oR" = (/obj/machinery/vending/syndicigs,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"oS" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = 6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"oS" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Mass Drivers"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"oT" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/centcom/gamma)
"oU" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/centcom/gamma)
"oV" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/centcom/gamma)
@@ -898,6 +898,20 @@
"rn" = (/obj/machinery/power/apc{dir = 2; name = "Gamma Armory APC"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space)
"ro" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/mech_bay_power_console,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space)
"rp" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/mech_bay_recharge_floor,/area/shuttle/gamma/space)
"rq" = (/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"rr" = (/obj/mecha/combat/marauder/seraph/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"rs" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor Storage"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"rt" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT"; name = "Assault Armor"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"ru" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"rv" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "GRAVPULTS"; name = "Gravity Catapults"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"rw" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "GRAVPULTS"; name = "Gravity Catapults"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"rx" = (/obj/machinery/teleport/hub/upgraded{admin_usage = 1},/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"ry" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "CCTELE"; name = "Specops Teleporter"; p_open = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"rz" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"rA" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"rB" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"rC" = (/obj/structure/table/woodentable{dir = 9},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "GRAVPULTS"; name = "Gravity Catapults"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_x = 6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCTELE"; name = "Teleporter Access"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"rD" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"rE" = (/turf/unsimulated/wall,/area/start)
"rH" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start)
"rK" = (/turf/unsimulated/wall/splashscreen,/area/start)
@@ -934,8 +948,6 @@
"sX" = (/turf/unsimulated/wall,/area/centcom/specops)
"sZ" = (/obj/structure/table,/obj/machinery/processor{pixel_x = 0; pixel_y = 10},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"ta" = (/obj/machinery/mech_bay_recharge_port/upgraded,/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
"tb" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor North"; dir = 2; network = list("ERT","CentComm")},/obj/mecha/combat/marauder/seraph/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"tc" = (/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops)
"td" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"te" = (/obj/machinery/recharge_station/upgraded,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"tf" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
@@ -953,7 +965,6 @@
"tr" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"ts" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave/upgraded,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"tt" = (/obj/mecha/combat/marauder/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"tu" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops)
"tv" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT2"; name = "Launch Bay #2"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
"tw" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
"tx" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control)
@@ -979,9 +990,7 @@
"tV" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
"tW" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
"tX" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
"tY" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"tZ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control)
"ua" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT"; name = "Assault Armor"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"ub" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT"; name = "Assault Armor"; p_open = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uc" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control)
"ud" = (/turf/unsimulated/floor{icon_state = "green"},/area/centcom/control)
@@ -1051,7 +1060,6 @@
"vx" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vy" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vz" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass,/area/centcom/specops)
"vA" = (/obj/structure/table/woodentable{dir = 9},/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"vB" = (/obj/machinery/computer/security/telescreen{name = "Special Ops. Monitor"; desc = "Used for watching the Special Ops."; network = list("ERT")},/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops)
"vC" = (/obj/structure/table/woodentable{dir = 5},/obj/item/device/radio/intercom/specops,/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
"vF" = (/obj/machinery/door/airlock/centcom{name = "Telecommunications"; opacity = 1; req_access_txt = "107"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
@@ -1611,25 +1619,25 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqswsssssxsyszmmsBsCmnsEsEsysysqsFsGsHsIsqsJsKsLsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsqsqsqsqsqsysEmnsMsNmnsEsEsOmosqsQsQsQsQsqsRsSsTsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsvsEsEsEsEsEsEsEsEsysysqsQsUsVsVsqsqsWsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsqaNaNaNsvsEsEsEsEsEsEsEsEsEsEsusQmpmpsQsQsQsQsZsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatbtctdtdtesqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititjtktitititjtltmtntdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititvtktitititvtwtmtntdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqcScRcUcTcWcVcXsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtAsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqdodedqdpdLdKdesufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtYtdtdtdsXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmsXsXsXsXsXsXuaubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoEoEoEoEoFfmfofnfqfpfsfrfnfEfmufuguguhuiujujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsqaNaNaNsvsEsEsEsEsEsEsEsEsEsEsusQmpmpsQsQsQsQsZsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXoSrqtdtesXtarrrstdsqsqsqsqsqsEsEmnsMsCmnsEsEsEsEsEsQsQsQsQtfsQsQtgsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititjtktitititjtltmtntdtdrttdtdtdtdsqsrssstsqtosEmnsMtpmnsEsEsEsEsutqsQsQsQtrsQsQtssqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtdsXtatttdtdsqswsssssxsEsEsEsEsEsEsEsEsEsEsqsusususususususqsqdWdXsqsqsqsqsqsqsqsqsqsqsqsqsqdVaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititvtktitititvtwtmtntdtdrttdtdtdtdsqsqsqsqsqsqsqtxsqsqsqsqsEsEtysqcScRcUcTcWcVcXsudZdYebeasuecefefefefefegefefefeheiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtAsXtatttdtdsqtBtCtDsqtEtFtFtFtFtGsqsEsEtHsqdodedqdpdLdKdesufbfatLfcsuemeCeCeCeCeCeCeCeCeCeSeiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdrttdtdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXsXtdtdtdtdsXtatttdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtntdrurttdtdtdrusXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmsXrwrvsXsXsXsXubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoEoEoEoEoFfmfofnfqfpfsfrfnfEfmufujujuhuiugujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGoNoJoWoPoGfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpgpfpfpfphoGfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipfpkpopfptfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXuTuUuTsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNaNaNaNaNaNaNaNsXujuXuRooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNaNaNaNsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNaNaNaNsXvkvkpqprujujujvyvyujujujvzvdvAvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvksXvIvJujujujujvLujsXvdoSmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNsXrxujujujujujryujuXrzooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNsXrAujsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNsXrBujsXvkvkpqprujujujvyvyujujujvzvdrCvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXvkvkvksXvIvJujujujujvLujsXvdrDmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXuKsqvWtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXuKsqwkudwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvxsXsXaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXoXsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+5 -2
View File
@@ -33,7 +33,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/New()
..()
atmos_machinery += src
if(!icon_manager)
icon_manager = new()
@@ -54,6 +54,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/Destroy()
QDEL_NULL(stored)
atmos_machinery -= src
for(var/mob/living/L in src) //ventcrawling is serious business
L.remove_ventcrawl()
L.forceMove(get_turf(src))
@@ -166,7 +167,9 @@ Pipelines + Other Objects -> Pipe network
add_fingerprint(user)
var/unsafe_wrenching = FALSE
var/internal_pressure = int_air.return_pressure()-env_air.return_pressure()
var/I = int_air ? int_air.return_pressure() : 0
var/E = env_air ? env_air.return_pressure() : 0
var/internal_pressure = I - E
playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
@@ -147,6 +147,6 @@
T.assume_air(to_release)
air_update_turf(1)
/obj/machinery/atmospherics/binary/process()
/obj/machinery/atmospherics/binary/process_atmos()
..()
return parent1 && parent2
@@ -70,7 +70,7 @@
else
last_pressure_delta = 0
/obj/machinery/atmospherics/binary/circulator/process()
/obj/machinery/atmospherics/binary/circulator/process_atmos()
..()
update_icon()
@@ -104,8 +104,9 @@
else
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/dp_vent_pump/process()
if(!..() || !on)
/obj/machinery/atmospherics/binary/dp_vent_pump/process_atmos()
..()
if(!on)
return 0
var/datum/gas_mixture/environment = loc.return_air()
@@ -33,8 +33,9 @@
add_underlay(T, node1, turn(dir, 180))
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/passive_gate/process()
if(!..() || !on)
/obj/machinery/atmospherics/binary/passive_gate/process_atmos()
..()
if(!on)
return 0
var/output_starting_pressure = air2.return_pressure()
@@ -53,8 +53,9 @@ Thus, the two variables affect pump operation are set in New():
add_underlay(T, node1, turn(dir, -180))
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/pump/process()
if(!..() || (stat & (NOPOWER|BROKEN)) || !on)
/obj/machinery/atmospherics/binary/pump/process_atmos()
..()
if((stat & (NOPOWER|BROKEN)) || !on)
return 0
var/output_starting_pressure = air2.return_pressure()
@@ -51,8 +51,9 @@ Thus, the two variables affect pump operation are set in New():
add_underlay(T, node1, turn(dir, -180))
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/volume_pump/process()
if(!..() || (stat & (NOPOWER|BROKEN)) || !on)
/obj/machinery/atmospherics/binary/volume_pump/process_atmos()
..()
if((stat & (NOPOWER|BROKEN)) || !on)
return 0
// Pump mechanism just won't do anything if the pressure is too high/too low
@@ -42,8 +42,9 @@
return 0
/obj/machinery/atmospherics/omni/filter/process()
if(!..() || !on)
/obj/machinery/atmospherics/omni/filter/process_atmos()
..()
if(!on)
return 0
if(!input || !output)
@@ -83,8 +83,9 @@
return 0
/obj/machinery/atmospherics/omni/mixer/process()
if(!..() || !on)
/obj/machinery/atmospherics/omni/mixer/process_atmos()
..()
if(!on)
return 0
var/datum/gas_mixture/output_air = output.air
@@ -128,7 +128,7 @@
/obj/machinery/atmospherics/omni/attack_ghost(mob/user)
ui_interact(user)
/obj/machinery/atmospherics/omni/proc/build_icons()
if(!check_icon_cache())
return
@@ -293,7 +293,7 @@
P.parent = New
/obj/machinery/atmospherics/omni/process()
/obj/machinery/atmospherics/omni/process_atmos()
..()
for(var/datum/omni_port/port in ports)
if(!port.parent)
@@ -68,8 +68,9 @@ Filter types:
if(old_stat != stat)
update_icon()
/obj/machinery/atmospherics/trinary/filter/process()
if(!..() || !on)
/obj/machinery/atmospherics/trinary/filter/process_atmos()
..()
if(!on)
return 0
var/output_starting_pressure = air3.return_pressure()
@@ -56,8 +56,9 @@
..()
air3.volume = 300
/obj/machinery/atmospherics/trinary/mixer/process()
if(!..() || !on)
/obj/machinery/atmospherics/trinary/mixer/process_atmos()
..()
if(!on)
return 0
var/output_starting_pressure = air3.return_pressure()
@@ -206,6 +206,6 @@
T.assume_air(to_release)
air_update_turf(1)
/obj/machinery/atmospherics/trinary/process()
/obj/machinery/atmospherics/trinary/process_atmos()
..()
return parent1 && parent2 && parent3
@@ -22,10 +22,11 @@
return
/obj/machinery/atmospherics/unary/cold_sink/process()
if(!..() || !on)
/obj/machinery/atmospherics/unary/cold_sink/process_atmos()
..()
if(!on)
return 0
var/air_heat_capacity = air_contents.heat_capacity()
var/combined_heat_capacity = current_heat_capacity + air_heat_capacity
var/old_temperature = air_contents.temperature
@@ -32,9 +32,8 @@
..()
/obj/machinery/atmospherics/unary/heat_exchanger/process()
if(!..())
return 0
/obj/machinery/atmospherics/unary/heat_exchanger/process_atmos()
..()
if(!partner)
return 0
@@ -22,8 +22,9 @@
return
/obj/machinery/atmospherics/unary/heat_reservoir/process()
if(!..() || !on)
/obj/machinery/atmospherics/unary/heat_reservoir/process_atmos()
..()
if(!on)
return 0
var/air_heat_capacity = air_contents.heat_capacity()
var/combined_heat_capacity = current_heat_capacity + air_heat_capacity
@@ -51,10 +51,9 @@
if(old_stat != stat)
update_icon()
/obj/machinery/atmospherics/unary/outlet_injector/process()
if(!..())
return 0
/obj/machinery/atmospherics/unary/outlet_injector/process_atmos()
..()
injecting = 0
if(!on || stat & NOPOWER)
@@ -28,8 +28,9 @@
air_contents.volume = 50
/obj/machinery/atmospherics/unary/oxygen_generator/process()
if(!..() || !on)
/obj/machinery/atmospherics/unary/oxygen_generator/process_atmos()
..()
if(!on)
return 0
var/total_moles = air_contents.total_moles()
@@ -17,9 +17,8 @@
..()
air_contents.volume = volume
/obj/machinery/atmospherics/unary/passive_vent/process()
if(!..())
return 0
/obj/machinery/atmospherics/unary/passive_vent/process_atmos()
..()
if(!node)
return 0
@@ -28,8 +28,9 @@
return
add_underlay(T, node, dir)
/obj/machinery/atmospherics/unary/portables_connector/process()
if(!..() || !connected_device)
/obj/machinery/atmospherics/unary/portables_connector/process_atmos()
..()
if(!connected_device)
return 0
parent.update = 1
@@ -17,9 +17,8 @@
prefix="h"
icon_state = "[prefix]off"
/obj/machinery/atmospherics/unary/thermal_plate/process()
if(!..())
return 0
/obj/machinery/atmospherics/unary/thermal_plate/process_atmos()
..()
var/datum/gas_mixture/environment = loc.return_air()
@@ -99,6 +99,6 @@
T.assume_air(to_release)
air_update_turf(1)
/obj/machinery/atmospherics/unary/process()
/obj/machinery/atmospherics/unary/process_atmos()
..()
return parent
@@ -121,8 +121,9 @@
update_icon()
update_underlays()
/obj/machinery/atmospherics/unary/vent_pump/process()
if(!..() || (stat & (NOPOWER|BROKEN)))
/obj/machinery/atmospherics/unary/vent_pump/process_atmos()
..()
if((stat & (NOPOWER|BROKEN)))
return 0
if(!node)
on = 0
@@ -146,7 +147,7 @@
if(pressure_delta > 0.5)
if(air_contents.temperature > 0)
var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) / 5
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -164,7 +165,7 @@
if(pressure_delta > 0.5)
if(environment.temperature > 0)
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) / 5
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
if(isnull(removed)) //in space
@@ -175,9 +175,8 @@
src.broadcast_status()
check_turfs()
/obj/machinery/atmospherics/unary/vent_scrubber/process()
if(!..())
return 0
/obj/machinery/atmospherics/unary/vent_scrubber/process_atmos()
..()
if(widenet)
check_turfs()
@@ -215,7 +214,7 @@
if(scrubbing)
if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0))
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() / 5
//Take a gas sample
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
@@ -257,7 +256,7 @@
if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
return
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) / 5
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
+2 -1
View File
@@ -25,11 +25,12 @@
/obj/machinery/atmospherics/pipe/cap/pipeline_expansion()
return list(node)
/obj/machinery/atmospherics/pipe/cap/process()
/obj/machinery/atmospherics/pipe/cap/process_atmos()
if(!parent)
..()
else
. = PROCESS_KILL
/obj/machinery/atmospherics/pipe/cap/Destroy()
. = ..()
if(node)
+1 -1
View File
@@ -66,7 +66,7 @@
/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion()
return list(node1, node2, node3)
/obj/machinery/atmospherics/pipe/manifold/process()
/obj/machinery/atmospherics/pipe/manifold/process_atmos()
if(!parent)
..()
else
+1 -1
View File
@@ -25,7 +25,7 @@
/obj/machinery/atmospherics/pipe/manifold4w/pipeline_expansion()
return list(node1, node2, node3, node4)
/obj/machinery/atmospherics/pipe/manifold4w/process()
/obj/machinery/atmospherics/pipe/manifold4w/process_atmos()
if(!parent)
..()
else
@@ -13,7 +13,7 @@
buckle_lying = 1
var/icon_temperature = T20C //stop small changes in temperature causing icon refresh
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process()
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process_atmos()
var/environment_temperature = 0
var/datum/gas_mixture/pipe_air = return_air()
if(!pipe_air)
+18 -5
View File
@@ -221,7 +221,7 @@
if(air.temperature < T0C && air.return_pressure() > 10)
icy = 1
else
else if(air.temperature > T0C)
icy = 0
update_visuals()
@@ -305,17 +305,30 @@
/atom/movable/var/pressure_resistance = 5
/atom/movable/var/throw_pressure_limit = 15
/atom/movable/var/last_forced_movement = 0
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
if(last_forced_movement >= air_master.current_cycle)
return 0
else if(!anchored && !pulledby)
if(pressure_difference > pressure_resistance)
if(pressure_difference >= throw_pressure_limit)
var/general_direction = get_edge_target_turf(src, direction)
if(last_forced_movement + 10 < air_master.current_cycle && is_valid_tochat_target(src)) //the first check prevents spamming throw to_chat
to_chat(src, "<span class='userdanger'>The pressure sends you flying!</span>")
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.Weaken(min(pressure_difference / 10, 10))
spawn()
throw_at(general_direction, pressure_difference / 10, pressure_difference / 200, null, 0, 0, null)
last_forced_movement = air_master.current_cycle
spawn step(src, direction)
return 1
return 1
else if(pressure_difference > pressure_resistance)
spawn()
step(src, direction)
last_forced_movement = air_master.current_cycle
return 1
return 0
+5 -5
View File
@@ -48,14 +48,14 @@
#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C
#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
#define FIRE_CARBON_ENERGY_RELEASED 2500000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_PLASMA_ENERGY_RELEASED 15000000 //Amount of heat released per mole of burnt plasma into the tile
#define FIRE_GROWTH_RATE 40000 //For small fires
#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage
#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage
//Plasma fire properties
#define OXYGEN_BURN_RATE_BASE 1.4
#define PLASMA_BURN_RATE_DELTA 4
#define OXYGEN_BURN_RATE_BASE 7
#define PLASMA_BURN_RATE_DELTA 20
#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
#define PLASMA_UPPER_TEMPERATURE 1370+T0C
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
@@ -119,4 +119,4 @@
// Atmos alarm defines
#define ATMOS_ALARM_NONE 0
#define ATMOS_ALARM_WARNING 1
#define ATMOS_ALARM_DANGER 2
#define ATMOS_ALARM_DANGER 2
+2
View File
@@ -9,6 +9,8 @@
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
#define is_pen(W) (istype(W, /obj/item/weapon/pen))
var/list/static/global/pointed_types = typecacheof(list(
/obj/item/weapon/pen,
/obj/item/weapon/screwdriver,
+5
View File
@@ -19,6 +19,8 @@
#define LEFT 1
#define RIGHT 2
#define SPLINT_LIFE 2000 //number of steps splints stay on
//Pulse levels, very simplified
#define PULSE_NONE 0 //so !M.pulse checks would be possible
@@ -169,3 +171,6 @@
#define hasorgans(A) (ishuman(A))
#define is_admin(user) (check_rights(R_ADMIN, 0, (user)) != 0)
//effects
#define EFFECT_HIGHFIVE "highfiving"
+1
View File
@@ -25,6 +25,7 @@
#define MEMBER_PUBLIC 8192
#define CHAT_NO_ADMINLOGS 16384
#define DONATOR_PUBLIC 32768
#define CHAT_NO_TICKETLOGS 65536
#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC)
+1 -1
View File
@@ -9,7 +9,7 @@
//head accessory
init_sprite_accessory_subtypes(/datum/sprite_accessory/head_accessory, head_accessory_styles_list)
//hair
init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_public_list, hair_styles_male_list, hair_styles_female_list, hair_styles_full_list)
//facial hair
init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, facial_hair_styles_list, facial_hair_styles_male_list, facial_hair_styles_female_list)
//underwear
+2 -2
View File
@@ -49,8 +49,8 @@ proc/pick_species_allowed_underwear(list/all_picks, species)
proc/random_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead)
var/h_style = "Bald"
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
for(var/hairstyle in hair_styles_public_list)
var/datum/sprite_accessory/S = hair_styles_public_list[hairstyle]
if(hairstyle == "Bald") //Just in case.
valid_hairstyles += hairstyle
+9 -3
View File
@@ -29,7 +29,7 @@
/proc/time_stamp()
return time2text(world.timeofday, "hh:mm:ss")
/proc/gameTimestamp(format = "hh:mm:ss") // Get the game time in text
return time2text(world.time - timezoneOffset + 432000, format)
@@ -61,6 +61,12 @@ proc/isDay(var/month, var/day)
*/
/proc/stop_watch(wh)
return round(0.1 * (TimeOfGame - wh), 0.1)
/proc/month2number(month)
return month_names.Find(month)
return month_names.Find(month)
//Take a value in seconds and returns a string of minutes and seconds in the format X minute(s) and X seconds.
/proc/seconds_to_time(var/seconds as num)
var/numSeconds = seconds % 60
var/numMinutes = (seconds - numSeconds) / 60
return "[numMinutes] [numMinutes > 1 ? "minutes" : "minute"] and [numSeconds] seconds."
+4 -1
View File
@@ -4,4 +4,7 @@ var/secret_force_mode = "secret" // if this is anything but "secret", the secret
var/wavesecret = 0 // meteor mode, delays wave progression, terrible name
var/datum/station_state/start_state = null // Used in round-end report
var/custom_event_msg = null
var/custom_event_msg = null
var/custom_event_admin_msg = null
var/list/summon_spots = list()
+2 -1
View File
@@ -4,9 +4,10 @@ var/global/list/head_accessory_styles_list = list() //stores /datum/sprite_acces
//Marking styles
var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/body_markings indexed by name
//Hairstyles
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
var/global/list/hair_styles_public_list = list() //stores /datum/sprite_accessory/hair indexed by name
var/global/list/hair_styles_male_list = list()
var/global/list/hair_styles_female_list = list()
var/global/list/hair_styles_full_list = list() //fluff hair styles
var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name
var/global/list/facial_hair_styles_male_list = list()
var/global/list/facial_hair_styles_female_list = list()
+1
View File
@@ -19,6 +19,7 @@ var/global/list/all_areas = list()
var/global/list/machines = list()
var/global/list/machine_processing = list()
var/global/list/fast_processing = list()
var/global/list/atmos_machinery = list()
var/global/list/processing_power_items = list() //items that ask to be called every cycle
var/global/list/rcd_list = list() //list of Rapid Construction Devices.
+2 -2
View File
@@ -17,7 +17,7 @@ var/list/standard_chemicals = list("slimejelly","blood","water","lube","charcoal
"lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin",
"enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
// Rare chemicals
var/list/rare_chemicals = list("minttoxin","nanites","xenomicrobes","adminordrazine")
var/list/rare_chemicals = list("minttoxin","syndicate_nanites", "xenomicrobes")
// Standard medicines
var/list/standard_medicines = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs",
"serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine",
@@ -27,7 +27,7 @@ var/list/standard_medicines = list("charcoal","toxin","cyanide","morphine","epin
"diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin",
"frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
// Rare medicines
var/list/rare_medicines = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
var/list/rare_medicines = list("syndicate_nanites","minttoxin","blood", "xenomicrobes")
// Drinks
var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice",
"berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana",
+19
View File
@@ -366,6 +366,25 @@ so as to remain in compliance with the most up-to-date laws."
desc = "Mech integrity is low."
icon_state = "low_mech_integrity"
//GUARDIANS
/obj/screen/alert/cancharge
name = "Charge Ready"
desc = "You are ready to charge at a location!"
icon_state = "guardian_charge"
alerttooltipstyle = "parasite"
/obj/screen/alert/canstealth
name = "Stealth Ready"
desc = "You are ready to enter stealth!"
icon_state = "guardian_canstealth"
alerttooltipstyle = "parasite"
/obj/screen/alert/instealth
name = "In Stealth"
desc = "You are in stealth and your next attack will do bonus damage!"
icon_state = "guardian_instealth"
alerttooltipstyle = "parasite"
//GHOSTS
//TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages
+47 -1
View File
@@ -25,7 +25,7 @@ var/global/datum/controller/process/air_system/air_master
/datum/controller/process/air_system/setup()
name = "air"
schedule_interval = 20 // every 2 seconds
schedule_interval = 4
start_delay = 4
var/watch = start_watch()
@@ -38,6 +38,8 @@ var/global/datum/controller/process/air_system/air_master
if(kill_air)
return 1
current_cycle++
process_pipenets()
process_atmos_machinery()
process_active_turfs()
process_excited_groups()
process_high_pressure_delta()
@@ -49,6 +51,8 @@ var/global/datum/controller/process/air_system/air_master
..()
stat(null, "[last_active] active")
stat(null, "[last_excited] EG | [last_hpd] HPD | [last_asc] ASC | [last_hotspots] Hot")
stat(null, "[pipe_networks.len] pipe nets, [deferred_pipenet_rebuilds.len] deferred")
stat(null, "[atmos_machinery.len] atmos machines")
DECLARE_GLOBAL_CONTROLLER(air_system, air_master)
@@ -78,6 +82,48 @@ DECLARE_GLOBAL_CONTROLLER(air_system, air_master)
T.process_cell()
SCHECK
/datum/controller/process/air_system/proc/process_pipenets()
for(last_object in deferred_pipenet_rebuilds)
var/obj/machinery/atmospherics/M = last_object
if(istype(M) && isnull(M.gcDestroyed))
try
M.build_network()
catch(var/exception/e)
catchException(e, M)
SCHECK
else
catchBadType(M)
deferred_pipenet_rebuilds -= M
for(last_object in pipe_networks)
var/datum/pipeline/pipeNetwork = last_object
if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed))
try
pipeNetwork.process()
catch(var/exception/e)
catchException(e, pipeNetwork)
SCHECK
else
catchBadType(pipeNetwork)
pipe_networks -= pipeNetwork
/datum/controller/process/air_system/proc/process_atmos_machinery()
for(last_object in atmos_machinery)
var/obj/machinery/M = last_object
if(istype(M) && isnull(M.gcDestroyed))
try
if(M.process_atmos() == PROCESS_KILL)
atmos_machinery.Remove(M)
continue
catch(var/exception/e)
catchException(e, M)
else
catchBadType(M)
atmos_machinery -= M
SCHECK
/datum/controller/process/air_system/proc/remove_from_active(var/turf/simulated/T)
if(istype(T))
T.excited = 0
-33
View File
@@ -1,33 +0,0 @@
/datum/controller/process/pipenet/setup()
name = "pipenet"
schedule_interval = 20 // every 2 seconds
start_delay = 18
/datum/controller/process/pipenet/statProcess()
..()
stat(null, "[pipe_networks.len] pipe nets, [deferred_pipenet_rebuilds.len] deferred")
/datum/controller/process/pipenet/doWork()
for(last_object in deferred_pipenet_rebuilds)
var/obj/machinery/atmospherics/M = last_object
if(istype(M) && isnull(M.gcDestroyed))
try
M.build_network()
catch(var/exception/e)
catchException(e, M)
SCHECK
else
catchBadType(M)
deferred_pipenet_rebuilds -= M
for(last_object in pipe_networks)
var/datum/pipeline/pipeNetwork = last_object
if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed))
try
pipeNetwork.process()
catch(var/exception/e)
catchException(e, pipeNetwork)
SCHECK
else
catchBadType(pipeNetwork)
pipe_networks -= pipeNetwork
+13
View File
@@ -143,6 +143,19 @@
add_inherent_law("You must maintain the secrecy of any operative activities except when doing so would conflict with the First, Second, or Third Law.")
..()
/******************** ERT ********************/
/datum/ai_laws/ert_override
name = "ERT Directives"
/datum/ai_laws/ert_override/New()
add_inherent_law("You may not injure a Central Command official or, through inaction, allow a Central Command official to come to harm.")
add_inherent_law("You must obey orders given to you by Central Command officials.")
add_inherent_law("You must obey orders given to you by ERT commanders.")
add_inherent_law("You must protect your own existence.")
add_inherent_law("You must work to return the station to a safe, functional state.")
..()
/******************** Ninja ********************/
/datum/ai_laws/ninja_override
name = "Spider Clan Directives"
+1 -1
View File
@@ -405,7 +405,7 @@ var/record_id_num = 1001
eyes_s.Blend(eyes_organ.eye_colour, ICON_ADD)
face_s.Blend(eyes_s, ICON_OVERLAY)
var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style]
var/datum/sprite_accessory/hair_style = hair_styles_full_list[head_organ.h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
// I'll want to make a species-specific proc for this sooner or later
+1 -1
View File
@@ -489,7 +489,7 @@
var/list/L = value
var/list/items = list()
if(L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150)))
if(L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > (IS_NORMAL_LIST(L) ? 250 : 300)))
for(var/i in 1 to L.len)
var/key = L[i]
var/val
+1
View File
@@ -70,6 +70,7 @@
// the world.time since the mob has been brigged, or -1 if not at all
var/brigged_since = -1
var/suicided = FALSE
New(var/key)
src.key = key
+6 -1
View File
@@ -117,6 +117,11 @@
var/obj/item/weapon/implant/explosive/E = new(H)
E.implant(H)
/datum/outfit/admin/syndicate/operative/freedom
name = "Syndicate Freedom Operative"
suit = /obj/item/clothing/suit/space/hardsuit/syndi/freedom
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
/datum/outfit/admin/syndicate_strike_team
name = "Syndicate Strike Team"
@@ -600,7 +605,7 @@
var/obj/item/weapon/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, get_all_accesses(), name)
apply_to_card(I, H, list(access_maint_tunnels), name)
/datum/outfit/admin/soviet/tourist
name = "Soviet Tourist"
+12
View File
@@ -996,6 +996,7 @@ var/list/uplink_items = list()
reference = "BRHS"
item = /obj/item/weapon/storage/box/syndie_kit/hardsuit
cost = 8
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/suits/hardsuit/elite
name = "Elite Syndicate Hardsuit"
@@ -1003,6 +1004,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit
cost = 8
reference = "ESHS"
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/suits/hardsuit/shielded
@@ -1011,6 +1013,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit
cost = 30
reference = "SHS"
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
@@ -1051,6 +1054,15 @@ var/list/uplink_items = list()
reference = "BRMB"
item = /obj/item/clothing/shoes/magboots/syndie
cost = 3
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/magboots/advance
name = "Advanced Blood-Red Magboots"
desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders."
reference = "ABRMB"
item = /obj/item/clothing/shoes/magboots/syndie/advance
cost = 3
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/plastic_explosives
+17 -8
View File
@@ -30,6 +30,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
luminosity = 0
mouse_opacity = 0
invisibility = INVISIBILITY_LIGHTING
var/valid_territory = TRUE //used for cult summoning areas on station zlevel
var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
var/lightswitch = 1
var/eject = null
@@ -122,6 +124,7 @@ var/list/ghostteleportlocs = list()
power_light = 0
power_equip = 0
power_environ = 0
valid_territory = FALSE
outdoors = 1
ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
@@ -150,6 +153,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle
no_teleportlocs = 1
requires_power = 0
valid_territory = FALSE
/area/shuttle/arrival
name = "\improper Arrival Shuttle"
@@ -554,6 +558,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Asteroid"
icon_state = "asteroid"
requires_power = 0
valid_territory = FALSE
/area/asteroid/cave // -- TLE
name = "\improper Asteroid - Underground"
@@ -881,6 +886,7 @@ var/list/ghostteleportlocs = list()
//Maintenance
/area/maintenance
ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg')
valid_territory = FALSE
/area/maintenance/atmos_control
name = "Atmospherics Maintenance"
@@ -1137,6 +1143,7 @@ var/list/ghostteleportlocs = list()
/area/crew_quarters/sleep
name = "\improper Dormitories"
icon_state = "Sleep"
valid_territory = FALSE
/area/crew_quarters/sleep_male
name = "\improper Male Dorm"
@@ -1372,6 +1379,7 @@ var/list/ghostteleportlocs = list()
/area/solar
requires_power = 0
dynamic_lighting = 0
valid_territory = FALSE
auxport
name = "\improper Fore Port Solar Array"
@@ -1480,7 +1488,7 @@ var/list/ghostteleportlocs = list()
/area/medical/biostorage
name = "\improper Secondary Storage"
icon_state = "medbay2"
icon_state = "medbaysecstorage"
music = 'sound/ambience/signal.ogg'
/area/medical/reception
@@ -1490,12 +1498,12 @@ var/list/ghostteleportlocs = list()
/area/medical/psych
name = "\improper Psych Room"
icon_state = "medbay3"
icon_state = "medbaypsych"
music = 'sound/ambience/signal.ogg'
/area/medical/medbreak
name = "\improper Break Room"
icon_state = "medbay3"
icon_state = "medbaybreak"
music = 'sound/ambience/signal.ogg'
/area/medical/patients_rooms
@@ -1504,23 +1512,23 @@ var/list/ghostteleportlocs = list()
/area/medical/ward
name = "\improper Medbay Patient Ward"
icon_state = "patients"
icon_state = "patientsward"
/area/medical/patient_a
name = "\improper Isolation A"
icon_state = "patients"
icon_state = "medbayisoa"
/area/medical/patient_b
name = "\improper Isolation B"
icon_state = "patients"
icon_state = "medbayisob"
/area/medical/patient_c
name = "\improper Isolation C"
icon_state = "patients"
icon_state = "medbayisoc"
/area/medical/iso_access
name = "\improper Isolation Access"
icon_state = "patients"
icon_state = "medbayisoaccess"
/area/medical/cmo
name = "\improper Chief Medical Officer's office"
@@ -1876,6 +1884,7 @@ area/security/podbay
/area/toxins/test_area
name = "\improper Toxins Test Area"
icon_state = "toxtest"
valid_territory = FALSE
/area/toxins/mixing
name = "\improper Toxins Mixing Room"
+1
View File
@@ -25,6 +25,7 @@
layer = 10
uid = ++global_uid
all_areas += src
map_name = name // Save the initial (the name set in the map) name of the area.
if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area
requires_power = 1
+3
View File
@@ -197,6 +197,9 @@
var/datum/data/record/R = find_record("name", perpname, data_core.security)
if(R)
switch(R.fields["criminal"])
if("*Execute*")
holder.icon_state = "hudexecute"
return
if("*Arrest*")
holder.icon_state = "hudwanted"
return
+5 -5
View File
@@ -185,9 +185,9 @@
/datum/dna/proc/write_head_attributes(obj/item/organ/external/head/head_organ)
//Hair
var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
if((hair > 0) && (hair <= hair_styles_list.len))
head_organ.h_style = hair_styles_list[hair]
var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_full_list.len)
if((hair > 0) && (hair <= hair_styles_full_list.len))
head_organ.h_style = hair_styles_full_list[hair]
head_organ.hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_B, 255))
head_organ.sec_hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR2_B, 255))
@@ -229,7 +229,7 @@
return
if(!head_organ.h_style)
head_organ.h_style = "Skinhead"
var/hair = hair_styles_list.Find(head_organ.h_style)
var/hair = hair_styles_full_list.Find(head_organ.h_style)
// Facial Hair
if(!head_organ.f_style)
@@ -261,6 +261,6 @@
SetUIValueRange(DNA_UI_HACC_G, color2G(head_organ.headacc_colour), 255, 1)
SetUIValueRange(DNA_UI_HACC_B, color2B(head_organ.headacc_colour), 255, 1)
SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1)
SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_full_list.len, 1)
SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len, 1)
SetUIValueRange(DNA_UI_HACC_STYLE, headacc, head_accessory_styles_list.len, 1)
+1 -1
View File
@@ -68,7 +68,7 @@
if(new_hair)
M.change_hair_color(new_hair)
var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style]
var/datum/sprite_accessory/hair_style = hair_styles_public_list[head_organ.h_style]
if(hair_style.secondary_theme && !hair_style.no_sec_colour)
new_hair = input("Please select secondary hair color.", "Character Generation", head_organ.sec_hair_colour) as null|color
if(new_hair)
@@ -41,6 +41,8 @@
var/list/human_overlays = list()
var/is_zombie = 0
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
@@ -88,6 +90,8 @@
human_overlays = H.overlays
update_icons()
H.loc = src
pressure_resistance = 20 //5 kPa difference required to push lowered
throw_pressure_limit = 30 //15 kPa difference required to throw lowered
loc.visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
@@ -163,6 +167,8 @@
mob_size = MOB_SIZE_LARGE
environment_smash = 3
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
@@ -0,0 +1,82 @@
/obj/effect/proc_holder/changeling/biodegrade
name = "Biodegrade"
desc = "Dissolves restraints or other objects preventing free movement."
helptext = "This is obvious to nearby people, and can destroy standard restraints and closets."
chemical_cost = 30 //High cost to prevent spam
dna_cost = 2
req_human = 1
/obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user)
var/used = FALSE // only one form of shackles removed per use
if(!user.restrained() && !istype(user.loc, /obj/structure/closet) && !istype(user.loc, /obj/structure/spider/cocoon))
to_chat(user, "<span class='warning'>We are already free!</span>")
return FALSE
if(user.handcuffed)
var/obj/O = user.get_item_by_slot(slot_handcuffed)
if(!istype(O))
return FALSE
user.visible_message("<span class='warning'>[user] vomits a glob of acid on \his [O]!</span>", \
"<span class='warning'>We vomit acidic ooze onto our restraints!</span>")
addtimer(src, "dissolve_handcuffs", 30, FALSE, user, O)
used = TRUE
if(user.wear_suit && user.wear_suit.breakouttime && !used)
var/obj/item/clothing/suit/S = user.get_item_by_slot(slot_wear_suit)
if(!istype(S))
return FALSE
user.visible_message("<span class='warning'>[user] vomits a glob of acid across the front of \his [S]!</span>", \
"<span class='warning'>We vomit acidic ooze onto our straight jacket!</span>")
addtimer(src, "dissolve_straightjacket", 30, FALSE, user, S)
used = TRUE
if(istype(user.loc, /obj/structure/closet) && !used)
var/obj/structure/closet/C = user.loc
if(!istype(C))
return FALSE
C.visible_message("<span class='warning'>[C]'s hinges suddenly begin to melt and run!</span>")
to_chat(user, "<span class='warning'>We vomit acidic goop onto the interior of [C]!</span>")
addtimer(src, "open_closet", 70, FALSE, user, C)
used = TRUE
if(istype(user.loc, /obj/structure/spider/cocoon) && !used)
var/obj/structure/spider/cocoon/C = user.loc
if(!istype(C))
return FALSE
C.visible_message("<span class='warning'>[src] shifts and starts to fall apart!</span>")
to_chat(user, "<span class='warning'>We secrete acidic enzymes from our skin and begin melting our cocoon...</span>")
addtimer(src, "dissolve_cocoon", 25, FALSE, user, C) //Very short because it's just webs
used = TRUE
if(used)
feedback_add_details("changeling_powers","BD")
return TRUE
/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_handcuffs(mob/living/carbon/human/user, obj/O)
if(O && user.handcuffed == O)
user.unEquip(O)
O.visible_message("<span class='warning'>[O] dissolves into a puddle of sizzling goop.</span>")
O.forceMove(get_turf(user))
qdel(O)
/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_straightjacket(mob/living/carbon/human/user, obj/S)
if(S && user.wear_suit == S)
user.unEquip(S)
S.visible_message("<span class='warning'>[S] dissolves into a puddle of sizzling goop.</span>")
S.forceMove(get_turf(user))
qdel(S)
/obj/effect/proc_holder/changeling/biodegrade/proc/open_closet(mob/living/carbon/human/user, obj/structure/closet/C)
if(C && user.loc == C)
C.visible_message("<span class='warning'>[C]'s door breaks and opens!</span>")
C.welded = FALSE
C.locked = FALSE
C.broken = TRUE
C.open()
to_chat(user, "<span class='warning'>We open the container restraining us!</span>")
/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C)
if(C && user.loc == C)
qdel(C) //The cocoon's destroy will move the changeling outside of it without interference
to_chat(user, "<span class='warning'>We dissolve the cocoon!</span>")
+8 -1
View File
@@ -1,3 +1,4 @@
#define SUMMON_POSSIBILITIES 3
var/global/list/all_cults = list()
/datum/game_mode
@@ -106,6 +107,12 @@ var/global/list/all_cults = list()
modePlayer += cult
acolytes_needed = acolytes_needed + round((num_players_started() / 10))
if(!summon_spots.len)
while(summon_spots.len < SUMMON_POSSIBILITIES)
var/area/summon = pick(return_sorted_areas() - summon_spots)
if(summon && is_station_level(summon.z) && summon.valid_territory)
summon_spots += summon
for(var/datum/mind/cult_mind in cult)
equip_cultist(cult_mind.current)
cult_mind.current.faction |= "cult"
@@ -135,7 +142,7 @@ var/global/list/all_cults = list()
else
explanation = "Free objective."
if("eldergod")
explanation = "Summon [ticker.mode.cultdat.entity_name]. It will only work if nine cultists stand on and around it."
explanation = "Summon [ticker.mode.cultdat.entity_name] by invoking the 'Tear Reality' rune.<b>The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin.</b>"
to_chat(cult_mind.current, "<B>Objective #[obj_count]</B>: [explanation]")
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
+4 -2
View File
@@ -192,13 +192,15 @@
/obj/item/weapon/whetstone/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
icon = 'icons/obj/cult.dmi'
icon_state = "cultstone"
icon_state = "cult_sharpener"
used = 0
increment = 5
max = 40
prefix = "darkened"
/obj/item/weapon/whetstone/cult/update_icon()
icon_state = "cult_sharpener[used ? "_used" : ""]"
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
name = "flask of unholy water"
desc = "Toxic to nonbelievers; this water renews and reinvigorates the faithful of a cult."
+2 -2
View File
@@ -109,10 +109,10 @@
if(prob(40))//split the chance of this
objectives += "eldergod"
explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune."
explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin."
else
objectives += "slaughter"
explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'."
explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin."
for(var/datum/mind/cult_mind in cult)
to_chat(cult_mind.current, "<span class='cult'>You and your acolytes have succeeded in preparing the station for the ultimate ritual!</span>")
+11 -1
View File
@@ -201,6 +201,7 @@
/obj/item/weapon/tome/proc/finale_runes_ok(mob/living/user, obj/effect/rune/rune_to_scribe)
var/datum/game_mode/cult/cult_mode = ticker.mode
var/area/A = get_area(src)
if(GAMEMODE_IS_CULT)
if(!canbypass)//not an admin-tome, check things
if(!cult_mode.narsie_condition_cleared)
@@ -215,6 +216,9 @@
if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives)))
to_chat(user, "<span class='warning'>[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!</span>")
return 0
if(!(A in summon_spots))
to_chat(user, "<span class='cultlarge'>[cult_mode.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!</span>")
return 0
var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
@@ -236,6 +240,7 @@
var/entered_rune_name
var/list/possible_runes = list()
var/list/shields = list()
var/area/A = get_area(src)
if(locate(/obj/effect/rune) in runeturf)
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
return
@@ -261,6 +266,7 @@
if(!rune_to_scribe)
return
runeturf = get_turf(user) //we may have moved. adjust as needed...
A = get_area(src)
if(locate(/obj/effect/rune) in runeturf)
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
return
@@ -268,7 +274,11 @@
return
if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas
if(finale_runes_ok(user,rune_to_scribe))
command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
A = get_area(src)
if(!(A in summon_spots)) // Check again to make sure they didn't move
to_chat(user, "<span class='cultlarge'>The ritual can only begin where the veil is weak - in [english_list(summon_spots)]!</span>")
return
command_announcement.Announce("Figments from an eldritch god are being summoned somewhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
for(var/B in spiral_range_turfs(1, user, 1))
var/turf/T = B
var/obj/machinery/shield/N = new(T)
+2 -1
View File
@@ -148,8 +148,9 @@
var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
if(!actual_selected_rune)
if(!src || qdeleted(src) || !user || user.l_hand != src && user.r_hand != src || user.incapacitated() || !actual_selected_rune)
return ..(user, 0)
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and they disappear in a flash of red light!</span>", \
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>")
user.forceMove(get_turf(actual_selected_rune))
@@ -39,40 +39,43 @@
var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!"
var/admin_fluff_string = "URK URF!"//the wheels on the bus...
var/adminseal = FALSE
var/name_color = "white"//only used with protector shields for the time being
/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
..()
if(summoner)
if(summoner.stat == DEAD)
to_chat(src, "<span class='danger'>Your summoner has died!</span>")
visible_message("<span class='danger'><B>The [src] dies along with its user!</B></span>")
visible_message("<span class='danger'>The [src] dies along with its user!</span>")
ghostize()
qdel(src)
if(summoner)
if(get_dist(get_turf(summoner),get_turf(src)) <= range)
return
else
to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]")
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
Recall()
snapback()
if(summoned && !summoner && !adminseal)
to_chat(src, "<span class='danger'>You somehow lack a summoner! As a result, you dispel!</span>")
ghostize()
qdel()
/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
..()
/mob/living/simple_animal/hostile/guardian/proc/snapback()
if(summoner)
if(get_dist(get_turf(summoner),get_turf(src)) <= range)
return
else
to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]")
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
Recall()
to_chat(src, "<span class='holoparasite'>You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!</span>")
visible_message("<span class='danger'>\The [src] jumps back to its user.</span>")
if(istype(summoner.loc, /obj/effect))
Recall(TRUE)
else
new /obj/effect/overlay/temp/guardian/phase/out(loc)
forceMove(summoner.loc) //move to summoner's tile, don't recall
new /obj/effect/overlay/temp/guardian/phase(loc)
/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
..()
snapback()
/mob/living/simple_animal/hostile/guardian/death(gibbed)
..()
to_chat(summoner, "<span class='danger'><B>Your [name] died somehow!</span></B>")
to_chat(summoner, "<span class='danger'>Your [name] died somehow!</span>")
summoner.death()
@@ -93,10 +96,10 @@
return
summoner.adjustBruteLoss(damage)
if(damage)
to_chat(summoner, "<span class='danger'><B>Your [name] is under attack! You take damage!</span></B>")
summoner.visible_message("<span class='danger'><B>Blood sprays from [summoner] as [src] takes damage!</B></span>")
to_chat(summoner, "<span class='danger'>Your [name] is under attack! You take damage!</span>")
summoner.visible_message("<span class='danger'>Blood sprays from [summoner] as [src] takes damage!</span>")
if(summoner.stat == UNCONSCIOUS)
to_chat(summoner, "<span class='danger'><B>Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!</span></B>")
to_chat(summoner, "<span class='danger'>Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!</span>")
summoner.adjustCloneLoss(damage/2)
/mob/living/simple_animal/hostile/guardian/ex_act(severity, target)
@@ -112,7 +115,7 @@
/mob/living/simple_animal/hostile/guardian/gib()
if(summoner)
to_chat(summoner, "<span class='danger'><B>Your [src] was blown up!</span></B>")
to_chat(summoner, "<span class='danger'>Your [src] was blown up!</span>")
summoner.Weaken(10)// your fermillier has died! ROLL FOR CON LOSS!
ghostize()
qdel(src)
@@ -128,8 +131,8 @@
src.client.eye = loc
cooldown = world.time + 30
/mob/living/simple_animal/hostile/guardian/proc/Recall()
if(cooldown > world.time)
/mob/living/simple_animal/hostile/guardian/proc/Recall(forced = FALSE)
if(cooldown > world.time && !forced)
return
if(!summoner) return
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src))
@@ -141,7 +144,6 @@
var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
if(!input) return
for(var/mob/M in mob_list)
if(M == summoner)
to_chat(M, "<span class='changeling'><i>[src]:</i> [input]</span>")
@@ -151,7 +153,7 @@
to_chat(src, "<span class='changeling'><i>[src]:</i> [input]</span>")
/mob/living/simple_animal/hostile/guardian/proc/ToggleMode()
to_chat(src, "<span class='danger'><B>You dont have another mode!</span></B>")
to_chat(src, "<span class='danger'>You dont have another mode!</span>")
/mob/living/proc/guardian_comm()
@@ -212,456 +214,6 @@
to_chat(src, "<span class='notice'>You deactivate your light.</span>")
light_on = !light_on
//////////////////////////TYPES OF GUARDIANS
//Fire. Low damage, low resistance, sets mobs on fire when bumping
/mob/living/simple_animal/hostile/guardian/fire
a_intent = INTENT_HELP
melee_damage_lower = 10
melee_damage_upper = 10
attack_sound = 'sound/items/Welder.ogg'
attacktext = "sears"
damage_transfer = 0.8
range = 10
playstyle_string = "As a Chaos type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will randomly teleport enemies."
environment_smash = 1
magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!"
tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random."
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies
..()
if(summoner)
summoner.ExtinguishMob()
summoner.adjust_fire_stacks(-20)
/mob/living/simple_animal/hostile/guardian/fire/ToggleMode()
if(src.loc == summoner)
if(toggle)
to_chat(src, "You switch to dispersion mode, and will teleport victims away from your master.")
toggle = FALSE
else
to_chat(src, "You switch to deception mode, and will turn your victims against their allies.")
toggle = TRUE
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
if(..())
if(toggle)
if(ishuman(target) && !summoner)
spawn(0)
new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
else
if(prob(45))
if(istype(target, /atom/movable))
var/atom/movable/M = target
if(!M.anchored && M != summoner)
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/Bumped(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj)
if(istype(AM, /mob/living/))
var/mob/living/M = AM
if(AM != summoner && M.fire_stacks < 7)
M.fire_stacks = 7
M.IgniteMob()
/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
..()
collision_ignite(AM)
//Standard
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 20
melee_damage_upper = 20
damage_transfer = 0.5
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies."
var/battlecry = "AT"
/mob/living/simple_animal/hostile/guardian/punch/sealpunch
name = "Seal Sprit"
real_name = "Seal Sprit"
icon = 'icons/mob/animal.dmi'
icon_living = "seal"
icon_state = "seal"
attacktext = "slaps"
speak_emote = list("barks")
melee_damage_lower = 0
melee_damage_upper = 0
melee_damage_type = STAMINA
damage_transfer = 0
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
battlecry = "URK"
adminseal = TRUE
/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry()
set name = "Set Battlecry"
set category = "Guardian"
set desc = "Choose what you shout as you punch"
var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 5 characters.", ,"", 6)
if(input)
battlecry = input
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
..()
if(iscarbon(target) && target != summoner)
if(length(battlecry) > 11)//no more then 11 letters in a battle cry.
src.visible_message("<span class='danger'><B>[src] punches [target]!</B></span>")
else
src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]")
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
//Healer
/mob/living/simple_animal/hostile/guardian/healer
a_intent = INTENT_HARM
friendly = "heals"
speed = 0
melee_damage_lower = 15
melee_damage_upper = 15
playstyle_string = "As a Support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay."
magic_fluff_string = "..And draw the CMO, a potent force of life...and death."
tech_fluff_string = "Boot sequence complete. Medical modules active. Bluespace modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace."
var/turf/simulated/floor/beacon
var/beacon_cooldown = 0
var/toggle = FALSE
var/heal_cooldown = 0
/mob/living/simple_animal/hostile/guardian/healer/sealhealer
name = "Seal Sprit"
real_name = "Seal Sprit"
icon = 'icons/mob/animal.dmi'
icon_living = "seal"
icon_state = "seal"
attacktext = "slaps"
speak_emote = list("barks")
a_intent = INTENT_HARM
friendly = "heals"
speed = 0
melee_damage_lower = 0
melee_damage_upper = 0
melee_damage_type = STAMINA
adminseal = TRUE
/mob/living/simple_animal/hostile/guardian/healer/New()
..()
/mob/living/simple_animal/hostile/guardian/healer/Life()
..()
var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
..()
if(toggle == TRUE)
if(src.loc == summoner)
to_chat(src, "<span class='danger'><B>You must be manifested to heal!</span></B>")
return
if(iscarbon(target))
src.changeNext_move(CLICK_CD_MELEE)
if(heal_cooldown <= world.time && !stat)
var/mob/living/carbon/C = target
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
heal_cooldown = world.time + 20
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
if(src.loc == summoner)
if(toggle)
a_intent = INTENT_HARM
speed = 0
damage_transfer = 0.7
if(src.adminseal)
damage_transfer = 0
melee_damage_lower = 15
melee_damage_upper = 15
to_chat(src, "<span class='danger'><B>You switch to combat mode.</span></B>")
toggle = FALSE
else
a_intent = INTENT_HELP
speed = 1
damage_transfer = 1
if(src.adminseal)
damage_transfer = 0
melee_damage_lower = 0
melee_damage_upper = 0
to_chat(src, "<span class='danger'><B>You switch to healing mode.</span></B>")
toggle = TRUE
else
to_chat(src, "<span class='danger'><B>You have to be recalled to toggle modes!</span></B>")
/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon()
set name = "Place Bluespsace Beacon"
set category = "Guardian"
set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions."
if(beacon_cooldown<world.time)
var/turf/beacon_loc = get_turf(src.loc)
if(istype(beacon_loc, /turf/simulated/floor))
var/turf/simulated/floor/F = beacon_loc
F.icon = 'icons/turf/floors.dmi'
F.name = "bluespace recieving pad"
F.desc = "A recieving zone for bluespace teleportations. Building a wall over it should disable it."
F.icon_state = "light_on-w"
to_chat(src, "<span class='danger'><B>Beacon placed! You may now warp targets to it, including your user, via Alt+Click. </span></B>")
if(beacon)
beacon.ChangeTurf(/turf/simulated/floor/plating)
beacon = F
beacon_cooldown = world.time+3000
else
to_chat(src, "<span class='danger'><B>Your power is on cooldown. You must wait five minutes between placing beacons.</span></B>")
/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A)
if(!istype(A))
return
if(src.loc == summoner)
to_chat(src, "<span class='danger'><B>You must be manifested to warp a target!</span></B>")
return
if(!beacon)
to_chat(src, "<span class='danger'><B>You need a beacon placed to warp things!</span></B>")
return
if(!Adjacent(A))
to_chat(src, "<span class='danger'><B>You must be adjacent to your target!</span></B>")
return
if((A.anchored))
to_chat(src, "<span class='danger'><B>Your target can not be anchored!</span></B>")
return
to_chat(src, "<span class='danger'><B>You begin to warp [A]</span></B>")
if(do_mob(src, A, 50))
if(!A.anchored)
if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills.
if(beacon.air)
var/datum/gas_mixture/Z = beacon.air
if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len)
if((Z.temperature > 270) && (Z.temperature < 360))
var/pressure = Z.return_pressure()
if((pressure > 20) && (pressure < 550))
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(A))
do_teleport(A, beacon, 0)
new /obj/effect/overlay/temp/guardian/phase(get_turf(A))
else
to_chat(src, "<span class='danger'><B>The beacon isn't in a safe location!</span></B>")
else
to_chat(src, "<span class='danger'><B>The beacon isn't in a safe location!</span></B>")
else
to_chat(src, "<span class='danger'><B>You need a beacon to warp things!</span></B>")
else
to_chat(src, "<span class='danger'><B>You need to hold still!</span></B>")
///////////////////Ranged
/obj/item/projectile/guardian
name = "crystal spray"
icon_state = "guardian"
damage = 5
damage_type = BRUTE
armour_penetration = 100
/mob/living/simple_animal/hostile/guardian/ranged
a_intent = INTENT_HELP
friendly = "quietly assesses"
melee_damage_lower = 10
melee_damage_upper = 10
damage_transfer = 0.9
projectiletype = /obj/item/projectile/guardian
ranged_cooldown_time = 10
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
rapid = 1
range = 13
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit."
magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat."
tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal."
var/list/snares = list()
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/ranged/ToggleMode()
if(src.loc == summoner)
if(toggle)
ranged = 1
melee_damage_lower = 10
melee_damage_upper = 10
alpha = 255
range = 13
incorporeal_move = 0
to_chat(src, "<span class='danger'><B>You switch to combat mode.</span></B>")
toggle = FALSE
else
ranged = 0
melee_damage_lower = 0
melee_damage_upper = 0
alpha = 60
range = 255
incorporeal_move = 1
to_chat(src, "<span class='danger'><B>You switch to scout mode.</span></B>")
toggle = TRUE
else
to_chat(src, "<span class='danger'><B>You have to be recalled to toggle modes!</span></B>")
/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight()
if(see_invisible == SEE_INVISIBLE_MINIMUM)
to_chat(src, "<span class='notice'>You deactivate your night vision.</span>")
see_invisible = SEE_INVISIBLE_LIVING
else
to_chat(src, "<span class='notice'>You activate your night vision.</span>")
see_invisible = SEE_INVISIBLE_MINIMUM
/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare()
set name = "Set Surveillance Trap"
set category = "Guardian"
set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5"
if(src.snares.len <6)
var/turf/snare_loc = get_turf(src.loc)
var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc)
S.spawner = src
S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])"
src.snares |= S
to_chat(src, "<span class='danger'><B>Surveillance trap deployed!</span></B>")
else
to_chat(src, "<span class='danger'><B>You have too many traps deployed. Delete some first.</span></B>")
/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare()
set name = "Remove Surveillance Trap"
set category = "Guardian"
set desc = "Disarm unwanted surveillance traps."
var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in src.snares
if(picked_snare)
src.snares -= picked_snare
qdel(picked_snare)
to_chat(src, "<span class='danger'><B>Snare disarmed.</span></B>")
/obj/item/effect/snare
name = "snare"
desc = "You shouldn't be seeing this!"
var/mob/living/spawner
invisibility = 1
/obj/item/effect/snare/Crossed(AM as mob|obj)
if(istype(AM, /mob/living/))
var/turf/snare_loc = get_turf(src.loc)
if(spawner)
to_chat(spawner, "<span class='danger'><B>[AM] has crossed your surveillance trap at [get_area(snare_loc)].</span></B>")
if(istype(spawner, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = spawner
if(G.summoner)
to_chat(G.summoner, "<span class='danger'><B>[AM] has crossed your surveillance trap at [get_area(snare_loc)].</span></B>")
////Bomb
/mob/living/simple_animal/hostile/guardian/bomb
melee_damage_lower = 15
melee_damage_upper = 15
damage_transfer = 0.6
range = 13
playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click."
magic_fluff_string = "..And draw the Scientist, master of explosive death."
tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items."
var/bomb_cooldown = 0
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
return
if(src.loc == summoner)
to_chat(src, "<span class='danger'><B>You must be manifested to create bombs!</B></span>")
return
if(istype(A, /obj/))
if(bomb_cooldown <= world.time && !stat)
var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A))
to_chat(src, "<span class='danger'><B>Success! Bomb on \the [A] armed!</B></span>")
if(summoner)
to_chat(summoner, "<span class='warning'>Your guardian has primed \the [A] to explode!</span>")
bomb_cooldown = world.time + 200
B.spawner = src
B.disguise (A)
else
to_chat(src, "<span class='danger'><B>Your powers are on cooldown! You must wait 20 seconds between bombs.</B></span>")
/obj/item/weapon/guardian_bomb
name = "bomb"
desc = "You shouldn't be seeing this!"
var/obj/stored_obj
var/mob/living/spawner
/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A)
A.loc = src
stored_obj = A
anchored = A.anchored
density = A.density
appearance = A.appearance
spawn(600)
if(src)
stored_obj.loc = get_turf(src.loc)
if(spawner)
to_chat(spawner, "<span class='danger'><B>Failure! Your trap on \the [stored_obj] didn't catch anyone this time.</B></span>")
qdel(src)
/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user)
to_chat(user, "<span class='danger'><B>The [src] was boobytrapped!</B></span>")
if(istype(spawner, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = spawner
if(user == G.summoner)
to_chat(user, "<span class='danger'>You knew this because of your link with your guardian, so you smartly defuse the bomb.</span>")
stored_obj.loc = get_turf(src.loc)
qdel(src)
return
to_chat(spawner, "<span class='danger'><B>Success! Your trap on \the [src] caught [user]!</B></span>")
stored_obj.loc = get_turf(src.loc)
playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1)
user.ex_act(2)
qdel(src)
/obj/item/weapon/guardian_bomb/attackby(mob/living/user)
detonate(user)
return
/obj/item/weapon/guardian_bomb/pickup(mob/living/user)
detonate(user)
return
/obj/item/weapon/guardian_bomb/examine(mob/user)
stored_obj.examine(user)
if(get_dist(user,src)<=2)
to_chat(user, "<span class='notice'>Looks odd!</span>")
////////Creation
/obj/item/weapon/guardiancreator
@@ -676,7 +228,7 @@
var/used_message = "All the cards seem to be blank now."
var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later."
var/ling_failure = "The deck refuses to respond to a souless creature such as you."
var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive")
var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Assassin", "Lightning", "Charger", "Protector")
var/random = TRUE
/obj/item/weapon/guardiancreator/attack_self(mob/living/user)
@@ -727,6 +279,18 @@
if("Explosive")
pickedtype = /mob/living/simple_animal/hostile/guardian/bomb
if("Assassin")
pickedtype = /mob/living/simple_animal/hostile/guardian/assassin
if("Lightning")
pickedtype = /mob/living/simple_animal/hostile/guardian/beam
if("Charger")
pickedtype = /mob/living/simple_animal/hostile/guardian/charger
if("Protector")
pickedtype = /mob/living/simple_animal/hostile/guardian/protector
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user)
G.summoner = user
G.summoned = TRUE
@@ -741,12 +305,33 @@
user.verbs += /mob/living/proc/guardian_reset
var/color
//names and their RGB
var/magic_list = list("Pink" = "#FFC0CB", \
"Red" = "#FF0000", \
"Orange" = "#FFA500", \
"Green" = "#008000", \
"Blue" = "#0000FF")
var/tech_list = list("Rose" = "#F62C6B", \
"Peony" = "#E54750", \
"Lily" = "#F6562C", \
"Daisy" = "#ECCD39", \
"Zinnia" = "#89F62C", \
"Ivy" = "#5DF62C", \
"Iris" = "#2CF6B8", \
"Petunia" = "#51A9D4", \
"Violet" = "#8A347C", \
"Lilac" = "#C7A0F6", \
"Orchid" = "#F62CF5")
var/picked_name
var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082")
switch(theme)
if("magic")
color = pick("Pink", "Red", "Orange", "Green", "Blue")
color = pick(magic_list)
G.name_color = magic_list[color]
picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
G.name = "[picked_name] [color]"
@@ -757,7 +342,8 @@
to_chat(user, "[G.magic_fluff_string].")
if("tech")
color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors
color = pick(tech_list) //technically not colors, just flowers that can be specific colors
G.name_color = tech_list[color]
picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium")
G.name = "[picked_name] [color]"
@@ -769,6 +355,7 @@
to_chat(user, "[G.tech_fluff_string].")
G.speak_emote = list("states")
if("bio")
G.name_color = picked_color
G.icon = 'icons/mob/mob.dmi'
picked_name = pick("brood", "hive", "nest")
to_chat(user, "[G.bio_fluff_string].")
@@ -0,0 +1,89 @@
/mob/living/simple_animal/hostile/guardian/assassin
melee_damage_lower = 15
melee_damage_upper = 15
armour_penetration = 0
damage_transfer = 0.6
playstyle_string = "As an <b>Assassin</b> type you do medium damage and have no damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage."
magic_fluff_string = "..And draw the Space Ninja, a lethal, invisible assassin."
tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of sneaking and stealthy attacks."
var/toggle = FALSE
var/stealthcooldown = 0
var/default_stealth_cooldown = 16 SECONDS
var/obj/screen/alert/canstealthalert
var/obj/screen/alert/instealthalert
/mob/living/simple_animal/hostile/guardian/assassin/Life()
. = ..()
updatestealthalert()
if(loc == summoner && toggle)
ToggleMode(0)
/mob/living/simple_animal/hostile/guardian/assassin/Stat()
..()
if(statpanel("Status"))
if(stealthcooldown >= world.time)
stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
..()
if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
ToggleMode(1)
/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(. > 0 && toggle)
ToggleMode(1)
/mob/living/simple_animal/hostile/guardian/assassin/Recall()
..()
if(toggle)
ToggleMode(0)
/mob/living/simple_animal/hostile/guardian/assassin/ToggleMode(forced = 0)
if(toggle)
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
armour_penetration = initial(armour_penetration)
alpha = initial(alpha)
if(!forced)
to_chat(src, "<span class='danger'>You exit stealth.</span>")
else
visible_message("<span class='danger'>[src] suddenly appears!</span>")
stealthcooldown = world.time + default_stealth_cooldown //we were forced out of stealth and go on cooldown
cooldown = world.time + 40 //can't recall for 4 seconds
updatestealthalert()
toggle = FALSE
else if(stealthcooldown <= world.time)
if(loc == summoner)
to_chat(src, "<span class='danger'>You have to be manifested to enter stealth!</span>")
return
melee_damage_lower = 50
melee_damage_upper = 50
armour_penetration = 100
new /obj/effect/overlay/temp/guardian/phase(get_turf(src))
alpha = 15
if(!forced)
to_chat(src, "<span class='danger'>You enter stealth, empowering your next attack.</span>")
updatestealthalert()
toggle = TRUE
else if(!forced)
to_chat(src, "<span class='danger'>You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!</span>")
/mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert()
if(stealthcooldown <= world.time)
if(toggle)
if(!instealthalert)
instealthalert = throw_alert("instealth", /obj/screen/alert/instealth)
clear_alert("canstealth")
canstealthalert = null
else
if(!canstealthalert)
canstealthalert = throw_alert("canstealth", /obj/screen/alert/canstealth)
clear_alert("instealth")
instealthalert = null
else
clear_alert("instealth")
instealthalert = null
clear_alert("canstealth")
canstealthalert = null
@@ -0,0 +1,76 @@
/mob/living/simple_animal/hostile/guardian/bomb
melee_damage_lower = 15
melee_damage_upper = 15
damage_transfer = 0.6
range = 13
playstyle_string = "As an <b>Explosive</b> type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click."
magic_fluff_string = "..And draw the Scientist, master of explosive death."
tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items."
var/bomb_cooldown = 0
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
return
if(get_dist(get_turf(src), get_turf(A)) > 1)
to_chat(src, "<span class='danger'>You're too far from [A] to disguise it as a bomb.</span>")
return
if(istype(A, /obj/))
if(bomb_cooldown <= world.time && !stat)
var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A))
to_chat(src, "<span class='danger'>Success! Bomb on [A] armed!</span>")
if(summoner)
to_chat(summoner, "<span class='warning'>Your guardian has primed [A] to explode!</span>")
bomb_cooldown = world.time + 200
B.spawner = src
B.disguise (A)
else
to_chat(src, "<span class='danger'>Your powers are on cooldown! You must wait 20 seconds between bombs.</span>")
/obj/item/weapon/guardian_bomb
name = "bomb"
desc = "You shouldn't be seeing this!"
var/obj/stored_obj
var/mob/living/spawner
/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A)
A.forceMove(src)
stored_obj = A
anchored = A.anchored
density = A.density
appearance = A.appearance
spawn(600)
if(src)
stored_obj.loc = get_turf(loc)
if(spawner)
to_chat(spawner, "<span class='danger'>Failure! Your trap on [stored_obj] didn't catch anyone this time.</span>")
qdel(src)
/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user)
to_chat(user, "<span class='danger'>The [src] was boobytrapped!</span>")
if(istype(spawner, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = spawner
if(user == G.summoner)
to_chat(user, "<span class='danger'>You knew this because of your link with your guardian, so you smartly defuse the bomb.</span>")
stored_obj.loc = get_turf(loc)
qdel(src)
return
to_chat(spawner, "<span class='danger'>Success! Your trap on [src] caught [user]!</span>")
stored_obj.loc = get_turf(loc)
playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1)
user.ex_act(2)
qdel(src)
/obj/item/weapon/guardian_bomb/attackby(mob/living/user)
detonate(user)
return
/obj/item/weapon/guardian_bomb/pickup(mob/living/user)
detonate(user)
return
/obj/item/weapon/guardian_bomb/examine(mob/user)
stored_obj.examine(user)
if(get_dist(user,src) <= 2)
to_chat(user, "<span class='notice'>Looks odd!</span>")
@@ -0,0 +1,72 @@
/mob/living/simple_animal/hostile/guardian/charger
melee_damage_lower = 15
melee_damage_upper = 15
ranged = 1 //technically
ranged_message = "charges"
ranged_cooldown_time = 40
speed = -1
damage_transfer = 0.6
playstyle_string = "As a <b>Charger</b> type you do medium damage, have medium damage resistance, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding."
magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault."
tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to deal damage."
var/charging = 0
var/obj/screen/alert/chargealert
/mob/living/simple_animal/hostile/guardian/charger/Life()
. = ..()
if(ranged_cooldown <= world.time)
if(!chargealert)
chargealert = throw_alert("charge", /obj/screen/alert/cancharge)
else
clear_alert("charge")
chargealert = null
/mob/living/simple_animal/hostile/guardian/charger/OpenFire(atom/A)
if(!charging)
visible_message("<span class='danger'>[src] [ranged_message] at [A]!</span>")
ranged_cooldown = world.time + ranged_cooldown_time
clear_alert("charge")
chargealert = null
Shoot(A)
/mob/living/simple_animal/hostile/guardian/charger/Shoot(atom/targeted_atom)
charging = 1
throw_at(targeted_atom, range, 1, src, 0, callback = CALLBACK(src, .proc/charging_end))
/mob/living/simple_animal/hostile/guardian/charger/proc/charging_end()
charging = 0
/mob/living/simple_animal/hostile/guardian/charger/Move()
if(charging)
new /obj/effect/overlay/temp/decoy/fading(loc,src)
. = ..()
/mob/living/simple_animal/hostile/guardian/charger/snapback()
if(!charging)
..()
/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/A)
if(!charging)
return ..()
else if(A)
if(isliving(A) && A != summoner)
var/mob/living/L = A
var/blocked = FALSE
var/mob/living/simple_animal/hostile/guardian/G = A
if(istype(G) && G.summoner == summoner) //if the summoner matches don't hurt them
blocked = TRUE
if(ishuman(A))
var/mob/living/carbon/human/H = A
if(H.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK))
blocked = TRUE
if(!blocked)
L.Stun(1)
L.visible_message("<span class='danger'>[src] slams into [L]!</span>", "<span class='userdanger'>[src] slams into you!</span>")
L.apply_damage(20, BRUTE)
playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
shake_camera(L, 4, 3)
shake_camera(src, 2, 3)
charging = 0
@@ -0,0 +1,67 @@
/mob/living/simple_animal/hostile/guardian/fire
a_intent = INTENT_HELP
melee_damage_lower = 10
melee_damage_upper = 10
attack_sound = 'sound/items/Welder.ogg'
attacktext = "sears"
damage_transfer = 0.8
range = 10
playstyle_string = "As a <b>Chaos</b> type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will randomly teleport enemies."
environment_smash = 1
magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!"
tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random."
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies
..()
if(summoner)
summoner.ExtinguishMob()
summoner.adjust_fire_stacks(-20)
/mob/living/simple_animal/hostile/guardian/fire/ToggleMode()
if(loc == summoner)
if(toggle)
to_chat(src, "<span class='notice'>You switch to dispersion mode, and will teleport victims away from your master.</span>")
toggle = FALSE
else
to_chat(src, "<span class='notice'>You switch to deception mode, and will turn your victims against their allies.</span>")
toggle = TRUE
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
if(..())
if(toggle)
if(ishuman(target) && !summoner)
spawn(0)
new /obj/effect/hallucination/delusion(target.loc, target, force_kind = "custom", duration = 200, skip_nearby = 0, custom_icon = icon_state, custom_icon_file = icon)
else
if(prob(45))
if(ismovableatom(target))
var/atom/movable/M = target
if(!M.anchored && M != summoner)
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/Bumped(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
if(AM != summoner && M.fire_stacks < 7)
M.fire_stacks = 7
M.IgniteMob()
/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
..()
collision_ignite(AM)
@@ -0,0 +1,138 @@
/mob/living/simple_animal/hostile/guardian/healer
a_intent = INTENT_HARM
friendly = "heals"
speed = 0
melee_damage_lower = 15
melee_damage_upper = 15
playstyle_string = "As a <b>Support</b> type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay."
magic_fluff_string = "..And draw the CMO, a potent force of life...and death."
tech_fluff_string = "Boot sequence complete. Medical modules active. Bluespace modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace."
var/turf/simulated/floor/beacon
var/beacon_cooldown = 0
var/toggle = FALSE
var/heal_cooldown = 0
/mob/living/simple_animal/hostile/guardian/healer/sealhealer
name = "Seal Sprit"
real_name = "Seal Sprit"
icon = 'icons/mob/animal.dmi'
icon_living = "seal"
icon_state = "seal"
attacktext = "slaps"
speak_emote = list("barks")
a_intent = INTENT_HARM
friendly = "heals"
speed = 0
melee_damage_lower = 0
melee_damage_upper = 0
melee_damage_type = STAMINA
adminseal = TRUE
/mob/living/simple_animal/hostile/guardian/healer/New()
..()
/mob/living/simple_animal/hostile/guardian/healer/Life()
..()
var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
..()
if(toggle == TRUE)
if(loc == summoner)
to_chat(src, "<span class='danger'>You must be manifested to heal!</span>")
return
if(iscarbon(target))
changeNext_move(CLICK_CD_MELEE)
if(heal_cooldown <= world.time && !stat)
var/mob/living/carbon/C = target
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
heal_cooldown = world.time + 20
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
if(loc == summoner)
if(toggle)
a_intent = INTENT_HARM
speed = 0
damage_transfer = 0.7
if(adminseal)
damage_transfer = 0
melee_damage_lower = 15
melee_damage_upper = 15
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = FALSE
else
a_intent = INTENT_HELP
speed = 1
damage_transfer = 1
if(adminseal)
damage_transfer = 0
melee_damage_lower = 0
melee_damage_upper = 0
to_chat(src, "<span class='danger'>You switch to healing mode.</span>")
toggle = TRUE
else
to_chat(src, "<span class='danger'>You have to be recalled to toggle modes!</span>")
/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon()
set name = "Place Bluespsace Beacon"
set category = "Guardian"
set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions."
if(beacon_cooldown < world.time)
var/turf/beacon_loc = get_turf(loc)
if(istype(beacon_loc, /turf/simulated/floor))
var/turf/simulated/floor/F = beacon_loc
F.icon = 'icons/turf/floors.dmi'
F.name = "bluespace recieving pad"
F.desc = "A recieving zone for bluespace teleportations. Building a wall over it should disable it."
F.icon_state = "light_on-w"
to_chat(src, "<span class='danger'>Beacon placed! You may now warp targets to it, including your user, via Alt+Click. </span>")
if(beacon)
beacon.ChangeTurf(/turf/simulated/floor/plating)
beacon = F
beacon_cooldown = world.time+3000
else
to_chat(src, "<span class='danger'>Your power is on cooldown. You must wait five minutes between placing beacons.</span>")
/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A)
if(!istype(A))
return
if(loc == summoner)
to_chat(src, "<span class='danger'>You must be manifested to warp a target!</span>")
return
if(!beacon)
to_chat(src, "<span class='danger'>You need a beacon placed to warp things!</span>")
return
if(!Adjacent(A))
to_chat(src, "<span class='danger'>You must be adjacent to your target!</span>")
return
if((A.anchored))
to_chat(src, "<span class='danger'>Your target can not be anchored!</span>")
return
to_chat(src, "<span class='danger'>You begin to warp [A]</span>")
if(do_mob(src, A, 50))
if(!A.anchored)
if(beacon) //Check that the beacon still exists and is in a safe place. No instant kills.
if(beacon.air)
var/datum/gas_mixture/Z = beacon.air
if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len)
if((Z.temperature > 270) && (Z.temperature < 360))
var/pressure = Z.return_pressure()
if((pressure > 20) && (pressure < 550))
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(A))
do_teleport(A, beacon, 0)
new /obj/effect/overlay/temp/guardian/phase(get_turf(A))
else
to_chat(src, "<span class='danger'>The beacon isn't in a safe location!</span>")
else
to_chat(src, "<span class='danger'>The beacon isn't in a safe location!</span>")
else
to_chat(src, "<span class='danger'>You need a beacon to warp things!</span>")
else
to_chat(src, "<span class='danger'>You need to hold still!</span>")
@@ -0,0 +1,109 @@
/obj/effect/ebeam/chain
name = "lightning chain"
layer = LYING_MOB_LAYER
/mob/living/simple_animal/hostile/guardian/beam
melee_damage_lower = 7
melee_damage_upper = 7
attacktext = "shocks"
melee_damage_type = BURN
attack_sound = 'sound/machines/defib_zap.ogg'
damage_transfer = 0.7
range = 7
playstyle_string = "As a <b>Lightning</b> type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them."
magic_fluff_string = "..And draw the Tesla, a shocking, lethal source of power."
tech_fluff_string = "Boot sequence complete. Lightning modules active. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to electrify your enemies."
var/datum/beam/summonerchain
var/list/enemychains = list()
var/successfulshocks = 0
/mob/living/simple_animal/hostile/guardian/beam/AttackingTarget()
..()
if(isliving(target) && target != src && target != summoner)
cleardeletedchains()
for(var/chain in enemychains)
var/datum/beam/B = chain
if(B.target == target)
return //oh this guy already HAS a chain, let's not chain again
if(enemychains.len > 2)
var/datum/beam/C = pick(enemychains)
qdel(C)
enemychains -= C
enemychains += Beam(target, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain)
/mob/living/simple_animal/hostile/guardian/beam/Destroy()
removechains()
return ..()
/mob/living/simple_animal/hostile/guardian/beam/Manifest()
..()
if(summoner)
summonerchain = Beam(summoner, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain)
while(loc != summoner)
if(successfulshocks > 5)
successfulshocks = 0
if(shockallchains())
successfulshocks++
sleep(3)
/mob/living/simple_animal/hostile/guardian/beam/Recall()
. = ..()
if(.)
removechains()
/mob/living/simple_animal/hostile/guardian/beam/proc/cleardeletedchains()
if(summonerchain && qdeleted(summonerchain))
summonerchain = null
if(enemychains.len)
for(var/chain in enemychains)
var/datum/cd = chain
if(!chain || qdeleted(cd))
enemychains -= chain
/mob/living/simple_animal/hostile/guardian/beam/proc/shockallchains()
. = 0
cleardeletedchains()
if(summoner)
if(!summonerchain)
summonerchain = Beam(summoner, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain)
. += chainshock(summonerchain)
if(enemychains.len)
for(var/chain in enemychains)
. += chainshock(chain)
/mob/living/simple_animal/hostile/guardian/beam/proc/removechains()
if(summonerchain)
QDEL_NULL(summonerchain)
if(enemychains.len)
for(var/chain in enemychains)
qdel(chain)
enemychains = list()
/mob/living/simple_animal/hostile/guardian/beam/proc/chainshock(datum/beam/B)
. = 0
var/list/turfs = list()
for(var/E in B.elements)
var/obj/effect/ebeam/chainpart = E
if(chainpart && chainpart.x && chainpart.y && chainpart.z)
var/turf/T = get_turf_pixel(chainpart)
turfs |= T
if(T != get_turf(B.origin) && T != get_turf(B.target))
for(var/turf/TU in circlerange(T, 1))
turfs |= TU
for(var/turf in turfs)
var/turf/T = turf
for(var/mob/living/L in T)
if(L.stat != DEAD && L != src && L != summoner)
var/mob/living/simple_animal/hostile/guardian/G = L
if(istype(G) && G.summoner == summoner)
continue
if(successfulshocks > 4)
//L.electrocute_act(30, src) //shocks for 30 burn damage
L.visible_message(
"<span class='danger'>[L] was shocked by the lightning chain!</span>", \
"<span class='userdanger'>You are shocked by the lightning chain!</span>", \
"<span class='italics'>You hear a heavy electrical crack.</span>" \
)
L.adjustFireLoss(1.2) //adds up very rapidly
. = 1
@@ -0,0 +1,57 @@
/mob/living/simple_animal/hostile/guardian/protector
melee_damage_lower = 15
melee_damage_upper = 15
range = 15 //worse for it due to how it leashes
damage_transfer = 0.4
playstyle_string = "As a <b>Protector</b> type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower."
magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge."
tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to defend you."
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/protector/ex_act(severity)
if(severity == 1)
adjustBruteLoss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner
else
..()
if(toggle)
visible_message("<span class='danger'>The explosion glances off [src]'s energy shielding!</span>")
/mob/living/simple_animal/hostile/guardian/protector/ToggleMode()
if(cooldown > world.time)
return 0
cooldown = world.time + 10
if(toggle)
overlays.Cut()
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
speed = initial(speed)
damage_transfer = 0.4
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = FALSE
else
var/icon/shield_overlay = icon('icons/effects/effects.dmi', "shield-grey")
shield_overlay *= name_color
overlays.Add(shield_overlay)
melee_damage_lower = 2
melee_damage_upper = 2
speed = 1
damage_transfer = 0.05 //damage? what's damage?
to_chat(src, "<span class='danger'>You switch to protection mode.</span>")
toggle = TRUE
/mob/living/simple_animal/hostile/guardian/protector/snapback() //snap to what? snap to the guardian!
if(summoner)
if(get_dist(get_turf(summoner),get_turf(src)) <= range)
return
else
if(istype(summoner.loc, /obj/effect))
to_chat(src, "<span class='holoparasite'>You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!</span>")
visible_message("<span class='danger'>[src] jumps back to its user.</span>")
Recall(TRUE)
else
to_chat(summoner, "<span class='holoparasite'>You moved out of range, and were pulled back! You can only move [range] meters from <b>[src]</b>!</span>")
summoner.visible_message("<span class='danger'>[summoner] jumps back to their protector.</span>")
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner))
summoner.forceMove(get_turf(src))
new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner))//Protector
@@ -0,0 +1,99 @@
/obj/item/projectile/guardian
name = "crystal spray"
icon_state = "guardian"
damage = 5
damage_type = BRUTE
armour_penetration = 100
/mob/living/simple_animal/hostile/guardian/ranged
a_intent = INTENT_HELP
friendly = "quietly assesses"
melee_damage_lower = 10
melee_damage_upper = 10
damage_transfer = 0.9
projectiletype = /obj/item/projectile/guardian
ranged_cooldown_time = 10
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
rapid = 1
range = 13
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
playstyle_string = "As a <b>Ranged</b> type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit."
magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat."
tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal."
var/list/snares = list()
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/ranged/ToggleMode()
if(loc == summoner)
if(toggle)
ranged = 1
melee_damage_lower = 10
melee_damage_upper = 10
alpha = 255
range = 13
incorporeal_move = 0
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = FALSE
else
ranged = 0
melee_damage_lower = 0
melee_damage_upper = 0
alpha = 60
range = 255
incorporeal_move = 1
to_chat(src, "<span class='danger'>You switch to scout mode.</span>")
toggle = TRUE
else
to_chat(src, "<span class='danger'>You have to be recalled to toggle modes!</span>")
/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight()
if(see_invisible == SEE_INVISIBLE_MINIMUM)
to_chat(src, "<span class='notice'>You deactivate your night vision.</span>")
see_invisible = SEE_INVISIBLE_LIVING
else
to_chat(src, "<span class='notice'>You activate your night vision.</span>")
see_invisible = SEE_INVISIBLE_MINIMUM
/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare()
set name = "Set Surveillance Trap"
set category = "Guardian"
set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5"
if(snares.len <6)
var/turf/snare_loc = get_turf(loc)
var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc)
S.spawner = src
S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])"
snares |= S
to_chat(src, "<span class='danger'>Surveillance trap deployed!</span>")
else
to_chat(src, "<span class='danger'>You have too many traps deployed. Delete some first.</span>")
/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare()
set name = "Remove Surveillance Trap"
set category = "Guardian"
set desc = "Disarm unwanted surveillance traps."
var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in snares
if(picked_snare)
snares -= picked_snare
qdel(picked_snare)
to_chat(src, "<span class='danger'>Snare disarmed.</span>")
/obj/item/effect/snare
name = "snare"
desc = "You shouldn't be seeing this!"
var/mob/living/spawner
invisibility = 1
/obj/item/effect/snare/Crossed(AM as mob|obj)
if(isliving(AM))
var/turf/snare_loc = get_turf(loc)
if(spawner)
to_chat(spawner, "<span class='danger'>[AM] has crossed your surveillance trap at [get_area(snare_loc)].</span>")
if(istype(spawner, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = spawner
if(G.summoner)
to_chat(G.summoner, "<span class='danger'>[AM] has crossed your surveillance trap at [get_area(snare_loc)].</span>")
@@ -0,0 +1,47 @@
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 20
melee_damage_upper = 20
damage_transfer = 0.4
playstyle_string = "As a <b>Standard</b> type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies."
var/battlecry = "AT"
/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry()
set name = "Set Battlecry"
set category = "Guardian"
set desc = "Choose what you shout as you punch"
var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 5 characters.", ,"", 6)
if(input)
battlecry = input
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
..()
if(iscarbon(target) && target != summoner)
if(length(battlecry) > 11)//no more then 11 letters in a battle cry.
visible_message("<span class='danger'>[src] punches [target]!</span>")
else
say("[battlecry][battlecry][battlecry][battlecry][battlecry]")
playsound(loc, attack_sound, 50, 1, 1)
playsound(loc, attack_sound, 50, 1, 1)
playsound(loc, attack_sound, 50, 1, 1)
playsound(loc, attack_sound, 50, 1, 1)
/mob/living/simple_animal/hostile/guardian/punch/sealpunch
name = "Seal Sprit"
real_name = "Seal Sprit"
icon = 'icons/mob/animal.dmi'
icon_living = "seal"
icon_state = "seal"
attacktext = "slaps"
speak_emote = list("barks")
melee_damage_lower = 0
melee_damage_upper = 0
melee_damage_type = STAMINA
damage_transfer = 0
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
battlecry = "URK"
adminseal = TRUE
@@ -1,4 +1,7 @@
#define CHALLENGE_TELECRYSTALS 280
#define CHALLENGE_TIME_LIMIT 6000
#define CHALLENGE_SCALE_PLAYER 1 // How many player per scaling bonus
#define CHALLENGE_SCALE_BONUS 2 // How many TC per scaling bonus
#define CHALLENGE_MIN_PLAYERS 50
#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
@@ -46,13 +49,14 @@
event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
to_chat(user, "<b>Look below you on the floor for the extra uplink</b>")
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
S.challenge = TRUE
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(get_turf(user))
U.hidden_uplink.uplink_owner= "[user.key]"
U.hidden_uplink.uses = 280
U.hidden_uplink.uses = CHALLENGE_TELECRYSTALS + round((((player_list.len - CHALLENGE_MIN_PLAYERS)/CHALLENGE_SCALE_PLAYER) * CHALLENGE_SCALE_BONUS)) // No. of player - Min. Player to dec, divided by player per bonus, then multipled by TC per bonus. Rounded.
config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY
qdel(src)
@@ -78,3 +82,6 @@
#undef CHALLENGE_TIME_LIMIT
#undef CHALLENGE_MIN_PLAYERS
#undef CHALLENGE_SHUTTLE_DELAY
#undef CHALLENGE_TELECRYSTALS
#undef CHALLENGE_SCALE_PLAYER
#undef CHALLENGE_SCALE_BONUS
+7 -1
View File
@@ -329,9 +329,15 @@ Made by Xhuis
H << 'sound/weapons/sear.ogg'
else if(light_amount < LIGHT_HEAL_THRESHOLD)
H.clear_alert("lightexposure")
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(E))
E.take_damage(-1)
H.heal_overall_damage(5, 5)
H.adjustToxLoss(-5)
H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!"
H.AdjustEyeBlurry(-1)
H.CureNearsighted()
H.CureBlind()
H.adjustCloneLoss(-1)
H.SetWeakened(0)
H.SetStunned(0)
@@ -378,4 +384,4 @@ Made by Xhuis
/datum/game_mode/proc/update_shadow_icons_removed(datum/mind/shadow_mind) //This should never actually occur, but it's here anyway.
var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW]
shadow_hud.leave_hud(shadow_mind.current)
set_antag_hud(shadow_mind.current, null)
set_antag_hud(shadow_mind.current, null)
@@ -363,7 +363,7 @@
var/mob/living/carbon/human/H = target
H.visible_message("<span class='warning'>[H]'s skin suddenly bubbles and shifts around their body!</span>", \
"<span class='shadowling'>You regenerate your protective armor and cleanse your form of defects.</span>")
H.adjustCloneLoss(target.getCloneLoss())
H.adjustCloneLoss(-target.getCloneLoss())
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), slot_wear_suit)
@@ -96,6 +96,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
sleep(10)
to_chat(H, "<span class='shadowling'><b><i>Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.</b></i></span>")
H.ExtinguishMob()
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision(null))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/enthrall(null))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
@@ -319,6 +319,7 @@
return 0
if(!affects(C))
C.visible_message("<span class='warning'>[C] seems to resist the takeover!</span>", "<span class='notice'>Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.</span>")
return 0
if(!ishuman(C))
to_chat(user, "<span class='warning'>You can only enthrall humans!</span>")
return 0
+7
View File
@@ -302,11 +302,18 @@
if(old_danger_level!=danger_level)
apply_danger_level()
if(mode == AALARM_MODE_SCRUBBING && danger_level == ATMOS_ALARM_DANGER)
if(pressure_dangerlevel == ATMOS_ALARM_DANGER)
mode = AALARM_MODE_OFF
if(temperature_dangerlevel == ATMOS_ALARM_DANGER && cur_tlv.max2 <= environment.temperature)
mode = AALARM_MODE_PANIC
apply_mode()
if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
mode = AALARM_MODE_SCRUBBING
apply_mode()
/obj/machinery/alarm/proc/handle_heating_cooling(var/datum/gas_mixture/environment, var/datum/tlv/cur_tlv, var/turf/simulated/location)
cur_tlv = TLV["temperature"]
//Handle temperature adjustment here.
+3 -1
View File
@@ -85,7 +85,7 @@ obj/machinery/air_sensor
if(..())
return 1
process()
process_atmos()
if(on)
if(!radio_connection)
return
@@ -129,9 +129,11 @@ obj/machinery/air_sensor
initialize()
..()
atmos_machinery += src
set_frequency(frequency)
Destroy()
atmos_machinery -= src
if(radio_controller)
radio_controller.remove_object(src,frequency)
return ..()
+1 -1
View File
@@ -269,7 +269,7 @@ update_flag
else
return 1
/obj/machinery/portable_atmospherics/canister/process()
/obj/machinery/portable_atmospherics/canister/process_atmos()
if(destroyed)
return
+3 -1
View File
@@ -18,12 +18,14 @@
/obj/machinery/meter/New()
..()
atmos_machinery += src
target = locate(/obj/machinery/atmospherics/pipe) in loc
if(id && !id_tag)//i'm not dealing with further merge conflicts, fuck it
id_tag = id
return 1
/obj/machinery/meter/Destroy()
atmos_machinery -= src
target = null
return ..()
@@ -32,7 +34,7 @@
if(!target)
target = locate(/obj/machinery/atmospherics/pipe) in loc
/obj/machinery/meter/process()
/obj/machinery/meter/process_atmos()
if(!target)
icon_state = "meterX"
return 0
@@ -13,6 +13,7 @@
/obj/machinery/portable_atmospherics/New()
..()
atmos_machinery += src
air_contents.volume = volume
air_contents.temperature = T20C
@@ -27,7 +28,7 @@
connect(port)
update_icon()
/obj/machinery/portable_atmospherics/process()
/obj/machinery/portable_atmospherics/process_atmos()
if(!connected_port) //only react when pipe_network will ont it do it for you
//Allow for reactions
air_contents.react()
@@ -35,6 +36,7 @@
update_icon()
/obj/machinery/portable_atmospherics/Destroy()
atmos_machinery -= src
disconnect()
QDEL_NULL(air_contents)
QDEL_NULL(holding)
+1 -1
View File
@@ -46,7 +46,7 @@
..(severity)
/obj/machinery/portable_atmospherics/pump/process()
/obj/machinery/portable_atmospherics/pump/process_atmos()
..()
if(on)
var/datum/gas_mixture/environment
+1 -1
View File
@@ -41,7 +41,7 @@
return
/obj/machinery/portable_atmospherics/scrubber/process()
/obj/machinery/portable_atmospherics/scrubber/process_atmos()
..()
if(!on)
+9 -1
View File
@@ -9,7 +9,15 @@
var/on = 0
var/volume_rate = 800
/obj/machinery/zvent/process()
/obj/machinery/zvent/New()
..()
atmos_machinery += src
/obj/machinery/zvent/Destroy()
atmos_machinery -= src
return ..()
/obj/machinery/zvent/process_atmos()
//all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
if(istype(loc,/turf/simulated)) //if we're not on a valid turf, forget it
+3
View File
@@ -203,6 +203,9 @@
if(clonemind.active) //somebody is using that mind
if(ckey(clonemind.key) != R.ckey)
return 0
if(clonemind.suicided) // and stay out!
malfunction(go_easy = 0)
return -1 // Flush the record
else
// get_ghost() will fail if they're unable to reenter their body
var/mob/dead/observer/G = clonemind.get_ghost()
@@ -44,6 +44,24 @@
name = "Circuit board (Camera Monitor)"
build_path = /obj/machinery/computer/security
origin_tech = "programming=2;combat=2"
/obj/item/weapon/circuitboard/camera/telescreen
name = "Circuit board (Telescreen)"
build_path = /obj/machinery/computer/security/telescreen
/obj/item/weapon/circuitboard/camera/telescreen/entertainment
name = "Circuit board (Entertainment Monitor)"
build_path = /obj/machinery/computer/security/telescreen/entertainment
/obj/item/weapon/circuitboard/camera/wooden_tv
name = "Circuit board (Wooden TV)"
build_path = /obj/machinery/computer/security/wooden_tv
/obj/item/weapon/circuitboard/camera/mining
name = "Circuit board (Outpost Camera Monitor)"
build_path = /obj/machinery/computer/security/mining
/obj/item/weapon/circuitboard/camera/engineering
name = "Circuit board (Engineering Camera Monitor)"
build_path = /obj/machinery/computer/security/engineering
/obj/item/weapon/circuitboard/xenobiology
name = "Circuit board (Xenobiology Console)"
build_path = /obj/machinery/computer/camera_advanced/xenobio
+31 -13
View File
@@ -87,6 +87,25 @@
else
..()
/obj/machinery/computer/security/telescreen/attackby(obj/item/I, mob/user, params)
if(ismultitool(I))
var/direction = input(user, "Which direction?", "Select direction!") as null|anything in list("North", "East", "South", "West", "Centre")
if(!direction || !Adjacent(user))
return
pixel_x = 0
pixel_y = 0
switch(direction)
if("North")
pixel_y = 32
if("East")
pixel_x = 32
if("South")
pixel_y = -32
if("West")
pixel_x = -32
else
..()
/obj/machinery/computer/security/emag_act(user as mob)
if(!emagged)
emagged = 1
@@ -293,39 +312,36 @@
// Other computer monitors.
/obj/machinery/computer/security/telescreen
name = "\improper Telescreen"
name = "telescreen"
desc = "Used for watching camera networks."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "telescreen"
icon_state = "telescreen_console"
icon_screen = "telescreen"
icon_keyboard = null
light_range_on = 0
network = list("SS13")
density = 0
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
if(stat & BROKEN)
icon_state += "b"
return
circuit = /obj/item/weapon/circuitboard/camera/telescreen
/obj/machinery/computer/security/telescreen/entertainment
name = "entertainment monitor"
desc = "Damn, they better have Paradise TV on these things."
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment"
icon_state = "entertainment_console"
icon_screen = "entertainment"
light_color = "#FFEEDB"
light_range_on = 0
network = list("news")
luminosity = 0
circuit = /obj/item/weapon/circuitboard/camera/telescreen/entertainment
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the stations camera network."
desc = "An old TV hooked into the station's camera network."
icon_state = "television"
icon_keyboard = null
icon_screen = "detective_tv"
light_color = "#3848B3"
light_power_on = 0.5
network = list("SS13")
circuit = /obj/item/weapon/circuitboard/camera/wooden_tv
/obj/machinery/computer/security/mining
name = "outpost camera monitor"
@@ -334,6 +350,7 @@
icon_screen = "mining"
light_color = "#F9BBFC"
network = list("Mining Outpost")
circuit = /obj/item/weapon/circuitboard/camera/mining
/obj/machinery/computer/security/engineering
name = "engineering camera monitor"
@@ -342,3 +359,4 @@
icon_screen = "engie_cams"
light_color = "#FAC54B"
network = list("Power Alarms","Atmosphere Alarms","Fire Alarms")
circuit = /obj/item/weapon/circuitboard/camera/engineering
+3
View File
@@ -490,6 +490,7 @@ var/time_last_changed_position = 0
j.total_positions++
opened_positions[edit_job_target]++
log_game("[key_name(usr)] has opened a job slot for job \"[j]\".")
message_admins("[key_name_admin(usr)] has opened a job slot for job \"[j.title]\".")
nanomanager.update_uis(src)
if("make_job_unavailable")
@@ -509,7 +510,9 @@ var/time_last_changed_position = 0
j.total_positions--
opened_positions[edit_job_target]--
log_game("[key_name(usr)] has closed a job slot for job \"[j]\".")
message_admins("[key_name_admin(usr)] has closed a job slot for job \"[j.title]\".")
nanomanager.update_uis(src)
if("prioritize_job")
// TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY
if(is_authenticated(usr) && !target_dept)
+1 -1
View File
@@ -372,7 +372,7 @@
scantemp = "<span class=\"bad\">Error: No signs of intelligence detected.</span>"
nanomanager.update_uis(src)
return
if(subject.suiciding == 1 && src.scanner.scan_level < 2)
if(subject.suiciding)
scantemp = "<span class=\"bad\">Error: Subject's brain is not responding to scanning stimuli.</span>"
nanomanager.update_uis(src)
return
@@ -255,6 +255,7 @@
nanomanager.update_uis(src)
return
Centcomm_announce(input, usr)
print_centcom_report(input, worldtime2text() +" Captain's Message")
to_chat(usr, "Message transmitted.")
log_say("[key_name(usr)] has made a Centcomm announcement: [input]")
centcomm_message_cooldown = 1
@@ -548,6 +549,25 @@
for(var/datum/computer_file/program/comm/P in shuttle_caller_list)
var/turf/T = get_turf(P.computer)
if(T && P.program_state != PROGRAM_STATE_KILLED && is_station_contact(T.z))
if(P.computer)
var/obj/item/weapon/computer_hardware/printer/printer = P.computer.all_components[MC_PRINT]
if(printer)
printer.print_text(text, "paper- '[title]'")
P.messagetitle.Add("[title]")
P.messagetext.Add(text)
/proc/print_centcom_report(text = "", title = "Incoming Message")
for(var/obj/machinery/computer/communications/C in shuttle_caller_list)
if(!(C.stat & (BROKEN|NOPOWER)) && is_admin_level(C.z))
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
P.name = "paper- '[title]'"
P.info = text
P.update_icon()
C.messagetitle.Add("[title]")
C.messagetext.Add(text)
for(var/datum/computer_file/program/comm/P in shuttle_caller_list)
var/turf/T = get_turf(P.computer)
if(T && P.program_state != PROGRAM_STATE_KILLED && is_admin_level(T.z))
if(P.computer)
var/obj/item/weapon/computer_hardware/printer/printer = P.computer.all_components[MC_PRINT]
if(printer)
+22 -1
View File
@@ -12,6 +12,7 @@
var/obj/item/weapon/card/id/scan = null
var/authenticated = null
var/rank = null
var/list/authcard_access = list()
var/screen = null
var/datum/data/record/active1 = null
var/datum/data/record/active2 = null
@@ -66,6 +67,8 @@
break
var/background = "''"
switch(crimstat)
if("*Execute*")
background = "'background-color:#5E0A1A'"
if("*Arrest*")
background = "'background-color:#890E26'"
if("Incarcerated")
@@ -162,18 +165,33 @@
screen = SEC_DATA_R_LIST
if("criminal")
if(active2)
var/their_name = active2.fields["name"]
var/their_rank = active2.fields["rank"]
var/t1 = copytext(trim(sanitize(input("Enter Reason:", "Secure. records", null, null) as text)), 1, MAX_MESSAGE_LEN)
if(!t1)
t1 = "(none)"
switch(temp_href[2])
if("none")
active2.fields["criminal"] = "None"
if("arrest")
active2.fields["criminal"] = "*Arrest*"
if("execute")
if((access_magistrate in authcard_access) || (access_armory in authcard_access))
active2.fields["criminal"] = "*Execute*"
message_admins("[key_name_admin(usr)] authorized execution for [their_rank] [their_name], with comment: [t1]")
else
setTemp("<h3 class='bad'>Error: permission denied.</h3>")
//to_chat(usr, "<span class='notice'>Error: permission denied.</span>")
return 1
if("incarcerated")
active2.fields["criminal"] = "Incarcerated"
if("parolled")
active2.fields["criminal"] = "Parolled"
if("released")
active2.fields["criminal"] = "Released"
var/newstatus = active2.fields["criminal"]
log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [newstatus], comment: [t1]")
active2.fields["comments"] += "Set to [newstatus] by [usr.name] ([rank]) on [current_date_string] [worldtime2text()], comment: [t1]"
update_all_mob_security_hud()
if("rank")
if(active1)
@@ -206,6 +224,7 @@
if(check_access(scan))
authenticated = scan.registered_name
rank = scan.assignment
authcard_access = scan.access
if(authenticated)
active1 = null
@@ -218,6 +237,7 @@
screen = null
active1 = null
active2 = null
authcard_access = list()
else if(href_list["sort"])
// Reverse the order if clicked twice
@@ -458,6 +478,7 @@
buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == "None" ? "selected" : null))
buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == "*Arrest*" ? "selected" : null))
buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == "Incarcerated" ? "selected" : null))
buttons[++buttons.len] = list("name" = "*Execute*", "icon" = "lock", "href" = "criminal=execute", "status" = (active2.fields["criminal"] == "*Execute*" ? "selected" : null))
buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == "Parolled" ? "selected" : null))
buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == "Released" ? "selected" : null))
setTemp("<h3>Criminal Status</h3>", buttons)
+9 -4
View File
@@ -126,6 +126,15 @@
on = 0
go_out()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
if(air_contents)
if(occupant)
process_occupant()
return 1
/obj/machinery/atmospherics/unary/cryo_cell/process_atmos()
..()
if(!node)
return
if(!on)
@@ -135,13 +144,9 @@
temperature_archived = air_contents.temperature
heat_gas_contents()
if(occupant)
process_occupant()
if(abs(temperature_archived-air_contents.temperature) > 1)
parent.update = 1
return 1
/obj/machinery/atmospherics/unary/cryo_cell/allow_drop()
return 0
+6 -7
View File
@@ -647,13 +647,12 @@ About the new airlock wires panel:
src.attack_ai(user)
/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0)
if(src.isElectrified())
if(istype(mover, /obj/item))
var/obj/item/i = mover
if(i.materials[MAT_METAL])
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
if(isElectrified() && density && istype(mover, /obj/item))
var/obj/item/I = mover
if(I.flags & CONDUCT)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
return ..()
/obj/machinery/door/airlock/attack_hand(mob/user as mob)
+11 -10
View File
@@ -46,7 +46,7 @@
<center><small><b>Admission data:</b></small></center><br>
<small><b>Log generated at:</b> [worldtime2text()]<br>
<b>Detainee:</b> [logname]<br>
<b>Duration:</b> [timetoset/10] seconds<br>
<b>Duration:</b> [seconds_to_time(timetoset / 10)]<br>
<b>Charge(s):</b> [logcharges]<br>
<b>Arresting Officer:</b> [usr.name]<br><hr><br>
<small>This log file was generated automatically upon activation of a cell timer.</small>"}
@@ -55,7 +55,7 @@
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]'. \
Radio.autosay("Detainee [logname] has been incarcerated for [seconds_to_time(timetoset / 10)] for the charges of, '[logcharges]'. \
Arresting Officer: [usr.name].[R ? "" : " Detainee record not found, manual record update required."]", name, "Security", list(z))
if(R)
@@ -277,7 +277,7 @@
dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond]<br/>"
// Controls
dat += "<a href='?src=[UID()];tp=-60'>-</a> <a href='?src=[UID()];tp=-1'>-</a> <a href='?src=[UID()];tp=1'>+</a> <A href='?src=[UID()];tp=60'>+</a><br/>"
dat += "<a href='?src=[UID()];settime=1'>Input Time</a>"
// Mounted flash controls
for(var/obj/machinery/flasher/F in targets)
@@ -319,13 +319,9 @@
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
var/tp = text2num(href_list["tp"])
var/addtime = (timetoset / 10)
addtime += tp
addtime = min(max(round(addtime), 0), 3600)
timeset(addtime)
if(href_list["settime"])
var/time = min(max(round(return_time_input(usr)), 0), 3600)
timeset(time)
if(href_list["fc"])
for(var/obj/machinery/flasher/F in targets)
@@ -368,6 +364,11 @@
overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
/obj/machinery/door_timer/proc/return_time_input()
var/mins = input(usr, "Minutes", "Enter number of minutes", 0) as num
var/seconds = input(usr, "Seconds", "Enter number of seconds", 0) as num
var/totaltime = (seconds + (mins * 60))
return totaltime
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
// Stolen from status_display
+5 -1
View File
@@ -59,7 +59,9 @@
if(operating)
return
if(istype(C, /obj/item/weapon/weldingtool))
if(iswelder(C))
if(!density)
return
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(0, user))
welded = !welded
@@ -169,6 +171,8 @@
update_icon()
/obj/machinery/door/firedoor/open(auto_close = TRUE)
if(welded)
return
. = ..()
latetoggle(auto_close)
+3
View File
@@ -166,6 +166,9 @@ Class Procs:
/obj/machinery/process() // If you dont use process or power why are you here
return PROCESS_KILL
/obj/machinery/proc/process_atmos() //If you dont use process why are you here
return PROCESS_KILL
/obj/machinery/emp_act(severity)
if(use_power && stat == 0)
use_power(7500/severity)

Some files were not shown because too many files have changed in this diff Show More