diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0e5b5ad3208..98686aee07d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -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("Arbitrary text") ``` - 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. \ No newline at end of file + put on hold until a consensus is reached. diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 694fe085374..9c76e425534 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -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 "} + diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index ad91afe88cd..209fc1d31a1 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -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 diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index fdaf1531777..958f2fa9d87 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -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 diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 6f1be49b3b7..841591ea396 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -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, "You begin to unfasten \the [src]...") diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 8951977d4db..d19c95d6a66 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -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 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index a0f563669c1..403f9759ac6 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -70,7 +70,7 @@ else last_pressure_delta = 0 -/obj/machinery/atmospherics/binary/circulator/process() +/obj/machinery/atmospherics/binary/circulator/process_atmos() ..() update_icon() diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 74293d6a807..d36c6059c5f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index a9071e5ba13..e4e4464b55f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 908a5318dda..8b36352700c 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 0ec613cb049..334e632f1df 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index cbe1422c38a..ce0089b0639 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -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) diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 07269c5f3db..0676d833029 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index a247d6f93a3..ed3e6836fc9 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -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) diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 109c3a2fa04..7ec310f2642 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 0657f8d9f5f..8d388d478dd 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 47cfb15fa51..6dc5e5cc303 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -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 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm index 3e716d6f1cb..39441f8ed87 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm index 8b871847b23..1b726a6c066 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm index 13b3b239986..2b0cbc14277 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index f30ca5a016c..63070b19538 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -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) diff --git a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm index 274f9999edb..0f575fb9c3a 100644 --- a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm index 5deec7925b9..4078f5412c2 100644 --- a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm +++ b/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm index db76b56cac0..f2243760dd5 100644 --- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm index dc7da589017..c245bfc120e 100644 --- a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm +++ b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm @@ -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() diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index e61a62736c3..bcdf6c51903 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -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 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 08febf1c572..4c4f1a91d06 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -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 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 6747b103972..e86b8caa722 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -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) diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 0504062eb09..7691b157857 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -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) diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 0c3e5fd5be3..dc8dbeca381 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -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 diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index c00696ed1a9..1b03b12fe2a 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -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 diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index a771bdd6234..26139b40606 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -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) diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 28c1a7e6860..a7f5ee69d39 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -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, "The pressure sends you flying!") + 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 diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index fe7e2b0067c..1e7f98ecb53 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -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 \ No newline at end of file +#define ATMOS_ALARM_DANGER 2 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 393247c5a1f..0023f3bb4f7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -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, diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 5d2b98b683f..3121f35b13c 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -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" diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 05200eea7dd..b59b2a94182 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -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) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 32dc9630bb0..43dcaa1c75d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -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 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index f20be8c1c0b..cf030dc65ed 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -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 diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 872f299479c..4b71a2c7162 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -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) \ No newline at end of file + 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." \ No newline at end of file diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 16e54703cf4..3f8ec321470 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -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 \ No newline at end of file +var/custom_event_msg = null +var/custom_event_admin_msg = null + +var/list/summon_spots = list() diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 4639f5d93cf..b71498e0636 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -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() diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 0cc712799c7..cb1ce8f10a7 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -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. diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index a4aa4b93c4f..7042cbe932a 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -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", diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 1d5d419ba82..9e32705fc90 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -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 diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm index 311699bb720..e7937593c19 100644 --- a/code/controllers/Processes/air.dm +++ b/code/controllers/Processes/air.dm @@ -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 diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm deleted file mode 100644 index 5706fa8326e..00000000000 --- a/code/controllers/Processes/pipenet.dm +++ /dev/null @@ -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 diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 2184533add6..fbb491d28a0 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -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" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index d611396a45a..558f6407528 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -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 diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 38b0eec4802..33a18f9f9aa 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -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 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f2465145808..3e1c3207a87 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -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 diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 717599f112c..e81600916fb 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -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" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 8d0e1b408f4..8f47c5a7e47 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -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 diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 7b7952b5f88..1f02aaf121a 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -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" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 0ac2f242b08..723d26a451a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -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 diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index bddb7b59bc6..604e92a47e0 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -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 diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 01424b35934..6c05dfd6f2b 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -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) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index cbacd5faf00..f33ab1e2dfe 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -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) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 71a6b5be37f..439d169bc37 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -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("The corpse of [H.name] suddenly rises!") /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() diff --git a/code/game/gamemodes/changeling/powers/biodegrade.dm b/code/game/gamemodes/changeling/powers/biodegrade.dm new file mode 100644 index 00000000000..5e4b0e7fa12 --- /dev/null +++ b/code/game/gamemodes/changeling/powers/biodegrade.dm @@ -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, "We are already free!") + return FALSE + + if(user.handcuffed) + var/obj/O = user.get_item_by_slot(slot_handcuffed) + if(!istype(O)) + return FALSE + user.visible_message("[user] vomits a glob of acid on \his [O]!", \ + "We vomit acidic ooze onto our restraints!") + 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("[user] vomits a glob of acid across the front of \his [S]!", \ + "We vomit acidic ooze onto our straight jacket!") + 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("[C]'s hinges suddenly begin to melt and run!") + to_chat(user, "We vomit acidic goop onto the interior of [C]!") + 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("[src] shifts and starts to fall apart!") + to_chat(user, "We secrete acidic enzymes from our skin and begin melting our cocoon...") + 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("[O] dissolves into a puddle of sizzling goop.") + 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("[S] dissolves into a puddle of sizzling goop.") + 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("[C]'s door breaks and opens!") + C.welded = FALSE + C.locked = FALSE + C.broken = TRUE + C.open() + to_chat(user, "We open the container restraining us!") + +/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, "We dissolve the cocoon!") diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index a6c2214b9d7..2ac7d46dfba 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -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.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") cult_mind.memory += "Objective #[obj_count]: [explanation]
" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 39099fb7d44..876748838ae 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -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." diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index c9e951cf940..69b6de0c73e 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -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, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!") diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 36ebc5d3dab..55d2a51de61 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -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, "[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!") return 0 + if(!(A in summon_spots)) + to_chat(user, "[cult_mode.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") + 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, "You decide to prepare further before scribing the rune.") @@ -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, "There is already a rune here.") 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, "There is already a rune here.") 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, "The ritual can only begin where the veil is weak - in [english_list(summon_spots)]!") + 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) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 4bf4bd9f9e7..7d046c82180 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -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("Dust flows from [user]'s hand, and they disappear in a flash of red light!", \ "You speak the words of the talisman and find yourself somewhere else!") user.forceMove(get_turf(actual_selected_rune)) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 4825dea6ebb..b6f240b8319 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -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, "Your summoner has died!") - visible_message("The [src] dies along with its user!") + visible_message("The [src] dies along with its user!") 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("The [src] jumps back to its user.") - Recall() + snapback() if(summoned && !summoner && !adminseal) to_chat(src, "You somehow lack a summoner! As a result, you dispel!") 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("The [src] jumps back to its user.") - Recall() + to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!") + visible_message("\The [src] jumps back to its user.") + 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, "Your [name] died somehow!") + to_chat(summoner, "Your [name] died somehow!") summoner.death() @@ -93,10 +96,10 @@ return summoner.adjustBruteLoss(damage) if(damage) - to_chat(summoner, "Your [name] is under attack! You take damage!") - summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") + to_chat(summoner, "Your [name] is under attack! You take damage!") + summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") if(summoner.stat == UNCONSCIOUS) - to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!") + to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!") 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, "Your [src] was blown up!") + to_chat(summoner, "Your [src] was blown up!") 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, "[src]: [input]") @@ -151,7 +153,7 @@ to_chat(src, "[src]: [input]") /mob/living/simple_animal/hostile/guardian/proc/ToggleMode() - to_chat(src, "You dont have another mode!") + to_chat(src, "You dont have another mode!") /mob/living/proc/guardian_comm() @@ -212,456 +214,6 @@ to_chat(src, "You deactivate your light.") 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("[src] punches [target]!") - 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, "You must be manifested to heal!") - 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, "You switch to combat mode.") - 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, "You switch to healing mode.") - toggle = TRUE - else - to_chat(src, "You have to be recalled to toggle modes!") - - -/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_cooldownBeacon placed! You may now warp targets to it, including your user, via Alt+Click. ") - if(beacon) - beacon.ChangeTurf(/turf/simulated/floor/plating) - beacon = F - beacon_cooldown = world.time+3000 - - else - to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") - -/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) - if(!istype(A)) - return - if(src.loc == summoner) - to_chat(src, "You must be manifested to warp a target!") - return - if(!beacon) - to_chat(src, "You need a beacon placed to warp things!") - return - if(!Adjacent(A)) - to_chat(src, "You must be adjacent to your target!") - return - if((A.anchored)) - to_chat(src, "Your target can not be anchored!") - return - to_chat(src, "You begin to warp [A]") - 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, "The beacon isn't in a safe location!") - else - to_chat(src, "The beacon isn't in a safe location!") - else - to_chat(src, "You need a beacon to warp things!") - else - to_chat(src, "You need to hold still!") - - -///////////////////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, "You switch to combat mode.") - toggle = FALSE - else - ranged = 0 - melee_damage_lower = 0 - melee_damage_upper = 0 - alpha = 60 - range = 255 - incorporeal_move = 1 - to_chat(src, "You switch to scout mode.") - toggle = TRUE - else - to_chat(src, "You have to be recalled to toggle modes!") - -/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() - if(see_invisible == SEE_INVISIBLE_MINIMUM) - to_chat(src, "You deactivate your night vision.") - see_invisible = SEE_INVISIBLE_LIVING - else - to_chat(src, "You activate your night vision.") - 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, "Surveillance trap deployed!") - else - to_chat(src, "You have too many traps deployed. Delete some first.") - -/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, "Snare disarmed.") - -/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, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") - 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, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") - -////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, "You must be manifested to create bombs!") - 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, "Success! Bomb on \the [A] armed!") - if(summoner) - to_chat(summoner, "Your guardian has primed \the [A] to explode!") - bomb_cooldown = world.time + 200 - B.spawner = src - B.disguise (A) - else - to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") - -/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, "Failure! Your trap on \the [stored_obj] didn't catch anyone this time.") - qdel(src) - -/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) - to_chat(user, "The [src] was boobytrapped!") - 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, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") - stored_obj.loc = get_turf(src.loc) - qdel(src) - return - to_chat(spawner, "Success! Your trap on \the [src] caught [user]!") - 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, "Looks odd!") - - ////////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].") diff --git a/code/game/gamemodes/miniantags/guardian/types/assassin.dm b/code/game/gamemodes/miniantags/guardian/types/assassin.dm new file mode 100644 index 00000000000..39ea9992308 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/assassin.dm @@ -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 Assassin 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, "You exit stealth.") + else + visible_message("[src] suddenly appears!") + 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, "You have to be manifested to enter stealth!") + 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, "You enter stealth, empowering your next attack.") + updatestealthalert() + toggle = TRUE + else if(!forced) + to_chat(src, "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!") + +/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 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm new file mode 100644 index 00000000000..6a4c74ff1a3 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -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 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(get_dist(get_turf(src), get_turf(A)) > 1) + to_chat(src, "You're too far from [A] to disguise it as a bomb.") + 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, "Success! Bomb on [A] armed!") + if(summoner) + to_chat(summoner, "Your guardian has primed [A] to explode!") + bomb_cooldown = world.time + 200 + B.spawner = src + B.disguise (A) + else + to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") + +/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, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") + qdel(src) + +/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) + to_chat(user, "The [src] was boobytrapped!") + 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, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") + stored_obj.loc = get_turf(loc) + qdel(src) + return + to_chat(spawner, "Success! Your trap on [src] caught [user]!") + 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, "Looks odd!") diff --git a/code/game/gamemodes/miniantags/guardian/types/charger.dm b/code/game/gamemodes/miniantags/guardian/types/charger.dm new file mode 100644 index 00000000000..39bf995967e --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/charger.dm @@ -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 Charger 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("[src] [ranged_message] at [A]!") + 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("[src] slams into [L]!", "[src] slams into you!") + 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 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm new file mode 100644 index 00000000000..1447f36e739 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -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 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(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 = 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) diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm new file mode 100644 index 00000000000..0a6efb45d06 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -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 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(loc == summoner) + to_chat(src, "You must be manifested to heal!") + 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, "You switch to combat mode.") + 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, "You switch to healing mode.") + toggle = TRUE + else + to_chat(src, "You have to be recalled to toggle modes!") + + +/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, "Beacon placed! You may now warp targets to it, including your user, via Alt+Click. ") + if(beacon) + beacon.ChangeTurf(/turf/simulated/floor/plating) + beacon = F + beacon_cooldown = world.time+3000 + + else + to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") + +/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(loc == summoner) + to_chat(src, "You must be manifested to warp a target!") + return + if(!beacon) + to_chat(src, "You need a beacon placed to warp things!") + return + if(!Adjacent(A)) + to_chat(src, "You must be adjacent to your target!") + return + if((A.anchored)) + to_chat(src, "Your target can not be anchored!") + return + to_chat(src, "You begin to warp [A]") + 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, "The beacon isn't in a safe location!") + else + to_chat(src, "The beacon isn't in a safe location!") + else + to_chat(src, "You need a beacon to warp things!") + else + to_chat(src, "You need to hold still!") diff --git a/code/game/gamemodes/miniantags/guardian/types/lightning.dm b/code/game/gamemodes/miniantags/guardian/types/lightning.dm new file mode 100644 index 00000000000..ea11fc5cfdd --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/lightning.dm @@ -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 Lightning 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( + "[L] was shocked by the lightning chain!", \ + "You are shocked by the lightning chain!", \ + "You hear a heavy electrical crack." \ + ) + L.adjustFireLoss(1.2) //adds up very rapidly + . = 1 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm new file mode 100644 index 00000000000..aa8bcaf09dc --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm @@ -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 Protector 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("The explosion glances off [src]'s energy shielding!") + +/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, "You switch to combat mode.") + 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, "You switch to protection mode.") + 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, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!") + visible_message("[src] jumps back to its user.") + Recall(TRUE) + else + to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [src]!") + summoner.visible_message("[summoner] jumps back to their protector.") + 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 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm new file mode 100644 index 00000000000..648339743fd --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -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 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(loc == summoner) + if(toggle) + ranged = 1 + melee_damage_lower = 10 + melee_damage_upper = 10 + alpha = 255 + range = 13 + incorporeal_move = 0 + to_chat(src, "You switch to combat mode.") + toggle = FALSE + else + ranged = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + alpha = 60 + range = 255 + incorporeal_move = 1 + to_chat(src, "You switch to scout mode.") + toggle = TRUE + else + to_chat(src, "You have to be recalled to toggle modes!") + +/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() + if(see_invisible == SEE_INVISIBLE_MINIMUM) + to_chat(src, "You deactivate your night vision.") + see_invisible = SEE_INVISIBLE_LIVING + else + to_chat(src, "You activate your night vision.") + 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, "Surveillance trap deployed!") + else + to_chat(src, "You have too many traps deployed. Delete some first.") + +/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, "Snare disarmed.") + +/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, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") + 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, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") diff --git a/code/game/gamemodes/miniantags/guardian/types/standard.dm b/code/game/gamemodes/miniantags/guardian/types/standard.dm new file mode 100644 index 00000000000..10327778a65 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/standard.dm @@ -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 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/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("[src] punches [target]!") + 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 \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 5ce318bf273..5d3c958de34 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -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, "Look below you on the floor for the extra uplink") 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 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index d250200236d..1e4671998e8 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -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) \ No newline at end of file + set_antag_hud(shadow_mind.current, null) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 55d1a2f8db7..2965456c99b 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -363,7 +363,7 @@ var/mob/living/carbon/human/H = target H.visible_message("[H]'s skin suddenly bubbles and shifts around their body!", \ "You regenerate your protective armor and cleanse your form of defects.") - 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) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index cfe4de51e4f..353fd328f4c 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -96,6 +96,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(10) to_chat(H, "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.") + 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)) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 0d44481cc3f..9509316f787 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -319,6 +319,7 @@ return 0 if(!affects(C)) C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") + return 0 if(!ishuman(C)) to_chat(user, "You can only enthrall humans!") return 0 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index b7c7961e5de..ee6493973e5 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -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. diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 91687844329..62996473291 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -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 ..() diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index b785297bd06..8057c6edf23 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -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 diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 231a50bf802..d3f1f25a52d 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -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 diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 44ac6caf479..45dcb5f7880 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -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) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index acdb4d30aa0..4fca317bf0d 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -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 diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 2d714606610..17f671d9cc8 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -41,7 +41,7 @@ return -/obj/machinery/portable_atmospherics/scrubber/process() +/obj/machinery/portable_atmospherics/scrubber/process_atmos() ..() if(!on) diff --git a/code/game/machinery/atmoalter/zvent.dm b/code/game/machinery/atmoalter/zvent.dm index e3ac09e8f09..a9d288fe37e 100644 --- a/code/game/machinery/atmoalter/zvent.dm +++ b/code/game/machinery/atmoalter/zvent.dm @@ -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 diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ccfa885a5d2..dbe860ec0cd 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -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() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 0631095fab2..72faedec4c6 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -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 diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 36647ebfc16..4235fa2a9ef 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -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 \ No newline at end of file diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index d260df8c9b9..4746a2b2f10 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -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) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index a95fee5fe2f..1eef8430d7b 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -372,7 +372,7 @@ scantemp = "Error: No signs of intelligence detected." nanomanager.update_uis(src) return - if(subject.suiciding == 1 && src.scanner.scan_level < 2) + if(subject.suiciding) scantemp = "Error: Subject's brain is not responding to scanning stimuli." nanomanager.update_uis(src) return diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 2b3d461da4c..138e55f7add 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -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) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index c4aefaa555d..2643908bab5 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -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("

Error: permission denied.

") + //to_chat(usr, "Error: permission denied.") + 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("

Criminal Status

", buttons) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 8e026cfd80a..938011c1fc8 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -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 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a0b72ed5074..80a4a36ee44 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -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) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 818f251024c..39fa5e04037 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -46,7 +46,7 @@
Admission data:

Log generated at: [worldtime2text()]
Detainee: [logname]
- Duration: [timetoset/10] seconds
+ Duration: [seconds_to_time(timetoset / 10)]
Charge(s): [logcharges]
Arresting Officer: [usr.name]


This log file was generated automatically upon activation of a cell timer."} @@ -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]
" // Controls - dat += "- - + +
" + dat += "Input Time" // 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 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index bda658ef128..0f397a51dbb 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -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) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 901ea27a7df..b8244771de0 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -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) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 7775744ba45..543ea80f490 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -47,14 +47,14 @@ if(operation == 1) // Play if(working == 1) return - if(!account || account.money < 10) + if(!account || account.money < 100) return - if(!account.charge(10, transaction_purpose = "Bet", dest_name = name)) + if(!account.charge(100, transaction_purpose = "Bet", dest_name = name)) return plays += 1 working = 1 icon_state = "slots-on" - var/roll = rand(1,1350) + var/roll = rand(1,20000) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) spawn(25) if(roll == 1) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index ccd4cbce638..aebd54401a6 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -9,6 +9,8 @@ var/variance = 0 var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter var/projectile_delay = 0 + var/projectiles + var/projectile_energy_cost /obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj) if(..()) @@ -50,6 +52,7 @@ A.preparePixelProjectile(target, targloc, chassis.occupant, params, spread) chassis.use_power(energy_drain) + projectiles-- A.fire() playsound(chassis, fire_sound, 50, 1) @@ -243,8 +246,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic name = "General Ballisic Weapon" - var/projectiles - var/projectile_energy_cost size = 2 /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(atom/target) if(..()) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index d386fe07d0b..106c60dc650 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -58,6 +58,10 @@ /obj/effect/mine/dnascramble/mineEffect(mob/living/victim) victim.apply_effect(radiation_amount, IRRADIATE, 0) + if(ishuman(victim)) + var/mob/living/carbon/human/V = victim + if(NO_DNA in V.species.species_traits) + return randmutb(victim) domutcheck(victim ,null) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 2dd8502d662..96f52929da6 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -277,4 +277,11 @@ /obj/effect/overlay/temp/cult/turf/open/floor icon_state = "floorglow" - duration = 5 \ No newline at end of file + duration = 5 + +/obj/effect/overlay/temp/shieldflash + icon_state = "shield-flash" + duration = 3 + +/obj/effect/overlay/temp/shieldflash/New(var/flash_color) + diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index c59e39a2043..20c21ca73d0 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -21,6 +21,11 @@ if(!user.can_speak()) to_chat(user, "You find yourself unable to speak at all.") return + if(ishuman(user)) + var/mob/living/carbon/human/abductor/H = user + if(H && H.mind.abductor) + to_chat(user, "Megaphones can't project psionic communication!") + return if(ishuman(user)) var/mob/living/carbon/human/H = user if(H && H.mind && H.mind.miming) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 3d1f1001b06..67009e3366d 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -675,6 +675,13 @@ var/global/list/default_medbay_channels = list( ..() set_frequency(DTH_FREQ) +/obj/item/device/radio/borg/ert + keyslot = new /obj/item/device/encryptionkey/ert + +/obj/item/device/radio/borg/ert/New() + ..() + set_frequency(ERT_FREQ) + /obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob, params) // ..() user.set_machine(src) diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index 5cc0ab739c0..b5d0066a706 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -3,13 +3,14 @@ // ------------------------------------- /obj/item/toy/random name = "Random Toy" - New() - ..() - var/list/types = list(/obj/item/weapon/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize) - var/T = pick(types) - new T(loc) - spawn(1) - qdel(src) + +/obj/item/toy/random/New() + ..() + var/list/types = list(/obj/item/weapon/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize) + var/T = pick(types) + new T(loc) + spawn(1) + qdel(src) // ------------------------------------- // Random cleanables, clearly this makes sense @@ -17,24 +18,26 @@ /obj/effect/decal/cleanable/random name = "Random Mess" - New() - ..() - var/list/list = subtypesof(/obj/effect/decal/cleanable) - list(/obj/effect/decal/cleanable/random,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2) - var/T = pick(list) - new T(loc) - spawn(0) - qdel(src) + +/obj/effect/decal/cleanable/random/New() + ..() + var/list/list = subtypesof(/obj/effect/decal/cleanable) - list(/obj/effect/decal/cleanable/random,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2) + var/T = pick(list) + new T(loc) + spawn(0) + qdel(src) /obj/item/stack/sheet/animalhide/random name = "random animal hide" - New() - ..() - spawn(1) - var/htype = pick(/obj/item/stack/sheet/animalhide/cat,/obj/item/stack/sheet/animalhide/corgi,/obj/item/stack/sheet/animalhide/human,/obj/item/stack/sheet/animalhide/lizard,/obj/item/stack/sheet/animalhide/monkey) - var/obj/item/stack/S = new htype(loc) - S.amount = amount - qdel(src) + +/obj/item/stack/sheet/animalhide/random/New() + ..() + spawn(1) + var/htype = pick(/obj/item/stack/sheet/animalhide/cat,/obj/item/stack/sheet/animalhide/corgi,/obj/item/stack/sheet/animalhide/human,/obj/item/stack/sheet/animalhide/lizard,/obj/item/stack/sheet/animalhide/monkey) + var/obj/item/stack/S = new htype(loc) + S.amount = amount + qdel(src) // ------------------------------------- // Not yet identified chemical. @@ -43,103 +46,108 @@ /obj/item/weapon/reagent_containers/glass/bottle/random_reagent name = "unlabelled bottle" -// identify_probability = 0 - New() - ..() - var/datum/reagent/R = pick(chemical_reagents_list) - if(rare_chemicals.Find(R)) - reagents.add_reagent(R,10) - else - reagents.add_reagent(R,rand(2,3)*10) - pixel_x = rand(-10,10) - pixel_y = rand(-10,10) + // identify_probability = 0 + +/obj/item/weapon/reagent_containers/glass/bottle/random_reagent/New() + ..() + var/list/possible_chems = chemical_reagents_list.Copy() + possible_chems -= blocked_chems.Copy() + var/datum/reagent/R = pick(possible_chems) + if(rare_chemicals.Find(R)) + reagents.add_reagent(R, 10) + else + reagents.add_reagent(R, rand(2, 3)*10) + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) //Cuts out the food and drink reagents /obj/item/weapon/reagent_containers/glass/bottle/random_chem name = "unlabelled chemical bottle" -// identify_probability = 0 - New() - ..() + // identify_probability = 0 - var/datum/reagent/R = pick(standard_chemicals + rare_chemicals) - if(rare_chemicals.Find(R)) - reagents.add_reagent(R,10) - else - reagents.add_reagent(R,rand(2,3)*10) - name = "unlabelled bottle" - pixel_x = rand(-10,10) - pixel_y = rand(-10,10) +/obj/item/weapon/reagent_containers/glass/bottle/random_chem/New() + ..() + var/R = get_random_reagent_id() + if(rare_chemicals.Find(R)) + reagents.add_reagent(R, 10) + else + reagents.add_reagent(R, rand(2, 3)*10) + name = "unlabelled bottle" + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) /obj/item/weapon/reagent_containers/glass/bottle/random_base_chem name = "unlabelled chemical bottle" -// identify_probability = 0 - New() - ..() - var/datum/reagent/R = pick(base_chemicals) - reagents.add_reagent(R,rand(2,6)*5) - name = "unlabelled bottle" - pixel_x = rand(-10,10) - pixel_y = rand(-10,10) + // identify_probability = 0 + +/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem/New() + ..() + var/datum/reagent/R = pick(base_chemicals) + reagents.add_reagent(R, rand(2, 6)*5) + name = "unlabelled bottle" + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) /obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink name = "unlabelled drink" icon = 'icons/obj/drinks.dmi' - New() - ..() - var/list/additional_drinks = list() - if(prob(50)) - additional_drinks += list("pancuronium","lsd","omnizine","blood") - var/datum/reagent/R = pick(drinks + additional_drinks) - reagents.add_reagent(R,volume) - name = "unlabelled bottle" - icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red") - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) +/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink/New() + ..() + var/list/possible_drinks = drinks.Copy() + if(prob(50)) + possible_drinks += list("pancuronium","lsd","omnizine","blood") + + var/datum/reagent/R = pick(possible_drinks) + reagents.add_reagent(R, volume) + name = "unlabelled bottle" + icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red") + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) /obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent // Same as the chembottle code except the container name = "unlabelled drink?" icon = 'icons/obj/drinks.dmi' - New() - ..() - var/datum/reagent/R = pick(chemical_reagents_list) - if(rare_chemicals.Find(R)) - reagents.add_reagent(R,10) - else - reagents.add_reagent(R,rand(3,10)*10) - name = "unlabelled bottle" - icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red") - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) - spawn(0) - qdel(src) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent/New() + ..() + + var/R = get_random_reagent_id() + if(rare_chemicals.Find(R)) + reagents.add_reagent(R, 10) + else + reagents.add_reagent(R, rand(3, 10)*10) + name = "unlabelled bottle" + icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red") + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + spawn(0) + qdel(src) /obj/item/weapon/storage/pill_bottle/random_meds name = "unlabelled pillbottle" desc = "The sheer recklessness of this bottle's existence astounds you." - New() - ..() - var/i = 1 - while(i < storage_slots) +/obj/item/weapon/storage/pill_bottle/random_meds/New() + ..() + var/i = 1 + while(i < storage_slots) + var/list/possible_medicines = standard_medicines.Copy() + if(prob(50)) + possible_medicines += rare_medicines.Copy() + var/datum/reagent/R = pick(possible_medicines) + var/obj/item/weapon/reagent_containers/food/pill/P = new(src) - var/datum/reagent/R - if(prob(50)) - R = pick(standard_medicines + rare_medicines) - else - R = pick(standard_medicines) - var/obj/item/weapon/reagent_containers/food/pill/P = new(src) + if(rare_medicines.Find(R)) + P.reagents.add_reagent(R, 10) + else + P.reagents.add_reagent(R, rand(2, 5)*10) + P.name = "Unlabelled Pill" + P.desc = "Something about this pill entices you to try it, against your better judgement." + i++ + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) - if(rare_medicines.Find(R)) - P.reagents.add_reagent(R,10) - else - P.reagents.add_reagent(R,rand(2,5)*10) - P.name = "Unlabelled Pill" - P.desc = "Something about this pill entices you to try it, against your better judgement." - i++ - pixel_x = rand(-10,10) - pixel_y = rand(-10,10) - return // ------------------------------------- // Containers full of unknown crap @@ -150,43 +158,43 @@ desc = "Crate full of chemicals of unknown type and value from a 'trusted' source." req_one_access = list(access_chemistry,access_research,access_qm) // the qm knows a guy, you see. - New() - ..() - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src) - new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src) - while(prob(50)) - new/obj/item/weapon/reagent_containers/glass/bottle/random_reagent(src) +/obj/structure/closet/crate/secure/unknownchemicals/New() + ..() + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src) + new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src) + while(prob(50)) + new/obj/item/weapon/reagent_containers/glass/bottle/random_reagent(src) + new/obj/item/weapon/storage/pill_bottle/random_meds(src) + while(prob(25)) new/obj/item/weapon/storage/pill_bottle/random_meds(src) - while(prob(25)) - new/obj/item/weapon/storage/pill_bottle/random_meds(src) /obj/structure/closet/crate/secure/chemicals - name = "chemical supply kit" - desc = "Full of basic chemistry supplies." - req_one_access = list(access_chemistry,access_research) + name = "chemical supply kit" + desc = "Full of basic chemistry supplies." + req_one_access = list(access_chemistry,access_research) - New() - ..() - for(var/chem in standard_chemicals) - var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src) - B.reagents.add_reagent(chem,B.volume) - if(prob(85)) - var/datum/reagent/r = chemical_reagents_list[chem] - B.name = "[r.name] bottle" -// B.identify_probability = 100 - else - B.name = "unlabelled bottle" - B.desc = "Looks like the label fell off." -// B.identify_probability = 0 +/obj/structure/closet/crate/secure/chemicals/New() + ..() + for(var/chem in standard_chemicals) + var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src) + B.reagents.add_reagent(chem, B.volume) + if(prob(85)) + var/datum/reagent/r = chemical_reagents_list[chem] + B.name = "[r.name] bottle" +// B.identify_probability = 100 + else + B.name = "unlabelled bottle" + B.desc = "Looks like the label fell off." +// B.identify_probability = 0 /* /obj/structure/closet/crate/bin/flowers @@ -235,15 +243,15 @@ icon_broken = "cabinetdetective_broken" icon_off = "cabinetdetective_broken" - New() - ..() - new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) - new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) - new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) - new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) - new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) - while(prob(25)) - new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent(src) +/obj/structure/closet/secure_closet/random_drinks/New() + ..() + new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) + while(prob(25)) + new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent(src) // ------------------------------------- @@ -257,23 +265,23 @@ name = "\improper Mysterious Crate" desc = "What could it be?" - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/crowbar)) - var/list/menace = pick( /mob/living/simple_animal/hostile/carp,/mob/living/simple_animal/hostile/faithless,/mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/creature,/mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/hivebot,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/pirate) +/obj/structure/largecrate/evil/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/crowbar)) + var/list/menace = pick( /mob/living/simple_animal/hostile/carp,/mob/living/simple_animal/hostile/faithless,/mob/living/simple_animal/hostile/pirate, + /mob/living/simple_animal/hostile/creature,/mob/living/simple_animal/hostile/pirate/ranged, + /mob/living/simple_animal/hostile/hivebot,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/pirate) - visible_message("Something falls out of the [src]!") - var/obj/item/weapon/grenade/clusterbuster/C = new(src.loc) - C.prime() - spawn(10) - new menace(src.loc) - while(prob(15)) - new menace(get_step_rand(src.loc)) - ..() - return 1 - else - return ..() + visible_message("Something falls out of the [src]!") + var/obj/item/weapon/grenade/clusterbuster/C = new(src.loc) + C.prime() + spawn(10) + new menace(src.loc) + while(prob(15)) + new menace(get_step_rand(src.loc)) + ..() + return 1 + else + return ..() // @@ -288,22 +296,22 @@ name = "Schrodinger's Crate" desc = "What happens if you open it?" - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/crowbar)) - var/mob/living/simple_animal/pet/cat/Cat1 = new(loc) - Cat1.apply_damage(250)//,TOX) - Cat1.name = "Schrodinger's Cat" - Cat1.desc = "It seems it's been dead for a while." +/obj/structure/largecrate/schrodinger/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/crowbar)) + var/mob/living/simple_animal/pet/cat/Cat1 = new(loc) + Cat1.apply_damage(250)//,TOX) + Cat1.name = "Schrodinger's Cat" + Cat1.desc = "It seems it's been dead for a while." - var/mob/living/simple_animal/pet/cat/Cat2 = new(loc) - Cat2.name = "Schrodinger's Cat" - Cat2.desc = "It's was alive the whole time!" - sleep(2) - if(prob(50)) - qdel(Cat1) - else - qdel(Cat2) - return ..() + var/mob/living/simple_animal/pet/cat/Cat2 = new(loc) + Cat2.name = "Schrodinger's Cat" + Cat2.desc = "It's was alive the whole time!" + sleep(2) + if(prob(50)) + qdel(Cat1) + else + qdel(Cat2) + return ..() // -------------------------------------- // Collen's box of wonder and mystery @@ -318,18 +326,18 @@ /obj/item/weapon/grenade/chem_grenade/dirt, /obj/item/weapon/grenade/chem_grenade/lube, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/grenade/chem_grenade/drugs, /obj/item/weapon/grenade/chem_grenade/ethanol) // holy list batman - New() - ..() - var/nade1 = pick(grenadelist) - var/nade2 = pick(grenadelist) - var/nade3 = pick(grenadelist) - var/nade4 = pick(grenadelist) - var/nade5 = pick(grenadelist) - var/nade6 = pick(grenadelist) +/obj/item/weapon/storage/box/grenades/New() + ..() + var/nade1 = pick(grenadelist) + var/nade2 = pick(grenadelist) + var/nade3 = pick(grenadelist) + var/nade4 = pick(grenadelist) + var/nade5 = pick(grenadelist) + var/nade6 = pick(grenadelist) - new nade1(src) - new nade2(src) - new nade3(src) - new nade4(src) - new nade5(src) - new nade6(src) + new nade1(src) + new nade2(src) + new nade3(src) + new nade4(src) + new nade5(src) + new nade6(src) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index a4fcc1db00b..2d790a8df1f 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -16,8 +16,9 @@ playsound(M, 'sound/weapons/Genhit.ogg', 50, 1) return 0 - if(!user.cell.use(charge_cost)) - return + if(isrobot(user)) + if(!user.cell.use(charge_cost)) + return user.do_attack_animation(M) M.Weaken(5) @@ -229,4 +230,4 @@ playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3) cooldown = world.time + 600 - log_game("[key_name(user)] used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])") \ No newline at end of file + log_game("[key_name(user)] used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])") diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 3be1404a030..3ffdfaaf751 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -207,6 +207,7 @@ to_chat(user, "[H]'s [limb] is already splinted!") if(alert(user, "Would you like to remove the splint from [H]'s [limb]?", "Removing.", "Yes", "No") == "Yes") affecting.status &= ~ORGAN_SPLINTED + H.handle_splints() to_chat(user, "You remove the splint from [H]'s [limb].") return if(M == user) @@ -221,4 +222,7 @@ "You hear something being wrapped.") affecting.status |= ORGAN_SPLINTED + affecting.splinted_count = H.step_count + H.handle_splints() + use(1) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 024783359b5..9601b86beec 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -15,7 +15,6 @@ materials = list(MAT_METAL=500) origin_tech = "combat=1;plasmatech=2;engineering=2" var/status = 0 - var/throw_amount = 100 var/lit = 0 //on or off var/operating = 0//cooldown var/turf/previousturf = null @@ -124,7 +123,7 @@ if(!ptank) to_chat(user, "Attach a plasma tank first!") return - var/dat = text("Flamethrower ([lit ? "Lit" : "Unlit"])
\n Tank Pressure: [ptank.air_contents.return_pressure()]
\nAmount to throw: - - - [throw_amount] + + +
\nRemove plasmatank - Close
") + var/dat = text("Flamethrower ([lit ? "Lit" : "Unlit"])
\n Tank Pressure: [ptank.air_contents.return_pressure()]
\nRemove plasmatank - Close
") user << browse(dat, "window=flamethrower;size=600x300") onclose(user, "flamethrower") return @@ -143,9 +142,6 @@ lit = !lit if(lit) processing_objects.Add(src) - if(href_list["amount"]) - throw_amount = throw_amount + text2num(href_list["amount"]) - throw_amount = max(50, min(5000, throw_amount)) if(href_list["remove"]) if(!ptank) return usr.put_in_hands(ptank) @@ -191,10 +187,8 @@ /obj/item/weapon/flamethrower/proc/ignite_turf(turf/target, release_amount = 0.05) - //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... - //Transfer 5% of current tank air contents to turf var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount) - air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE + air_transfer.toxins = air_transfer.toxins // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE target.assume_air(air_transfer) //Burn it based on transfered gas target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 8c723ed8b72..e60669d4f36 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -22,6 +22,8 @@ var/ignition_temp = 10 // The amount of heat added to the reagents when this grenade goes off. var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy. var/no_splash = FALSE //If the grenade deletes even if it has no reagents to splash with. Used for slime core reactions. + var/contained = "" // For logging + var/cores = "" // Also for logging /obj/item/weapon/grenade/chem_grenade/New() create_reagents(1000) @@ -98,9 +100,9 @@ update_icon() else if(clown_check(user)) // This used to go before the assembly check, but that has absolutely zero to do with priming the damn thing. You could spam the admins with it. - message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP)") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") - bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" + message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP) [contained].") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) [contained].") + bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])[contained]." to_chat(user, "You prime the [name]! [det_time / 10] second\s!") playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) active = 1 @@ -136,8 +138,8 @@ playsound(loc, prime_sound, 25, -3) stage = READY update_icon() - var/contained = "" - var/cores = "" + contained = "" + cores = "" // clear them out so no recursive logging by accidentally for(var/obj/O in beakers) if(!O.reagents) continue if(istype(O,/obj/item/slime_extract)) @@ -287,8 +289,8 @@ var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) var/turf/T = get_turf(src) var/area/A = get_area(T) - message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M)]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") - log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M)]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z]) [contained]") update_mob() diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 64b7dfcdf76..d721aadfbed 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -28,7 +28,7 @@ /obj/item/weapon/nullrod/attack_self(mob/user) if(reskinned) return - if(user.mind && (user.mind.assigned_role == "Chaplain")) + if(user.mind && (user.mind.assigned_role == "Chaplain" || user.mind.special_role == SPECIAL_ROLE_ERT)) reskin_holy_weapon(user) /obj/item/weapon/nullrod/proc/reskin_holy_weapon(mob/M) @@ -335,7 +335,7 @@ /obj/item/weapon/nullrod/carp/attack_self(mob/living/user) if(used_blessing) return - if(user.mind && (user.mind.assigned_role != "Chaplain")) + if(user.mind && (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT)) return to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.") user.faction |= "carp" @@ -406,7 +406,7 @@ if(!iscarbon(M)) return ..() - if(!user.mind || user.mind.assigned_role != "Chaplain") + if(!user.mind || (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT)) to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") return @@ -469,7 +469,7 @@ /obj/item/weapon/nullrod/salt/attack_self(mob/user) - if(!user.mind || user.mind.assigned_role != "Chaplain") + if(!user.mind || (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT )) to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") return diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index 47b993b6007..5d4c88f08c3 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -76,6 +76,8 @@ log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") activated = 1 + if(jobban_isbanned(M, ROLE_SYNDICATE)) + ticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) return 1 return 0 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 8996f97fbea..9758fe3d4f9 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -171,6 +171,7 @@ icon_state = "yellow slime extract" materials = list() self_recharge = 1 // Infused slime cores self-recharge, over time + chargerate = 500 /obj/item/weapon/stock_parts/cell/pulse //200 pulse shots name = "pulse rifle power cell" diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index ef49db0e449..862c39b31b4 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -58,8 +58,8 @@ //handle normal hair var/list/species_hair = list() if(C.species) - for(var/i in hair_styles_list) - var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + for(var/i in hair_styles_public_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i] if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles. if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. if(robohead.is_monitor) @@ -76,7 +76,7 @@ to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.") return else - species_hair = hair_styles_list + species_hair = hair_styles_public_list var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo) playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 4778a53c28b..a59879c8c50 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -62,8 +62,8 @@ /obj/item/weapon/tank/air name = "air tank" desc = "Mixed anyone?" - icon_state = "oxygen" - + icon_state = "air" + item_state = "air" /obj/item/weapon/tank/air/examine(mob/user) if(..(user, 0)) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 5229a59fe5f..5795b04bfa3 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -277,22 +277,22 @@ if(Adj) return //Safety check so you don't blast yourself trying to refill your tank var/datum/reagents/R = reagents - if(R.total_volume < 100) - to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!") + if(R.total_volume < 50) + to_chat(user, "You need at least 50 units of water to use the nanofrost launcher!") return if(nanofrost_cooldown) to_chat(user, "Nanofrost launcher is still recharging") return nanofrost_cooldown = 1 - R.remove_any(100) + R.remove_any(50) var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src)) log_game("[user.ckey] ([user.name]) used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).") playsound(src,'sound/items/syringeproj.ogg',40,1) for(var/a=0, a<5, a++) step_towards(A, target) - sleep(2) + sleep(1) A.Smoke() - spawn(100) + spawn(50) if(src) nanofrost_cooldown = 0 return diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 87197426495..4526af7f98d 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -341,6 +341,7 @@ if(G) explosive = G name = "explosive lance" + embed_chance = 0 desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!" update_icon() diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index c4595f2deb6..d951bca5a17 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -14,28 +14,28 @@ /obj/item/weapon/whetstone/attackby(obj/item/I, mob/user, params) if(used) - to_chat(user, "The whetstone is too worn to use again.") + to_chat(user, "The whetstone is too worn to use again!") return if(I.force >= max || I.throwforce >= max)//no esword sharpening - to_chat(user, "[I] is much too powerful to sharpen further.") + to_chat(user, "[I] is much too powerful to sharpen further!") return if(requires_sharpness && !I.sharp) - to_chat(user, "You can only sharpen items that are already sharp, such as knives.") + to_chat(user, "You can only sharpen items that are already sharp, such as knives!") return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff var/obj/item/weapon/twohanded/TH = I if(TH.force_wielded >= max) - to_chat(user, "[TH] is much too powerful to sharpen further.") + to_chat(user, "[TH] is much too powerful to sharpen further!") return if(TH.wielded) - to_chat(user, "[TH] must be unwielded before it can be sharpened.") + to_chat(user, "[TH] must be unwielded before it can be sharpened!") return if(TH.force_wielded > initial(TH.force_wielded)) - to_chat(user, "[TH] has already been refined before. It cannot be sharpened further.") + to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!") return TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) - to_chat(user, "[I] has already been refined before. It cannot be sharpened further.") + to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") if(!requires_sharpness) @@ -47,6 +47,7 @@ name = "worn out [name]" desc = "[desc] At least, it used to." used = 1 + update_icon() /obj/item/weapon/whetstone/attack_self(mob/user as mob) //This is just fluff for now. Species datums are global and not newly created instances, so we can't adjust unarmed damage on a per mob basis. if(ishuman(user)) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index d5b966c7d98..e989cea7e85 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -8,6 +8,8 @@ var/icon_opened = "open" var/opened = 0 var/welded = 0 + var/locked = 0 + var/broken = 0 var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 var/lastbang diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index aeb8101fc75..5baef28f262 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -11,7 +11,7 @@ var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri opened = 1 var/hitstaken = 0 - var/locked = 1 + locked = 1 var/smashed = 0 attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 20a110f18d0..7a2856eb278 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -141,4 +141,3 @@ new /obj/item/clothing/suit/storage/paramedic(src) new /obj/item/weapon/tank/emergency_oxygen/engi(src) new /obj/item/weapon/tank/emergency_oxygen/engi(src) - new /obj/item/key/ambulance(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 49006fb7fb5..eb60d578e46 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -10,19 +10,18 @@ burn_state = FLAMMABLE burntime = 20 - - New() - ..() - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) +/obj/structure/closet/secure_closet/bar/New() + ..() + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) /obj/structure/closet/secure_closet/bar/update_icon() if(broken) @@ -34,4 +33,4 @@ else icon_state = icon_closed else - icon_state = icon_opened \ No newline at end of file + icon_state = icon_opened diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 74b811eae24..ee5ea755e04 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -8,16 +8,17 @@ icon_broken = "securecargobroken" icon_off = "securecargooff" - New() - ..() - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/under/rank/cargotech/skirt(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/head/soft(src) +/obj/structure/closet/secure_closet/cargotech/New() + ..() + new /obj/item/clothing/under/rank/cargotech(src) + new /obj/item/clothing/under/rank/cargotech/skirt(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/head/soft(src) // new /obj/item/weapon/cartridge/quartermaster(src) + /obj/structure/closet/secure_closet/quartermaster name = "quartermaster's locker" req_access = list(access_qm) @@ -28,16 +29,16 @@ icon_broken = "secureqmbroken" icon_off = "secureqmoff" - New() - ..() - new /obj/item/clothing/under/rank/cargo(src) - new /obj/item/clothing/under/rank/cargo/skirt(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/suit/fire/firefighter(src) - new /obj/item/weapon/tank/emergency_oxygen(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/clothing/head/soft(src) - new /obj/item/weapon/door_remote/quartermaster(src) \ No newline at end of file +/obj/structure/closet/secure_closet/quartermaster/New() + ..() + new /obj/item/clothing/under/rank/cargo(src) + new /obj/item/clothing/under/rank/cargo/skirt(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/weapon/tank/emergency_oxygen(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/clothing/head/soft(src) + new /obj/item/weapon/door_remote/quartermaster(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 1af8b2653b8..d8b4d6906a4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -8,33 +8,34 @@ icon_broken = "securecebroken" icon_off = "secureceoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/weapon/storage/backpack/duffel/engineering(src) - new /obj/item/clothing/head/beret/ce(src) - new /obj/item/areaeditor/blueprints(src) - new /obj/item/weapon/storage/box/permits(src) - new /obj/item/clothing/under/rank/chief_engineer(src) - new /obj/item/clothing/under/rank/chief_engineer/skirt(src) - new /obj/item/clothing/head/hardhat/white(src) - new /obj/item/clothing/glasses/welding/superior(src) - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/weapon/cartridge/ce(src) - new /obj/item/device/radio/headset/heads/ce(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/multitool(src) - new /obj/item/device/flash(src) - new /obj/item/taperoll/engineering(src) - new /obj/item/clothing/head/beret/eng(src) - new /obj/item/weapon/door_remote/chief_engineer(src) - new /obj/item/weapon/rpd(src) +/obj/structure/closet/secure_closet/engineering_chief/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/industrial(src) + else + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/weapon/storage/backpack/duffel/engineering(src) + new /obj/item/clothing/head/beret/ce(src) + new /obj/item/areaeditor/blueprints(src) + new /obj/item/weapon/storage/box/permits(src) + new /obj/item/clothing/under/rank/chief_engineer(src) + new /obj/item/clothing/under/rank/chief_engineer/skirt(src) + new /obj/item/clothing/head/hardhat/white(src) + new /obj/item/clothing/glasses/welding/superior(src) + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/weapon/cartridge/ce(src) + new /obj/item/device/radio/headset/heads/ce(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/device/multitool(src) + new /obj/item/device/flash(src) + new /obj/item/taperoll/engineering(src) + new /obj/item/clothing/head/beret/eng(src) + new /obj/item/weapon/door_remote/chief_engineer(src) + new /obj/item/weapon/rpd(src) + /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -46,22 +47,20 @@ icon_broken = "secureengelecbroken" icon_off = "secureengelecoff" - - New() - ..() - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/apc_electronics(src) - new /obj/item/weapon/apc_electronics(src) - new /obj/item/weapon/apc_electronics(src) - new /obj/item/device/multitool(src) - new /obj/item/device/multitool(src) - new /obj/item/device/multitool(src) - new /obj/item/clothing/head/beret/eng - +/obj/structure/closet/secure_closet/engineering_electrical/New() + ..() + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/weapon/storage/toolbox/electrical(src) + new /obj/item/weapon/storage/toolbox/electrical(src) + new /obj/item/weapon/storage/toolbox/electrical(src) + new /obj/item/weapon/apc_electronics(src) + new /obj/item/weapon/apc_electronics(src) + new /obj/item/weapon/apc_electronics(src) + new /obj/item/device/multitool(src) + new /obj/item/device/multitool(src) + new /obj/item/device/multitool(src) + new /obj/item/clothing/head/beret/eng /obj/structure/closet/secure_closet/engineering_welding @@ -74,16 +73,14 @@ icon_broken = "secureengweldbroken" icon_off = "secureengweldoff" - - New() - ..() - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/weldingtool/largetank(src) - +/obj/structure/closet/secure_closet/engineering_welding/New() + ..() + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/weapon/weldingtool/largetank(src) + new /obj/item/weapon/weldingtool/largetank(src) + new /obj/item/weapon/weldingtool/largetank(src) /obj/structure/closet/secure_closet/engineering_personal @@ -96,24 +93,24 @@ icon_broken = "secureengbroken" icon_off = "secureengoff" +/obj/structure/closet/secure_closet/engineering_personal/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/industrial(src) + else + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/weapon/storage/backpack/duffel/engineering(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/clothing/under/rank/engineer(src) + new /obj/item/clothing/under/rank/engineer/skirt(src) + new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/weapon/cartridge/engineering(src) + new /obj/item/taperoll/engineering(src) + new /obj/item/clothing/head/beret/eng(src) - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/weapon/storage/backpack/duffel/engineering(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/under/rank/engineer/skirt(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/weapon/cartridge/engineering(src) - new /obj/item/taperoll/engineering(src) - new /obj/item/clothing/head/beret/eng(src) /obj/structure/closet/secure_closet/atmos_personal name = "technician's locker" @@ -125,23 +122,22 @@ icon_broken = "secureatmbroken" icon_off = "secureatmoff" - - New() - ..() - new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/weapon/cartridge/atmos(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/taperoll/engineering(src) - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/weapon/storage/backpack/duffel/atmos(src) - new /obj/item/weapon/extinguisher(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) - new /obj/item/weapon/watertank/atmos(src) - new /obj/item/clothing/suit/fire/atmos(src) - new /obj/item/clothing/head/hardhat/atmos(src) - new /obj/item/weapon/rpd(src) +/obj/structure/closet/secure_closet/atmos_personal/New() + ..() + new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/weapon/cartridge/atmos(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/taperoll/engineering(src) + if(prob(50)) + new /obj/item/weapon/storage/backpack/industrial(src) + else + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/weapon/storage/backpack/duffel/atmos(src) + new /obj/item/weapon/extinguisher(src) + new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/watertank/atmos(src) + new /obj/item/clothing/suit/fire/atmos(src) + new /obj/item/clothing/head/hardhat/atmos(src) + new /obj/item/weapon/rpd(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index b0e7c0e00cb..36a1241826f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -23,6 +23,7 @@ if(!isemptylist(bombs)) // You're fucked. ..(severity) + /obj/structure/closet/secure_closet/freezer/kitchen name = "kitchen cabinet" req_access = list(access_kitchen) @@ -35,12 +36,10 @@ new /obj/item/weapon/reagent_containers/food/condiment/sugar(src) - /obj/structure/closet/secure_closet/freezer/kitchen/mining req_access = list() - /obj/structure/closet/secure_closet/freezer/meat name = "meat fridge" icon_state = "fridge1" @@ -50,12 +49,10 @@ icon_broken = "fridgebroken" icon_off = "fridge1" - - New() - ..() - for(var/i in 1 to 4) - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) - +/obj/structure/closet/secure_closet/freezer/meat/New() + ..() + for(var/i in 1 to 4) + new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) /obj/structure/closet/secure_closet/freezer/fridge @@ -67,15 +64,13 @@ icon_broken = "fridgebroken" icon_off = "fridge1" - - New() - ..() - for(var/i in 1 to 5) - new /obj/item/weapon/reagent_containers/food/condiment/milk(src) - new /obj/item/weapon/reagent_containers/food/condiment/soymilk(src) - for(var/i in 1 to 2) - new /obj/item/weapon/storage/fancy/egg_box(src) - +/obj/structure/closet/secure_closet/freezer/fridge/New() + ..() + for(var/i in 1 to 5) + new /obj/item/weapon/reagent_containers/food/condiment/milk(src) + new /obj/item/weapon/reagent_containers/food/condiment/soymilk(src) + for(var/i in 1 to 2) + new /obj/item/weapon/storage/fancy/egg_box(src) /obj/structure/closet/secure_closet/freezer/money @@ -96,10 +91,3 @@ new /obj/item/stack/spacecash/c500(src) for(var/i in 1 to 6) new /obj/item/stack/spacecash/c200(src) - - - - - - - diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index c0603396325..9f1783381f5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -9,20 +9,18 @@ icon_off = "medicaloff" req_access = list(access_medical) - - New() - ..() - new /obj/item/weapon/storage/box/autoinjectors(src) - new /obj/item/weapon/storage/box/syringes(src) - new /obj/item/weapon/reagent_containers/dropper(src) - new /obj/item/weapon/reagent_containers/dropper(src) - new /obj/item/weapon/reagent_containers/glass/beaker(src) - new /obj/item/weapon/reagent_containers/glass/beaker(src) - new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) - new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) - +/obj/structure/closet/secure_closet/medical1/New() + ..() + new /obj/item/weapon/storage/box/autoinjectors(src) + new /obj/item/weapon/storage/box/syringes(src) + new /obj/item/weapon/reagent_containers/dropper(src) + new /obj/item/weapon/reagent_containers/dropper(src) + new /obj/item/weapon/reagent_containers/glass/beaker(src) + new /obj/item/weapon/reagent_containers/glass/beaker(src) + new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) + new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) /obj/structure/closet/secure_closet/medical2 @@ -36,16 +34,14 @@ icon_off = "medicaloff" req_access = list(access_surgery) - - New() - ..() - new /obj/item/weapon/tank/anesthetic(src) - new /obj/item/weapon/tank/anesthetic(src) - new /obj/item/weapon/tank/anesthetic(src) - new /obj/item/clothing/mask/breath/medical(src) - new /obj/item/clothing/mask/breath/medical(src) - new /obj/item/clothing/mask/breath/medical(src) - +/obj/structure/closet/secure_closet/medical2/New() + ..() + new /obj/item/weapon/tank/anesthetic(src) + new /obj/item/weapon/tank/anesthetic(src) + new /obj/item/weapon/tank/anesthetic(src) + new /obj/item/clothing/mask/breath/medical(src) + new /obj/item/clothing/mask/breath/medical(src) + new /obj/item/clothing/mask/breath/medical(src) /obj/structure/closet/secure_closet/medical3 @@ -58,22 +54,23 @@ icon_broken = "securemedbroken" icon_off = "securemedoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/weapon/storage/backpack/duffel/medical(src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/device/radio/headset/headset_med(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) - new /obj/item/weapon/defibrillator/loaded(src) - new /obj/item/weapon/storage/belt/medical(src) - new /obj/item/clothing/glasses/hud/health(src) - new /obj/item/clothing/shoes/sandal/white(src) +/obj/structure/closet/secure_closet/medical3/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/medic(src) + else + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/weapon/storage/backpack/duffel/medical(src) + new /obj/item/clothing/under/rank/medical(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/weapon/defibrillator/loaded(src) + new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/clothing/glasses/hud/health(src) + new /obj/item/clothing/shoes/sandal/white(src) + //Exam Room /obj/structure/closet/secure_closet/exam @@ -87,23 +84,22 @@ icon_off = "medicaloff" req_access = list(access_medical) - - New() - ..() - new /obj/item/weapon/storage/box/syringes(src) - new /obj/item/weapon/reagent_containers/dropper(src) - new /obj/item/weapon/storage/belt/medical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/glasses/hud/health(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) - new /obj/item/clothing/accessory/stethoscope(src) - new /obj/item/device/flashlight/pen(src) - new /obj/item/weapon/storage/firstaid/regular(src) - new /obj/item/weapon/storage/firstaid/adv(src) - new /obj/item/weapon/storage/firstaid/brute(src) - new /obj/item/weapon/storage/firstaid/fire(src) - new /obj/item/weapon/storage/firstaid/o2(src) - new /obj/item/weapon/storage/firstaid/toxin(src) +/obj/structure/closet/secure_closet/exam/New() + ..() + new /obj/item/weapon/storage/box/syringes(src) + new /obj/item/weapon/reagent_containers/dropper(src) + new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/glasses/hud/health(src) + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/clothing/accessory/stethoscope(src) + new /obj/item/device/flashlight/pen(src) + new /obj/item/weapon/storage/firstaid/regular(src) + new /obj/item/weapon/storage/firstaid/adv(src) + new /obj/item/weapon/storage/firstaid/brute(src) + new /obj/item/weapon/storage/firstaid/fire(src) + new /obj/item/weapon/storage/firstaid/o2(src) + new /obj/item/weapon/storage/firstaid/toxin(src) // Psychiatrist's pill bottle @@ -128,12 +124,13 @@ icon_broken = "securemedbroken" icon_off = "securemedoff" - New() - ..() - new /obj/item/clothing/suit/straight_jacket(src) - new /obj/item/weapon/reagent_containers/syringe(src) - new /obj/item/weapon/reagent_containers/glass/bottle/ether(src) - new /obj/item/weapon/storage/pill_bottle/psychiatrist(src) +/obj/structure/closet/secure_closet/psychiatrist/New() + ..() + new /obj/item/clothing/suit/straight_jacket(src) + new /obj/item/weapon/reagent_containers/syringe(src) + new /obj/item/weapon/reagent_containers/glass/bottle/ether(src) + new /obj/item/weapon/storage/pill_bottle/psychiatrist(src) + /obj/structure/closet/secure_closet/CMO name = "chief medical officer's locker" @@ -145,52 +142,49 @@ icon_broken = "cmosecurebroken" icon_off = "cmosecureoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/weapon/storage/backpack/duffel/medical(src) - new /obj/item/clothing/suit/bio_suit/cmo(src) - new /obj/item/clothing/head/bio_hood/cmo(src) - new /obj/item/clothing/shoes/white(src) - switch(pick("blue", "green", "purple")) - if("blue") - new /obj/item/clothing/under/rank/medical/blue(src) - new /obj/item/clothing/head/surgery/blue(src) - if("green") - new /obj/item/clothing/under/rank/medical/green(src) - new /obj/item/clothing/head/surgery/green(src) - if("purple") - new /obj/item/clothing/under/rank/medical/purple(src) - new /obj/item/clothing/head/surgery/purple(src) - new /obj/item/clothing/suit/storage/labcoat/cmo(src) - new /obj/item/clothing/under/rank/chief_medical_officer(src) - new /obj/item/clothing/shoes/brown (src) - new /obj/item/device/radio/headset/heads/cmo(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) - new /obj/item/weapon/defibrillator/compact/loaded(src) - new /obj/item/weapon/storage/belt/medical(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/reagent_containers/hypospray/CMO(src) - new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src) - new /obj/item/weapon/door_remote/chief_medical_officer(src) - +/obj/structure/closet/secure_closet/CMO/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/medic(src) + else + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/weapon/storage/backpack/duffel/medical(src) + new /obj/item/clothing/suit/bio_suit/cmo(src) + new /obj/item/clothing/head/bio_hood/cmo(src) + new /obj/item/clothing/shoes/white(src) + switch(pick("blue", "green", "purple")) + if("blue") + new /obj/item/clothing/under/rank/medical/blue(src) + new /obj/item/clothing/head/surgery/blue(src) + if("green") + new /obj/item/clothing/under/rank/medical/green(src) + new /obj/item/clothing/head/surgery/green(src) + if("purple") + new /obj/item/clothing/under/rank/medical/purple(src) + new /obj/item/clothing/head/surgery/purple(src) + new /obj/item/clothing/suit/storage/labcoat/cmo(src) + new /obj/item/clothing/under/rank/chief_medical_officer(src) + new /obj/item/clothing/shoes/brown (src) + new /obj/item/device/radio/headset/heads/cmo(src) + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/weapon/defibrillator/compact/loaded(src) + new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/reagent_containers/hypospray/CMO(src) + new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src) + new /obj/item/weapon/door_remote/chief_medical_officer(src) /obj/structure/closet/secure_closet/animal name = "animal control locker" req_access = list(access_surgery) - - New() - ..() - new /obj/item/device/assembly/signaler(src) - new /obj/item/device/radio/electropack(src) - new /obj/item/device/radio/electropack(src) - new /obj/item/device/radio/electropack(src) - +/obj/structure/closet/secure_closet/animal/New() + ..() + new /obj/item/device/assembly/signaler(src) + new /obj/item/device/radio/electropack(src) + new /obj/item/device/radio/electropack(src) + new /obj/item/device/radio/electropack(src) /obj/structure/closet/secure_closet/chemical @@ -204,11 +198,11 @@ icon_off = "medicaloff" req_access = list(access_chemistry) +/obj/structure/closet/secure_closet/chemical/New() + ..() + new /obj/item/weapon/storage/box/pillbottles(src) + new /obj/item/weapon/storage/box/pillbottles(src) - New() - ..() - new /obj/item/weapon/storage/box/pillbottles(src) - new /obj/item/weapon/storage/box/pillbottles(src) /obj/structure/closet/secure_closet/medical_wall name = "first aid closet" @@ -247,13 +241,12 @@ icon_off = "medicaloff" req_access = list(access_paramedic) - - New() - ..() - new /obj/item/clothing/suit/space/eva/paramedic(src) - new /obj/item/clothing/head/helmet/space/eva/paramedic(src) - new /obj/item/clothing/head/helmet/space/eva/paramedic(src) - new /obj/item/device/sensor_device(src) +/obj/structure/closet/secure_closet/paramedic/New() + ..() + new /obj/item/clothing/suit/space/eva/paramedic(src) + new /obj/item/clothing/head/helmet/space/eva/paramedic(src) + new /obj/item/device/sensor_device(src) + new /obj/item/key/ambulance(src) /obj/structure/closet/secure_closet/reagents name = "chemical storage closet" @@ -266,12 +259,11 @@ icon_off = "chemicaloff" req_access = list(access_chemistry) - - New() - ..() - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/oil(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acid(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) +/obj/structure/closet/secure_closet/reagents/New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/oil(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acid(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 4d15ec55644..7e1b6d83091 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -8,19 +8,19 @@ icon_broken = "secureresbroken" icon_off = "secureresoff" - New() - ..() - new /obj/item/weapon/storage/backpack/science(src) - new /obj/item/weapon/storage/backpack/satchel_tox(src) - new /obj/item/clothing/under/rank/scientist(src) - //new /obj/item/clothing/suit/labcoat/science(src) - new /obj/item/clothing/suit/storage/labcoat/science(src) - new /obj/item/clothing/shoes/white(src) +/obj/structure/closet/secure_closet/scientist/New() + ..() + new /obj/item/weapon/storage/backpack/science(src) + new /obj/item/weapon/storage/backpack/satchel_tox(src) + new /obj/item/clothing/under/rank/scientist(src) + //new /obj/item/clothing/suit/labcoat/science(src) + new /obj/item/clothing/suit/storage/labcoat/science(src) + new /obj/item/clothing/shoes/white(src) // new /obj/item/weapon/cartridge/signal/toxins(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/shoes/sandal/white(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/weapon/tank/air(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/shoes/sandal/white(src) /obj/structure/closet/secure_closet/roboticist name = "roboticist's locker" @@ -32,18 +32,18 @@ icon_broken = "secureresbroken" icon_off = "secureresoff" - New() - ..() - new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/backpack(src) - new /obj/item/weapon/storage/backpack/satchel_norm(src) - new /obj/item/weapon/storage/backpack/satchel_norm(src) - new /obj/item/weapon/storage/backpack/duffel(src) - new /obj/item/weapon/storage/backpack/duffel(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/device/radio/headset/headset_sci(src) +/obj/structure/closet/secure_closet/roboticist/New() + ..() + new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/backpack/satchel_norm(src) + new /obj/item/weapon/storage/backpack/satchel_norm(src) + new /obj/item/weapon/storage/backpack/duffel(src) + new /obj/item/weapon/storage/backpack/duffel(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/device/radio/headset/headset_sci(src) /obj/structure/closet/secure_closet/RD name = "research director's locker" @@ -55,22 +55,23 @@ icon_broken = "rdsecurebroken" icon_off = "rdsecureoff" - New() - ..() - new /obj/item/clothing/suit/bio_suit/scientist(src) - new /obj/item/clothing/head/bio_hood/scientist(src) - new /obj/item/clothing/under/rank/research_director(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/weapon/cartridge/rd(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/device/radio/headset/heads/rd(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/suit/armor/reactive/teleport(src) - new /obj/item/device/flash(src) - new /obj/item/device/laser_pointer(src) - new /obj/item/weapon/door_remote/research_director(src) +/obj/structure/closet/secure_closet/RD/New() + ..() + new /obj/item/clothing/suit/bio_suit/scientist(src) + new /obj/item/clothing/head/bio_hood/scientist(src) + new /obj/item/clothing/under/rank/research_director(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/weapon/cartridge/rd(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/gloves/color/latex(src) + new /obj/item/device/radio/headset/heads/rd(src) + new /obj/item/weapon/tank/air(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/suit/armor/reactive/teleport(src) + new /obj/item/device/flash(src) + new /obj/item/device/laser_pointer(src) + new /obj/item/weapon/door_remote/research_director(src) + /obj/structure/closet/secure_closet/research_reagents name = "research chemical storage closet" @@ -83,20 +84,19 @@ icon_off = "rchemicaloff" req_access = list(access_tox_storage) - - New() - ..() - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/oil(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acid(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) \ No newline at end of file +/obj/structure/closet/secure_closet/research_reagents/New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/oil(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acid(src) + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 19dc1622ffe..72ef10a5cde 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -5,8 +5,8 @@ icon_state = "secure1" density = 1 opened = 0 - var/locked = 1 - var/broken = 0 + locked = 1 + broken = 0 var/large = 1 icon_closed = "secure" var/icon_locked = "secure1" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index ed2599e91dd..38a8fe42377 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -8,30 +8,29 @@ icon_broken = "capsecurebroken" icon_off = "capsecureoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/captain(src) - else - new /obj/item/weapon/storage/backpack/satchel_cap(src) - new /obj/item/weapon/book/manual/faxes(src) - new /obj/item/weapon/storage/backpack/duffel/captain(src) - new /obj/item/clothing/suit/captunic(src) - new /obj/item/clothing/suit/captunic/capjacket(src) - new /obj/item/clothing/under/captainparade(src) - new /obj/item/clothing/head/caphat/parade(src) - new /obj/item/clothing/under/rank/captain(src) - new /obj/item/clothing/under/dress/dress_cap(src) - new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src) - new /obj/item/weapon/cartridge/captain(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/shoes/laceup(src) - new /obj/item/device/radio/headset/heads/captain/alt(src) - new /obj/item/clothing/gloves/color/captain(src) - new /obj/item/weapon/storage/belt/rapier(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/weapon/door_remote/captain(src) - +/obj/structure/closet/secure_closet/captains/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/captain(src) + else + new /obj/item/weapon/storage/backpack/satchel_cap(src) + new /obj/item/weapon/book/manual/faxes(src) + new /obj/item/weapon/storage/backpack/duffel/captain(src) + new /obj/item/clothing/suit/captunic(src) + new /obj/item/clothing/suit/captunic/capjacket(src) + new /obj/item/clothing/under/captainparade(src) + new /obj/item/clothing/head/caphat/parade(src) + new /obj/item/clothing/under/rank/captain(src) + new /obj/item/clothing/under/dress/dress_cap(src) + new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src) + new /obj/item/weapon/cartridge/captain(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/device/radio/headset/heads/captain/alt(src) + new /obj/item/clothing/gloves/color/captain(src) + new /obj/item/weapon/storage/belt/rapier(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/weapon/door_remote/captain(src) /obj/structure/closet/secure_closet/hop @@ -44,19 +43,20 @@ icon_broken = "hopsecurebroken" icon_off = "hopsecureoff" - New() - ..() - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/head/hopcap(src) - new /obj/item/weapon/cartridge/hop(src) - new /obj/item/device/radio/headset/heads/hop(src) - new /obj/item/weapon/storage/box/ids(src) - new /obj/item/weapon/storage/box/PDAs(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/accessory/petcollar(src) - new /obj/item/weapon/door_remote/civillian(src) +/obj/structure/closet/secure_closet/hop/New() + ..() + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/head/hopcap(src) + new /obj/item/weapon/cartridge/hop(src) + new /obj/item/device/radio/headset/heads/hop(src) + new /obj/item/weapon/storage/box/ids(src) + new /obj/item/weapon/storage/box/PDAs(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/device/flash(src) + new /obj/item/clothing/accessory/petcollar(src) + new /obj/item/weapon/door_remote/civillian(src) + /obj/structure/closet/secure_closet/hop2 name = "head of personnel's attire" @@ -68,21 +68,20 @@ icon_broken = "hopsecurebroken" icon_off = "hopsecureoff" - New() - ..() - new /obj/item/clothing/under/rank/head_of_personnel(src) - new /obj/item/clothing/under/dress/dress_hop(src) - new /obj/item/clothing/under/dress/dress_hr(src) - new /obj/item/clothing/under/lawyer/female(src) - new /obj/item/clothing/under/lawyer/black(src) - new /obj/item/clothing/under/lawyer/red(src) - new /obj/item/clothing/under/lawyer/oldman(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/shoes/leather(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src) - +/obj/structure/closet/secure_closet/hop2/New() + ..() + new /obj/item/clothing/under/rank/head_of_personnel(src) + new /obj/item/clothing/under/dress/dress_hop(src) + new /obj/item/clothing/under/dress/dress_hr(src) + new /obj/item/clothing/under/lawyer/female(src) + new /obj/item/clothing/under/lawyer/black(src) + new /obj/item/clothing/under/lawyer/red(src) + new /obj/item/clothing/under/lawyer/oldman(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/shoes/leather(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src) /obj/structure/closet/secure_closet/hos @@ -95,33 +94,32 @@ icon_broken = "hossecurebroken" icon_off = "hossecureoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/security(src) - else - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/weapon/cartridge/hos(src) - new /obj/item/device/radio/headset/heads/hos/alt(src) - new /obj/item/clothing/under/rank/head_of_security(src) - new /obj/item/clothing/under/rank/head_of_security/formal(src) - new /obj/item/clothing/under/rank/head_of_security/corp(src) - new /obj/item/clothing/under/rank/head_of_security/skirt(src) - new /obj/item/clothing/suit/armor/hos(src) - new /obj/item/clothing/suit/armor/hos/alt(src) - new /obj/item/clothing/head/HoS(src) - new /obj/item/clothing/head/HoS/beret(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/weapon/storage/lockbox/mindshield(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/clothing/mask/gas/sechailer/hos(src) - new /obj/item/weapon/shield/riot/tele(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/storage/belt/security/sec(src) - new /obj/item/taperoll/police(src) - new /obj/item/weapon/gun/energy/gun/hos(src) - new /obj/item/weapon/door_remote/head_of_security(src) - +/obj/structure/closet/secure_closet/hos/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/security(src) + else + new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/weapon/cartridge/hos(src) + new /obj/item/device/radio/headset/heads/hos/alt(src) + new /obj/item/clothing/under/rank/head_of_security(src) + new /obj/item/clothing/under/rank/head_of_security/formal(src) + new /obj/item/clothing/under/rank/head_of_security/corp(src) + new /obj/item/clothing/under/rank/head_of_security/skirt(src) + new /obj/item/clothing/suit/armor/hos(src) + new /obj/item/clothing/suit/armor/hos/alt(src) + new /obj/item/clothing/head/HoS(src) + new /obj/item/clothing/head/HoS/beret(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/weapon/storage/lockbox/mindshield(src) + new /obj/item/weapon/storage/box/flashbangs(src) + new /obj/item/clothing/mask/gas/sechailer/hos(src) + new /obj/item/weapon/shield/riot/tele(src) + new /obj/item/weapon/melee/baton/loaded(src) + new /obj/item/weapon/storage/belt/security/sec(src) + new /obj/item/taperoll/police(src) + new /obj/item/weapon/gun/energy/gun/hos(src) + new /obj/item/weapon/door_remote/head_of_security(src) /obj/structure/closet/secure_closet/warden @@ -134,34 +132,32 @@ icon_broken = "wardensecurebroken" icon_off = "wardensecureoff" - - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/security(src) - else - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/suit/armor/vest/warden(src) - new /obj/item/clothing/head/warden(src) - new /obj/item/clothing/suit/armor/vest/warden/alt(src) - new /obj/item/clothing/head/beret/sec/warden(src) - new /obj/item/clothing/under/rank/warden(src) - new /obj/item/clothing/under/rank/warden/formal(src) - new /obj/item/clothing/under/rank/warden/corp(src) - new /obj/item/clothing/under/rank/warden/skirt(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/clothing/mask/gas/sechailer/warden(src) - new /obj/item/taperoll/police(src) - new /obj/item/weapon/storage/box/zipties(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/gun/energy/gun/advtaser(src) - new /obj/item/weapon/storage/belt/security/sec(src) - new /obj/item/weapon/storage/box/holobadge(src) - new /obj/item/clothing/gloves/color/black/krav_maga/sec(src) - +/obj/structure/closet/secure_closet/warden/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/security(src) + else + new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) + new /obj/item/clothing/suit/armor/vest/warden(src) + new /obj/item/clothing/head/warden(src) + new /obj/item/clothing/suit/armor/vest/warden/alt(src) + new /obj/item/clothing/head/beret/sec/warden(src) + new /obj/item/clothing/under/rank/warden(src) + new /obj/item/clothing/under/rank/warden/formal(src) + new /obj/item/clothing/under/rank/warden/corp(src) + new /obj/item/clothing/under/rank/warden/skirt(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/clothing/mask/gas/sechailer/warden(src) + new /obj/item/taperoll/police(src) + new /obj/item/weapon/storage/box/zipties(src) + new /obj/item/weapon/storage/box/flashbangs(src) + new /obj/item/weapon/reagent_containers/spray/pepper(src) + new /obj/item/weapon/melee/baton/loaded(src) + new /obj/item/weapon/gun/energy/gun/advtaser(src) + new /obj/item/weapon/storage/belt/security/sec(src) + new /obj/item/weapon/storage/box/holobadge(src) + new /obj/item/clothing/gloves/color/black/krav_maga/sec(src) /obj/structure/closet/secure_closet/security @@ -174,24 +170,25 @@ icon_broken = "secbroken" icon_off = "secoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/security(src) - else - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/clothing/suit/armor/vest/security(src) - new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/head/soft/sec(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/storage/belt/security/sec(src) - new /obj/item/clothing/mask/gas/sechailer(src) - new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/clothing/head/helmet(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/taperoll/police(src) +/obj/structure/closet/secure_closet/security/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/security(src) + else + new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/clothing/suit/armor/vest/security(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) + new /obj/item/clothing/head/soft/sec(src) + new /obj/item/weapon/reagent_containers/spray/pepper(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/grenade/flashbang(src) + new /obj/item/weapon/storage/belt/security/sec(src) + new /obj/item/clothing/mask/gas/sechailer(src) + new /obj/item/clothing/glasses/hud/security/sunglasses(src) + new /obj/item/clothing/head/helmet(src) + new /obj/item/weapon/melee/baton/loaded(src) + new /obj/item/taperoll/police(src) + /obj/structure/closet/secure_closet/brigdoc name = "brig physician's locker" @@ -203,24 +200,25 @@ icon_broken = "securemedbroken" icon_off = "securemedoff" - New() - ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/storage/firstaid/regular(src) - new /obj/item/weapon/storage/firstaid/fire(src) - new /obj/item/weapon/storage/firstaid/adv(src) - new /obj/item/weapon/storage/firstaid/o2(src) - new /obj/item/weapon/storage/firstaid/toxin(src) - new /obj/item/clothing/suit/storage/brigdoc(src) - new /obj/item/clothing/under/rank/security/brigphys(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/shoes/sandal/white(src) +/obj/structure/closet/secure_closet/brigdoc/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/medic(src) + else + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/weapon/reagent_containers/spray/pepper(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/storage/firstaid/regular(src) + new /obj/item/weapon/storage/firstaid/fire(src) + new /obj/item/weapon/storage/firstaid/adv(src) + new /obj/item/weapon/storage/firstaid/o2(src) + new /obj/item/weapon/storage/firstaid/toxin(src) + new /obj/item/clothing/suit/storage/brigdoc(src) + new /obj/item/clothing/under/rank/security/brigphys(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) + new /obj/item/clothing/shoes/sandal/white(src) + /obj/structure/closet/secure_closet/blueshield name = "blueshield's locker" @@ -232,25 +230,26 @@ icon_broken = "bssecurebroken" icon_off = "bssecureoff" - New() - ..() - new /obj/item/weapon/storage/briefcase(src) - new /obj/item/weapon/storage/firstaid/adv(src) - new /obj/item/weapon/storage/belt/security/sec(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/glasses/hud/health/health_advanced - new /obj/item/clothing/head/beret/centcom/officer(src) - new /obj/item/clothing/head/beret/centcom/officer/navy(src) - new /obj/item/clothing/suit/armor/vest/blueshield(src) - new /obj/item/clothing/suit/storage/blueshield(src) - new /obj/item/clothing/shoes/centcom(src) - new /obj/item/clothing/accessory/holster(src) - new /obj/item/clothing/accessory/blue(src) - new /obj/item/clothing/shoes/jackboots/jacksandals(src) +/obj/structure/closet/secure_closet/blueshield/New() + ..() + new /obj/item/weapon/storage/briefcase(src) + new /obj/item/weapon/storage/firstaid/adv(src) + new /obj/item/weapon/storage/belt/security/sec(src) + new /obj/item/weapon/grenade/flashbang(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/restraints/handcuffs(src) + new /obj/item/weapon/melee/baton/loaded(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/glasses/hud/health/health_advanced + new /obj/item/clothing/head/beret/centcom/officer(src) + new /obj/item/clothing/head/beret/centcom/officer/navy(src) + new /obj/item/clothing/suit/armor/vest/blueshield(src) + new /obj/item/clothing/suit/storage/blueshield(src) + new /obj/item/clothing/shoes/centcom(src) + new /obj/item/clothing/accessory/holster(src) + new /obj/item/clothing/accessory/blue(src) + new /obj/item/clothing/shoes/jackboots/jacksandals(src) + /obj/structure/closet/secure_closet/ntrep name = "\improper Nanotrasen Representative's locker" @@ -262,51 +261,54 @@ icon_broken = "ntsecurebroken" icon_off = "ntsecureoff" - New() - ..() - new /obj/item/weapon/book/manual/faxes(src) - new /obj/item/weapon/storage/briefcase(src) - new /obj/item/device/paicard(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/gloves/color/white(src) - new /obj/item/clothing/shoes/centcom(src) - new /obj/item/clothing/under/lawyer/oldman(src) - new /obj/item/clothing/under/lawyer/black(src) - new /obj/item/clothing/under/lawyer/female(src) - new /obj/item/clothing/head/ntrep(src) - new /obj/item/clothing/shoes/sandal/fancy(src) - new /obj/item/weapon/storage/box/tapes(src) - new /obj/item/device/taperecorder(src) +/obj/structure/closet/secure_closet/ntrep/New() + ..() + new /obj/item/weapon/book/manual/faxes(src) + new /obj/item/weapon/storage/briefcase(src) + new /obj/item/device/paicard(src) + new /obj/item/device/flash(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/gloves/color/white(src) + new /obj/item/clothing/shoes/centcom(src) + new /obj/item/clothing/under/lawyer/oldman(src) + new /obj/item/clothing/under/lawyer/black(src) + new /obj/item/clothing/under/lawyer/female(src) + new /obj/item/clothing/head/ntrep(src) + new /obj/item/clothing/shoes/sandal/fancy(src) + new /obj/item/weapon/storage/box/tapes(src) + new /obj/item/device/taperecorder(src) /obj/structure/closet/secure_closet/security/cargo - New() - ..() - new /obj/item/clothing/accessory/armband/cargo(src) - new /obj/item/device/encryptionkey/headset_cargo(src) +/obj/structure/closet/secure_closet/security/cargo/New() + ..() + new /obj/item/clothing/accessory/armband/cargo(src) + new /obj/item/device/encryptionkey/headset_cargo(src) + /obj/structure/closet/secure_closet/security/engine - New() - ..() - new /obj/item/clothing/accessory/armband/engine(src) - new /obj/item/device/encryptionkey/headset_eng(src) +/obj/structure/closet/secure_closet/security/engine/New() + ..() + new /obj/item/clothing/accessory/armband/engine(src) + new /obj/item/device/encryptionkey/headset_eng(src) + /obj/structure/closet/secure_closet/security/science - New() - ..() - new /obj/item/clothing/accessory/armband/science(src) - new /obj/item/device/encryptionkey/headset_sci(src) +/obj/structure/closet/secure_closet/security/science/New() + ..() + new /obj/item/clothing/accessory/armband/science(src) + new /obj/item/device/encryptionkey/headset_sci(src) + /obj/structure/closet/secure_closet/security/med - New() - ..() - new /obj/item/clothing/accessory/armband/medgreen(src) - new /obj/item/device/encryptionkey/headset_med(src) +/obj/structure/closet/secure_closet/security/med/New() + ..() + new /obj/item/clothing/accessory/armband/medgreen(src) + new /obj/item/device/encryptionkey/headset_med(src) /obj/structure/closet/secure_closet/detective @@ -321,28 +323,28 @@ burn_state = FLAMMABLE burntime = 20 - New() - ..() - new /obj/item/clothing/under/det(src) - new /obj/item/clothing/suit/storage/det_suit(src) - new /obj/item/clothing/suit/storage/det_suit/forensics/blue(src) - new /obj/item/clothing/suit/storage/det_suit/forensics/red(src) - new /obj/item/clothing/gloves/color/black/forensics(src) - new /obj/item/clothing/head/det_hat(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/weapon/storage/box/evidence(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/clothing/suit/armor/vest/det_suit(src) - new /obj/item/ammo_box/c38(src) - new /obj/item/ammo_box/c38(src) - new /obj/item/weapon/gun/projectile/revolver/detective(src) - new /obj/item/taperoll/police(src) - new /obj/item/clothing/accessory/holster/armpit(src) - new /obj/item/clothing/glasses/sunglasses/yeah(src) - new /obj/item/device/flashlight/seclite(src) - new /obj/item/clothing/accessory/black(src) +/obj/structure/closet/secure_closet/detective/New() + ..() + new /obj/item/clothing/under/det(src) + new /obj/item/clothing/suit/storage/det_suit(src) + new /obj/item/clothing/suit/storage/det_suit/forensics/blue(src) + new /obj/item/clothing/suit/storage/det_suit/forensics/red(src) + new /obj/item/clothing/gloves/color/black/forensics(src) + new /obj/item/clothing/head/det_hat(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/weapon/storage/box/evidence(src) + new /obj/item/weapon/clipboard(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) + new /obj/item/device/detective_scanner(src) + new /obj/item/clothing/suit/armor/vest/det_suit(src) + new /obj/item/ammo_box/c38(src) + new /obj/item/ammo_box/c38(src) + new /obj/item/weapon/gun/projectile/revolver/detective(src) + new /obj/item/taperoll/police(src) + new /obj/item/clothing/accessory/holster/armpit(src) + new /obj/item/clothing/glasses/sunglasses/yeah(src) + new /obj/item/device/flashlight/seclite(src) + new /obj/item/clothing/accessory/black(src) /obj/structure/closet/secure_closet/detective/update_icon() if(broken) @@ -356,16 +358,15 @@ else icon_state = icon_opened + /obj/structure/closet/secure_closet/injection name = "lethal injections locker" req_access = list(access_security) - - New() - ..() - new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src) - new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src) - +/obj/structure/closet/secure_closet/injection/New() + ..() + new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src) + new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src) /obj/structure/closet/secure_closet/brig @@ -374,29 +375,29 @@ anchored = 1 var/id = null - New() - ..() - new /obj/item/clothing/under/color/orange/prison(src) - new /obj/item/clothing/shoes/orange(src) - new /obj/item/weapon/card/id/prisoner/random(src) - new /obj/item/device/radio/headset(src) - +/obj/structure/closet/secure_closet/brig/New() + ..() + new /obj/item/clothing/under/color/orange/prison(src) + new /obj/item/clothing/shoes/orange(src) + new /obj/item/weapon/card/id/prisoner/random(src) + new /obj/item/device/radio/headset(src) /obj/structure/closet/secure_closet/courtroom name = "courtroom locker" req_access = list(access_court) - New() - ..() - new /obj/item/clothing/shoes/brown(src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/pen (src) - new /obj/item/clothing/suit/judgerobe (src) - new /obj/item/clothing/head/powdered_wig (src) - new /obj/item/weapon/storage/briefcase(src) +/obj/structure/closet/secure_closet/courtroom/New() + ..() + new /obj/item/clothing/shoes/brown(src) + new /obj/item/weapon/paper/Court (src) + new /obj/item/weapon/paper/Court (src) + new /obj/item/weapon/paper/Court (src) + new /obj/item/weapon/pen (src) + new /obj/item/clothing/suit/judgerobe (src) + new /obj/item/clothing/head/powdered_wig (src) + new /obj/item/weapon/storage/briefcase(src) + /obj/structure/closet/secure_closet/wall name = "wall locker" diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 26bd0d88759..5b26b46eacd 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -27,6 +27,7 @@ new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/clothing/suit/space/hardsuit/syndi(src) new /obj/item/weapon/tank/jetpack/oxygen/harness(src) + new /obj/item/clothing/shoes/magboots/syndie(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party.." diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 22b10ca1157..0b9554a4cc4 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -460,3 +460,20 @@ new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/purple(src) new /obj/item/clothing/shoes/leather(src) + +/obj/structure/closet/wardrobe/coroner + name = "coroner wardrobe" + icon_state = "black" + icon_closed = "black" + +/obj/structure/closet/wardrobe/coroner/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/medic(src) + else + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/weapon/storage/backpack/duffel/medical(src) + new /obj/item/clothing/suit/storage/labcoat/mortician(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/under/rank/medical/mortician(src) + new /obj/item/clothing/head/surgery/black(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 5396ac46e6b..043fdf2f9c4 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -242,8 +242,8 @@ var/greenlight = "securecrateg" var/sparks = "securecratesparks" var/emag = "securecrateemag" - var/broken = 0 - var/locked = 1 + broken = 0 + locked = 1 health = 1000 /obj/structure/closet/crate/secure/update_icon() @@ -443,9 +443,9 @@ anchored = TRUE /obj/structure/closet/crate/can/attackby(obj/item/weapon/W, mob/living/user, params) - add_fingerprint(user) - user.changeNext_move(CLICK_CD_MELEE) if(iswrench(W)) + add_fingerprint(user) + user.changeNext_move(CLICK_CD_MELEE) if(anchored) playsound(loc, W.usesound, 100, 1) user.visible_message("[user] starts loosening [src]'s floor casters.", \ @@ -469,6 +469,8 @@ user.visible_message("[user] has secured [src]'s floor casters.", \ "You have secured [src]'s floor casters.") anchored = TRUE + else + ..() /obj/structure/closet/crate/radiation desc = "A crate with a radiation sign on it." diff --git a/code/game/objects/structures/fullwindow.dm b/code/game/objects/structures/fullwindow.dm index 48b2268d8cc..b0c1f2c512c 100644 --- a/code/game/objects/structures/fullwindow.dm +++ b/code/game/objects/structures/fullwindow.dm @@ -46,6 +46,10 @@ glasstype = /obj/item/stack/sheet/plasmaglass health = 120 +/obj/structure/window/full/plasmabasic/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > T0C + 32000) + hit(round(exposed_volume / 1000), 0) + ..() /obj/structure/window/full/plasmareinforced name = "reinforced plasma window" @@ -57,6 +61,8 @@ reinf = 1 health = 160 +/obj/structure/window/full/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + return /obj/structure/window/full/reinforced name = "reinforced window" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 126dd6e3a38..3946f6613da 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -108,7 +108,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f return 1 -/obj/structure/window/hitby(atom/movable/AM) +/obj/structure/window/hitby(atom/movable/AM) ..() var/tforce = 0 if(ismob(AM)) @@ -125,7 +125,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f update_nearby_icons() step(src, get_dir(AM, src)) if(health <= 0) - destroy() + destroy() /obj/structure/window/attack_hand(mob/user as mob) @@ -179,14 +179,14 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f attack_generic(user, rand(10, 15)) -/obj/structure/window/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params) - if(!istype(W)) return//I really wish I did not need this - if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W +/obj/structure/window/attackby(obj/item/I as obj, mob/living/user as mob, params) + if(!istype(I)) return//I really wish I did not need this + if(istype(I, /obj/item/weapon/grab) && get_dist(src,user)<2) + var/obj/item/weapon/grab/G = I if(istype(G.affecting,/mob/living)) var/mob/living/M = G.affecting var/state = G.state - qdel(W) //gotta delete it here because if window breaks, it won't get deleted + qdel(I) //gotta delete it here because if window breaks, it won't get deleted switch(state) if(1) M.visible_message("[user] slams [M] against \the [src]!") @@ -210,29 +210,29 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f hit(75) return - if(W.flags & NOBLUDGEON) return + if(I.flags & NOBLUDGEON) return - if(istype(W, /obj/item/weapon/screwdriver)) + if(istype(I, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) state = 3 - state - playsound(loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.")) else if(reinf && state == 0) anchored = !anchored update_nearby_icons() - playsound(loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.")) else if(!reinf) anchored = !anchored update_nearby_icons() - playsound(loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.")) - else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1) + else if(istype(I, /obj/item/weapon/crowbar) && reinf && state <= 1) state = 1 - state - playsound(loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.")) - else if(istype(W, /obj/item/weapon/wrench) && !anchored && health > 7) //Disassemble deconstructed window into parts - playsound(src.loc, W.usesound, 50, 1) + else if(istype(I, /obj/item/weapon/wrench) && !anchored && health > 7) //Disassemble deconstructed window into parts + playsound(src.loc, I.usesound, 50, 1) for(var/i=0;iCentral Command has already dispatched an emergency response team!") return - if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes") - return + var/datum/nano_module/ert_manager/E = new() + E.ui_interact(usr) - if(get_security_level() != "red") // Allow admins to reconsider if the alert level isn't Red - switch(alert("The station is not in red alert. Do you still want to dispatch a response team?",,"Yes","No")) - if("No") - return - - if(send_emergency_team) - to_chat(usr, "Central Command has already dispatched an emergency response team!") - return - - var/ert_type = pick_ert_type() - - if(!ert_type) - return - - ert_request_answered = 1 - message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team", 1) - log_admin("[key_name(usr)] used Dispatch Emergency Response Team..") - trigger_armed_response_team(ert_type) - -/client/proc/pick_ert_type() - switch(alert("Please select the ERT type you wish to deploy.", "Emergency Response Team", "Code Amber", "Code Red", "Code Gamma", "Cancel")) - if("Code Amber") - if(alert("Confirm: Deploy code 'AMBER' light ERT?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm") - return new /datum/response_team/amber - else - return pick_ert_type() - if("Code Red") - if(alert("Confirm: Deploy code 'RED' medium ERT?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm") - return new /datum/response_team/red - else - return pick_ert_type() - if("Code Gamma") - if(alert("Confirm: Deploy code 'GAMMA' elite ERT?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm") - return new /datum/response_team/gamma - else - return pick_ert_type() - return 0 /mob/dead/observer/proc/JoinResponseTeam() if(!send_emergency_team) @@ -99,9 +61,10 @@ var/ert_request_answered = 0 return 1 -/proc/trigger_armed_response_team(var/datum/response_team/response_team_type) +/proc/trigger_armed_response_team(var/datum/response_team/response_team_type, commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) response_team_members = list() active_team = response_team_type + active_team.setSlots(commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) send_emergency_team = 1 var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT]) @@ -112,6 +75,8 @@ var/ert_request_answered = 0 // Respawnable players get first dibs for(var/mob/dead/observer/M in ert_candidates) + if(jobban_isbanned(M, ROLE_TRAITOR) || jobban_isbanned(M, "Security Officer") || jobban_isbanned(M, "Captain") || jobban_isbanned(M, "Cyborg")) + continue if((M in respawnable_list) && M.JoinResponseTeam()) response_team_members |= M // If there's still open slots, non-respawnable players can fill them @@ -130,7 +95,7 @@ var/ert_request_answered = 0 index = 1 var/client/C = M.client - var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) + var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) new_commando.mind.key = M.key new_commando.key = M.key new_commando.update_icons() @@ -141,17 +106,37 @@ var/ert_request_answered = 0 return 1 /client/proc/create_response_team(var/turf/spawn_location) - var/mob/living/carbon/human/M = new(null) - var/obj/item/organ/external/head/head_organ = M.get_organ("head") - - var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female") - var/class = 0 while(!class) class = input(src, "Which loadout would you like to choose?") in active_team.get_slot_list() if(!active_team.check_slot_available(class)) // Because the prompt does not update automatically when a slot gets filled. class = 0 + if(class == "Cyborg") + active_team.reduceCyborgSlots() + var/cyborg_unlock = active_team.getCyborgUnlock() + var/mob/living/silicon/robot/ert/R = new() + R.forceMove(spawn_location) + var/rnum = rand(1,1000) + R.name = "ERT [rnum]" + R.real_name = R.name + R.mind = new + R.mind.current = R + R.mind.original = R + R.mind.assigned_role = "MODE" + R.mind.special_role = SPECIAL_ROLE_ERT + if(cyborg_unlock) + R.crisis = 1 + if(!(R.mind in ticker.minds)) + ticker.minds += R.mind //Adds them to regular mind list. + ticker.mode.ert += R.mind + return R + + var/mob/living/carbon/human/M = new(null) + var/obj/item/organ/external/head/head_organ = M.get_organ("head") + + var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female") + if(new_gender) if(new_gender == "Male") M.change_gender(MALE) @@ -205,11 +190,32 @@ var/ert_request_answered = 0 var/engineer_slots = 3 var/medical_slots = 3 var/security_slots = 3 + var/janitor_slots = 0 + var/paranormal_slots = 0 + var/cyborg_slots = 0 var/command_outfit var/engineering_outfit var/medical_outfit var/security_outfit + var/janitor_outfit + var/paranormal_outfit + var/cyborg_unlock = 0 + +/datum/response_team/proc/setSlots(com, sec, med, eng, jan, par, cyb) + command_slots = com + security_slots = sec + medical_slots = med + engineer_slots = eng + janitor_slots = jan + paranormal_slots = par + cyborg_slots = cyb + +/datum/response_team/proc/reduceCyborgSlots() + cyborg_slots-- + +/datum/response_team/proc/getCyborgUnlock() + return cyborg_unlock /datum/response_team/proc/get_slot_list() var/list/slots_available = list() @@ -221,7 +227,12 @@ var/ert_request_answered = 0 slots_available |= "Engineer" if(medical_slots) slots_available |= "Medic" - + if(janitor_slots) + slots_available |= "Janitor" + if(paranormal_slots) + slots_available |= "Paranormal" + if(cyborg_slots) + slots_available |= "Cyborg" return slots_available /datum/response_team/proc/check_slot_available(var/slot) @@ -234,6 +245,12 @@ var/ert_request_answered = 0 return engineer_slots if("Medic") return medical_slots + if("Janitor") + return janitor_slots + if("Paranormal") + return paranormal_slots + if("Cyborg") + return cyborg_slots return 0 /datum/response_team/proc/equip_officer(var/officer_type, var/mob/living/carbon/human/M) @@ -253,6 +270,16 @@ var/ert_request_answered = 0 M.equipOutfit(medical_outfit) M.job = "ERT Medical" + if("Janitor") + janitor_slots -= 1 + M.equipOutfit(janitor_outfit) + M.job = "ERT Janitor" + + if("Paranormal") + paranormal_slots -= 1 + M.equipOutfit(paranormal_outfit) + M.job = "ERT Paranormal" + if("Commander") command_slots = 0 @@ -277,6 +304,8 @@ var/ert_request_answered = 0 security_outfit = /datum/outfit/job/centcom/response_team/security/amber medical_outfit = /datum/outfit/job/centcom/response_team/medic/amber command_outfit = /datum/outfit/job/centcom/response_team/commander/amber + janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/amber + paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/amber /datum/response_team/amber/announce_team() event_announcement.Announce("Attention, [station_name()]. We are sending a code AMBER light Emergency Response Team. Standby.", "ERT En-Route") @@ -288,6 +317,8 @@ var/ert_request_answered = 0 security_outfit = /datum/outfit/job/centcom/response_team/security/red medical_outfit = /datum/outfit/job/centcom/response_team/medic/red command_outfit = /datum/outfit/job/centcom/response_team/commander/red + janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/red + paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/red /datum/response_team/red/announce_team() event_announcement.Announce("Attention, [station_name()]. We are sending a code RED Emergency Response Team. Standby.", "ERT En-Route") @@ -299,6 +330,9 @@ var/ert_request_answered = 0 security_outfit = /datum/outfit/job/centcom/response_team/security/gamma medical_outfit = /datum/outfit/job/centcom/response_team/medic/gamma command_outfit = /datum/outfit/job/centcom/response_team/commander/gamma + janitor_outfit = /datum/outfit/job/centcom/response_team/janitorial/gamma + paranormal_outfit = /datum/outfit/job/centcom/response_team/paranormal/gamma + cyborg_unlock = 1 /datum/response_team/gamma/announce_team() event_announcement.Announce("Attention, [station_name()]. We are sending a code GAMMA elite Emergency Response Team. Standby.", "ERT En-Route") @@ -617,6 +651,88 @@ var/ert_request_answered = 0 /obj/item/weapon/gun/energy/pulse/pistol = 1 ) +/datum/outfit/job/centcom/response_team/paranormal + name = "RT Paranormal" + rt_job = "Emergency Response Team Inquisitor" + uniform = /obj/item/clothing/under/rank/chaplain + back = /obj/item/weapon/storage/backpack/ert/security + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/combat + l_ear = /obj/item/device/radio/headset/ert/alt + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + belt = /obj/item/weapon/storage/belt/security/response_team + id = /obj/item/weapon/card/id/centcom + pda = /obj/item/device/pda/centcom + backpack_contents = list( + /obj/item/clothing/mask/gas/sechailer/swat = 1, + /obj/item/weapon/storage/box/zipties = 1, + /obj/item/device/flashlight = 1) + +/datum/outfit/job/centcom/response_team/paranormal/amber + name = "RT Paranormal (Amber)" + suit = /obj/item/clothing/suit/armor/vest/ert/security + suit_store = /obj/item/weapon/gun/energy/gun/advtaser + r_pocket = /obj/item/weapon/nullrod + +/datum/outfit/job/centcom/response_team/paranormal/red + name = "RT Paranormal (Red)" + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + head = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor + suit_store = /obj/item/weapon/gun/energy/gun/nuclear + r_pocket = /obj/item/weapon/nullrod + +/datum/outfit/job/centcom/response_team/paranormal/gamma + name = "RT Paranormal (Gamma)" + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + head = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor + suit_store = /obj/item/weapon/gun/energy/gun/nuclear + r_pocket = /obj/item/weapon/gun/energy/pulse/pistol + l_pocket = /obj/item/weapon/grenade/clusterbuster/holy + shoes = /obj/item/clothing/shoes/magboots/advance + +/datum/outfit/job/centcom/response_team/janitorial + name = "RT Janitor" + rt_job = "Emergency Response Team Janitor" + uniform = /obj/item/clothing/under/color/purple + back = /obj/item/weapon/storage/backpack/ert/janitor + belt = /obj/item/weapon/storage/belt/janitor/full + gloves = /obj/item/clothing/gloves/color/yellow + shoes = /obj/item/clothing/shoes/galoshes + l_ear = /obj/item/device/radio/headset/ert/alt + id = /obj/item/weapon/card/id/centcom + pda = /obj/item/device/pda/centcom + l_pocket = /obj/item/weapon/melee/classic_baton/telescopic + backpack_contents = list( + /obj/item/weapon/grenade/chem_grenade/antiweed = 2, + /obj/item/weapon/reagent_containers/spray/cleaner = 1, + /obj/item/weapon/storage/bag/trash = 1, + /obj/item/weapon/storage/box/lights/mixed = 1, + /obj/item/weapon/holosign_creator = 1, + /obj/item/device/flashlight = 1) + +/datum/outfit/job/centcom/response_team/janitorial/amber + name = "RT Janitor (Amber)" + glasses = /obj/item/clothing/glasses/sunglasses + +/datum/outfit/job/centcom/response_team/janitorial/red + name = "RT Janitor (Red)" + suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor + head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + suit_store = /obj/item/weapon/gun/energy/gun + r_pocket = /obj/item/weapon/scythe/tele + +/datum/outfit/job/centcom/response_team/janitorial/gamma + name = "RT Janitor (Gamma)" + suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor + head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + gloves = /obj/item/clothing/gloves/combat + suit_store = /obj/item/weapon/gun/energy/pulse/pistol + l_pocket = /obj/item/weapon/grenade/clusterbuster/cleaner + r_pocket = /obj/item/weapon/grenade/clusterbuster/antiweed + shoes = /obj/item/clothing/shoes/magboots/advance + /obj/item/device/radio/centcom name = "centcomm bounced radio" frequency = ERT_FREQ diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 43374ce66d8..db766f19e68 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -6,7 +6,7 @@ opacity = 1 density = 1 explosion_block = 2 - damage_cap = 200 + damage_cap = 600 max_temperature = 6000 hardness = 10 sheet_type = /obj/item/stack/sheet/plasteel diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d05cc25a476..ce5ac02b85a 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -21,6 +21,13 @@ var/global/nologevent = 0 var/msg = rendered to_chat(C, msg) +/proc/message_adminTicket(var/msg) + msg = "ADMIN TICKET: [msg]" + for(var/client/C in admins) + if(R_ADMIN & C.holder.rights) + if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS)) + to_chat(C, msg) + ///////////////////////////////////////////////////////////////////////////////////////////////Panels diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 004cf77a990..f9f48fb303c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -108,6 +108,8 @@ var/list/admin_verbs_event = list( /client/proc/toggle_random_events, /client/proc/toggle_ert_calling, /client/proc/cmd_admin_change_custom_event, + /client/proc/cmd_admin_custom_event_info, + /client/proc/cmd_view_custom_event_info, /datum/admins/proc/access_news_network, /*allows access of newscasters*/ /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ @@ -171,7 +173,8 @@ var/list/admin_verbs_debug = list( /client/proc/admin_serialize, /client/proc/admin_deserialize, /client/proc/jump_to_ruin, - /client/proc/toggle_medal_disable + /client/proc/toggle_medal_disable, + /client/proc/startadmintickets, ) var/list/admin_verbs_possess = list( /proc/possess, @@ -218,6 +221,11 @@ var/list/admin_verbs_snpc = list( /client/proc/customiseSNPC, /client/proc/hide_snpc_verbs ) +var/list/admin_verbs_ticket = list( + /client/proc/openTicketUI, + /client/proc/toggleticketlogs, + /client/proc/resolveAllTickets +) /client/proc/on_holder_add() if(chatOutput && chatOutput.loaded) @@ -230,6 +238,7 @@ var/list/admin_verbs_snpc = list( verbs += /client/proc/togglebuildmodeself if(holder.rights & R_ADMIN) verbs += admin_verbs_admin + verbs += admin_verbs_ticket spawn(1) control_freak = 0 if(holder.rights & R_BAN) @@ -280,7 +289,8 @@ var/list/admin_verbs_snpc = list( admin_verbs_show_debug_verbs, /client/proc/readmin, admin_verbs_snpc, - /client/proc/hide_snpc_verbs + /client/proc/hide_snpc_verbs, + admin_verbs_ticket ) /client/proc/hide_verbs() @@ -917,6 +927,20 @@ var/list/admin_verbs_snpc = list( else to_chat(usr, "You now will get admin log messages.") +/client/proc/toggleticketlogs() + set name = "Toggle Admin Ticket Messgaes" + set category = "Preferences" + + if(!check_rights(R_ADMIN)) + return + + prefs.toggles ^= CHAT_NO_TICKETLOGS + prefs.save_preferences(src) + if(prefs.toggles & CHAT_NO_TICKETLOGS) + to_chat(usr, "You now won't get admin ticket messages.") + else + to_chat(usr, "You now will get admin ticket messages.") + /client/proc/toggledrones() set name = "Toggle Maintenance Drones" set category = "Server" diff --git a/code/modules/admin/tickets/admintickets.dm b/code/modules/admin/tickets/admintickets.dm new file mode 100644 index 00000000000..5ef1f58dbf5 --- /dev/null +++ b/code/modules/admin/tickets/admintickets.dm @@ -0,0 +1,185 @@ +/* +Admin ticket system by Birdtalon +*/ +//Global holder + +var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicketHolder + +//Defines +//Deciseconds until ticket becomes stale if unanswered. Alerts admins. +#define ADMIN_TICKET_TIMEOUT 6000 // 10 minutes +//Decisecions before the user is allowed to open another ticket while their existing one is open. +#define ADMIN_TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes + +//Status defines +#define ADMIN_TICKET_OPEN 1 +#define ADMIN_TICKET_CLOSED 2 +#define ADMIN_TICKET_RESOLVED 3 +#define ADMIN_TICKET_STALE 4 + +//Datum holding all tickets +/datum/adminTicketHolder + var/ticketCounter = 1 // Counts the tickets and used to assign the id number + var/list/allTickets = list() + +//Return the current ticket number ready to be called off. +/datum/adminTicketHolder/proc/getTicketCounter() + return ticketCounter + +//Return the ticket counter and increment +/datum/adminTicketHolder/proc/getTicketCounterAndInc() + . = ticketCounter + ticketCounter++ + return + +/datum/adminTicketHolder/proc/resolveAllOpenTickets() // Resolve all open tickets + for(var/i in allTickets) + var/datum/admin_ticket/T = i + resolveTicket(T.ticketNum) + +//Open a new ticket and populate details then add to the list of open tickets +/datum/adminTicketHolder/proc/newTicket(var/client/C, var/passedContent, var/title) + if(!C || !passedContent) + return + + //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period + var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) + if(existingTicket) + existingTicket.setCooldownPeriod() + to_chat(C, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") + return + + if(!title) + title = passedContent + + var/datum/admin_ticket/T = new /datum/admin_ticket + T.clientName = C + T.timeOpened = worldtime2text() + T.title = title + T.content += passedContent + T.locationSent = C.mob.loc.loc.name + T.mobControlled = C.mob + T.ticketState = ADMIN_TICKET_OPEN + T.timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT + T.setCooldownPeriod() + T.ticketNum = getTicketCounterAndInc() + allTickets += T + + //Inform the user that they have opened a ticket + to_chat(C, "You have opened admin ticket number #[(globAdminTicketHolder.getTicketCounter() - 1)]! Please be patient and we will help you soon!") + + //Begin the stale count for this ticket. + spawn(0) + T.beginStaleCount() + +//Set ticket state with key N to open +/datum/adminTicketHolder/proc/openTicket(var/N) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] + if(T.ticketState != ADMIN_TICKET_OPEN) + T.ticketState = ADMIN_TICKET_OPEN + return TRUE + +//Set ticket state with key N to resolved +/datum/adminTicketHolder/proc/resolveTicket(var/N) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] + if(T.ticketState != ADMIN_TICKET_RESOLVED) + T.ticketState = ADMIN_TICKET_RESOLVED + return TRUE + +//Set ticket state with key N to closed +/datum/adminTicketHolder/proc/closeTicket(var/N) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] + if(T.ticketState != ADMIN_TICKET_CLOSED) + T.ticketState = ADMIN_TICKET_CLOSED + return TRUE + +//Check if the user already has a ticket open and within the cooldown period. +/datum/adminTicketHolder/proc/checkForOpenTicket(var/client/C) + for(var/datum/admin_ticket/T in allTickets) + if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time)) + return T + return FALSE + +//Check if the user has ANY ticket not resolved or closed. +/datum/adminTicketHolder/proc/checkForTicket(var/client/C) + var/list/tickets = list() + for(var/datum/admin_ticket/T in allTickets) + if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE) + tickets += T + if(tickets.len) + return tickets + return FALSE + +//return the client of a ticket number +/datum/adminTicketHolder/proc/returnClient(var/N) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] + return T.clientName + +/datum/adminTicketHolder/proc/assignAdminToTicket(var/client/C, var/N) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] + T.assignAdmin(C) + return TRUE + +//Single admin ticket + +/datum/admin_ticket + var/ticketNum // Ticket number + var/clientName // Client which opened the ticket + var/timeOpened // Time the ticket was opened + var/title //The initial message with links + var/list/content = list() // content of the admin help + var/lastAdminResponse // Last admin who responded + var/lastResponseTime // When the admin last responded + var/locationSent // Location the player was when they send the ticket + var/mobControlled // Mob they were controlling + var/ticketState // State of the ticket, open, closed, resolved etc + var/timeUntilStale // When the ticket goes stale + var/ticketCooldown // Cooldown before allowing the user to open another ticket. + var/adminAssigned // Admin who has assigned themselves to this ticket + +//Ticker called when a ticket is created, checks for stale-ness. +/datum/admin_ticket/proc/beginStaleCount() + while(world.time < timeUntilStale || !lastAdminResponse || !adminAssigned) // While within the stale period OR no admin responded OR no admin assigned. + + if(!src) + return + + sleep(200) // Check every 20 seconds. + if(ticketState == ADMIN_TICKET_OPEN && world.time > timeUntilStale) + message_adminTicket("Ticket #[ticketNum] has been open for [ADMIN_TICKET_TIMEOUT * 0.1] seconds. Changing status to stale.") + ticketState = ADMIN_TICKET_STALE + break + +//Set the cooldown period for the ticket. The time when it's created plus the defined cooldown time. +/datum/admin_ticket/proc/setCooldownPeriod() + ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN + +//Set the last admin who responded as the client passed as an arguement. +/datum/admin_ticket/proc/setLastAdminResponse(var/client/C) + lastAdminResponse = C + lastResponseTime = worldtime2text() + +//Return the ticket state as a colour coded text string. +/datum/admin_ticket/proc/state2text() + switch(ticketState) + if(ADMIN_TICKET_OPEN) + return "OPEN" + if(ADMIN_TICKET_RESOLVED) + return "RESOLVED" + if(ADMIN_TICKET_CLOSED) + return "CLOSED" + if(ADMIN_TICKET_STALE) + return "STALE" + +//Assign the client passed to var/adminAsssigned +/datum/admin_ticket/proc/assignAdmin(var/client/C, var/N) + if(!C) + return + adminAssigned = C + return TRUE + +/datum/admin_ticket/proc/addResponse(var/client/C, var/M as text) + if(C.holder) + setLastAdminResponse(C) + M = "[C]: [M]" + content += M \ No newline at end of file diff --git a/code/modules/admin/tickets/adminticketsUI.dm b/code/modules/admin/tickets/adminticketsUI.dm new file mode 100644 index 00000000000..750fa13e6cb --- /dev/null +++ b/code/modules/admin/tickets/adminticketsUI.dm @@ -0,0 +1,172 @@ +/datum/adminTicketHolder/proc/returnUI(var/tab = ADMIN_TICKET_OPEN) + set name = "Open Ticket Interface" + set category = "Tickets" + +//dat + var/trStyle = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;" + var/tdStyleleft = "border-top:2px solid; border-bottom:2px solid; width:150px; text-align:center;" + var/tdStyle = "border-top:2px solid; border-bottom:2px solid;" + var/datum/admin_ticket/ticket + var/dat + dat += "" + dat += "

Admin Tickets

" + + dat +="Refresh
Open TicketsResolved TicketsClosed Tickets" + if(tab == ADMIN_TICKET_OPEN) + dat += "

Open Tickets

" + dat += "" + dat +="" + if(tab == ADMIN_TICKET_OPEN) + for(var/T in allTickets) + ticket = T + if(ticket.ticketState == ADMIN_TICKET_OPEN || ticket.ticketState == ADMIN_TICKET_STALE) + dat += "" + else + continue + else if(tab == ADMIN_TICKET_RESOLVED) + dat += "

Resolved Tickets

" + for(var/T in allTickets) + ticket = T + if(ticket.ticketState == ADMIN_TICKET_RESOLVED) + dat += "" + else + continue + else if(tab == ADMIN_TICKET_CLOSED) + dat += "

Closed Tickets

" + for(var/T in allTickets) + ticket = T + if(ticket.ticketState == ADMIN_TICKET_CLOSED) + dat += "" + else + continue + + dat += "
ControlTicket
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == ADMIN_TICKET_STALE ? "STALE" : ""]
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
" + + return dat + +/datum/adminTicketHolder/proc/showUI(var/client/user, var/tab) + var/dat = null + dat = returnUI(tab) + var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) + popup.set_content(dat) + popup.open() + +/datum/adminTicketHolder/proc/showDetailUI(var/client/user, var/ticketID) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID] + var/status = "[T.state2text()]" + + var/dat = "

Admin Tickets

" + + dat +="Show AllRefresh" + + dat += "

Ticket #[T.ticketNum]

" + + dat += "

[T.clientName] / [T.mobControlled] opened this ticket at [T.timeOpened] at location [T.locationSent]

" + dat += "

Ticket Status: [status]" + dat += "" + dat += "" + + if(T.content.len > 1) + for(var/i = 2, i <= T.content.len, i++) + dat += "" + + dat += "
[T.title]
[T.content[i]]


" + dat += "Re-OpenResolve

" + + if(!T.adminAssigned) + dat += "No admin assigned to this ticket - Take Ticket
" + else + dat += "[T.adminAssigned] is assigned to this Ticket. - Take Ticket
" + + if(T.lastAdminResponse) + dat += "Last Admin Response: [T.lastAdminResponse] at [T.lastResponseTime]" + else + dat +="No Admin Response" + + dat += "

" + + dat += "Close Ticket" + + var/datum/browser/popup = new(user, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 1000, 600) + popup.set_content(dat) + popup.open() + +/datum/adminTicketHolder/proc/userDetailUI(var/client/user) +//dat + var/tickets = checkForTicket(user) + var/dat + dat += "

Your open tickets

" + dat += "" + for(var/datum/admin_ticket/T in tickets) + dat += "" + for(var/i = 1, i <= T.content.len, i++) + dat += "" + dat += "

Ticket #[T.ticketNum]

[T.content[i]]
" + + var/datum/browser/popup = new(user, "userticketsdetail", "Tickets", 1000, 600) + popup.set_content(dat) + popup.open() + +/datum/adminTicketHolder/Topic(href, href_list) + + if(href_list["refresh"]) + showUI(usr) + return + + if(href_list["refreshdetail"]) + var/indexNum = text2num(href_list["refreshdetail"]) + showDetailUI(usr, indexNum) + return + + if(href_list["showopen"]) + showUI(usr, ADMIN_TICKET_OPEN) + return + if(href_list["showresolved"]) + showUI(usr, ADMIN_TICKET_RESOLVED) + return + if(href_list["showclosed"]) + showUI(usr, ADMIN_TICKET_CLOSED) + return + + if(href_list["details"]) + var/indexNum = text2num(href_list["details"]) + showDetailUI(usr.client, indexNum) + return + + if(href_list["resolve"]) + var/indexNum = text2num(href_list["resolve"]) + if(globAdminTicketHolder.resolveTicket(indexNum)) + message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") + to_chat(returnClient(indexNum), "Your admin ticket has now been resolved.") + showUI(usr) + + if(href_list["detailresolve"]) + var/indexNum = text2num(href_list["detailresolve"]) + if(globAdminTicketHolder.resolveTicket(indexNum)) + message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") + to_chat(returnClient(indexNum), "Your admin ticket has now been resolved.") + showDetailUI(usr, indexNum) + + if(href_list["detailclose"]) + var/indexNum = text2num(href_list["detailclose"]) + if(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes") + return + if(globAdminTicketHolder.closeTicket(indexNum)) + message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]") + to_chat(returnClient(indexNum), "- AdminHelp Rejected! -") + to_chat(returnClient(indexNum), "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.") + to_chat(returnClient(indexNum), "Your ticket has now been closed.") + showDetailUI(usr, indexNum) + + if(href_list["detailreopen"]) + var/indexNum = text2num(href_list["detailreopen"]) + if(globAdminTicketHolder.openTicket(indexNum)) + message_adminTicket("[usr.client] / ([usr]) re-opened admin ticket number [indexNum]") + showDetailUI(usr, indexNum) + + if(href_list["assignadmin"]) + var/indexNum = text2num(href_list["assignadmin"]) + if(globAdminTicketHolder.assignAdminToTicket(usr.client, indexNum)) + message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]") + to_chat(returnClient(indexNum), "Your ticket is being handled by [usr.client].") + showDetailUI(usr, indexNum) \ No newline at end of file diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm new file mode 100644 index 00000000000..dceb9492b6c --- /dev/null +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -0,0 +1,51 @@ +//Verbs + +/client/proc/startadmintickets() + set name = "Restart Admin Ticket System" + set category = "Debug" + + if(!holder && !check_rights(R_DEBUG)) + return + + if(!globAdminTicketHolder) + var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicketHolder + else + if(alert("Are you sure you want to reboot the admin ticket system?","Reboot Admin Tickets?","Yes","No") != "Yes") + return + message_admins("Restarting Admin Ticket System!") + globAdminTicketHolder = new /datum/adminTicketHolder + message_admins("Admin Ticket System Restarted!") + +/client/proc/openTicketUI() + + set name = "Open Ticket Interface" + set category = "Admin" + + if(!holder && !check_rights(R_ADMIN)) + return + + globAdminTicketHolder.showUI(usr) + +/client/proc/resolveAllTickets() + set name = "Resolve All Open Tickets" + set category = "Admin" + + if(!holder && !check_rights(R_ADMIN)) + return + + if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes") + return + + globAdminTicketHolder.resolveAllOpenTickets() + + + +/client/verb/openUserUI() + + set name = "My Tickets" + set category = "Admin" + + if(!holder && !check_rights(R_ADMIN)) + return + + globAdminTicketHolder.userDetailUI(usr.client) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3aabfd3150a..e3cb19fb6e9 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -26,6 +26,12 @@ message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help") log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help") + if(href_list["openadminticket"]) + if(!check_rights(R_ADMIN)) + return + var/ticketID = text2num(href_list["openadminticket"]) + globAdminTicketHolder.showDetailUI(usr, ticketID) + if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) @@ -242,16 +248,23 @@ else if(task == "permissions") if(!D) return - var/list/permissionlist = list() - for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift - permissionlist[rights2text(i)] = i - var/new_permission = input("Select a permission to turn on/off", "Permission toggle", null, null) as null|anything in permissionlist - if(!new_permission) return - D.rights ^= permissionlist[new_permission] + while(TRUE) + var/list/permissionlist = list() + for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift + permissionlist[rights2text(i)] = i + var/new_permission = input("Select a permission to turn on/off", adm_ckey + "'s Permissions", null, null) as null|anything in permissionlist + if(!new_permission) + return + var/oldrights = D.rights + var/toggleresult = "ON" + D.rights ^= permissionlist[new_permission] + if(oldrights > D.rights) + toggleresult = "OFF" + + message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey] to [toggleresult]") + log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey] to [toggleresult]") + log_admin_permission_modification(adm_ckey, permissionlist[new_permission]) - message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey]") - log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey]") - log_admin_permission_modification(adm_ckey, permissionlist[new_permission]) edit_admin_permissions() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index bf6575b6659..3d0d067f5b5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -115,7 +115,17 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," X << 'sound/effects/adminhelp.ogg' to_chat(X, msg) if("Adminhelp") - msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (REJT) [ai_found ? " (CL)" : ""] (TAKE) : [msg]" + var/ticketNum // Holder for the ticket number + var/prunedmsg ="[usr.client]: [msg]" // Message without links + if(globAdminTicketHolder.checkForOpenTicket(usr.client)) // If user already has an open ticket + var/datum/admin_ticket/T = globAdminTicketHolder.checkForOpenTicket(usr.client) // Make T equal to the ticket they have open + ticketNum = T.ticketNum // ticketNum is the number of their ticket. + T.addResponse(usr.client, msg) + else + ticketNum = globAdminTicketHolder.getTicketCounter() // ticketNum is the ticket ready to be assigned. + msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""] : [msg]" + //Open a new adminticket and inform the user. + globAdminTicketHolder.newTicket(src, prunedmsg, msg) for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 9976c7d10b9..4c045e193c8 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -183,6 +183,23 @@ if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]") + //Check if the mob being PM'd has any open admin tickets. + var/tickets = list() + tickets = globAdminTicketHolder.checkForTicket(C) + if(tickets) + for(var/datum/admin_ticket/i in tickets) + i.addResponse(src, msg) // Add this response to their open tickets. + return + + tickets = globAdminTicketHolder.checkForTicket(src) + if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets + tickets = globAdminTicketHolder.checkForTicket(src) + if(tickets) + for(var/datum/admin_ticket/i in tickets) + i.addResponse(src, msg) + return + + /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index 68d3301b11e..546955136f7 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -38,3 +38,49 @@ to_chat(src, "

A custom event is taking place. OOC Info:

") to_chat(src, "[html_encode(custom_event_msg)]") to_chat(src, "
") + +//admin event info to be view by admins + +/client/proc/cmd_admin_custom_event_info() + set category = "Event" + set name = "Change Custom Admin Event Info" + + if(!check_rights(R_EVENT)) + to_chat(src, "Only administrators may use this command.") + return + + var/input = input(usr, "Enter the description of the custom event. This is informations for admins only. Use it to notify other admins of event info but not players.", "Custom Event Info", custom_event_msg) as message|null + if(!input || input == "") + custom_event_admin_msg = null + log_admin("[key_name(usr)] has cleared the custom admin event info text.") + message_admins("[key_name_admin(usr)] has cleared the custom admin event text.") + return + + log_admin("[key_name(usr)] has changed the custom admin event info text.") + message_admins("[key_name_admin(usr)] has changed the custom admin event info text.") + + custom_event_admin_msg = input + + for(var/client/X in admins) + if(check_rights(R_EVENT,0,X.mob)) + to_chat(X, "

Custom Admin Event Info

") + to_chat(X, "

A custom event is starting. OOC Admin Info:

") + to_chat(X, "[html_encode(custom_event_admin_msg)]") + to_chat(X,"
") + +/client/proc/cmd_view_custom_event_info() + set category = "Event" + set name = "Custom Event Admin Info" + + if(!check_rights(R_EVENT)) + to_chat(src, "Only administrators may use this command.") + return + + if(!custom_event_admin_msg || custom_event_admin_msg == "") + to_chat(src, "There currently is no known custom admin event taking place.") + return + + to_chat(src, "

Custom Event Info

") + to_chat(src, "

A custom event is taking place. OOC Info:

") + to_chat(src, "[html_encode(custom_event_admin_msg)]") + to_chat(src, "
") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ccae0db2988..84f95096078 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -61,7 +61,7 @@ if(usr) if(usr.client) if(usr.client.holder) - to_chat(M, "old You hear a voice in your head... [msg]") + to_chat(M, "You hear a voice in your head... [msg]") log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") message_admins("SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 00402f2deb6..2720f8086d0 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -436,6 +436,8 @@ on_holder_add() add_admin_verbs() admin_memo_output("Show", 0, 1) + if(custom_event_admin_msg && custom_event_admin_msg != "" && check_rights(R_EVENT)) + cmd_view_custom_event_info() // Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays. // (but turn them off first, since sometimes BYOND doesn't turn them on properly otherwise) diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index 58315d2f2a2..c4a49ee5575 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -155,4 +155,49 @@ path = /obj/item/clothing/accessory/corset/blue +/datum/gear/accessory/armband_red + display_name = "armband" + path = /obj/item/clothing/accessory/armband + +/datum/gear/accessory/armband_civ + display_name = "armband, blue-yellow" + path = /obj/item/clothing/accessory/armband/yb + +/datum/gear/accessory/armband_sec + display_name = " armband, security" + path = /obj/item/clothing/accessory/armband/sec + allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician") + +/datum/gear/accessory/armband_cargo + display_name = "cargo armband" + path = /obj/item/clothing/accessory/armband/cargo + allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner") + +/datum/gear/accessory/armband_medical + display_name = "armband, medical" + path = /obj/item/clothing/accessory/armband/med + allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician") + +/datum/gear/accessory/armband_emt + display_name = "armband, EMT" + path = /obj/item/clothing/accessory/armband/medgreen + allowed_roles = list("Paramedic", "Brig Physician") + +/datum/gear/accessory/armband_engineering + display_name = "armband, engineering" + path = /obj/item/clothing/accessory/armband/engine + allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist") + +/datum/gear/accessory/armband_hydro + display_name = "armband, hydroponics" + path = /obj/item/clothing/accessory/armband/hydro + allowed_roles = list("Botanist") + +/datum/gear/accessory/armband_sci + display_name = "armband, science" + path = /obj/item/clothing/accessory/armband/science + allowed_roles = list("Research Director","Scientist", "Roboticist") + + + diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index a0a445f59be..c478eb9bab2 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -321,7 +321,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Hair: " dat += "[h_style]" dat += "Color [color_square(h_colour)]" - var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/temp_hair_style = hair_styles_public_list[h_style] if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour) dat += " Color #2 [color_square(h_sec_colour)]" dat += "
" @@ -1397,7 +1397,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("secondary_hair") if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/hair_style = hair_styles_public_list[h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", h_sec_colour) as color|null if(new_hair) @@ -1405,8 +1405,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("h_style") var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/SA = hair_styles_list[hairstyle] + for(var/hairstyle in hair_styles_public_list) + var/datum/sprite_accessory/SA = hair_styles_public_list[hairstyle] if(hairstyle == "Bald") //Just in case. valid_hairstyles += hairstyle @@ -1730,7 +1730,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts nanotrasen_relation = new_relation if("flavor_text") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message + var/msg = input(usr,"Set the flavor text in your 'examine' verb. The flavor text should be a physical descriptor of your character at a glance. SFW Drawn Art of your character is acceptable.","Flavor Text",html_decode(flavor_text)) as message if(msg != null) msg = copytext(msg, 1, MAX_MESSAGE_LEN) @@ -1798,7 +1798,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("Normal") if(limb == "head") m_styles["head"] = "None" - h_style = hair_styles_list["Bald"] + h_style = hair_styles_public_list["Bald"] f_style = facial_hair_styles_list["Shaved"] organ_data[limb] = null rlimb_data[limb] = null @@ -1849,7 +1849,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(limb == "head") ha_style = "None" alt_head = null - h_style = hair_styles_list["Bald"] + h_style = hair_styles_public_list["Bald"] f_style = facial_hair_styles_list["Shaved"] m_styles["head"] = "None" rlimb_data[limb] = choice diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index a7c3810a40d..5581d0a1844 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -263,7 +263,7 @@ for(var/marking_location in m_colours) m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location]) hacc_colour = sanitize_hexcolor(hacc_colour) - h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) + h_style = sanitize_inlist(h_style, hair_styles_public_list, initial(h_style)) f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) for(var/marking_location in m_styles) m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location]) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index a3a38e3af58..af0b6e17601 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -77,13 +77,18 @@ /obj/item/clothing/gloves/color/black/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/wirecutters)) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed - to_chat(user, "You snip the fingertips off of [src].") - playsound(user.loc, W.usesound, rand(10,50), 1) - var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc) - if(pickpocket) - F.pickpocket = 1 - qdel(src) - return + var/confirm = alert("Do you want to cut off the gloves fingertips? Warning: It might destroy their functionality.","Cut tips?","Yes","No") + if(get_dist(user, src) > 1) + to_chat(user, "You have moved too far away.") + return + if(confirm == "Yes") + to_chat(user, "You snip the fingertips off of [src].") + playsound(user.loc, W.usesound, rand(10,50), 1) + var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc) + if(pickpocket) + F.pickpocket = FALSE + qdel(src) + return ..() /obj/item/clothing/gloves/color/orange diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 43962a1d5fd..b67e485aa6e 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -347,6 +347,12 @@ var/datum/action/A = X A.UpdateButtonIcon() +/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom + name = "eagle helmet" + desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." + icon_state = "griffinhat" + item_state = "griffinhat" + /obj/item/clothing/suit/space/hardsuit/syndi name = "blood-red hardsuit" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." @@ -429,6 +435,14 @@ name = "elite syndicate hardsuit (combat)" desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders." + +/obj/item/clothing/suit/space/hardsuit/syndi/freedom + name = "eagle suit" + desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit." + icon_state = "freedom" + item_state = "freedom" + + //Wizard hardsuit /obj/item/clothing/head/helmet/space/hardsuit/wizard name = "gem-encrusted hardsuit helmet" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 60e76418a53..7d2d5bd4635 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -246,24 +246,3 @@ species_fit = null sprite_sheets = null sprite_sheets_obj = null - -/obj/item/clothing/head/helmet/space/freedom - name = "eagle helmet" - desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." - icon_state = "griffinhat" - item_state = "griffinhat" - armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT - unacidable = 1 - strip_delay = 130 - -/obj/item/clothing/suit/space/freedom - name = "eagle suit" - desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode." - icon_state = "freedom" - item_state = "freedom" - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) - armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT - unacidable = 1 - strip_delay = 130 diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm index 67d0208b6df..90bcf90ec62 100644 --- a/code/modules/clothing/under/accessories/armband.dm +++ b/code/modules/clothing/under/accessories/armband.dm @@ -5,6 +5,18 @@ item_color = "red" slot = "armband" +/obj/item/clothing/accessory/armband/sec + name = "security armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and red." + icon_state = "whitered" + item_color = "whitered" + +/obj/item/clothing/accessory/armband/yb + name = "blue-yellow armband" + desc = "A fancy blue and yellow armband!" + icon_state = "solblue" + item_color = "solblue" + /obj/item/clothing/accessory/armband/cargo name = "cargo armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown." diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index a85a34caffb..348a9178721 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1195,6 +1195,26 @@ return 1 ..() +/obj/item/fluff/zekemirror //phantasmicdream : Zeke Varloss + name = "engraved hand mirror" + desc = "A very classy hand mirror, with fancy detailing." + icon = 'icons/obj/custom_items.dmi' + icon_state = "hand_mirror" + attack_verb = list("smacked") + hitsound = 'sound/weapons/tap.ogg' + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_SMALL + +/obj/item/fluff/zekemirror/attack_self(mob/user) + var/mob/living/carbon/human/target = user + if(!istype(target) || target.get_species() != "Skrell") // It'd be strange to see other races with head tendrils. + return + + if(target.change_hair("Zekes Tentacles", 1)) + to_chat(target, "You take time to admire yourself in [src], brushing your tendrils down and revealing their true length.") + + /obj/item/clothing/accessory/necklace/locket/fluff/fethasnecklace //Fethas: Sefra'neem name = "Orange gemmed locket" desc = "A locket with a orange gem set on the front, the picture inside seems to be of a Tajaran." @@ -1212,4 +1232,4 @@ righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' icon_state = "sheetcosmos" item_state = "sheetcosmos" - item_color = "sheetcosmos" + item_color = "sheetcosmos" \ No newline at end of file diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index ed8b8d52ccd..288fbe3f809 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -1,12 +1,10 @@ /datum/event/alien_infestation announceWhen = 400 - var/spawncount = 1 + var/spawncount = 2 var/successSpawn = 0 //So we don't make a command report if nothing gets spawned. /datum/event/alien_infestation/setup() announceWhen = rand(announceWhen, announceWhen + 50) - if(prob(50)) - spawncount++ /datum/event/alien_infestation/announce() if(successSpawn) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 137ffc83183..ae6794d5e8d 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -22,8 +22,8 @@ var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","psilocybin","lube", "atrazine","banana","charcoal","space_drugs","methamphetamine","holywater","ethanol","hot_coco","facid", "blood","morphine","ether","fluorine","mutadone","mutagen","hydrocodone","fuel", - "haloperidol","lsd","nanites","lipolicide","frostoil","salglu_solution","beepskysmash", - "omnizine", "amanitin", "adminordrazine", "neurotoxin", "synaptizine") + "haloperidol","lsd","syndicate_nanites","lipolicide","frostoil","salglu_solution","beepskysmash", + "omnizine", "amanitin", "neurotoxin", "synaptizine") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = vent R.add_reagent(pick(gunk), 50) diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index 7b97e22f142..87d92615be0 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -286,7 +286,7 @@ drink_container.desc = "[recipe_to_use.description]" flick("bottler_on", src) spawn(45) - QDEL_LIST_ASSOC_VAL(slots) + resetSlots() bottling = 0 drink_container.forceMove(loc) updateUsrDialog() @@ -405,3 +405,7 @@ icon_state = "bottler_on" else icon_state = "bottler_off" + +/obj/machinery/bottler/proc/resetSlots() + QDEL_LIST_ASSOC_VAL(slots) + slots.len = 3 \ No newline at end of file diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 7bfa00d35c3..3b21cef533e 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -71,8 +71,7 @@ var/datum/reagent/R = null if(random_reagent) - R = pick(subtypesof(/datum/reagent)) - R = chemical_reagents_list[initial(R.id)] + R = get_random_reagent_id() queen_bee = new(src) queen_bee.beehome = src @@ -89,13 +88,12 @@ B.beehome = src B.assign_reagent(R) - /obj/structure/beebox/premade/random random_reagent = TRUE /obj/structure/beebox/process() - if(queen_bee) + if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth)) if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST) if(honeycombs.len < get_max_honeycomb()) bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0) @@ -172,11 +170,13 @@ var/obj/item/queen_bee/qb = I user.unEquip(qb) - - qb.queen.forceMove(src) - bees += qb.queen - queen_bee = qb.queen - qb.queen = null + if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth)) + qb.queen.forceMove(src) + bees += qb.queen + queen_bee = qb.queen + qb.queen = null + else + visible_message("The [qb] refuses to settle down. Maybe it's something to do with its reagent?") if(queen_bee) visible_message("[user] sets [qb] down inside the apiary, making it their new home.") diff --git a/code/modules/martial_arts/krav_maga.dm b/code/modules/martial_arts/krav_maga.dm index e1a577e24fa..1a3bba05140 100644 --- a/code/modules/martial_arts/krav_maga.dm +++ b/code/modules/martial_arts/krav_maga.dm @@ -151,6 +151,7 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi /obj/item/clothing/gloves/color/black/krav_maga var/datum/martial_art/krav_maga/style = new + can_be_cut = FALSE /obj/item/clothing/gloves/color/black/krav_maga/equipped(mob/user, slot) if(!ishuman(user)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index d37d83e8215..5132ae9453c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -13,6 +13,8 @@ var/leap_on_click = 0 var/custom_pixel_x_offset = 0 //for admin fuckery. var/custom_pixel_y_offset = 0 + pressure_resistance = 100 //100 kPa difference required to push + throw_pressure_limit = 120 //120 kPa difference required to throw //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/humanoid/New() diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 498a2afb8b0..2f489f3ea2d 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -149,7 +149,10 @@ var/const/MAX_ACTIVE_TIME = 400 M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings else if(iscorgi(M)) var/mob/living/simple_animal/pet/corgi/C = M - loc = C + if(C.facehugger) + var/obj/item/F = C.facehugger + F.forceMove(C.loc) + forceMove(C) C.facehugger = src C.regenerate_icons() @@ -161,7 +164,7 @@ var/const/MAX_ACTIVE_TIME = 400 return 1 /obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob) - if(!target || target.stat == DEAD) //was taken off or something + if(!target || target.stat == DEAD || loc != target) //was taken off or something return if(iscarbon(target)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 512bd475b83..0a1244094db 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -727,23 +727,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) -/mob/living/carbon/proc/spin(spintime, speed) - spawn() - var/D = dir - while(spintime >= speed) - sleep(speed) - switch(D) - if(NORTH) - D = EAST - if(SOUTH) - D = WEST - if(EAST) - D = SOUTH - if(WEST) - D = NORTH - dir = D - spintime -= speed - /mob/living/carbon/resist_buckle() spawn(0) resist_muzzle() @@ -1117,4 +1100,4 @@ so that different stomachs can handle things in different ways VB*/ update_tint() if(I.flags_inv & HIDEMASK || forced) update_inv_wear_mask() - update_inv_head() + update_inv_head() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 67a8fb7fa20..4de6b16a687 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -27,8 +27,8 @@ var/toxins_alert = 0 var/co2_alert = 0 var/fire_alert = 0 + var/list/active_effect = list() var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/co2overloadtime = null - blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 3cb6cec5720..80b871e7996 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -21,7 +21,7 @@ gender = new_gender - var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style] + var/datum/sprite_accessory/hair/current_hair = hair_styles_full_list[H.h_style] if(current_hair.gender != NEUTER && current_hair.gender != gender) reset_head_hair() @@ -35,9 +35,12 @@ update_body() return 1 -/mob/living/carbon/human/proc/change_hair(var/hair_style) +/mob/living/carbon/human/proc/change_hair(var/hair_style, var/fluff) var/obj/item/organ/external/head/H = get_organ("head") - if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list)) + + if(!hair_style || !H || H.h_style == hair_style) + return + if(!(fluff || (hair_style in hair_styles_public_list))) return H.h_style = hair_style @@ -339,8 +342,8 @@ if(!H) return //No head, no hair. - 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 diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 761f35b9520..cf49a328981 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -140,3 +140,4 @@ var/global/list/body_accessory_by_species = list("None" = null) icon_state = "vulptail6" animated_icon_state = "vulptail6_a" allowed_species = list("Vulpkanin") + diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index ee58248b03e..97b9dcaa21f 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -92,7 +92,7 @@ on_CD = handle_emote_CD(50) //longer cooldown if("fart", "farts", "flip", "flips", "snap", "snaps") on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - if("cough", "coughs", "slap", "slaps") + if("cough", "coughs", "slap", "slaps", "highfive") on_CD = handle_emote_CD() if("sneeze", "sneezes") on_CD = handle_emote_CD() @@ -821,10 +821,42 @@ continue M.reagents.add_reagent("jenkem", 1) + if("hem") + message = "[src] hems." + + if("highfive") + if(restrained()) + return + if(EFFECT_HIGHFIVE in active_effect) + to_chat(src, "You give up on the high-five.") + active_effect -= EFFECT_HIGHFIVE + return + active_effect |= EFFECT_HIGHFIVE + for(var/mob/living/carbon/C in orange(1)) + if(EFFECT_HIGHFIVE in C.active_effect) + if((C.mind.special_role == SPECIAL_ROLE_WIZARD) && (mind.special_role == SPECIAL_ROLE_WIZARD)) + visible_message("[name] and [C.name] high-five EPICALLY!") + status_flags |= GODMODE + C.status_flags |= GODMODE + explosion(loc,5,2,1,3) + status_flags &= ~GODMODE + C.status_flags &= ~GODMODE + break + visible_message("[name] and [C.name] high-five!") + C.active_effect -= EFFECT_HIGHFIVE + active_effect -= EFFECT_HIGHFIVE + playsound('sound/effects/snap.ogg', 50) + break + if(EFFECT_HIGHFIVE in active_effect) + visible_message("[name] requests a highfive.", "You request a highfive.") + if(do_after(src, 25, target = src)) + visible_message("[name] was left hanging. Embarrassing.", "You are left hanging. How embarrassing!") + active_effect -= EFFECT_HIGHFIVE + if("help") var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dance, dap(s)(none)/mob," \ + " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \ - + " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \ + + " handshake-mob, hug(s)-(none)/mob, hem, highfive, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \ + " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \ + " wag(s), wave(s), whimper(s), wink(s), yawn(s)" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6a223324268..a2235b3811c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -62,6 +62,7 @@ /mob/living/carbon/human/Destroy() QDEL_LIST(bodyparts) + splinted_limbs.Cut() return ..() /mob/living/carbon/human/dummy @@ -796,7 +797,7 @@ if(href_list["criminal"]) if(hasHUD(usr,"security")) - var/modified = 0 + var/found_record = 0 var/perpname = "wot" if(wear_id) var/obj/item/weapon/card/id/I = wear_id.GetID() @@ -814,16 +815,33 @@ if(R.fields["id"] == E.fields["id"]) var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel") + var/t1 = copytext(trim(sanitize(input("Enter Reason:", "Security HUD", null, null) as text)), 1, MAX_MESSAGE_LEN) + if(!t1) + t1 = "(none)" + + if(hasHUD(usr, "security") && setcriminal != "Cancel") + found_record = 1 + var/their_name = R.fields["name"] + var/their_rank = R.fields["rank"] + if(R.fields["criminal"] == "*Execute*") + to_chat(usr, "Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.") + else + if(ishuman(usr)) + var/mob/living/carbon/human/U = usr + R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] with comment: [t1]
" + if(isrobot(usr)) + var/mob/living/silicon/robot/U = usr + R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] with comment: [t1]
" + if(isAI(usr)) + var/mob/living/silicon/ai/U = usr + R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()] with comment: [t1]
" - if(hasHUD(usr, "security")) - if(setcriminal != "Cancel") R.fields["criminal"] = setcriminal - modified = 1 - + log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [setcriminal], comment: [t1]") spawn() sec_hud_set_security_status() - if(!modified) + if(!found_record) to_chat(usr, "Unable to locate a data core entry for this person.") if(href_list["secrecord"]) @@ -1590,8 +1608,8 @@ else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize. var/list/hair = list() - for(var/i in hair_styles_list) - var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + for(var/i in hair_styles_public_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i] if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use. hair += i @@ -1761,6 +1779,8 @@ var/datum/data/record/R = find_record("name", perpname, data_core.security) if(R && R.fields["criminal"]) switch(R.fields["criminal"]) + if("*Execute*") + threatcount += 7 if("*Arrest*") threatcount += 5 if("Incarcerated") diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 393eae95299..a7fcc6874a2 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -72,3 +72,5 @@ var/global/default_martial_art = new/datum/martial_art var/datum/body_accessory/body_accessory = null var/tail // Name of tail image in species effects icon file. + + var/list/splinted_limbs = list() //limbs we know are splinted diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 3f78bd46e19..fc048ab161a 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -36,40 +36,45 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() if(.) // did we actually move? - if(!lying && !buckled) - var/obj/item/clothing/shoes/S = shoes - if(!has_gravity(loc)) - return - //Bloody footprints - var/turf/T = get_turf(src) - var/obj/item/organ/external/l_foot = get_organ("l_foot") - var/obj/item/organ/external/r_foot = get_organ("r_foot") - var/hasfeet = 1 - if(!l_foot && !r_foot) - hasfeet = 0 + if(!lying && !buckled && !throwing) + for(var/obj/item/organ/external/splinted in splinted_limbs) + splinted.update_splints() + + if(!has_gravity(loc)) + return + + var/obj/item/clothing/shoes/S = shoes + + //Bloody footprints + var/turf/T = get_turf(src) + var/obj/item/organ/external/l_foot = get_organ("l_foot") + var/obj/item/organ/external/r_foot = get_organ("r_foot") + var/hasfeet = TRUE + if(!l_foot && !r_foot) + hasfeet = FALSE - if(shoes) - if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) - var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T - if(oldFP && oldFP.blood_state == S.blood_state && oldFP.basecolor == S.blood_color) - return - else - //No oldFP or it's a different kind of blood - S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) - createFootprintsFrom(shoes, dir, T) - update_inv_shoes() - else if(hasfeet) - if(bloody_feet && bloody_feet[blood_state]) - var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T - if(oldFP && oldFP.blood_state == blood_state && oldFP.basecolor == feet_blood_color) - return - else - bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP) - createFootprintsFrom(src, dir, T) - update_inv_shoes() - //End bloody footprints - if(S) - S.step_action(src) + if(shoes) + if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && oldFP.blood_state == S.blood_state && oldFP.basecolor == S.blood_color) + return + else + //No oldFP or it's a different kind of blood + S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) + createFootprintsFrom(shoes, dir, T) + update_inv_shoes() + else if(hasfeet) + if(bloody_feet && bloody_feet[blood_state]) + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && oldFP.blood_state == blood_state && oldFP.basecolor == feet_blood_color) + return + else + bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP) + createFootprintsFrom(src, dir, T) + update_inv_shoes() + //End bloody footprints + if(S) + S.step_action(src) /mob/living/carbon/human/handle_footstep(turf/T) if(..()) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 038735f1621..157e95da32d 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -182,3 +182,9 @@ I use this to standardize shadowling dethrall code odmg += O.brute_dam odmg += O.burn_dam return (health < (100 - odmg)) + +/mob/living/carbon/human/proc/handle_splints() //proc that rebuilds the list of splints on this person, for ease of processing + splinted_limbs.Cut() + for(var/obj/item/organ/external/limb in bodyparts) + if(limb.status & ORGAN_SPLINTED) + splinted_limbs += limb \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 403b30a039d..516f6b5aee8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -94,32 +94,49 @@ if(getBrainLoss() >= 60 && stat != DEAD) speech_problem_flag = 1 if(prob(3)) - var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH", + var/list/s1 = list("IM A [pick("PONY","LIZARD","taJaran","kitty","Vulpakin","drASK","BIRDIE","voxxie","race car","combat meCH","SPESSSHIP")] [pick("NEEEEEEIIIIIIIIIGH","sKREEEEEE","MEOW","NYA~","rawr","Barkbark","Hissssss","vROOOOOM","pewpew","choo Choo")]!", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", - "Bi is THE BEST OF BOTH WORLDS>", + "Bi is THE BEST OF BOTH WORLDS", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", - "SOTP IT#") + "SOTP IT!", + "HALPZ SITCULITY", + "VOXES caN't LOVE", + "my dad own this station", + "the CHef put [pick("PROTEIN", "toiret waTer", "RiPPleing TendIes", "Einzymes","HORRY WALTER","nuTriments","ReActive MutAngen","TeSLium","sKrektonium")] in my [pick("wiSh soup","Bullito","rAingurber","sOilent GREEn","KoI Susishes","yaya")]!", + "the monkey have TASER ARMS!", + "qM blew my points on [pick("cOMbat Shtogun","inSuLated gloves","LOTS MASSHEEN!")]", + "EI'NATH!", + "WAKE UP SHEEPLES!", + "et wus my [pick("wittle brother!!","fiancee","friend staying over","entiRe orphanage","love interest","wife","husband","liTTle kids","sentient cAT","accidentally")]!") var/list/s2 = list("FUS RO DAH", - "fucking 4rries!", + "fuckin tangerines!!!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", - "lol2cat", + "HAZ A SECURE DAY!!!!", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", - "lifelike texture ;_;", + "lifelike texture", "luv can bloooom", - "PACKETS!!!") + "PACKETS!!!", + "[pick("WHERE MY","aYE need","giv me my","bath me inn.")] [pick("dermaline","alKkyZine","dylOvene","inAprovaline","biCaridine","Hyperzine","kELotane","lePorazine","bAcch Salts","tricord","clOnexazone","hydroChloric Acid","chlorine Hydrate","paRoxetine")]!", + "mALPRACTICEBAY", + "I HavE A pe H dee iN ENTerpriSE resOUrCE pLaNNIN", + "h-h-HalP MaINT", + "dey come, dey COME! DEY COME!!!", + "THE END IS NIGH!", + "I FOT AND DIED FOR MUH [pick("RITES","FREEDOM","payCHECK","cARGO points","teCH Level","doG","mAPLe syrup","fluffy fWiends","gateway Loot")]", + "KILL DEM [pick("mainTnacE cHickinNS","kiRA CulwnNES","FLOOR CLUWNEs","MIME ASSASSIN","BOMBING TAJARAN","cC offiser","morPhlings","slinglings")]!") switch(pick(1,2,3)) if(1) say(pick(s1)) diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index 989fe9ba62a..4c1d8e9aa2e 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -73,7 +73,7 @@ node.remove(H) node.loc = M.loc to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae.") - to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].") + to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].") to_chat(H, "It's so quiet...") head_organ.h_style = "Bald" H.update_hair() diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index b8f4208df90..eef78948f7a 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -54,6 +54,7 @@ if(L.brute_dam < L.min_broken_damage) L.status &= ~ORGAN_BROKEN L.status &= ~ORGAN_SPLINTED + H.handle_splints() L.perma_injury = 0 break // We're only checking one limb here, bucko if(prob(3)) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 90002196c0f..90ee068486f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -442,7 +442,7 @@ var/global/list/damage_icon_parts = list() //var/icon/debrained_s = new /icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s") if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[head_organ.h_style] + var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style] //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) @@ -759,7 +759,7 @@ var/global/list/damage_icon_parts = list() else new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]") - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[head_organ.h_style] + var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style] if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. overlays_standing[GLASSES_OVER_LAYER] = new_glasses else diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 8a043dbf591..2221455c5a5 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -1,6 +1,9 @@ /mob/living/death(gibbed) blinded = max(blinded, 1) + if(suiciding) + mind.suicided = TRUE + clear_fullscreens() update_action_buttons_icon() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 81664f631d4..203e34b1f3b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -30,6 +30,7 @@ var/list/department_radio_keys = list( ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":Z" = "Service", "#Z" = "Service", ".Z" = "Service", ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private", + ":$" = "Response Team", "#$" = "Response Team", ".$" = "Response Team", ":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops", ":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam", ":X" = "cords", "#X" = "cords", ".X" = "cords" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f89b4f6377c..d70293ae10c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -68,6 +68,7 @@ var/list/robot_verbs_default = list( var/lockcharge //Used when locking down a borg to preserve cell charge var/speed = 0 //Cause sec borgs gotta go fast //No they dont! var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. + var/pdahide = 0 //Used to hide the borg from the messenger list var/tracking_entities = 0 //The number of known entities currently accessing the internal camera var/braintype = "Cyborg" var/base_icon = "" @@ -193,6 +194,7 @@ var/list/robot_verbs_default = list( return 1 + /mob/living/silicon/robot/proc/get_default_name(var/prefix as text) if(prefix) modtype = prefix @@ -226,10 +228,12 @@ var/list/robot_verbs_default = list( if(!rbPDA) rbPDA = new(src) rbPDA.set_name_and_job(real_name, braintype) - if(scrambledcodes) - var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger) - if(M) + var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger) + if(M) + if(scrambledcodes) M.hidden = 1 + if(pdahide) + M.toff = 1 /mob/living/silicon/robot/binarycheck() if(is_component_functioning("comms")) @@ -390,7 +394,7 @@ var/list/robot_verbs_default = list( module.add_subsystems_and_actions(src) //Custom_sprite check and entry - if(custom_sprite == 1) + if(custom_sprite && check_sprite("[ckey]-[modtype]")) module_sprites["Custom"] = "[src.ckey]-[modtype]" hands.icon_state = lowertext(module.module_type) @@ -489,7 +493,7 @@ var/list/robot_verbs_default = list( toggle_ionpulse() return - cell.charge -= 50 // 500 steps on a default cell. + cell.charge -= 25 // 500 steps on a default cell. return 1 /mob/living/silicon/robot/proc/toggle_ionpulse() @@ -1332,11 +1336,13 @@ var/list/robot_verbs_default = list( icon_state = "nano_bloodhound" lawupdate = 0 scrambledcodes = 1 + pdahide = 1 modtype = "Commando" faction = list("nanotrasen") designation = "Nanotrasen Combat" req_access = list(access_cent_specops) ionpulse = 1 + magpulse = 1 var/searching_for_ckey = 0 /mob/living/silicon/robot/deathsquad/New(loc) @@ -1380,11 +1386,13 @@ var/list/robot_verbs_default = list( icon_state = "syndie_bloodhound" lawupdate = 0 scrambledcodes = 1 + pdahide = 1 faction = list("syndicate") designation = "Syndicate Assault" modtype = "Syndicate" req_access = list(access_syndicate) ionpulse = 1 + magpulse = 1 lawchannel = "State" var/playstyle_string = "You are a Syndicate assault cyborg!
\ You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ @@ -1446,6 +1454,24 @@ var/list/robot_verbs_default = list( radio.config(module.channels) notify_ai(2) +/mob/living/silicon/robot/ert + designation = "ERT" + lawupdate = 0 + scrambledcodes = 1 + req_access = list(access_cent_specops) + ionpulse = 1 + +/mob/living/silicon/robot/ert/init() + laws = new /datum/ai_laws/ert_override + radio = new /obj/item/device/radio/borg/ert(src) + radio.recalculateChannels() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + +/mob/living/silicon/robot/ert/New(loc) + ..() + cell.maxcharge = 25000 + cell.charge = 25000 + /mob/living/silicon/robot/nations base_icon = "droidpeace" icon_state = "droidpeace" @@ -1483,3 +1509,10 @@ var/list/robot_verbs_default = list( borked_part.wrapped = new borked_part.external_type borked_part.heal_damage(brute,burn) borked_part.install() + +/mob/living/silicon/robot/proc/check_sprite(spritename) + . = FALSE + + var/static/all_borg_icon_states = icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi') + if(spritename in all_borg_icon_states) + . = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 3ea36bcc2cc..40b2dc832ba 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -681,11 +681,12 @@ if(istype(M,/mob/living/silicon/robot)) visible_message("[src] bumps into [M]!") else - add_logs(src, M, "knocked down") - visible_message("[src] knocks over [M]!") - M.stop_pulling() - M.Stun(8) - M.Weaken(5) + if(!paicard) + add_logs(src, M, "knocked down") + visible_message("[src] knocks over [M]!") + M.stop_pulling() + M.Stun(8) + M.Weaken(5) return ..() /mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 45029891575..6ef96d07447 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -60,7 +60,8 @@ if(can_collar) dat += " " dat += "Collar:[(collar && !(collar.flags&ABSTRACT)) ? collar : "Empty"]" - + if(facehugger) + dat += "Facehugger:[facehugger]" dat += {" Close "} @@ -103,11 +104,10 @@ /mob/living/simple_animal/pet/corgi/Topic(href, href_list) if(usr.stat) return - + if((!ishuman(usr) && !isrobot(usr)) || !Adjacent(usr)) + return //Removing from inventory if(href_list["remove_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr))) - return var/remove_from = href_list["remove_inv"] switch(remove_from) if("head") @@ -143,14 +143,9 @@ else to_chat(usr, "There is nothing to remove from its [remove_from].") return - show_inv(usr) - //Adding things to inventory else if(href_list["add_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr))) - return - var/add_to = href_list["add_inv"] switch(add_to) @@ -201,7 +196,16 @@ item_to_add.loc = src src.inventory_back = item_to_add regenerate_icons() - + show_inv(usr) +//Removing facehuggers + else if(href_list["remove_hugger"]) + if(!facehugger) + return + var/obj/item/F = facehugger + F.forceMove(loc) + facehugger = null + to_chat(usr, "You remove [F] from [src]'s face. [src] pants for air and barks.") + regenerate_icons() show_inv(usr) else ..() @@ -462,10 +466,7 @@ if(prob(1)) custom_emote(1, pick("dances around.","chases its tail!")) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - dir = i - sleep(1) + spin(20, 1) /obj/item/weapon/reagent_containers/food/snacks/meat/corgi name = "Corgi meat" @@ -550,10 +551,7 @@ if(!resting && !buckled) if(prob(1)) custom_emote(1, pick("dances around.","chases her tail.")) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - dir = i - sleep(1) + spin(20, 1) /mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm index a20c7b73d5f..52769f9dba6 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm @@ -6,6 +6,4 @@ for(var/mob/O in oviewers(src, null)) if((O.client && !( O.blinded ))) to_chat(O, text("[] [pick("dances around","chases its tail")].", src)) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - dir = i - sleep(1) + spin(20, 1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 88db29b88a7..86dbc13b643 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -23,6 +23,8 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 15 heat_damage_per_tick = 20 + pressure_resistance = 100 //100 kPa difference required to push + throw_pressure_limit = 120 //120 kPa difference required to throw faction = list("alien") status_flags = CANPUSH minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index ffd354961ef..a2d6c915d77 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -127,9 +127,6 @@ return 1 return 0 - - - //Botany Worker Bees /mob/living/simple_animal/hostile/poison/bees/worker //Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee) @@ -253,6 +250,9 @@ if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped if(S.reagents.has_reagent("royal_bee_jelly",5)) S.reagents.remove_reagent("royal_bee_jelly", 5) + if(!queen.beegent.can_synth) + to_chat(user, "You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.") + return var/obj/item/queen_bee/qb = new(get_turf(user)) qb.queen = new(qb) if(queen && queen.beegent) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index d5e70b27b7e..2124a31078c 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -16,6 +16,8 @@ humanize_prompt += " Role: [spider_role_summary]" if(user.ckey in ts_ckey_blacklist) error_on_humanize = "You are not able to control any terror spider this round." + else if(user.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + error_on_humanize = "You have enabled antag HUD and are unable to re-enter the round." else if(spider_awaymission) error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts." else if(!ai_playercontrol_allowtype) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 0f85d78d01f..dd5fe980214 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -38,6 +38,8 @@ var/global/list/ts_spiderling_list = list() // Movement move_to_delay = 6 turns_per_move = 5 + pressure_resistance = 50 //50 kPa difference required to push + throw_pressure_limit = 100 //100 kPa difference required to throw pass_flags = PASSTABLE // Ventcrawling diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3eea5d36372..aa4fb41ca08 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1264,4 +1264,21 @@ var/list/slot_equipment_priority = list( \ .["Add Verb"] = "?_src_=vars;addverb=[UID()]" .["Remove Verb"] = "?_src_=vars;remverb=[UID()]" - .["Gib"] = "?_src_=vars;gib=[UID()]" \ No newline at end of file + .["Gib"] = "?_src_=vars;gib=[UID()]" + +/mob/proc/spin(spintime, speed) + set waitfor = 0 + var/D = dir + while(spintime >= speed) + sleep(speed) + switch(D) + if(NORTH) + D = EAST + if(SOUTH) + D = WEST + if(EAST) + D = SOUTH + if(WEST) + D = NORTH + setDir(D) + spintime -= speed \ No newline at end of file diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index a1ee93e986a..63a8d5ad78c 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -341,7 +341,7 @@ face_s.Blend(eyes_s, ICON_OVERLAY) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(current_species.name == "Slime People") // whee I am part of the problem diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 5572f9cc8af..3c44bb5a82a 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -17,16 +17,21 @@ conversion in savefile.dm */ -/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female) +/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female, var/list/full_list) if(!istype(L)) L = list() if(!istype(male)) male = list() if(!istype(female)) female = list() + if(!istype(full_list)) full_list = list() for(var/path in subtypesof(prototype)) var/datum/sprite_accessory/D = new path() if(D.name) - L[D.name] = D + if(D.fluff) + full_list[D.name] = D + else + L[D.name] = D + full_list[D.name] = D switch(D.gender) if(MALE) male[D.name] = D @@ -50,7 +55,7 @@ var/marking_location //Specifies which bodypart a body marking is located on. var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this. var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme. - + var/fluff = 0 // Whether or not the accessory can be affected by colouration var/do_colouration = 1 @@ -65,7 +70,7 @@ /datum/sprite_accessory/hair icon = 'icons/mob/human_face.dmi' // default icon for all hairs - var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value. + var/glasses_over //Hair styles with hair that don't overhang the arms of glasses should have glasses_over set to a positive value /datum/sprite_accessory/hair/bald name = "Bald" @@ -566,7 +571,7 @@ name = "Unathi Side Frills" icon_state = "unathi_sidefrills" secondary_theme = "webbing" - + /datum/sprite_accessory/hair/unathi/una_cobra_hood icon = 'icons/mob/human_face.dmi' name = "Unathi Cobra Hood" @@ -742,6 +747,8 @@ icon_state = "hair_fingerwave" glasses_over = null + + /datum/sprite_accessory/hair/vulpkanin species_allowed = list("Vulpkanin") @@ -927,6 +934,15 @@ icon_state = "nuc_neutron" + +/datum/sprite_accessory/hair/fluff + fluff = 1 + +/datum/sprite_accessory/hair/fluff/zeke_fluff_tentacle //Zeke Fluff hair + name = "Zekes Tentacles" + icon_state = "zeke_fluff_hair" + species_allowed = list("Skrell") + /* /////////////////////////////////// / =---------------------------= / diff --git a/code/modules/nano/modules/ert_manager.dm b/code/modules/nano/modules/ert_manager.dm new file mode 100644 index 00000000000..8c17cda55e2 --- /dev/null +++ b/code/modules/nano/modules/ert_manager.dm @@ -0,0 +1,104 @@ +/datum/nano_module/ert_manager + name = "ERT Manager" + var/ert_type = "Code Red" + var/commander_slots = 1 + var/security_slots = 3 + var/medical_slots = 3 + var/engineering_slots = 3 + var/janitor_slots = 0 + var/paranormal_slots = 0 + var/cyborg_slots = 0 + var/autoclose = 0 + + +/datum/nano_module/ert_manager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(ui && autoclose) + ui.close() + return 0 + if(!ui) + ui = new(user, src, ui_key, "ert_config.tmpl", "ERT Panel", 600, 600, state = state) + ui.open() + ui.set_auto_update(1) + +/datum/nano_module/ert_manager/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["set_code"]) + ert_type = href_list["set_code"] + + if(href_list["set_com"]) + commander_slots = text2num(href_list["set_com"]) + + if(href_list["set_sec"]) + security_slots = text2num(href_list["set_sec"]) + + if(href_list["set_med"]) + medical_slots = text2num(href_list["set_med"]) + + if(href_list["set_eng"]) + engineering_slots = text2num(href_list["set_eng"]) + + if(href_list["set_jan"]) + janitor_slots = text2num(href_list["set_jan"]) + + if(href_list["set_par"]) + paranormal_slots = text2num(href_list["set_par"]) + + if(href_list["set_cyb"]) + cyborg_slots = text2num(href_list["set_cyb"]) + + if(href_list["dispatch_ert"]) + ert_request_answered = 1 + var/slots_list = list() + if(commander_slots > 0) + slots_list += "commander: [commander_slots]" + if(security_slots > 0) + slots_list += "security: [security_slots]" + if(medical_slots > 0) + slots_list += "medical: [medical_slots]" + if(engineering_slots > 0) + slots_list += "engineering: [engineering_slots]" + if(janitor_slots > 0) + slots_list += "janitor: [janitor_slots]" + if(paranormal_slots > 0) + slots_list += "paranormal: [paranormal_slots]" + if(cyborg_slots > 0) + slots_list += "cyborg: [cyborg_slots]" + var slot_text = list_implode(slots_list, ", ") + notify_ghosts("An ERT is being dispatched. Open positions: [slot_text]") + message_admins("[key_name_admin(usr)] dispatched a [ert_type] ERT. Slots: [slot_text]", 1) + log_admin("[key_name(usr)] dispatched a [ert_type] ERT. Slots: [slot_text]") + autoclose = 1 + ui_interact(usr) + trigger_armed_response_team(convert_ert_string(ert_type), commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) + return 0 + + ui_interact(usr) + + +/proc/convert_ert_string(thestring) + switch(thestring) + if("Code Amber") + return new /datum/response_team/amber + if("Code Red") + return new /datum/response_team/red + if("Code Gamma") + return new /datum/response_team/gamma + + +/datum/nano_module/ert_manager/ui_data() + var/data[0] + data["alert_level"] = get_security_level() + data["ert_type"] = ert_type + data["com"] = commander_slots + data["sec"] = security_slots + data["med"] = medical_slots + data["eng"] = engineering_slots + data["jan"] = janitor_slots + data["par"] = paranormal_slots + data["cyb"] = cyborg_slots + + return data + diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 8b749a67903..f7aee8f2875 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -111,8 +111,6 @@ nanoui is used to open and update nano browser uis // CodeMirror add_script("codemirror-compressed.js") // A custom minified JavaScript file of CodeMirror, with the following plugins: CSS Mode, NTSL Mode, CSS-hint addon, Search addon, Sublime Keymap. - add_stylesheet("codemirror.css") // A CSS sheet containing the basic stylings and formatting information for CodeMirror. - add_stylesheet("cm_lesser-dark.css") // A theme for CodeMirror to use, which closely resembles the rest of the NanoUI style. /** * Set the current status (also known as visibility) of this ui. diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index da26fc96fec..e46e1ed03f9 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,154 +1,159 @@ +#define PAPERWORK 1 +#define PHOTO 2 + /obj/item/weapon/clipboard name = "clipboard" + desc = "It looks like you're writing a letter. Want some help?" icon = 'icons/obj/bureaucracy.dmi' icon_state = "clipboard" item_state = "clipboard" - throwforce = 0 w_class = WEIGHT_CLASS_SMALL throw_speed = 3 - throw_range = 10 - var/obj/item/weapon/pen/haspen //The stored pen. - var/obj/item/weapon/toppaper //The topmost piece of paper. + var/obj/item/weapon/pen/containedpen + var/obj/item/weapon/toppaper slot_flags = SLOT_BELT burn_state = FLAMMABLE /obj/item/weapon/clipboard/New() + ..() update_icon() -/obj/item/weapon/clipboard/MouseDrop(obj/over_object as obj) //Quick clipboard fix. -Agouri - if(ishuman(usr)) - var/mob/M = usr - if(!(istype(over_object, /obj/screen) )) - return ..() +/obj/item/weapon/clipboard/verb/removePen(mob/user) + set category = "Object" + set name = "Remove clipboard pen" + if(!ishuman(user) || user.incapacitated()) + return + penPlacement(user, containedpen, FALSE) - if(!M.restrained() && !M.stat) - switch(over_object.name) - if("r_hand") - M.unEquip(src) - M.put_in_r_hand(src) - if("l_hand") - M.unEquip(src) - M.put_in_l_hand(src) +/obj/item/weapon/clipboard/proc/isPaperwork(obj/item/weapon/W) //This could probably do with being somewhere else but for now it's fine here. + if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/paper_bundle)) + return PAPERWORK + if(istype(W, /obj/item/weapon/photo)) + return PHOTO - add_fingerprint(usr) +/obj/item/weapon/clipboard/proc/checkTopPaper() + if(toppaper.loc != src) //Oh no! We're missing a top sheet! Better get another one to be at the top. + toppaper = locate(/obj/item/weapon/paper) in src + if(!toppaper) //In case there's no paper, try find a paper bundle instead (why is paper_bundle not a subtype of paper?) + toppaper = locate(/obj/item/weapon/paper_bundle) in src + +/obj/item/weapon/clipboard/examine(mob/user) + if(..(user, 1) && toppaper) + toppaper.examine(user) + +obj/item/weapon/clipboard/proc/penPlacement(mob/user, obj/item/weapon/pen/P, placing) + if(placing) + if(containedpen) + to_chat(user, "There's already a pen in [src]!") return + if(!is_pen(P)) + return + to_chat(user, "You slide [P] into [src].") + user.unEquip(P) + P.forceMove(src) + containedpen = P + else + if(!containedpen) + to_chat(user, "There isn't a pen in [src] for you to remove!") + return + to_chat(user, "You remove [containedpen] from [src].") + user.put_in_hands(containedpen) + containedpen = null + update_icon() + +/obj/item/weapon/clipboard/proc/showClipboard(mob/user) //Show them what's on the clipboard + var/dat = "[src]" + dat += "[containedpen ? "Remove pen" : "Add pen"]

" + if(toppaper) + dat += "Remove[toppaper.name]

" + for(var/obj/item/weapon/P in src) + if(isPaperwork(P) == PAPERWORK && P != toppaper) + dat += "RemovePut on top[P.name]
" + if(isPaperwork(P) == PHOTO) + dat += "Remove[P.name]
" + var/datum/browser/popup = new(user, "clipboard", "[src]", 400, 400) + popup.set_content(dat) + popup.open() /obj/item/weapon/clipboard/update_icon() overlays.Cut() if(toppaper) overlays += toppaper.icon_state overlays += toppaper.overlays - if(haspen) + if(containedpen) overlays += "clipboard_pen" overlays += "clipboard_over" return -/obj/item/weapon/clipboard/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - - if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo)) - user.drop_item() - W.loc = src - if(istype(W, /obj/item/weapon/paper)) +/obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user) + if(isPaperwork(W)) //If it's a photo, paper bundle, or piece of paper, place it on the clipboard. + user.unEquip(W) + W.forceMove(src) + to_chat(user, "You clip [W] onto [src].") + playsound(loc, "pageturn", 50, 1) + if(isPaperwork(W) == PAPERWORK) toppaper = W - to_chat(user, "You clip the [W] onto \the [src].") + update_icon() + else if(is_pen(W)) + if(!toppaper) //If there's no paper we can write on, just stick the pen into the clipboard + penPlacement(user, W, TRUE) + return + if(containedpen) //If there's a pen in the clipboard, let's just let them write and not bother asking about the pen + toppaper.attackby(W, user) + return + var/writeonwhat = input(user, "Write on [toppaper.name], or place your pen in [src]?", "Pick one!") as null|anything in list("Write", "Place pen") + if(!Adjacent(user) || user.incapacitated()) + return + switch(writeonwhat) + if("Write") + toppaper.attackby(W, user) + if("Place pen") + penPlacement(user, W, TRUE) + else + return + else if(istype(W, /obj/item/weapon/stamp) && toppaper) //We can stamp the topmost piece of paper + toppaper.attackby(W, user) update_icon() - else if(istype(toppaper) && istype(W, /obj/item/weapon/pen)) - toppaper.attackby(W, usr, params) - update_icon() - - return - -/obj/item/weapon/clipboard/attack_self(mob/user as mob) - var/dat = "Clipboard" - if(haspen) - dat += "Remove Pen

" - else - dat += "Add Pen

" - - //The topmost paper. I don't think there's any way to organise contents in byond, so this is what we're stuck with. -Pete - if(toppaper) - var/obj/item/weapon/paper/P = toppaper - dat += "Write Remove - [P.name]

" - - for(var/obj/item/weapon/paper/P in src) - if(P==toppaper) - continue - dat += "Remove - [P.name]
" - for(var/obj/item/weapon/photo/Ph in src) - dat += "Remove - [Ph.name]
" - - user << browse(dat, "window=clipboard") - onclose(user, "clipboard") - add_fingerprint(usr) - return +/obj/item/weapon/clipboard/attack_self(mob/user) + showClipboard(user) /obj/item/weapon/clipboard/Topic(href, href_list) ..() - if((usr.stat || usr.restrained())) + if(!Adjacent(usr) || usr.incapacitated()) return + var/obj/item/I = usr.get_active_hand() + if(href_list["doPenThings"]) + if(href_list["doPenThings"] == "Add") + penPlacement(usr, I, TRUE) + else + penPlacement(usr, containedpen, FALSE) + else if(href_list["remove"]) + var/obj/item/P = locate(href_list["remove"]) + if(isPaperwork(P)) + usr.put_in_hands(P) + to_chat(usr, "You remove [P] from [src].") + checkTopPaper() //So we don't accidentally make the top sheet not be on the clipboard + else if(href_list["viewOrWrite"]) + var/obj/item/weapon/P = locate(href_list["viewOrWrite"]) + if(!isPaperwork(P)) + return + if(is_pen(I) && isPaperwork(P) != PHOTO) //Because you can't write on photos that aren't in your hand + P.attackby(I, usr) + else if(isPaperwork(P) == PAPERWORK) //Why can't these be subtypes of paper + P.examine(usr) + else if(isPaperwork(P) == PHOTO) + var/obj/item/weapon/photo/Ph = P + Ph.show(usr) + else if(href_list["topPaper"]) + var/obj/item/weapon/P = locate(href_list["topPaper"]) + if(P == toppaper) + return + to_chat(usr, "You flick the pages so that [P] is on top.") + playsound(loc, "pageturn", 50, 1) + toppaper = P + update_icon() + showClipboard(usr) - if(src.loc == usr) - - if(href_list["pen"]) - if(istype(haspen) && (haspen.loc == src)) - haspen.loc = usr.loc - usr.put_in_hands(haspen) - haspen = null - - else if(href_list["addpen"]) - if(!haspen) - var/obj/item/weapon/pen/W = usr.get_active_hand() - if(istype(W, /obj/item/weapon/pen)) - usr.drop_item() - W.loc = src - haspen = W - to_chat(usr, "You slot the pen into \the [src].") - - else if(href_list["write"]) - var/obj/item/weapon/P = locate(href_list["write"]) - - if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) && (P == toppaper) ) - - var/obj/item/I = usr.get_active_hand() - - if(istype(I, /obj/item/weapon/pen)) - - P.attackby(I, usr) - - else if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) - - if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) - - P.loc = usr.loc - usr.put_in_hands(P) - if(P == toppaper) - toppaper = null - var/obj/item/weapon/paper/newtop = locate(/obj/item/weapon/paper) in src - if(newtop && (newtop != P)) - toppaper = newtop - else - toppaper = null - - else if(href_list["read"]) - var/obj/item/weapon/paper/P = locate(href_list["read"]) - - if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) - P.show_content(usr) - - else if(href_list["look"]) - var/obj/item/weapon/photo/P = locate(href_list["look"]) - if(P && (P.loc == src) && istype(P, /obj/item/weapon/photo) ) - P.show(usr) - - else if(href_list["top"]) // currently unused - var/obj/item/P = locate(href_list["top"]) - if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) - toppaper = P - to_chat(usr, "You move [P.name] to the top.") - - //Update everything - attack_self(usr) - update_icon() - return +#undef PAPERWORK +#undef PHOTO diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 70be5b747c1..2fe6411a445 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -3,7 +3,7 @@ name = "Placeholder Generator" //seriously, don't use this. It can't be anchored without VV magic. desc = "A portable generator for emergency backup power" icon = 'icons/obj/power.dmi' - icon_state = "portgen0" + icon_state = "portgen0_0" density = 1 anchored = 0 use_power = 0 @@ -13,6 +13,7 @@ var/open = 0 var/recent_fault = 0 var/power_output = 1 + var/base_icon = "portgen0" /obj/machinery/power/port_gen/proc/IsBroken() return (stat & (BROKEN|EMPED)) @@ -29,14 +30,17 @@ /obj/machinery/power/port_gen/proc/handleInactive() return +/obj/machinery/power/port_gen/update_icon() + icon_state = "[base_icon]_[active]" + /obj/machinery/power/port_gen/process() if(active && HasFuel() && !IsBroken() && anchored && powernet) add_avail(power_gen * power_output) UseFuel() else active = 0 - icon_state = initial(icon_state) handleInactive() + update_icon() /obj/machinery/power/powered() return 1 //doesn't require an external power source @@ -362,11 +366,11 @@ if(href_list["action"] == "enable") if(!active && HasFuel() && !IsBroken()) active = 1 - icon_state = "portgen1" + update_icon() if(href_list["action"] == "disable") if(active) active = 0 - icon_state = "portgen0" + update_icon() if(href_list["action"] == "eject") if(!active) DropFuel() @@ -382,7 +386,8 @@ /obj/machinery/power/port_gen/pacman/super name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator" desc = "A power generator that utilizes uranium sheets as fuel. Can run for much longer than the standard PACMAN type generators. Rated for 80 kW max safe output." - icon_state = "portgen1" + icon_state = "portgen1_0" + base_icon = "portgen1" sheet_path = /obj/item/stack/sheet/mineral/uranium sheet_name = "Uranium Sheets" time_per_sheet = 576 //same power output, but a 50 sheet stack will last 2 hours at max safe power @@ -420,7 +425,8 @@ /obj/machinery/power/port_gen/pacman/mrs name = "M.R.S.P.A.C.M.A.N.-type Portable Generator" desc = "An advanced power generator that runs on diamonds. Rated for 200 kW maximum safe output!" - icon_state = "portgen2" + icon_state = "portgen2_0" + base_icon = "portgen2" sheet_path = /obj/item/stack/sheet/mineral/diamond sheet_name = "Diamond Sheets" diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index cdb0e063184..da9a2cf16f2 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -11,6 +11,9 @@ projectile_type = /obj/item/projectile/beam/laser select_name = "kill" +/obj/item/ammo_casing/energy/laser/cyborg //to balance cyborg energy cost seperately + e_cost = 250 + /obj/item/ammo_casing/energy/lasergun projectile_type = /obj/item/projectile/beam/laser e_cost = 83 @@ -126,6 +129,9 @@ e_cost = 50 fire_sound = 'sound/weapons/taser2.ogg' +/obj/item/ammo_casing/energy/disabler/cyborg //seperate balancing for cyborg, again + e_cost = 250 + /obj/item/ammo_casing/energy/plasma projectile_type = /obj/item/projectile/plasma select_name = "plasma burst" diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 2b736f8b1a4..6ad60248a28 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -182,16 +182,19 @@ /obj/item/ammo_box/magazine/m10mm/fire name = "pistol magazine (10mm incendiary)" + icon_state = "9x19pI" desc = "A gun magazine. Loaded with rounds which ignite the target." ammo_type = /obj/item/ammo_casing/c10mm/fire /obj/item/ammo_box/magazine/m10mm/hp name = "pistol magazine (10mm HP)" + icon_state = "9x19pH" desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." ammo_type = /obj/item/ammo_casing/c10mm/hp /obj/item/ammo_box/magazine/m10mm/ap name = "pistol magazine (10mm AP)" + icon_state = "9x19pA" desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets" ammo_type = /obj/item/ammo_casing/c10mm/ap diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 7a039ca29df..b26418b4c45 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -46,6 +46,7 @@ /obj/item/weapon/gun/energy/laser/cyborg can_charge = 0 desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?" + ammo_type = list(/obj/item/ammo_casing/energy/laser/cyborg) origin_tech = null /obj/item/weapon/gun/energy/laser/cyborg/newshot() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 2113a2c1b81..b1cd137ee43 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -52,6 +52,7 @@ /obj/item/weapon/gun/energy/disabler/cyborg name = "cyborg disabler" desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating." + ammo_type = list(/obj/item/ammo_casing/energy/disabler/cyborg) can_charge = 0 /obj/item/weapon/gun/energy/disabler/cyborg/newshot() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index e11702b1f69..94fb6a71e18 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -203,9 +203,10 @@ name = "bluespace beam" icon_state = "spark" hitsound = "sparks" - damage = 3 + damage = 0 var/obj/item/weapon/gun/energy/wormhole_projector/gun color = "#33CCFF" + nodamage = TRUE /obj/item/projectile/beam/wormhole/orange name = "orange bluespace beam" diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index 93d151a022f..a67fcd0f751 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -332,7 +332,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") - var/datum/sprite_accessory/tmp_hair_style = hair_styles_list["Very Long Hair"] + var/datum/sprite_accessory/tmp_hair_style = hair_styles_full_list["Very Long Hair"] var/datum/sprite_accessory/tmp_facial_hair_style = facial_hair_styles_list["Very Long Beard"] if(head_organ.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them. diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 133ab0e6378..b4364bd175f 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -159,6 +159,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/slab, /obj/item/weapon/reagent_containers/food/snacks/grown, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + /obj/item/weapon/reagent_containers/food/snacks/deepfryholder ) blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) @@ -193,6 +194,21 @@ feedback_add_details("slime_cores_used","[type]") var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks) + var/list/blocked = list(/obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze, + /obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt, + /obj/item/weapon/reagent_containers/food/drinks/shaker, + /obj/item/weapon/reagent_containers/food/drinks/britcup, + /obj/item/weapon/reagent_containers/food/drinks/sillycup, + /obj/item/weapon/reagent_containers/food/drinks/cans, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass, + /obj/item/weapon/reagent_containers/food/drinks/bottle, + /obj/item/weapon/reagent_containers/food/drinks/mushroom_bowl + ) + blocked += typesof(/obj/item/weapon/reagent_containers/food/drinks/flask) + blocked += typesof(/obj/item/weapon/reagent_containers/food/drinks/trophy) + blocked += typesof(/obj/item/weapon/reagent_containers/food/drinks/cans/bottler) + borks -= blocked // BORK BORK BORK playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 0ae8bba3008..4377b2eebfc 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -15,8 +15,8 @@ var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list("salglu_solution", "epinephrine", "spaceacillin", "charcoal") - //var/list/reagent_ids = list("salbutamol", "silver_sulfadiazine", "styptic_powder", "charcoal", "epinephrine", "spaceacillin") + var/list/reagent_ids = list("salglu_solution", "epinephrine", "spaceacillin", "charcoal", "hydrocodone") + //var/list/reagent_ids = list("salbutamol", "silver_sulfadiazine", "styptic_powder", "charcoal", "epinephrine", "spaceacillin", "hydrocodone") /obj/item/weapon/reagent_containers/borghypo/surgeon reagent_ids = list("styptic_powder", "epinephrine", "salbutamol") @@ -127,4 +127,4 @@ empty = 0 if(empty) - to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") \ No newline at end of file + to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 1fea8864498..e8e5a78d597 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -159,7 +159,7 @@ to_chat(usr, "All Emergency Response Teams are dispatched and can not be called at this time.") return to_chat(usr, "ERT request transmitted.") - + print_centcom_report(ert_reason, worldtime2text() +" ERT Request") var/fullmin_count = 0 for(var/client/C in admins) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 4d5e38d17ec..342931a065c 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -16,13 +16,13 @@ // Stationary ports shouldn't move, mobile ones move themselves return 0 -/obj/machinery/door/onShuttleMove() +/obj/machinery/door/airlock/onShuttleMove() . = ..() if(!.) return addtimer(src, "close", 0, TRUE, 0, 1) // Close any nearby airlocks as well - for(var/obj/machinery/door/D in orange(1, src)) + for(var/obj/machinery/door/airlock/D in orange(1, src)) addtimer(D, "close", 0, TRUE, 0, 1) /obj/machinery/door/airlock/onShuttleMove() diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 4a1343ad513..80ae04dfaaf 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -34,7 +34,7 @@ allowed_tools = list( /obj/item/weapon/bonegel = 100, \ - /obj/item/weapon/screwdriver = 75 + /obj/item/weapon/screwdriver = 90 ) can_infect = 1 blood_level = 1 @@ -70,7 +70,7 @@ allowed_tools = list( /obj/item/weapon/bonesetter = 100, \ - /obj/item/weapon/wrench = 75 \ + /obj/item/weapon/wrench = 90 \ ) time = 32 @@ -109,7 +109,7 @@ allowed_tools = list( /obj/item/weapon/bonesetter = 100, \ - /obj/item/weapon/wrench = 75 \ + /obj/item/weapon/wrench = 90 \ ) time = 32 @@ -144,7 +144,7 @@ allowed_tools = list( /obj/item/weapon/bonegel = 100, \ - /obj/item/weapon/screwdriver = 75 + /obj/item/weapon/screwdriver = 90 ) can_infect = 1 blood_level = 1 @@ -168,7 +168,7 @@ affected.status &= ~ORGAN_BROKEN affected.status &= ~ORGAN_SPLINTED affected.perma_injury = 0 - + target.handle_splints() return 1 /datum/surgery_step/finish_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 6670b6b0c87..269980346a8 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -68,8 +68,8 @@ name = "make cavity space" allowed_tools = list( /obj/item/weapon/surgicaldrill = 100, \ - /obj/item/weapon/pen = 75, \ - /obj/item/stack/rods = 50 + /obj/item/weapon/pen = 90, \ + /obj/item/stack/rods = 60 ) time = 54 @@ -93,9 +93,9 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser = 100, \ /obj/item/weapon/cautery = 100, \ - /obj/item/clothing/mask/cigarette = 75, \ - /obj/item/weapon/lighter = 50, \ - /obj/item/weapon/weldingtool = 25 + /obj/item/clothing/mask/cigarette = 90, \ + /obj/item/weapon/lighter = 60, \ + /obj/item/weapon/weldingtool = 30 ) time = 24 diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 4d46bb69d75..decc2d05c19 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -25,7 +25,7 @@ allowed_tools = list( /obj/item/weapon/circular_saw = 100, \ /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, \ - /obj/item/weapon/hatchet = 75 + /obj/item/weapon/hatchet = 90 ) time = 54 @@ -72,7 +72,7 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser/manager = 100, \ /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 75 + /obj/item/weapon/crowbar = 90 ) time = 24 @@ -123,7 +123,7 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser/manager = 100, \ /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 75 + /obj/item/weapon/crowbar = 90 ) time = 24 @@ -173,7 +173,7 @@ name = "mend bone" allowed_tools = list( /obj/item/weapon/bonegel = 100, \ - /obj/item/weapon/screwdriver = 75 + /obj/item/weapon/screwdriver = 90 ) time = 24 diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index b5c2bfa013c..7f3d49c6045 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -29,8 +29,8 @@ name = "make incision" allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchen/knife = 75, \ - /obj/item/weapon/shard = 50, \ + /obj/item/weapon/kitchen/knife = 90, \ + /obj/item/weapon/shard = 60, \ ) time = 16 @@ -60,8 +60,8 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser/manager = 100, \ /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity. + /obj/item/stack/cable_coil = 90, \ + /obj/item/device/assembly/mousetrap = 12 //I don't know. Don't ask me. But I'm leaving it because hilarity. ) time = 24 @@ -87,8 +87,8 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser/manager = 100, \ /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 55, \ - /obj/item/weapon/kitchen/utensil/fork = 75) + /obj/item/weapon/crowbar = 65, \ + /obj/item/weapon/kitchen/utensil/fork = 90) time = 64 @@ -114,9 +114,9 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser = 100, \ /obj/item/weapon/cautery = 100, \ - /obj/item/clothing/mask/cigarette = 75, \ - /obj/item/weapon/lighter = 50, \ - /obj/item/weapon/weldingtool = 25 + /obj/item/clothing/mask/cigarette = 90, \ + /obj/item/weapon/lighter = 60, \ + /obj/item/weapon/weldingtool = 30 ) time = 24 diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 52c2c89ff0a..e07fd0c4725 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -22,13 +22,13 @@ allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchen/knife = 75, \ - /obj/item/weapon/shard = 50, \ - /obj/item/weapon/scissors = 10, \ + /obj/item/weapon/kitchen/knife = 90, \ + /obj/item/weapon/shard = 60, \ + /obj/item/weapon/scissors = 12, \ /obj/item/weapon/twohanded/chainsaw = 1, \ - /obj/item/weapon/claymore = 5, \ - /obj/item/weapon/melee/energy/ = 5, \ - /obj/item/weapon/pen/edagger = 5, \ + /obj/item/weapon/claymore = 6, \ + /obj/item/weapon/melee/energy/ = 6, \ + /obj/item/weapon/pen/edagger = 6, \ ) time = 16 @@ -60,8 +60,8 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser = 100, \ /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 20 + /obj/item/stack/cable_coil = 90, \ + /obj/item/device/assembly/mousetrap = 25 ) time = 24 @@ -94,8 +94,8 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser/manager = 100, \ /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 50 + /obj/item/weapon/crowbar = 90, \ + /obj/item/weapon/kitchen/utensil/fork = 60 ) time = 24 @@ -149,9 +149,9 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser = 100, \ /obj/item/weapon/cautery = 100, \ - /obj/item/clothing/mask/cigarette = 75, \ - /obj/item/weapon/lighter = 50, \ - /obj/item/weapon/weldingtool = 25 + /obj/item/clothing/mask/cigarette = 90, \ + /obj/item/weapon/lighter = 60, \ + /obj/item/weapon/weldingtool = 30 ) time = 24 @@ -199,8 +199,8 @@ allowed_tools = list( /obj/item/weapon/circular_saw = 100, \ /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, \ - /obj/item/weapon/hatchet = 75, \ - /obj/item/weapon/melee/arm_blade = 60 + /obj/item/weapon/hatchet = 90, \ + /obj/item/weapon/melee/arm_blade = 75 ) time = 100 diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index afa0429bdc0..c11db16cb72 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -81,7 +81,24 @@ return 1 return 0 - +/proc/get_pain_modifier(mob/living/carbon/human/M) //returns modfier to make surgery harder if patient is conscious and feels pain + if(M.stat) //stat=0 if CONSCIOUS, 1=UNCONSCIOUS and 2=DEAD. Operating on dead people is easy, too. Just sleeping won't work, though. + return 1 + if(NO_PAIN in M.species.species_traits)//if you don't feel pain, you can hold still + return 1 + if(M.reagents.has_reagent("hydrocodone"))//really good pain killer + return 0.99 + if(M.reagents.has_reagent("morphine"))//Just as effective as Hydrocodone, but has an addiction chance + return 0.99 + if(M.drunk >= 80)//really damn drunk + return 0.95 + if(M.drunk >= 40)//pretty drunk + return 0.9 + if(M.reagents.has_reagent("sal_acid")) //it's better than nothing, as far as painkillers go. + return 0.85 + if(M.drunk >= 15)//a little drunk + return 0.85 + return 0.8 //20% failure chance /proc/get_location_modifier(mob/M) var/turf/T = get_turf(M) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index a24145055f0..867c6ed896a 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -171,8 +171,8 @@ name = "connect limb" allowed_tools = list( /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 20 + /obj/item/stack/cable_coil = 90, \ + /obj/item/device/assembly/mousetrap = 25 ) can_infect = 1 diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index cae6a3b1a8b..a623c0a0d0f 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -58,6 +58,8 @@ var/can_grasp var/can_stand + var/splinted_count = 0 //Time when this organ was last splinted + /obj/item/organ/external/necrotize(update_sprite=TRUE) if(status & (ORGAN_ROBOT|ORGAN_DEAD)) return @@ -84,6 +86,7 @@ if(owner) owner.bodyparts_by_name[limb_name] = null + owner.splinted_limbs -= src QDEL_LIST(children) @@ -196,6 +199,10 @@ if(status & ORGAN_BROKEN && prob(40) && brute) owner.emote("scream") //getting hit on broken hand hurts + if(status & ORGAN_SPLINTED && prob((brute + burn)*4)) //taking damage to splinted limbs removes the splints + status &= ~ORGAN_SPLINTED + owner.visible_message("The splint on [owner]'s left arm unravels from their [name]!","The splint on your [name] unravels!") + owner.handle_splints() if(used_weapon) add_autopsy_data("[used_weapon]", brute + burn) @@ -458,6 +465,18 @@ Note that amputating the affected organ does in fact remove the infection from t tbrute = 3 return "[tbrute][tburn]" +/obj/item/organ/external/proc/update_splints() + if(!(status & ORGAN_SPLINTED)) + owner.splinted_limbs -= src + return + if(owner.step_count >= splinted_count + SPLINT_LIFE) + status &= ~ORGAN_SPLINTED //oh no, we actually need surgery now! + owner.visible_message("[owner] screams in pain as their splint pops off their [name]!","You scream in pain as your splint pops off your [name]!") + owner.emote("scream") + owner.Stun(2) + owner.handle_splints() + + /**************************************************** DISMEMBERMENT ****************************************************/ @@ -648,6 +667,9 @@ Note that amputating the affected organ does in fact remove the infection from t var/is_robotic = status & ORGAN_ROBOT var/mob/living/carbon/human/victim = owner + if(status & ORGAN_SPLINTED) + victim.splinted_limbs -= src + for(var/obj/item/I in embedded_objects) embedded_objects -= I I.forceMove(src) @@ -754,4 +776,4 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/X in bodyparts) var/obj/item/organ/external/L = X for(var/obj/item/I in L.embedded_objects) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index c42a946661d..c0c7754eb0a 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -148,7 +148,7 @@ var/global/list/limb_icon_cache = list() overlays |= facial_s if(h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style] if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.bodyflags & ALL_RPARTS))) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(species.name == "Slime People") // I am el worstos diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index ea6f293c7d2..0b3ac65974d 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -68,17 +68,17 @@ /datum/surgery_step/internal/manipulate_organs name = "manipulate organs" allowed_tools = list(/obj/item/organ/internal = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0) - var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 55) + var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 70) var/implements_mend = list(/obj/item/stack/medical/bruise_pack = 20,/obj/item/stack/medical/bruise_pack/advanced = 100,/obj/item/stack/nanopaste = 100) var/implements_clean = list(/obj/item/weapon/reagent_containers/dropper = 100, - /obj/item/weapon/reagent_containers/glass/bottle = 75, - /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 70, - /obj/item/weapon/reagent_containers/food/drinks/bottle = 65, - /obj/item/weapon/reagent_containers/glass/beaker = 60, - /obj/item/weapon/reagent_containers/spray = 50, - /obj/item/weapon/reagent_containers/glass/bucket = 40) + /obj/item/weapon/reagent_containers/glass/bottle = 90, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 85, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 80, + /obj/item/weapon/reagent_containers/glass/beaker = 75, + /obj/item/weapon/reagent_containers/spray = 60, + /obj/item/weapon/reagent_containers/glass/bucket = 50) //Finish is just so you can close up after you do other things. - var/implements_finsh = list(/obj/item/weapon/scalpel/laser/manager = 100,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75) + var/implements_finsh = list(/obj/item/weapon/scalpel/laser/manager = 100,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 90) var/current_type var/obj/item/organ/internal/I = null var/obj/item/organ/external/affected = null @@ -436,7 +436,7 @@ allowed_tools = list( /obj/item/weapon/circular_saw = 100, \ /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, \ - /obj/item/weapon/hatchet = 75 + /obj/item/weapon/hatchet = 90 ) time = 54 @@ -464,13 +464,13 @@ name = "cut carapace" allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchen/knife = 75, \ - /obj/item/weapon/shard = 50, \ - /obj/item/weapon/scissors = 10, \ + /obj/item/weapon/kitchen/knife = 90, \ + /obj/item/weapon/shard = 60, \ + /obj/item/weapon/scissors = 12, \ /obj/item/weapon/twohanded/chainsaw = 1, \ - /obj/item/weapon/claymore = 5, \ - /obj/item/weapon/melee/energy/ = 5, \ - /obj/item/weapon/pen/edagger = 5, \ + /obj/item/weapon/claymore = 6, \ + /obj/item/weapon/melee/energy/ = 6, \ + /obj/item/weapon/pen/edagger = 6, \ ) time = 16 @@ -499,8 +499,8 @@ allowed_tools = list( /obj/item/weapon/scalpel/laser/manager = 100, \ /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/crowbar = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 50 + /obj/item/weapon/crowbar = 90, \ + /obj/item/weapon/kitchen/utensil/fork = 60 ) time = 24 diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index b4272364578..233b6f56a33 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -62,7 +62,7 @@ name = "mend internal bleeding" allowed_tools = list( /obj/item/weapon/FixOVein = 100, \ - /obj/item/stack/cable_coil = 75 + /obj/item/stack/cable_coil = 90 ) can_infect = 1 blood_level = 1 @@ -107,8 +107,8 @@ name = "remove dead tissue" allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchen/knife = 75, \ - /obj/item/weapon/shard = 50, \ + /obj/item/weapon/kitchen/knife = 90, \ + /obj/item/weapon/shard = 60, \ ) can_infect = 1 @@ -156,12 +156,12 @@ name = "treat necrosis" allowed_tools = list( /obj/item/weapon/reagent_containers/dropper = 100, - /obj/item/weapon/reagent_containers/glass/bottle = 75, - /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 70, - /obj/item/weapon/reagent_containers/food/drinks/bottle = 65, - /obj/item/weapon/reagent_containers/glass/beaker = 60, - /obj/item/weapon/reagent_containers/spray = 50, - /obj/item/weapon/reagent_containers/glass/bucket = 40 + /obj/item/weapon/reagent_containers/glass/bottle = 90, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 85, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 80, + /obj/item/weapon/reagent_containers/glass/beaker = 75, + /obj/item/weapon/reagent_containers/spray = 60, + /obj/item/weapon/reagent_containers/glass/bucket = 50 ) can_infect = 0 diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm index 6552d4f21d2..99b58a01a80 100644 --- a/code/modules/surgery/slime.dm +++ b/code/modules/surgery/slime.dm @@ -18,8 +18,8 @@ /datum/surgery_step/slime/cut_flesh allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchen/knife = 75, \ - /obj/item/weapon/shard = 50, \ + /obj/item/weapon/kitchen/knife = 90, \ + /obj/item/weapon/shard = 60, \ ) time = 16 @@ -46,8 +46,8 @@ /datum/surgery_step/slime/cut_innards allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchen/knife = 75, \ - /obj/item/weapon/shard = 50, \ + /obj/item/weapon/kitchen/knife = 90, \ + /obj/item/weapon/shard = 60, \ ) time = 16 @@ -73,7 +73,7 @@ /datum/surgery_step/slime/saw_core allowed_tools = list( /obj/item/weapon/circular_saw = 100, \ - /obj/item/weapon/hatchet = 75 + /obj/item/weapon/hatchet = 90 ) time = 16 diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 8861380527a..f5d49f100d2 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -116,6 +116,12 @@ prob_chance = allowed_tools[implement_type] prob_chance *= get_location_modifier(target) + + if(!ispath(surgery.steps[surgery.status], /datum/surgery_step/robotics) && !ispath(surgery.steps[surgery.status], /datum/surgery_step/rigsuit))//Repairing robotic limbs doesn't hurt, and neither does cutting someone out of a rig + if(ishuman(target)) + var/mob/living/carbon/human/H = target //typecast to human + prob_chance *= get_pain_modifier(H)//operating on conscious people is hard. + if(prob(prob_chance) || isrobot(user)) if(end_step(user, target, target_zone, tool, surgery)) advance = 1 diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index ab64ac1252d..9e0d6d62d1b 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -45,6 +45,7 @@ icon = 'icons/vehicles/CargoTrain.dmi' icon_state = "ambulance" anchored = 0 + throw_pressure_limit = 9001 //Throwing an ambulance trolley can kill the process scheduler. /obj/structure/stool/bed/amb_trolley/MouseDrop(obj/over_object as obj) ..() @@ -55,4 +56,4 @@ to_chat(usr, "You unhook the bed to the ambulance.") else amb.bed = src - to_chat(usr, "You hook the bed to the ambulance.") \ No newline at end of file + to_chat(usr, "You hook the bed to the ambulance.") diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 967b88ae13a..bd6472f2315 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -379,3 +379,7 @@ h1.alert, h2.alert {color: #000000;} /* EMOJI STUFF */ .emoji {max-height: 16px; max-width: 16px} + +/* ADMIN TICKETS */ + +.adminticket {color: #3daf21; font-weight: bold} \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index a96ba9290cb..2ee2bc568c8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,237 @@ -->
+

27 October 2017

+

Birdtalon updated:

+
    +
  • Birdtickets: Adminhelp Ticketing System
  • +
+

FalseIncarnate updated:

+
    +
  • Silver Slime Core reactions can only summon forth drinks that actually contain a drink. Begone thirst!
  • +
  • Removes some "unsafe" chemicals from lists of potential chemicals for inclusion in things like random pills or bottles, added one to replace them.
  • +
  • Removes adminordrazine and nanites from vent clog, replaces nanites with syndicate_nanites.
  • +
+ +

26 October 2017

+

Anasari updated:

+
    +
  • Change some brain damage phrases. Add a lot of new one.
  • +
+

FreeStylaLT updated:

+
    +
  • Moves Ambulance's key to Paramedic's EVA locker from his clothing locker
  • +
  • Removed an unnecessary EVA helmet from Paramedic's EVA locker
  • +
+

Kyep updated:

+
    +
  • Soviets (including Soviet Tourists, a non-antag filler role) no longer get all-access to the Cyberiad when they visit.
  • +
  • Freedom Operatives are now a support outfit that admins can equip players as.
  • +
+

TDSSS updated:

+
    +
  • Added a shortcut to talk on ERT channel, namely ':$', bringing it in line with other channels.
  • +
+ +

25 October 2017

+

Anasari updated:

+
    +
  • Flavour text description in character setup now consistent with rules.
  • +
  • Grenade reagent are also logged when they are primed
  • +
  • TC from war op increased by 2 per player above 50.
  • +
+

Kyep updated:

+
    +
  • ERTs now support janitor, paranormal, and cyborg ERT units, as well as specific slot configurations.
  • +
  • Heads of staff who are editing another admin's permissions in the admin panel can now toggle several permissions for a person without re-finding them in the list. Hitting 'cancel' at any point drops out of the loop. It also notifies admins whether they're toggling a permission on, or off.
  • +
  • ERT spawn area now shows ERT request reasons, and admins can enable the use of a teleporter or grav catapult without mechs.
  • +
+ +

22 October 2017

+

Crazylemon64 updated:

+
    +
  • Suiciding crewmembers are no longer capable of being cloned.
  • +
+

Fethas updated:

+
    +
  • makes a better proc for doing spins (IE Ian chasing tail, etc) then was previous.
  • +
+

McCloud and Alffd updated:

+
    +
  • Merge all LINDA and atmos machine functions into the air controller subprocess.
  • +
  • Air alarms in scrubbing mode will shut off when alarm enters danger state. If this occurs simultaneously with a max2 temperature alarm panic siphon will automatically activate.
  • +
  • High air pressure differences will throw objects and knock over station species.
  • +
  • Add magpulse to syndicate and death squad borgs.
  • +
  • Change all volume pumps to regular pumps in atmospherics to accommodate new LINDA speeds.
  • +
  • Change LINDA interval from 2 seconds to 400 milliseconds.
  • +
  • Removed unused control from flamethrower.
  • +
  • Set flamethrower release equal to fuel used.
  • +
  • Increased Reinforced Wall HP from 200 to 600.
  • +
  • Buff aliens against space wind.
  • +
  • Buff Terror Spiders against space wind.
  • +
  • Buff some blobmobs aginst space wind.
  • +
  • Frost requires heat to remove.
  • +
+ +

15 October 2017

+

Citinited updated:

+
    +
  • Clipboards now have more functionality. You can now stamp them, attach paper bundles to them, write on any contained paper by clicking on the paper's name using a pen, add pens directly to them, and rearrange what piece of paper is on top!
  • +
  • Full-sized plasma windows are fire-resistant, and full-sized reinforced windows are fully fireproof.
  • +
  • You can now remove facehuggers from corgis. Corgis that have been glomped by multiple facehuggers will now work as you'd expect them to.
  • +
  • Radiation mines no longer change the DNA of species that don't have it.
  • +
  • Firedoors and other doors will no longer close when a shuttle docks. Open firelocks can no longer be welded. Welded firelocks should no longer open under any circumstances.
  • +
  • Open airlocks no longer spark when you throw something conductive through them.
  • +
+

Fethas updated:

+
    +
  • Many things use sleeping. Surgry pain fail fix.
  • +
+

Imsxz updated:

+
    +
  • Ballistic mech weapons now all use the ammo system
  • +
+

Kyep updated:

+
    +
  • Changing someone's sec status now prompts for a reason. The change, and the (optional) reason for it, is written to that person's sec record, and to the server logs. This applies to changes made by sec HUDs, and by records computers.
  • +
  • Magistrate/Captain/HoS/Warden can now use a sec records computer to set a person to "Execute" status. This status cannot be unset by HUDs, and broadcasts a notification to all online admins when it is set. It is intended to replace the "fax CC" requirement for executions. Persons with this status show up with a white 'X' as their sec hud icon.
  • +
+

TullyBurnalot updated:

+
    +
  • Shadowlings are extinguished after hatching, allowing Plasmamen Shadowlings to not burn to death.
  • +
  • Shadowlings now passively heal eye damage, eye blurriness
  • +
+

Vivalas updated:

+
    +
  • Splints now pop off after 2000 steps, or when taking a lot of damage to that limb. Getting surgery for those broken limbs might be a good idea now.
  • +
+ +

14 October 2017

+

Anasari updated:

+
    +
  • Explosive lance doesn't embed anymore.
  • +
+

Fethas updated:

+
    +
  • ARMBANDS! REPRESENT! SEE THE LOADOUT!
  • +
+

Kyep updated:

+
    +
  • HoPs/Captains opening/closing job slots is now announced to admins. No more HoPs opening 30 clown slots without admins noticing.
  • +
+

MarsM0nd updated:

+
    +
  • Gives a choice whether to mangle black gloves, or to completely cut of the fingertips
  • +
+ +

11 October 2017

+

Anasari updated:

+
    +
  • Slot machine no longer earn money on average. Bet changed to 100.
  • +
  • All items can be used to smash windows instead of only those defined as weapons. (e.g. including guitar & flashlight)
  • +
  • Mulebot with pAI cannot knock people down anymore.
  • +
+

Birdtalon updated:

+
    +
  • Terror spiders now respect antagHUD respawn restrictions.
  • +
+

Kyep updated:

+
    +
  • mindslaving an antagbanned player now offers control of their mob to ghosts.
  • +
+

TullyBurnalot updated:

+
    +
  • Can now place garbage in garbage cans without standing on top of them.
  • +
+

scrubmcnoob updated:

+
    +
  • Cult must use teleport tailsman in active hands.
  • +
+

uraniummeltdown updated:

+
    +
  • New PACMAN portable generator sprites
  • +
+ +

10 October 2017

+

Birdtalon updated:

+
    +
  • Bees with no reagent will now work.
  • +
+ +

07 October 2017

+

Birdtalon updated:

+
    +
  • User interface tweaks to Brig timers.
  • +
  • Seconds converted to minutes and seconds in Brig radio and security console printouts.
  • +
  • Bees can no longer reproduce un-synthable reagents.
  • +
+

imsxz updated:

+
    +
  • Aliens now always spawn as a pair when their infestation event begins.
  • +
+

scrubmcnoob updated:

+
    +
  • Abductors can no longer use megaphones.
  • +
+

uraniummeltdown updated:

+
    +
  • Adds new sprites to the unused and used eldritch whetstones. Sprites by Fury McFlurry.
  • +
  • Air tanks now have their own sprite, no longer looking like oxygen tanks
  • +
  • 10mm alt magazines have their own sprites
  • +
+ +

06 October 2017

+

Birdtalon updated:

+
    +
  • Bottler doesn't break after one use.
  • +
+ +

05 October 2017

+

Birdtalon updated:

+
    +
  • Re-adds missing light switch to robotics.
  • +
+ +

02 October 2017

+

Imsxz updated:

+
    +
  • Rapid re-hatch no longer kills shadowlings.
  • +
  • Vampires can no longer enthrall chaplains
  • +
+ +

30 September 2017

+

Jovaniph updated:

+
    +
  • Coroner now has their own locker in the morgue.
  • +
+

Landerlow updated:

+
    +
  • Adds hydrocodone to the Cyborg Hypospray
  • +
+ +

29 September 2017

+

Citinited updated:

+
    +
  • Telescreens and entertainment consoles now have 'off' and 'broken' sprites.
  • +
  • Wooden TVs, engineering camera consoles, mining camera consoles, telescreens, and entertainment consoles now have their own circuit boards and can be reconstructed!
  • +
  • Using a multitool on a telescreen or entertainment monitor will now allow you to reposition it.
  • +
+

imsxz updated:

+
    +
  • Subtle messages no longer begin with "old"
  • +
+ +

28 September 2017

+

MarsM0nd updated:

+
    +
  • Stops the electrified arm from combat and stunbaton implant from runtiming.
  • +
+

uraniummeltdown updated:

+
    +
  • Changelings have a new power, Biodegrade, for 2 evolution points. For 30 chemicals you can vomit acid onto restraints, welded/locked lockers and spider cocoons to escape them.
  • +
  • Hivemind Link for changelings has been readded, it was removed in error
  • +
+

05 September 2017

Kyep updated: