Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into ImportentpAIUpdate

This commit is contained in:
Aurorablade
2015-06-30 18:07:20 -04:00
911 changed files with 2273 additions and 1522 deletions
+6 -6
View File
@@ -5129,6 +5129,9 @@
"bUG" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 4},/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/toxins/mixing)
"bUH" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/engine,/area/toxins/mixing)
"bUI" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/engine,/area/toxins/mixing)
"bUJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering)
"bUK" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
"bUL" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engineering)
"bUM" = (/turf/simulated/wall,/area/toxins/test_area)
"bUN" = (/turf/simulated/wall/r_wall,/area/toxins/test_area)
"bUO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall/r_wall,/area/toxins/test_area)
@@ -7202,7 +7205,6 @@
"cMb" = (/turf/simulated/wall,/area/engine/engineering)
"cMc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/light_switch{pixel_x = -27},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/engine/engineering)
"cMd" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering)
"cMe" = (/obj/machinery/power/smes{charge = 1e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering)
"cMg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cMh" = (/turf/simulated/wall/r_wall,/area/atmos)
"cMi" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/atmos)
@@ -7245,7 +7247,6 @@
"cMW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor,/area/engine/engineering)
"cMX" = (/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor,/area/engine/engineering)
"cMY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering)
"cMZ" = (/obj/machinery/power/smes{charge = 1e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering)
"cNb" = (/turf/simulated/floor/plating,/area/engine/engineering)
"cNc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/engine/engineering)
"cNd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
@@ -7294,7 +7295,6 @@
"cNY" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plating,/area/engine/engineering)
"cOb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/engineering)
"cOc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/engineering)
"cOd" = (/obj/machinery/power/smes{charge = 1e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engineering)
"cOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engine/engineering)
"cOg" = (/obj/machinery/camera{c_tag = "Atmospherics West"; dir = 4; network = list("SS13")},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/atmos)
"cOh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/atmos)
@@ -8141,9 +8141,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEcIbcIccIdcIebGIcIgcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcJdcqacJecyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaacyYcHUczaaabcyYcHUczaaaacyYcHUczaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcJncJncJncJncJncJncJncJocJncJncEEcJpcJqcGTcGTbGIbICbGIbJhcJvcDocJwcJxcFZcJycJzcDocJAcDucDrcJBcJCcJDcIxcJEcJFcJGcJHcJIcJJcJKcJHcJLcJMcJNcJOcDAcJPcJQcJRbJCaabcEYcJUcJTcJVcCDaaaaaaaaacDQcDRcJWcJXcDRcJYcJZcKacKbcKccFccKdcKecIYbJEcKgcKhcKibIBaabaaaaaaaaaaaaaaacjIcKkcKlcKmcKncKocKpcKqcKrcKocKpcKscjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycKzaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcJncKAcKAcKBcKCcKDcKDcKEcKFcKGcKHcIdcIecGTcGTcGTcKIcGTcGTcGTcDocKJbJVcKLbJWbJXcKOcKPcKQcKRbKhbKhbKhcKVcKWcKXcKYcKZcLacHncCscLbcLccLdcLecLfcDAcJPcLgcLhbKMcLjcDLcLkcIOcIOcCDaabaaaaaacHxcLlcLmcLncLocLpcLqcLpcLpcLrcLscLtcLucLubLscLwcLxcLybLtaabaabaaaaaaaaaaaacjIcLAcLBbLucvWbLEcLEbLUcvWbLVcLHbLWcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaaacLJcLJcLJcLJcLJaabamjaaaaaaaaaaaacJmaaaaaacJmaaaaaacJmcJmcJmcJmcJmcJmcJmaaaaaacJmaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcLMcEEcLNcLOcLPcLQcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdcMebNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcMGcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMNcMMcMMcMMcMMcMOcMPcMQcMRcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdcMZbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQcNscNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNJbTXcxtcvWcNKbTXcxtcvWcNKbTXcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaakSaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcJncNLcLKcLKcLKcLKcLKcMMcNMcNNcNOcNPcNQcMMcNRcNScNTcJqcGTcGTcNUcNVbNtbNucNYbNvbNvcObcEEcOccMYcMdcOdbNdcMgcEEcOfcMhcOgcOhcDAcNhcNicOicDAcNkcNlcJPcJQcOjbJCcOkcEYcOlcOmcOncCDaaaaaaaaacOobNwbNwbNwbNwcOscOscOtcOubJEbJEbNxbSSbJEcOzcOzbTicOAcOzaaaaaaaaaaaaaaaaaacjIcxtcxtcxtcvWcOBcxtcxtcvWcOBcxtcxtcjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycOCaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcLMcEEcLNcLOcLPcLQcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdbUJbNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcMGcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMNcMMcMMcMMcMMcMOcMPcMQcMRcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdbUKbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQcNscNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNJbTXcxtcvWcNKbTXcxtcvWcNKbTXcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaakSaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcJncNLcLKcLKcLKcLKcLKcMMcNMcNNcNOcNPcNQcMMcNRcNScNTcJqcGTcGTcNUcNVbNtbNucNYbNvbNvcObcEEcOccMYcMdbULbNdcMgcEEcOfcMhcOgcOhcDAcNhcNicOicDAcNkcNlcJPcJQcOjbJCcOkcEYcOlcOmcOncCDaaaaaaaaacOobNwbNwbNwbNwcOscOscOtcOubJEbJEbNxbSSbJEcOzcOzbTicOAcOzaaaaaaaaaaaaaaaaaacjIcxtcxtcxtcvWcOBcxtcxtcvWcOBcxtcxtcjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycOCaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaczakSaczaczalwakSakSakSakSaczakSakSaczcODaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJncOEcLLcOFcOGcOHcOIcMMcOJcOKcOLcOMcONcOOcOPcOQcORcJqcGTcOScOTcOUcOVcOWcOXcOYcOZcPacPbcNTcJqcPccPdcMbcPecEEcPfcMhcPgcPhcDAcNhcNicLfcDAcPicNlcJPcPjcPkbKMcPlcDLcPmcNrcNrcCDaaaaaaaaacPnaaaaaaaaaaaaaaaaaacDQcPocIYcIYcPpcPqcPrcOzaacbTpbTqcPuaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcPvcPvcPvcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaabcLJcLJcLJcLJcLJaaaamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcJncJncJncPwbNybNybNycMMcPAcPBcPCcPCcPDcPEcMScPFcPGcPHcPIcPJcPJcPKcPLcPMcPNcPOcPPcPKcPQcPRcPScPTcGTcPUcPVcPWcOfcMhcPXcPYcDAcNhcDAcPZcDAcNkcNlcJPcJQcQabJCcOkcCDcCDcCDcCDcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDQcQbcIYcIYcKbcQccQdcOzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPnaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaaaaaaaaaaaaaaaawTaaaaabaaaaabaaaaabaaacQeaaaaabaaaaabaabaabaabamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcQfcQgcQhbNyaabaabcMMcQjcQkcPCcPCcQlcMMcQmcQncQocQpcQqcQrcQscEEcQtcQucQvcGTcQwcEEcQxcQycQzcQpcQpcQAcQBcEEcQCcMhcQDcQEcDAcNhcDAcMjcMkcQFcQGcNmcQHcQIbGVcQJcDLcQKcQLcQLcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOocQMcQNcQOcQPcQQcQRcOzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcGIaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21 -24
View File
@@ -450,8 +450,8 @@
"iH" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/vox/station)
"iI" = (/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 1},/area/space)
"iJ" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/vox/station)
"iK" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"iL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"iK" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"iL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"iM" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"iN" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"iO" = (/obj/structure/table/woodentable,/obj/item/trash/tray,/obj/item/weapon/paper/spells,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station)
@@ -965,6 +965,7 @@
"sC" = (/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/structure/table,/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control)
"sD" = (/obj/structure/table,/obj/machinery/juicer{pixel_y = 6},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control)
"sE" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
"sF" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (NORTH)"},/area/admin)
"sG" = (/obj/structure/piano,/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control)
"sH" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control)
"sI" = (/obj/structure/closet/secure_closet/bar{req_access = null; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
@@ -985,6 +986,7 @@
"sX" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"sY" = (/obj/machinery/door/airlock/centcom{name = "Freezer"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control)
"sZ" = (/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)
"ta" = (/obj/machinery/door/airlock/hatch{desc = "Danger: May contain robustness"; name = "Dojo"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"tb" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"tc" = (/obj/structure/table,/obj/machinery/processor{pixel_x = 0; pixel_y = 10},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"td" = (/obj/structure/table,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/control)
@@ -1009,6 +1011,12 @@
"tw" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops)
"tx" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"ty" = (/obj/machinery/recharge_station/upgraded,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"tz" = (/obj/item/weapon/storage/toolbox/syndicate{desc = "A powerful relic many men worked long and hard to keep safe and away from the forces of evil."; force = 1e+008; name = "toolbox of robustness"},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/woodentable,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"tA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/grenade/clusterbuster/smoke,/obj/structure/table/woodentable,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"tB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/table/woodentable,/obj/item/weapon/sleeping_carp_scroll,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"tC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/table/woodentable,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"tD" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"tE" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"tF" = (/obj/effect/landmark{name = "Marauder Exit"},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
"tG" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
"tH" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT3"; name = "Launch Bay #3"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
@@ -1058,6 +1066,7 @@
"uz" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uA" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
"uB" = (/turf/unsimulated/floor{icon_state = "asteroid6"; name = "sand"},/area/centcom/specops)
"uC" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Specialist Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"uE" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/hypospray/combat/nanites{pixel_x = 3; pixel_y = -3},/obj/item/weapon/reagent_containers/hypospray/combat/nanites,/obj/item/weapon/reagent_containers/hypospray/combat/nanites{pixel_x = -3; pixel_y = 3},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"uF" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/item/bodybag/cryobag{pixel_y = 5},/obj/item/bodybag/cryobag{pixel_y = 5},/obj/item/bodybag/cryobag{pixel_y = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"uG" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(109); req_one_access_txt = "109"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
@@ -1690,12 +1699,9 @@
"Hf" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Hg" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch to lock down external access to the admin room."; icon_state = "doorctrl0"; id = "ADMINLOCKDOWN"; name = "Lockdown"; pixel_y = 0; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Hh" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/syndicate,/obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Hi" = (/obj/machinery/door/airlock/hatch{desc = "Danger: May contain robustness"; name = "Dojo"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINLOCKDOWN"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"Hj" = (/obj/machinery/door/airlock/glass{name = "Shuttle Bay"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Hk" = (/obj/structure/showcase,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"Hl" = (/obj/structure/cult/talisman,/obj/item/weapon/storage/toolbox/syndicate{desc = "A powerful relic many men worked long and hard to keep safe and away from the forces of evil."; force = 1e+008; name = "toolbox of robustness"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"Hm" = (/turf/unsimulated/floor{icon_state = "gcircuit"},/area/admin)
"Hn" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/rack,/obj/item/weapon/grenade/clusterbuster/smoke,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"Ho" = (/obj/structure/ninjatele{pixel_x = -28},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"Hp" = (/obj/structure/ninjatele{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"Hq" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin)
@@ -1732,15 +1738,12 @@
"HV" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin)
"HW" = (/obj/machinery/door/airlock/hatch{desc = "Uh oh. You'd better hope you aren't going in here!"; name = "Prisoner Treatment"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"HX" = (/obj/machinery/door/airlock/hatch{desc = "Uh oh. You'd better hope you aren't going in here!"; name = "Detainment"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"HY" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/space)
"HZ" = (/turf/unsimulated/floor{icon_state = "engine"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin)
"Ia" = (/obj/machinery/gibber,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/tdome)
"Ib" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Ic" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Id" = (/obj/structure/table{icon_state = "tabledir"; dir = 2},/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Ie" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"If" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Thunderdome."; name = "Thunderdome Telescreen"; network = list("Thunderdome"); pixel_y = 30},/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Ig" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Ih" = (/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Ii" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Ij" = (/obj/structure/table/reinforced,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/paper/Court,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
@@ -1760,21 +1763,17 @@
"Ix" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/tdome)
"Iy" = (/obj/item/device/camera,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve)
"Iz" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin)
"IA" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"IB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/tdome)
"IC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/tdome)
"ID" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/tdome)
"IE" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/twohanded/fireaxe,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"IF" = (/obj/machinery/door/poddoor{id_tag = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"IG" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"IH" = (/obj/machinery/door/poddoor{id_tag = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"II" = (/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
"IJ" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
"IK" = (/obj/machinery/door/poddoor{id_tag = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome/arena)
"IL" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome/arena)
"IM" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome/arena)
"IN" = (/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"IO" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"IP" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"IQ" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Access"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINLOCKDOWN"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"IR" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -1791,7 +1790,6 @@
"Jc" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Jd" = (/obj/structure/table,/obj/random/technology_scanner,/obj/random/tech_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Je" = (/obj/machinery/door/poddoor{id_tag = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"Jf" = (/obj/machinery/light/spot,/turf/simulated/floor,/area/tdome/arena)
"Jg" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/random/bomb_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Jh" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Ji" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
@@ -1808,7 +1806,6 @@
"Jt" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"Ju" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"Jv" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"Jw" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Axe Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"Jx" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew4,/area/space)
"Jy" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_rightnostop"; nostop = 1},/turf/space/transit/east/shuttlespace_ew3,/area/space)
"Jz" = (/turf/space,/area/shuttle/derelict/ship/transit)
@@ -2031,7 +2028,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEmEyEjEzEAEBEjECDZEjEjEjEjEjEjEjEDEhaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEEEFEGEjEjEjEGEHDZEIEjEJEjEKEvEwExEEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDZDVDVEjEjEjDVDVDZEjEjEjEjEjEjEjELDZEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDTaNDZDVDVElENElDVDVDVDVDVElEOElDVDVDVEMaNDSDVEPEQEQEQDVDTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDTaNDZDVDVElENElDVDVDVDVDVElEOElDVDVDVEMaNDSDVEPEQEQsFDVDTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDZDVDVEREjEjEjEjEjEjEjEjEjEjEjEjESDZEMaNDSDVETEUEVEWEUEXDVEYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEZEjFaEjEjEjEjEjEjEjEjEjEjEjEjEjEjDZaNaNaNFbFcFdEUEUEUFeFbaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDZDVDVDVDVDVElFfElDVDVDVDVDVFgEjEjDZaNaNaNFhFiEUEUEUEUFjFhaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -2048,32 +2045,32 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEmGSGTEjEjEjEjEjEjEjGLEjEjGMGMGMGMEjEjEjEjEjEjEjEjEjEjGNGuGuGuGuGuGUGVGOGOGUGuGuGWaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEEGXEjEjGYEjEjEjEjEjGLEjEjGMGMGMGMEjEjEjEjEjEjEjEjEjFHDVDVGHDVGZGuGuGUGUGUGuGuHaDZaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDZHbHcHdHeHfHgHhFHDZFgEjEjEjEjEjEjFHDVDVFgEjFHDVDVDVDZEMaNFkDVGZGuGuGuGuGuHaDZEMaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDVDVDVDVDVDVDVDVDVDVFgEjEjFHDVDVDVDVDVHiDVDVDVDZDZaNaNaNFkDVGZGuGuGuHaDVEMaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDVDVDVDVDVDVDVDVDVDVFgEjEjFHDVDVDVDVDVtaDVDVDVDZDZaNaNaNFkDVGZGuGuGuHaDVEMaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkaNaNaNaNaNaNaNaNaNDUDZHjHjDZaNDZFSHkFSFSFSHkFSDZDZaNaNaNaNFkDVGfGgGhDVEMaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDSDVDVDVDVGxEjEjDZaNDZHlFSFSHmFSFSHnDZDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEhEjEjEjEjEjEjEjDZaNDZFSHmFSFSFSHmFSDZDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDSDVDVDVDVGxEjEjDZaNDZtzFSFSHmFSFStADZDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEhEjEjEjEjEjEjEjDZaNDZtBHmFSFSFSHmtCDZDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEEEjEjEjEjEjEjEjDZaNDZHoFSFSHmFSFSHpDZDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDSDVDVDTaNFkDWDXDXDYFgEjEjDZaNDZHqFSFSFSFSFSHrDZEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDSaNaNDSDZHsHtHuDTaNaNaNaNaNEhEjEjDZaNFkDVHvHwHxHwHyDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDSDVDVDVDVDZHzHADZDVDVDVDVDTaNEEEjEjDZaNaNFkDVHBHCHDDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEHEHEHEHFHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDSDZHGHHHIDZHJFSFSHKDZHLHMHNHKDVGxEjEjDZaNaNaNHOHPHQHRHOaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEHSHTHTHTHTHUHEHEHEHEHEHEHEHEHFHEHEHEHEHEHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHVFSFSFSHWFSFSFSFSHXFSFSFSFSHXEjEjHYDZaNaNFkDVDVHZDVDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEHSHTHTHTHTIaHEIbIcIdIcIeIfIgIhIhIfIeIhIeIhIiHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDZIjIkIlDZHqFSFSHrDZImInIoHrDVFgEjEjDZaNaNaNFkaNaNaNEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEHSHTHTHTHTHUHEHEHEHEHEHEHEHEHFHEHEHEHEHEHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHVFSFSFSHWFSFSFSFSHXFSFSFSFSHXEjEjEjDZaNaNFkDVDVHZDVDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEHSHTHTHTHTHUHEIbIcIdIcIeIfIhIhIhIfIeIhIeIhIiHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDZIjIkIlDZHqFSFSHrDZImInIoHrDVFgEjEjDZaNaNaNFkaNaNaNEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEIpHTHTHTHTIqHEIhIrIrIrIrIrIhIhIhIrIrIrIrIrIsHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDVDVDVHuItIuDZDVDVDVDVEMaNEhEjEjDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEIpIvIwIwHTHTIxIhIhIhIyIhIhIhIhIhIhIhIyIhIhIhHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkaNaNFkDZHsIzDZEMaNaNaNaNaNEEEjEjDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNHEHEHEHEHEHEHEHEIhIrIrIrIrIrIhIhIhIrIrIrIrIrIhHEHEHEHEHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDVEMaNDSDWDXDXDYGxEjEjDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNHEIAIAIAIAIAHEIBICICICICICICICICICICICICICIDHEIEIEIEIEIEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEhEjEjEjEjEjEjEjDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNHEtDtDtDtDtDHEIBICICICICICICICICICICICICICIDHEtEtEtEtEtEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEhEjEjEjEjEjEjEjDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEHEHEIFIFIFIFIFjbjcjdjdjdjdjdjdjdjdjdjdjdjdjdjcjbIFIFIFIFIFHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEEEjEjEjEjEjEjFHDZEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEIGIHIIIIIJIIIIIKILjdjdjdjdjdjdjdjdjdjdjdjdjdIMIKININIOININIHIPHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDVElIQElDVDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEIGIHIIIIIIIIIIIKILjdjdjdjdjdjdjdjdjdjdjdjdjdIMIKINININININIHIPHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDVElIQElDVDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEIGIHIIIRIIIRIIIKILjdjdjdjdjdjdjdjdjdjdjdjdjdIMIKINISINISINIHIPHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDZITEjEjEjIUDZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEIGIHIIIIIVIIIIIKILjdjdjdjdjdIWIXIWjdjdjdjdjdIMIKININIYININIHIPHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEhEjEjEjEjEjEhaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEIGIHIIIRIIIRIIIKILjdjdjdjdjdIWIZIWjdjdjdjdjdIMIKINISINISINIHIPHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEmJaEjEjEjJbEmaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEIGIHIIIIIIIIIIIKILjdjdjdjdjdjdjdjdjdjdjdjdjdIMIKINININININIHIPHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEEJcEjEjEjJdEEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEHEHEJeJeJeJeJejbjcjdjdjdjdjdjdJfjdjdjdjdjdjdjcjbJeJeJeJeJeHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVJgJhJiJjJkDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHEHEHEJeJeJeJeJejbjcjdjdjdjdjdjdjdjdjdjdjdjdjdjcjbJeJeJeJeJeHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGwGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVJgJhJiJjJkDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNHEJlJlJlJlJlHEIBICICICICICICICICICICICICICIDHEJmJmJmJmJmHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkDVDWDXDYDVEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNHEHEHEHEHEHEHEJnJoJoJoJoJoJpJqJrJoJoJoJoJoJnHEHEHEHEHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFkaNaNaNEMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNHEJnJnJnJsJnJtJtJtJtJtJnJsJnJnJnHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNHEHEHFHEHEHEHEJuJvJwHEHEHEHEHFHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNHEHEHFHEHEHEHEJuJvuCHEHEHEHEHFHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHEHEHEHEHEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -25,14 +25,3 @@
world << "Diary: \[[diaryType]:[type]] [text]"
else
world << "Log: \[[type]] [text]"
/**
* var/disposed
*
* In goonstation, disposed is set to 1 after an object enters the delete queue
* or the object is placed in an object pool (effectively out-of-play so to speak)
*/
/datum/var/disposed
// Garbage collection (controller).
/datum/var/gcDestroyed
/datum/var/timeDestroyed
@@ -31,7 +31,7 @@ datum/updateQueueWorker/proc/doWork()
var/datum/object = objects[objects.len] // Pull out the object
objects.len-- // Remove the object from the list
if (istype(object) && !isturf(object) && !object.disposed && isnull(object.gcDestroyed)) // We only work with real objects
if (istype(object) && !isturf(object) && isnull(object.gcDestroyed)) // We only work with real objects
call(object, procName)(arglist(arguments))
// If there's nothing left to execute
+3 -2
View File
@@ -8,7 +8,7 @@
//#endif
for(var/obj/machinery/M in machines)
if(M && !M.gcDestroyed)
if(M && isnull(M.gcDestroyed))
#ifdef PROFILE_MACHINES
var/time_start = world.timeofday
#endif
@@ -29,6 +29,7 @@
machine_profiling[M.type] += (time_end - time_start)
#endif
else
machines -= M
scheck()
+3 -3
View File
@@ -4,9 +4,9 @@
/datum/controller/process/pipenet/doWork()
for(var/datum/pipe_network/pipeNetwork in pipe_networks)
if(istype(pipeNetwork) && !pipeNetwork.disposed)
if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed))
pipeNetwork.process()
scheck()
continue
pipe_networks.Remove(pipeNetwork)
else
pipe_networks -= pipeNetwork
+6 -11
View File
@@ -8,18 +8,15 @@ var/global/list/power_machinery_profiling = list()
schedule_interval = 20 // every 2 seconds
/datum/controller/process/power_machinery/doWork()
for(var/i = 1 to power_machines.len)
if(i > power_machines.len)
break
var/obj/machinery/M = power_machines[i]
if(istype(M) && !M.gcDestroyed)
for(var/obj/machinery/M in power_machines)
if(istype(M) && isnull(M.gcDestroyed))
#ifdef PROFILE_MACHINES
var/time_start = world.timeofday
#endif
if(M.process() == PROCESS_KILL)
M.inMachineList = 0
power_machines.Remove(M)
power_machines -= M
continue
if(M && M.use_power)
@@ -34,12 +31,10 @@ var/global/list/power_machinery_profiling = list()
power_machinery_profiling[M.type] += (time_end - time_start)
#endif
else
if(!power_machines.Remove(M))
power_machines.Cut(i,i+1)
power_machines -= M
else
if(M)
if(istype(M))
M.inMachineList = 0
if(!power_machines.Remove(M))
power_machines.Cut(i,i+1)
power_machines -= M
scheck()
+3 -3
View File
@@ -4,9 +4,9 @@
/datum/controller/process/powernet/doWork()
for(var/datum/powernet/powerNetwork in powernets)
if(istype(powerNetwork) && !powerNetwork.disposed)
if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed))
powerNetwork.reset()
scheck()
continue
powernets.Remove(powerNetwork)
else
powernets -= powerNetwork
-201
View File
@@ -1,201 +0,0 @@
#define GC_COLLECTIONS_PER_TICK 300 // Was 100.
#define GC_COLLECTION_TIMEOUT (30 SECONDS)
#define GC_FORCE_DEL_PER_TICK 60
//#define GC_DEBUG
var/list/gc_hard_del_types = list()
var/datum/garbage_collector/garbageCollector
/client/proc/gc_dump_hdl()
set name = "(GC) Hard Del List"
set desc = "List types that are hard del()'d by the GC."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
if(!gc_hard_del_types || !gc_hard_del_types.len)
usr << "<span class='notice'>No hard del()'d types found.</span>"
for(var/A in gc_hard_del_types)
usr << "[A] = [gc_hard_del_types[A]]"
/datum/garbage_collector
var/list/queue = new
var/del_everything = 0
// To let them know how hardworking am I :^).
var/dels_count = 0
var/hard_dels = 0
var/soft_dels = 0
/datum/garbage_collector/proc/addTrash(const/atom/movable/AM)
if(!istype(AM))
return
if(del_everything)
del(AM)
hard_dels++
dels_count++
return
queue["\ref[AM]"] = world.timeofday
/datum/garbage_collector/proc/process()
var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK
var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK
var/collectionTimeScope = world.timeofday - GC_COLLECTION_TIMEOUT
while(queue.len && --remainingCollectionPerTick >= 0)
var/refID = queue[1]
var/destroyedAtTime = queue[refID]
if(destroyedAtTime > collectionTimeScope)
break
var/atom/movable/AM = locate(refID)
if(AM) // Something's still referring to the qdel'd object. del it.
if(isnull(AM.gcDestroyed))
queue -= refID
continue
if(remainingForceDelPerTick <= 0)
break
#ifdef GC_DEBUG
WARNING("gc process force delete [AM.type]")
#endif
AM.hard_deleted = 1
gc_hard_del_types |= AM.type
del AM
hard_dels++
remainingForceDelPerTick--
#ifdef GC_DEBUG
#undef GC_DEBUG
#endif
#undef GC_FORCE_DEL_PER_TICK
#undef GC_COLLECTION_TIMEOUT
#undef GC_COLLECTIONS_PER_TICK
/datum/garbage_collector/proc/dequeue(id)
if (queue)
queue -= id
dels_count++
/datum/garbage_collector/proc/hardDel(const/datum/D)
WARNING("GC hard-delling [D.type].")
gc_hard_del_types |= D.type
del(D)
garbageCollector.hard_dels++
garbageCollector.dels_count++
/*
* NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable
* OTHER TYPES CANNOT BE QDEL'D BECAUSE THEIR LOC IS LOCKED OR THEY DON'T HAVE ONE.
*/
/proc/qdel(var/datum/D, ignore_pooling = 0)
if(isnull(D))
return
if(isnull(garbageCollector))
del(D)
return
if(!istype(D))
WARNING("qdel() passed object of type [D.type]. qdel() can only handle /datum/ types.")
del(D) //no clue what could even do this, but just in case.
return
if(isnull(D.gcDestroyed))
// Let our friend know they're about to get fucked up.
var/hint = D.Destroy()
switch(hint)
if(QDEL_HINT_QUEUE) //qdel should queue the object for deletion
garbageCollector.addTrash(D)
if(QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destroy.
return
if(QDEL_HINT_IWILLGC) //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
return
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
garbageCollector.hardDel(D)
if (QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
PlaceInPool(D,0)
else
// world << "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!"
garbageCollector.addTrash(D)
/datum/controller
var/processing = 0
var/iteration = 0
var/processing_interval = 0
/datum/controller/proc/recover() // If we are replacing an existing controller (due to a crash) we attempt to preserve as much as we can.
/*
* Like Del(), but for qdel.
* Called BEFORE qdel moves shit.
*/
/datum/proc/Destroy()
return QDEL_HINT_HARDDEL_NOW //qdel can't handle datums, therefore tell it to immediately del
/client/proc/qdel_toggle()
set name = "Toggle qdel Behavior"
set desc = "Toggle qdel usage between normal and force del()."
set category = "Debug"
garbageCollector.del_everything = !garbageCollector.del_everything
world << "<b>GC: qdel turned [garbageCollector.del_everything ? "off" : "on"].</b>"
log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].")
message_admins("\blue [key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].", 1)
/*/client/var/running_find_references
/atom/verb/find_references()
set category = "Debug"
set name = "Find References"
set background = 1
set src in world
if(!usr || !usr.client)
return
if(usr.client.running_find_references)
testing("CANCELLED search for references to a [usr.client.running_find_references].")
usr.client.running_find_references = null
return
if(alert("Running this will create a lot of lag until it finishes. You can cancel it by running it again. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
return
qdel(src)
// Remove this object from the list of things to be auto-deleted.
if(garbageCollector)
garbageCollector.queue -= "\ref[src]"
usr.client.running_find_references = type
testing("Beginning search for references to a [type].")
var/list/things = list()
for(var/client/thing)
things += thing
for(var/datum/thing)
things += thing
for(var/atom/thing)
things += thing
for(var/event/thing)
things += thing
testing("Collected list of things in search for references to a [type]. ([things.len] Thing\s)")
for(var/datum/thing in things)
if(!usr.client.running_find_references) return
for(var/varname in thing.vars)
var/variable = thing.vars[varname]
if(variable == src)
testing("Found [src.type] \ref[src] in [thing.type]'s [varname] var.")
else if(islist(variable))
if(src in variable)
testing("Found [src.type] \ref[src] in [thing.type]'s [varname] list var.")
testing("Completed search for references to a [type].")
usr.client.running_find_references = null
*/
+10 -2
View File
@@ -10,6 +10,13 @@ var/global/last_tick_duration = 0
var/global/air_processing_killed = 0
var/global/pipe_processing_killed = 0
/datum/controller
var/processing = 0
var/iteration = 0
var/processing_interval = 0
/datum/controller/proc/recover() // If we are replacing an existing controller (due to a crash) we attempt to preserve as much as we can.
datum/controller/game_controller
var/breather_ticks = 2 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every loop
var/minimum_ticks = 20 //The minimum length of time between MC ticks
@@ -288,12 +295,13 @@ datum/controller/game_controller/proc/process()
/datum/controller/game_controller/proc/process_bots()
for(var/obj/machinery/bot/Bot in aibots)
if(!Bot.gc_destroyed)
if(Bot && isnull(Bot.gcDestroyed))
last_thing_processed = Bot.type
spawn(0)
Bot.bot_process()
continue
aibots -= Bot
else
aibots -= Bot
/datum/controller/game_controller/proc/processObjects()
for (var/obj/Object in processing_objects)
+221
View File
@@ -305,6 +305,128 @@
basic_hit(A,D)
return 1
#define WRIST_WRENCH_COMBO "DD"
#define BACK_KICK_COMBO "HG"
#define STOMACH_KNEE_COMBO "GH"
#define HEAD_KICK_COMBO "DHH"
#define ELBOW_DROP_COMBO "HDHDH"
/datum/martial_art/the_sleeping_carp
name = "The Sleeping Carp"
/datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(findtext(streak,WRIST_WRENCH_COMBO))
streak = ""
wristWrench(A,D)
return 1
if(findtext(streak,BACK_KICK_COMBO))
streak = ""
backKick(A,D)
return 1
if(findtext(streak,STOMACH_KNEE_COMBO))
streak = ""
kneeStomach(A,D)
return 1
if(findtext(streak,HEAD_KICK_COMBO))
streak = ""
headKick(A,D)
return 1
if(findtext(streak,ELBOW_DROP_COMBO))
streak = ""
elbowDrop(A,D)
return 1
return 0
/datum/martial_art/the_sleeping_carp/proc/wristWrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
D.visible_message("<span class='warning'>[A] grabs [D]'s wrist and wrenches it sideways!</span>", \
"<span class='userdanger'>[A] grabs your wrist and violently wrenches it to the side!</span>")
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
D.emote("scream")
D.drop_item()
D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
D.Stun(2)
return 1
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/backKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(A.dir == D.dir && !D.stat && !D.weakened)
D.visible_message("<span class='warning'>[A] kicks [D] in the back!</span>", \
"<span class='userdanger'>[A] kicks you in the back, making you stumble and fall!</span>")
step_to(D,get_step(D,D.dir),1)
D.Weaken(4)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
return 1
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/kneeStomach(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
D.visible_message("<span class='warning'>[A] knees [D] in the stomach!</span>", \
"<span class'userdanger'>[A] winds you with a knee in the stomach!</span>")
D.audible_message("<b>[D]</b> gags!")
D.losebreath += 3
D.Stun(1)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
return 1
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/headKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
D.visible_message("<span class='warning'>[A] kicks [D] in the head!</span>", \
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
D.apply_damage(20, BRUTE, "head")
D.drop_item()
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
return 1
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/elbowDrop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.weakened || D.resting || D.stat)
D.visible_message("<span class='warning'>[A] elbow drops [D]!</span>", \
"<span class='userdanger'>[A] piledrives you with their elbow!</span>")
if(D.stat)
D.death() //FINISH HIM!
D.apply_damage(50, BRUTE, "chest")
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 100, 1, -1)
return 1
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("G")
if(check_streak(A,D))
return 1
..()
var/obj/item/weapon/grab/G = A.get_active_hand()
if(G)
G.state = GRAB_AGGRESSIVE //Instant aggressive grab
/datum/martial_art/the_sleeping_carp/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("H")
if(check_streak(A,D))
return 1
D.visible_message("<span class='danger'>[A] [pick("punches", "kicks", "chops", "hits", "slams")] [D]!</span>", \
"<span class='userdanger'>[A] hits you!</span>")
D.apply_damage(10, BRUTE)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
return 1
/datum/martial_art/the_sleeping_carp/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("D")
if(check_streak(A,D))
return 1
return ..()
/mob/living/carbon/human/proc/sleeping_carp_help()
set name = "Recall Teachings"
set desc = "Remember the martial techniques of the Sleeping Carp clan."
set category = "Sleeping Carp"
usr << "<b><i>You retreat inward and recall the teachings of the Sleeping Carp...</i></b>"
usr << "<span class='notice'>Wrist Wrench</span>: Disarm Disarm. Forces opponent to drop item in hand."
usr << "<span class='notice'>Back Kick</span>: Harm Grab. Opponent must be facing away. Knocks down."
usr << "<span class='notice'>Stomach Knee</span>: Grab Harm. Knocks the wind out of opponent and stuns."
usr << "<span class='notice'>Head Kick</span>: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand."
usr << "<span class='notice'>Elbow Drop</span>: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition."
//ITEMS
@@ -364,3 +486,102 @@
H << "<span class='notice'>You learn the PLASMA FIST style.</span>"
used = 1
desc += "It looks like it's magic was used up."
/obj/item/weapon/sleeping_carp_scroll
name = "mysterious scroll"
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll2"
/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob)
if(!istype(user) || !user)
return
user << "<span class='notice'>You begin to read the scroll...</span>"
user << "<span class='sciradio'><i>And all at once the secrets of the Sleeping Carp fill your mind. The ancient clan's martial teachings have been imbued into this scroll. As you read through it, \
these secrets flood into your mind and body. You now know the martial techniques of the Sleeping Carp. Your hand-to-hand combat has become much more effective, and you may now perform powerful \
combination attacks. To learn more about these combos, use the Recall Teachings ability in the Sleeping Carp tab.</i></span>"
user.verbs += /mob/living/carbon/human/proc/sleeping_carp_help
var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
theSleepingCarp.teach(user)
user.drop_item()
visible_message("<span class='warning'>[src] lights up in fire and quickly burns to ash.</span>")
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
/obj/item/weapon/twohanded/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 8
w_class = 4
slot_flags = SLOT_BACK
force_unwielded = 8
force_wielded = 18
throwforce = 20
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons.dmi'
icon_override = 'icons/mob/in-hand/staff.dmi'
icon_state = "bostaff0"
/obj/item/weapon/twohanded/bostaff/update_icon()
icon_state = "bostaff[wielded]"
return
/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
if((CLUMSY in user.disabilities) && prob(50))
user << "<span class ='warning'>You club yourself over the head with [src].</span>"
user.Weaken(3)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.apply_damage(2*force, BRUTE, "head")
else
user.take_organ_damage(2*force)
return
if(isrobot(target))
return ..()
if(!isliving(target))
return ..()
var/mob/living/carbon/C = target
if(C.stat)
user << "<span class='warning'>It would be dishonorable to attack a foe while they cannot retaliate.</span>"
return
switch(user.a_intent)
if("disarm")
if(!wielded)
return ..()
if(!ishuman(target))
return ..()
var/mob/living/carbon/human/H = target
var/list/fluffmessages = list("[user] clubs [H] with [src]!", \
"[user] smacks [H] with the butt of [src]!", \
"[user] broadsides [H] with [src]!", \
"[user] smashes [H]'s head with [src]!", \
"[user] beats [H] with front of [src]!", \
"[user] twirls and slams [H] with [src]!")
H.visible_message("<span class='warning'>[pick(fluffmessages)]</span>", \
"<span class='userdanger'>[pick(fluffmessages)]</span>")
playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1)
H.adjustStaminaLoss(rand(13,20))
if(prob(10))
H.visible_message("<span class='warning'>[H] collapses!</span>", \
"<span class='userdanger'>Your legs give out!</span>")
H.Weaken(4)
if(H.staminaloss && !H.sleeping)
var/total_health = (H.health - H.staminaloss)
if(total_health <= config.health_threshold_crit && !H.stat)
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking them out cold!</span>", \
"<span class='userdanger'>[user] knocks you unconscious!</span>")
H.sleeping += 30
H.adjustBrainLoss(25)
return
else
return ..()
return ..()
/obj/item/weapon/twohanded/bostaff/IsShield()
if(wielded)
return 1
else
return 0
+813 -807
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -497,6 +497,8 @@ var/list/ghostteleportlocs = list()
name = "\improper Thunderdome"
icon_state = "thunder"
requires_power = 0
lighting_use_dynamic = 0
/area/tdome/arena_source
name = "\improper Thunderdome Arena Template"
+1 -7
View File
@@ -1,6 +1,3 @@
var/global/list/del_profiling = list()
var/global/list/gdel_profiling = list()
var/global/list/ghdel_profiling = list()
/atom
layer = 2
var/level = 2
@@ -30,9 +27,6 @@ var/global/list/ghdel_profiling = list()
//Detective Work, used for the duplicate data points kept in the scanners
var/list/original_atom
// Garbage collection
var/gc_destroyed=null
var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
/atom/Destroy()
@@ -40,7 +34,7 @@ var/global/list/ghdel_profiling = list()
if(reagents)
reagents.Destroy()
qdel(reagents)
reagents = null
// Idea by ChuckTheSheep to make the object even more unreferencable.
-36
View File
@@ -16,7 +16,6 @@
var/mob/pulledby = null
var/area/areaMaster
var/hard_deleted = 0
/atom/movable/New()
. = ..()
@@ -28,41 +27,6 @@
loc = null
return QDEL_HINT_QUEUE
/proc/delete_profile(var/type, code = 0)
if(!ticker || !ticker.current_state < 3) return
switch(code)
if(0)
if (!("[type]" in del_profiling))
del_profiling["[type]"] = 0
del_profiling["[type]"] += 1
if(1)
if (!("[type]" in ghdel_profiling))
ghdel_profiling["[type]"] = 0
ghdel_profiling["[type]"] += 1
if(2)
if (!("[type]" in gdel_profiling))
gdel_profiling["[type]"] = 0
gdel_profiling["[type]"] += 1
if(garbageCollector)
garbageCollector.soft_dels++
/atom/movable/Del()
if (gcDestroyed)
garbageCollector.dequeue("\ref[src]")
if (hard_deleted)
delete_profile("[type]", 1)
else
delete_profile("[type]", 2)
else // direct del calls or nulled explicitly.
delete_profile("[type]", 0)
Destroy()
..()
// Used in shuttle movement and AI eye stuff.
// Primarily used to notify objects being moved by a shuttle/bluespace fuckup.
/atom/movable/proc/setLoc(var/T, var/teleported=0)
+1 -1
View File
@@ -176,7 +176,7 @@ var/list/blob_nodes = list()
return
if (1)
command_announcement.Announce("Nanotrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/blob_confirmed.ogg')
command_announcement.Announce("Nanotrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
return
if (2)
+3 -1
View File
@@ -494,7 +494,9 @@ var/global/datum/controller/occupations/job_master
var/equipped = H.equip_to_slot_or_del(new /obj/item/clothing/glasses/regular(H), slot_glasses)
if(equipped != 1)
var/obj/item/clothing/glasses/G = H.glasses
G.prescription = 1
if(istype(G) && !G.prescription)
G.prescription = 1
G.name = "prescription [G.name]"
// H.update_icons()
H.hud_updateflag |= (1 << ID_HUD)
+3 -3
View File
@@ -206,9 +206,9 @@
dir = 8
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
var/mob/living/carbon/human/occupant = null
var/possible_chems = list(list("epinephrine", "morphine", "salbutamol", "styptic_powder"),
list("epinephrine", "morphine", "salbutamol", "styptic_powder", "oculine"),
list("epinephrine", "morphine", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol"))
var/possible_chems = list(list("epinephrine", "ether", "salbutamol", "styptic_powder"),
list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine"),
list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol"))
var/amounts = list(5, 10)
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
+1 -1
View File
@@ -410,7 +410,7 @@
dat += text("[]\tBlood Level %: [] ([] units)</FONT><BR>", (blood_volume > 448 ?"<font color='blue'>" : "<font color='red'>"), blood_percent, blood_volume)
if(occupant.reagents)
dat += text("Epinephrine units: [] units<BR>", occupant.reagents.get_reagent_amount("Epinephrine"))
dat += text("Morphine: [] units<BR>", occupant.reagents.get_reagent_amount("morphine"))
dat += text("Ether: [] units<BR>", occupant.reagents.get_reagent_amount("ether"))
dat += text("[]\tSilver Sulfadiazine: [] units</FONT><BR>", (occupant.reagents.get_reagent_amount("silver_sulfadiazine") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("silver_sulfadiazine"))
dat += text("[]\tStyptic Powder: [] units<BR>", (occupant.reagents.get_reagent_amount("styptic_powder") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("styptic_powder"))
dat += text("[]\tsalbutamol: [] units<BR>", (occupant.reagents.get_reagent_amount("salbutamol") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("salbutamol"))
+2 -2
View File
@@ -170,8 +170,8 @@
if(O.reagents.get_reagent_amount("water") < 50)
O.reagents.add_reagent("water", 2 * coeff)
if(istype(O,/obj/item/weapon/reagent_containers/spray/alien/stun))
if(O.reagents.get_reagent_amount("morphine") < 250)
O.reagents.add_reagent("morphine", 2 * coeff)
if(O.reagents.get_reagent_amount("ether") < 250)
O.reagents.add_reagent("ether", 2 * coeff)
if(R)
+1 -1
View File
@@ -886,7 +886,7 @@
icon_deny = "med-deny"
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
req_access_txt = "5"
products = list(/obj/item/weapon/reagent_containers/glass/bottle/charcoal = 4,/obj/item/weapon/reagent_containers/glass/bottle/morphine = 4,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4,
products = list(/obj/item/weapon/reagent_containers/glass/bottle/charcoal = 4,/obj/item/weapon/reagent_containers/glass/bottle/morphine = 4,/obj/item/weapon/reagent_containers/glass/bottle/ether = 4,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4,
/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe/insulin = 4,
/obj/item/weapon/reagent_containers/syringe = 12,/obj/item/device/healthanalyzer = 5,/obj/item/device/healthupgrade = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4,
/obj/item/weapon/reagent_containers/dropper = 2,/obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3,
@@ -188,11 +188,11 @@
/obj/item/weapon/melee/energy/sword/green
New()
_color = "green"
blade_color = "green"
/obj/item/weapon/melee/energy/sword/red
New()
_color = "red"
blade_color = "red"
/obj/item/weapon/melee/energy/blade/New()
spark_system = new /datum/effect/effect/system/spark_spread()
+10 -7
View File
@@ -368,14 +368,14 @@ obj/item/weapon/twohanded/
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "chainsaw0"
name = "Chainsaw"
desc = "Perfect for felling trees or fellow spaceman."
desc = "Perfect for felling trees or fellow spacemen."
force = 15
throwforce = 15
throw_speed = 1
throw_range = 5
w_class = 4.0 // can't fit in backpacks
force_unwielded = 15 //still pretty robust
force_wielded = 50 //you'll gouge their eye out! Or a limb...maybe even their entire body!
force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body!
wieldsound = 'sound/weapons/chainsawstart.ogg'
hitsound = null
flags = NOSHIELD
@@ -409,11 +409,14 @@ obj/item/weapon/twohanded/
playsound(loc, "swing_hit", 50, 1, -1)
return ..()
/obj/item/weapon/twohanded/chainsaw/IsShield() //Disarming someone with a chainsaw should be difficult.
if(wielded)
return 1
else
return 0
/obj/item/weapon/twohanded/chainsaw/wield() //you can't disarm an active chainsaw, you crazy person.
..()
flags |= NODROP
/obj/item/weapon/twohanded/chainsaw/unwield()
..()
flags &= ~NODROP
// SINGULOHAMMER
+1 -1
View File
@@ -249,7 +249,7 @@ a {
/obj/singularity_act()
ex_act(1.0)
if(src && isnull(gc_destroyed))
if(src && isnull(gcDestroyed))
qdel(src)
return 2
@@ -140,7 +140,7 @@
sleep(2)
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/weapon/reagent_containers/syringe(src)
new /obj/item/weapon/reagent_containers/glass/bottle/morphine(src)
new /obj/item/weapon/reagent_containers/glass/bottle/ether(src)
new /obj/item/weapon/storage/pill_bottle/psychiatrist(src)
return
+3 -1
View File
@@ -142,8 +142,10 @@ var/list/admin_verbs_debug = list(
/client/proc/callproc,
/client/proc/callproc_datum,
/client/proc/toggledebuglogs,
/client/proc/qdel_toggle, // /vg/
/client/proc/qdel_toggle,
/client/proc/gc_dump_hdl,
/client/proc/gc_toggle_profiling,
/client/proc/gc_show_del_report,
/client/proc/debugNatureMapGenerator,
/client/proc/check_bomb_impacts,
/client/proc/test_movable_UI,
+1 -1
View File
@@ -101,7 +101,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!lst)
return
if(!A || A.gc_destroyed)
if(!A || !isnull(A.gcDestroyed))
usr << "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>"
return
if(!hascall(A,procname))
+41 -129
View File
@@ -8,9 +8,42 @@
//var/darkness_view = 0//Base human is 2
//var/invisa_view = 0
var/prescription = 0
var/prescription_upgradable = 0
var/see_darkness = 1
var/HUDType = 0
/obj/item/clothing/glasses/New()
. = ..()
if(prescription_upgradable && prescription)
// Pre-upgraded upgradable glasses
name = "prescription [name]"
/obj/item/clothing/glasses/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return ..()
var/mob/living/carbon/human/H = user
if(prescription_upgradable)
if(istype(O, /obj/item/clothing/glasses/regular))
if(prescription)
H << "You can't possibly imagine how adding more lenses would improve \the [name]."
return
H.unEquip(O)
O.loc = src // Store the glasses for later removal
H << "You fit \the [name] with lenses from \the [O]."
prescription = 1
name = "prescription [name]"
return
if(prescription && istype(O, /obj/item/weapon/screwdriver))
var/obj/item/clothing/glasses/regular/G = locate() in src
if(!G)
G = new(get_turf(H))
H << "You salvage the prescription lenses from \the [name]."
prescription = 0
name = initial(name)
H.put_in_hands(G)
return
return ..()
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
@@ -18,26 +51,12 @@
item_state = "glasses"
origin_tech = "magnets=2;engineering=2"
vision_flags = SEE_TURFS
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/meson/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return
var/mob/living/carbon/human/H = user
if(istype(O, /obj/item/clothing/glasses/regular))
H.unEquip(src)
H.unEquip(O)
var/obj/item/clothing/glasses/meson/prescription/P = new /obj/item/clothing/glasses/meson/prescription(get_turf(H))
H << "You fit \the [src.name] with lenses from \the [O.name]."
H.put_in_hands(P)
qdel(O)
qdel(src)
return
..()
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
@@ -45,39 +64,10 @@
item_state = "glasses"
darkness_view = 8
see_darkness = 0
/obj/item/clothing/glasses/meson/night/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/clothing/glasses/regular))
user << "\The [src.name] is too complex for you to fit with prescription lenses."
return
..()
prescription_upgradable = 0
/obj/item/clothing/glasses/meson/prescription
name = "prescription mesons"
desc = "Optical Meson Scanner with prescription lenses."
prescription = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/meson/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return
var/mob/living/carbon/human/H = user
if(istype(O, /obj/item/clothing/glasses/regular))
H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
return
if(istype(O, /obj/item/weapon/screwdriver))
H.unEquip(src)
var/obj/item/clothing/glasses/meson/M = new /obj/item/clothing/glasses/meson(get_turf(H))
var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
H << "You salvage the prescription lenses from \the [src.name]."
H.put_in_hands(M)
H.put_in_hands(R)
qdel(src)
return
..()
/obj/item/clothing/glasses/meson/cyber
name = "Eye Replacement Implant"
@@ -85,6 +75,7 @@
icon_state = "cybereye-green"
item_state = "eyepatch"
flags = NODROP
prescription_upgradable = 0
/obj/item/clothing/glasses/science
name = "Science Goggles"
@@ -147,14 +138,14 @@
flags = NODROP
/obj/item/clothing/glasses/regular
name = "Prescription Glasses"
name = "prescription glasses"
desc = "Made by Nerd. Co."
icon_state = "glasses"
item_state = "glasses"
prescription = 1
/obj/item/clothing/glasses/regular/hipster
name = "Prescription Glasses"
name = "prescription glasses"
desc = "Made by Uncool. Co."
icon_state = "hipster_glasses"
item_state = "hipster_glasses"
@@ -179,26 +170,12 @@
darkness_view = 1
flash_protect = 1
tint = 1
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return
var/mob/living/carbon/human/H = user
if(istype(O, /obj/item/clothing/glasses/regular))
H.unEquip(src)
H.unEquip(O)
var/obj/item/clothing/glasses/sunglasses/prescription/P = new /obj/item/clothing/glasses/sunglasses/prescription(get_turf(H))
H << "You fit \the [src.name] with lenses from \the [O.name]."
H.put_in_hands(P)
qdel(O)
qdel(src)
return
..()
/obj/item/clothing/glasses/virussunglasses
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
name = "sunglasses"
@@ -282,42 +259,14 @@
//vision_flags = BLIND
flash_protect = 2
tint = 3 //to make them blind
prescription_upgradable = 0
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/blindfold/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/clothing/glasses/regular))
user << "You doubt you can make a blindfold actually IMPROVE vision."
return
..()
/obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses"
prescription = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return
var/mob/living/carbon/human/H = user
if(istype(O, /obj/item/clothing/glasses/regular))
H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
return
if(istype(O, /obj/item/weapon/screwdriver))
H.unEquip(src)
var/obj/item/clothing/glasses/sunglasses/S = new /obj/item/clothing/glasses/sunglasses(get_turf(H))
var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
H << "You salvage the prescription lenses from \the [src.name]."
H.put_in_hands(S)
H.put_in_hands(R)
qdel(src)
return
..()
/obj/item/clothing/glasses/sunglasses/big
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks many flashes."
@@ -338,51 +287,14 @@
flash_protect = 1
tint = 1
HUDType = SECHUD
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/sechud/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return
var/mob/living/carbon/human/H = user
if(istype(O, /obj/item/clothing/glasses/regular))
H.unEquip(src)
H.unEquip(O)
var/obj/item/clothing/glasses/sunglasses/sechud/prescription/P = new /obj/item/clothing/glasses/sunglasses/sechud/prescription(get_turf(H))
H << "You fit \the [src.name] with lenses from \the [O.name]."
H.put_in_hands(P)
qdel(O)
qdel(src)
return
..()
/obj/item/clothing/glasses/sunglasses/sechud/prescription
name = "prescription HUDSunglasses"
prescription = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/sunglasses/sechud/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (user.stat || user.restrained() || !ishuman(user))
return
var/mob/living/carbon/human/H = user
if(istype(O, /obj/item/clothing/glasses/regular))
H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
return
if(istype(O, /obj/item/weapon/screwdriver))
H.unEquip(src)
var/obj/item/clothing/glasses/sunglasses/sechud/S = new /obj/item/clothing/glasses/sunglasses/sechud(get_turf(H))
var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
H << "You salvage the prescription lenses from \the [src.name]."
H.put_in_hands(S)
H.put_in_hands(R)
qdel(src)
return
..()
/obj/item/clothing/glasses/thermal
name = "Optical Thermal Scanner"
+3
View File
@@ -4,6 +4,7 @@
flags = null //doesn't protect eyes because it's a monocle, duh
origin_tech = "magnets=3;biotech=2"
HUDType = SECHUD
prescription_upgradable = 1
var/list/icon/current = list() //the current hud icons
@@ -27,6 +28,7 @@
item_state = "glasses"
darkness_view = 8
see_darkness = 0
prescription_upgradable = 0
/obj/item/clothing/glasses/hud/security
@@ -50,3 +52,4 @@
icon_state = "securityhudnight"
darkness_view = 8
see_darkness = 0
prescription_upgradable = 0
+4 -4
View File
@@ -346,7 +346,7 @@
return
on = !on
if(on)
user << "<span class='notice'>You switch your helmet to travel mode.</span>"
user << "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>"
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
@@ -354,7 +354,7 @@
cold_protection = HEAD
set_light(brightness_on)
else
user << "<span class='notice'>You switch your helmet to combat mode.</span>"
user << "<span class='notice'>You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.</span>"
name = "blood-red hardsuit helmet (combat)"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
flags = BLOCKHAIR
@@ -387,7 +387,7 @@
/obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user)
on = !on
if(on)
user << "<span class='notice'>You switch your hardsuit to travel mode.</span>"
user << "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>"
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
slowdown = 1
@@ -395,7 +395,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
else
user << "<span class='notice'>You switch your hardsuit to combat mode.</span>"
user << "<span class='notice'>You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.</span>"
name = "blood-red hardsuit helmet (combat)"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
slowdown = 0
+7
View File
@@ -107,6 +107,13 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "norah_briggs_1"
/obj/item/clothing/head/bearpelt/fluff/polar //Gibson1027: Sploosh
name = "polar bear pelt hat"
desc = "Fuzzy, and also stained with blood."
icon = 'icons/obj/custom_items.dmi'
icon_state = "polarbearpelt"
item_state = "polarbearpelt"
//////////// Suits ////////////
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Robotics Labcoat - Aeneas Rinil [APPR]
+9 -9
View File
@@ -7,8 +7,8 @@
/datum/event/blob/announce()
command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. Nanotrasen has issued a directive 7-10. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/blob_confirmed.ogg')
command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. Nanotrasen has issued a directive 7-10. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage."
@@ -34,16 +34,16 @@
if(!Blob && !blob_cores.len)
kill()
return
/datum/event/blob/proc/announce_nuke()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code && (bomb.z in config.station_levels))
nukecode = bomb.r_code
command_announcement.Announce("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to maintain quarantine. The Nuclear Authentication Code is [nukecode] ", "Biohazard Alert")
set_security_level("gamma")
var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world
if(V && (V.z in config.station_levels))
V.locked = 0
@@ -55,16 +55,16 @@
aiPlayer.set_zeroth_law(law)
aiPlayer << "\red <b>You have detected a change in your laws information:</b>"
aiPlayer << "Laws Updated: [law]"
spawn(10)
spawn(10)
world << sound('sound/effects/siren.ogg')
/datum/event/blob/kill()
spawn(10)
if(Blob || blob_cores.len)
return
command_announcement.Announce("The level 7 biohazard aboard [station_name()] has been eliminated. Directive 7-10 has been lifted, and the station is no longer quarantined.", "Biohazard Update")
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
aiPlayer.clear_zeroth_law()
@@ -33,7 +33,7 @@
/datum/event/brand_intelligence/tick()
if(!originMachine || originMachine.gc_destroyed || originMachine.shut_up || originMachine.wires.IsAllCut()) //if the original vending machine is missing or has it's voice switch flipped
if(!originMachine || !isnull(originMachine.gcDestroyed) || originMachine.shut_up || originMachine.wires.IsAllCut()) //if the original vending machine is missing or has it's voice switch flipped
for(var/obj/machinery/vending/saved in infectedMachines)
saved.shoot_inventory = 0
if(originMachine)
@@ -44,7 +44,7 @@
if(!vendingMachines.len) //if every machine is infected
for(var/obj/machinery/vending/upriser in infectedMachines)
if(prob(70) && !upriser.gc_destroyed)
if(prob(70) && isnull(upriser.gcDestroyed))
var/mob/living/simple_animal/hostile/mimic/copy/M = new(upriser.loc, upriser, null, 1) // it will delete upriser on creation and override any machine checks
M.faction = list("profit")
M.speak = rampant_speeches.Copy()
+1 -1
View File
@@ -22,7 +22,7 @@
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","fluorine","mutadone","mutagen","hydrocodone","fuel",
"blood","morphine","ether","fluorine","mutadone","mutagen","hydrocodone","fuel",
"haloperidol","lsd","nanites","lipolicide","frostoil","salglu_solution","beepskysmash",
"omnizine", "amanitin", "adminordrazine", "neurotoxin", "synaptizine")
var/datum/reagents/R = new/datum/reagents(50)
+583 -173
View File
@@ -11,7 +11,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
*/
mob/living/carbon/
/mob/living/carbon/
var/image/halimage
var/image/halbody
var/obj/halitem
@@ -19,187 +19,354 @@ mob/living/carbon/
var/handling_hal = 0
var/hal_crit = 0
mob/living/carbon/proc/handle_hallucinations()
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal)
return
//Least obvious
var/list/minor = list("sounds"=20,"bolts_minor"=10,"whispers"=15,"message"=5)
//Something's wrong here
var/list/medium = list("hudscrew"=15,"items"=15,"dangerflash"=15,"bolts"=10,"flood"=10,"husks"=10,"battle"=10)
//AAAAH
var/list/major = list("fake"=10,"death"=5,"xeno"=10,"singulo"=10,"delusion"=10)
var/grade = 0
var/current = list()
var/trip_length = 0
handling_hal = 1
while(hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
var/halpick = rand(1,100)
switch(halpick)
if(0 to 15)
//Screwy HUD
//src << "Screwy HUD"
hal_screwyhud = pick(1,2,3,3,4,4)
spawn(rand(100,250))
hal_screwyhud = 0
if(16 to 25)
//Strange items
//src << "Traitor Items"
if(!halitem)
halitem = new
var/list/slots_free = list(ui_lhand,ui_rhand)
if(l_hand) slots_free -= ui_lhand
if(r_hand) slots_free -= ui_rhand
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(!H.belt) slots_free += ui_belt
if(!H.l_store) slots_free += ui_storage1
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
halitem.layer = 50
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/gun.dmi'
halitem.icon_state = "revolver"
halitem.name = "Revolver"
if(2) //c4
halitem.icon = 'icons/obj/assemblies.dmi'
halitem.icon_state = "plastic-explosive0"
halitem.name = "Mysterious Package"
if(prob(25))
halitem.icon_state = "c4small_1"
if(3) //sword
halitem.icon = 'icons/obj/weapons.dmi'
halitem.icon_state = "sword1"
halitem.name = "Sword"
if(4) //stun baton
halitem.icon = 'icons/obj/weapons.dmi'
halitem.icon_state = "stunbaton"
halitem.name = "Stun Baton"
if(5) //emag
halitem.icon = 'icons/obj/card.dmi'
halitem.icon_state = "emag"
halitem.name = "Cryptographic Sequencer"
if(6) //flashbang
halitem.icon = 'icons/obj/grenade.dmi'
halitem.icon_state = "flashbang1"
halitem.name = "Flashbang"
if(client) client.screen += halitem
spawn(rand(100,250))
qdel(halitem)
if(26 to 40)
//Flashes of danger
//src << "Danger Flash"
if(!halimage)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
trip_length += 1
if(prob(min(20,trip_length*2)))
grade = min(3,grade+1)
if(prob(20))
continue
current = list()
for(var/a in minor)
current[a] = minor[a] * (grade==0?2:1)
for(var/b in medium)
current[b] = medium[b] * (grade==1?2:1)
for(var/c in major)
current[c] = major[c] * (grade==2?2:1)
switch(rand(1,3))
if(1)
//src << "Space"
halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
if(2)
//src << "Fire"
halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
if(3)
//src << "C4"
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
var/halpick = pickweight(current)
if(client) client.images += halimage
spawn(rand(10,50)) //Only seen for a brief moment.
if(client) client.images -= halimage
halimage = null
if(41 to 65)
//Strange audio
//src << "Strange Audio"
switch(rand(1,14))
if(1) src << 'sound/machines/airlock.ogg'
if(2)
if(prob(50))src << 'sound/effects/Explosion1.ogg'
else src << 'sound/effects/Explosion2.ogg'
if(3) src << 'sound/effects/explosionfar.ogg'
if(4) src << 'sound/effects/Glassbr1.ogg'
if(5) src << 'sound/effects/Glassbr2.ogg'
if(6) src << 'sound/effects/Glassbr3.ogg'
if(7) src << 'sound/machines/twobeep.ogg'
if(8) src << 'sound/machines/windowdoor.ogg'
if(9)
//To make it more realistic, I added two gunshots (enough to kill)
src << 'sound/weapons/Gunshot.ogg'
spawn(rand(10,30))
src << 'sound/weapons/Gunshot.ogg'
if(10) src << 'sound/weapons/smash.ogg'
if(11)
//Same as above, but with tasers.
src << 'sound/weapons/Taser.ogg'
spawn(rand(10,30))
src << 'sound/weapons/Taser.ogg'
//Rare audio
if(12)
//These sounds are (mostly) taken from Hidden: Source
var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
src << pick(creepyasssounds)
if(13)
src << "<span class='warning'>You feel a tiny prick!</span>"
if(14)
src << "<h1 class='alert'>Priority Announcement</h1>"
src << "<br><br><span class='alert'>The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.</span><br><br>"
src << sound('sound/AI/shuttledock.ogg')
if(66 to 70)
//Flashes of danger
if(!halbody)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,4))
if(1)
halbody = image('icons/mob/human.dmi',target,"husk_l",TURF_LAYER)
if(2,3)
halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
if(4)
halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
if(client) client.images += halbody
spawn(rand(50,80)) //Only seen for a brief moment.
if(client) client.images -= halbody
halbody = null
if(71 to 72)
//Fake death
src.sleeping = 20
hal_crit = 1
hal_screwyhud = 1
spawn(rand(50,100))
src.sleeping = 0
hal_crit = 0
hal_screwyhud = 0
if(73 to 75)
fake_attack()
hallucinate(halpick)
handling_hal = 0
/obj/effect/hallucination
invisibility = INVISIBILITY_OBSERVER
var/mob/living/carbon/target = null
/mob/living/carbon/proc/fake_attack()
// var/list/possible_clones = new/list()
/obj/effect/hallucination/simple
var/image_icon = 'icons/mob/alien.dmi'
var/image_state = "alienh_pounce"
var/px = 0
var/py = 0
var/col_mod = null
var/image/current_image = null
var/image_layer = MOB_LAYER
var/active = 1 //qdelery
/obj/effect/hallucination/simple/New(loc,var/mob/living/carbon/T)
target = T
current_image = GetImage()
if(target.client) target.client.images |= current_image
return
/obj/effect/hallucination/simple/proc/GetImage()
var/image/I = image(image_icon,loc,image_state,image_layer,dir=src.dir)
I.pixel_x = px
I.pixel_y = py
if(col_mod)
I.color = col_mod
return I
/obj/effect/hallucination/simple/proc/Show(var/update=1)
if(active)
if(target.client) target.client.images.Remove(current_image)
if(update)
current_image = GetImage()
if(target.client) target.client.images |= current_image
/obj/effect/hallucination/simple/update_icon(var/new_state,var/new_icon,var/new_px=0,var/new_py=0)
image_state = new_state
if(new_icon)
image_icon = new_icon
else
image_icon = initial(image_icon)
px = new_px
py = new_py
Show()
/obj/effect/hallucination/simple/Move()
..()
Show()
/obj/effect/hallucination/simple/Destroy()
if(target.client) target.client.images.Remove(current_image)
active = 0
#define FAKE_FLOOD_EXPAND_TIME 30
#define FAKE_FLOOD_MAX_RADIUS 7
/obj/effect/hallucination/fake_flood
//Plasma/N2O starts flooding from the nearby vent
var/list/flood_images = list()
var/list/turf/flood_turfs = list()
var/image_icon = 'icons/effects/tile_effects.dmi'
var/image_state = "plasma"
var/radius = 0
var/next_expand = 0
/obj/effect/hallucination/fake_flood/New(loc,var/mob/living/carbon/T)
..()
target = T
for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
if(!U.welded)
src.loc = U.loc
break
image_state = pick("plasma","sleeping_agent")
flood_images += image(image_icon,src,image_state,MOB_LAYER)
flood_turfs += get_turf(src.loc)
if(target.client) target.client.images |= flood_images
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
processing_objects += src
/obj/effect/hallucination/fake_flood/process()
if(next_expand <= world.time)
radius++
if(radius > FAKE_FLOOD_MAX_RADIUS)
qdel(src)
Expand()
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
return
/obj/effect/hallucination/fake_flood/proc/Expand()
if(!flood_turfs) //for qdel
return
for(var/turf/T in circlerangeturfs(loc,radius))
if((T in flood_turfs)|| T.blocks_air)
continue
flood_images += image(image_icon,T,image_state,MOB_LAYER)
flood_turfs += T
if(target.client) target.client.images |= flood_images
return
/obj/effect/hallucination/fake_flood/Destroy()
processing_objects -= src
del(flood_turfs)
if(target.client) target.client.images.Remove(flood_images)
target = null
del(flood_images)
return
/obj/effect/hallucination/simple/xeno
image_icon = 'icons/mob/alien.dmi'
image_state = "alienh_pounce"
/obj/effect/hallucination/simple/xeno/New(loc,var/mob/living/carbon/T)
..()
name = "alien hunter ([rand(1, 1000)])"
return
/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
if(!target || !src || (flags & NODROP)) return 0
src.throwing = 1
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
var/dist_travelled = 0
var/dist_since_sleep = 0
var/tdist_x = dist_x;
var/tdist_y = dist_y;
if(dist_x <= dist_y)
tdist_x = dist_y;
tdist_y = dist_x;
var/error = tdist_x/2 - tdist_y
while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
if(!src.throwing) break
if(!istype(src.loc, /turf)) break
var/atom/step = get_step(src, get_dir(src,target))
if(!step)
break
src.Move(step, get_dir(src, step))
hit_check()
error += (error < 0) ? tdist_x : -tdist_y;
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
src.throwing = 0
src.throw_impact(get_turf(src))
return 1
/obj/effect/hallucination/simple/xeno/throw_impact(A)
update_icon("alienh_pounce")
if(A == target)
target.Weaken(5)
target.visible_message("<span class='danger'>[target] flails around wildly.</span>","<span class ='userdanger'>[name] pounces on you!</span>")
/obj/effect/hallucination/xeno_attack
//Xeno crawls from nearby vent,jumps at you, and goes back in
var/obj/machinery/atmospherics/unary/vent_pump/pump = null
var/obj/effect/hallucination/simple/xeno/xeno = null
/obj/effect/hallucination/xeno_attack/New(loc,var/mob/living/carbon/T)
target = T
for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
if(!U.welded)
pump = U
break
if(!pump) return 0
xeno = new(pump.loc,target)
sleep(10)
if(!xeno) return
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(target,7,1)
sleep(10)
if(!xeno) return
xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
xeno.throw_at(pump,7,1)
sleep(10)
if(!xeno) return
var/xeno_name = xeno.name
target << "<span class='notice'>[xeno_name] begins climbing into the ventilation system...</span>"
sleep(10)
if(!xeno) return
qdel(xeno)
target << "<span class='notice'>[xeno_name] scrambles into the ventilation ducts!</span>"
qdel(src)
/obj/effect/hallucination/singularity_scare
//Singularity moving towards you.
//todo Hide where it moved with fake space images
var/obj/effect/hallucination/simple/singularity/s = null
/obj/effect/hallucination/singularity_scare/New(loc,var/mob/living/carbon/T)
target = T
var/turf/start = T.loc
var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
for(var/i = 0,i<11,i++)
start = get_step(start,screen_border)
s = new(start,target)
for(var/i = 0,i<11,i++)
sleep(5)
s.loc = get_step(get_turf(s),get_dir(s,target))
s.Show()
s.Eat()
qdel(s)
/obj/effect/hallucination/simple/singularity
image_icon = 'icons/effects/224x224.dmi'
image_state = "singularity_s7"
image_layer = 6
px = -96
py = -96
/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
var/target_dist = get_dist(src,target)
if(target_dist<=3) //"Eaten"
target.sleeping = 20
target.hal_crit = 1
target.hal_screwyhud = 1
spawn(rand(50,100))
target.sleeping = 0
target.hal_crit = 0
target.hal_screwyhud = 0
/obj/effect/hallucination/battle
/obj/effect/hallucination/battle/New(loc,var/mob/living/carbon/T)
target = T
var/hits = rand(3,6)
switch(rand(1,5))
if(1) //Laser fight
for(var/i=0,i<hits,i++)
target << sound('sound/weapons/Laser.ogg',0,1,0,25)
sleep(rand(1,5))
target << sound(get_sfx("bodyfall"),0,1,0,25)
if(2) //Esword fight
target << sound('sound/weapons/saberon.ogg',0,1,0,15)
for(var/i=0,i<hits,i++)
target << sound('sound/weapons/blade1.ogg',,0,1,0,25)
sleep(rand(1,5))
target << sound(get_sfx("bodyfall"),0,1,0,25)
target << sound('sound/weapons/saberoff.ogg',0,1,0,15)
if(3) //Gun fight
for(var/i=0,i<hits,i++)
target << sound(get_sfx("gunshot"),0,1,0,25)
sleep(rand(1,5))
target << sound(get_sfx("bodyfall"),0,1,0,25)
if(4) //Stunprod + cablecuff
target << sound('sound/weapons/Egloves.ogg',0,1,40)
target << sound(get_sfx("bodyfall"),0,1,0,25)
sleep(30)
target << sound('sound/weapons/cablecuff.ogg',0,1,0,15)
if(5) // Tick Tock
for(var/i=0,i<hits,i++)
target << sound('sound/items/timer.ogg',0,1,0,25)
sleep(15)
qdel(src)
/obj/effect/hallucination/delusion
var/list/image/delusions = list()
/obj/effect/hallucination/delusion/New(loc,var/mob/living/carbon/T)
target = T
var/image/A = null
var/kind = rand(1,3)
for(var/mob/living/carbon/human/H in living_mob_list)
if(H == target)
continue
if(H in view(target))
continue
switch(kind)
if(1)//Clown
A = image('icons/mob/animal.dmi',H,"clown")
if(2)//Carp
A = image('icons/mob/animal.dmi',H,"carp")
if(3)//Corgi
A = image('icons/mob/pets.dmi',H,"corgi")
if(4)//Skeletons
A = image('icons/mob/human.dmi',H,"skeleton_s")
A.override = 1
if(target.client)
delusions |= A
target.client.images |= A
sleep(300)
for(var/image/I in delusions)
if(target.client)
target.client.images.Remove(I)
qdel(src)
/obj/effect/hallucination/fakeattacker/New(loc,var/mob/living/carbon/T)
target = T
var/mob/living/carbon/human/clone = null
var/clone_weapon = null
for(var/mob/living/carbon/human/H in living_mob_list)
if(H.stat || H.lying)
continue
// possible_clones += H
clone = H
break //changed the code a bit. Less randomised, but less work to do. Should be ok, world.contents aren't stored in any particular order.
break
// if(!possible_clones.len) return
// clone = pick(possible_clones)
if(!clone)
return
//var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(outside_range(target))
var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(src.loc)
var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(get_turf(target),target)
if(clone.l_hand)
if(!(locate(clone.l_hand) in non_fakeattack_weapons))
clone_weapon = clone.l_hand.name
@@ -210,9 +377,8 @@ mob/living/carbon/proc/handle_hallucinations()
F.weap = clone.r_hand
F.name = clone.name
F.my_target = src
F.my_target = target
F.weapon_name = clone_weapon
src.hallucinations += F
F.left = image(clone,dir = WEST)
F.right = image(clone,dir = EAST)
@@ -220,7 +386,7 @@ mob/living/carbon/proc/handle_hallucinations()
F.down = image(clone,dir = SOUTH)
F.updateimage()
qdel(src)
/obj/effect/fake_attacker
icon = null
@@ -255,8 +421,6 @@ mob/living/carbon/proc/handle_hallucinations()
"<span class='danger'>[my_target] has attacked [src]!</span>")
src.health -= P.force
return
/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber)
@@ -266,20 +430,18 @@ mob/living/carbon/proc/handle_hallucinations()
for(var/mob/O in oviewers(world.view , my_target))
O << "<span class='danger'>[my_target] stumbles around.</span>"
/obj/effect/fake_attacker/New()
/obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T)
..()
my_target = T
spawn(300)
if(my_target)
my_target.hallucinations -= src
qdel(src)
step_away(src,my_target,2)
spawn attack_loop()
spawn(0)
attack_loop()
/obj/effect/fake_attacker/proc/updateimage()
// del src.currentimage
if(src.dir == NORTH)
del src.currentimage
src.currentimage = new /image(up,src)
@@ -342,7 +504,7 @@ mob/living/carbon/proc/handle_hallucinations()
return
var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_box/a357,\
/obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword,\
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow,\
/obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\
/obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
/obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\
@@ -356,3 +518,251 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
/obj/effect/hallucination/bolts
var/list/doors = list()
/obj/effect/hallucination/bolts/New(loc,var/mob/living/carbon/T,var/door_number=-1) //-1 for sever 1-2 for subtle
target = T
var/image/I = null
var/count = 0
for(var/obj/machinery/door/airlock/A in range(target,7))
if(count>door_number && door_number>0)
break
count++
I = image(A.icon,A,"door_locked",layer=A.layer+0.1)
doors += I
if(target.client)
target.client.images |= I
sleep(2)
sleep(100)
for(var/image/B in doors)
if(target.client)
target.client.images.Remove(B)
qdel(src)
/obj/effect/hallucination/whispers
/obj/effect/hallucination/whispers/New(loc,var/mob/living/carbon/T)
target = T
var/speak_messages = list("I'm watching you...","[target.name]!","Go away!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!")
var/radio_messages = list("Xenos!","Singularity loose!","They are arming the nuke!","They butchered Ian!","H-help!","[pick(teleportlocs)]!!","Where's [target.name]?","Call the shuttle!")
var/list/mob/living/carbon/people = list()
var/list/mob/living/carbon/person = null
for(var/mob/living/carbon/H in view(target))
if(H == target)
continue
if(!person)
person = H
else
if(get_dist(target,H)<get_dist(target,person))
person = H
people += H
if(person) //Basic talk
target << target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)
else // Radio talk
var/list/humans = list()
for(var/mob/living/carbon/human/H in living_mob_list)
humans += H
person = pick(humans)
target << target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "<span class='[frequency_span_class(PUB_FREQ)]'><b>\[[get_frequency_name(PUB_FREQ)]\]</b> <span class='name'>", part_b = "</span> <span class='message'>")
qdel(src)
/obj/effect/hallucination/message
/obj/effect/hallucination/message/New(loc,var/mob/living/carbon/T)
target = T
var/chosen = pick("<span class='userdanger'>The light burns you!</span>", \
"<span class='danger'>You don't feel like yourself.</span>", \
"<span class='userdanger'>Unknown has punched [target]!</span>", \
"<span class='notice'>You hear something squeezing through the ducts...</span>", \
"<span class='notice'>You hear a distant scream.</span>", \
"<span class='notice'>You feel invincible, nothing can hurt you!</span>", \
"<B>[target]</B> sneezes.", \
"<span class='warning'>You feel faint.</span>", \
"<span class='noticealien'>You hear a strange, alien voice in your head...</span>[pick("Hiss","Ssss")]", \
"<span class='notice'>You can see...everything!</span>")
target << chosen
qdel(src)
/mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines
switch(hal_type)
if("xeno")
new /obj/effect/hallucination/xeno_attack(src.loc,src)
if("singulo")
new /obj/effect/hallucination/singularity_scare(src.loc,src)
if("battle")
new /obj/effect/hallucination/battle(src.loc,src)
if("flood")
new /obj/effect/hallucination/fake_flood(src.loc,src)
if("delusion")
new /obj/effect/hallucination/delusion(src.loc,src)
if("fake")
new /obj/effect/hallucination/fakeattacker(src.loc,src)
if("bolts")
new /obj/effect/hallucination/bolts(src.loc,src)
if("bolts_minor")
new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2))
if("whispers")
new /obj/effect/hallucination/whispers(src.loc,src)
if("message")
new /obj/effect/hallucination/message(src.loc,src)
if("sounds")
//Strange audio
//src << "Strange Audio"
switch(rand(1,18))
if(1) src << 'sound/machines/airlock.ogg'
if(2)
if(prob(50))src << 'sound/effects/Explosion1.ogg'
else src << 'sound/effects/Explosion2.ogg'
if(3) src << 'sound/effects/explosionfar.ogg'
if(4) src << 'sound/effects/Glassbr1.ogg'
if(5) src << 'sound/effects/Glassbr2.ogg'
if(6) src << 'sound/effects/Glassbr3.ogg'
if(7) src << 'sound/machines/twobeep.ogg'
if(8) src << 'sound/machines/windowdoor.ogg'
if(9)
//To make it more realistic, I added two gunshots (enough to kill)
src << 'sound/weapons/Gunshot.ogg'
spawn(rand(10,30))
src << 'sound/weapons/Gunshot.ogg'
if(10) src << 'sound/weapons/smash.ogg'
if(11)
//Same as above, but with tasers.
src << 'sound/weapons/Taser.ogg'
spawn(rand(10,30))
src << 'sound/weapons/Taser.ogg'
//Rare audio
if(12)
//These sounds are (mostly) taken from Hidden: Source
var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
src << pick(creepyasssounds)
if(13)
src << "<span class='warning'>You feel a tiny prick!</span>"
if(14)
src << "<h1 class='alert'>Priority Announcement</h1>"
src << "<br><br><span class='alert'>The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.</span><br><br>"
src << sound('sound/AI/shuttledock.ogg')
if(15)
src << 'sound/items/Welder.ogg'
if(16)
src << 'sound/items/Screwdriver.ogg'
if(17)
src << 'sound/weapons/saberon.ogg'
if(18)
src << 'sound/weapons/saberoff.ogg'
if("hudscrew")
//Screwy HUD
//src << "Screwy HUD"
hal_screwyhud = pick(1,2,3,3,4,4)
spawn(rand(100,250))
hal_screwyhud = 0
if("items")
//Strange items
//src << "Traitor Items"
if(!halitem)
halitem = new
var/list/slots_free = list(ui_lhand,ui_rhand)
if(l_hand) slots_free -= ui_lhand
if(r_hand) slots_free -= ui_rhand
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(!H.belt) slots_free += ui_belt
if(!H.l_store) slots_free += ui_storage1
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
halitem.layer = 50
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/gun.dmi'
halitem.icon_state = "revolver"
halitem.name = "Revolver"
if(2) //c4
halitem.icon = 'icons/obj/assemblies.dmi'
halitem.icon_state = "plastic-explosive0"
halitem.name = "Mysterious Package"
if(prob(25))
halitem.icon_state = "c4small_1"
if(3) //sword
halitem.icon = 'icons/obj/weapons.dmi'
halitem.icon_state = "sword1"
halitem.name = "Sword"
if(4) //stun baton
halitem.icon = 'icons/obj/weapons.dmi'
halitem.icon_state = "stunbaton"
halitem.name = "Stun Baton"
if(5) //emag
halitem.icon = 'icons/obj/card.dmi'
halitem.icon_state = "emag"
halitem.name = "Cryptographic Sequencer"
if(6) //flashbang
halitem.icon = 'icons/obj/grenade.dmi'
halitem.icon_state = "flashbang1"
halitem.name = "Flashbang"
if(client) client.screen += halitem
spawn(rand(100,250))
qdel(halitem)
if("dangerflash")
//Flashes of danger
//src << "Danger Flash"
if(!halimage)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,3))
if(1)
//src << "Space"
halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
if(2)
//src << "Fire"
halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
if(3)
//src << "C4"
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
if(client) client.images += halimage
spawn(rand(10,50)) //Only seen for a brief moment.
if(client) client.images -= halimage
halimage = null
if("death")
//Fake death
src.sleeping = 20
hal_crit = 1
hal_screwyhud = 1
spawn(rand(50,100))
src.sleeping = 0
hal_crit = 0
hal_screwyhud = 0
if("husks")
if(!halbody)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,4))
if(1)
var/image/body = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
var/matrix/M = matrix()
M.Turn(90)
body.transform = M
halbody = body
if(2,3)
halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
if(4)
halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
if(client) client.images += halbody
spawn(rand(50,80)) //Only seen for a brief moment.
if(client) client.images -= halbody
halbody = null
@@ -0,0 +1,69 @@
/*
===============================================================================
How Garbage Collection Works
===============================================================================
In BYOND, there are exactly two ways anything gets deleted:
- A "soft delete", which occurs when an object's reference count hits 0, meaning it is not being referenced by anything
in the world (more on references further down). When an object is unreferenced, nothing can access it, so it has no
reason to exist, and BYOND's garbage collector simply deletes the object. This is fast.
- A "hard delete", which occurs when the del keyword is used to directly delete an object. This forces BYOND to find
every reference to the object being deleted, and null them all out. This is slow.
A reference is anything that refers to an object, and can thus be used to access it. A variable on another object, a
variable in a proc, an argument to a proc, the src of a running proc, the locs of contained objects, another object's
contents list (but not the world's automatic contents list), anything. BYOND keeps track of how many references there
are to an object - the reference count goes up when you make a new reference to an object, and back down when that
reference gets set to null, goes out of scope, or is deleted. When the reference count hits 0, there are no remaining
references to the object, and it is deleted by BYOND's garbage collector.
When you have something that exists in the world, and you want it to stop existing (maybe it got blown up, or eaten by
the singularity, or whatever), it needs to be deleted. You can use the del keyword to make sure it's deleted instantly,
but del is slow, and you want things to be deleted as quickly as possible, especially if you're deleting a whole lot of
them. You want soft deletes.
That's where the garbage collection system comes in - it prepares things to be soft deleted, and hard deletes anything
that can't be. There are two main procs involved in this process:
/proc/qdel(datumToDelete)
This is, effectively, a replacement for del that tells an object to prepare itself to be soft deleted by calling its
Destroy() proc. Depending on the qdel hint returned by Destroy(), qdel will queue the object in the garbage collector
(to be hard deleted if it isn't soft deleted), directly delete the object, pool the object, or ignore the object and
assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
isnull(gcDestroyed) will be true if an object is not being destroyed, and false if it is (which means you should get
rid of the reference you have to it).
Note that qdel can only work with datum-based objects, which excludes the world (deleting this shuts down the world),
clients (deleting these disconnect the client), lists, and savefiles. If any of these are passed to qdel, they will
be directly deleted, just as if they had been passed straight to del, so it should never be unsafe to qdel anything
you could del.
/datum/proc/Destroy()
This is, effectively, a replacement for Del() (with some exceptions) which is also responsible for nulling out
references to or on the object it is called on. Like Del, the Destroy proc will always be called, even if the object
is getting destroyed by a direct del instead of qdel; in that case, isnull(gcDestroyed) will be true, and some
references can safely be ignored.
The exceptions where Destroy cannot replace Del are for the same non-datum types mentioned under qdel, above. Those
should use a Del proc for any necessary cleanup, as a Destroy proc on them will not automatically get called.
When called by qdel, Destroy is expected to return a qdel hint, which determines whether the object should be directly
deleted, queued for deletion, pooled, or ignored entirely; which of these are appropriate will vary, though objects
should be pooled or queued whenever possible. The full list of qdel hints are in the code for the qdel proc.
As mentioned above, gcDestroyed can be used to tell whether an object is being destroyed. This is important, because if
an object is being destroyed, it WILL still exist, and any code that references it should stop referencing it as soon as
possible. In the same places that you check whether a reference still exists, you should also check for something like
isnull(myRefVar.gcDestroyed), which will be false if your object is being destroyed, meaning you should throw out the
reference immediately.
The inner workings of the GC itself and the stuff related to testing it probably don't need a detailed description - if
you intend to work with them, it would be best to read the code to understand what they do.
Pooling is related to GC, in that it's meant to reduce deletion overhead, but it does so by re-using objects instead of
deleting them at all. Explaining pooling is outside the scope of this file.
*/
@@ -0,0 +1,166 @@
// Main garbage collection code
// For general information about how the GC works and how to use it, see __gc_info.dm
#define GC_COLLECTIONS_PER_TICK 300 // Was 100.
#define GC_COLLECTION_TIMEOUT (30 SECONDS)
#define GC_FORCE_DEL_PER_TICK 60
//#define GC_DEBUG
// A list of types that were queued in the GC, and had to be soft deleted; used in testing
var/list/gc_hard_del_types = list()
var/datum/garbage_collector/garbageCollector
// The time a datum was destroyed by the GC, or null if it hasn't been
/datum/var/gcDestroyed
// Whether a datum was hard-deleted by the GC; 0 if not, 1 if it was queued, -1 if directly deleted
/datum/var/hard_deleted = 0
/datum/garbage_collector
var/list/queue = new
var/del_everything = 0
// To let them know how hardworking am I :^).
var/dels_count = 0
var/hard_dels = 0
var/soft_dels = 0
/datum/garbage_collector/proc/addTrash(var/datum/D)
if(!istype(D) || del_everything)
del(D)
hard_dels++
dels_count++
return
queue -= "\ref[D]" // If this is a re-used ref, remove the old ref from the queue
queue["\ref[D]"] = world.time
/datum/garbage_collector/proc/process()
var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK
var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK
var/collectionTimeScope = world.time - GC_COLLECTION_TIMEOUT
while(queue.len && --remainingCollectionPerTick >= 0)
var/refID = queue[1]
var/destroyedAtTime = queue[refID]
if(destroyedAtTime > collectionTimeScope)
break
var/datum/D = locate(refID)
// If the object still exists, and it's the same object, hard del it
if(D && D.gcDestroyed == destroyedAtTime)
if(remainingForceDelPerTick <= 0)
break
#ifdef GC_DEBUG
gcwarning("GC process force delete [D.type]")
#endif
hardDel(D)
queue.Cut(1, 2)
remainingForceDelPerTick--
else // Otherwise, it was GC'd - remove it from the queue
queue.Cut(1, 2)
soft_dels++
dels_count++
#ifdef GC_DEBUG
#undef GC_DEBUG
#endif
#undef GC_FORCE_DEL_PER_TICK
#undef GC_COLLECTION_TIMEOUT
#undef GC_COLLECTIONS_PER_TICK
/datum/garbage_collector/proc/hardDel(var/datum/D)
gc_hard_del_types |= D.type
D.hard_deleted = 1
if(!D.gcDestroyed)
spawn(-1)
D.Destroy()
D.gcDestroyed = world.time
del(D)
hard_dels++
dels_count++
// Effectively replaces del for any datum-based type
/proc/qdel(var/datum/D)
if(isnull(D))
return
if(isnull(garbageCollector))
del(D)
return
if(!istype(D)) // A non-datum was passed into qdel - just delete it outright.
// warning("qdel() passed object of type [D.type]. qdel() can only handle /datum/ types.")
del(D)
return
if(isnull(D.gcDestroyed))
// Let our friend know they're about to get fucked up.
var/hint
D.gcDestroyed = world.time
try
hint = D.Destroy()
catch(var/exception/e)
if(istype(e))
gcwarning("qdel() caught runtime destroying [D.type]: [e] in [e.file], line [e.line]")
else
gcwarning("qdel() caught runtime destroying [D.type]: [e]")
// Destroy runtimed? Panic! Hard delete!
D.hard_deleted = -1
del(D)
if(garbageCollector)
garbageCollector.dels_count++
return
if(!isnull(D.gcDestroyed) && D.gcDestroyed != world.time)
gcwarning("Sleep detected in Destroy() call of [D.type]")
D.gcDestroyed = world.time
switch(hint)
if(QDEL_HINT_QUEUE) //qdel should queue the object for deletion
garbageCollector.addTrash(D)
if(QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destroy.
return
if(QDEL_HINT_IWILLGC) //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
return
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
D.hard_deleted = -1 // -1 means "this hard del skipped the queue", used for profiling
del(D)
if(garbageCollector)
garbageCollector.dels_count++
if (QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
PlaceInPool(D,0)
else
// world << "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!"
garbageCollector.addTrash(D)
/*
* Like Del(), but for qdel.
* Called BEFORE qdel moves shit.
*/
/datum/proc/Destroy()
tag = null
return QDEL_HINT_HARDDEL_NOW // By default, assume that queueing any given datum is unsafe
// If something gets deleted directly, make sure its Destroy proc is still called
/datum/Del()
if(isnull(gcDestroyed)) // Not GC'd
try
Destroy()
catch(var/exception/e)
if(istype(e))
gcwarning("Del() caught runtime destroying [type]: [e] in [e.file], line [e.line]")
else
gcwarning("Del() caught runtime destroying [type]: [e]")
if(del_profiling)
delete_profile(src)
else
if(del_profiling)
delete_profile(src)
return ..()
/proc/gcwarning(msg)
world.log << "## GC WARNING: [msg]"
@@ -0,0 +1,171 @@
// Garbage collection testing/debugging/profiling code
/client/proc/qdel_toggle()
set name = "(GC) Toggle Queueing"
set desc = "Toggle qdel usage between normal and force del()."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
garbageCollector.del_everything = !garbageCollector.del_everything
// world << "<b>GC: qdel turned [garbageCollector.del_everything ? "off" : "on"].</b>"
log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].")
message_admins("\blue [key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].", 1)
/client/proc/gc_toggle_profiling()
set name = "(GC) Toggle Profiling"
set desc = "Toggle profiling of deletion methods"
set category = "Debug"
if(!check_rights(R_DEBUG))
return
del_profiling = !del_profiling
log_admin("[key_name(usr)] turned deletion profiling [del_profiling ? "on" : "off"].")
message_admins("\blue [key_name(usr)] turned deletion profiling [del_profiling ? "on" : "off"].", 1)
/client/proc/gc_show_del_report()
set name = "(GC) Show Del Report"
set desc = "Show report of deletions seen while profiling"
set category = "Debug"
if(!check_rights(R_DEBUG))
return
delete_profiler_report()
/client/proc/gc_dump_hdl()
set name = "(GC) Hard Del List"
set desc = "List types that are hard del()'d by the GC."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
if(!gc_hard_del_types || !gc_hard_del_types.len)
usr << "<span class='notice'>No hard del()'d types found.</span>"
return
usr << "Types hard del()'d by the GC:"
for(var/A in gc_hard_del_types)
usr << "[A]"
// Profiling stuff
var/global/del_profiling = 0
var/global/list/dels_profiled = list()
var/global/list/gdels_profiled = list()
var/global/list/ghdels_profiled = list()
/proc/delete_profile(var/datum/D)
if(!ticker || (ticker.current_state < 3)) return
var/code = 0
var/type = D.type
if(isnull(D.gcDestroyed))
code = 0
else if(D.hard_deleted == -1)
code = 0 // A non-queued hard deletion is counted as a straight deletion
else if(D.hard_deleted)
code = 1
else
code = 2
switch(code)
if(0) // Directly deleted (skipped the GC queue entirely)
if (!("[type]" in dels_profiled))
dels_profiled["[type]"] = 0
dels_profiled["[type]"] += 1
if(1) // Hard-deleted by the GC
if (!("[type]" in ghdels_profiled))
ghdels_profiled["[type]"] = 0
ghdels_profiled["[type]"] += 1
if(2) // qdel'd and garbage collected by BYOND
if (!("[type]" in gdels_profiled))
gdels_profiled["[type]"] = 0
gdels_profiled["[type]"] += 1
/proc/delete_profiler_report()
var/dat = "<html><head><title>Deletion Profiler Report</title></head>"
if(dels_profiled.len + gdels_profiled.len + ghdels_profiled.len)
dat += "<a href='#DD'>Direct Deletions</a><br />"
dat += "<a href='#SD'>GC Soft Deletions</a><br />"
dat += "<a href='#HD'>GC Hard Deletions</a><br />"
dat += delete_profiler_sortedlist(dels_profiled, "Direct Deletions", "DD")
dat += delete_profiler_sortedlist(gdels_profiled, "GC Soft Deletions", "SD")
dat += delete_profiler_sortedlist(ghdels_profiled, "GC Hard Deletions", "HD")
else
dat += "(No deletions profiled; listing types that have been hard-deleted by GC)<br />"
dat += "<table border='1'><tr><th>GC Hard Deletion Types</th></tr>"
for(var/A in gc_hard_del_types)
dat += "<tr><td>[A]</td></tr>"
dat += "</table>"
usr << browse(dat, "window=delete_profiler_report;size=600x480")
/proc/delete_profiler_sortedlist(var/list/L, var/header, var/anchorid)
L = L.Copy()
// Yes, this is a terrible sort, but I'm too lazy to find a good one
var/v,i,j,s
for(i = 1 to L.len-1)
s=i
v = L[L[i]]
for(j = i + 1 to L.len)
if(L[L[j]] > v)
s = j
v = L[L[j]]
L.Swap(i,s)
var/dat = "<table border='1' id='[anchorid]'><tr><th colspan='2'>[header]</th></tr>"
for (var/t in L)
dat +="<tr><td>[L[t]]</td><td>[t]</td></tr>"
dat += "</table>"
return dat
/*/client/var/running_find_references
/atom/verb/find_references()
set category = "Debug"
set name = "Find References"
set background = 1
set src in world
if(!usr || !usr.client)
return
if(usr.client.running_find_references)
testing("CANCELLED search for references to a [usr.client.running_find_references].")
usr.client.running_find_references = null
return
if(alert("Running this will create a lot of lag until it finishes. You can cancel it by running it again. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
return
qdel(src)
// Remove this object from the list of things to be auto-deleted.
if(garbageCollector)
garbageCollector.queue -= "\ref[src]"
usr.client.running_find_references = type
testing("Beginning search for references to a [type].")
var/list/things = list()
for(var/client/thing)
things += thing
for(var/datum/thing)
things += thing
for(var/atom/thing)
things += thing
for(var/event/thing)
things += thing
testing("Collected list of things in search for references to a [type]. ([things.len] Thing\s)")
for(var/datum/thing in things)
if(!usr.client.running_find_references) return
for(var/varname in thing.vars)
var/variable = thing.vars[varname]
if(variable == src)
testing("Found [src.type] \ref[src] in [thing.type]'s [varname] var.")
else if(islist(variable))
if(src in variable)
testing("Found [src.type] \ref[src] in [thing.type]'s [varname] list var.")
testing("Completed search for references to a [type].")
usr.client.running_find_references = null
*/
+2 -1
View File
@@ -450,7 +450,8 @@
"slimejelly",
"cyanide",
"lsd",
"morphine"
"morphine",
"ether"
)
for(var/x=1;x<=additional_chems;x++)
+1 -1
View File
@@ -1190,7 +1190,7 @@
name = "gelthi"
seed_name = "gelthi"
display_name = "gelthi plant"
chems = list("morphine" = list(1,5),"capsaicin" = list(1,5),"plantmatter" = list(1,5))
chems = list("ether" = list(1,5),"capsaicin" = list(1,5),"plantmatter" = list(1,5))
/datum/seed/gelthi/New()
..()
+1 -1
View File
@@ -58,7 +58,7 @@
//*******************************//
var/list/fruit_icon_states = list("badrecipe","kudzupod","reishi","lime","grapes","boiledrorocore","chocolateegg")
var/list/reagent_effects = list("toxin","charcoal","morphine","space_drugs","lsd","haloperidol")
var/list/reagent_effects = list("toxin","charcoal","ether","space_drugs","lsd","haloperidol")
var/jungle_plants_init = 0
/proc/init_jungle_plants()
+7 -10
View File
@@ -924,16 +924,13 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
else
hallucination -= 2
else
for(var/atom/a in hallucinations)
del a
if(halloss > 100)
src << "<span class='notice'>You're in too much pain to keep going...</span>"
for(var/mob/O in oviewers(src, null))
O.show_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.", 1)
Paralyse(10)
setHalLoss(99)
if(halloss > 100)
src << "<span class='notice'>You're in too much pain to keep going...</span>"
for(var/mob/O in oviewers(src, null))
O.show_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.", 1)
Paralyse(10)
setHalLoss(99)
if(paralysis)
AdjustParalysis(-1)
@@ -947,7 +944,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
adjustStaminaLoss(-10)
adjustHalLoss(-3)
if (mind)
//Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of morphine or similar.
//Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of ether or similar.
if(player_logged)
sleeping = max(sleeping-1, 2)
else
@@ -18,7 +18,6 @@
var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this.
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
@@ -373,7 +373,7 @@
src.modules += new /obj/item/device/flash/cyborg/alien(src)
src.modules += new /obj/item/borg/sight/thermal/alien(src)
var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src)
S.reagents.add_reagent("morphine",250) //nerfed to sleeptoxin to make it less instant drop.
S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop.
src.modules += S
var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src)
S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter.
@@ -65,7 +65,7 @@
melee_damage_upper = 10
poison_per_bite = 10
var/atom/cocoon_target
poison_type = "morphine"
poison_type = "ether"
var/fed = 0
//hunters have the most poison and move the fastest, so they can find prey
+4 -1
View File
@@ -18,7 +18,7 @@
var/lastout = 0
var/loaddemand = 0
var/capacity = 5e6
var/charge = 1e6
var/charge = 0
var/charging = 0
var/chargemode = 0
var/chargecount = 0
@@ -470,6 +470,9 @@
/obj/machinery/power/smes/engineering
charge = 1e6 // Engineering starts with some charge for singulo
/obj/machinery/power/smes/magical
name = "magical power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Magically produces power."
+2 -2
View File
@@ -150,7 +150,7 @@ var/list/solars_list = list()
/obj/machinery/power/solar/ex_act(severity, target)
..()
if(!gc_destroyed)
if(isnull(gcDestroyed))
switch(severity)
if(2)
if(prob(50) && broken())
@@ -501,7 +501,7 @@ var/list/solars_list = list()
/obj/machinery/power/solar_control/ex_act(severity, target)
..()
if(!gc_destroyed)
if(isnull(gcDestroyed))
switch(severity)
if(2)
if(prob(50))
+6 -28
View File
@@ -127,32 +127,6 @@ datum
if (!target.reagents || src.total_volume<=0)
return
/*var/datum/reagents/R = target.reagents
var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
var/part = amount / src.total_volume
var/trans_data = null
for (var/datum/reagent/current_reagent in src.reagent_list)
if (!current_reagent)
continue
//if (current_reagent.id == "blood" && ishuman(target))
// var/mob/living/carbon/human/H = target
// H.inject_blood(my_atom, amount)
// continue
var/current_reagent_transfer = current_reagent.volume * part
if(preserve_data)
trans_data = current_reagent.data
B.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety checks on these so all chemicals are transferred
src.remove_reagent(current_reagent.id, current_reagent_transfer, safety = 1) // to the target container before handling reactions
src.update_total()
B.update_total()
B.handle_reactions()
src.handle_reactions()*/
var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder
B.volume = 1000
@@ -163,9 +137,13 @@ datum
src.trans_to(B, amount)
spawn(100)
spawn(-1)
src = null // Survive through deletion of the reagent holder
sleep(100)
if(!target)
return
BR.trans_to(target, BR.total_volume)
del(B)
qdel(B)
return amount
+2 -1
View File
@@ -234,6 +234,7 @@ datum
reagent_state = LIQUID
color = "#0064C8" // rgb: 0, 100, 200
var/cooling_temperature = 2
process_flags = ORGANIC | SYNTHETIC
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
@@ -3238,4 +3239,4 @@ datum
holder.reagent_list -= src
holder = null
return ..()
return ..()
+1 -1
View File
@@ -1463,7 +1463,7 @@ datum
name = "Neurotoxin"
id = "neurotoxin"
result = "neurotoxin"
required_reagents = list("gargleblaster" = 1, "morphine" = 1)
required_reagents = list("gargleblaster" = 1, "ether" = 1)
result_amount = 2
snowwhite
+1 -1
View File
@@ -297,7 +297,7 @@
starting_chems = list("silver_sulfadiazine","styptic_powder","charcoal")
/obj/item/weapon/gun/dartgun/vox/raider
starting_chems = list("space_drugs","morphine","haloperidol")
starting_chems = list("space_drugs","ether","haloperidol")
/obj/effect/syringe_gun_dummy //moved this shitty thing here
name = ""
+30
View File
@@ -913,6 +913,36 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
result_amount = 4
mix_message = "The chemicals mix into an odd pink slush."
/datum/reagent/ether
name = "Ether"
id = "ether"
description = "A strong anesthetic and sedative."
reagent_state = LIQUID
color = "#96DEDE"
/datum/reagent/ether/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
switch(current_cycle)
if(0 to 15)
if(prob(5))
M.emote("yawn")
if(16 to 35)
M.drowsyness = max(M.drowsyness, 10)
if(36 to INFINITY)
M.Paralyse(10)
M.drowsyness = max(M.drowsyness, 15)
..()
return
/datum/chemical_reaction/ether
name = "Ether"
id = "ether"
result = "ether"
required_reagents = list("sacid" = 1, "ethanol" = 1, "oxygen" = 1)
result_amount = 1
mix_message = "The mixture yields a pungent odor, which makes you tired."
//////////////////////////////
// Synth-Meds //
//////////////////////////////
@@ -35,7 +35,7 @@
M << "\blue You swallow some of contents of the [src]."
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
spawn(0)
reagents.trans_to_ingest(M, 10)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
@@ -59,7 +59,7 @@
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
spawn(0)
reagents.trans_to(M, 10)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
@@ -37,7 +37,7 @@
M << "\blue You swallow a gulp of [src]."
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
spawn(0)
reagents.trans_to_ingest(M, gulp_size)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
@@ -65,7 +65,7 @@
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
spawn(0)
reagents.trans_to_ingest(M, gulp_size)
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
@@ -100,7 +100,7 @@
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
spawn(0)
if(reagents.total_volume > bitesize)
/*
* I totally cannot understand what this code supposed to do.
@@ -675,7 +675,7 @@
New()
..()
reagents.add_reagent("nutriment", 12)
reagents.add_reagent("morphine", 3)
reagents.add_reagent("ether", 3)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/stuffing
@@ -3116,7 +3116,7 @@
New()
..()
reagents.add_reagent("nutriment", 12)
reagents.add_reagent("morphine", 3)
reagents.add_reagent("ether", 3)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/stuffing
@@ -150,6 +150,15 @@
..()
reagents.add_reagent("morphine", 30)
/obj/item/weapon/reagent_containers/glass/bottle/ether
name = "Ether Bottle"
desc = "A small bottle. Contains ether."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
New()
..()
reagents.add_reagent("ether", 30)
/obj/item/weapon/reagent_containers/glass/bottle/charcoal
name = "Charcoal Bottle"
desc = "A small bottle. Contains charcoal."
@@ -21,12 +21,18 @@
return
attack(mob/M as mob, mob/user as mob, def_zone)
if(M == user)
M << "\blue You [apply_method] [src]."
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "<span class='warning'>You have a monitor for a head, where do you think you're going to put that?</span>"
return
M << "<span class='notify'>You [apply_method] [src].</span>"
M.unEquip(src) //icon update
if(reagents.total_volume)
reagents.reaction(M, apply_type)
spawn(5)
reagents.trans_to(M, reagents.total_volume)
spawn(0)
reagents.trans_to_ingest(M, reagents.total_volume)
qdel(src)
else
qdel(src)
@@ -34,14 +40,19 @@
else if(istype(M, /mob/living/carbon/human) )
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
user << "<span class='warning'>They have a monitor for a head, where do you think you're going to put that?</span>"
return
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] attempts to force [M] to [apply_method] [src].", 1)
O.show_message("<span class='warning'>[user] attempts to force [M] to [apply_method] [src].</span>", 1)
if(!do_mob(user, M)) return
user.unEquip(src) //icon update
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] forces [M] to [apply_method] [src].", 1)
O.show_message("<span class='warning'>[user] forces [M] to [apply_method] [src].</span>", 1)
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]</font>")
@@ -54,7 +65,7 @@
if(reagents.total_volume)
reagents.reaction(M, apply_type)
spawn(5)
spawn(0)
reagents.trans_to_ingest(M, reagents.total_volume)
qdel(src)
else
@@ -69,7 +80,7 @@
if(target.is_open_container() != 0 && target.reagents)
if(!target.reagents.total_volume)
user << "\red [target] is empty. Cant dissolve [src]."
user << "<span class='warning'>[target] is empty. Cant dissolve [src].</span>"
return
// /vg/: Logging transfers of bad things
@@ -83,10 +94,10 @@
message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
user << "\blue You dissolve [src] in [target]"
user << "<span class='notify'>You dissolve [src] in [target].</span>"
reagents.trans_to(target, reagents.total_volume)
for(var/mob/O in viewers(2, user))
O.show_message("\red [user] puts something in [target].", 1)
O.show_message("<span class='warning'>[user] puts something in [target].</span>", 1)
spawn(5)
qdel(src)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

+3 -2
View File
@@ -207,7 +207,6 @@
#include "code\controllers\configuration.dm"
#include "code\controllers\emergency_shuttle_controller.dm"
#include "code\controllers\failsafe.dm"
#include "code\controllers\garbage.dm"
#include "code\controllers\hooks-defs.dm"
#include "code\controllers\hooks.dm"
#include "code\controllers\master_controller.dm"
@@ -252,7 +251,6 @@
#include "code\datums\modules.dm"
#include "code\datums\organs.dm"
#include "code\datums\periodic_news.dm"
#include "code\datums\pizza_bomb.dm"
#include "code\datums\recipe.dm"
#include "code\datums\spell.dm"
#include "code\datums\sun.dm"
@@ -707,6 +705,7 @@
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_freezer.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\pizza_bomb.dm"
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\sensor_device.dm"
@@ -1220,6 +1219,8 @@
#include "code\modules\food\recipes_grill.dm"
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\food\recipes_oven.dm"
#include "code\modules\garbage collection\garbage_collector.dm"
#include "code\modules\garbage collection\gc_testing.dm"
#include "code\modules\genetics\side_effects.dm"
#include "code\modules\holiday\christmas.dm"
#include "code\modules\holiday\holiday.dm"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

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