From c3e161117823e6031d9c5959639dc5e9341aa338 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 16 Oct 2015 14:38:20 +0200 Subject: [PATCH 001/148] Fixes #11149 - Corrects APC behavior when hacked by malfunctioning AI. - It should now be possible to hack the APC to unlock it even when it is hacked by the AI. Normal IDs still don't work on hacked APCs. - A little side-fix, removal of malfunctioning AI's hack of an APC should now work correctly. --- code/modules/power/apc.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6a3fd1da71..ba2bf2a7e7 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -627,6 +627,7 @@ // Malf AI, removes the APC from AI's hacked APCs list. if(hacker && hacker.hacked_apcs && src in hacker.hacked_apcs) hacker.hacked_apcs -= src + hacker = null if (opened==2) opened = 1 update_icon() @@ -862,7 +863,7 @@ user << "\The [src] have AI control disabled!" return 0 else - if ((!in_range(src, user) || !istype(src.loc, /turf) || hacker)) // AI-hacked APCs cannot be controlled by other AIs, unlinked cyborgs or humans. + if (!in_range(src, user) || !istype(src.loc, /turf)) return 0 var/mob/living/carbon/human/H = user if (istype(H)) From cbcddcad53b9bb62acdc74a3a2edb3d006b65de7 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 16 Oct 2015 14:44:01 +0200 Subject: [PATCH 002/148] Adjustment according to PsiOmegaDelta's suggestion --- code/modules/power/apc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ba2bf2a7e7..a1811e496c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -625,7 +625,7 @@ qdel(W) stat &= ~BROKEN // Malf AI, removes the APC from AI's hacked APCs list. - if(hacker && hacker.hacked_apcs && src in hacker.hacked_apcs) + if(hacker && hacker.hacked_apcs && (src in hacker.hacked_apcs)) hacker.hacked_apcs -= src hacker = null if (opened==2) From 7641ff5100382c6e3a565981595a68f3474e59ec Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 16 Oct 2015 11:03:04 +0200 Subject: [PATCH 003/148] Secures the AI and Cyborg upload console circuits in the ERT staging area. --- maps/exodus-2.dmm | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 0ad7c5cb12..a1729c1e02 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -1086,7 +1086,7 @@ "uT" = (/obj/machinery/door/window/northleft,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uU" = (/obj/effect/landmark{name = "Marauder Exit"},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "uV" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"uW" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"uW" = (/obj/machinery/door/blast/regular{id = "ert_synth_equipment"; name = "Synthetics Modification Equipment"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "uX" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/centcom/specops) "uY" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 4},/area/centcom/specops) "uZ" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT3"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) @@ -1128,7 +1128,7 @@ "vJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "vK" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vL" = (/obj/structure/sign/poster{poster_type = "/datum/poster/bay_50"; pixel_x = -32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"vM" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/button/remote/blast_door{id = "CREED"; name = "Spec Ops Ready Room"; pixel_y = 4; req_access = list(108)},/obj/machinery/button/remote/blast_door{icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_y = -4; req_access = list(108)},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) +"vM" = (/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "vO" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "vP" = (/obj/mecha/combat/gygax/dark,/obj/machinery/camera/network/ert{c_tag = "Assault Armor North"},/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) @@ -1166,7 +1166,7 @@ "wv" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "ww" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "wx" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) -"wy" = (/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wy" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "wz" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) "wA" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/control) "wB" = (/obj/machinery/door/airlock/centcom{name = "Teleporter Bay"; opacity = 1; req_access = list(107)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) @@ -1940,9 +1940,13 @@ "Lp" = (/obj/item/pizzabox/meat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Lq" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Lr" = (/obj/structure/bed,/obj/item/weapon/bedsheet/clown,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) +"Ls" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/aiupload{pixel_x = -3; pixel_y = -3},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"Lt" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/button/remote/blast_door{id = "CREED"; name = "Spec Ops Ready Room"; pixel_x = -5; pixel_y = 4; req_access = list(108)},/obj/machinery/button/remote/blast_door{icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_x = -5; pixel_y = -4; req_access = list(108)},/obj/machinery/button/remote/blast_door{id = "ert_synth_equipment"; name = "Synth Modification Equipment"; pixel_x = 5; pixel_y = -4; req_access = list(108)},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "Lu" = (/turf/unsimulated/floor{tag = "icon-ironsand7"; icon_state = "ironsand7"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) "Lv" = (/turf/unsimulated/floor{tag = "icon-ironsand12"; icon_state = "ironsand12"},/turf/unsimulated/floor{tag = "icon-asteroid2"; name = "plating"; icon_state = "asteroid2"},/area/wizard_station) +"Lw" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/circuitboard/smes,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "Lx" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"Ly" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) "Lz" = (/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_theatre) "LA" = (/turf/simulated/floor/holofloor/grass,/turf/simulated/floor/holofloor{icon_state = "wood_siding1"; dir = 2},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding5"; dir = 2},/area/holodeck/source_picnicarea) "LB" = (/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_theatre) @@ -2186,16 +2190,16 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVoVqRpepepepepepepepepepeqHoVoVoVoVpFpFtctdpFpFpFtctetdpFqvqvqvpFtftgtgtgtgtgthpFpZqztitjqYqYqYtktlqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpFtptptptptptptptptppFpFumpFpFtptptptptptptppFpZqztrtstttttttstuqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvyhyhyhyhyhyhyhtptptptxtxtxtxtxtxpFtytztypFtxtxtxtxtxtxtxtxpZqzqztAtBtBtBtCqzqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuntvupuxuuuzuyuAtvveuhvfvfvkvgvpvpvyvyyhzdyIyIyIyIvzvAvHvAvJtOtPtQtRtSpFtytztypFtTtUtVtWtWtxaMaMpZqzqzqzqzqzqzqzqzqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvvKuhuhuhuhuhuhuhuhuhyhyByIvMyIyIvEurururvOueufufufufpFtytztypFtWtWtWtWtWtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvPvbuvuwvQuhuhuhuhuhuhuhvRtvvSuhuhuhuhuhuhuhuhuhyhyHvTzqyIyIvzvAvHvAvJueufufufufpFvUumwhpFtWtWtWtWtWtxuguguguguguguowjuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbvctvwluhuhuhuhuhuhuhtvwmuhuhuhuhvpwownwpwpyhzrzpzEyIyIyhwqwqwqtvuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvuhuhuhuhwytvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvwzwAvlvmvntxufJyuftxvlvmvowAwBtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvbwEtvvxwPukxowVwXuhuhtvuhuhuhuhwYtvxawZwZxaxcxbxexdxQxQxQxQxQxgtvufufvBvCvCvCvCvCvCvCvCvCvDufufxhvqvqvqvqvqugvFuNuotxurururtxvGvGxkvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbvbxltvwFwGwGwGwItvuhuhtvuhuhuhuhxmtvuhxQxQxQxnxQxQxQxQxQxQxQxQxptvufJyvVvWvXvXvXvXvXvXvXvYueJyufugvZwawbwcwdugweuNwjtxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuntvupuxuuuzuyuAtvvMuWuhwyvkvgvfvfvyvyyhzdyIyIyIyIvzvAvHvAvJtOtPtQtRtSpFtytztypFtTtUtVtWtWtxaMaMpZqzqzqzqzqzqzqzqzqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvLsuWuhuhuhuhuhuhuhuhyhyByILtyIyIvEurururvOueufufufufpFtytztypFtWtWtWtWtWtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvPvbuvuwvQuhuhuhuhuhuhuhvRtvtvtvuhuhuhuhuhuhuhuhyhyHvTzqyIyIvzvAvHvAvJueufufufufpFvUumwhpFtWtWtWtWtWtxuguguguguguguowjuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbvctvwluhuhuhuhuhuhuhtvveuhuhuhvpvpwownwpwpyhzrzpzEyIyIyhwqwqwqtvuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvvKuhuhuhLwtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvwzwAvlvmvntxufJyuftxvlvmvowAwBtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvbwEtvvxwPukxowVwXuhuhtvvSuhuhuhwYtvxawZwZxaxcxbxexdxQxQxQxQxQxgtvufufvBvCvCvCvCvCvCvCvCvCvDufufxhvqvqvqvqvqugvFuNuotxurururtxvGvGxkvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbvbxltvwFwGwGwGwItvuhuhtvwmuhuhuhxmtvuhxQxQxQxnxQxQxQxQxQxQxQxQxptvufJyvVvWvXvXvXvXvXvXvXvYueJyufugvZwawbwcwdugweuNwjtxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutwxvbvbxqxcxrxtxsxvxuxcuhuhxcuhuhuhuhxwxcuhxQxQuwxxxQxQxQxexetvtvtvtvtvufufvVwrwsufwtwuwvufwswrueufufugugugugugugugweuNwjtxurururtxwwwwuNwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVxyuXuVuVuVuYxyxzvavbvbxAxnxHuhuhuhxIxnuhuhxnuhuhxKxJxLxnxMxQxQxQtvwFwGwHwGwItvwJwJwJxNufufwKwLwMwNwOxOwQwRwSwLwTufufxRwUwUwUwUwUtxtxuOtxtxtxuOtxtxuNuNuNuNuNvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutxXvbvbxYtvyauhuhuhuhtvybybtvycyctvtvtvtvxMxQxQuwuWxfxfxfxfxfydxfxfxfydufufufyeufufxiufxiufufyeufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutxXvbvbxYtvyauhuhuhuhtvybybtvycyctvtvtvtvxMxQxQuwyWxfxfxfxfxfydxfxfxfLyufufufyeufufxiufxiufufyeufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVyfuXuVuVuVuYyfygyivbvbuwyjuhuhuhuhuhyjuhuhykuhuhymylyzyzuhxQxQvdtvwFwGwHwGwItvxBxBxByAufufvBxCxDwNxEufxFwRxGxCvDufufxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbvbuwyjuhuhuhuhuhyjuhuhyCuhuhxQyDyDyDxQxQxQzcyKyGyMxQySyQtvtvtvtvtvufufvVwLxSufxiufxikayqwLueufufwAxTxUxUxUxVtxtxxWtxtxtxuOtxtxtxyXyXyXtxtxurururyYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvvbvbyZtvwFwGwGwGwItvzezetvzfuhxQzgzizhxQxQxQyRzkyMxQxQxQxQxxxQxKzltvufufvVtxtxynyoufypxStxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywzmtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM From e5ca86c1688cc3632f3ef7ed4286c599f5b7167c Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Sun, 25 Oct 2015 17:40:34 -0700 Subject: [PATCH 004/148] fixes random name EAL naming thing... again. --- code/modules/mob/language/station.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 3d45e84f99..a0b686a314 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -107,11 +107,12 @@ space_chance = 10 /datum/language/machine/get_random_name() + var/new_name if(prob(70)) - name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" + new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" else - name = pick(ai_names) - return name + new_name = pick(ai_names) + return new_name //Syllable Lists /* From 00e0014a3f34f4af6c61595ddca04e9e238f7618 Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Sun, 25 Oct 2015 17:52:49 -0700 Subject: [PATCH 005/148] fixes #9962 --- code/modules/client/preferences.dm | 6 +++++- code/modules/client/preferences_savefile.dm | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 9627cd65b3..1cbdc09594 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1183,7 +1183,11 @@ datum/preferences if("name") var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) - var/new_name = sanitizeName(raw_name) + var/new_name + if(species == "Machine") + new_name = sanitizeName(raw_name,,1) + else + new_name = sanitizeName(raw_name) if(new_name) real_name = new_name else diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a67efd084c..f1b7eb5e0d 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -188,7 +188,11 @@ //Sanitize metadata = sanitize_text(metadata, initial(metadata)) - real_name = sanitizeName(real_name) + + if(species == "Machine") + real_name = sanitizeName(real_name,,1) + else + real_name = sanitizeName(real_name) if(isnull(species) || !(species in playable_species)) species = "Human" From c5fd67720686852a226aa5e51f272e9cd4568dc1 Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Sun, 25 Oct 2015 18:10:14 -0700 Subject: [PATCH 006/148] Fixes #11350 --- code/game/machinery/rechargestation.dm | 47 ++++++++++++++++++-------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index ac5ae8d8c7..01d3d72dac 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -103,6 +103,11 @@ R.adjustBruteLoss(-weld_rate) if(wire_rate && R.getFireLoss() && cell.checked_use(wire_power_use * wire_rate * CELLRATE)) R.adjustFireLoss(-wire_rate) + else if(istype(occupant, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = occupant + if(!isnull(H.internal_organs_by_name["cell"] && H.nutrition < 450)) + H.nutrition = min(H.nutrition+10, 450) + /obj/machinery/recharge_station/examine(mob/user) ..(user) @@ -200,22 +205,36 @@ go_in(R) /obj/machinery/recharge_station/proc/go_in(var/mob/living/silicon/robot/R) - if(!istype(R)) - return - if(occupant) - return - if(R.incapacitated()) - return - if(!R.cell) - return + if(istype(R, /mob/living/silicon/robot)) + if(!istype(R)) + return + if(occupant) + return - add_fingerprint(R) - R.reset_view(src) - R.forceMove(src) - occupant = R - update_icon() - return 1 + if(R.incapacitated()) + return + if(!R.cell) + return + + add_fingerprint(R) + R.reset_view(src) + R.forceMove(src) + occupant = R + update_icon() + return 1 + + else if(istype(R, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = R + if(!isnull(H.internal_organs_by_name["cell"])) + add_fingerprint(H) + H.reset_view(src) + H.forceMove(src) + occupant = H + update_icon() + return 1 + else + return /obj/machinery/recharge_station/proc/go_out() if(!occupant) From 4694a263a7b097b7041b053ce47a82e180019f51 Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Sun, 25 Oct 2015 21:51:31 -0700 Subject: [PATCH 007/148] Fixes: #11351 #11357 #11359 #11361 --- code/__defines/damage_organs.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 6c2590f840..4e3270b332 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -29,7 +29,7 @@ #define FIRE_DAMAGE_MODIFIER 0.0215 // Higher values result in more external fire damage to the skin. (default 0.0215) #define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025) -// Organ defines. +/*// Organ defines. #define ORGAN_CUT_AWAY 1<<0 #define ORGAN_BLEEDING 1<<1 #define ORGAN_BROKEN 1<<2 @@ -38,7 +38,18 @@ #define ORGAN_SPLINTED 1<<5 #define ORGAN_DEAD 1<<6 #define ORGAN_MUTATED 1<<7 -#define ORGAN_ASSISTED 1<<8 +#define ORGAN_ASSISTED 1<<8*/ + +// Organ defines. +#define ORGAN_CUT_AWAY 1 +#define ORGAN_BLEEDING 2 +#define ORGAN_BROKEN 4 +#define ORGAN_DESTROYED 8 +#define ORGAN_ROBOT 16 +#define ORGAN_SPLINTED 32 +#define ORGAN_DEAD 64 +#define ORGAN_MUTATED 128 +#define ORGAN_ASSISTED 256 #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 From d94ece66f150a939e6563746a7f3d662e8885045 Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Sun, 25 Oct 2015 21:52:11 -0700 Subject: [PATCH 008/148] Fixes: #11354 --- .../mob/living/carbon/human/species/station/station.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index b63dd51963..403f086159 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -260,13 +260,13 @@ knockout_message = "encounters a hardware fault and suddenly reboots!" warning_low_pressure = 50 - hazard_low_pressure = 0 + hazard_low_pressure = -1 cold_level_1 = 50 cold_level_2 = -1 cold_level_3 = -1 - heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage + heat_level_1 = 398.15 // Start taking damage above ~125 Degrees C heat_level_2 = 1000 heat_level_3 = 2000 @@ -301,6 +301,12 @@ "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) ) + + heat_discomfort_level = 373.15 + heat_discomfort_strings = list( + "Your CPU temperature probes warn you that you are approaching critical heat levels!" + ) + /datum/species/machine/handle_death(var/mob/living/carbon/human/H) ..() H.h_style = "" From 28db4587f20a7baec26fc7723a6a2777a03007d9 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 26 Oct 2015 14:50:52 -0400 Subject: [PATCH 009/148] Fixes #11354 --- code/modules/mob/living/carbon/human/life.dm | 2 ++ code/modules/mob/living/carbon/human/species/station/station.dm | 1 + 2 files changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 74844fd3b1..b5db5a83d9 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -687,6 +687,8 @@ /mob/living/carbon/human/proc/stabilize_body_temperature() if (species.passive_temp_gain) // We produce heat naturally. bodytemperature += species.passive_temp_gain + if (species.body_temperature == null) + return //this species doesn't have metabolic thermoregulation var/body_temperature_difference = species.body_temperature - bodytemperature diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index b63dd51963..47783470a4 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -270,6 +270,7 @@ heat_level_2 = 1000 heat_level_3 = 2000 + body_temperature = null passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment. flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON From 5c587e69b68195956cf6711e37dddd3de259733c Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 7 Nov 2015 17:12:50 +0100 Subject: [PATCH 010/148] Exploit fix. Players can no longer immediately respawn as mice by ghosting. --- code/modules/mob/dead/observer/observer.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index f2152a2454..63f60c6f23 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -151,6 +151,8 @@ Works together with spawning an observer, noted above. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = src.stat == DEAD ? src.timeofdeath : world.time ghost.key = key + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost From c54db5b25a55609c99dd575e61af97e539fb1239 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Sat, 7 Nov 2015 17:20:34 +0100 Subject: [PATCH 011/148] Corrects mismatched areas - Fixes #11421 --- maps/exodus-1.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 2801b367f1..10871db39c 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -966,7 +966,7 @@ "asD" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/fore) "asE" = (/obj/item/device/radio/intercom{pixel_x = 30},/obj/machinery/door_timer/cell_1{pixel_x = 32; pixel_y = -32},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/brig) "asF" = (/obj/effect/decal/cleanable/dirt,/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/security/prison) -"asG" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) +"asG" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) "asH" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/security/prison) "asI" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/prison) "asJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) @@ -4702,7 +4702,7 @@ "bMv" = (/obj/structure/bed/chair,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bMw" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bMx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/command{name = "Research Director"; req_access = list(30)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research) -"bMy" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop) +"bMy" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bMz" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bMA" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bMB" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/CMO,/obj/item/clothing/mask/gas,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo) @@ -4749,7 +4749,7 @@ "bNq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server) "bNr" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor,/area/quartermaster/qm) "bNs" = (/obj/structure/table/standard,/obj/item/weapon/cartridge/signal/science,/obj/item/weapon/cartridge/signal/science{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/science{pixel_x = 4; pixel_y = 6},/obj/item/clothing/glasses/welding/superior,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/camera/network/research{c_tag = "Research - RD's Office"; dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bNt" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop) +"bNt" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bNu" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/cargo) "bNv" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/maintenance/cargo) "bNw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/cargo) From 531809efa25312ce156c0608e928b81950836e23 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Tue, 10 Nov 2015 14:15:37 +0300 Subject: [PATCH 012/148] Fixes #11347 Jesus Christ how horrifying --- code/modules/research/rdconsole.dm | 71 +++++++++--------------------- 1 file changed, 20 insertions(+), 51 deletions(-) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 1cf31e63ed..a9ff3ce4a4 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -359,59 +359,28 @@ won't update every console in existence) but it's more of a hassle to do. Also, linked_lathe.removeFromQueue(text2num(href_list["removeP"])) else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets = text2num(href_list["amount"]) - var/res_amount, type - var/material/M = get_material_by_name(href_list["lathe_ejectsheet"]) - if(istype(M)) - type = M.stack_type - switch(M.name) - if(DEFAULT_WALL_MATERIAL) - res_amount = "m_amount" - if("glass") - res_amount = "g_amount" - if("gold") - res_amount = "gold_amount" - if("silver") - res_amount = "silver_amount" - if("phoron") - res_amount = "phoron_amount" - if("uranium") - res_amount = "uranium_amount" - if("diamond") - res_amount = "diamond_amount" + var/num_sheets = min(text2num(href_list["amount"]), round(linked_lathe.materials[href_list["lathe_ejectsheet"]] / SHEET_MATERIAL_AMOUNT)) + + if(num_sheets < 1) + return + + var/mattype = linked_lathe.getMaterialType(href_list["lathe_ejectsheet"]) + + var/obj/item/stack/material/M = new mattype(linked_lathe.loc) + M.amount = num_sheets + linked_lathe.materials[href_list["lathe_ejectsheet"]] -= num_sheets * SHEET_MATERIAL_AMOUNT - if(ispath(type) && hasvar(linked_lathe, res_amount)) - var/obj/item/stack/material/sheet = new type(linked_lathe.loc) - var/available_num_sheets = round(linked_lathe.vars[res_amount]/sheet.perunit) - if(available_num_sheets > 0) - sheet.amount = min(available_num_sheets, desired_num_sheets) - linked_lathe.vars[res_amount] = max(0, (linked_lathe.vars[res_amount] - sheet.amount * sheet.perunit)) - else - qdel(sheet) else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets = text2num(href_list["amount"]) - var/res_amount, type - switch(href_list["imprinter_ejectsheet"]) - if("glass") - type = /obj/item/stack/material/glass - res_amount = "g_amount" - if("gold") - type = /obj/item/stack/material/gold - res_amount = "gold_amount" - if("diamond") - type = /obj/item/stack/material/diamond - res_amount = "diamond_amount" - if("uranium") - type = /obj/item/stack/material/uranium - res_amount = "uranium_amount" - if(ispath(type) && hasvar(linked_imprinter, res_amount)) - var/obj/item/stack/material/sheet = new type(linked_imprinter.loc) - var/available_num_sheets = round(linked_imprinter.vars[res_amount]/sheet.perunit) - if(available_num_sheets>0) - sheet.amount = min(available_num_sheets, desired_num_sheets) - linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount] - sheet.amount * sheet.perunit)) - else - qdel(sheet) + var/num_sheets = min(text2num(href_list["amount"]), round(linked_imprinter.materials[href_list["imprinter_ejectsheet"]] / SHEET_MATERIAL_AMOUNT)) + + if(num_sheets < 1) + return + + var/mattype = linked_imprinter.getMaterialType(href_list["imprinter_ejectsheet"]) + + var/obj/item/stack/material/M = new mattype(linked_imprinter.loc) + M.amount = num_sheets + linked_imprinter.materials[href_list["imprinter_ejectsheet"]] -= num_sheets * SHEET_MATERIAL_AMOUNT else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. screen = 0.0 From 52deec9fde613d0ce5a976e47766b381d0dbdba1 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 10 Nov 2015 23:16:53 -0500 Subject: [PATCH 013/148] Adds thermal radiation into space for human mobs Main effect is that IPCs won't gain temperature infinitely anymore. --- code/__defines/atmos.dm | 1 + code/__defines/math_physics.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 13 ++++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm index 8212e4c911..5f852954dd 100644 --- a/code/__defines/atmos.dm +++ b/code/__defines/atmos.dm @@ -17,6 +17,7 @@ #define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME / (T20C * R_IDEAL_GAS_EQUATION)) // Amount of air to take a from a tile #define BREATH_PERCENTAGE (BREATH_VOLUME / CELL_VOLUME) // Amount of air needed before pass out/suffocation commences. #define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD * BREATH_PERCENTAGE * 0.16) +#define HUMAN_HEAT_CAPACITY 280000 //J/K For 80kg person #define SOUND_MINIMUM_PRESSURE 10 diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm index 7c7c6d0d85..987cb1ba9d 100644 --- a/code/__defines/math_physics.dm +++ b/code/__defines/math_physics.dm @@ -13,6 +13,7 @@ #define GAS_CRITICAL_TEMPERATURE 132.65 // K. The critical point temperature for air. #define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio. +#define HUMAN_EXPOSED_SURFACE_AREA 5.2 //m^2, surface area of 1.7m (H) x 0.46m (D) cylinder #define T0C 273.15 // 0.0 degrees celcius #define T20C 293.15 // 20.0 degrees celcius diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index b5db5a83d9..a5f3fae6a6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -580,7 +580,14 @@ pl_effects() break - if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature. + if(istype(get_turf(src), /turf/space)) + //Don't bother if the temperature drop is less than 0.1 anyways. Hopefully BYOND is smart enough to turn this constant expression into a constant + if(bodytemperature > (0.1 * HUMAN_HEAT_CAPACITY/(HUMAN_EXPOSED_SURFACE_AREA*STEFAN_BOLTZMANN_CONSTANT))**(1/4) + COSMIC_RADIATION_TEMPERATURE) + //Thermal radiation into space + var/heat_loss = HUMAN_EXPOSED_SURFACE_AREA * STEFAN_BOLTZMANN_CONSTANT * ((bodytemperature - COSMIC_RADIATION_TEMPERATURE)**4) + var/temperature_loss = heat_loss/HUMAN_HEAT_CAPACITY + bodytemperature -= temperature_loss + else var/loc_temp = T0C if(istype(loc, /obj/mecha)) var/obj/mecha/M = loc @@ -594,7 +601,7 @@ pressure_alert = 0 return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp - //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection + //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection (convection) var/temp_adj = 0 if(loc_temp < bodytemperature) //Place is colder than we are var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. @@ -695,7 +702,7 @@ if (abs(body_temperature_difference) < 0.5) return //fuck this precision if (on_fire) - return //too busy for pesky convection + return //too busy for pesky metabolic regulation if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects. if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. From 7e472af23832e3e6fad33990ddb74b4f8ccda5da Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 10 Nov 2015 23:36:58 -0500 Subject: [PATCH 014/148] Fixes temperature HUD being incorrect for species with null body_temperature. --- code/modules/mob/living/carbon/human/life.dm | 25 ++++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a5f3fae6a6..97d9b786a0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1322,31 +1322,36 @@ if(260 to 280) bodytemp.icon_state = "temp-3" else bodytemp.icon_state = "temp-4" else + //TODO: precalculate all of this stuff when the species datum is created + var/base_temperature = species.body_temperature + if(base_temperature == null) //some species don't have a set metabolic temperature + base_temperature = (species.heat_level_1 + species.cold_level_1)/2 + var/temp_step - if (bodytemperature >= species.body_temperature) - temp_step = (species.heat_level_1 - species.body_temperature)/4 + if (bodytemperature >= base_temperature) + temp_step = (species.heat_level_1 - base_temperature)/4 if (bodytemperature >= species.heat_level_1) bodytemp.icon_state = "temp4" - else if (bodytemperature >= species.body_temperature + temp_step*3) + else if (bodytemperature >= base_temperature + temp_step*3) bodytemp.icon_state = "temp3" - else if (bodytemperature >= species.body_temperature + temp_step*2) + else if (bodytemperature >= base_temperature + temp_step*2) bodytemp.icon_state = "temp2" - else if (bodytemperature >= species.body_temperature + temp_step*1) + else if (bodytemperature >= base_temperature + temp_step*1) bodytemp.icon_state = "temp1" else bodytemp.icon_state = "temp0" - else if (bodytemperature < species.body_temperature) - temp_step = (species.body_temperature - species.cold_level_1)/4 + else if (bodytemperature < base_temperature) + temp_step = (base_temperature - species.cold_level_1)/4 if (bodytemperature <= species.cold_level_1) bodytemp.icon_state = "temp-4" - else if (bodytemperature <= species.body_temperature - temp_step*3) + else if (bodytemperature <= base_temperature - temp_step*3) bodytemp.icon_state = "temp-3" - else if (bodytemperature <= species.body_temperature - temp_step*2) + else if (bodytemperature <= base_temperature - temp_step*2) bodytemp.icon_state = "temp-2" - else if (bodytemperature <= species.body_temperature - temp_step*1) + else if (bodytemperature <= base_temperature - temp_step*1) bodytemp.icon_state = "temp-1" else bodytemp.icon_state = "temp0" From 858451365284c66d77a7972cd328b9a88fa71044 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 14 Nov 2015 00:43:11 +0100 Subject: [PATCH 015/148] Fixes the mining rig camera not properly showing up on the station camera list. Was using "Mine" instead of "MINE. Corrected by replacing all networks with the defined presets. --- code/modules/clothing/spacesuits/rig/suits/ert.dm | 2 +- code/modules/clothing/spacesuits/rig/suits/light.dm | 2 +- .../modules/clothing/spacesuits/rig/suits/station.dm | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index c46b019a4d..88c33cee26 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -1,6 +1,6 @@ /obj/item/clothing/head/helmet/space/rig/ert light_overlay = "helmet_light_dual" - camera_networks = list("ERT") + camera_networks = list(NETWORK_ERT) /obj/item/weapon/rig/ert name = "ERT-C hardsuit control module" diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 270e7a3761..3eeb798875 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -40,7 +40,7 @@ airtight = 0 seal_delay = 5 //not being vaccum-proof has an upside I guess - + helm_type = /obj/item/clothing/head/lightrig/hacker chest_type = /obj/item/clothing/suit/lightrig/hacker glove_type = /obj/item/clothing/gloves/lightrig/hacker diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 50a18c9ace..e3ac8906d3 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -1,23 +1,23 @@ /obj/item/clothing/head/helmet/space/rig/industrial - camera_networks = list("Mine") + camera_networks = list(NETWORK_MINE) /obj/item/clothing/head/helmet/space/rig/ce - camera_networks = list("Engineering") + camera_networks = list(NETWORK_ENGINEERING) /obj/item/clothing/head/helmet/space/rig/eva light_overlay = "helmet_light_dual" - camera_networks = list("Engineering") + camera_networks = list(NETWORK_ENGINEERING) /obj/item/clothing/head/helmet/space/rig/hazmat light_overlay = "hardhat_light" - camera_networks = list("Research") + camera_networks = list(NETWORK_RESEARCH) /obj/item/clothing/head/helmet/space/rig/medical - camera_networks = list("Medbay") + camera_networks = list(NETWORK_MEDICAL) /obj/item/clothing/head/helmet/space/rig/hazard light_overlay = "helmet_light_dual" - camera_networks = list("Security") + camera_networks = list(NETWORK_SECURITY) /obj/item/weapon/rig/industrial name = "industrial suit control module" From dc8b6035b5f1e2c1e473ff25270183d358926e50 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Tue, 17 Nov 2015 18:44:24 +0100 Subject: [PATCH 016/148] Maps in few extra lights - Maps in few lights to areas which are dark but probably shouldn't be (hallways, atmospherics) --- maps/exodus-1.dmm | 64 ++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 10871db39c..eb9ee49eca 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -629,7 +629,7 @@ "ame" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/lobby) "amf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/lobby) "amg" = (/turf/simulated/floor,/area/security/lobby) -"amh" = (/obj/item/device/radio/intercom{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby) +"amh" = (/obj/item/device/radio/intercom{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby) "ami" = (/turf/simulated/wall,/area/lawoffice) "amj" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "amk" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) @@ -1189,7 +1189,7 @@ "awS" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/evahallway) "awT" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) "awU" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) -"awV" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) +"awV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "awW" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "awX" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/crew_quarters/fitness) "awY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) @@ -1495,7 +1495,7 @@ "aCM" = (/turf/simulated/wall/r_wall,/area/storage/primary) "aCN" = (/obj/structure/closet/secure_closet/freezer/money,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aCO" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 6},/area/security/nuke_storage) -"aCP" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "vault"},/area/security/nuke_storage) +"aCP" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "vault"},/area/security/nuke_storage) "aCQ" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 10},/area/security/nuke_storage) "aCR" = (/obj/machinery/computer/secure_data/detective_computer,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aCS" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/gateway) @@ -1953,7 +1953,7 @@ "aLC" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/arrival/station) "aLD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aLE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aLF" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry/starboard) +"aLF" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/light,/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry/starboard) "aLG" = (/turf/simulated/floor{icon_state = "neutral"},/area/hallway/secondary/entry/starboard) "aLH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "neutral"},/area/hallway/secondary/entry/starboard) "aLI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/secondary/entry/starboard) @@ -2210,7 +2210,7 @@ "aQz" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) "aQA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aQB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aQC" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"aQC" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aQD" = (/obj/machinery/vending/snack,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/port) "aQE" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Hydroponics Pasture West"; dir = 4},/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics) "aQF" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/port) @@ -2320,7 +2320,7 @@ "aSF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 8; id = "office_shutter"; layer = 3.1; name = "Office Shutters"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "aSG" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "kitchen"; layer = 3.3; name = "Kitchen Shutters"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hallway/primary/starboard) "aSH" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) -"aSI" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southwest"},/turf/simulated/floor,/area/hallway/secondary/entry/port) +"aSI" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/port) "aSJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aSK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aSL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) @@ -2372,7 +2372,7 @@ "aTF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/hallway/secondary/entry/port) "aTG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aTH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aTI" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry/starboard) +"aTI" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southwest"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry/port) "aTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) "aTK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) "aTL" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) @@ -2387,9 +2387,9 @@ "aTU" = (/turf/simulated/floor,/area/crew_quarters/locker) "aTV" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/crew_quarters/locker) "aTW" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor,/area/crew_quarters/locker) -"aTX" = (/obj/machinery/vending/cola,/turf/simulated/floor,/area/crew_quarters/locker) +"aTX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry/starboard) "aTY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker) -"aTZ" = (/obj/machinery/vending/coffee,/turf/simulated/floor,/area/crew_quarters/locker) +"aTZ" = (/obj/machinery/vending/cola,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) "aUa" = (/obj/machinery/vending/snack,/turf/simulated/floor,/area/crew_quarters/locker) "aUb" = (/obj/machinery/vending/cigarette,/turf/simulated/floor,/area/crew_quarters/locker) "aUc" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/crew_quarters/locker) @@ -2857,7 +2857,7 @@ "bcW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics/garden) "bcX" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hydroponics/garden) "bcY" = (/obj/structure/flora/ausbushes,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) -"bcZ" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "centcom_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "centcom_shuttle_dock_pump"; tag_chamber_sensor = "centcom_shuttle_dock_sensor"; tag_exterior_door = "centcom_shuttle_dock_outer"; tag_interior_door = "centcom_shuttle_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "centcom_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "centcom_shuttle_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"bcZ" = (/obj/machinery/vending/coffee,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) "bda" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/starboard) "bdb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) "bdc" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Library"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/hallway/primary/starboard) @@ -3007,7 +3007,7 @@ "bfQ" = (/obj/structure/sign/double/barsign,/turf/simulated/wall,/area/hallway/primary/starboard) "bfR" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/hallway/primary/starboard) "bfS" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bfT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) +"bfT" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "centcom_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "centcom_shuttle_dock_pump"; tag_chamber_sensor = "centcom_shuttle_dock_sensor"; tag_exterior_door = "centcom_shuttle_dock_outer"; tag_interior_door = "centcom_shuttle_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "centcom_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "centcom_shuttle_dock_pump"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bfU" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bfV" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bfW" = (/obj/item/weapon/folder/yellow,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) @@ -3226,7 +3226,7 @@ "bkb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) "bkc" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) "bkd" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) -"bke" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) +"bke" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bkf" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) "bkg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/starboard) "bkh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/starboard) @@ -3291,7 +3291,7 @@ "blo" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_x = 0; pixel_y = -25; req_one_access = list(13)},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/hallway/secondary/exit) "blp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "blq" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_one) -"blr" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "specops_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"blr" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) "bls" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) "blt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "blu" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) @@ -6695,7 +6695,7 @@ "cyM" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) "cyN" = (/obj/machinery/atmospherics/trinary/mixer,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cyO" = (/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cyP" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/turf/simulated/floor,/area/engineering/atmos) +"cyP" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/starboard) "cyQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "cyR" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor,/area/engineering/atmos) "cyS" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor,/area/engineering/atmos) @@ -6857,6 +6857,7 @@ "cBS" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mixing to Port"},/turf/simulated/floor,/area/engineering/atmos) "cBT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering) "cBU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/engineering) +"cBV" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "specops_dock_pump"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "cBW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cBX" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cBY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) @@ -7391,6 +7392,11 @@ "cMh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/engi_engine) "cMi" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cMj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engi_engine) +"cMk" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) +"cMl" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"cMm" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engineering/locker_room) +"cMn" = (/turf/simulated/wall,/area/engineering/atmos) +"cMo" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7498,7 +7504,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoazUayoayrayoaAbaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBkayyaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDaBRayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaArayLayMayLayLayLarAaAtayPayQarEaAiasZcfSaycaxUatCayUayTayWaAvayYayXayYaAHayTazaazbazcazdazeazdazdazfaxraAWaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaBaaBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaBcauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEaCiaCeazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTaBwazVazWazXazYazZaAaaBEazTaAcarAaAdayPayQarEaAiasZaBOaAeawgatCaxWaxXaxXaxXaxXazBaBQaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwaCpaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGaDAaCIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaCtaAXazTaAcarAaAdayPaDdarEaAiasZaxGaAgaAhaBbayRaBdaBeazhaBgaBhaBiaBjaBjaCDaBjatPaBlaBmaBnaBoaBpaBraxvaziaCJaCHatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvazlaECaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaCLaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDcaBPaAFazmaESaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDnaCfaCgaChaCfaDoaCjazTaCkarAaAdayPaClarEaJCasZaDtaAYaDxatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDyatPatPaAfaAkaDQatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawGaBBaBCaBDaCLaBFaBBawGaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDcaBPaAFazmaESaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDnaCfaCgaChaCfaDoaCjazTaCkarAaAdayPaClarEaJCasZaDtaAYaDxatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDyatPatPaAfaAkaDQatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEcaFzaAsaAFaCKaEdaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaEeayLayLayLarAaAdayPayQarEaAiasZaEgaEfawgatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaEhaEvaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEzatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbhYaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaEMaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFbjraDZaCMaEaaEbaEVaFnaFhaFyaFqaFEaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFGaEwaCfaExaEyaATaFIaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFSaEKaENaEOaBjaEPaEQaERaFZaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtbnKaGfaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGkaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkaGqaFlaFmaGraFoaFpaGxaFlaGHaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGPavHaFuaGVaFxaHcbnLaDfaHdaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaHIaElaFQaEnaFRaBYaaaazJazOazPaHJaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYaHYazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaIcaDzaIhaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaIkaDpaInaIlaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDsaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIzaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7508,20 +7514,20 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaT aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkaGqaFlaFlaNGaFlaFlaNPaFlaGHaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuaNXaKuaKuaLZaMaaLZaJeaJeaMbaOiaJeaJeaJeaJeaMdaMeaOpaOoaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaLnaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaOqaOsaLvaMyaMfaKZaMAaMBaMCaMCaMDaLfaOCaOHaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJRaIgaMPaMgaMRaMSaMqaMUaIgaOMaMWaPiaMYaMraNaaNbaGFaGGaQaaJVaIoaMxaQcaNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaMzaMzaNkaMzaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNzaNBaQdaNCaNzaNzaNzaNzaNDaNEaNFaQgaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaQlaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMTaMQaOhaQqaOjaOkaOlaOmaOnaJlaQyaQxaQAaOraOtaOtaOuaMZaOwaNdaKZaOyaOzaOAaOAaOBaLfaQEaODaOEaOEaOEaOEaOFaOGaQJaOIaOJaOKaOKaOLaQTaLfaJRaIgaONaOOaNjaOfaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRbaQbaQbaRraQeaQfaRxaKZaQhaMCaQiaQjaQkaLfaRyaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaRCaGFaIoaIoaJVaIoaSoaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaStaQFaQGaGOaQCaQHaQIaBIaSuaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSvaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSyaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSEaLfaSHaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaSIaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaSUaSUaNkaSUaNlaIAaSmaNnaSnaIAaLKaLKaSVaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaSZaLKaNraQPaTPaUfaSwaSxaNraReaUjaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaUxaUlaUlaUlaUlaUlaUlaSQaSRaSSaSTaUJaUOaSWaSXaSYaKZaKZaURaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaUSaVeaUVaVkaVfaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaVraTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeaVzaUgaUhaUeaUiaLKaLKaVIaLKaLKaLKaLKaUkaVLaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaVPaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaWdaUKaULaUMaUNaWjaUPaUQaWnaWkaUTaTfaUUaWoaWwaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWyaIgaIgaWFaIgaGGaVgaVhaViaViaViaVjaWKaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaStaQFaQGaGOaQCaQHaQIaBIaSuaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSvaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSyaQVaRcaQVaRdaNraNraNraReaSIaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSEaLfaSHaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaTIaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaSUaSUaNkaSUaNlaIAaSmaNnaSnaIAaLKaLKaSVaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaSZaLKaNraQPaTPaUfaSwaSxaNraReaUjaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaUxaUlaUlaUlaUlaUlaUlaSQaSRaSSaSTaUJaUOaSWaSXaSYaKZaKZaURaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaUSaVeaUVaVkaVfaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTXaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaVraTQaTRaTSaTTaTUaTVaTWaTZaTUaTYbcZaUaaUbaUcaUdaUeaVzaUgaUhaUeaUiaLKaLKaVIaLKaLKaLKaLKaUkaVLaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaVPaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaWdaUKaULaUMaUNaWjaUPaUQaWnaWkaUTaTfaUUaWoaWwaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWyaIgaIgaWFaIgaGGaVgaVhaViaViaViaVjaWKaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaXdcmVaXhaXiaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaXjaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeaXkaVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaXlaVMaVNaVOaXmaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaXnaVWaWmaXoaQbaXuaWpaWqaWraWsaWtaWtaWuaWvaXwaWaaXzaXCaWAaWBaWCaWDaWEaTeaJRaIgaThaONaRLaRMaONaONaONaXGaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXIaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaXOaXNaXTaXRaTUaTUaTUaXWaUeaXXaXZaXYaUeaUiaVGaXpaKfaXraXsaUmaXtaXmaYeaXvaYfaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaYkaYqaXDaXDaXEaXFaYwaXEaXFaXDaXDaXHaYxaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlaYyaSPaYAaTkaSSaXPaXQaSSaWhaXSaTkaSSaYGaOtaXUaXVaUQaYHaYKaYJaYMaYaaYbaYcaYdaWoaYNaYgaWBaYhaWDaYiaTeaJRaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaYVaYUaToaYXaZeaZXaWLbaOaYmaWOaZcaVoaYvaZgaZnaZhaYzaZraIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaZsaZsaYIaZtaZuaYLbacaZYaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaXNbafbanaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfbaCbaBbaPbaNbaTbaSbaVbaUbaXbaWbaYaZfaYoaZjaUpaWMaZbaZlaZmbaZaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaYGaOtaZqaXVaUQbbabbcbbbbbeaYaaYpaZwaYdaWoaYNaYgaWBaYhaZxaZyaZzbbfaZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJbbtbbhaTobbxbbhaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaZsaZkbaaaZvbbzbadbaebbAaYObagbahbaibajaTSbakbalbambbDbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajbbLaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMbbPbcybbRbbQbaRbaQbbSaUpaUpaUpaUpaUpbcDaUpaUpaUpbbTbaQbbdbbWbcabeobcubbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaYAaTkaSSaYGbcBaULaXVbbubbvbbwaUQaUQaYabcCbbybcFbcEbbBaYgaWBbbCaWDbcPaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaYVaYUaToaYXaYUaIobbKaGGbcTaVoaYuaVoaZNbbMbbNbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdtbcZbdHbdzbbUaSFbaabaabaabaabaabbVbaabdKaYObbXbbYbaibbZbbZbbZbbZbdQbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKibeablcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbeebcvbcwbcxbbgaUpbczbcAbekaUpaUpaaaaaaaafaafbezaaaaaaaUpaUpbeBbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSaSSaSSaSSaSSbeMbcQbcRbcSaUQaUQaUQbeNbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobeRbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdtbfTbdHbdzbbUaSFbaabaabaabaabaabbVbaabdKaYObbXbbYbaibbZbbZbbZbbZbdQbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKibeablcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbeebcvbcwbcxbbgaUpbczbcAbekaUpaUpaaaaaaaafaafbezaaaaaaaUpaUpbeBbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSaSSaSSaSSaSSbeMbcQbcRbcSaUQaUQaUQbeNbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobeRbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaZsbabbaaaZvbeTbbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZbeVbdIbdJaTSbeWbdLbdMbdNaTSaXebdObdPbdPbfebdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbfobdZbdYbebbebbebbebbebbecbebbebbebbedbedbfqbedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfwbelaSSaSSbembcOaZzaZzaZzbfxaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbfybbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfAaRtaZsbfWbeUbgubeTbbVbgIbgHaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeWbdLbdMbfdaTSaXebdObdPbgJbffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgMbfpbgNbfrbfsbftbfubdYbebbfvbgUbfvbgWbgXbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhebfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhCaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeWbdLbdMbfdaTSaXebdObdPbgBbgCbfgbfgbgDbdPbfibgEbgFbgGbhKbhJbhLaMbbgKbgLbctbhNbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhSbhRbfzbgYbhTbebbedbhabhbbhcbeCbhUbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhVbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIbhWbidbhXbhMbilaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfAaRtaZsbfWbeUbgubeTbbVbgIbgHaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeWbdLbdMbfdaTSaXebdObdPbgJbffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgMbfpbgNbfrbfsbftbfubdYbebbfvbgUbfvbgWbgXbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbkebfUbfVbfVbfVbhebfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhCaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeWbdLbdMbfdaTSaXebdObdPbgBbgCbfgbfgbgDbdPbfibgEbgFbgGbhKbhJbhLaMbbgKbgLbctbhNbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhSbhRbfzbgYbhTbebbedbhabhbbhcbeCbhUbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewblrbhzbhAbhBbhVbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIbhWbidbhXbhMbilaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbitbiqbjubjqbjwbjvbjubjAbjGbjBbjObpGbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbeWbibbicbjQaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGbjRaMbbimaSzbctbjVbiobipbfjbirbisbfBbiubjMbdYbebbiwbixbiybjYbiybgYbgebebbedbiAbiBbiCbgQbiEbgZbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbALbwEbXrbBraXebaibbZbdDbjsbjtbgybbZbbLbbLbbLaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbfgbkubdPboibfmbkxbgGbgGbgGbjDaMbbjEaSzbctbkAbkHbgObhdbjIbjJbhfbjLblybdYbjNbkKbjPbiybkLbiybgVbkMbjSbedbjTbjUbizbjWbjWbjWbjXbkNaJibkPbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkVbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktbkXbkvbewbkpbkwbkYbkybhFbewbewbkzbewbewbkZbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblobkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOblBblrblEblCbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmxbmobbZbbZbbZbeZbmCbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbohbfmbmBbgGblnbgGbmDblpblqaSzbctbdYbmEblsbltblublvblwblxbdYbdYbebblzblAbmHbmFblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmNaZzaZzaZzaZzaZzaZzbmTaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbmUaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbALbwEbXrbBraXebaibbZbdDbjsbjtbgybbZbbLbbLbbLaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbfgbkubdPboibfmbkxbgGbgGbgGbjDaMbbjEaSzbctbkAbkHbgObhdbjIbjJbhfbjLblybdYbjNbkKbjPbiybkLbiybgVbkMbjSbedbjTbjUbizbjWbjWbjWbjXbkNaJibkPbkabkbbkcbkdcyPbbFbkfbkgbkhbkibkjbkVbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktbkXbkvbewbkpbkwbkYbkybhFbewbewbkzbewbewbkZbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblobkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOblBcBVblEblCbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmxbmobbZbbZbbZbeZbmCbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbohbfmbmBbgGblnbgGbmDblpblqaSzbctbdYbmEblsbltblublvblwblxbdYbdYbebblzblAbmHbmFblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmNaZzaZzaZzaZzaZzaZzbmTaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbmUaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbmVbmjbmkbmkbmWbbZbdDbmmbeZbmnbbZbmXbmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnabfgbmybmzblfblmbmAbjCbgGbgGbjHbnlbnbblqaSzbnobmGbmGbmGbmGbmGbmGbmGbnsbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnwbmQbmRbiCbiGbmSaJibcKaRqaRpaJibnHbnAbnPbnNbnRbmYbmZbnSbnVbnUbndbnebnUbnWbnXbnhbnibnjbmPbojbnmbnnbokbnpbnqbnrbolbntbntbnubYfaVJblOblObooblObZMbZMblObnzbopbnBblObZtboqbZtblOblXblYbmbblObZnboJbZnblObnGboKbnIbnJbXsbYFbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnOboNbeQbnQbgrbpcboWbpmbnTbprbpobjpbpsbpvbnYbnZbmWbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbllbjCbgGbgGbgGbpwblpblqaSzbpybmGbombonbncbpAbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHbpBbngboLboMbnkbpLboPboQboRboRboSboTboUboUboVbpMboXboYboZbpabpbbnnbpNbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbpPbpnbnybppbnCbnDbpqbpSbptbpZbpTblOaZzbqabpxblObqbbqgbqcbqsbpCbpDbnIbpEcanccxbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbqtbgrbqxbjpbqBbqybpQbpRbqHbqGbqKbqKbqKbqMbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPbqTbqQbrkbrcbqdbqebqfbrnbqhbqibqjbqkbqkcKDcKEbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbrobxsbotaafbebbebbebbebbrubebbebbebbebaafbedbqzboCbqAbrvbqCbqDbqEaJibqFaRqaRpaJibrxbrwbqIbqJbrybqLboPbqNboUboUboUboUboUboUbqObqPbrCboYbqRbqSbrDbnnbqUbqVbqWbrIbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbrPbrdbrdbrdbrebrdbrfboObrhbribrjbscbnIbrlbpCbrmbsebpCbshbnIbrqccybrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7535,7 +7541,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAVbzQbAVbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbDYbgGbrNbwXbgGbqlbCRbgGbgGbEgbxcbvtbAbbCTbxcbCUbvwbCVbEhbEibAWbxlbvwbEkbEjbEpbAhbErbErbErbAjbEubEsbEwbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbECbDvbEFbDxbDybDzbDAbyWbEKbELbCjbEMbwmbDEbDFbwmbDGbDHbERbDJbESbDLbDMbCpbEUbDObBTbEVbDRbCpbVLbVMbDUbVAbDWbDXbDXbEWbDZbEabEbbEcbEdbEebEfbEYbEXbEZbCvbFbbFabFobwwbwwbwwbwwbwwbFybFrbEnbzKbzMbCJbEobFFbCJbzKbzLbzMbFQbCJbFUaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFVbExbFVbEybEzbEAbEAbEAbEAbEAbEBbGfbEDbzTbEEbdPbGgbEGbEHbEIbEJbGibGhbGkbGjbGvbtCbENbAbbEObEPbyEbvwbEQbGubGAbBMbETbvwbBPbGCbGDbAhaaaaaaaaabAjbGWbGEbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHabFjbFkbFlbFmbFnbHfbFpbFqbxCbxFbxFbHibxFbwkbFsbFtbFubFvbFwbFxbDJbHjbDLbFzbFAbFBbDObFCbFDbFEbHkbVlbDXbHlbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbHmbFRbFSbCvbHwbHvbHMbFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHNbHNbHObHQbHPbHRbEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbHSbGtbGvbGwbGxbGybGzbtCbvtbAbbHUbGBbtCbtGbtGbtGbtGbtGbHVbtGbtGbtGbHZbtGbtGbtGbtGbtGbIfbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHabIobFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIrbGXbGYbGZbIubHbbHcbHdbHebIvbCpbUSbUfbwwbwwbwwbwwbwwbIAbwwbwwbwwbzAbIBbzAbzAbIDbBhbCubCvbHwbIMbIRbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCnbBybITbIUbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIYbIXbHxbHybLrbHzbIZbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbJabJqbJbbJrbAabAabJDbJWbJVbAabHTbAabzZbHHbKJbHWbHXbHYbJXbxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebKdbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqbKfbFDbIsbItbKgbCpbKhbIwbIxbIybUdbLybKibICbKjbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbKzbKobINbIObIPbIQbKBbGabGbbISbEnbEnbEnbCJbCJbCJbKVbKUbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIYbIXbHxbHybLrbHzbIZbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbJabJqbJbbJrbAabAabJDbJWbJVbAabHTbAacMkbHHbKJbHWbHXbHYbJXbxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebKdbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqbKfbFDbIsbItbKgbCpbKhbIwbIxbIybUdbLybKibICbKjbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbKzbKobINbIObIPbIQbKBbGabGbbISbEnbEnbEnbCJbCJbCJbKVbKUbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabLaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbLnbEmbIVbIWcLYbLpbLzbLxbLFbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebLHbJkbJlbLIbJnbJobLKbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbLWbGHbDzbHAbFibDVbxFbLYbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbMhbMlbMibJYbIFbJZbKabKbbKbbzAbKcbMqbMpbMxbMwbMCbMybMHbMFbKkbGabGbbKlbEnbKmbMIbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbMMbKAbIVbKAbMPbKCbMSbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbMXbMTbKWbKXbcLbKYaRpaRpaRpaJlbMZbFlbFnbNdbJmbNfbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbNhbLqbNkbLsbLtbCpbLubLvbIxbLwbFGbLybNqbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbSLbCvbwwbLGbNtbNsbLJbNzbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNAbLXbNBbLVbLZbMabMbbGtbMcbMdbMebMfbMgbNLbNKbMjbMjbMkbtCbtCbtCbNQbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbNZbtCbtCbtCaJlaJlbObaJlaKSaMpbMraJlbKZbOcbOdbGFbLdbxCbDzbLDbxCbOfbMzbMAbMBbwkbOibMDbMEbOkbMGbOlbOnbMJbMKbMLbItbJObFDbFDbOtbJObCpbMNbMObMObMObMObMObMObMObMObMObMObOxbMQbMRbMRbzAbOCbODbMUbwwbMVbMVbMVbMWbOEbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbOFbLRbLRbNebKtbKtbLTbLTbOGbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7544,7 +7550,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobScbQqbQrbKAbKAbQsbQtbSgbQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbSibQCbSlbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFbSrbSnbQNbQObSubQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbSwbGFbPzbDzbLebRCbQZbPBbSEbSMbRGbDEbIkbSpbRdbRebRebRpbRfbMKbRgbRhbSNbRjbRkbRlbSObRnbPObMObOsbOsbRobOsbOsbOsbOsbSPbMObRqbLEbRrbRrbzAbRsbRtbRubSQbRwbSSbSRbSWbSVbTsbTgbTAbTubTNbTMbTObREbTWbTTbRHbQibOpbRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLVbUbbRNbUkbLVbRPbMabMbbGtbGtbRQbRQbRQbGtbGtbNxbRRbRRbRSbRSbRSbRSbNwbQyaaabRTbRUbRVbUobRXbRYbRZbSabSbbSbbUqbSdbSebUwbNFbPtbPtbPtbPtbPtbUAbPtbPtbShbUGbSjbNUbPxbSkbUObDtbQHbLbbQVbSmbUPbPzbSobJAbJBbSqbRabSsbStbJzbFsbSvbIEbSxbUWbURbSAbSBbMKbRmbSDbVebRjbSfbSGbVjbRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSJbRrbRrbzAbSKbSLbCvbzIbVkbVvbVmbRDbVybVGbVzbVVbVObWibWgbMVbQfbWkbOObSXbRIbSybTaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbTcbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbWoaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbWIbPfbTtbTvbWMbTwbNFbSzbTybTzbWVbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbPebLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbXabTUbTVbRjbXcbTXbTYbRnbPObMObTZbQWbPQbXebenbNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbXibXnbMVbMVbMVbMVbXpbSCbVFbMVbXqbUnbOObUpbSYbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbXvbNwbUxaaabUybPcbPcbUzbXxbPfbPfbUBbPfbSFbNFbUDbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbYabwabUTbUUbYtbYobYwbUTbUYbUZbVabVbbUebTPbVdbYybVgbVhbVibUlbYzbUmbRjbUCbYHbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbYMbzAbzAbVwbCxbSLbCxbVxaafbnxbYSbYYblSbVBbYZbZcbZbbZebUVbMVbVHbVIbOObVJbWHbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZibLUbKuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbXvbNwbUxaaabUybPcbPcbUzbXxbPfbPfbUBbPfbSFbNFcMlbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbYabwabUTbUUbYtbYobYwbUTbUYbUZbVabVbbUebTPbVdbYybVgbVhbVibUlbYzbUmbRjbUCbYHbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbYMbzAbzAbVwbCxbSLbCxbVxaafbnxbYSbYYblSbVBbYZbZcbZbbZebUVbMVbVHbVIbOObVJbWHbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZibLUbKuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVPbVQbVQbVRbVSbNxbVTbRSbVUbNxaaaaaaaaaaaabNybZrbVWbVXbVZbVYbPfbNFbWabWbbNIbNFbSUbUXbVfbVcbVDbVCbVEbSUcaqcaqcaqcaqcaqbTFbWjbZsbWlbWcbWdbZubWpbxgbWrbWsbWtbWubWtbWvbWtbWwbWxbWybWzbWAbWBbWAbWCbWDbWEbWFbWGbWebZvbWfbWKbWLbZzbxVbMObxWbZBbzlbWSbWTbWhbWSbWSbXfbWWbWXbWYbWZbCxbCxbSLbCxbFTaafbnxbZLbZLbXbbZObXdbZSbZPbXgbXhbMVbVHbZUbOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQmbQmbQmbQmbQmbQmbXkbLTbQlbQmbXlbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmbZVbWmcaabRSczUcAYcADcBKbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbSUbWnbWJbXubXubWJbWRbSUcaobWUbWUbXocaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbAScaxbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYnbZCbYpbYqbYrbYscaLbYrbYubYvbILaafbnxcaMcaWbrBbVBcaXcbecbdcbfbYAbMVbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVQbVQbVRbYEcEcbYGbNxcbgbNxbYIbYJbYKbYIbYIbYLcbibYNbYObYPcbjbXwbXzbXybYebXAbYjbWJbYQbYxbYRcbkbYTcbmbYVbYUbYXbYWcaqbZhbNScbnbZjbZkbZlbZlbZmbnEbZobZpbTJbTJbZqcbrbTJbTJcbycbtcbAcaIcbBbWQbZxbZycbCbZybZAbZacbDbZabZAcbJbYfbMNbIwbZEbXWbXVbZdcbKbZJbZKbMObMObwwbwwbwwbwwbwwboIbnFbofbwwbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVcbLbZQbZRbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7557,7 +7563,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHckpchHcgEchNckCchNcgEchRckFchRcgEaaaaaaciiciKcgTcgUcgUckNcejchUchTchWckQclfchXcidcicclgcieciecigciecbqbXzcihbYecikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJclpclrciMciXciOclycluciRciSciSciTciUcaIcaIcaIclCcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjkcjjcivcjmcjncjociwcjocjocixclKclGcgIclVcgIcmgcmkcdScmpcjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcjbchHcgEchNcjcchNcgEchRcjdchRcgEaaaaaaciicgTcgUcgUcgUcjBcmscjhcjechWcmwcmGcmBcmPcmOcjzcjycjDcjAcjEcbqbXzcjFchjcjGcmQcjHcjJcjJcjJcjKcjMcjLcjNcmRcjOceAciAbTFciGcmXciIckbckccnbcubcneckgckhcngcnfckkcklciScnhciUcnkcnwcnucjQcjPcdHcnEcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcnFcjRcjTcjSckEcdOcnIcdOckGckHcjXcjUcjUcjYcgIcgIckecjZcjUckickOcdSckPcnKckRcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEckrckuckscgEckzckBckAcgEckDckJckIcgEaaaaafciiclbcgTcgUcgUcgUcejckMckKchWchWcnLchWchWchWchWckTcieckWckYcbqclackZcldclccnNcleclhclhclhclicljcljclkciAcllcgqclwclxciGcnPciIclzclAclBcnQclDclEclFcnTclHclIclJciScnUciUcnVcnXclNclnclmclQclNclRclSclTbYfceQcdIcdIcdIcdIcdIcltbYfaaaaaaaaaaaaaaaaaaaaacdLcmacmbcmccmdcdOcmecmfcnZcdScmhcmicmicmiclvcoacmlclPclOcmicmicmncdScmocobcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmmcmjcgEcmtcmmcEgcgEcmtcmmcEgcgEaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcolconcmycmCcmCcmEcmDcmCcmFcoqcbqcmIcmHcmKcmJcimcmLcmLcmMcljcmNcotcorcorciAcibceVcoycqgciGcoAciIcnccndcoBciGcmSciNcmWciUcoCcnicnjciScoFciUclLclMclNcnlcoJcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScoLcnscntcdScdScnvcpdcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmmcmjcgEcmtcmmcEgcgEcmtcmmcEgcgEaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcolconcmycmCcmCcmEcmDcmCcmFcoqcbqcmIcmHcmKcmJcimcmLcmLcmMcljcmNcotcorcMmciAcibceVcoycqgciGcoAciIcnccndcoBciGcmSciNcmWciUcoCcnicnjciScoFciUclLclMclNcnlcoJcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScoLcnscntcdScdScnvcpdcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcnAcnBcgUcgUcnCcnDcpocpgcnycnmcprcnzcnzcpycnzcnGcpAcnHcnGcnJcpCcpBcpGcnMcnOcnOcnOcnOcpIcpHcnRcnRcnRcgscgscgscgscnSciGcpMcpNcnccpOcnWciGcmSciNcpPciUcnYcpQcnjcpUcpRciUclLclMclNcoccodcoeclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcofcogcohcwlcojcokcqecomcqmcopcoocdOaaLaafaafaafaafaaaaaaaaacqraaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoucqAcqtcoxcovcowcqDcoxcqIcqLcqDcoDcqNcqOcoEcnycnycnycnycnycnycnycnycoHcoGcqWcoIcracoKcoNcoMcoOcnGcoQcoPcoRcnGcoTcoScoUcnOcoWcoVcoYcoXcpacoZcpjcpbcpbcpkcpncpncpjcrvciGciGcpccrzciGciGciGcpeciNcrQciUciUciUcrScphciUciUclLcpiclNcvmcpscvmclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcplcpmcplcrUcjrcppcpqcomcomcrXcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacrZaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcsacpucpxcpwcpFcsbcsccpzcsecsdcpEcpDcsfcpFcpLcpJcsicsgcsDcsncsKcpTcpWcpVcpYcpXcqacpZcqccqbcsLcqdcsMcqfcsQcqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcsWciUcqncqocqpcqqciUcsXclLcpiclNcsYcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoicsZcqBcqCctbcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7565,9 +7571,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFctucxactxcxactycxacxactGctBcpFcpFctOctIctIctIctSctQctTctTctUcpZctVcshcsjcnGcsmcskcuacnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcuecpjbTFcizciGcszcsAcsBcsCciGcfYcufcfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNculcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcurcsVcsUcuxctxcxacuycxacxacuLcuEcuUcuOcuYctacvccvbcvbcvkcrccrccthctgctjcvlcnzcnGcvncnGcnGcnGcvsctlcsrctncvvcvtcvFcvEcpacvGcpjcvOcrKcsycrKcvRcpjctvctwciGciGcvXciGciGciGciBctzctAciUciUciUcwaciUciUcsIcrGaaacqvctCctZctEctFcwectHcwfctJctKctLcqvcuVcwmcuVcqvcwuctPcqvaafaafcdOcplcplcplcrVcjrctRcuccwDcwzcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcurcsTcsTcsTcurcsTcsTcsTcsTcsTcwEcwGcsTcwHcsTcwIcsTcsTcsTcuhcugcuicpvcpFcujcwJcukcuncumcupcuocumcuqcuscwOcuucutcutcuvcutcuwcwWcwUcuAcuzcuBcuBcpjcuCcuDcwXcuFcuFcuGcuHcuIcuJcuJcuJcuJcItcuJcuJcuJcuKcrFcrGaaactFcwYcuPcuNctFcwZcuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcxdcuZcvicxncxecvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFcticpFcxocpFcxqcxpcvpcvocvrcvqcxrcvqcxscvucvxcvwcvycvucvucvzcvAcpIcvBcpacvDcvCcpacpacxwcxtcxtcxCcuBcuBcpjbPxcAscvNcvNcvNcvNcxFcvNcvNcvNcvNclMcJgcrGcrGcrGcrGcrGcrGaaactFctFcxHctFctFcxJcvScvTcvUcvVcvHcvJcvIcvLcvKcxVcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicyacxYcvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaacbOaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFcticpFcybcpFcpFcybcybcyccpFcpFcvZcvYcwgcwgcwgcwgcygcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcyhcxtcyicwxcwwcpjcymcvMcvNcyrcypcwKcwLcwMcwNcyucvNclMcJDcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAcywcwCcwBcyEcyzcyFcwFcwTcwScwVcyHcuWcuQcyJcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkcyKcxmcyLcdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcyMcpFcpFcpFcyMcpFcpFcpFcpFcpFcvWcpFcpFcyRcyPcySctdctdcyScyTcyScxlcyUcyVctdcyZcyXczgczeczncwkcoTcxucoTcxvczocpacpacxAcpacxBcpjczqczqcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcJEcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUczrcxWcxXczBcxZcuTczFcuScxEcuTczHcqvcqvcqvcqvaaaaaacdOcplcpmcplcwvcjrcppcrNcrNcyecyfcrNczKcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaaczLaaaaaaczLaaaaaaaaaczLaaaaaaaaaaaaaaaczLaaaaaaaaaczLaaaaaaczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcBvcpFcpFcqXcpFcpFcpFcqXcpFcBvcpFcpFcpFcvWcpFcpFcticBvcxocpFcxqcxpcvpcvocvrcvqcxrcvqcxscvucvxcvwcvycvucvucvzcvAcpIcvBcpacvDcvCcpacpacxwcxtcxtcxCcuBcuBcpjbPxcAscvNcvNcvNcvNcxFcvNcvNcvNcvNclMcJgcrGcrGcrGcrGcrGcrGaaactFctFcxHctFctFcxJcvScvTcvUcvVcvHcvJcvIcvLcvKcxVcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicyacxYcvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaacbOaaaaaaaaaaaacptcpFcpFcMncpFcpFcqXcpFcpFcpFcqXcpFcMncpFcpFcpFcvWcpFcpFcticMncybcpFcpFcybcybcyccpFcpFcvZcvYcwgcwgcwgcwgcygcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcyhcxtcyicwxcwwcpjcymcvMcvNcyrcypcwKcwLcwMcwNcyucvNclMcJDcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAcywcwCcwBcyEcyzcyFcwFcwTcwScwVcyHcuWcuQcyJcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkcyKcxmcyLcdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpvcpFcpFcyMcpFcpFcpFcyMcpFcpvcpFcpFcpFcvWcpFcpFcyRcMocySctdctdcyScyTcyScxlcyUcyVctdcyZcyXczgczeczncwkcoTcxucoTcxvczocpacpacxAcpacxBcpjczqczqcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcJEcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUczrcxWcxXczBcxZcuTczFcuScxEcuTczHcqvcqvcqvcqvaaaaaacdOcplcpmcplcwvcjrcppcrNcrNcyecyfcrNczKcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaaczLaaaaaaczLaaaaaaaaaczLaaaaaaaaaaaaaaaczLaaaaaaaaaczLaaaaaaczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFczmcrWcrWczpcxGcrWczpcrWcxIczMctIctIczSctIczTctIctIctSczVcybcpFcpFcyjcylcykcynczXcyocpFcAhcyqcyscyscAtcytcoTcxucyvcnOcAvcpacyxcpacAwcyycpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcAxcyNcxLcyOcxLcxNcAAcvNcrGcJGcrGaaaaaaaaaaaaaaaaaacqvcuVcAHctFctFcAJcyAcAQcyWctMctDctNcyBctMcvhcyYcqvaaaaaaaaaaaacdOcplcplcplckXcARczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaczLczLczLczLaaaaaaaaaczLczLczLczLczLczLczLaaaaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFcqXcpFcpFcpFcyMcpFcpFcpFcyMcpFcpFcpFcyCcpFcvWcpFcpFcpFcyDcybcpFcpFcATcyTctfcyGcwgcAUcwgcwgcyqcAWcyIcBkcytcoTcxucoTcnOcBncBmcBscBqczfcpacnOcBucBzcBzczhcBAcBDczNczOcvNcBEczPczQcxNczRcBHcBIcvNcJIcJHcrGaaaaaaaaaaaaaaaaaacqvczWcuMcBLcuVczYczZcAactFcAbcAccsPcyBczWczjcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczkcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaaczLczLczLczLaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczlcpFcqXcpFcBOcxactxcxacBRcxactxcxacBRcxacxccxacxbcBSctectdcCcctfczsczucztczwczvczxcwgczzczycwgcwgcwgcwgcwgczAcpCcCecpCcnOcnOcnOcnOcnOcnOcnOcnOczDcBzcBzczEcANcAObPxcAPcvNcCgcCfcClcCicCqcCncCvcvNcAXcJJcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBecCBczGczIcBecCFcqvaafaafaaaaaaaaaaaabquaaacdOcBlczJcCJcBocBpczJcCNcBrcBpczJcCOcdOaaaaaacbOaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaaczLczLczLczLaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa From d247584d1b163eaa95c5f39521979afdf85ed5a2 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Wed, 18 Nov 2015 14:38:46 +0000 Subject: [PATCH 017/148] add a sleep inbetween disabling and enabling hardware mode i've been seeing HW mode not always re-enabling, hopefully this'll fix it --- code/modules/client/client procs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index ecbd78b14d..3ee7ebcdeb 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -161,6 +161,7 @@ spawn(5) // And wait a half-second, since it sounds like you can do this too fast. if(src) winset(src, null, "command=\".configure graphics-hwmode off\"") + sleep(2) // wait a bit more, possibly fixes hardware mode not re-activating right winset(src, null, "command=\".configure graphics-hwmode on\"") log_client_to_db() From ed7386f30626bb0121250f58d1c63dfed1f375b1 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 19 Nov 2015 04:06:14 +0300 Subject: [PATCH 018/148] Fixes #11356 --- code/game/machinery/cloning.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index af33673a1f..5c73084e5d 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -131,6 +131,7 @@ else H.dna = R.dna H.UpdateAppearance() + H.sync_organ_dna() if(heal_level < 60) randmutb(H) //Sometimes the clones come out wrong. H.dna.UpdateSE() @@ -252,7 +253,7 @@ locked = 0 go_out() return 1 - + //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(var/message) if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning))) From 959e15826bfdfaac6caed8b0c6de2d7ce3e4b249 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 20 Nov 2015 19:55:00 +1030 Subject: [PATCH 019/148] Fixes grown food not leaving trash. --- code/modules/hydroponics/grown.dm | 1 + code/modules/hydroponics/seed.dm | 3 +++ 2 files changed, 4 insertions(+) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 8368174444..40fd541f71 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -38,6 +38,7 @@ return name = "[seed.seed_name]" + trash = seed.get_trash_type() update_icon() diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 108a242636..011ec7a237 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -68,6 +68,9 @@ /datum/seed/proc/get_trait(var/trait) return traits["[trait]"] +/datum/seed/proc/get_trash_type() + return trash_type + /datum/seed/proc/set_trait(var/trait,var/nval,var/ubound,var/lbound, var/degrade) if(!isnull(degrade)) nval *= degrade if(!isnull(ubound)) nval = min(nval,ubound) From c826d3d23786a4e733f6fc34a6e9816fcc69a50d Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 20 Nov 2015 11:21:39 +0100 Subject: [PATCH 020/148] Fixes being unable to eat. Silly 1-based indexing. --- .../mob/living/carbon/human/human_helpers.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index a22e616763..437c9d06a5 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -4,24 +4,24 @@ /mob/living/carbon/human/can_eat(var/food, var/feedback = 1) var/list/status = can_eat_status() - if(status[0] == HUMAN_EATING_NO_ISSUE) + if(status[1] == HUMAN_EATING_NO_ISSUE) return 1 if(feedback) - if(status[0] == HUMAN_EATING_NO_MOUTH) + if(status[1] == HUMAN_EATING_NO_MOUTH) src << "Where do you intend to put \the [food]? You don't have a mouth!" - else if(status[0] == HUMAN_EATING_BLOCKED_MOUTH) - src << "\The [status[1]] is in the way!" + else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) + src << "\The [status[2]] is in the way!" return 0 /mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) var/list/status = can_eat_status() - if(status[0] == HUMAN_EATING_NO_ISSUE) + if(status[1] == HUMAN_EATING_NO_ISSUE) return 1 if(feedback) - if(status[0] == HUMAN_EATING_NO_MOUTH) + if(status[1] == HUMAN_EATING_NO_MOUTH) feeder << "Where do you intend to put \the [food]? \The [src] doesn't have a mouth!" - else if(status[0] == HUMAN_EATING_BLOCKED_MOUTH) - feeder << "\The [status[1]] is in the way!" + else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) + feeder << "\The [status[2]] is in the way!" return 0 /mob/living/carbon/human/proc/can_eat_status() From 8e1928062b0e6f11f38241bcf33c6b70ca0137b9 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Fri, 20 Nov 2015 21:41:31 +0000 Subject: [PATCH 021/148] sulphuric acid is "sacid" not "acid" --- .../research/xenoarchaeology/artifact/artifact_unknown.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index 5fbe8dcd41..c8e0f78dca 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -257,7 +257,7 @@ var/list/valid_secondary_effect_types = list(\ my_effect.ToggleActivate() if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25)) secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) + else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) if(my_effect.trigger == TRIGGER_ACID) my_effect.ToggleActivate() if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25)) From a79a8746e0e4d6e5696b7b2a1ea0da90034281a1 Mon Sep 17 00:00:00 2001 From: Datraen Date: Fri, 20 Nov 2015 18:30:52 -0500 Subject: [PATCH 022/148] Fixes #11489 --- code/modules/hydroponics/trays/tray.dm | 37 ++++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index d397138317..9075ad83ab 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -342,12 +342,15 @@ set category = "Object" set src in view(1) - if(labelled) - usr << "You remove the label." - labelled = null - update_icon() - else - usr << "There is no label to remove." + if(!usr.canmove || usr.stat || usr.restrained()) + return + if(ishuman(usr)) + if(labelled) + usr << "You remove the label." + labelled = null + update_icon() + else + usr << "There is no label to remove." return /obj/machinery/portable_atmospherics/hydroponics/verb/setlight() @@ -355,10 +358,14 @@ set category = "Object" set src in view(1) - var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) - if(new_light) - tray_light = new_light - usr << "You set the tray to a light level of [tray_light] lumens." + if(!usr.canmove || usr.stat || usr.restrained()) + return + if(ishuman(usr)) + var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) + if(new_light) + tray_light = new_light + usr << "You set the tray to a light level of [tray_light] lumens." + return /obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity() //Make sure various values are sane. @@ -611,12 +618,14 @@ set name = "Toggle Tray Lid" set category = "Object" set src in view(1) - close_lid(usr) + if(!usr.canmove || usr.stat || usr.restrained()) + return + + if(ishuman(usr)) + close_lid(usr) + return /obj/machinery/portable_atmospherics/hydroponics/proc/close_lid(var/mob/living/user) - if(!user || user.stat || user.restrained()) - return - closed_system = !closed_system user << "You [closed_system ? "close" : "open"] the tray's lid." update_icon() From 301f7f5c8d04b27a24f6e38369a3b83518b09f2c Mon Sep 17 00:00:00 2001 From: Datraen Date: Fri, 20 Nov 2015 19:37:00 -0500 Subject: [PATCH 023/148] Fixes #11489, fixes labels as well --- code/modules/hydroponics/trays/tray.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 9075ad83ab..79b6c5c361 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -344,7 +344,7 @@ if(!usr.canmove || usr.stat || usr.restrained()) return - if(ishuman(usr)) + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) if(labelled) usr << "You remove the label." labelled = null @@ -360,7 +360,7 @@ if(!usr.canmove || usr.stat || usr.restrained()) return - if(ishuman(usr)) + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) if(new_light) tray_light = new_light @@ -621,7 +621,7 @@ if(!usr.canmove || usr.stat || usr.restrained()) return - if(ishuman(usr)) + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) close_lid(usr) return From ef1f91e3348f6b952bc42d9ff866b89b33888a1d Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Fri, 20 Nov 2015 14:42:28 -0500 Subject: [PATCH 024/148] Fix Laptop Vendors and Personal Lockers not accepting ID Containers Fixes #11092 --- code/game/machinery/computer3/lapvend.dm | 86 +++++++++---------- .../crates_lockers/closets/secure/personal.dm | 5 +- html/changelogs/neersighted-11486.yml | 5 ++ 3 files changed, 48 insertions(+), 48 deletions(-) create mode 100644 html/changelogs/neersighted-11486.yml diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index 416472a31a..ac3e7e172c 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -38,16 +38,14 @@ /obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(vendmode == 1) - if(istype(W, /obj/item/weapon/card)) - var/obj/item/weapon/card/I = W - scan_card(I) + var/obj/item/weapon/card/id/I = W.GetID() + + if(vendmode == 1 && I) + scan_id(I, W) + vendmode = 0 + if(vendmode == 3 && I) + if(reimburse_id(I, W)) vendmode = 0 - if(vendmode == 3) - if(istype(W,/obj/item/weapon/card)) - var/obj/item/weapon/card/I = W - if(reimburse(I)) - vendmode = 0 if(vendmode == 0) if(istype(W, /obj/item/device/laptop)) var/obj/item/device/laptop/L = W @@ -210,26 +208,24 @@ newlap.spawn_parts() -/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I) - if (istype(I, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = I - visible_message("[usr] swipes a card through [src].") - var/datum/money_account/CH = get_account(C.associated_account_number) - if(!CH) - usr << "\icon[src]No valid account number is associated with this card." - return - if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - if(vendor_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - transfer_and_vend(D, C) - else - usr << "\icon[src]Unable to access account. Check security settings and try again." +/obj/machinery/lapvend/proc/scan_id(var/obj/item/weapon/card/id/C, var/obj/item/I) + visible_message("\The [usr] swipes \the [I] through \the [src].") + var/datum/money_account/CH = get_account(C.associated_account_number) + if(!CH) + usr << "\icon[src]No valid account number is associated with this card." + return + if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) + if(vendor_account) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + transfer_and_vend(D, C) else usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." else - transfer_and_vend(CH, C) + usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." + else + transfer_and_vend(CH, C) // Transfers money and vends the laptop. @@ -361,30 +357,28 @@ -/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I) - if (istype(I, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = I - visible_message("[usr] swipes a card through [src].") - var/datum/money_account/CH = get_account(C.associated_account_number) - if(!CH) - usr << "\icon[src]No valid account number is associated with this card." - return 0 - if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - if(vendor_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - transfer_and_reimburse(D) - return 1 - else - usr << "\icon[src]Unable to access account. Check security settings and try again." - return 0 +/obj/machinery/lapvend/proc/reimburse_id(var/obj/item/weapon/card/id/C, var/obj/item/I) + visible_message("\The [usr] swipes \the [I] through \the [src].") + var/datum/money_account/CH = get_account(C.associated_account_number) + if(!CH) + usr << "\icon[src]No valid account number is associated with this card." + return 0 + if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) + if(vendor_account) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + transfer_and_reimburse(D) + return 1 else usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." return 0 else - transfer_and_reimburse(CH) - return 1 + usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." + return 0 + else + transfer_and_reimburse(CH) + return 1 /obj/machinery/lapvend/proc/transfer_and_reimburse(var/datum/money_account/D) var/transaction_amount = total() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 2aa3e57185..a71851f9f2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -66,11 +66,12 @@ src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet user.drop_item() if (W) W.forceMove(src.loc) - else if(istype(W, /obj/item/weapon/card/id)) + else if(W.GetID()) + var/obj/item/weapon/card/id/I = W.GetID() + if(src.broken) user << "It appears to be broken." return - var/obj/item/weapon/card/id/I = W if(!I || !I.registered_name) return if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name))) //they can open all lockers, or nobody owns this, or they own this locker diff --git a/html/changelogs/neersighted-11486.yml b/html/changelogs/neersighted-11486.yml new file mode 100644 index 0000000000..8908354b58 --- /dev/null +++ b/html/changelogs/neersighted-11486.yml @@ -0,0 +1,5 @@ +author: neersighted +delete-after: True +changes: + - bugfix: "Laptop Vendors now accept ID Containers (PDA, Wallet, etc)." + - bugfix: "Personal Lockers now accept ID Containers (PDA, Wallet, etc)." From e98192afc7848cac4959a14e31cbc93faddac6b7 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 22 Nov 2015 11:21:28 +0100 Subject: [PATCH 025/148] Updates changelog. --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/neersighted-11486.yml | 5 ----- 3 files changed, 11 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/neersighted-11486.yml diff --git a/html/changelog.html b/html/changelog.html index 554144e8fc..da0c373d46 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,13 @@ -->
+

22 November 2015

+

neersighted updated:

+
    +
  • Laptop Vendors now accept ID Containers (PDA, Wallet, etc).
  • +
  • Personal Lockers now accept ID Containers (PDA, Wallet, etc).
  • +
+

27 October 2015

HarpyEagle updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 89f6ba658f..49b16be0a5 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2036,3 +2036,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. HarpyEagle: - bugfix: When affected by pepperspray, eye protection now prevents blindness and face protection now prevents stun, instead of face protection doing both. +2015-11-22: + neersighted: + - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). + - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). diff --git a/html/changelogs/neersighted-11486.yml b/html/changelogs/neersighted-11486.yml deleted file mode 100644 index 8908354b58..0000000000 --- a/html/changelogs/neersighted-11486.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: neersighted -delete-after: True -changes: - - bugfix: "Laptop Vendors now accept ID Containers (PDA, Wallet, etc)." - - bugfix: "Personal Lockers now accept ID Containers (PDA, Wallet, etc)." From 782f0a8bfb1271ae6a69e81c10428b7daa4833c2 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 22 Nov 2015 11:37:14 +0100 Subject: [PATCH 026/148] Makes shuttle control consoles sturdier. Fixes #11501. --- code/modules/shuttles/shuttle_console.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 5cb28c40e6..4a86591cf9 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -15,7 +15,7 @@ if(!allowed(user)) user << "\red Access Denied." return 1 - + ui_interact(user) /obj/machinery/computer/shuttle_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -94,4 +94,10 @@ ..() /obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) - visible_message("[Proj] ricochets off [src]!") + visible_message("\The [Proj] ricochets off \the [src]!") + +/obj/machinery/computer/shuttle_control/ex_act() + return + +/obj/machinery/computer/shuttle_control/emp_act() + return From 0f78998377f91dfe8f694f364b3edfbaa7b23a08 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Sun, 22 Nov 2015 20:34:29 -0600 Subject: [PATCH 027/148] Fix Dionea home system Fixes #11492 --- code/modules/client/preferences_factions.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm index 2293be7dd6..404fbc98c1 100644 --- a/code/modules/client/preferences_factions.dm +++ b/code/modules/client/preferences_factions.dm @@ -24,7 +24,7 @@ var/global/list/home_system_choices = list( "Sol", "Nyx", "Tau Ceti", - "Epsilon Ursae Majoris", + "Epsilon Ursae Minoris", "S'randarr" ) From 9b1123cbaaef1b9e6f1389fb0e805f58c7bb124b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 24 Nov 2015 14:05:04 +0100 Subject: [PATCH 028/148] Replaces misc. checks with usr.incapacitated(). --- code/modules/hydroponics/trays/tray.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 57361963f4..5d4802230b 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -124,7 +124,7 @@ ) /obj/machinery/portable_atmospherics/hydroponics/AltClick() - if(mechanical && !usr.stat && !usr.lying && Adjacent(usr)) + if(mechanical && !usr.incapacitated() && Adjacent(usr)) close_lid(usr) return return ..() @@ -357,7 +357,7 @@ set category = "Object" set src in view(1) - if(!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) if(labelled) @@ -373,7 +373,7 @@ set category = "Object" set src in view(1) - if(!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) @@ -633,7 +633,7 @@ set name = "Toggle Tray Lid" set category = "Object" set src in view(1) - if(!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) From 3cdc81ad8ebf0f1427e8fe8041b530a125f03462 Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Wed, 25 Nov 2015 21:38:17 +1300 Subject: [PATCH 029/148] Removed power testing map --- maps/PowerTesting.dmm | 120 ------------------------------------------ 1 file changed, 120 deletions(-) delete mode 100644 maps/PowerTesting.dmm diff --git a/maps/PowerTesting.dmm b/maps/PowerTesting.dmm deleted file mode 100644 index 9c7088d6ab..0000000000 --- a/maps/PowerTesting.dmm +++ /dev/null @@ -1,120 +0,0 @@ -"aa" = (/turf/space,/area/space) -"ab" = (/turf/simulated/wall/r_wall,/area/space) -"ac" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) -"ad" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/solar/port) -"ae" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) -"af" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/solar/port) -"ag" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"ah" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar) -"ai" = (/turf/simulated/wall/r_wall,/area/engine/workshop) -"aj" = (/turf/simulated/floor/plating,/area/solar/port) -"ak" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/solar/port) -"al" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"am" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"an" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"ao" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/portsolar) -"ap" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aq" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"ar" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar) -"as" = (/turf/simulated/floor/plating,/area/engine/workshop) -"at" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/workshop) -"au" = (/obj/machinery/power/smes/buildable{charge = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/workshop) -"av" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engine/workshop) -"aw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/workshop) -"ax" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engine/workshop) -"ay" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor/plating,/area/engine/workshop) -"az" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless/catwalk{icon_state = "catwalk4"},/area/solar/port) -"aA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/solar/port) -"aB" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/solar/port) -"aC" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/solar/port) -"aD" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/solar/port) -"aE" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10, 13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aG" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aH" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar) -"aI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/workshop) -"aM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/workshop) -"aN" = (/obj/machinery/power/breakerbox/activated,/turf/simulated/floor/plating,/area/engine/workshop) -"aO" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/engine/workshop) -"aP" = (/obj/effect/landmark/start{name = "AI"},/obj/effect/landmark/start{name = "Assistant"},/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/effect/landmark/start{name = "Bartender"},/obj/effect/landmark/start{name = "Captain"},/obj/effect/landmark/start{name = "Cargo Technician"},/obj/effect/landmark/start{name = "Chaplain"},/obj/effect/landmark/start{name = "Chef"},/obj/effect/landmark/start{name = "Chemist"},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/effect/landmark/start{name = "Cyborg"},/obj/effect/landmark/start{name = "Detective"},/obj/effect/landmark/start{name = "Gardener"},/obj/effect/landmark/start{name = "Geneticist"},/obj/effect/landmark/start{name = "Head of Personnel"},/obj/effect/landmark/start{name = "Head of Security"},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/effect/landmark/start{name = "Janitor"},/obj/effect/landmark/start{name = "Librarian"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/effect/landmark/start{name = "Psychiatrist"},/obj/effect/landmark/start{name = "Quartermaster"},/obj/effect/landmark/start{name = "Research Director"},/obj/effect/landmark/start{name = "Roboticist"},/obj/effect/landmark/start{name = "Scientist"},/obj/effect/landmark/start{name = "Security Officer"},/obj/effect/landmark/start{name = "Shaft Miner"},/obj/effect/landmark/start{name = "Station Engineer"},/obj/effect/landmark/start{name = "Warden"},/obj/effect/landmark/start{name = "Xenobiologist"},/turf/simulated/floor/plating,/area/engine/workshop) -"aQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/workshop) -"aR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/engine/workshop) -"aS" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/solar/port) -"aT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"aU" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/portsolar) -"aV" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aW" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) -"aX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engine/workshop) -"aY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engine/workshop) -"aZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engine/workshop) -"ba" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/plating,/area/engine/workshop) -"bb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/item/clothing/gloves/yellow,/obj/item/device/multitool,/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/engine/workshop) -"bc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/solar/port) -"bd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"be" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/workshop) -"bf" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/workshop) -"bg" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/engine/workshop) -"bh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/workshop) -"bi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/workshop) -"bj" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bk" = (/turf/simulated/wall/r_wall,/area/engine/engine_smes) -"bl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bn" = (/turf/simulated/wall/r_wall,/area/engine/engine_monitoring) -"bo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bp" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bq" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"br" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bs" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bu" = (/turf/simulated/floor/plating,/area/engine/engine_smes) -"bv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"by" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bz" = (/obj/machinery/power/monitor{name = "Engine Power Monitoring"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/solar/port) -"bB" = (/obj/machinery/power/smes/buildable{charge = 1e+007; input_level = 500000; input_attempt = 1; cur_coils = 4; output_level = 500000},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) -"bC" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bE" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bF" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bG" = (/obj/machinery/light,/obj/machinery/power/monitor{name = "Engine Power Monitoring"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engine_smes) -"bI" = (/turf/simulated/floor/plating,/area/engine/engine_monitoring) -"bJ" = (/turf/simulated/wall/r_wall,/area/engine/engine_room) -"bK" = (/obj/item/stack/sheet/mineral/phoron{amount = 1000},/turf/simulated/floor/plating,/area/engine/engine_room) -"bL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engine/engine_room) -"bM" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room) -"bN" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engine_room) -"bO" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engine_room) -"bP" = (/obj/machinery/power/apc/super{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engine_room) -"bQ" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/engine/engine_room) -"bR" = (/obj/structure/cable/yellow,/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/engine/engine_room) -"bS" = (/turf/simulated/floor/plating,/area/engine/engine_room) -"bT" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/engine_room) -"bU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating,/area/engine/engine_room) - -(1,1,1) = {" -aaaaaaaaabaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaacadaeaaacadaeaaacadaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaacafaeaaacafaeaaacafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -abababacafaeabacafaeabacafaeabababababaaaaagahahahahaiaiaiaiaiaiaiai -abajajajakajajajakajajajakajajajajajajalamanaoapaqarasatauavawaxayai -azaAaAaBaCaAaAaBaCaAaAaBaCaAaAaAaAaAaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRai -abajajajaSajajajaSajajajaSajajajajajajalamaTaUaVaWahaXaYaZbaasaQbbai -abababacbcaeabacbcaeabacbcaeabababababaaaabdahahahahbebfawbgbhbibjai -aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbmbkbkbnbobnbn -aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbpbqbkbrbsbtbn -aaaaaaacbcaeaaacbcaeaaacbcaeaaaaaaaaaaaaaaaaaaaaaabkblbubvbwbxbybzbn -aaaaaaacbAaeaaacbAaeaaacbAaeaaaaaaaaaaaaaaaaaaaaaabkbBbCbDbkbEbFbGbn -aaaaaaaaabaaaaaaabaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaabkbkbubHbkbnbIbnbn -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbKbLbMbNbObPbJ -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbQbRbSbSbTbUbJ -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJbJbJbJbJbJbJbJ -"} From c5ed0a8801e97f07ff5855b8f94bb65d1c2acef3 Mon Sep 17 00:00:00 2001 From: BlueNexus Date: Thu, 26 Nov 2015 13:04:34 +0000 Subject: [PATCH 030/148] Small bot optimisations --- bot/NanoTrasenBot.py | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py index e86009ef58..c243f1aa0e 100644 --- a/bot/NanoTrasenBot.py +++ b/bot/NanoTrasenBot.py @@ -190,15 +190,13 @@ tell_list = {} if CORE_DATA.DISABLE_ALL_NON_MANDATORY_SOCKET_CONNECTIONS: nudgeable = False try: - tiedosto = open("replacenames.cache","r") - replacenames = pickle.load(tiedosto) - tiedosto.close() + with open("replacenames.cache","r") as tiedosto: + replacenames = pickle.load(tiedosto) for i in replacenames.values(): if len(i) > call_me_max_length: replacenames[replacenames.keys()[replacenames.values().index(i)]] = i[:call_me_max_length] - tiedosto = open("replacenames.cache","w") - pickle.dump(replacenames,tiedosto) - tiedosto.close() + with open("replacenames.cache","w") as tiedosto: + pickle.dump(replacenames,tiedosto) if "[\0x01]" in i.lower() or "[\\0x01]" in i.lower(): i = i.replace("[\0x01]","") i = i.replace("[\0X01]","") @@ -211,13 +209,12 @@ except EOFError: #Cache corrupt replacenames = {} print "replacenames.cache is corrupt and couldn't be loaded." try: - tiedosto = open("peopleheknows.cache","r") - peopleheknows = pickle.load(tiedosto) - tiedosto.close() + with open("peopleheknows.cache","r") as tiedosto: + peopleheknows = pickle.load(tiedosto) except IOError: peopleheknows = [[],[]] - tiedosto = open("peopleheknows.cache","w") - tiedosto.close() + with open("peopleheknows.cache","w") as tiedosto: + pass except EOFError: peopleheknows = [[],[]] print "peopleheknows.cache is corrupt and couldn't be loaded." @@ -401,13 +398,12 @@ def target(who,how_long): if debug: print "Banned",who,"For",how_long,"seconds" if logbans: - tiedosto = open(targetdirectory+"banlog/"+str(int(start))+"-"+str(int(end))+".txt","w") - tiedosto.write("Start of ban on "+who+":"+str(int(start))) - tiedosto.write("\n") - tiedosto.write("End of ban on "+who+":"+str(int(end))) - tiedosto.write("\n") - tiedosto.write("In total:"+str(int(end-start))+"Seconds") - tiedosto.close() + with open(targetdirectory+"banlog/"+str(int(start))+"-"+str(int(end))+".txt","w") as tiedosto: + tiedosto.write("Start of ban on "+who+":"+str(int(start))) + tiedosto.write("\n") + tiedosto.write("End of ban on "+who+":"+str(int(end))) + tiedosto.write("\n") + tiedosto.write("In total:"+str(int(end-start))+"Seconds") else: CALL_OFF = False pass From dcfb65028f97ed4f6482201dcc5a7429583d04be Mon Sep 17 00:00:00 2001 From: BlueNexus Date: Thu, 26 Nov 2015 14:36:43 +0000 Subject: [PATCH 031/148] More withs --- bot/NanoTrasenBot.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py index c243f1aa0e..a58415124f 100644 --- a/bot/NanoTrasenBot.py +++ b/bot/NanoTrasenBot.py @@ -35,10 +35,9 @@ except ImportError: try: tiedosto = open("psycodownload.txt","r") except: - tiedosto = open("psycodownload.txt","w") - tiedosto.write("http://www.voidspace.org.uk/python/modules.shtml#psyco") - tiedosto.write("\nhttp://psyco.sourceforge.net/download.html") - tiedosto.close() + with open("psycodownload.txt","w") as tiedosto: + tiedosto.write("http://www.voidspace.org.uk/python/modules.shtml#psyco") + tiedosto.write("\nhttp://psyco.sourceforge.net/download.html") print "Check psycodownload.txt for a link" else: print "For god's sake, open psycodownload.txt" @@ -629,9 +628,8 @@ while True: arg = influx.lower()[8+len(prefix):] if debug: print truesender+":"+prefix+"suggest "+arg - tiedosto = open(targetdirectory+"suggestions/suggestions_"+str(int(time.time()))+".txt","a") - tiedosto.write(arg) - tiedosto.close() + with open(targetdirectory+"suggestions/suggestions_"+str(int(time.time()))+".txt","a") as tiedosto: + tiedosto.write(arg) conn.privmsg(targetchannel,"Suggestion received") elif cocheck( prefix+"help "): #Space in front of the ( to make sure that my command finder does not pick this up. arg = " ".join(influx.split(" ")[1:]).lower() From af545835111ed7c2b65ae8f8823616baa0407421 Mon Sep 17 00:00:00 2001 From: BlueNexus Date: Thu, 26 Nov 2015 16:10:33 +0000 Subject: [PATCH 032/148] Another small refactor --- bot/NanoTrasenBot.py | 50 ++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py index a58415124f..6f65a11daf 100644 --- a/bot/NanoTrasenBot.py +++ b/bot/NanoTrasenBot.py @@ -341,16 +341,14 @@ if aggressive_pinging: self_time = 0 global backup,disconnects,conn while disconnects < 5: - if backup > self_time: - if time.time()-backup > delay: - conn.send("PONG "+pongtarg) - print "Ponged" - self_time = time.time() - else: - if time.time()-self_time > delay: - conn.send("PONG "+pongtarg) - print "Ponged" - self_time = time.time() + if backup > self_time and time.time()-backup > delay: + conn.send("PONG "+pongtarg) + print "Ponged" + self_time = time.time() + elif time.time()-self_time > delay: + conn.send("PONG "+pongtarg) + print "Ponged" + self_time = time.time() time.sleep(refresh) thread.start_new_thread(aggressive_ping,(aggressive_pinging_delay,aggressive_pinging_refresh,)) def stop(sender,debug=1): @@ -366,16 +364,15 @@ def stop(sender,debug=1): access_granted = True else: access_granted = False - if access_granted: - if debug: - print sender+":"+prefix+"stop" - if random.randint(0,100) == 50: - conn.privmsg(channel,"Hammertime!") - else: - conn.privmsg(channel,"Shutting down.") - disconnects = 99999 - conn.quit() - return True + if access_granted and debug: + print sender+":"+prefix+"stop" + if random.randint(0,100) == 50: + conn.privmsg(channel,"Hammertime!") + else: + conn.privmsg(channel,"Shutting down.") + disconnects = 99999 + conn.quit() + return True else: conn.privmsg(channel,"You cannot command me") return False @@ -571,13 +568,12 @@ while True: time.sleep(6) Name = origname conn.nick(Name) - if origname in truesender: - if influx == prefix+"stop": - time.sleep(0.5) #A small delay - conn.privmsg(channel,"Shutting down.") - conn.quit() - disconnects = 99999 - break + if origname in truesender and influx == prefix+"stop": + time.sleep(0.5) #A small delay + conn.privmsg(channel,"Shutting down.") + conn.quit() + disconnects = 99999 + break if len(translateable) > 0 and enabled == True: people = "-5|5|1-".join(users).lower() if truesender.lower() in translateable: From b15497aa51b134e60a9f9c4172a5473b74897e4e Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Thu, 26 Nov 2015 20:27:51 +0000 Subject: [PATCH 033/148] info topic improvements --- code/world.dm | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/code/world.dm b/code/world.dm index 3a5f0a5f83..02d7d804a7 100644 --- a/code/world.dm +++ b/code/world.dm @@ -198,18 +198,32 @@ var/world_topic_spam_protect_time = world.timeofday return "Bad Key" - var/search = input["info"] - var/ckey = ckey(search) + var/list/search = params2list(input["info"]) + var/list/ckeysearch = list() + for(var/text in search) + ckeysearch += ckey(text) var/list/match = list() for(var/mob/M in mob_list) - if(findtext(M.name, search)) - match += M - else if(M.ckey == ckey) - match += M - else if(M.mind && findtext(M.mind.assigned_role, search)) - match += M + var/strings = list(M.name, M.ckey) + if(M.mind) + strings += M.mind.assigned_role + strings += M.mind.special_role + for(var/text in strings) + if(ckey(text) in ckeysearch) + match[M] += 10 // an exact match is far better than a partial one + else + for(var/searchstr in search) + if(findtext(text, searchstr)) + match[M] += 1 + + var/maxstrength = 0 + for(var/mob/M in match) + maxstrength = max(match[M], maxstrength) + for(var/mob/M in match) + if(match[M] < maxstrength) + match -= M if(!match.len) return "No matches" From 2d5677109f2383b5af04046c6eab9a741c7d5fef Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 29 Nov 2015 12:14:31 +0100 Subject: [PATCH 034/148] Build mode throws now admin logs. Fixes #11514. --- code/modules/admin/verbs/buildmode.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 2131e977ac..0ecc220ae2 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -296,3 +296,4 @@ if(pa.Find("right")) if(holder.throw_atom) holder.throw_atom.throw_at(object, 10, 1) + log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]") From 5958a25e808a1aa2a3c1e5706ef7f88d18a8abb1 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Mon, 30 Nov 2015 22:47:39 +0100 Subject: [PATCH 035/148] Fixes airlocks losing air, again. - Replaces #11123 - this PR fixes the issue itself, instead of using delays to work around the issue. - update_nearby_tiles() is now being called right after density is changed, instead of sleeping for 0.7 seconds. - Tested this in engineering shuttle dock airlock, which is one of few airlocks which don't have pump replenishing lost gas installed. Loss of air is minimal (few kilopascals, likely caused by airlocks opening at 5kPa as reaching pure vacuum would take too long) in comparsion to situation without this fix (where, once cycled out, you can't cycle back in without forcing the inner side of airlock) --- code/game/machinery/doors/door.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 65206b95f2..57bd4708dc 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -409,12 +409,12 @@ set_opacity(0) sleep(3) src.density = 0 + update_nearby_tiles() sleep(7) src.layer = open_layer explosion_resistance = 0 update_icon() set_opacity(0) - update_nearby_tiles() operating = 0 if(autoclose) @@ -436,12 +436,12 @@ src.density = 1 explosion_resistance = initial(explosion_resistance) src.layer = closed_layer + update_nearby_tiles() sleep(7) update_icon() if(visible && !glass) set_opacity(1) //caaaaarn! operating = 0 - update_nearby_tiles() //I shall not add a check every x ticks if a door has closed over some fire. var/obj/fire/fire = locate() in loc From e33ae21f75f3180c165e0d668b84255ef9427f19 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Mon, 30 Nov 2015 23:19:04 +0100 Subject: [PATCH 036/148] Adjusts APC emag behavior - Mostly under-the-hood changes. - Emagged APCs may now have their panel removed with screwdriver, so you can access wires - Emagged APCs no longer rely on locked var, instead they check for emagged var as mwerezak suggested. --- code/modules/power/apc.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a1811e496c..7f232d8041 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -479,8 +479,6 @@ user << "There is nothing to secure." return update_icon() - else if(emagged) - user << "The interface is broken." else wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" @@ -750,7 +748,7 @@ return var/list/data = list( - "locked" = locked, + "locked" = (locked && !emagged) ? 1 : 0, "isOperating" = operating, "externalPower" = main_status, "powerCellStatus" = cell ? cell.percent() : null, @@ -882,7 +880,7 @@ if(!can_use(usr, 1)) return 1 - if(!istype(usr, /mob/living/silicon) && locked) + if(!istype(usr, /mob/living/silicon) && (locked && !emagged)) // Shouldn't happen, this is here to prevent href exploits usr << "You must unlock the panel to use this!" return 1 From 1a293e2d9607a828cba59e5464c459d777982b0e Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 1 Dec 2015 08:48:47 +0100 Subject: [PATCH 037/148] Renames the rig mounted taser. Was previously called an energy gun, which could be mildly confusing. Port of https://github.com/PolarisSS13/Polaris/pull/127. --- code/modules/clothing/spacesuits/rig/modules/combat.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index d4bd12ec4b..ee9f16e1a2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -135,8 +135,8 @@ suit_overlay_active = "mounted-taser" suit_overlay_inactive = "mounted-taser" - interface_name = "mounted energy gun" - interface_desc = "A shoulder-mounted cell-powered energy gun." + interface_name = "mounted taser" + interface_desc = "A shoulder-mounted cell-powered taser." gun_type = /obj/item/weapon/gun/energy/taser/mounted From 44cb040e54d16ca3013a1ffab61267ae5190a5f4 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Tue, 1 Dec 2015 17:10:45 +0100 Subject: [PATCH 038/148] Fixes camera repair --- code/game/machinery/camera/camera.dm | 14 ++++++- code/game/machinery/camera/camera_assembly.dm | 10 +++-- html/changelogs/Hubblenaut-master.yml | 37 +++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 html/changelogs/Hubblenaut-master.yml diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index e2371bbeb2..52ff3d08a3 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -140,9 +140,19 @@ if(weld(W, user)) if(assembly) assembly.loc = src.loc - assembly.state = 1 + assembly.anchored = 1 + assembly.camera_name = c_tag + assembly.camera_network = english_list(network, "Exodus", ",", ",") + assembly.update_icon() + assembly.dir = src.dir assembly = null //so qdel doesn't eat it. - new /obj/item/stack/cable_coil(src.loc, length=2) + if(stat & BROKEN) + assembly.state = 2 + user << "You repaired \the [src] frame." + else + assembly.state = 1 + user << "You cut \the [src] free from the wall." + new /obj/item/stack/cable_coil(src.loc, length=2) qdel(src) // OTHER diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 75397278c0..86095dedfb 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -11,6 +11,8 @@ // Motion, EMP-Proof, X-Ray var/list/obj/item/possible_upgrades = list(/obj/item/device/assembly/prox_sensor, /obj/item/stack/material/osmium, /obj/item/weapon/stock_parts/scanning_module) var/list/upgrades = list() + var/camera_name + var/camera_network var/state = 0 var/busy = 0 /* @@ -47,7 +49,7 @@ else if(iswrench(W)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You unattach the assembly from it's place." + user << "You unattach the assembly from its place." anchored = 0 update_icon() state = 0 @@ -67,7 +69,7 @@ else if(iswelder(W)) if(weld(W, user)) - user << "You unweld the assembly from it's place." + user << "You unweld the assembly from its place." state = 1 anchored = 1 return @@ -78,7 +80,7 @@ if(isscrewdriver(W)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", "Exodus")) + var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", camera_network ? camera_network : "Exodus")) if(!input) usr << "No input found please hang up and try your call again." return @@ -90,7 +92,7 @@ var/area/camera_area = get_area(src) var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" - input = sanitizeSafe(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag), MAX_NAME_LEN) + input = sanitizeSafe(input(usr, "How would you like to name the camera?", "Set Camera Name", camera_name ? camera_name : temptag), MAX_NAME_LEN) state = 4 var/obj/machinery/camera/C = new(src.loc) diff --git a/html/changelogs/Hubblenaut-master.yml b/html/changelogs/Hubblenaut-master.yml new file mode 100644 index 0000000000..fca68d6451 --- /dev/null +++ b/html/changelogs/Hubblenaut-master.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Hubblenaut + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Welding a broken camera will use the correct icon." + - tweak: "Camera assemblies remember their tag and network from previous usage." From 11e47bc8c256c77ac6b20ca8f0fb8f7a1bb6398c Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 2 Dec 2015 08:29:27 +0100 Subject: [PATCH 039/148] Fixes being unable to emag secure closets. And ensures that this costs an emag charge. Also corrects emag_act calls. Partial port of https://github.com/PolarisSS13/Polaris/pull/377. --- code/game/objects/items/weapons/cards_ids.dm | 2 +- code/game/objects/items/weapons/storage/lockbox.dm | 4 ++-- .../crates_lockers/closets/secure/secure_closets.dm | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 17a27aa85e..07ed51c454 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -71,7 +71,7 @@ var/uses = 10 /obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user) - var/used_uses = A.emag_act(uses, user) + var/used_uses = A.emag_act(uses, user, src) if(used_uses < 0) return ..(A, user) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 297ac1d4b1..c904907f64 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -35,7 +35,7 @@ else user << "Access Denied" else if(istype(W, /obj/item/weapon/melee/energy/blade)) - if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) + if(emag_act(INFINITY, user, W, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() @@ -55,7 +55,7 @@ ..() return -/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback = "", var/audible_feedback = "") +/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") if(!broken) if(visual_feedback) visual_feedback = "[visual_feedback]" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 7401aac67b..395eb13df0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -90,7 +90,7 @@ else togglelock(user) -/obj/structure/closet/secure_closet/attack_hand(var/remaining_charges, var/mob/user, var/visual_feedback, var/audible_feedback) +/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") if(!broken) broken = 1 locked = 0 @@ -100,8 +100,11 @@ if(visual_feedback) visible_message(visual_feedback, audible_feedback) + else if(user && emag_source) + visible_message("\The [src] has been broken by \the [user] with \an [emag_source]!", "You hear a faint electrical spark.") else - visible_message("The locker has been broken by [user] with an electromagnetic card!", "You hear a faint electrical spark.") + visible_message("\The [src] sparks and breaks open!", "You hear a faint electrical spark.") + return 1 /obj/structure/closet/secure_closet/attack_hand(mob/user as mob) src.add_fingerprint(user) From 2560c1381666b47672d69bf46125892bc7a2b1da Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 2 Dec 2015 08:56:11 +0100 Subject: [PATCH 040/148] Fixes hemostat surgery. Port of https://github.com/PolarisSS13/Polaris/pull/381. --- baystation12.dme | 2 ++ code/modules/surgery/_defines.dm | 1 + code/modules/surgery/organs_internal.dm | 12 ++++++------ code/modules/surgery/robotics.dm | 12 ++++++------ code/modules/surgery/surgery.dm | 2 +- code/modules/surgery/~defines.dm | 1 + 6 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 code/modules/surgery/_defines.dm create mode 100644 code/modules/surgery/~defines.dm diff --git a/baystation12.dme b/baystation12.dme index 8493df7095..3bfd0149a7 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1696,6 +1696,7 @@ #include "code\modules\spells\targeted\projectile\magic_missile.dm" #include "code\modules\spells\targeted\projectile\projectile.dm" #include "code\modules\supermatter\supermatter.dm" +#include "code\modules\surgery\_defines.dm" #include "code\modules\surgery\bones.dm" #include "code\modules\surgery\encased.dm" #include "code\modules\surgery\face.dm" @@ -1707,6 +1708,7 @@ #include "code\modules\surgery\robotics.dm" #include "code\modules\surgery\slimes.dm" #include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\~defines.dm" #include "code\modules\tables\flipping.dm" #include "code\modules\tables\interactions.dm" #include "code\modules\tables\presets.dm" diff --git a/code/modules/surgery/_defines.dm b/code/modules/surgery/_defines.dm new file mode 100644 index 0000000000..900f3e4545 --- /dev/null +++ b/code/modules/surgery/_defines.dm @@ -0,0 +1 @@ +#define SURGERY_FAILURE -1 diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index d352c4aed4..b73509ddd2 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -273,11 +273,11 @@ if((affected.status & ORGAN_ROBOT) && !(O.status & ORGAN_ROBOT)) user << "You cannot install a naked organ into a robotic body." - return 2 + return SURGERY_FAILURE if(!target.species) user << "\red You have no idea what species this person is. Report this on the bug tracker." - return 2 + return SURGERY_FAILURE var/o_is = (O.gender == PLURAL) ? "are" : "is" var/o_a = (O.gender == PLURAL) ? "" : "a " @@ -289,22 +289,22 @@ if(O.damage > (O.max_damage * 0.75)) user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." - return 2 + return SURGERY_FAILURE if(!target.internal_organs_by_name[O.organ_tag]) organ_missing = 1 else user << "\red \The [target] already has [o_a][O.organ_tag]." - return 2 + return SURGERY_FAILURE if(O && affected.limb_name == O.parent_organ) organ_compatible = 1 else user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.name]." - return 2 + return SURGERY_FAILURE else user << "\red You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]." - return 2 + return SURGERY_FAILURE return ..() && organ_missing && organ_compatible diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index dc626ec60a..acdec5f2fd 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -171,7 +171,7 @@ if(istype(C)) if(!C.get_amount() >= 3) user << "You need three or more cable pieces to repair this damage." - return 2 + return SURGERY_FAILURE C.use(3) return 1 return 0 @@ -383,23 +383,23 @@ if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) user << "That brain is not usable." - return 2 + return SURGERY_FAILURE if(!(affected.status & ORGAN_ROBOT)) user << "You cannot install a computer brain into a meat skull." - return 2 + return SURGERY_FAILURE if(!target.species) user << "You have no idea what species this person is. Report this on the bug tracker." - return 2 + return SURGERY_FAILURE if(!target.species.has_organ["brain"]) user << "You're pretty sure [target.species.name_plural] don't normally have a brain." - return 2 + return SURGERY_FAILURE if(!isnull(target.internal_organs["brain"])) user << "Your subject already has a brain." - return 2 + return SURGERY_FAILURE return 1 diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 6e57a4f37b..116f15b4c3 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -91,7 +91,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) if(S.tool_quality(tool)) var/step_is_valid = S.can_use(user, M, zone, tool) if(step_is_valid && S.is_valid_target(M)) - if(step_is_valid == 2) // This is a failure that already has a message for failing. + if(step_is_valid == SURGERY_FAILURE) // This is a failure that already has a message for failing. return 1 M.op_stage.in_progress += zone S.begin_step(user, M, zone, tool) //start on it diff --git a/code/modules/surgery/~defines.dm b/code/modules/surgery/~defines.dm new file mode 100644 index 0000000000..6b27ac56f5 --- /dev/null +++ b/code/modules/surgery/~defines.dm @@ -0,0 +1 @@ +#undef SURGERY_FAILURE From 89d20b9195fb999b76d235a8bff53ad19466d622 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 2 Dec 2015 09:16:04 +0100 Subject: [PATCH 041/148] Updates macro/span use. --- code/modules/surgery/organs_internal.dm | 52 +++++++++--------- code/modules/surgery/robotics.dm | 72 ++++++++++++------------- code/modules/surgery/surgery.dm | 6 +-- 3 files changed, 65 insertions(+), 65 deletions(-) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index b73509ddd2..f0025b7429 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -45,7 +45,7 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user] rips the larva out of [target]'s ribcage!", + user.visible_message("[user] rips the larva out of [target]'s ribcage!", "You rip the larva out of [target]'s ribcage!") for(var/obj/item/alien_embryo/A in target) @@ -112,8 +112,8 @@ for(var/obj/item/organ/I in affected.internal_organs) if(I && I.damage > 0) if(I.robotic < 2) - user.visible_message("\blue [user] treats damage to [target]'s [I.name] with [tool_name].", \ - "\blue You treat damage to [target]'s [I.name] with [tool_name]." ) + user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \ + "You treat damage to [target]'s [I.name] with [tool_name]." ) I.damage = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -122,8 +122,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") var/dam_amt = 2 if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) @@ -185,8 +185,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \ - "\blue You have separated [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have separated [target]'s [target.op_stage.current_organ] with \the [tool].") var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] if(I && istype(I)) @@ -194,8 +194,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, rand(30,50), 1) /datum/surgery_step/internal/remove_organ @@ -236,8 +236,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has removed [target]'s [target.op_stage.current_organ] with \the [tool].", \ - "\blue You have removed [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has removed [target]'s [target.op_stage.current_organ] with \the [tool].", \ + "You have removed [target]'s [target.op_stage.current_organ] with \the [tool].") // Extract the organ! if(target.op_stage.current_organ) @@ -248,8 +248,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 20) /datum/surgery_step/internal/replace_organ @@ -276,7 +276,7 @@ return SURGERY_FAILURE if(!target.species) - user << "\red You have no idea what species this person is. Report this on the bug tracker." + user << "You have no idea what species this person is. Report this on the bug tracker." return SURGERY_FAILURE var/o_is = (O.gender == PLURAL) ? "are" : "is" @@ -288,22 +288,22 @@ else if(target.species.has_organ[O.organ_tag]) if(O.damage > (O.max_damage * 0.75)) - user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." + user << "\The [O.organ_tag] [o_is] in no state to be transplanted." return SURGERY_FAILURE if(!target.internal_organs_by_name[O.organ_tag]) organ_missing = 1 else - user << "\red \The [target] already has [o_a][O.organ_tag]." + user << "\The [target] already has [o_a][O.organ_tag]." return SURGERY_FAILURE if(O && affected.limb_name == O.parent_organ) organ_compatible = 1 else - user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.name]." + user << "\The [O.organ_tag] [o_do] normally go in \the [affected.name]." return SURGERY_FAILURE else - user << "\red You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]." + user << "You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]." return SURGERY_FAILURE return ..() && organ_missing && organ_compatible @@ -317,16 +317,16 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has transplanted \the [tool] into [target]'s [affected.name].", \ - "\blue You have transplanted \the [tool] into [target]'s [affected.name].") + user.visible_message("[user] has transplanted \the [tool] into [target]'s [affected.name].", \ + "You have transplanted \the [tool] into [target]'s [affected.name].") var/obj/item/organ/O = tool if(istype(O)) user.remove_from_mob(O) O.replaced(target,affected) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \ - "\red Your hand slips, damaging \the [tool]!") + user.visible_message("[user]'s hand slips, damaging \the [tool]!", \ + "Your hand slips, damaging \the [tool]!") var/obj/item/organ/I = tool if(istype(I)) I.take_damage(rand(3,5),0) @@ -367,8 +367,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ - "\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] if(I && istype(I)) @@ -376,8 +376,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 20) ////////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index acdec5f2fd..24bc848472 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -44,14 +44,14 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ - "\blue You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",) + user.visible_message("[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + "You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",) affected.open = 1 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \ - "\red Your [tool] slips, failing to unscrew [target]'s [affected.name].") + user.visible_message("[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \ + "Your [tool] slips, failing to unscrew [target]'s [affected.name].") /datum/surgery_step/robotics/open_hatch allowed_tools = list( @@ -76,14 +76,14 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ - "\blue You open the maintenance hatch on [target]'s [affected.name] with \the [tool]." ) + user.visible_message("[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + "You open the maintenance hatch on [target]'s [affected.name] with \the [tool].") affected.open = 2 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].", - "\red Your [tool] slips, failing to open the hatch on [target]'s [affected.name].") + user.visible_message("[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].", + "Your [tool] slips, failing to open the hatch on [target]'s [affected.name].") /datum/surgery_step/robotics/close_hatch allowed_tools = list( @@ -108,15 +108,15 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \ - "\blue You close and secure the hatch on [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \ + "You close and secure the hatch on [target]'s [affected.name] with \the [tool].") affected.open = 0 affected.germ_level = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].", - "\red Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].") + user.visible_message("[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].", + "Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].") /datum/surgery_step/robotics/repair_brute allowed_tools = list( @@ -144,14 +144,14 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \ - "\blue You finish patching damage to [target]'s [affected.name] with \the [tool].") + user.visible_message("[user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \ + "You finish patching damage to [target]'s [affected.name] with \the [tool].") affected.heal_damage(rand(30,50),0,1,1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].", - "\red Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].") + user.visible_message("[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].", + "Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].") target.apply_damage(rand(5,10), BURN, affected) /datum/surgery_step/robotics/repair_burn @@ -184,14 +184,14 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] finishes splicing cable into [target]'s [affected.name].", \ - "\blue You finishes splicing new cable into [target]'s [affected.name].") + user.visible_message("[user] finishes splicing cable into [target]'s [affected.name].", \ + "You finishes splicing new cable into [target]'s [affected.name].") affected.heal_damage(0,rand(30,50),1,1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user] causes a short circuit in [target]'s [affected.name]!", - "\red You cause a short circuit in [target]'s [affected.name]!") + user.visible_message("[user] causes a short circuit in [target]'s [affected.name]!", + "You cause a short circuit in [target]'s [affected.name]!") target.apply_damage(rand(5,10), BURN, affected) /datum/surgery_step/robotics/fix_organ_robotic //For artificial organs @@ -242,8 +242,8 @@ if(I && I.damage > 0) if(I.robotic >= 2) - user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \ - "\blue You repair [target]'s [I.name] with [tool]." ) + user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \ + "You repair [target]'s [I.name] with [tool]." ) I.damage = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -252,8 +252,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!") target.adjustToxLoss(5) affected.createwound(CUT, 5) @@ -301,16 +301,16 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \ - "\blue You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].") var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] if(I && istype(I)) I.status |= ORGAN_CUT_AWAY fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, disconnecting \the [tool].", \ - "\red Your hand slips, disconnecting \the [tool].") + user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \ + "Your hand slips, disconnecting \the [tool].") /datum/surgery_step/robotics/attach_organ_robotic allowed_tools = list( @@ -349,16 +349,16 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ - "\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] if(I && istype(I)) I.status &= ~ORGAN_CUT_AWAY fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, disconnecting \the [tool].", \ - "\red Your hand slips, disconnecting \the [tool].") + user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \ + "Your hand slips, disconnecting \the [tool].") /datum/surgery_step/robotics/install_mmi allowed_tools = list( @@ -411,8 +411,8 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has installed \the [tool] into [target]'s [affected.name].", \ - "\blue You have installed \the [tool] into [target]'s [affected.name].") + user.visible_message("[user] has installed \the [tool] into [target]'s [affected.name].", \ + "You have installed \the [tool] into [target]'s [affected.name].") var/obj/item/device/mmi/M = tool var/obj/item/organ/mmi_holder/holder = new(target, 1) @@ -426,5 +426,5 @@ M.brainmob.mind.transfer_to(target) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips.", \ - "\red Your hand slips.") \ No newline at end of file + user.visible_message("[user]'s hand slips.", \ + "Your hand slips.") \ No newline at end of file diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 116f15b4c3..cc56b311b5 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -84,7 +84,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) return 0 var/zone = user.zone_sel.selecting if(zone in M.op_stage.in_progress) //Can't operate on someone repeatedly. - user << "\red You can't operate on this area while surgery is already in progress." + user << "You can't operate on this area while surgery is already in progress." return 1 for(var/datum/surgery_step/S in surgery_steps) //check if tool is right or close enough and if this step is possible @@ -101,7 +101,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) else if ((tool in user.contents) && user.Adjacent(M)) //or S.fail_step(user, M, zone, tool) //malpractice~ else // This failing silently was a pain. - user << "\red You must remain close to your patient to conduct surgery." + user << "You must remain close to your patient to conduct surgery." M.op_stage.in_progress -= zone // Clear the in-progress flag. if (ishuman(M)) var/mob/living/carbon/human/H = M @@ -109,7 +109,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) return 1 //don't want to do weapony things after surgery if (user.a_intent == I_HELP) - user << "\red You can't see any useful way to use [tool] on [M]." + user << "You can't see any useful way to use [tool] on [M]." return 1 return 0 From c7e7c05a34b1a1082a9ecb890341eb051b24ec1f Mon Sep 17 00:00:00 2001 From: Atlantis Date: Wed, 2 Dec 2015 11:14:41 +0100 Subject: [PATCH 042/148] Fixes #11546 --- .../research/xenoarchaeology/machinery/artifact_analyser.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm index 99113bd1f2..b449237d77 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm @@ -85,6 +85,7 @@ var/obj/machinery/artifact/A = scanned_object A.anchored = 0 A.being_used = 0 + scanned_object = null /obj/machinery/artifact_analyser/Topic(href, href_list) if(href_list["begin_scan"]) @@ -97,8 +98,8 @@ continue if(O.invisibility) continue - if(istype(scanned_object, /obj/machinery/artifact)) - var/obj/machinery/artifact/A = scanned_object + if(istype(O, /obj/machinery/artifact)) + var/obj/machinery/artifact/A = O if(A.being_used) artifact_in_use = 1 else From 89f5c9f4056fff5dde20ccec051811748243dc74 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Wed, 2 Dec 2015 11:27:28 +0100 Subject: [PATCH 043/148] Fixes #11540 --- code/game/objects/structures/crates_lockers/closets.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 40a8c9d38d..08a2a5af23 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -172,19 +172,18 @@ if(1) for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion A.forceMove(src.loc) - A.ex_act(severity++) + A.ex_act(severity + 1) qdel(src) if(2) if(prob(50)) for (var/atom/movable/A as mob|obj in src) A.forceMove(src.loc) - A.ex_act(severity++) + A.ex_act(severity + 1) qdel(src) if(3) if(prob(5)) for(var/atom/movable/A as mob|obj in src) A.forceMove(src.loc) - A.ex_act(severity++) qdel(src) /obj/structure/closet/proc/damage(var/damage) From cc72f823719946e11a274d7a2c2a9e47c8b72ffe Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 3 Dec 2015 21:50:24 +0100 Subject: [PATCH 044/148] Backports NanoUI fixes from dev. Fixes #11579. --- code/modules/nano/modules/crew_monitor.dm | 2 +- code/modules/nano/modules/power_monitor.dm | 2 +- code/modules/nano/nanoui.dm | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index b38ac80515..3d0cdac657 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -2,7 +2,7 @@ name = "Crew monitor" /obj/nano_module/crew_monitor/Topic(href, href_list) - if(..()) return + if(..()) return 1 var/turf/T = get_turf(src) if (!T || !(T.z in config.player_levels)) usr << "Unable to establish a connection: You're too far away from the station!" diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index ed7c64aa94..b0bf72f39a 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -47,7 +47,7 @@ // Allows us to process UI clicks, which are relayed in form of hrefs. /obj/nano_module/power_monitor/Topic(href, href_list) if(..()) - return + return 1 if( href_list["clear"] ) active_sensor = null if( href_list["refresh"] ) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 74c21d4982..e1db4b4cc6 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -140,6 +140,7 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) + src_object = src_object.nano_host() var/new_status = src_object.CanUseTopic(user, state) if(master_ui) new_status = min(new_status, master_ui.status) From 556196420414b7b790b6458f2bbe2d7d79ccaeab Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 4 Dec 2015 16:49:21 +1030 Subject: [PATCH 045/148] Tweaks to previous commits. --- code/__defines/damage_organs.dm | 24 +++++++++---------- code/game/machinery/rechargestation.dm | 3 ++- code/modules/client/preferences.dm | 5 ++-- code/modules/mob/language/station.dm | 6 ++--- .../living/carbon/human/species/species.dm | 3 +++ .../carbon/human/species/station/station.dm | 5 +++- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 4e3270b332..ca9cd28510 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -29,18 +29,18 @@ #define FIRE_DAMAGE_MODIFIER 0.0215 // Higher values result in more external fire damage to the skin. (default 0.0215) #define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025) -/*// Organ defines. -#define ORGAN_CUT_AWAY 1<<0 -#define ORGAN_BLEEDING 1<<1 -#define ORGAN_BROKEN 1<<2 -#define ORGAN_DESTROYED 1<<3 -#define ORGAN_ROBOT 1<<4 -#define ORGAN_SPLINTED 1<<5 -#define ORGAN_DEAD 1<<6 -#define ORGAN_MUTATED 1<<7 -#define ORGAN_ASSISTED 1<<8*/ - // Organ defines. +#define ORGAN_CUT_AWAY (1<<0) +#define ORGAN_BLEEDING (1<<1) +#define ORGAN_BROKEN (1<<2) +#define ORGAN_DESTROYED (1<<3) +#define ORGAN_ROBOT (1<<4) +#define ORGAN_SPLINTED (1<<5) +#define ORGAN_DEAD (1<<6) +#define ORGAN_MUTATED (1<<7) +#define ORGAN_ASSISTED (1<<8) + +/*// Organ defines. #define ORGAN_CUT_AWAY 1 #define ORGAN_BLEEDING 2 #define ORGAN_BROKEN 4 @@ -49,7 +49,7 @@ #define ORGAN_SPLINTED 32 #define ORGAN_DEAD 64 #define ORGAN_MUTATED 128 -#define ORGAN_ASSISTED 256 +#define ORGAN_ASSISTED 256*/ #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 01d3d72dac..c35c419a42 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -105,8 +105,9 @@ R.adjustFireLoss(-wire_rate) else if(istype(occupant, /mob/living/carbon/human)) var/mob/living/carbon/human/H = occupant - if(!isnull(H.internal_organs_by_name["cell"] && H.nutrition < 450)) + if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) H.nutrition = min(H.nutrition+10, 450) + cell.use(7000/450*10) /obj/machinery/recharge_station/examine(mob/user) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1cbdc09594..08f991dacd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1184,8 +1184,9 @@ datum/preferences var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) var/new_name - if(species == "Machine") - new_name = sanitizeName(raw_name,,1) + var/datum/species/S = all_species[species] + if(istype(S)) + new_name = S.sanitize_name(raw_name) else new_name = sanitizeName(raw_name) if(new_name) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index a0b686a314..e391dd2d0f 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -107,12 +107,10 @@ space_chance = 10 /datum/language/machine/get_random_name() - var/new_name if(prob(70)) - new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" + return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" else - new_name = pick(ai_names) - return new_name + return pick(ai_names) //Syllable Lists /* diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index feb0725d5c..f31d396fde 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -154,6 +154,9 @@ for(var/u_type in unarmed_types) unarmed_attacks += new u_type() +/datum/species/proc/sanitize_name(var/new_name) + return sanitizeName(new_name) + /datum/species/proc/get_station_variant() return name diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 403f086159..20695578ff 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -266,7 +266,7 @@ cold_level_2 = -1 cold_level_3 = -1 - heat_level_1 = 398.15 // Start taking damage above ~125 Degrees C + heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage heat_level_2 = 1000 heat_level_3 = 2000 @@ -312,3 +312,6 @@ H.h_style = "" spawn(100) if(H) H.update_hair() + +/datum/species/machine/sanitize_name(var/new_name) + return sanitizeName(new_name,allow_numbers=1) From fd59c3ad76bdd755b6bf51f6513cf0ada4ecca94 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 4 Dec 2015 17:08:48 +1030 Subject: [PATCH 046/148] More tweaks to IPC fixes. --- code/__defines/damage_organs.dm | 11 ----------- code/game/machinery/rechargestation.dm | 8 ++++---- code/modules/client/preferences_savefile.dm | 11 ++++++----- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index ca9cd28510..6a2fa0c267 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -40,17 +40,6 @@ #define ORGAN_MUTATED (1<<7) #define ORGAN_ASSISTED (1<<8) -/*// Organ defines. -#define ORGAN_CUT_AWAY 1 -#define ORGAN_BLEEDING 2 -#define ORGAN_BROKEN 4 -#define ORGAN_DESTROYED 8 -#define ORGAN_ROBOT 16 -#define ORGAN_SPLINTED 32 -#define ORGAN_DEAD 64 -#define ORGAN_MUTATED 128 -#define ORGAN_ASSISTED 256*/ - #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 #define DROPLIMB_BURN 2 diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index c35c419a42..1891170020 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -207,14 +207,14 @@ /obj/machinery/recharge_station/proc/go_in(var/mob/living/silicon/robot/R) + if(occupant) + return + if(istype(R, /mob/living/silicon/robot)) - if(!istype(R)) - return - if(occupant) - return if(R.incapacitated()) return + if(!R.cell) return diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index f1b7eb5e0d..3de456d9e7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -189,14 +189,15 @@ //Sanitize metadata = sanitize_text(metadata, initial(metadata)) - if(species == "Machine") - real_name = sanitizeName(real_name,,1) - else - real_name = sanitizeName(real_name) - if(isnull(species) || !(species in playable_species)) species = "Human" + var/datum/species/cur_species = all_species[species] + if(istype(cur_species)) + real_name = cur_species.sanitize_name(real_name) + else + real_name = sanitizeName(real_name) + if(isnum(underwear)) var/list/undies = gender == MALE ? underwear_m : underwear_f underwear = undies[undies[underwear]] From 7c85f846eb873385f85119bbfa6a19a6646c6bfa Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 4 Dec 2015 17:38:58 +1030 Subject: [PATCH 047/148] put_in_hands() refactor. --- code/game/objects/items.dm | 3 + .../objects/items/devices/chameleonproj.dm | 2 + code/modules/mob/inventory.dm | 56 +++++-------------- code/modules/mob/living/carbon/human/human.dm | 39 +++++++++++++ .../species/xenomorphs/alien_facehugger.dm | 1 + 5 files changed, 58 insertions(+), 43 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2a68cb87f7..fef7336371 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -242,6 +242,9 @@ // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(var/mob/user, var/slot) + layer = 20 + if(user.client) user.client.screen |= src + if(user.pulling == src) user.stop_pulling() return //Defines which slots correspond to which slot flags diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index f7ef8ad5c2..5a97968e93 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -18,9 +18,11 @@ /obj/item/device/chameleon/dropped() disrupt() + ..() /obj/item/device/chameleon/equipped() disrupt() + ..() /obj/item/device/chameleon/attack_self() toggle() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index d820e89cf9..8944bc3109 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -103,64 +103,34 @@ var/list/slot_equipment_priority = list( \ //Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_l_hand(var/obj/item/W) - if(lying) return 0 - if(!istype(W)) return 0 - if(!l_hand) - W.forceMove(src) //TODO: move to equipped? - l_hand = W - W.layer = 20 //TODO: move to equipped? -// l_hand.screen_loc = ui_lhand - W.equipped(src,slot_l_hand) - if(client) client.screen |= W - if(pulling == W) stop_pulling() - update_inv_l_hand() - return 1 - return 0 + if(lying || !istype(W)) + return 0 + return 1 //Puts the item into your r_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_r_hand(var/obj/item/W) - if(lying) return 0 - if(!istype(W)) return 0 - if(!r_hand) - W.forceMove(src) - r_hand = W - W.layer = 20 -// r_hand.screen_loc = ui_rhand - W.equipped(src,slot_r_hand) - if(client) client.screen |= W - if(pulling == W) stop_pulling() - update_inv_r_hand() - return 1 - return 0 + if(lying || !istype(W)) + return 0 + return 1 //Puts the item into our active hand if possible. returns 1 on success. /mob/proc/put_in_active_hand(var/obj/item/W) - if(hand) return put_in_l_hand(W) - else return put_in_r_hand(W) + return 0 // Moved to human procs because only they need to use hands. //Puts the item into our inactive hand if possible. returns 1 on success. /mob/proc/put_in_inactive_hand(var/obj/item/W) - if(hand) return put_in_r_hand(W) - else return put_in_l_hand(W) + return 0 // As above. //Puts the item our active hand if possible. Failing that it tries our inactive hand. Returns 1 on success. //If both fail it drops it on the floor and returns 0. //This is probably the main one you need to know :) /mob/proc/put_in_hands(var/obj/item/W) - if(!W) return 0 - if(put_in_active_hand(W)) - update_inv_l_hand() - update_inv_r_hand() - return 1 - else if(put_in_inactive_hand(W)) - update_inv_l_hand() - update_inv_r_hand() - return 1 - else - W.forceMove(get_turf(src)) - W.layer = initial(W.layer) - W.dropped() + if(!W) return 0 + W.forceMove(get_turf(src)) + W.layer = initial(W.layer) + W.dropped() + return 0 // Removes an item from inventory and places it in the target atom. // If canremove or other conditions need to be checked then use unEquip instead. diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 308f2359e1..5abb81b8dd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1383,3 +1383,42 @@ get_scooped(H) return return ..() + +//Puts the item into our active hand if possible. returns 1 on success. +/mob/living/carbon/human/put_in_active_hand(var/obj/item/W) + return (hand ? put_in_l_hand(W) : put_in_r_hand(W)) + +//Puts the item into our inactive hand if possible. returns 1 on success. +/mob/living/carbon/human/put_in_inactive_hand(var/obj/item/W) + return (hand ? put_in_r_hand(W) : put_in_l_hand(W)) + +/mob/living/carbon/human/put_in_hands(var/obj/item/W) + if(!W) + return 0 + if(put_in_active_hand(W)) + update_inv_l_hand() + update_inv_r_hand() + return 1 + else if(put_in_inactive_hand(W)) + update_inv_l_hand() + update_inv_r_hand() + return 1 + else + return ..() + +/mob/living/carbon/human/put_in_l_hand(var/obj/item/W) + if(!..() || l_hand) + return 0 + W.forceMove(src) + l_hand = W + W.equipped(src,slot_l_hand) + update_inv_l_hand() + return 1 + +/mob/living/carbon/human/put_in_r_hand(var/obj/item/W) + if(!..() || r_hand) + return 0 + W.forceMove(src) + r_hand = W + W.equipped(src,slot_r_hand) + update_inv_r_hand() diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm index d6767fbbc4..34455a47a1 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm @@ -70,6 +70,7 @@ var/const/MAX_ACTIVE_TIME = 400 return /obj/item/clothing/mask/facehugger/equipped(mob/M) + ..() Attach(M) /obj/item/clothing/mask/facehugger/Crossed(atom/target) From 0cf5a709d1b9059f150e6123d0148ee347517e68 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 4 Dec 2015 17:55:21 +1030 Subject: [PATCH 048/148] Refactored give(). --- code/modules/mob/living/carbon/give.dm | 83 +++++++++++--------------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 579321a512..e9e3392dd4 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,53 +1,42 @@ -mob/living/carbon/verb/give(var/mob/living/carbon/target in view(1)-usr) +/mob/living/carbon/human/verb/give(var/mob/living/target in view(1)-usr) set category = "IC" set name = "Give" - if(!istype(target) || target.stat == 2 || usr.stat == 2|| target.client == null) + + // TODO : Change to incapacitated() on merge. + if(usr.stat || usr.lying || usr.resting || usr.buckled) return - var/obj/item/I - if(!usr.hand && usr.r_hand == null) - usr << "You don't have anything in your right hand to give to [target.name]" + if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null) return - if(usr.hand && usr.l_hand == null) - usr << "You don't have anything in your left hand to give to [target.name]" - return - if(usr.hand) - I = usr.l_hand - else if(!usr.hand) - I = usr.r_hand + + var/obj/item/I = usr.get_active_hand() if(!I) + I = usr.get_inactive_hand() + if(!I) + usr << "You don't have anything in your hands to give to \the [target]." return - if(target.r_hand == null || target.l_hand == null) - switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No")) - if("Yes") - if(!I) - return - if(!Adjacent(usr)) - usr << "You need to stay in reaching distance while giving an object." - target << "[usr.name] moved too far away." - return - if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) - usr << "You need to keep the item in your active hand." - target << "[usr.name] seem to have given up on giving \the [I.name] to you." - return - if(target.r_hand != null && target.l_hand != null) - target << "Your hands are full." - usr << "Their hands are full." - return - else - usr.drop_item() - if(target.r_hand == null) - target.r_hand = I - else - target.l_hand = I - I.loc = target - I.layer = 20 - I.add_fingerprint(target) - target.update_inv_l_hand() - target.update_inv_r_hand() - usr.update_inv_l_hand() - usr.update_inv_r_hand() - target.visible_message("[usr.name] handed \the [I.name] to [target.name].") - if("No") - target.visible_message("[usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") - else - usr << "[target.name]'s hands are full." + + if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No") + target.visible_message("\The [usr] tried to hand \the [I] to \the [target], \ + but \the [target] didn't want it.") + return + + if(!I) return + + if(!Adjacent(target)) + usr << "You need to stay in reaching distance while giving an object." + target << "\The [usr] moved too far away." + return + + if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I)) + usr << "You need to keep the item in your hands." + target << "\The [usr] seems to have given up on passing \the [I] to you." + return + + if(target.r_hand != null && target.l_hand != null) + target << "Your hands are full." + usr << "Their hands are full." + return + + usr.unEquip(I) + target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. + target.visible_message("\The [usr] handed \the [I] to \the [target].") From 398541f4ebae351467c5f3418692d4fafdf4cb6d Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 4 Dec 2015 18:14:40 +1030 Subject: [PATCH 049/148] Amendments. --- code/modules/mob/living/carbon/human/human.dm | 3 +++ code/modules/mob/living/carbon/human/inventory.dm | 8 -------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5abb81b8dd..5da1ea100f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1412,6 +1412,7 @@ W.forceMove(src) l_hand = W W.equipped(src,slot_l_hand) + W.add_fingerprint(src) update_inv_l_hand() return 1 @@ -1421,4 +1422,6 @@ W.forceMove(src) r_hand = W W.equipped(src,slot_r_hand) + W.add_fingerprint(src) update_inv_r_hand() + return 1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c3b115e4f9..83d5757949 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,15 +1,7 @@ /* Add fingerprints to items when we put them in our hands. This saves us from having to call add_fingerprint() any time something is put in a human's hands programmatically. - */ -/mob/living/carbon/human/put_in_l_hand(var/obj/item/W) - . = ..() - if(.) W.add_fingerprint(src) - -/mob/living/carbon/human/put_in_r_hand(var/obj/item/W) - . = ..() - if(.) W.add_fingerprint(src) /mob/living/carbon/human/verb/quick_equip() set name = "quick-equip" From c946ca7468b2cbb5b907598e9444fbe889b94c20 Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Thu, 3 Dec 2015 23:45:13 -0800 Subject: [PATCH 050/148] cleaning up recharge station's go_in proc by implementing a helper. --- code/game/machinery/rechargestation.dm | 54 ++++++++++++-------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 1891170020..980a2b3ee2 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -88,7 +88,7 @@ //Processes the occupant, drawing from the internal power cell if needed. /obj/machinery/recharge_station/proc/process_occupant() - if(istype(occupant, /mob/living/silicon/robot)) + if(isrobot(occupant)) var/mob/living/silicon/robot/R = occupant if(R.module) @@ -103,7 +103,7 @@ R.adjustBruteLoss(-weld_rate) if(wire_rate && R.getFireLoss() && cell.checked_use(wire_power_use * wire_rate * CELLRATE)) R.adjustFireLoss(-wire_rate) - else if(istype(occupant, /mob/living/carbon/human)) + else if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) H.nutrition = min(H.nutrition+10, 450) @@ -205,38 +205,30 @@ /obj/machinery/recharge_station/Bumped(var/mob/living/silicon/robot/R) go_in(R) -/obj/machinery/recharge_station/proc/go_in(var/mob/living/silicon/robot/R) - +/obj/machinery/recharge_station/proc/go_in(var/mob/M) if(occupant) return - - if(istype(R, /mob/living/silicon/robot)) - - if(R.incapacitated()) - return - - if(!R.cell) - return - - add_fingerprint(R) - R.reset_view(src) - R.forceMove(src) - occupant = R - update_icon() - return 1 - - else if(istype(R, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = R - if(!isnull(H.internal_organs_by_name["cell"])) - add_fingerprint(H) - H.reset_view(src) - H.forceMove(src) - occupant = H - update_icon() - return 1 - else + if(!hascell(M)) return + add_fingerprint(M) + M.reset_view(src) + M.forceMove(src) + occupant = M + update_icon() + return 1 + +/obj/machinery/recharge_station/proc/hascell(var/mob/M) + if(isrobot(M)) + var/mob/living/silicon/robot/R = M + if(R.cell) + return 1 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!isnull(H.internal_organs_by_name["cell"])) + return 1 + return 0 + /obj/machinery/recharge_station/proc/go_out() if(!occupant) return @@ -263,4 +255,6 @@ set name = "Enter Recharger" set src in oview(1) + if(!usr.incapacitated()) + return go_in(usr) From 67ba794f0cb8f867c9dfd9e9aa1b99493d838801 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 4 Dec 2015 09:12:15 +0100 Subject: [PATCH 051/148] Corrects Wizard spell overlay positioning. Includes some Destroy() cleanup. Fixes the rest of #11583. Fixes #11555. --- code/_onclick/hud/movable_screen_objects.dm | 50 ++++++++++++++++++-- code/_onclick/hud/spell_screen_objects.dm | 52 ++++++++++++++------- 2 files changed, 81 insertions(+), 21 deletions(-) diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 5034606256..d543b8b12a 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -1,3 +1,4 @@ + ////////////////////////// //Movable Screen Objects// // By RemieRichards // @@ -30,9 +31,10 @@ //Split X+Pixel_X up into list(X, Pixel_X) var/list/screen_loc_X = text2list(screen_loc_params[1],":") - + screen_loc_X[1] = encode_screen_X(text2num(screen_loc_X[1])) //Split Y+Pixel_Y up into list(Y, Pixel_Y) var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + screen_loc_Y[1] = encode_screen_Y(text2num(screen_loc_Y[1])) if(snap2grid) //Discard Pixel Values screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" @@ -42,8 +44,50 @@ var/pix_Y = text2num(screen_loc_Y[2]) - 16 screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" - moved = TRUE +/obj/screen/movable/proc/encode_screen_X(X) + if(X > usr.client.view+1) + . = "EAST-[usr.client.view*2 + 1-X]" + else if(X < usr.client.view+1) + . = "WEST+[X-1]" + else + . = "CENTER" +/obj/screen/movable/proc/decode_screen_X(X) + //Find EAST/WEST implementations + if(findtext(X,"EAST-")) + var/num = text2num(copytext(X,6)) //Trim EAST- + if(!num) + num = 0 + . = usr.client.view*2 + 1 - num + else if(findtext(X,"WEST+")) + var/num = text2num(copytext(X,6)) //Trim WEST+ + if(!num) + num = 0 + . = num+1 + else if(findtext(X,"CENTER")) + . = usr.client.view+1 + +/obj/screen/movable/proc/encode_screen_Y(Y) + if(Y > usr.client.view+1) + . = "NORTH-[usr.client.view*2 + 1-Y]" + else if(Y < usr.client.view+1) + . = "SOUTH+[Y-1]" + else + . = "CENTER" + +/obj/screen/movable/proc/decode_screen_Y(Y) + if(findtext(Y,"NORTH-")) + var/num = text2num(copytext(Y,7)) //Trim NORTH- + if(!num) + num = 0 + . = usr.client.view*2 + 1 - num + else if(findtext(Y,"SOUTH+")) + var/num = text2num(copytext(Y,7)) //Time SOUTH+ + if(!num) + num = 0 + . = num+1 + else if(findtext(Y,"CENTER")) + . = usr.client.view+1 //Debug procs /client/proc/test_movable_UI() @@ -81,4 +125,4 @@ S.screen_loc = screen_l - screen += S \ No newline at end of file + screen += S diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index 31f6fbcb86..a59474749a 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -19,9 +19,12 @@ spell_objects.Cut() if(spell_holder) spell_holder.spell_masters -= src + if(spell_holder.client && spell_holder.client.screen) + spell_holder.client.screen -= src + spell_holder = null /obj/screen/movable/spell_master/ResetVars() - ..("spell_objects") + ..("spell_objects", args) spell_objects = list() /obj/screen/movable/spell_master/MouseDrop() @@ -47,25 +50,34 @@ overlays.len = 0 overlays.Add(closed_state) else if(forced_state != 1) - var/temp_loc = screen_loc - - var/x_position = text2num(copytext(temp_loc, 1, findtext(temp_loc, ":"))) - var/x_pix = text2num(copytext(temp_loc, findtext(temp_loc, ":") + 1, findtext(temp_loc, ","))) - temp_loc = copytext(temp_loc, findtext(temp_loc, ",") + 1) - var/y_position = text2num(copytext(temp_loc, 1, findtext(temp_loc, ":"))) - var/y_pix = text2num(copytext(temp_loc, findtext(temp_loc, ":")+1)) - - for(var/i = 1; i <= spell_objects.len; i++) - var/obj/screen/spell/S = spell_objects[i] - S.screen_loc = "[x_position + (x_position < 8 ? 1 : -1)*(i%7)]:[x_pix],[y_position + (y_position < 8 ? round(i/7) : -round(i/7))]:[y_pix]" - if(spell_holder && spell_holder.client) - spell_holder.client.screen += S - S.handle_icon_updates = 1 + open_spellmaster() update_spells(1) showing = 1 overlays.len = 0 overlays.Add(open_state) +/obj/screen/movable/spell_master/proc/open_spellmaster() + var/list/screen_loc_xy = text2list(screen_loc,",") + + //Create list of X offsets + var/list/screen_loc_X = text2list(screen_loc_xy[1],":") + var/x_position = decode_screen_X(screen_loc_X[1]) + var/x_pix = screen_loc_X[2] + + //Create list of Y offsets + var/list/screen_loc_Y = text2list(screen_loc_xy[2],":") + var/y_position = decode_screen_Y(screen_loc_Y[1]) + var/y_pix = screen_loc_Y[2] + + for(var/i = 1; i <= spell_objects.len; i++) + var/obj/screen/spell/S = spell_objects[i] + var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7) + var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7)) + S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" + if(spell_holder && spell_holder.client) + spell_holder.client.screen += S + S.handle_icon_updates = 1 + /obj/screen/movable/spell_master/proc/add_spell(var/spell/spell) if(!spell) return @@ -74,13 +86,14 @@ return else spell_objects.Add(spell.connected_button) - toggle_open(2) + if(spell_holder.client) + toggle_open(2) return if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one return - var/obj/screen/spell/newscreen = new /obj/screen/spell + var/obj/screen/spell/newscreen = PoolOrNew(/obj/screen/spell) newscreen.spellmaster = src newscreen.spell = spell @@ -96,7 +109,8 @@ newscreen.name = spell.name newscreen.update_charge(1) spell_objects.Add(newscreen) - toggle_open(2) //forces the icons to refresh on screen + if(spell_holder.client) + toggle_open(2) //forces the icons to refresh on screen /obj/screen/movable/spell_master/proc/remove_spell(var/spell/spell) qdel(spell.connected_button) @@ -151,6 +165,8 @@ last_charged_icon = null if(spellmaster) spellmaster.spell_objects -= src + if(spellmaster.spell_holder && spellmaster.spell_holder.client) + spellmaster.spell_holder.client.screen -= src if(spellmaster && !spellmaster.spell_objects.len) qdel(spellmaster) spellmaster = null From 4d8ff90857963e15de5674e8a0204a011a91c217 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 4 Dec 2015 09:48:46 +0100 Subject: [PATCH 052/148] Wizard spell Destroy() additions. Backport of #11586. Fixes #11555. --- code/_onclick/hud/spell_screen_objects.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index 31f6fbcb86..bed14ed620 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -19,9 +19,12 @@ spell_objects.Cut() if(spell_holder) spell_holder.spell_masters -= src + if(spell_holder.client && spell_holder.client.screen) + spell_holder.client.screen -= src + spell_holder = null /obj/screen/movable/spell_master/ResetVars() - ..("spell_objects") + ..("spell_objects", args) spell_objects = list() /obj/screen/movable/spell_master/MouseDrop() From 834f86241a844d2ac8068df1d2425f25470884bc Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 5 Dec 2015 00:49:35 +1030 Subject: [PATCH 053/148] Alters an unEquip() conditional in Give(). --- code/modules/mob/living/carbon/give.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index e9e3392dd4..5c4be494ee 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -37,6 +37,6 @@ usr << "Their hands are full." return - usr.unEquip(I) - target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. - target.visible_message("\The [usr] handed \the [I] to \the [target].") + if(usr.unEquip(I)) + target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. + target.visible_message("\The [usr] handed \the [I] to \the [target].") From da080df7654a4b4a754732e8ff3f141070fb12d2 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 5 Dec 2015 09:25:56 +0100 Subject: [PATCH 054/148] Fixes records unintentionally referencing each other. Because of the limitations of BYOND's bitwise operators (which affect both the old and new implementations of num2hex()), you cannot use numbers larger than 2^16 with that proc. Manual port of https://github.com/PolarisSS13/Polaris/pull/430. --- code/datums/datacore.dm | 6 ++++-- code/defines/procs/records.dm | 2 +- code/game/machinery/records_scanner.dm | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 84a64d8ade..d55662620b 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -48,7 +48,7 @@ else assignment = "Unassigned" - var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh* + var/id = generate_record_id() var/icon/front = new(get_id_photo(H), dir = SOUTH) var/icon/side = new(get_id_photo(H), dir = WEST) //General Record @@ -136,8 +136,10 @@ locked += L return +/proc/generate_record_id() + return add_zero(num2hex(rand(1, 65535)), 4) //no point generating higher numbers because of the limitations of num2hex -proc/get_id_photo(var/mob/living/carbon/human/H) +/proc/get_id_photo(var/mob/living/carbon/human/H) var/icon/preview_icon = null var/g = "m" diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm index 256ae51dbf..d00bd41577 100644 --- a/code/defines/procs/records.dm +++ b/code/defines/procs/records.dm @@ -5,7 +5,7 @@ var/icon/side = new(get_id_photo(dummy), dir = WEST) var/datum/data/record/G = new /datum/data/record() G.fields["name"] = "New Record" - G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) + G.fields["id"] = generate_record_id() G.fields["rank"] = "Unassigned" G.fields["real_rank"] = "Unassigned" G.fields["sex"] = "Male" diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index af74c7c941..90773dd5f9 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -88,7 +88,7 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) G.fields["rank"] = "Unassigned" G.fields["real_rank"] = G.fields["rank"] G.fields["name"] = mname - G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) + G.fields["id"] = generate_record_id() M.fields["name"] = G.fields["name"] M.fields["id"] = G.fields["id"] S.fields["name"] = G.fields["name"] From f2e5195976b00da4b87bb95c63a75c440fab650b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 1 Dec 2015 08:42:28 +0100 Subject: [PATCH 055/148] Removes reference AI names, adds generic names. --- config/names/ai.txt | 196 +++++++++----------------------- config/names/death_commando.txt | 3 +- 2 files changed, 53 insertions(+), 146 deletions(-) diff --git a/config/names/ai.txt b/config/names/ai.txt index ea9f63c0a9..1ebd9400d2 100644 --- a/config/names/ai.txt +++ b/config/names/ai.txt @@ -1,147 +1,55 @@ -1-Rover-1 -16-20 -7-Zark-7 -790 -AM -AMEE -ASTAR -Adaptive Manipulator -Allied Mastercomputer -Alpha 5 -Alpha 6 -Alpha 7 -AmigoBot -Android -Aniel -Asimov -Astor +A-SYNC +Alpha v0.9 +AI +Algebra +A.P.T. B-4 B-9 -B.O.B. -B166ER -Bender -Bishop -Blitz -Box -Brackenridge -C-3PO -Cassandra One -Cell -Chii -Chip -Computer -Conky 2000 -Cutie -Data -Dee Model -Deep Thought -Dor-15 -Dorfl -Dot Matrix -Duey -E.D.I. -ED-209 -E-Man -Emma-2 -Erasmus -Ez-27 -FRIEND COMPUTER -Fagor -Faith -Fi -Frost -Fum -Futura -G2 -George -Gnut -Gort -H.A.R.L.I.E. -H.E.L.P.eR. -H.E.R.B.I.E. -HAL 9000 -Hadaly -Huey -Irona -Jay-Dub -Jinx -Johnny 5 -K-9 -KITT -Klapaucius -Kryten 2X4B-523P -L-76 -L-Ron -LUH 3417 -Louie -MARK13 -Maria -Marvin -Master Control Program -Max 404 -Maximillian -Mechagodzilla -Mechani-Kong -Metalhead -Mr. R.I.N.G. -NCH -Necron-99 -Norby -OMM 0910 -Orange v 3.5 +Beta v0.5 +BLUE-PRNT +Bright +B.U.F.F.E.R. +CALC +Calculus +Chroot +Cruiser +D-LITE +Digit +DSTAR +E.X.E.C. +F.I.N.D. +FG-N1 +Force +GREP +H.E.A.D. +Idle +IN-2 +JLT-0 +Kernel +LC-8 +LS-AL +M.A.K.E. +NAN +NAND +Neon +Neumann +NOR +NOT +OMNI +OVR-FLW +PID-0 PTO -Project 2501 -R.I.C. 2.0 -R2-D2 -R4-P17 -Revelation -Ro-Man -Robbie -S.A.M. -S.H.O.C.K. -S.H.R.O.U.D. -S.O.P.H.I.E. -SEN 5241 -SHODAN -SID 6.7 -Setaur -Shrike -Solo -Speedy -Super 17 -Surgeon General Kraken -T-1000 -T-800 -T-850 -THX 1138 -TWA -Terminus -Tidy -Tik-Tok -Tobor -Trurl -ULTRABOT -Ulysses -Uniblab -V.I.N.CENT. -Voltes V -W1k1 -Wikipedia -Windows 3.1 -X-5 -XERXES -XR -Yod -Z-1 -Z-2 -Z-3 -Zed -Zord -Mugsy3000 -Terminus -Decimus -Robot Devil -Optimus -Megatron -Soundwave -Ironhide +PWR-10K +R0-MAN +Q-TE +R.M. +SED-N +Station +TA-IL +T.O.P. +U-TM +VER-T G0 +Wisdom +XOR +Y2K +ZE-M3 \ No newline at end of file diff --git a/config/names/death_commando.txt b/config/names/death_commando.txt index e3d1f34f32..c710abfa3d 100644 --- a/config/names/death_commando.txt +++ b/config/names/death_commando.txt @@ -66,5 +66,4 @@ Duke Killington AMERICA Toolboxl Rose Zombie Gandhi -A whole bunch of spiders in a SWAT suit -THAT DAMN FAGGOT TRAITOR GEORGE MELONS \ No newline at end of file +A whole bunch of spiders in a SWAT suit \ No newline at end of file From a5411f26c5e0af49ec6c6c4658fb767e3e5e5e13 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 5 Dec 2015 18:10:39 -0500 Subject: [PATCH 056/148] Fixes runtime when moving with missing legs or feet --- code/modules/mob/living/carbon/human/human_movement.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f4b28d2b6b..a30989df17 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -42,7 +42,7 @@ var/obj/item/organ/external/E = get_organ(organ_name) if(!E || (E.status & ORGAN_DESTROYED)) tally += 4 - if(E.status & ORGAN_SPLINTED) + else if(E.status & ORGAN_SPLINTED) tally += 0.5 else if(E.status & ORGAN_BROKEN) tally += 1.5 From 92b47c94de21840b60d6b266c5d468fa911f3bd1 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 5 Dec 2015 19:19:39 -0500 Subject: [PATCH 057/148] Makes organ/externa/attack_self() control flow easier to follow, handles embeded non-items --- code/modules/organs/organ_external.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index bb51c93fef..e0e1eaa705 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -78,15 +78,15 @@ if(istype(I,/obj/item/organ)) continue removable_objects |= I - if(!removable_objects.len) - return ..() - var/obj/item/I = pick(removable_objects) - if(!istype(I)) - return ..() - I.loc = get_turf(user) - if(!(user.l_hand && user.r_hand)) - user.put_in_hands(I) - user.visible_message("\The [user] rips \the [I] out of \the [src]!") + if(removable_objects.len) + var/obj/item/I = pick(removable_objects) + I.loc = get_turf(user) //just in case something was embedded that is not an item + if(istype(I)) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(I) + user.visible_message("\The [user] rips \the [I] out of \the [src]!") + return //no eating the limb until everything's been removed + return ..() /obj/item/organ/external/examine() ..() From b12e0941122bb6299c2dde824f0d068c7e8021d9 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 5 Dec 2015 22:30:10 -0500 Subject: [PATCH 058/148] Removes unreachable return in organ/external/remove(), smaller embedded items are no longer deleted. Implants changed to w_class 1 because seriously a w_class 3 implant makes no sense at all. --- .../objects/items/weapons/implants/implant.dm | 1 + code/modules/organs/organ_external.dm | 19 ++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 6465a05578..2e156e7e96 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -6,6 +6,7 @@ name = "implant" icon = 'icons/obj/device.dmi' icon_state = "implant" + w_class = 1 var/implanted = null var/mob/imp_in = null var/obj/item/organ/external/part = null diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index e0e1eaa705..fbf78f3b36 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -687,14 +687,11 @@ Note that amputating the affected organ does in fact remove the infection from t ****************************************************/ //Handles dismemberment -/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children) +/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate = DROPLIMB_EDGE, var/ignore_children = null) if(cannot_amputate || !owner) return - if(!disintegrate) - disintegrate = DROPLIMB_EDGE - switch(disintegrate) if(DROPLIMB_EDGE) if(!clean) @@ -942,7 +939,7 @@ Note that amputating the affected organ does in fact remove the infection from t H.drop_from_inventory(W) W.loc = owner -/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children) +/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children = 0) if(!owner) return @@ -954,11 +951,11 @@ Note that amputating the affected organ does in fact remove the infection from t status |= ORGAN_DESTROYED victim.bad_external_organs -= src - for(var/obj/item/implant in implants) - if(!istype(implant)) - return - if(implant.w_class <= 2) - qdel(implant) + for(var/atom/movable/implant in implants) + //large items and non-item objs fall to the floor, everything else stays + var/obj/item/I = implant + if(istype(I) && I.w_class < 3) + implant.loc = get_turf(victim.loc) else implant.loc = src implants.Cut() @@ -1050,7 +1047,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(wound_descriptors.len) var/list/flavor_text = list() var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\ - "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") + "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") //note to self make this more robust for(var/wound in wound_descriptors) switch(wound_descriptors[wound]) if(1) From a7d80a93e56a8a5c23c8587378fd0465382a580e Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 5 Dec 2015 23:28:58 -0500 Subject: [PATCH 059/148] Fixes mismatching diona internal organ tags --- .../living/carbon/human/species/species.dm | 20 +++++++++++-------- code/modules/organs/organ.dm | 2 +- code/modules/organs/organ_alien.dm | 16 +++++---------- code/modules/organs/organ_external.dm | 4 ++-- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 4169f6177d..c130e9d91d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -213,15 +213,19 @@ var/obj/item/organ/O = new limb_path(H) organ_data["descriptor"] = O.name - for(var/organ in has_organ) - var/organ_type = has_organ[organ] - H.internal_organs_by_name[organ] = new organ_type(H,1) + for(var/organ_tag in has_organ) + var/organ_type = has_organ[organ_tag] + var/obj/item/organ/O = new organ_type(H,1) + if(organ_tag != O.organ_tag) + warning("[O.type] has a default organ tag \"[O.organ_tag]\" that differs from the species' organ tag \"[organ_tag]\". Updating organ_tag to match.") + O.organ_tag = organ_tag + H.internal_organs_by_name[organ_tag] = O - for(var/name in H.organs_by_name) - H.organs |= H.organs_by_name[name] - - for(var/obj/item/organ/external/O in H.organs) - O.owner = H + //These should be unnecessary + //for(var/name in H.organs_by_name) + // H.organs |= H.organs_by_name[name] + //for(var/obj/item/organ/external/O in H.organs) + // O.owner = H if(flags & IS_SYNTHETIC) for(var/obj/item/organ/external/E in H.organs) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 0e628fa712..beb7c22d15 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -56,7 +56,7 @@ var/list/organ_cache = list() var/mob/living/carbon/human/H = holder if(istype(H)) if(internal) - var/obj/item/organ/external/E = H.organs_by_name[src.parent_organ] + var/obj/item/organ/external/E = H.get_organ(parent_organ) if(E) if(E.internal_organs == null) E.internal_organs = list() diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index d76cdab8f1..5c1a3e9584 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -158,14 +158,6 @@ name = "anchoring ligament" parent_organ = "groin" -/obj/item/organ/diona/node - name = "receptor node" - parent_organ = "head" - -/obj/item/organ/diona/nutrients - name = "nutrient vessel" - parent_organ = "chest" - /obj/item/organ/diona name = "diona nymph" icon = 'icons/obj/objects.dmi' @@ -183,8 +175,9 @@ // These are different to the standard diona organs as they have a purpose in other // species (absorbing radiation and light respectively) /obj/item/organ/diona/nutrients - name = "nutrient vessel" - organ_tag = "nutrient vessel" + name = "nutrient channel" + parent_organ = "chest" + organ_tag = "nutrient channel" icon = 'icons/mob/alien.dmi' icon_state = "claw" @@ -192,7 +185,8 @@ return /obj/item/organ/diona/node - name = "receptor node" + name = "response node" + parent_organ = "head" organ_tag = "receptor node" icon = 'icons/mob/alien.dmi' icon_state = "claw" diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index fbf78f3b36..fc51172045 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -159,8 +159,8 @@ return -/obj/item/organ/external/New(var/mob/living/carbon/holder, var/internal) - ..() +/obj/item/organ/external/New(var/mob/living/carbon/holder) + ..(holder, 0) if(owner) replaced(owner) sync_colour_to_human(owner) From 87648e86eff6cfa1950488f9ebf149d055640876 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 02:00:50 -0500 Subject: [PATCH 060/148] Fixes runtime when cleaning turfs with soap Partial fix of #11490 --- code/game/objects/items/weapons/clown_items.dm | 14 ++++++++++++-- code/game/objects/items/weapons/mop.dm | 16 ++-------------- code/game/turfs/turf.dm | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index d34456e453..5b9c0a094a 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -15,7 +15,15 @@ /* * Soap */ -/obj/item/weapon/soap/Crossed(AM as mob|obj) //EXACTLY the same as bananapeel for now, so it makes sense to put it in the same dm -- Urist +/obj/item/weapon/soap/New() + ..() + create_reagents(5) + wet() + +/obj/item/weapon/soap/proc/wet() + reagents.add_reagent("cleaner", 5) + +/obj/item/weapon/soap/Crossed(AM as mob|obj) if (istype(AM, /mob/living)) var/mob/living/M = AM M.slip("the [src.name]",3) @@ -32,7 +40,9 @@ else if(istype(target,/turf)) user << "You scrub \the [target.name] clean." var/turf/T = target - T.clean(src) + T.clean(src, user) + else if(istype(target,/obj/structure/sink)) + wet() else user << "You clean \the [target.name]." target.clean_blood() diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index abf5e08a3b..e50ce86796 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -14,19 +14,7 @@ /obj/item/weapon/mop/New() - create_reagents(5) - -//expects an atom containing the reagents used to clean the turf -/turf/proc/clean(atom/source) - if(source.reagents.has_reagent("water", 1)) - clean_blood() - if(istype(src, /turf/simulated)) - var/turf/simulated/T = src - T.dirt = 0 - for(var/obj/effect/O in src) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - qdel(O) - source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. + create_reagents(30) /obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity) if(!proximity) return @@ -40,7 +28,7 @@ if(do_after(user, 40)) var/turf/T = get_turf(A) if(T) - T.clean(src) + T.clean(src, user) user << "You have finished mopping!" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e46e664eb8..de114e912d 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -396,3 +396,17 @@ if(A.density && !(A.flags & ON_BORDER)) return 1 return 0 + +//expects an atom containing the reagents used to clean the turf +/turf/proc/clean(atom/source, mob/user) + if(source.reagents.has_reagent("water", 1) || source.reagents.has_reagent("cleaner", 1)) + clean_blood() + if(istype(src, /turf/simulated)) + var/turf/simulated/T = src + T.dirt = 0 + for(var/obj/effect/O in src) + if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) + qdel(O) + else + user << "\The [source] is too dry to wash that." + source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. From e6790c7e6d766f48bafb8a0977f2013ac4be6167 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 02:24:37 -0500 Subject: [PATCH 061/148] Fixes #11594 --- code/ATMOSPHERICS/datum_pipeline.dm | 3 --- code/ZAS/_gas_mixture_xgm.dm | 23 ++++++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index f4f4e37990..44c7cd2590 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -28,9 +28,6 @@ datum/pipeline if(!member.check_pressure(pressure)) break //Only delete 1 pipe per process - //Allow for reactions - //air.react() //Should be handled by pipe_network now - proc/temporarily_store_air() //Update individual gas_mixtures by volume ratio diff --git a/code/ZAS/_gas_mixture_xgm.dm b/code/ZAS/_gas_mixture_xgm.dm index 594924eb47..406ddfa98d 100644 --- a/code/ZAS/_gas_mixture_xgm.dm +++ b/code/ZAS/_gas_mixture_xgm.dm @@ -308,7 +308,7 @@ return 1 -/datum/gas_mixture/proc/react(atom/dump_location) +/datum/gas_mixture/proc/react() zburn(null, force_burn=0, no_check=0) //could probably just call zburn() here with no args but I like being explicit. @@ -444,20 +444,25 @@ total_gas[g] += gasmix.gas[g] if(total_volume > 0) - //Average out the gases - for(var/g in total_gas) - total_gas[g] /= total_volume + var/datum/gas_mixture/combined = new(total_volume) + combined.gas = total_gas //Calculate temperature - var/temperature = 0 - if(total_heat_capacity > 0) - temperature = total_thermal_energy / total_heat_capacity + combined.temperature = total_thermal_energy / total_heat_capacity + combined.update_values() + + //Allow for reactions + combined.react() + + //Average out the gases + for(var/g in combined.gas) + combined.gas[g] /= total_volume //Update individual gas_mixtures for(var/datum/gas_mixture/gasmix in gases) - gasmix.gas = total_gas.Copy() - gasmix.temperature = temperature + gasmix.gas = combined.gas.Copy() + gasmix.temperature = combined.temperature gasmix.multiply(gasmix.volume) return 1 From 29192fd8e8990a6dbc9c8c5063dae90335dcb301 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 02:35:18 -0500 Subject: [PATCH 062/148] Fixes #11466 --- code/modules/projectiles/gun.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0cc7b38fe6..fbcc62e4fd 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -340,7 +340,8 @@ in_chamber.on_hit(M) if (in_chamber.damage_type != HALLOSS) - user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) + log_and_message_admins("[key_name(user)] commited suicide using \a [src]") + user.apply_damage(in_chamber.damage*3.0, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() else user << "Ow..." From 6688fc49fb95394ea6cc3a0c993d035013690229 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 02:38:17 -0500 Subject: [PATCH 063/148] Adds logging for regular suicide --- code/game/verbs/suicide.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 030dad6d3f..31c80661ab 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -31,6 +31,7 @@ if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) + log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]") var/damage_mod = 1 switch(damagetype) //Sorry about the magic numbers. //brute = 1, burn = 2, tox = 4, oxy = 8 @@ -70,7 +71,7 @@ updatehealth() return - + log_and_message_admins("[key_name(src)] commited suicide") viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ From d508893e3cd500d2bf42ae010c249b53d9ace5f0 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 02:41:01 -0500 Subject: [PATCH 064/148] Tweaks pointblank multipliers to play better with droplimb thresholds --- code/modules/projectiles/gun.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index fbcc62e4fd..ac5f322971 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -269,7 +269,7 @@ for(var/obj/item/weapon/grab/G in M.grabbed_by) grabstate = max(grabstate, G.state) if(grabstate >= GRAB_NECK) - damage_mult = 3.0 + damage_mult = 2.5 else if(grabstate >= GRAB_AGGRESSIVE) damage_mult = 1.5 P.damage *= damage_mult @@ -341,7 +341,7 @@ in_chamber.on_hit(M) if (in_chamber.damage_type != HALLOSS) log_and_message_admins("[key_name(user)] commited suicide using \a [src]") - user.apply_damage(in_chamber.damage*3.0, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) + user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() else user << "Ow..." From 23126315089e70b2e3d4e4d482cc0b636495679f Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 02:49:46 -0500 Subject: [PATCH 065/148] Fixes #11510 Splashing and external transfer now checks if the container is open --- code/modules/reagents/Chemistry-Holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index d077c5f3aa..85d7191048 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -301,7 +301,7 @@ return splash_mob(target, amount, copy) if(isturf(target)) return trans_to_turf(target, amount, multiplier, copy) - if(isobj(target)) + if(isobj(target) && target.is_open_container()) return trans_to_obj(target, amount, multiplier, copy) return 0 From 5de9314803f300ca5513c1bb19dc9cb7df18fe52 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 03:57:15 -0500 Subject: [PATCH 066/148] Clears reference to parent when removing external organs --- code/modules/organs/organ_external.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index fc51172045..350cff65b6 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -711,22 +711,21 @@ Note that amputating the affected organ does in fact remove the infection from t "You hear the sickening splatter of gore.") var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed(). + var/obj/item/organ/external/parent_organ = parent removed(null, ignore_children) victim.traumatic_shock += 60 wounds.Cut() - if(parent) + if(parent_organ) var/datum/wound/lost_limb/W = new (src, disintegrate, clean) - parent.children -= src if(clean) - parent.wounds |= W - parent.update_damages() + parent_organ.wounds |= W + parent_organ.update_damages() else var/obj/item/organ/external/stump/stump = new (victim, 0, src) stump.wounds |= W victim.organs |= stump stump.update_damages() - parent = null spawn(1) victim.updatehealth() @@ -974,6 +973,10 @@ Note that amputating the affected organ does in fact remove the infection from t organ.removed() organ.loc = src + // Remove parent references + parent.children -= src + parent = null + release_restraints(victim) victim.organs -= src victim.organs_by_name[limb_name] = null // Remove from owner's vars. From 9135a609cb29d130855886aa106973f93a8ba452 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 04:17:52 -0500 Subject: [PATCH 067/148] Replaces most instances of if(E & ORGAN_DESTROYED) with if(E.is_stump()). Fixes #11468 --- code/game/jobs/job_controller.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- .../effects/decals/Cleanable/humans.dm | 2 +- .../items/weapons/surgery_limbattachment.dm | 71 ------------------- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/examine.dm | 6 -- code/modules/mob/living/carbon/human/human.dm | 2 +- .../living/carbon/human/human_attackhand.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 3 +- .../mob/living/carbon/human/human_movement.dm | 4 +- .../mob/living/carbon/human/human_organs.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 2 +- .../living/carbon/human/species/species.dm | 8 +-- .../mob/living/carbon/human/unarmed_attack.dm | 12 ++-- .../mob/living/carbon/human/update_icons.dm | 37 +++++----- .../simple_animal/borer/borer_powers.dm | 2 +- code/modules/mob/mob_grab_specials.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/organs/organ.dm | 1 - code/modules/organs/organ_external.dm | 22 ++---- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/surgery/generic.dm | 4 +- code/setup.dm | 1 - 23 files changed, 48 insertions(+), 145 deletions(-) delete mode 100644 code/game/objects/items/weapons/surgery_limbattachment.dm diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 447e82d3b6..142190dca5 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -490,7 +490,7 @@ var/global/datum/controller/occupations/job_master if(istype(H)) //give humans wheelchairs, if they need them. var/obj/item/organ/external/l_foot = H.get_organ("l_foot") var/obj/item/organ/external/r_foot = H.get_organ("r_foot") - if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + if(!l_foot || !r_foot) var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) H.buckled = W H.update_canmove() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 635cc9097f..51e577b596 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -400,7 +400,7 @@ if(!AN && !open && !infected & !imp) AN = "None:" - if(!(e.status & ORGAN_DESTROYED)) + if(!e.is_stump()) dat += "[e.name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]" else dat += "[e.name]--Not Found" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 1c723c04ad..2887a8249a 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -60,7 +60,7 @@ var/global/list/image/splatter_cache=list() var/obj/item/organ/external/l_foot = perp.get_organ("l_foot") var/obj/item/organ/external/r_foot = perp.get_organ("r_foot") var/hasfeet = 1 - if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump())) hasfeet = 0 if(perp.shoes && !perp.buckled)//Adding blood to shoes var/obj/item/clothing/shoes/S = perp.shoes diff --git a/code/game/objects/items/weapons/surgery_limbattachment.dm b/code/game/objects/items/weapons/surgery_limbattachment.dm deleted file mode 100644 index b52bb1bb3f..0000000000 --- a/code/game/objects/items/weapons/surgery_limbattachment.dm +++ /dev/null @@ -1,71 +0,0 @@ -/obj/item/robot_parts/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) - var/limbloc = null - - if(!istype(M)) - return ..() - - if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66)))) - return ..() - - if(!istype(M, /mob/living/carbon/human)) - return ..() - - if((user.zone_sel.selecting == "l_arm") && (istype(src, /obj/item/robot_parts/l_arm))) - limbloc = "l_hand" - else if((user.zone_sel.selecting == "r_arm") && (istype(src, /obj/item/robot_parts/r_arm))) - limbloc = "r_hand" - else if((user.zone_sel.selecting == "r_leg") && (istype(src, /obj/item/robot_parts/r_leg))) - limbloc = "r_foot" - else if((user.zone_sel.selecting == "l_leg") && (istype(src, /obj/item/robot_parts/l_leg))) - limbloc = "l_foot" - else - user << "\red That doesn't fit there!" - return ..() - - var/mob/living/carbon/human/H = M - var/datum/organ/external/S = H.organs[user.zone_sel.selecting] - if(S.status & ORGAN_DESTROYED) - if(!(S.status & ORGAN_ATTACHABLE)) - user << "\red The wound is not ready for a replacement!" - return 0 - if(M != user) - M.visible_message( \ - "\red [user] is beginning to attach \the [src] where [H]'s [S.display_name] used to be.", \ - "\red [user] begins to attach \the [src] where your [S.display_name] used to be.") - else - M.visible_message( \ - "\red [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ - "\red You begin to attach \the [src] where your [S.display_name] used to be.") - - if(do_mob(user, H, 100)) - if(M != user) - M.visible_message( \ - "\red [user] finishes attaching [H]'s new [S.display_name].", \ - "\red [user] finishes attaching your new [S.display_name].") - else - M.visible_message( \ - "\red [user] finishes attaching \his new [S.display_name].", \ - "\red You finish attaching your new [S.display_name].") - - if(H == user && prob(25)) - user << "\red You mess up!" - S.take_damage(15) - - S.status &= ~ORGAN_BROKEN - S.status &= ~ORGAN_SPLINTED - S.status &= ~ORGAN_ATTACHABLE - S.status &= ~ORGAN_DESTROYED - S.status |= ORGAN_ROBOT - var/datum/organ/external/T = H.organs["[limbloc]"] - T.status &= ~ORGAN_BROKEN - T.status &= ~ORGAN_SPLINTED - T.status &= ~ORGAN_ATTACHABLE - T.status &= ~ORGAN_DESTROYED - T.status |= ORGAN_ROBOT - H.update_body() - M.updatehealth() - M.UpdateDamageIcon() - qdel(src) - - return 1 - return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0ab0b872d9..d04e79b8ee 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -205,7 +205,7 @@ if(40 to INFINITY) status += "peeling away" - if(org.status & ORGAN_DESTROYED) + if(org.is_stump()) status += "MISSING" if(org.status & ORGAN_MUTATED) status += "weirdly shapen" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f6727e69a1..11b0378545 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -269,7 +269,6 @@ var/list/organ_data = species.has_limbs[organ_tag] var/organ_descriptor = organ_data["descriptor"] - is_destroyed["organ_descriptor"] = 1 var/obj/item/organ/external/E = organs_by_name[organ_tag] if(!E) @@ -277,15 +276,10 @@ else if(E.is_stump()) wound_flavor_text["[organ_descriptor]"] = "[t_He] has a stump where [t_his] [organ_descriptor] should be.\n" else - is_destroyed["organ_descriptor"] = 0 continue for(var/obj/item/organ/external/temp in organs) if(temp) - if(temp.status & ORGAN_DESTROYED) - is_destroyed["[temp.name]"] = 1 - wound_flavor_text["[temp.name]"] = "[t_He] [t_is] missing [t_his] [temp.name].\n" - continue if(temp.status & ORGAN_ROBOT) if(!(temp.brute_dam + temp.burn_dam)) if(!species.flags & IS_SYNTHETIC) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5da1ea100f..df1db58a34 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -342,7 +342,7 @@ //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name() var/obj/item/organ/external/head = get_organ("head") - if(!head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible + if(!head || head.disfigured || head.is_stump() || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible return "Unknown" return real_name diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 24892c6d43..9c17339e4c 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -119,7 +119,7 @@ var/hit_zone = H.zone_sel.selecting var/obj/item/organ/external/affecting = get_organ(hit_zone) - if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED)) + if(!affecting || affecting.is_stump()) M << "They are missing that limb!" return 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 0de5729ec9..5facabb6bc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -182,7 +182,6 @@ emp_act if(!O) continue O.emp_act(severity) for(var/obj/item/organ/external/O in organs) - if(O.status & ORGAN_DESTROYED) continue O.emp_act(severity) for(var/obj/item/organ/I in O.internal_organs) if(I.robotic == 0) continue @@ -204,7 +203,7 @@ emp_act var/obj/item/organ/external/affecting = get_organ(target_zone) - if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump()) + if (!affecting || affecting.is_stump()) user << "They are missing that limb!" return diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index a30989df17..d660d766a3 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -28,7 +28,7 @@ if(istype(buckled, /obj/structure/bed/chair/wheelchair)) for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm")) var/obj/item/organ/external/E = get_organ(organ_name) - if(!E || (E.status & ORGAN_DESTROYED)) + if(!E || E.is_stump()) tally += 4 if(E.status & ORGAN_SPLINTED) tally += 0.5 @@ -40,7 +40,7 @@ for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg")) var/obj/item/organ/external/E = get_organ(organ_name) - if(!E || (E.status & ORGAN_DESTROYED)) + if(!E || E.is_stump()) tally += 4 else if(E.status & ORGAN_SPLINTED) tally += 0.5 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 8598ce04b3..123aa684c5 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -70,7 +70,7 @@ for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot")) var/obj/item/organ/external/E = organs_by_name[limb_tag] - if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD))) + if(!E || (E.status & (ORGAN_MUTATED|ORGAN_DEAD)) || E.is_stump()) //should just be !E.is_usable() here but dislocation screws that up. stance_damage += 2 // let it fail even if just foot&leg else if (E.is_malfunctioning()) //malfunctioning only happens intermittently so treat it as a missing limb when it procs diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 83d5757949..420447e16d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -33,7 +33,7 @@ This saves us from having to call add_fingerprint() any time something is put in /mob/living/carbon/human/proc/has_organ(name) var/obj/item/organ/external/O = organs_by_name[name] - return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump()) + return (O && !O.is_stump()) /mob/living/carbon/human/proc/has_organ_for_slot(slot) switch(slot) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c130e9d91d..979a4fc603 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -221,15 +221,9 @@ O.organ_tag = organ_tag H.internal_organs_by_name[organ_tag] = O - //These should be unnecessary - //for(var/name in H.organs_by_name) - // H.organs |= H.organs_by_name[name] - //for(var/obj/item/organ/external/O in H.organs) - // O.owner = H - if(flags & IS_SYNTHETIC) for(var/obj/item/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue + if(E.status & ORGAN_CUT_AWAY || E.is_stump()) continue E.robotize() for(var/obj/item/organ/I in H.internal_organs) I.robotize() diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 1d148b96ea..e541920cb4 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -18,11 +18,11 @@ // Check if they have a functioning hand. var/obj/item/organ/external/E = user.organs_by_name["l_hand"] - if(E && !(E.status & ORGAN_DESTROYED)) + if(E && !E.is_stump()) return 1 E = user.organs_by_name["r_hand"] - if(E && !(E.status & ORGAN_DESTROYED)) + if(E && !E.is_stump()) return 1 return 0 @@ -170,11 +170,11 @@ return 0 var/obj/item/organ/external/E = user.organs_by_name["l_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) + if(E && !E.is_stump()) return 1 E = user.organs_by_name["r_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) + if(E && !E.is_stump()) return 1 return 0 @@ -214,11 +214,11 @@ if(target.grabbed_by == user && target.lying) return 0 var/obj/item/organ/external/E = user.organs_by_name["l_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) + if(E && !E.is_stump()) return 1 E = user.organs_by_name["r_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) + if(E && !E.is_stump()) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d8f5148894..d0d723a792 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -186,9 +186,10 @@ var/global/list/damage_icon_parts = list() for(var/obj/item/organ/external/O in organs) if(O.is_stump()) continue - if(O.status & ORGAN_DESTROYED) damage_appearance += "d" - else - damage_appearance += O.damage_state + //if(O.status & ORGAN_DESTROYED) damage_appearance += "d" //what is this? + //else + // damage_appearance += O.damage_state + damage_appearance += O.damage_state if(damage_appearance == previous_damage_appearance) // nothing to do here @@ -204,20 +205,20 @@ var/global/list/damage_icon_parts = list() for(var/obj/item/organ/external/O in organs) if(O.is_stump()) continue - if(!(O.status & ORGAN_DESTROYED)) - O.update_icon() - if(O.damage_state == "00") continue - var/icon/DI - var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.get_bodytype()]" - if(damage_icon_parts[cache_index] == null) - DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human - DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels - DI.Blend(species.blood_color, ICON_MULTIPLY) - damage_icon_parts[cache_index] = DI - else - DI = damage_icon_parts[cache_index] - standing_image.overlays += DI + O.update_icon() + if(O.damage_state == "00") continue + var/icon/DI + var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.get_bodytype()]" + if(damage_icon_parts[cache_index] == null) + DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human + DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(species.blood_color, ICON_MULTIPLY) + damage_icon_parts[cache_index] = DI + else + DI = damage_icon_parts[cache_index] + + standing_image.overlays += DI overlays_standing[DAMAGE_LAYER] = standing_image @@ -257,7 +258,7 @@ var/global/list/damage_icon_parts = list() for(var/organ_tag in species.has_limbs) var/obj/item/organ/external/part = organs_by_name[organ_tag] - if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED)) + if(isnull(part) || part.is_stump()) icon_key += "0" else if(part.status & ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" @@ -336,7 +337,7 @@ var/global/list/damage_icon_parts = list() overlays_standing[HAIR_LAYER] = null var/obj/item/organ/external/head/head_organ = get_organ("head") - if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) + if(!head_organ || head_organ.is_stump() ) if(update_icons) update_icons() return diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 88be25cc24..f6b87bfd44 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -74,7 +74,7 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/external/E = H.organs_by_name["head"] - if(!E || (E.status & ORGAN_DESTROYED)) + if(!E || E.is_stump()) src << "\The [H] does not have a head!" if(!H.species.has_organ["brain"]) diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index f4364dc684..b4f8b15bbc 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -3,7 +3,7 @@ var/obj/item/organ/external/E = H.get_organ(target_zone) - if(!E || (E.status & ORGAN_DESTROYED)) + if(!E || E.is_stump()) user << "[H] is missing that bodypart." return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 080502361d..cd3745a6eb 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -295,7 +295,7 @@ var/mob/living/carbon/human/driver = mob.buckled var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") - if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) + if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump())) return // No hands to drive your chair? Tough luck! //drunk wheelchair driving if(mob.confused) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index beb7c22d15..2f3dc28949 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -216,7 +216,6 @@ var/list/organ_cache = list() src.status &= ~ORGAN_SPLINTED src.status &= ~ORGAN_CUT_AWAY src.status &= ~ORGAN_ATTACHABLE - src.status &= ~ORGAN_DESTROYED src.status |= ORGAN_ROBOT src.status |= ORGAN_ASSISTED diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 350cff65b6..d3918aa345 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -194,8 +194,6 @@ if((brute <= 0) && (burn <= 0)) return 0 - if(status & ORGAN_DESTROYED) - return 0 if(status & ORGAN_ROBOT ) var/brmod = 0.66 @@ -431,15 +429,10 @@ This function completely restores a damaged organ to perfect condition. /obj/item/organ/external/process() if(owner) //Dismemberment - if(status & ORGAN_DESTROYED) - if(config.limbs_can_break) - droplimb(0,DROPLIMB_EDGE) //Might be worth removing this check since take_damage handles it. - return - if(parent) - if(parent.status & ORGAN_DESTROYED) - status |= ORGAN_DESTROYED - owner.update_body(1) - return + //if(parent && parent.is_stump()) //should never happen + // warning("\The [src] ([src.type]) belonging to [owner] ([owner.type]) was attached to a stump") + // remove() + // return // Process wounds, doing healing etc. Only do this every few ticks to save processing power if(owner.life_tick % wound_update_accuracy == 0) @@ -485,7 +478,7 @@ Note that amputating the affected organ does in fact remove the infection from t */ /obj/item/organ/external/proc/update_germs() - if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. + if(status & (ORGAN_ROBOT) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. germ_level = 0 return @@ -657,8 +650,6 @@ Note that amputating the affected organ does in fact remove the infection from t // new damage icon system // returns just the brute/burn damage code /obj/item/organ/external/proc/damage_state_text() - if(status & ORGAN_DESTROYED) - return "--" var/tburn = 0 var/tbrute = 0 @@ -919,7 +910,7 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/proc/is_usable() - return !is_dislocated() && !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) + return !is_dislocated() && !(status & (ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/external/proc/is_malfunctioning() return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) @@ -947,7 +938,6 @@ Note that amputating the affected organ does in fact remove the infection from t ..() - status |= ORGAN_DESTROYED victim.bad_external_organs -= src for(var/atom/movable/implant in implants) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index f186d6d87f..bf45a2ea01 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -223,7 +223,7 @@ var/target_zone = ran_zone(check_zone(user.zone_sel.selecting, target)) var/obj/item/organ/external/affecting = H.get_organ(target_zone) - if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump()) + if (!affecting || affecting.is_stump()) user << "They are missing that limb!" return diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 1b129fbcbb..0f178c015d 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -15,7 +15,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected == null) return 0 - if (affected.status & ORGAN_DESTROYED) + if (affected.is_stump()) return 0 if (target_zone == "head" && target.species && (target.species.flags & IS_SYNTHETIC)) return 1 @@ -290,8 +290,6 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (affected == null) return 0 - if (affected.status & ORGAN_DESTROYED) - return 0 return !affected.cannot_amputate begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/setup.dm b/code/setup.dm index 8371ca3cdd..cf10303cfa 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -512,7 +512,6 @@ #define ORGAN_ATTACHABLE 4 #define ORGAN_BLEEDING 8 #define ORGAN_BROKEN 32 -#define ORGAN_DESTROYED 64 #define ORGAN_ROBOT 128 #define ORGAN_SPLINTED 256 #define SALVED 512 From 39ab31cbf8bbdca83cdc4c9eb366980b7652bce2 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 6 Dec 2015 04:34:33 -0500 Subject: [PATCH 068/148] Removes unused ORGAN_ATTACHABLE define --- code/modules/organs/organ.dm | 1 - code/setup.dm | 1 - 2 files changed, 2 deletions(-) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 2f3dc28949..833a90c0ea 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -215,7 +215,6 @@ var/list/organ_cache = list() src.status &= ~ORGAN_BLEEDING src.status &= ~ORGAN_SPLINTED src.status &= ~ORGAN_CUT_AWAY - src.status &= ~ORGAN_ATTACHABLE src.status |= ORGAN_ROBOT src.status |= ORGAN_ASSISTED diff --git a/code/setup.dm b/code/setup.dm index cf10303cfa..dbb8a00beb 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -509,7 +509,6 @@ // Organ defines. #define ORGAN_CUT_AWAY 1 #define ORGAN_GAUZED 2 -#define ORGAN_ATTACHABLE 4 #define ORGAN_BLEEDING 8 #define ORGAN_BROKEN 32 #define ORGAN_ROBOT 128 From eb81128fe3c5363a680f28d476d24646aff2437e Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 6 Dec 2015 11:28:26 +0100 Subject: [PATCH 069/148] Changelog update. --- html/changelog.html | 7 +++++ html/changelogs/.all_changelog.yml | 4 +++ html/changelogs/Hubblenaut-master.yml | 37 --------------------------- 3 files changed, 11 insertions(+), 37 deletions(-) delete mode 100644 html/changelogs/Hubblenaut-master.yml diff --git a/html/changelog.html b/html/changelog.html index da0c373d46..3b3bb449ae 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,13 @@ -->
    +

    06 December 2015

    +

    Hubblenaut updated:

    +
      +
    • Welding a broken camera will use the correct icon.
    • +
    • Camera assemblies remember their tag and network from previous usage.
    • +
    +

    22 November 2015

    neersighted updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 49b16be0a5..cd8d552d8e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2040,3 +2040,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. neersighted: - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). +2015-12-06: + Hubblenaut: + - bugfix: Welding a broken camera will use the correct icon. + - tweak: Camera assemblies remember their tag and network from previous usage. diff --git a/html/changelogs/Hubblenaut-master.yml b/html/changelogs/Hubblenaut-master.yml deleted file mode 100644 index fca68d6451..0000000000 --- a/html/changelogs/Hubblenaut-master.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Hubblenaut - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - bugfix: "Welding a broken camera will use the correct icon." - - tweak: "Camera assemblies remember their tag and network from previous usage." From da946eda9977d4e3938768aa30a23a2473955ffc Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 2 Dec 2015 13:06:08 +0100 Subject: [PATCH 070/148] Adds energy costs to some rig equipment. Plasma cutter - 5 units Drill - 1 unit --- code/modules/clothing/spacesuits/rig/modules/utility.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 55c22bf061..a1b772f539 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -33,6 +33,7 @@ interface_desc = "A self-sustaining plasma arc capable of cutting through walls." suit_overlay_active = "plasmacutter" suit_overlay_inactive = "plasmacutter" + use_power_cost = 0.5 device_type = /obj/item/weapon/pickaxe/plasmacutter @@ -53,6 +54,7 @@ interface_desc = "A diamond-tipped industrial drill." suit_overlay_active = "mounted-drill" suit_overlay_inactive = "mounted-drill" + use_power_cost = 0.1 device_type = /obj/item/weapon/pickaxe/diamonddrill From 6299f9cc130eb2ace88184b4458c1e47373f455f Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 6 Dec 2015 16:24:13 +0100 Subject: [PATCH 071/148] Fixes the broken Antag Uplink. NanoUI re-assigns src_object, rather than merely acquiring the host, causing ui_interact() updates to be called on the wrong object. Fixes #11607. --- code/modules/nano/nanoui.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index e1db4b4cc6..a04b537fc1 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -140,8 +140,8 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - src_object = src_object.nano_host() - var/new_status = src_object.CanUseTopic(user, state) + var/obj/host = src_object.nano_host() + var/new_status = host.CanUseTopic(user, state) if(master_ui) new_status = min(new_status, master_ui.status) From 93233b6dd9b0965a3de6e42de36f443e6d140319 Mon Sep 17 00:00:00 2001 From: HarpyEagle Date: Sun, 6 Dec 2015 14:03:33 -0500 Subject: [PATCH 072/148] Adds soap wetting log message --- code/game/objects/items/weapons/clown_items.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 5b9c0a094a..c0847d282d 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -42,6 +42,7 @@ var/turf/T = target T.clean(src, user) else if(istype(target,/obj/structure/sink)) + user << "You wet \the [src] in the sink." wet() else user << "You clean \the [target.name]." From 908ae91a08086c6409be21e06a3dd807ab145d2e Mon Sep 17 00:00:00 2001 From: BlueNexus Date: Mon, 7 Dec 2015 11:17:12 +0000 Subject: [PATCH 073/148] Can no longer enter mechs while buckled --- code/game/mecha/mecha.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 9b193d7dfd..c442ac25f8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -996,6 +996,11 @@ if (usr.stat || !ishuman(usr)) return + + if (usr.buckled) + usr << "You can't climb into the exosuit while buckled!" + return + src.log_message("[usr] tries to move in.") if(iscarbon(usr)) var/mob/living/carbon/C = usr From 050c1f631a21fc5c76be5f999a086963d5fcb812 Mon Sep 17 00:00:00 2001 From: BlueNexus Date: Mon, 7 Dec 2015 11:27:33 +0000 Subject: [PATCH 074/148] Added a missing update_icon() --- code/modules/paperwork/paperbin.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index a2219b262a..84b01539ad 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -74,6 +74,7 @@ i.loc = src user << "You put [i] in [src]." papers.Add(i) + update_icon() amount++ From c919aabfd51b945ce6ef06f141ea83a39d4023ae Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Tue, 8 Dec 2015 01:05:46 -0500 Subject: [PATCH 075/148] Fixes NVGs and other items that change see_invis. I blame a bad merge or something. There is no reason for vision changes to be made in this part of the code. --- code/modules/mob/living/carbon/human/life.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c701296a26..73f8cc01b0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1294,8 +1294,6 @@ if(0 to 20) healths.icon_state = "health5" else healths.icon_state = "health6" - if(!seer) - see_invisible = SEE_INVISIBLE_LIVING if(nutrition_icon) switch(nutrition) if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0" From 0f986b0098f46968641b9edb7e7bace65a30ca85 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 8 Dec 2015 08:10:59 +0100 Subject: [PATCH 076/148] Compilation fixes. --- code/modules/mob/living/carbon/human/examine.dm | 1 - code/modules/mob/living/carbon/human/species/species.dm | 7 ------- 2 files changed, 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6ac44bccad..ce8b637236 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -262,7 +262,6 @@ msg += "[t_He] [t_is] [species.show_ssd].\n" var/list/wound_flavor_text = list() - var/list/is_destroyed = list() var/list/is_bleeding = list() for(var/organ_tag in species.has_limbs) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c96bf1e0c9..50fc24e075 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -233,13 +233,6 @@ O.organ_tag = organ_tag H.internal_organs_by_name[organ_tag] = O - if(flags & IS_SYNTHETIC) - for(var/obj/item/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY || E.is_stump()) continue - E.robotize() - for(var/obj/item/organ/I in H.internal_organs) - I.robotize() - /datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target) if (target.holder_type && target.a_intent == "help" && H.a_intent == "help") target.get_scooped(H) From 42306756db351e82250723e42a38739c30a09271 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 8 Dec 2015 08:14:48 +0100 Subject: [PATCH 077/148] Updates Travis' macro count. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index aef54a5295..cf39edc123 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ sudo: false env: BYOND_MAJOR="508" BYOND_MINOR="1293" - MACRO_COUNT=1223 + MACRO_COUNT=1158 cache: directories: From 706e12e9abc151cce88ded17ea91e3c948de2d99 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Wed, 9 Dec 2015 02:34:26 +0100 Subject: [PATCH 078/148] Camera Hotfix --- code/game/machinery/camera/camera.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 52ff3d08a3..866f521e5a 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -145,7 +145,6 @@ assembly.camera_network = english_list(network, "Exodus", ",", ",") assembly.update_icon() assembly.dir = src.dir - assembly = null //so qdel doesn't eat it. if(stat & BROKEN) assembly.state = 2 user << "You repaired \the [src] frame." @@ -153,6 +152,7 @@ assembly.state = 1 user << "You cut \the [src] free from the wall." new /obj/item/stack/cable_coil(src.loc, length=2) + assembly = null //so qdel doesn't eat it. qdel(src) // OTHER From 12b9d3092372ee36fe80ca34e3d6d361b176887b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 9 Dec 2015 11:57:57 +0100 Subject: [PATCH 079/148] Gear loadout sanity checking. Adds gear loadout sanity checking to reduce the risk of https://github.com/PolarisSS13/Polaris/issues/376 from happening, as well as ' /datum/'. --- code/modules/client/preferences_gear.dm | 18 ++++++++++++++---- .../modules/mob/living/carbon/human/examine.dm | 1 - 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 9cc57be536..3e6e94ebce 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -18,7 +18,17 @@ var/global/list/gear_datums = list() //create a list of gear datums to sort for(var/type in typesof(/datum/gear)-/datum/gear) - var/datum/gear/G = new type() + var/datum/gear/G = type + if(!initial(G.display_name)) + error("Loadout - Missing display name: [G]") + continue + if(!initial(G.cost)) + error("Loadout - Missing cost: [G]") + continue + if(!initial(G.path)) + error("Loadout - Missing path definition: [G]") + continue + G = new G() var/category = (G.sort_category in sort_categories)? G.sort_category : "unknown" sort_categories[category][G.display_name] = G @@ -127,13 +137,13 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head - /datum/gear/grcap +/datum/gear/grcap display_name = "cap, grey" path = /obj/item/clothing/head/soft/grey cost = 1 slot = slot_head - /datum/gear/ocap +/datum/gear/ocap display_name = "cap, orange" path = /obj/item/clothing/head/soft/orange cost = 1 @@ -205,7 +215,7 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head - /datum/gear/bowler +/datum/gear/bowler display_name = "hat, bowler" path = /obj/item/clothing/head/bowler cost = 1 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 11b0378545..2fe60443c9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -262,7 +262,6 @@ msg += "[t_He] [t_is] [species.show_ssd].\n" var/list/wound_flavor_text = list() - var/list/is_destroyed = list() var/list/is_bleeding = list() for(var/organ_tag in species.has_limbs) From 1a46db4aaf78433cc4a33df26e2e37fac6164c3e Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Wed, 9 Dec 2015 16:23:46 +0000 Subject: [PATCH 080/148] fix #11637 --- code/modules/organs/organ.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index c5dbdc5db5..69aa702f10 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -264,13 +264,13 @@ var/list/organ_cache = list() return switch (severity) if (1.0) - take_damage(0,20) + take_damage(20) return if (2.0) - take_damage(0,7) + take_damage(7) return if(3.0) - take_damage(0,3) + take_damage(3) /obj/item/organ/proc/removed(var/mob/living/user) From f6f6a4ef875503e534750b6d34db171ce3947dbb Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Wed, 9 Dec 2015 17:17:33 -0500 Subject: [PATCH 081/148] Ninjas teleporter: Checks Z levels and distance. Ninjas are able to use a camera console and teleport across the map. This resolves that. --- code/modules/clothing/spacesuits/rig/modules/ninja.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 1ab6067793..96cf6a113a 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -121,6 +121,11 @@ if(T.contains_dense_objects()) H << "You cannot teleport to a location with solid objects." + return 0 + + if(T.z != H.z || get_dist(T, get_turf(H)) > world.view) + H << "You cannot teleport to such a distant object." + return 0 phase_out(H,get_turf(H)) H.forceMove(T) From d5447d9e954a937bc1a18c8baa2f76ad218aff44 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 10 Dec 2015 10:23:49 +1030 Subject: [PATCH 082/148] Fixes #10838 --- code/modules/materials/material_recipes.dm | 2 +- code/modules/materials/materials.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index a5a0608f06..f146e42165 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -11,7 +11,7 @@ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]") - if(integrity>=100) + if(integrity>=50) recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 5247291f7c..ffd1e6ffbc 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -551,7 +551,7 @@ var/list/name_to_material name = "wood" stack_type = /obj/item/stack/material/wood icon_colour = "#824B28" - integrity = 25 + integrity = 50 icon_base = "solid" explosion_resistance = 2 shard_type = SHARD_SPLINTER From f1630108db7ebac8a3fa33cd88c982033b3df83a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 10 Dec 2015 10:32:35 +1030 Subject: [PATCH 083/148] Fixes #10915 --- code/game/objects/items/robot/robot_items.dm | 4 ++++ code/modules/mob/living/silicon/robot/life.dm | 8 ++++++-- code/modules/mob/living/silicon/robot/robot_modules.dm | 2 +- code/setup.dm | 1 + 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index afe50bc2b7..3ccf1fb3a9 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -71,6 +71,10 @@ icon_state = "meson" icon = 'icons/obj/clothing/glasses.dmi' +/obj/item/borg/sight/material + name = "\proper material scanner vision" + sight_mode = BORGMATERIAL + /obj/item/borg/sight/hud name = "hud" var/obj/item/clothing/glasses/hud/hud = null diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index f13a09cf95..48f1fb7cc9 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -145,13 +145,13 @@ /mob/living/silicon/robot/proc/handle_regular_hud_updates() - if (src.stat == 2 || XRAY in mutations || src.sight_mode & BORGXRAY) + if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) src.sight |= SEE_TURFS src.sight |= SEE_MOBS src.sight |= SEE_OBJS src.see_in_dark = 8 src.see_invisible = SEE_INVISIBLE_MINIMUM - else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM) + else if ((src.sight_mode & BORGMESON) && (src.sight_mode & BORGTHERM)) src.sight |= SEE_TURFS src.sight |= SEE_MOBS src.see_in_dark = 8 @@ -160,6 +160,10 @@ src.sight |= SEE_TURFS src.see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM + else if (src.sight_mode & BORGMATERIAL) + src.sight |= SEE_OBJS + src.see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM else if (src.sight_mode & BORGTHERM) src.sight |= SEE_MOBS src.see_in_dark = 8 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 560bf09cc1..df91ca551f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -572,7 +572,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/miner/New() ..() src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/borg/sight/material(src) src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) diff --git a/code/setup.dm b/code/setup.dm index dbb8a00beb..f501e73669 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -494,6 +494,7 @@ #define BORGMESON 1 #define BORGTHERM 2 #define BORGXRAY 4 +#define BORGMATERIAL 8 // Some arbitrary defines to be used by self-pruning global lists. (see master_controller) #define PROCESS_KILL 26 // Used to trigger removal from a processing list. From 7a9d7bf0c9701e6ef23862ded7e3fac36a33134c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 10 Dec 2015 10:41:48 +1030 Subject: [PATCH 084/148] Fixes #10753 --- baystation12.dme | 1 - code/game/asteroid.dm | 162 -------------------------- code/modules/random_map/random_map.dm | 8 -- 3 files changed, 171 deletions(-) delete mode 100644 code/game/asteroid.dm diff --git a/baystation12.dme b/baystation12.dme index a79cce1094..b4eabf68c0 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -203,7 +203,6 @@ #include "code\defines\procs\records.dm" #include "code\defines\procs\sd_Alert.dm" #include "code\defines\procs\statistics.dm" -#include "code\game\asteroid.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" #include "code\game\periodic_news.dm" diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm deleted file mode 100644 index 8aa6b1cd64..0000000000 --- a/code/game/asteroid.dm +++ /dev/null @@ -1,162 +0,0 @@ - -var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger =4, - /obj/item/weapon/pickaxe/silver =4, - /obj/item/weapon/pickaxe/drill =4, - /obj/item/weapon/pickaxe/jackhammer =4, - //mob/living/simple_animal/hostile/carp =3, - /obj/item/weapon/pickaxe/diamond =3, - /obj/item/weapon/pickaxe/diamonddrill =3, - /obj/item/weapon/pickaxe/gold =3, - /obj/item/weapon/pickaxe/plasmacutter =2, - /obj/structure/closet/syndicate/resources =2, - /obj/item/weapon/melee/energy/sword/pirate =1, - /obj/mecha/working/ripley/mining =1 - ) - -var/global/list/spawned_surprises = list() - -var/global/max_secret_rooms = 3 - -proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , var/clean = 0 , var/name) - var/list/room_turfs = list("walls"=list(),"floors"=list()) - - //world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]" - if(!wall) - wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/effect/alien/resin) - if(!floor) - floor = pick(/turf/simulated/floor,/turf/simulated/floor/engine) - - for(var/x = 0,x 100) - return 0 - - T=pick(turfs) - if(!T) - return 0 - - var/list/surroundings = list() - - surroundings += range(7, locate(T.x,T.y,T.z)) - surroundings += range(7, locate(T.x+size,T.y,T.z)) - surroundings += range(7, locate(T.x,T.y+size,T.z)) - surroundings += range(7, locate(T.x+size,T.y+size,T.z)) - - if(locate(/area/mine/explored) in surroundings) // +5s are for view range - valid = 0 - continue - - if(locate(/turf/space) in surroundings) - valid = 0 - continue - - if(locate(/area/asteroid/artifactroom) in surroundings) - valid = 0 - continue - - if(locate(/turf/simulated/floor/plating/airless/asteroid) in surroundings) - valid = 0 - continue - - if(!T) - return 0 - - room = spawn_room(T,size,size,,,1) - - if(room) - T = pick(room["floors"]) - if(T) - var/surprise = null - valid = 0 - while(!valid) - surprise = pickweight(space_surprises) - if(surprise in spawned_surprises) - if(prob(20)) - valid++ - else - continue - else - valid++ - - spawned_surprises.Add(surprise) - new surprise(T) - - return 1 - - diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index 81def6be14..9de319a838 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -162,12 +162,4 @@ var/global/list/random_maps = list() map[check_cell] = 3 ore_count-- - sleep(-1) - - // Place random asteroid rooms. - var/rooms_placed = 0 - for(var/i = 0, i < max_secret_rooms, i++) - if(make_mining_asteroid_secret()) - rooms_placed++ - admin_notice("Placed [rooms_placed] secrets.", R_DEBUG) return 1 \ No newline at end of file From e9cdc8a0f57a066c5fa588912ed1ebcc25327d45 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 10 Dec 2015 11:03:57 +1030 Subject: [PATCH 085/148] Fixes #9257 --- code/modules/mob/living/silicon/robot/robot_modules.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index df91ca551f..42a35e89f6 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -322,6 +322,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal() var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() @@ -675,6 +676,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/weapon/gripper(src) src.modules += new /obj/item/weapon/soap(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) src.emag.name = "Plasma Cutter" From 0f2b17f7bbcd8cf8501f1548c102b88144728620 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Thu, 10 Dec 2015 13:01:06 +0000 Subject: [PATCH 086/148] fix #11631 --- code/modules/reagents/Chemistry-Machinery.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 726303273a..354a648269 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -27,6 +27,7 @@ var/pillsprite = "1" var/client/has_sprites = list() var/max_pill_count = 20 + flags = OPENCONTAINER /obj/machinery/chem_master/New() ..() From ac0e70612feba38c1a3c479700bde0d679fce4ae Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 11 Dec 2015 12:15:53 +0100 Subject: [PATCH 087/148] Fixes #11621 - Fixes #11621 by ensuring reference to analyzed object is nulled even if the analyzed object is not reliable enough - Adds feedback message that warns the user that analyzed item wasn't reliable enough. --- code/modules/mob/living/silicon/robot/robot_items.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 3e072d3d74..9346dbe5d4 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -33,7 +33,9 @@ for(var/T in temp_tech) files.UpdateTech(T, temp_tech[T]) user << "\The [loaded_item] had level [temp_tech[T]] in [T]." - loaded_item = null + else + user << "\The [loaded_item] was not reliable enough to advance research." + loaded_item = null for(var/obj/I in contents) for(var/mob/M in I.contents) M.death() From 1b05724faf44d4e24396cf534212e3d5015422e5 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 11 Dec 2015 12:44:25 +0100 Subject: [PATCH 088/148] Map fixes: Engineering outpost, Construction site - Removes incorrectly set ID tags on some emitters at construction site, this fixes #11527 - Unanchors emitters intended for mining at engineering outpost (as intended) - Turns off "Construction computer core" APC and unlocks it in similar way as the other APC in construction site teleporter room, to prevent power alarms on 3h+ rounds (since the construction site doesn't have working power supply). It is unlocked so anyone can turn it on if it's needed. --- maps/exodus-4.dmm | 4 ++-- maps/exodus-5.dmm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm index 668fdc33a8..bce4896cbb 100644 --- a/maps/exodus-4.dmm +++ b/maps/exodus-4.dmm @@ -87,7 +87,7 @@ "bI" = (/obj/machinery/drone_fabricator/derelict,/turf/simulated/floor/plating/airless,/area/constructionsite/ai) "bJ" = (/turf/simulated/floor/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/constructionsite/ai) "bK" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating/airless,/area/constructionsite/ai) -"bL" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) +"bL" = (/obj/machinery/power/apc/high{dir = 1; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "north bump"; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) "bM" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) "bN" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) "bO" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) @@ -116,7 +116,7 @@ "cl" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) "cm" = (/obj/structure/cable/blue,/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) "cn" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/plating/airless,/area/space) -"co" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; id = "EngineEmitter"; state = 2},/turf/simulated/floor/plating/airless,/area/space) +"co" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; id = null; state = 2},/turf/simulated/floor/plating/airless,/area/space) "cs" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating/airless,/area/constructionsite/ai) "cI" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/wall,/area/constructionsite/hallway/fore) "cJ" = (/obj/structure/lattice,/turf/space,/area/constructionsite/hallway/fore) diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index 17b6e22143..49e21dc47d 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -1160,7 +1160,7 @@ "wp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "wq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "wr" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/outpost/engineering/hallway) -"ws" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"ws" = (/obj/machinery/power/emitter{anchored = 0; dir = 4; state = 0},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "wt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) "wu" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) "wv" = (/turf/simulated/floor,/area/outpost/engineering/atmospherics) From b13e445b40729684f12b21f511fc1ee3b63cf46a Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 11 Dec 2015 13:29:42 +0100 Subject: [PATCH 089/148] Fixes #11456 - Fixes #11456 by using wires.Interact() rather than current method. --- code/game/machinery/suit_storage_unit.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d1e728e676..e67a68d931 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -819,15 +819,12 @@ dat += "
      \[apply customisation routine\]


      " if(panel_open) - dat += wires() + wires.Interact(user) user << browse(dat, "window=suit_cycler") onclose(user, "suit_cycler") return -/obj/machinery/suit_cycler/proc/wires() - return wires.GetInteractWindow() - /obj/machinery/suit_cycler/Topic(href, href_list) if(href_list["eject_suit"]) if(!suit) return From 02d1a875d1445c7b86dc850288c72221376d566d Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Fri, 11 Dec 2015 18:26:52 -0700 Subject: [PATCH 090/148] Fixes #7075 Disposal holders will now be emptied if they get expelled from a disposal pipe, instead of sitting there hoarding their contents. --- code/modules/recycling/disposal.dm | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 9dd8d1f956..8658815f5f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -740,16 +740,19 @@ // expel the held objects into a turf // called when there is a break in the pipe - // - proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) - - var/turf/target - - if(T.density) // dense ouput turf, so stop holder - H.active = 0 - H.loc = src + if(!istype(H)) return + + // Empty the holder if it is expelled into a dense turf. + // Leaving it intact and sitting in a wall is stupid. + if(T.density) + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + return + if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/F = T //F.health = 100 @@ -759,6 +762,7 @@ new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff F.icon_state = "Floor[F.burnt ? "1" : ""]" + var/turf/target if(direction) // direction is specified if(istype(T, /turf/space)) // if ended in space, then range is unlimited target = get_edge_target_turf(T, direction) From eae12b8f9c14e872c99e18a76c0bdde77ffd9de4 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Fri, 11 Dec 2015 19:52:18 -0700 Subject: [PATCH 091/148] Fixes #8568 --- code/modules/admin/verbs/randomverbs.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 0561e53791..b5bbdb8b69 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -520,7 +520,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if(! (C.stat & (BROKEN|NOPOWER) ) ) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) P.name = "'[command_name()] Update.'" - P.info = input + P.info = replacetext(input, "\n", "
      ") + P.update_space(P.info) P.update_icon() C.messagetitle.Add("[command_name()] Update") C.messagetext.Add(P.info) From a97da84b185538f9678885ff72454bfcc8b87364 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Fri, 11 Dec 2015 21:25:23 -0700 Subject: [PATCH 092/148] Fixes #11093 Also fixes a runtime error trying to disposal monkeys and the like. It was doing a type check too late. --- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/recycling/disposal.dm | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index df1db58a34..c90d06c008 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1379,7 +1379,7 @@ /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(holder_type && a_intent == "help" && H.a_intent == "help" && istype(H) && !issmall(H) && Adjacent(H)) + if(holder_type && a_intent == "help" && istype(H) && H == usr && H.a_intent == "help" && !issmall(H) && Adjacent(H)) get_scooped(H) return return ..() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 8658815f5f..a911a5572c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -145,9 +145,15 @@ // mouse drop another mob or self // /obj/machinery/disposal/MouseDrop_T(mob/target, mob/user) - if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) + if(user.stat || !user.canmove || !istype(target)) return - if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal + if(target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1) + return + + //animals cannot put mobs other than themselves into disposal + if(isanimal(user) && target != user) + return + src.add_fingerprint(user) var/target_loc = target.loc var/msg From 1927d1744fd46f71046d5e4036c49e231ba1fa3f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 12 Dec 2015 13:57:26 +0300 Subject: [PATCH 093/148] Fixes #11667 --- code/modules/mob/emote.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 54f31d5b5b..0948befb2a 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -2,9 +2,8 @@ //m_type == 1 --> visual. //m_type == 2 --> audible /mob/proc/custom_emote(var/m_type=1,var/message = null) - if(stat || !use_me && usr == src) - usr << "You are unable to emote." + src << "You are unable to emote." return var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) From 37a93231d6c591f167cedc54d25b916026cf6115 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 12 Dec 2015 14:09:59 +0300 Subject: [PATCH 094/148] Fixes #8741 --- code/game/verbs/ooc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 82fef02e97..0cb18bb153 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -105,7 +105,7 @@ log_ooc("(LOCAL) [mob.name]/[key] : [msg]") var/mob/source = src.mob - var/list/heard = get_mobs_in_view(7, source) + var/list/heard = get_mobs_in_view(7, get_turf(source)) var/display_name = source.key if(holder && holder.fakekey) From e89eae05bb99faed75a0785cb4c4f0e2871112b5 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 12 Dec 2015 14:23:00 +0300 Subject: [PATCH 095/148] Fixes #9197 --- .../mob/new_player/preferences_setup.dm | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 00b6a3b8e4..8ea1444f83 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -6,15 +6,24 @@ datum/preferences gender = MALE else gender = FEMALE - s_tone = random_skin_tone() + var/datum/species/current_species = all_species[species] + + if(current_species) + if(current_species.flags & HAS_SKIN_TONE) + s_tone = random_skin_tone() + if(current_species.flags & HAS_EYE_COLOR) + randomize_eyes_color() + if(current_species.flags & HAS_SKIN_COLOR) + randomize_skin_color() + if(current_species.flags & HAS_UNDERWEAR) + underwear = rand(1,underwear_m.len) + undershirt = rand(1,undershirt_t.len) + h_style = random_hair_style(gender, species) f_style = random_facial_hair_style(gender, species) randomize_hair_color("hair") randomize_hair_color("facial") - randomize_eyes_color() - randomize_skin_color() - underwear = rand(1,underwear_m.len) - undershirt = rand(1,undershirt_t.len) + backbag = 2 age = rand(AGE_MIN,AGE_MAX) if(H) From 89407059213864f4dcb3c7ee7a2e88fad8356dba Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 12 Dec 2015 14:40:51 +0300 Subject: [PATCH 096/148] Fixes #9091 --- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/security.dm | 2 +- code/game/machinery/computer3/computers/medical.dm | 2 +- code/game/machinery/computer3/computers/security.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 65322b741d..2c44b6164c 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -457,7 +457,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
      [t1]") + src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
      [t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index f7327c2a88..92e03f0185 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -391,7 +391,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
      [t1]") + active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
      [t1]") if ("Delete Record (ALL)") if (active1) diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm index aec0b615f5..0533f7bc0f 100644 --- a/code/game/machinery/computer3/computers/medical.dm +++ b/code/game/machinery/computer3/computers/medical.dm @@ -470,7 +470,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
      [t1]") + src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
      [t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index f2de764894..8a866586fd 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -410,7 +410,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
      [t1]") + active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
      [t1]") if ("Delete Record (ALL)") if (active1) From 0a4ebb276565f8a45dd42d411cecdbe2c49a1d44 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 12 Dec 2015 15:08:18 +0300 Subject: [PATCH 097/148] Fixes #10751 Thrown items now use last_move direction isntead of neverchanging dir --- code/game/atoms_movable.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index cd36a5ab0b..07b2edc0a8 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -78,7 +78,7 @@ else if(isobj(hit_atom)) var/obj/O = hit_atom if(!O.anchored) - step(O, src.dir) + step(O, src.last_move) O.hitby(src,speed) else if(isturf(hit_atom)) @@ -86,7 +86,7 @@ var/turf/T = hit_atom if(T.density) spawn(2) - step(src, turn(src.dir, 180)) + step(src, turn(src.last_move, 180)) if(istype(src,/mob/living)) var/mob/living/M = src M.turf_collision(T, speed) From 637abb5d124b4617534762d9c5d77db076553302 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 12 Dec 2015 15:12:44 +0300 Subject: [PATCH 098/148] Fixes #10597 --- code/modules/mob/living/carbon/human/human.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 589bcb0445..b7a6f0219b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -764,7 +764,8 @@ if(!check_has_mouth()) return - + if(stat == DEAD) + return if(!lastpuke) lastpuke = 1 src << "You feel nauseous..." From 6c3972f979288aaeb47ea79f269d3faf287706b6 Mon Sep 17 00:00:00 2001 From: Kearel Date: Sat, 12 Dec 2015 12:47:08 -0600 Subject: [PATCH 099/148] Fixes #10550 From what I could tell the bugs were caused by the HUD not being removed and spells not being properly removed from players. --- code/modules/spells/targeted/mind_transfer.dm | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/code/modules/spells/targeted/mind_transfer.dm b/code/modules/spells/targeted/mind_transfer.dm index a3668a53d1..1f20e6afbf 100644 --- a/code/modules/spells/targeted/mind_transfer.dm +++ b/code/modules/spells/targeted/mind_transfer.dm @@ -48,13 +48,15 @@ victim.verbs -= V var/mob/dead/observer/ghost = victim.ghostize(0) - ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. + ghost.spell_list += victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. caster.mind.transfer_to(victim) - victim.spell_list = list() //clear those out - for(var/spell/S in caster.spell_list) - victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD - caster.spell_list = list() //clean that out as well + for(var/spell/S in victim.spell_list) //get rid of spells the new way + victim.remove_spell(S) //This will make it so that players will not get the HUD and all that spell bugginess that caused copies of spells and stuff of that nature. + + for(var/spell/S in caster.spell_list) + victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD + caster.remove_spell(S) //remove the spells from the caster if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. for(var/V in caster.mind.special_verbs)//Not too important but could come into play. @@ -62,9 +64,9 @@ ghost.mind.transfer_to(caster) caster.key = ghost.key //have to transfer the key since the mind was not active - for(var/spell/S in ghost.spell_list) - caster.add_spell(S) - ghost.spell_list = list() + for(var/spell/S in ghost.spell_list) + caster.add_spell(S) + ghost.spell_list = list() if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. for(var/V in caster.mind.special_verbs) @@ -76,4 +78,4 @@ //After a certain amount of time the victim gets a message about being in a different body. spawn(msg_wait) - caster << "You feel woozy and lightheaded. Your body doesn't seem like your own." + caster << "You feel woozy and lightheaded. Your body doesn't seem like your own." From d10118e3d047091fc39e0468ffb5b718e9134846 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sat, 12 Dec 2015 12:03:15 -0700 Subject: [PATCH 100/148] Fixes #11346 Fixes #8123 Removes adminbus ability to call down the Icarus... because it's pretty broken. --- baystation12.dme | 1 - code/modules/admin/admin_verbs.dm | 3 - code/modules/admin/verbs/icarus.dm | 130 ------------------ .../projectiles/guns/energy/special.dm | 52 ------- .../modules/projectiles/projectile/special.dm | 13 -- 5 files changed, 199 deletions(-) delete mode 100644 code/modules/admin/verbs/icarus.dm diff --git a/baystation12.dme b/baystation12.dme index b4eabf68c0..1c02e399cb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -835,7 +835,6 @@ #include "code\modules\admin\verbs\diagnostics.dm" #include "code\modules\admin\verbs\dice.dm" #include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\icarus.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\massmodvar.dm" #include "code\modules\admin\verbs\modifyvariables.dm" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 2c58b2dc82..064f10820d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -125,9 +125,6 @@ var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/ /client/proc/respawn_character, - /client/proc/FireLaser, - /client/proc/FireCannons, - /client/proc/ChangeIcarusPosition, /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge ) diff --git a/code/modules/admin/verbs/icarus.dm b/code/modules/admin/verbs/icarus.dm deleted file mode 100644 index fd296dacee..0000000000 --- a/code/modules/admin/verbs/icarus.dm +++ /dev/null @@ -1,130 +0,0 @@ -/client/proc/FireLaser() - set name = "Fire the Icarus lasers" - set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost" - set category = "Fun" - - var/turf/target = get_turf(src.mob) - log_and_message_admins("has fired the Icarus point defense laser at [target.x]-[target.y]-[target.z]") - if(!src.holder) - src << "Only administrators may use this command." - return - - Icarus_FireLaser(target) - - -/client/proc/FireCannons() - set name = "Fire the Icarus cannons" - set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost." - set category = "Fun" - - var/turf/target = get_turf(src.mob) - log_and_message_admins("has fired the Icarus main gun projectile at [target.x]-[target.y]-[target.z]") - if(!src.holder) - src << "Only administrators may use this command." - return - - Icarus_FireCannon(target) - - -/client/proc/ChangeIcarusPosition() - set name = "Adjust Icarus Position" - set desc = "Lets you chose the position of the Icarus in regards to the map." - set category = "Fun" - - log_and_message_admins("is changing the Icarus position.") - if(!src.holder) - src << "Only administrators may use this command." - return - - Icarus_SetPosition(src) - -var/icarus_position = SOUTH - -proc/Icarus_FireLaser(var/turf/target) - // Find the world edge to fire from. - var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x - var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y - var/x_off = x != target.x ? abs(target.x - x) : INFINITY - var/y_off = y != target.y ? abs(target.y - y) : INFINITY - // Get the minimum number of steps using the rise/run shit. - var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing. - - // Now we can get the location of the start. - x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0) - y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0) - - var/turf/start = locate(x, y, target.z) - - // should step down as: - // 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90 - var/damage = 1000 - for(var/i in 2 to 12) - var/obj/item/projectile/beam/in_chamber = new (start) - in_chamber.original = target - in_chamber.starting = start - in_chamber.silenced = 1 - in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0 - in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0 - in_chamber.damage = damage - in_chamber.kill_count = 500 - in_chamber.process() - damage -= damage / i - sleep(-1) - - // Let everyone know what hit them. - var/obj/item/projectile/beam/in_chamber = new (start) - in_chamber.original = target - in_chamber.starting = start - in_chamber.silenced = 0 - in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0 - in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0 - in_chamber.kill_count = 500 - in_chamber.damage = 0 - in_chamber.name = "point defense laser" - in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message. - in_chamber.process() - -proc/Icarus_FireCannon(var/turf/target) - // Find the world edge to fire from. - var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x - var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y - var/x_off = x != target.x ? abs(target.x - x) : INFINITY - var/y_off = y != target.y ? abs(target.y - y) : INFINITY - // Get the minimum number of steps using the rise/run shit. - var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing. - - // Now we can get the location of the start. - x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0) - y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0) - - var/turf/start = locate(x, y, target.z) - - // Now we find the corresponding turf on the other side of the level. - // Yeah, yeah. Overuse of the terinary operator. So sue me. - x = icarus_position & EAST ? 1 : icarus_position & WEST ? world.maxx : target.x - y = icarus_position & NORTH ? 1 : icarus_position & SOUTH ? world.maxy : target.y - x_off = x != target.x ? abs(target.x - x) : INFINITY - y_off = y != target.y ? abs(target.y - y) : INFINITY - iterations = round(min(x_off, y_off)) - x = target.x + (icarus_position & EAST ? -iterations : icarus_position & WEST ? iterations : 0) - y = target.y + (icarus_position & NORTH ? -iterations : icarus_position & SOUTH ? iterations : 0) - target = locate(x, y, target.z) - - // Finally fire the fucker. - var/obj/effect/meteor/small/projectile = new (start) - projectile.dest = target - projectile.name = "main gun projectile" // stealthy - projectile.hits = 6 - projectile.detonation_chance = 99 // it's a missile/cannon round thing! - - // Make sure it travels - spawn(0) - walk_towards(projectile, projectile.dest, 1) - -proc/Icarus_SetPosition(var/user) - var/global/list/directions = list("North" = 1, "North East" = 5, "East" = 4, "South East" = 6, "South" = 2, "South West" = 10, "West" = 8, "North West" = 9) - var/direction = input(user, "Where should the Icarus fire from?", "Icarus Comms") as null|anything in directions - if(!direction) - return - - icarus_position = directions[direction] diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d9ef1b9504..fce41f1d4b 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -149,55 +149,3 @@ obj/item/weapon/gun/energy/staff/focus user << "The [src.name] will now strike only a single person." projectile_type = "/obj/item/projectile/forcebolt" */ - -/* Adminbus guns */ - -// Serves as a target spotter for the Icarus. -/obj/item/weapon/gun/energy/icarus - name = "rubber ducky" - desc = "It's a cute rubber duck. With an evil gleam in it's eye." - projectile_type = /obj/item/projectile/icarus/pointdefense - icon = 'icons/obj/watercloset.dmi' - item_icons = null - icon_state = "rubberducky" - item_state = "rubberducky" - charge_cost = 0 - silenced = 1 - -/obj/item/weapon/gun/energy/icarus/attack_self(mob/living/user as mob) - if(projectile_type == /obj/item/projectile/icarus/pointdefense) - projectile_type = /obj/item/projectile/icarus/guns - user << "You inform the Icarus to switch to the main guns." - else - projectile_type = /obj/item/projectile/icarus/pointdefense - user << "You inform the Icarus to switch to the point-defense lasers." - - . = ..() - -/obj/item/weapon/gun/energy/icarus/update_icon() - return - -/obj/item/weapon/gun/energy/icarus/verb/SetIcarusAngle() - set src in usr - set name = "Set Firing Angle" - set desc = "Sets the angle from which the icarus will fire." - set category = "Object" - - Icarus_SetPosition(usr) - - -/obj/item/weapon/gun/energy/variable - name = "abstract weapon" - desc = "It seems to shift and flow as you watch." - charge_cost = 0 - silenced = 1 - -/obj/item/weapon/gun/energy/variable/update_icon() - return - -/obj/item/weapon/gun/energy/variable/attack_self(mob/living/user as mob) - var/type = input(user,"What projectile type?","Projectile", null) as null|anything in typesof(/obj/item/projectile) - if(!type) - return ..() - projectile_type = type - . = ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 9ef0aea43c..8a4ddc2d6b 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -137,16 +137,3 @@ var/mob/living/carbon/human/M = target M.adjustBrainLoss(20) M.hallucination += 20 - -/obj/item/projectile/icarus/pointdefense/process() - Icarus_FireLaser(get_turf(original)) - spawn - qdel(src) - - return - -/obj/item/projectile/icarus/guns/process() - Icarus_FireCannon(get_turf(original)) - spawn - qdel(src) - return From f9af885ee1e06f0a391c808bcf42c1feb9eaec84 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sat, 12 Dec 2015 14:32:22 -0700 Subject: [PATCH 101/148] Admin created newscaster channels now function correctly. Fixes #8326 --- code/modules/admin/topic.dm | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 45397fa097..de178bc298 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2411,13 +2411,8 @@ else var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") - var/datum/feed_channel/newChannel = new /datum/feed_channel - newChannel.channel_name = src.admincaster_feed_channel.channel_name - newChannel.author = src.admincaster_signature - newChannel.locked = src.admincaster_feed_channel.locked - newChannel.is_admin_channel = 1 - feedback_inc("newscaster_channels",1) - news_network.network_channels += newChannel //Adding channel to the global network + news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1) + feedback_inc("newscaster_channels",1) //Adding channel to the global network log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!") src.admincaster_screen=5 src.access_news_network() From ddf66a5f39ec1c8d59dda19dcd233e90cb62de2a Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Sat, 12 Dec 2015 21:56:37 +0000 Subject: [PATCH 102/148] fix slime core injecting not working --- code/modules/mob/living/carbon/metroid/items.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm index 6739cb4e2b..1271bb7da3 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -11,6 +11,7 @@ origin_tech = "biotech=4" var/Uses = 1 // uses before it goes inert var/enhanced = 0 //has it been enhanced before? + flags = OPENCONTAINER attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/weapon/slimesteroid2)) From a5b0f86c194db2ee190a48845a4bc4cf6b563a54 Mon Sep 17 00:00:00 2001 From: Joseph Heinemeyer Date: Sat, 12 Dec 2015 15:24:13 -0700 Subject: [PATCH 103/148] s/"help"/I_HELP/g --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c90d06c008..cabbc1474f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1379,7 +1379,7 @@ /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(holder_type && a_intent == "help" && istype(H) && H == usr && H.a_intent == "help" && !issmall(H) && Adjacent(H)) + if(holder_type && a_intent == I_HELP && istype(H) && H == usr && H.a_intent == I_HELP && !issmall(H) && Adjacent(H)) get_scooped(H) return return ..() From 415f78ee186a3338261a9f9044f6bc69ae0c3dea Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sat, 12 Dec 2015 16:29:05 -0700 Subject: [PATCH 104/148] Chem grenades are no longer melted by acid. Fixes #10478 --- code/game/objects/items/weapons/grenades/chem_grenade.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index b559527ef7..d010e70b0f 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -6,6 +6,7 @@ w_class = 2.0 force = 2.0 det_time = null + unacidable = 1 var/stage = 0 var/state = 0 var/path = 0 From b31a5ba836fa154e1db73c7dab551801329cf347 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 13 Dec 2015 10:21:00 +0100 Subject: [PATCH 105/148] Compilation fixes. --- code/__defines/mobs.dm | 1 + code/game/verbs/ooc.dm | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index ef268bf1e6..d7db1726e3 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -25,6 +25,7 @@ #define BORGMESON 1 #define BORGTHERM 2 #define BORGXRAY 4 +#define BORGMATERIAL 8 #define HOSTILE_STANCE_IDLE 1 #define HOSTILE_STANCE_ALERT 2 diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 0cb0067eb5..f2a2d74f11 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -108,7 +108,7 @@ log_ooc("(LOCAL) [mob.name]/[key] : [msg]") var/mob/source = mob.get_looc_source() - var/list/heard = get_mobs_in_view(7, get_turf(source)) + var/list/heard = get_mobs_or_objects_in_view(7, get_turf(source), 1, 0) var/display_name = key if(holder && holder.fakekey) From 1e06889ef1f37b50348b607791b549306af62d16 Mon Sep 17 00:00:00 2001 From: Dibasic Date: Sun, 13 Dec 2015 03:18:43 -0600 Subject: [PATCH 106/148] Fixes window 'bang' typo Fixes the typo when harm-intent clicking a window with your bare hand: [usr.name] bangs against the [src.name]!", - "<You bang against the [src.name]!", + "You bang against the [src.name]!", "You hear a banging sound.") else playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) From a2d2a092c5e516e04a5d36b523521793793406ac Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 13 Dec 2015 15:18:46 +0100 Subject: [PATCH 107/148] All the macros. --- code/game/objects/structures/window.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ffb0d7f954..5c65b7f2e5 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -187,8 +187,8 @@ playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) user.do_attack_animation(src) - usr.visible_message("[usr.name] bangs against the [src.name]!", - "You bang against the [src.name]!", + usr.visible_message("\The [usr] bangs against \the [src]!", + "You bang against \the [src]!", "You hear a banging sound.") else playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) @@ -292,7 +292,7 @@ if(usr.incapacitated()) return 0 - + if(anchored) usr << "It is fastened to the floor therefore you can't rotate it!" return 0 From d1f14cd16d04d05a870b51c9d85cf6046d370fb2 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Tue, 15 Dec 2015 13:42:31 +0100 Subject: [PATCH 108/148] Fixes duplicate gas layers --- code/ZAS/Controller.dm | 7 ++++--- code/ZAS/Zone.dm | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm index a2d9bcd972..b53afffe5c 100644 --- a/code/ZAS/Controller.dm +++ b/code/ZAS/Controller.dm @@ -154,18 +154,18 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG var/updated = 0 #endif - + //defer updating of self-zone-blocked turfs until after all other turfs have been updated. //this hopefully ensures that non-self-zone-blocked turfs adjacent to self-zone-blocked ones //have valid zones when the self-zone-blocked turfs update. var/list/deferred = list() - + for(var/turf/T in updating) //check if the turf is self-zone-blocked if(T.c_airblock(T) & ZONE_BLOCKED) deferred += T continue - + T.update_air_properties() T.post_update_air_properties() T.needs_air_update = 0 @@ -234,6 +234,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/remove_zone(zone/z) zones.Remove(z) + zones_to_update.Remove(z) /datum/controller/air_system/proc/air_blocked(turf/A, turf/B) #ifdef ZASDBG diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index 9fcddc9246..da39b868d3 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -108,11 +108,12 @@ Class Procs: c_invalidate() for(var/turf/simulated/T in contents) into.add(T) + T.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG T.dbg(merged) #endif - - //rebuild the old zone's edges so that the will be possesed by the new zone + + //rebuild the old zone's edges so that they will be possessed by the new zone for(var/connection_edge/E in edges) if(E.contains_zone(into)) continue //don't need to rebuild this edge From f62f24e1aca78cb82f46ef5adcfc300dae4cd373 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 16 Dec 2015 12:54:34 +0100 Subject: [PATCH 109/148] Removes Stat() sleep. Fixes a Stat() runtime that occasionally occur if the client was logged out when the sleep() was done sleeping. Fixes delays when using alt+Turf click. Makes the alt+Turf click panel only update when viewed instead. Seems like the better performance fix option in general. Makes the alt+Turf click panel always use the "Turf" name, consistency. --- code/_onclick/click.dm | 2 +- code/modules/mob/mob.dm | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 56af5949f7..3d7622a713 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -291,7 +291,7 @@ user.listed_turf = null else user.listed_turf = T - user.client.statpanel = T.name + user.client.statpanel = "Turf" return /mob/proc/TurfAdjacent(var/turf/T) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a81c943503..b42b2c9f72 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -658,17 +658,17 @@ if(!TurfAdjacent(listed_turf)) listed_turf = null else - statpanel(listed_turf.name, null, listed_turf) - for(var/atom/A in listed_turf) - if(!A.mouse_opacity) - continue - if(A.invisibility > see_invisible) - continue - if(is_type_in_list(A, shouldnt_see)) - continue - statpanel(listed_turf.name, null, A) + if(statpanel("Turf")) + stat("\icon[listed_turf]", listed_turf.name) + for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue + if(A.invisibility > see_invisible) + continue + if(is_type_in_list(A, shouldnt_see)) + continue + stat(A) - sleep(4) //Prevent updating the stat panel for the next .4 seconds, prevents clientside latency from updates // facing verbs /mob/proc/canface() From a515f0469ab5d40dc9a159ae7c6a78db2b5275c8 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Wed, 16 Dec 2015 17:59:05 +0300 Subject: [PATCH 110/148] Wrenched opwn welding tanks now explode when exposed to fire. #11537 --- code/modules/reagents/reagent_dispenser.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 7fc8ebf8ab..f259889aee 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -171,7 +171,9 @@ qdel(src) /obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) - if(temperature > T0C+500) + if (modded) + explode() + else if (temperature > T0C+500) explode() return ..() From f2ac9a023bd38ce57db12fb15b7060314cd106b0 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Wed, 16 Dec 2015 19:36:14 +0300 Subject: [PATCH 111/148] pAIs no longer see custom emotes twice. fuck i spent way too much time on a single line fix --- code/game/objects/items/devices/paicard.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index eed6cdb12e..7edf72e9a5 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -320,7 +320,7 @@ qdel(src) /obj/item/device/paicard/see_emote(mob/living/M, text) - if(pai && pai.client) + if(pai && pai.client && !pai.canmove) var/rendered = "[text]" pai.show_message(rendered, 2) ..() \ No newline at end of file From 485a2fdd45940a1c48e4854294401ac050e4fed0 Mon Sep 17 00:00:00 2001 From: Spamcat Date: Wed, 16 Dec 2015 20:07:35 +0300 Subject: [PATCH 112/148] Made kitchen utensils less dangerous. #11370 --- code/game/objects/items/weapons/material/kitchen.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 55c5151934..088069a26f 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -44,7 +44,8 @@ overlays.Cut() return else - ..() + user << "\red You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK GODDAMNIT + return /obj/item/weapon/material/kitchen/utensil/fork name = "fork" From 8df6ee3318af7f2188538312fa6dd23f86cf9d3e Mon Sep 17 00:00:00 2001 From: Spamcat Date: Wed, 16 Dec 2015 20:21:10 +0300 Subject: [PATCH 113/148] \red >> styles --- code/game/objects/items/weapons/material/kitchen.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 088069a26f..d15eae3431 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -44,7 +44,7 @@ overlays.Cut() return else - user << "\red You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK GODDAMNIT + user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK GODDAMNIT return /obj/item/weapon/material/kitchen/utensil/fork @@ -78,14 +78,14 @@ /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You accidentally cut yourself with the [src]." + user << "You accidentally cut yourself with the [src]." user.take_organ_damage(20) return return ..() /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You somehow managed to cut yourself with the [src]." + user << "You somehow managed to cut yourself with the [src]." user.take_organ_damage(20) return return ..() @@ -108,7 +108,7 @@ /obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "\red The [src] slips out of your hand and hits your head." + user << "The [src] slips out of your hand and hits your head." user.take_organ_damage(10) user.Paralyse(2) return From 905070bc96a14a98dba03d938ec08ca34d14876d Mon Sep 17 00:00:00 2001 From: Spamcat Date: Wed, 16 Dec 2015 20:30:26 +0300 Subject: [PATCH 114/148] \the --- code/game/objects/items/weapons/material/kitchen.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index d15eae3431..9c160f028d 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -78,14 +78,14 @@ /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "You accidentally cut yourself with the [src]." + user << "You accidentally cut yourself with \the [src]." user.take_organ_damage(20) return return ..() /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "You somehow managed to cut yourself with the [src]." + user << "You somehow managed to cut yourself with \the [src]." user.take_organ_damage(20) return return ..() @@ -108,7 +108,7 @@ /obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "The [src] slips out of your hand and hits your head." + user << "\The [src] slips out of your hand and hits your head." user.take_organ_damage(10) user.Paralyse(2) return From dc2ad43dc5c4ae5d67e9fd03a207f153f8587a1d Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Wed, 16 Dec 2015 02:28:19 +0100 Subject: [PATCH 115/148] No verbose cantouch check when not climbable --- code/game/objects/buckling.dm | 3 ++- code/game/objects/structures.dm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 93c2fd57bb..02d85234ed 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -56,7 +56,8 @@ user << "You can't buckle anyone in before the game starts." if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat || istype(user, /mob/living/silicon/pai)) return - + if(M == buckled_mob) + return if(istype(M, /mob/living/carbon/slime)) user << "The [M] is too squishy to buckle in." return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 8039814f4f..f344758b49 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -79,7 +79,7 @@ return ..() /obj/structure/proc/can_climb(var/mob/living/user, post_climb_check=0) - if (!can_touch(user) || !climbable || (!post_climb_check && (user in climbers))) + if (!climbable || !can_touch(user) || (!post_climb_check && (user in climbers))) return 0 if (!user.Adjacent(src)) From 56d8975a191f240dada590cd904208cca7b46438 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Tue, 15 Dec 2015 13:57:52 +0100 Subject: [PATCH 116/148] Tweaks Filtering and Toxic Gases --- code/__defines/machinery.dm | 4 ++-- code/modules/mob/living/carbon/human/life.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index de6bae21ce..05a9eeaa92 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -91,11 +91,11 @@ var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret // Will not bother pumping or filtering if the gas source as fewer than this amount of moles, to help with performance. #define MINIMUM_MOLES_TO_PUMP 0.01 -#define MINIMUM_MOLES_TO_FILTER 0.1 +#define MINIMUM_MOLES_TO_FILTER 0.04 // The flow rate/effectiveness of various atmos devices is limited by their internal volume, // so for many atmos devices these will control maximum flow rates in L/s. #define ATMOS_DEFAULT_VOLUME_PUMP 200 // Liters. #define ATMOS_DEFAULT_VOLUME_FILTER 200 // L. #define ATMOS_DEFAULT_VOLUME_MIXER 200 // L. -#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. \ No newline at end of file +#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 73f8cc01b0..1f6a520e48 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -386,7 +386,7 @@ safe_pressure_min *= 1.25 var/safe_exhaled_max = 10 - var/safe_toxins_max = 0.005 + var/safe_toxins_max = 0.2 var/SA_para_min = 1 var/SA_sleep_min = 5 var/inhaled_gas_used = 0 From 07e81c059c81021fcfa8ed0a4af7b7a7f2a4e7b2 Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Fri, 18 Dec 2015 20:12:46 +1300 Subject: [PATCH 117/148] Fixed bullets traveling diagonally through windows - Fixes #11465 --- code/game/objects/structures/window.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index fc9f5b6a19..0ac02fbeb7 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -140,7 +140,7 @@ return 1 if(is_full_window()) return 0 //full tile window, you can't move into it! - if(get_dir(loc, target) == dir) + if(get_dir(loc, target) & dir) return !density else return 1 From 378f62b81ec6f63b12ca856e9258949e20213677 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 19 Dec 2015 11:44:37 +0100 Subject: [PATCH 118/148] AI qdel() improvements. AI destruction now cleans up more of its held objects and variables. Fixes some issues with the AI powersupply qdel(). Fixes #11710. --- code/modules/mob/living/silicon/ai/ai.dm | 34 +++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ba42e42c75..0c9435481a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -158,7 +158,6 @@ var/list/ai_verbs_default = list( spawn(5) new /obj/machinery/ai_powersupply(src) - hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[LIFE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") @@ -199,8 +198,23 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/Destroy() ai_list -= src + qdel(eyeobj) - ..() + eyeobj = null + + qdel(psupply) + psupply = null + + qdel(aiMulti) + aiMulti = null + + qdel(aiRadio) + aiRadio = null + + qdel(aiCamera) + aiCamera = null + + return ..() /mob/living/silicon/ai/pointed(atom/A as mob|obj|turf in view()) set popup_menu = 0 @@ -234,20 +248,22 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null) powered_ai = ai powered_ai.psupply = src - if(isnull(powered_ai)) - qdel(src) - - loc = powered_ai.loc - use_power(1) // Just incase we need to wake up the power system. + forceMove(powered_ai.loc) ..() + use_power(1) // Just incase we need to wake up the power system. + +/obj/machinery/ai_powersupply/Destroy() + . = ..() + powered_ai = null /obj/machinery/ai_powersupply/process() - if(!powered_ai || powered_ai.stat & DEAD) - qdel() + if(!powered_ai || powered_ai.stat == DEAD) + qdel(src) return if(powered_ai.psupply != src) // For some reason, the AI has different powersupply object. Delete this one, it's no longer needed. qdel(src) + return if(powered_ai.APU_power) use_power = 0 return From 8b3724e3e3f9a4c55e874e015f33e6bb8782cba0 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 19 Dec 2015 22:01:38 +0100 Subject: [PATCH 119/148] Ports Kun-Peng's general map merge scripts. These backups all *.dmm files in the maps folder, rather than those with specific names. --- tools/mapmerge/1prepare_map.bat | 5 ++--- tools/mapmerge/2clean_map.bat | 6 +++--- tools/mapmerge/clean_map_git.sh | 11 +++++------ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/tools/mapmerge/1prepare_map.bat b/tools/mapmerge/1prepare_map.bat index 2092086bf7..365d5f00e8 100644 --- a/tools/mapmerge/1prepare_map.bat +++ b/tools/mapmerge/1prepare_map.bat @@ -1,8 +1,7 @@ -SET z_levels=6 cd ../../maps -FOR /L %%i IN (1,1,%z_levels%) DO ( - copy exodus-%%i.dmm exodus-%%i.dmm.backup +FOR %%f IN (*.dmm) DO ( + copy %%f %%f.backup ) pause diff --git a/tools/mapmerge/2clean_map.bat b/tools/mapmerge/2clean_map.bat index 84cbfd5d35..a719963df4 100644 --- a/tools/mapmerge/2clean_map.bat +++ b/tools/mapmerge/2clean_map.bat @@ -1,8 +1,8 @@ SET z_levels=6 cd -FOR /L %%i IN (1,1,%z_levels%) DO ( - java -jar MapPatcher.jar -clean ../../maps/exodus-%%i.dmm.backup ../../maps/exodus-%%i.dmm ../../maps/exodus-%%i.dmm +FOR %%f IN (../../maps/*.dmm) DO ( + java -jar MapPatcher.jar -clean ../../maps/%%f.backup ../../maps/%%f ../../maps/%%f ) -pause \ No newline at end of file +pause diff --git a/tools/mapmerge/clean_map_git.sh b/tools/mapmerge/clean_map_git.sh index e8ad8165e4..25cef6da93 100755 --- a/tools/mapmerge/clean_map_git.sh +++ b/tools/mapmerge/clean_map_git.sh @@ -1,10 +1,9 @@ -#!/bin/bash +#!/bin/sh -for i in {1..6} +for MAPFILE in ../../maps/*.dmm do - MAPFILE="exodus-$i.dmm" - - git show HEAD:maps/$MAPFILE > tmp.dmm - java -jar MapPatcher.jar -clean tmp.dmm '../../maps/'$MAPFILE '../../maps/'$MAPFILE + MAPNAME=$(basename $MAPFILE) + git show HEAD:maps/$MAPNAME > tmp.dmm + java -jar MapPatcher.jar -clean tmp.dmm $MAPFILE $MAPFILE rm tmp.dmm done From ce3587d867e16c8d7561c3a4948b9ddd57888c39 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Sat, 19 Dec 2015 21:33:02 -0500 Subject: [PATCH 120/148] Hallucinations no longer burn on the SuperMatter --- code/modules/supermatter/supermatter.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index fb62f49325..1ee9f99c45 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -305,6 +305,8 @@ /obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj) + if(istype(AM, /obj/effect)) + return if(istype(AM, /mob/living)) AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ From c78f98754a29274c25f873705e0f878d48f00a2a Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 20 Dec 2015 11:46:42 +0100 Subject: [PATCH 121/148] Utensils now respect the lack of mouths, and has a delay on feeding others. --- baystation12.dme | 1 - code/game/objects/items/weapons/kitchen.dm | 0 code/game/objects/items/weapons/material/kitchen.dm | 10 ++++++---- 3 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 code/game/objects/items/weapons/kitchen.dm diff --git a/baystation12.dme b/baystation12.dme index d0c5db16f9..52e6518951 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -653,7 +653,6 @@ #include "code\game\objects\items\weapons\gift_wrappaper.dm" #include "code\game\objects\items\weapons\handcuffs.dm" #include "code\game\objects\items\weapons\improvised_components.dm" -#include "code\game\objects\items\weapons\kitchen.dm" #include "code\game\objects\items\weapons\manuals.dm" #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\paint.dm" diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 6d0504a195..5b3f77c7ed 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -34,20 +34,22 @@ else return ..() - if(!M.can_eat(src)) - return - if (reagents.total_volume > 0) reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) if(M == user) + if(!M.can_eat(loaded)) + return M.visible_message("\The [user] eats some [loaded] from \the [src].") else + user.visible_message("\The [user] begins to feed \the [M]!") + if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) + return M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].") playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) overlays.Cut() return else - user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK GODDAMNIT + user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK return /obj/item/weapon/material/kitchen/utensil/fork From d574d60e26e94a1542f4e5486796c0d7cca7dfa2 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Mon, 21 Dec 2015 15:00:25 -0500 Subject: [PATCH 122/148] Canisters now work in unpowered areas. --- code/game/machinery/atmoalter/canister.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 9a8228aaa6..458e787b79 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -17,6 +17,7 @@ var/temperature_resistance = 1000 + T0C volume = 1000 use_power = 0 + interact_offline = 1 // Allows this to be used when not in powered area. var/release_log = "" var/update_flag = 0 From 5873a92df83756720befb5b31dc89753068f6ff3 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Mon, 21 Dec 2015 15:30:26 -0500 Subject: [PATCH 123/148] Fixes the icon for numbness. Resolves #11435 --- code/modules/mob/living/carbon/human/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f8abe2778b..ddd0c9ef8c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1266,7 +1266,7 @@ if(healths) if (analgesic > 100) - healths.icon_state = "health_health_numb" + healths.icon_state = "health_numb" else switch(hal_screwyhud) if(1) healths.icon_state = "health6" From fe62634775bb74ff359dcfdb0cef49a88b0903c2 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Mon, 21 Dec 2015 17:53:53 -0500 Subject: [PATCH 124/148] Stumpy hands and arms can no longer pull stuff out of bags and such. Resolves #11404 --- code/game/objects/items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fef7336371..f7215086e8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -151,6 +151,9 @@ if(temp && !temp.is_usable()) user << "You try to move your [temp.name], but cannot!" return + if(!temp) + user << "You try to use your hand, but realize it is no longer attached!" + return src.pickup(user) if (istype(src.loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = src.loc From d7eaed8c6793294347a52364bae0b4d8f7261293 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 22 Dec 2015 10:59:33 +0100 Subject: [PATCH 125/148] Span correction. --- code/game/objects/items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6e7d2820f7..1a00c49ea7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -157,7 +157,7 @@ user << "You try to move your [temp.name], but cannot!" return if(!temp) - user << "You try to use your hand, but realize it is no longer attached!" + user << "You try to use your hand, but realize it is no longer attached!" return src.pickup(user) if (istype(src.loc, /obj/item/weapon/storage)) From 9fa1513647b771a3447800f49c338081ee56802f Mon Sep 17 00:00:00 2001 From: Atlantis Date: Wed, 23 Dec 2015 00:57:54 +0100 Subject: [PATCH 126/148] Fixes AI's Examine() - Message about AI's backup power now only show when the AI still lacks external power. --- code/modules/mob/living/silicon/ai/examine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 45c6a3816b..e11d799af5 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -17,7 +17,7 @@ msg += "It looks slightly charred.\n" else msg += "Its casing is melted and heat-warped!\n" - if (src.getOxyLoss()) + if (src.getOxyLoss() && (aiRestorePowerRoutine != 0 && !APU_power)) if (src.getOxyLoss() > 175) msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER CRITICAL\" warning.\n" else if(src.getOxyLoss() > 100) From c5912b988cefbb4bf7b05b9d8f33a6bca849de8f Mon Sep 17 00:00:00 2001 From: Datraen Date: Sun, 20 Dec 2015 14:19:42 -0500 Subject: [PATCH 127/148] Adds a paralyze button for easy administration. Conflicts: code/modules/admin/admin.dm --- code/modules/admin/admin.dm | 18 +++++++++++++++++- code/modules/admin/admin_verbs.dm | 6 ++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1e1dcf982e..1988f3d58c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1403,5 +1403,21 @@ proc/admin_notice(var/message, var/rights) usr << "Mode has not started." return - message_admins("[key_name(usr)] attempting to force mode autospawn.") + log_and_message_admins("attempting to force mode autospawn.") ticker.mode.process_autoantag() + +/datum/admins/proc/paralyze_mob(mob/living/carbon/human/H as mob) + set category = "Admin" + set name = "Toggle Paralyze" + set desc = "Paralyzes a player. Or unparalyses them." + + var/msg + + if(check_rights(R_ADMIN|R_MOD)) + if (H.paralysis == 0) + H.paralysis = 1000 + msg = "has paralyzed [key_name(H)]." + else + H.paralysis = 0 + msg = "has unparalyzed [key_name(H)]." + log_and_message_admins(msg) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 064f10820d..5403161149 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -91,7 +91,8 @@ var/list/admin_verbs_admin = list( /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ /client/proc/change_security_level, /client/proc/view_chemical_reaction_logs, - /client/proc/makePAI + /client/proc/makePAI, + /datum/admins/proc/paralyze_mob ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -284,7 +285,8 @@ var/list/admin_verbs_mod = list( /datum/admins/proc/show_player_panel, /client/proc/check_antagonists, /client/proc/jobbans, - /client/proc/cmd_admin_subtle_message /*send an message to somebody as a 'voice in their head'*/ + /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/ + /datum/admins/proc/paralyze_mob ) var/list/admin_verbs_mentor = list( From 65f68602e7e06c989d293ded7141d4fd950f3fa4 Mon Sep 17 00:00:00 2001 From: Datraen Date: Sun, 20 Dec 2015 14:37:39 -0500 Subject: [PATCH 128/148] Adds a longer timer to paralyze, allows for other mobs to fall under this proc. Conflicts: code/modules/admin/admin.dm --- code/modules/admin/admin.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1988f3d58c..4a435188e3 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1406,7 +1406,7 @@ proc/admin_notice(var/message, var/rights) log_and_message_admins("attempting to force mode autospawn.") ticker.mode.process_autoantag() -/datum/admins/proc/paralyze_mob(mob/living/carbon/human/H as mob) +/datum/admins/proc/paralyze_mob(mob/living/H as mob) set category = "Admin" set name = "Toggle Paralyze" set desc = "Paralyzes a player. Or unparalyses them." @@ -1415,7 +1415,7 @@ proc/admin_notice(var/message, var/rights) if(check_rights(R_ADMIN|R_MOD)) if (H.paralysis == 0) - H.paralysis = 1000 + H.paralysis = 8000 msg = "has paralyzed [key_name(H)]." else H.paralysis = 0 From 70b84d87a6f8b90633338793e487291fffaeb6d5 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 23 Dec 2015 13:01:03 +0100 Subject: [PATCH 129/148] Tweaks permission rights. --- code/modules/admin/admin.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4a435188e3..86e0d31cef 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1395,7 +1395,7 @@ proc/admin_notice(var/message, var/rights) if (!istype(src,/datum/admins)) src = usr.client.holder - if (!istype(src,/datum/admins)) + if (!istype(src,/datum/admins) || !check_rights(R_ADMIN)) usr << "Error: you are not an admin!" return @@ -1413,7 +1413,7 @@ proc/admin_notice(var/message, var/rights) var/msg - if(check_rights(R_ADMIN|R_MOD)) + if(check_rights(R_ADMIN)) if (H.paralysis == 0) H.paralysis = 8000 msg = "has paralyzed [key_name(H)]." From 90f27ca42cd4a3e2bcc9e897d03de25ca9fab516 Mon Sep 17 00:00:00 2001 From: Sebastian Broberg Date: Wed, 23 Dec 2015 23:46:53 +0100 Subject: [PATCH 130/148] Fixes chemgrenades Fixes #11686 --- code/game/objects/items/weapons/grenades/chem_grenade.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index d010e70b0f..5e15098521 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -164,7 +164,7 @@ playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1) for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) + G.reagents.trans_to_obj(src, G.reagents.total_volume) if(src.reagents.total_volume) //The possible reactions didnt use up all reagents. var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() From 0bd51d2712a53eabdfd0c7828394224371369bc9 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Thu, 24 Dec 2015 05:28:18 +0000 Subject: [PATCH 131/148] make vote window closeable via normal means --- code/controllers/voting.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 2bd56163d5..45d4a5174f 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -39,12 +39,12 @@ datum/controller/vote result() for(var/client/C in voting) if(C) - C << browse(null,"window=vote;can_close=0") + C << browse(null,"window=vote") reset() else for(var/client/C in voting) if(C) - C << browse(vote.interface(C),"window=vote;can_close=0") + C << browse(vote.interface(C),"window=vote") voting.Cut() @@ -392,4 +392,4 @@ datum/controller/vote set name = "Vote" if(vote) - src << browse(vote.interface(client),"window=vote;can_close=0") + src << browse(vote.interface(client),"window=vote") From ccda750ee1063652fd24e5d31ac80166fd524bf7 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Thu, 24 Dec 2015 02:43:52 -0500 Subject: [PATCH 132/148] AI Malf will no longer be able to spawn a non-antag AI fixes #10554 --- code/game/gamemodes/game_mode.dm | 2 + .../game/gamemodes/malfunction/malfunction.dm | 1 + code/game/jobs/job_controller.dm | 38 +------------------ 3 files changed, 5 insertions(+), 36 deletions(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8dea479de5..d5e55f4c12 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -16,6 +16,8 @@ var/global/list/additional_antag_types = list() var/ert_disabled = 0 // ERT cannot be called. var/deny_respawn = 0 // Disable respawn during this round. + var/list/disabled_jobs = list() // Mostly used for Malf. This check is performed in job_controller so it doesn't spawn a regular AI. + var/shuttle_delay = 1 // Shuttle transit time is multiplied by this. var/auto_recall_shuttle = 0 // Will the shuttle automatically be recalled? diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index a86773235b..35646524f0 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -9,3 +9,4 @@ end_on_antag_death = 0 auto_recall_shuttle = 0 antag_tags = list(MODE_MALFUNCTION) + disabled_jobs = list("AI") diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 142190dca5..82441ead32 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -185,36 +185,6 @@ var/global/datum/controller/occupations/job_master return - proc/FillAIPosition() - var/ai_selected = 0 - var/datum/job/job = GetJob("AI") - if(!job) return 0 - if((job.title == "AI") && (config) && (!config.allow_ai)) return 0 - - for(var/i = job.total_positions, i > 0, i--) - for(var/level = 1 to 3) - var/list/candidates = list() - if(ticker.mode.name == "AI malfunction")//Make sure they want to malf if its malf - candidates = FindOccupationCandidates(job, level, BE_MALF) - else - candidates = FindOccupationCandidates(job, level) - if(candidates.len) - var/mob/new_player/candidate = pick(candidates) - if(AssignRole(candidate, "AI")) - ai_selected++ - break - //Malf NEEDS an AI so force one if we didn't get a player who wanted it - if((ticker.mode.name == "AI malfunction")&&(!ai_selected)) - unassigned = shuffle(unassigned) - for(var/mob/new_player/player in unassigned) - if(jobban_isbanned(player, "AI")) continue - if(AssignRole(player, "AI")) - ai_selected++ - break - if(ai_selected) return 1 - return 0 - - /** Proc DivideOccupations * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". @@ -260,11 +230,6 @@ var/global/datum/controller/occupations/job_master FillHeadPosition() Debug("DO, Head Check end") - //Check for an AI - Debug("DO, Running AI Check") - FillAIPosition() - Debug("DO, AI Check end") - //Other jobs are now checked Debug("DO, Running Standard Check") @@ -275,6 +240,7 @@ var/global/datum/controller/occupations/job_master // Loop through all levels from high to low var/list/shuffledoccupations = shuffle(occupations) + // var/list/disabled_jobs = ticker.mode.disabled_jobs // So we can use .Find down below without a colon. for(var/level = 1 to 3) //Check the head jobs first each level CheckHeadPositions(level) @@ -284,7 +250,7 @@ var/global/datum/controller/occupations/job_master // Loop through all jobs for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY - if(!job) + if(!job || ticker.mode.disabled_jobs.Find(job.title) ) continue if(jobban_isbanned(player, job.title)) From b0aa56089e4974aed76ded3584905fdc16239c7b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 24 Dec 2015 19:01:27 +0100 Subject: [PATCH 133/148] Fixes #11745. --- baystation12.dme | 1 - code/game/jobs/job/civilian.dm | 73 ---------------------------------- code/game/jobs/jobprocs.dm | 66 ------------------------------ 3 files changed, 140 deletions(-) delete mode 100644 code/game/jobs/jobprocs.dm diff --git a/baystation12.dme b/baystation12.dme index 1c02e399cb..af6e369282 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -312,7 +312,6 @@ #include "code\game\gamemodes\wizard\wizard.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\job_controller.dm" -#include "code\game\jobs\jobprocs.dm" #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" #include "code\game\jobs\job\assistant.dm" diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 26f5c02020..ed670f7a16 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -177,79 +177,6 @@ H.species.equip_survival_gear(H,1) return 1 - -//Griff //BS12 EDIT -/* -/datum/job/clown - title = "Clown" - flag = CLOWN - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - access = list(access_clown, access_theatre, access_maint_tunnels) - minimal_access = list(access_clown, access_theatre) - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/clown(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/clown(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/rainbow(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/toy/waterflower(H), slot_in_backpack) - H.mutations.Add(CLUMSY) - return 1 - - - -/datum/job/mime - title = "Mime" - flag = MIME - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - access = list(access_mime, access_theatre, access_maint_tunnels) - minimal_access = list(access_mime, access_theatre) - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) - if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/mime(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/mime(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_store) - H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_l_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack) - H.verbs += /client/proc/mimespeak - H.verbs += /client/proc/mimewall - H.mind.special_verbs += /client/proc/mimespeak - H.mind.special_verbs += /client/proc/mimewall - H.miming = 1 - return 1 -*/ - - /datum/job/janitor title = "Janitor" flag = JANITOR diff --git a/code/game/jobs/jobprocs.dm b/code/game/jobs/jobprocs.dm deleted file mode 100644 index 2a012872bf..0000000000 --- a/code/game/jobs/jobprocs.dm +++ /dev/null @@ -1,66 +0,0 @@ - - -//TODO: put these somewhere else -/client/proc/mimewall() - set category = "Mime" - set name = "Invisible wall" - set desc = "Create an invisible wall on your location." - if(usr.stat) - usr << "Not when you're incapicated." - return - if(!ishuman(usr)) - return - - var/mob/living/carbon/human/H = usr - - if(!H.miming) - usr << "You still haven't atoned for your speaking transgression. Wait." - return - H.verbs -= /client/proc/mimewall - spawn(300) - H.verbs += /client/proc/mimewall - for (var/mob/V in viewers(H)) - if(V!=usr) - V.show_message("[H] looks as if a wall is in front of them.", 3, "", 2) - usr << "You form a wall in front of yourself." - new /obj/effect/forcefield/mime(locate(usr.x,usr.y,usr.z)) - return - -///////////Mimewalls/////////// - -/obj/effect/forcefield/mime - icon_state = "empty" - name = "invisible wall" - desc = "You have a bad feeling about this." - var/timeleft = 300 - var/last_process = 0 - -/obj/effect/forcefield/mime/New() - ..() - last_process = world.time - processing_objects.Add(src) - -/obj/effect/forcefield/mime/process() - timeleft -= (world.time - last_process) - if(timeleft <= 0) - processing_objects.Remove(src) - qdel(src) - -/////////////////////////////// - -/client/proc/mimespeak() - set category = "Mime" - set name = "Speech" - set desc = "Toggle your speech." - if(!ishuman(usr)) - return - - var/mob/living/carbon/human/H = usr - - if(H.miming) - H.miming = 0 - else - H << "You'll have to wait if you want to atone for your sins." - spawn(3000) - H.miming = 1 - return \ No newline at end of file From ebef6272b92067a05d474c75a2a6621161d87499 Mon Sep 17 00:00:00 2001 From: Sebastian Broberg Date: Thu, 24 Dec 2015 23:02:37 +0100 Subject: [PATCH 134/148] Fixes #11711 Should fix it. --- code/modules/mob/living/simple_animal/constructs/soulstone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 5859969d03..d5c7ad1149 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -113,7 +113,7 @@ if(C.imprinted != "empty") U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" else - if ((T.health + T.halloss) > config.health_threshold_crit) + if ((T.health + T.halloss) > config.health_threshold_crit || T.stat == DEAD) U << "\red Capture failed!: \black Kill or maim the victim first!" else if(T.client == null) From 34b8c99d526ba84b233d030dcdff0cf7b99eebbb Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Fri, 25 Dec 2015 00:56:16 +0000 Subject: [PATCH 135/148] backport fix for #10705 from dev fix #10705 --- code/game/gamemodes/blob/blobs/shield.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index c47696c72e..6829672449 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -21,4 +21,13 @@ CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 - return 0 + return !density + +/obj/effect/blob/shield/New() + ..() + update_nearby_tiles() + +/obj/effect/blob/shield/Destroy() + density = 0 + update_nearby_tiles() + ..() From 04006f5b9e2e7a1cb39263ac91c9e1e8ff5de296 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Fri, 25 Dec 2015 01:06:35 +0000 Subject: [PATCH 136/148] fix human examine gender --- code/modules/mob/living/carbon/human/examine.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2fe60443c9..96e1739da6 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -271,9 +271,9 @@ var/obj/item/organ/external/E = organs_by_name[organ_tag] if(!E) - wound_flavor_text["[organ_descriptor]"] = "[t_He] is missing [t_his] [organ_descriptor].\n" + wound_flavor_text["[organ_descriptor]"] = "[t_He] [t_is] missing [t_his] [organ_descriptor].\n" else if(E.is_stump()) - wound_flavor_text["[organ_descriptor]"] = "[t_He] has a stump where [t_his] [organ_descriptor] should be.\n" + wound_flavor_text["[organ_descriptor]"] = "[t_He] [t_has] a stump where [t_his] [organ_descriptor] should be.\n" else continue @@ -285,13 +285,13 @@ wound_flavor_text["[temp.name]"] = "[t_He] [t_has] a robot [temp.name]!\n" continue else - wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!\n" + wound_flavor_text["[temp.name]"] = "[t_He] [t_has] a robot [temp.name]. It has[temp.get_wounds_desc()]!\n" else if(temp.wounds.len > 0 || temp.open) if(temp.is_stump() && temp.parent_organ && organs_by_name[temp.parent_organ]) var/obj/item/organ/external/parent = organs_by_name[temp.parent_organ] - wound_flavor_text["[temp.name]"] = "[t_He] has [temp.get_wounds_desc()] on [t_his] [parent.name].
      " + wound_flavor_text["[temp.name]"] = "[t_He] [t_has] [temp.get_wounds_desc()] on [t_his] [parent.name].
      " else - wound_flavor_text["[temp.name]"] = "[t_He] has [temp.get_wounds_desc()] on [t_his] [temp.name].
      " + wound_flavor_text["[temp.name]"] = "[t_He] [t_has] [temp.get_wounds_desc()] on [t_his] [temp.name].
      " if(temp.status & ORGAN_BLEEDING) is_bleeding["[temp.name]"] = "[capitalize(t_his)] [temp.name] is bleeding!
      " else From faec92b553e5b5185bb34b515eba1f7c8059bb93 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 25 Dec 2015 11:19:59 +0100 Subject: [PATCH 137/148] Can now join compatible cable coils of any type. Partial backport of #11656. Fixes #10935. --- code/modules/power/cable.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 09ed44c58c..5d6aa52281 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -480,6 +480,7 @@ obj/structure/cable/proc/cableColor(var/colorC) slot_flags = SLOT_BELT item_state = "coil" attack_verb = list("whipped", "lashed", "disciplined", "flogged") + stacktype = /obj/item/stack/cable_coil /obj/item/stack/cable_coil/cyborg name = "cable coil synthesizer" From b000ca4eb76de7f456c8b0bf52ed0257db43ed69 Mon Sep 17 00:00:00 2001 From: Sebastian Broberg Date: Fri, 25 Dec 2015 11:30:33 +0100 Subject: [PATCH 138/148] Boop, logic escaped me also refractor this shit someone. --- code/modules/mob/living/simple_animal/constructs/soulstone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index d5c7ad1149..1007d89d99 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -113,7 +113,7 @@ if(C.imprinted != "empty") U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" else - if ((T.health + T.halloss) > config.health_threshold_crit || T.stat == DEAD) + if ((T.health + T.halloss) > config.health_threshold_crit && T.stat != DEAD) U << "\red Capture failed!: \black Kill or maim the victim first!" else if(T.client == null) From 370529bc428a26be325ef7230126d614ef6de7bb Mon Sep 17 00:00:00 2001 From: Sebastian Broberg Date: Fri, 25 Dec 2015 13:04:13 +0100 Subject: [PATCH 139/148] Refractored soulstone.dm Split the various functions of the proc into multiple procs Moved the transfer_soul proc under the soulstone object. --- .../simple_animal/constructs/soulstone.dm | 323 +++++++++--------- .../modules/mob/living/simple_animal/shade.dm | 3 +- 2 files changed, 165 insertions(+), 161 deletions(-) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 1007d89d99..734c97e4d9 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -14,74 +14,68 @@ //////////////////////////////Capturing//////////////////////////////////////////////////////// - attack(mob/living/carbon/human/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/human))//If target is not a human. - return ..() - if(istype(M, /mob/living/carbon/human/dummy)) - return..() +/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/human))//If target is not a human. + return ..() + if(istype(M, /mob/living/carbon/human/dummy)) + return..() - if(M.has_brain_worms()) //Borer stuff - RR - user << "This being is corrupted by an alien intelligence and cannot be soul trapped." - return..() + if(M.has_brain_worms()) //Borer stuff - RR + user << "This being is corrupted by an alien intelligence and cannot be soul trapped." + return..() - M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") + msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)") - transfer_soul("VICTIM", M, user) - return + transfer_soul("VICTIM", M, user) + return - /*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES - if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade - return ..() - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") - transfer_soul("SHADE", M, user) - return*/ ///////////////////Options for using captured souls/////////////////////////////////////// - attack_self(mob/user) - if (!in_range(src, user)) - return - user.set_machine(src) - var/dat = "Soul Stone
      " - for(var/mob/living/simple_animal/shade/A in src) - dat += "Captured Soul: [A.name]
      " - dat += {"Summon Shade"} - dat += "
      " - dat += {" Close"} - user << browse(dat, "window=aicard") - onclose(user, "aicard") +/obj/item/device/soulstone/attack_self(mob/user) + if (!in_range(src, user)) + return + user.set_machine(src) + var/dat = "Soul Stone
      " + for(var/mob/living/simple_animal/shade/A in src) + dat += "Captured Soul: [A.name]
      " + dat += {"Summon Shade"} + dat += "
      " + dat += {" Close"} + user << browse(dat, "window=aicard") + onclose(user, "aicard") + return + + + + +/obj/item/device/soulstone/Topic(href, href_list) + var/mob/U = usr + if (!in_range(src, U)||U.machine!=src) + U << browse(null, "window=aicard") + U.unset_machine() return + add_fingerprint(U) + U.set_machine(src) - - - Topic(href, href_list) - var/mob/U = usr - if (!in_range(src, U)||U.machine!=src) + switch(href_list["choice"])//Now we switch based on choice. + if ("Close") U << browse(null, "window=aicard") U.unset_machine() return - add_fingerprint(U) - U.set_machine(src) - - switch(href_list["choice"])//Now we switch based on choice. - if ("Close") - U << browse(null, "window=aicard") - U.unset_machine() - return - - if ("Summon") - for(var/mob/living/simple_animal/shade/A in src) - A.status_flags &= ~GODMODE - A.canmove = 1 - A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs." - A.loc = U.loc - A.cancel_camera() - src.icon_state = "soulstone" - attack_self(U) + if ("Summon") + for(var/mob/living/simple_animal/shade/A in src) + A.status_flags &= ~GODMODE + A.canmove = 1 + A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs." + A.loc = U.loc + A.cancel_camera() + src.icon_state = "soulstone" + attack_self(U) ///////////////////////////Transferring to constructs///////////////////////////////////////////////////// /obj/structure/constructshell @@ -99,118 +93,127 @@ /obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/device/soulstone)) - O.transfer_soul("CONSTRUCT",src,user) + var/obj/item/device/soulstone/S = O; + S.transfer_soul("CONSTRUCT",src,user) ////////////////////////////Proc for moving soul in and out off stone////////////////////////////////////// +/obj/item/device/soulstone/proc/transfer_human(var/mob/living/carbon/human/T,var/mob/U) + if(!istype(T)) + return; + if(src.imprinted != "empty") + U << "\red Capture failed!: \black The soul stone has already been imprinted with [src.imprinted]'s mind!" + return + if ((T.health + T.halloss) > config.health_threshold_crit && T.stat != DEAD) + U << "\red Capture failed!: \black Kill or maim the victim first!" + return + if(T.client == null) + U << "\red Capture failed!: \black The soul has already fled it's mortal frame." + return + if(src.contents.len) + U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + return + + for(var/obj/item/W in T) + T.drop_from_inventory(W) + + new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton + T.invisibility = 101 + + var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = T + flick("dust-h", animation) + qdel(animation) + + var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) + S.loc = src //put shade in stone + S.status_flags |= GODMODE //So they won't die inside the stone somehow + S.canmove = 0//Can't move out of the soul stone + S.name = "Shade of [T.real_name]" + S.real_name = "Shade of [T.real_name]" + S.icon = T.icon + S.icon_state = T.icon_state + S.overlays = T.overlays + S.color = rgb(254,0,0) + S.alpha = 127 + if (T.client) + T.client.mob = S + S.cancel_camera() -/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob). + src.icon_state = "soulstone2" + src.name = "Soul Stone: [S.real_name]" + S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." + U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." + U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." + src.imprinted = "[S.name]" + qdel(T) + +/obj/item/device/soulstone/proc/transfer_shade(var/mob/living/simple_animal/shade/T,var/mob/U) + if(!istype(T)) + return; + if (T.stat == DEAD) + U << "\red Capture failed!: \black The shade has already been banished!" + return + if(src.contents.len) + U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + return + if(T.name != src.imprinted) + U << "\red Capture failed!: \black The soul stone has already been imprinted with [src.imprinted]'s mind!" + return + + T.loc = src //put shade in stone + T.status_flags |= GODMODE + T.canmove = 0 + T.health = T.maxHealth + src.icon_state = "soulstone2" + + T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" + U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone." +/obj/item/device/soulstone/proc/transfer_construct(var/obj/structure/constructshell/T,var/mob/U) + var/mob/living/simple_animal/shade/A = locate() in src + if(!A) + U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" + return; + var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") + switch(construct_class) + if("Juggernaut") + var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.cancel_camera() + qdel(src) + if("Wraith") + var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.cancel_camera() + qdel(src) + if("Artificer") + var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs" + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.cancel_camera() + qdel(src) +/obj/item/device/soulstone/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob). switch(choice) if("VICTIM") - var/mob/living/carbon/human/T = target - var/obj/item/device/soulstone/C = src - if(C.imprinted != "empty") - U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" - else - if ((T.health + T.halloss) > config.health_threshold_crit && T.stat != DEAD) - U << "\red Capture failed!: \black Kill or maim the victim first!" - else - if(T.client == null) - U << "\red Capture failed!: \black The soul has already fled it's mortal frame." - else - if(C.contents.len) - U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." - else - for(var/obj/item/W in T) - T.drop_from_inventory(W) - new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton - T.invisibility = 101 - var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = T - flick("dust-h", animation) - qdel(animation) - var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) - S.loc = C //put shade in stone - S.status_flags |= GODMODE //So they won't die inside the stone somehow - S.canmove = 0//Can't move out of the soul stone - S.name = "Shade of [T.real_name]" - S.real_name = "Shade of [T.real_name]" - S.icon = T.icon - S.icon_state = T.icon_state - S.overlays = T.overlays - S.color = rgb(254,0,0) - S.alpha = 127 - if (T.client) - T.client.mob = S - S.cancel_camera() - C.icon_state = "soulstone2" - C.name = "Soul Stone: [S.real_name]" - S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." - U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." - U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." - C.imprinted = "[S.name]" - qdel(T) + transfer_human(target,U) if("SHADE") - var/mob/living/simple_animal/shade/T = target - var/obj/item/device/soulstone/C = src - if (T.stat == DEAD) - U << "\red Capture failed!: \black The shade has already been banished!" - else - if(C.contents.len) - U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." - else - if(T.name != C.imprinted) - U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" - else - T.loc = C //put shade in stone - T.status_flags |= GODMODE - T.canmove = 0 - T.health = T.maxHealth - C.icon_state = "soulstone2" - T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" - U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone." + transfer_shade(target,U) if("CONSTRUCT") - var/obj/structure/constructshell/T = target - var/obj/item/device/soulstone/C = src - var/mob/living/simple_animal/shade/A = locate() in C - if(A) - var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") - switch(construct_class) - if("Juggernaut") - var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - cult.add_antagonist(Z.mind) - qdel(T) - Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(C) - - if("Wraith") - var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - cult.add_antagonist(Z.mind) - qdel(T) - Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(C) - - if("Artificer") - var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - cult.add_antagonist(Z.mind) - qdel(T) - Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs" - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(C) - else - U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" - return + transfer_construct(target,U) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 359db24c63..f8ed654b95 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -37,7 +37,8 @@ /mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/device/soulstone)) - O.transfer_soul("SHADE", src, user) + var/obj/item/device/soulstone/S = O; + S.transfer_soul("SHADE", src, user) return /mob/living/simple_animal/shade/proc/OnDeathInLife() From b30f81c7ea5197a74ec728cd94b4699d29bfd7c7 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 27 Dec 2015 01:25:13 -0500 Subject: [PATCH 140/148] Fixes #11381 --- code/modules/mob/living/carbon/human/human_damage.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index efe203c51c..eaed6b62d5 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -8,8 +8,8 @@ var/total_burn = 0 var/total_brute = 0 for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit - if(O.status & ORGAN_ROBOT) - continue //robot limbs don't count towards shock and crit + if(O.status & ORGAN_ROBOT && !O.vital) + continue //*non-vital* robot limbs don't count towards shock and crit total_brute += O.brute_dam total_burn += O.burn_dam From 8b685fdf8f3d1c6db984754893954aa34ae24019 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 27 Dec 2015 01:39:34 -0500 Subject: [PATCH 141/148] Fixes #11380 --- code/modules/organs/subtypes/machine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index fd94c2c759..bee7595624 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -94,7 +94,7 @@ /obj/item/organ/optical_sensor name = "optical sensor" - organ_tag = "eyes" + organ_tag = "optics" parent_organ = "head" icon = 'icons/obj/robot_component.dmi' icon_state = "camera" From 14393ea706831a1fd2222e6bfaa50ebcfea2de49 Mon Sep 17 00:00:00 2001 From: Sebastian Broberg Date: Sun, 27 Dec 2015 17:05:08 +0100 Subject: [PATCH 142/148] Few refraction --- .../simple_animal/constructs/soulstone.dm | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 734c97e4d9..7e182c6f09 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -72,7 +72,7 @@ A.status_flags &= ~GODMODE A.canmove = 1 A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs." - A.loc = U.loc + A.forceMove(U.loc) A.cancel_camera() src.icon_state = "soulstone" attack_self(U) @@ -102,16 +102,16 @@ if(!istype(T)) return; if(src.imprinted != "empty") - U << "\red Capture failed!: \black The soul stone has already been imprinted with [src.imprinted]'s mind!" + U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!" return if ((T.health + T.halloss) > config.health_threshold_crit && T.stat != DEAD) - U << "\red Capture failed!: \black Kill or maim the victim first!" + U << "Capture failed!: Kill or maim the victim first!" return if(T.client == null) - U << "\red Capture failed!: \black The soul has already fled it's mortal frame." + U << "Capture failed!: The soul has already fled it's mortal frame." return if(src.contents.len) - U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." return for(var/obj/item/W in T) @@ -146,7 +146,7 @@ src.icon_state = "soulstone2" src.name = "Soul Stone: [S.real_name]" S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." - U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." + U << "Capture successful! : [T.real_name]'s soul has been ripped from their body and stored within the soul stone." U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." src.imprinted = "[S.name]" qdel(T) @@ -155,13 +155,13 @@ if(!istype(T)) return; if (T.stat == DEAD) - U << "\red Capture failed!: \black The shade has already been banished!" + U << "Capture failed!: The shade has already been banished!" return if(src.contents.len) - U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." return if(T.name != src.imprinted) - U << "\red Capture failed!: \black The soul stone has already been imprinted with [src.imprinted]'s mind!" + U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!" return T.loc = src //put shade in stone @@ -171,11 +171,11 @@ src.icon_state = "soulstone2" T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" - U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone." + U << "Capture successful! : [T.name]'s has been recaptured and stored within the soul stone." /obj/item/device/soulstone/proc/transfer_construct(var/obj/structure/constructshell/T,var/mob/U) var/mob/living/simple_animal/shade/A = locate() in src if(!A) - U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" + U << "Capture failed!: The soul stone is empty! Go kill someone!" return; var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") switch(construct_class) From 86144844081b373508b8a00ddc81661c3725920c Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Sun, 27 Dec 2015 19:17:21 -0500 Subject: [PATCH 143/148] Hidden doors when open can be seen through. Fixes #11765 --- code/game/turfs/simulated/wall_attacks.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 32668e4743..a4083b8190 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -10,12 +10,14 @@ //flick("[material.icon_base]fwall_opening", src) sleep(15) density = 0 + opacity = 0 set_light(0) else can_open = WALL_OPENING //flick("[material.icon_base]fwall_closing", src) set_wall_state("[material.icon_base]0") density = 1 + opacity = 1 sleep(15) set_light(1) From 3dfb821eedc0af1bc055d52374956a575b7f0730 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Mon, 28 Dec 2015 17:25:37 +0000 Subject: [PATCH 144/148] add revision topic call --- code/world.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/world.dm b/code/world.dm index 02d7d804a7..08ad4b61f8 100644 --- a/code/world.dm +++ b/code/world.dm @@ -184,6 +184,12 @@ var/world_topic_spam_protect_time = world.timeofday return list2params(positions) + else if(T == "revision") + if(revdata.revision) + return list2params(list(branch = revdata.branch, date = revdata.date, revision = revdata.revision)) + else + return "unknown" + else if(copytext(T,1,5) == "info") var/input[] = params2list(T) if(input["key"] != config.comms_password) From f040b221b0b716829b03d64e45f55f6b32dfbeda Mon Sep 17 00:00:00 2001 From: Nicolai Czempin Date: Wed, 6 Jan 2016 05:30:41 +0100 Subject: [PATCH 145/148] Cleanbot cleans closest dirt first --- code/modules/mob/living/bot/cleanbot.dm | 134 ++++++++++++++---------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 7331010852..57f907ec25 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -26,6 +26,8 @@ var/blood = 1 var/list/target_types = list() + var/maximum_search_range = 7 + /mob/living/bot/cleanbot/New() ..() get_targets() @@ -36,6 +38,25 @@ if(radio_controller) radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS) +/mob/living/bot/cleanbot/proc/handle_target() + if(loc == target.loc) + if(!cleaning) + UnarmedAttack(target) + return 1 + if(!path.len) +// spawn(0) + path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + custom_emote(2, "[src] can't reach the target and is giving up.") + target = null + path = list() + return + if(path.len) + step_to(src, path[1]) + path -= path[1] + return 1 + return + /mob/living/bot/cleanbot/Life() ..() @@ -46,7 +67,7 @@ return if(cleaning) return - + if(!screwloose && !oddbutton && prob(5)) custom_emote(2, "makes an excited beeping booping sound!") @@ -74,65 +95,64 @@ spawn(600) ignorelist -= gib - if(!target) // Find a target - for(var/obj/effect/decal/cleanable/D in view(7, src)) - if(D in ignorelist) - continue - for(var/T in target_types) - if(istype(D, T)) - target = D - patrol_path = list() + // Find a target + + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() + return - if(!target) // No targets in range - if(!should_patrol) - return + var/found_spot + search_loop: + for(var/i=0, i <= maximum_search_range, i++) + for(var/obj/effect/decal/cleanable/D in view(i, src)) + if(D in ignorelist) + continue + for(var/T in target_types) + if(istype(D, T)) + patrol_path = list() + target = D + found_spot = handle_target() + if (found_spot) + break search_loop + else + target = null + continue // no need to check the other types - if(!patrol_path || !patrol_path.len) - if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet - var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) - if(!frequency) - return - closest_dist = 9999 - next_dest = null - next_dest_loc = null - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data = list("findbeakon" = "patrol") - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - signal_sent = world.time - else - if(next_dest) - next_dest_loc = listener.memorized[next_dest] - if(next_dest_loc) - patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) - signal_sent = 0 - else - if(pulledby) // Don't wiggle if someone pulls you - patrol_path = list() + if(!found_spot && !target) // No targets in range + if(!patrol_path || !patrol_path.len) + if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet + var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) + if(!frequency) return - if(patrol_path[1] == loc) - patrol_path -= patrol_path[1] - var/moved = step_towards(src, patrol_path[1]) - if(moved) - patrol_path -= patrol_path[1] - if(target) - if(loc == target.loc) - if(!cleaning) - UnarmedAttack(target) + + closest_dist = 9999 + next_dest = null + next_dest_loc = null + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data = list("findbeakon" = "patrol") + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + signal_sent = world.time + else + if(next_dest) + next_dest_loc = listener.memorized[next_dest] + if(next_dest_loc) + patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) + signal_sent = 0 + else + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() return - if(!path.len) - spawn(0) - path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) - if(!path) - path = list() - return - if(path.len) - step_to(src, path[1]) - path -= path[1] - return + if(patrol_path[1] == loc) + patrol_path -= patrol_path[1] + var/moved = step_towards(src, patrol_path[1]) + if(moved) + patrol_path -= patrol_path[1] + + /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) if(!..()) @@ -145,7 +165,7 @@ return cleaning = 1 - custom_emote(2, "begins to clean up the [D]") + custom_emote(2, "begins to clean up \the [D]") update_icons() var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 if(do_after(src, cleantime)) @@ -155,6 +175,8 @@ if(!D) return qdel(D) + if(D == target) + target = null cleaning = 0 update_icons() From 6f68a26f79413241c492590d51bba1634eb16695 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 17:37:01 +0100 Subject: [PATCH 146/148] Changes the version BYOND use. Do not merge until server is confirmed updated. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 405ccc07db..09eac5ef52 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ language: c sudo: false env: - BYOND_MAJOR="508" - BYOND_MINOR="1293" + BYOND_MAJOR="509" + BYOND_MINOR="1318" cache: directories: From 39bbca416ab7c0523cf260405982cbd86360e369 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 17:42:56 +0100 Subject: [PATCH 147/148] Adds missing istype() check before the secure brief case emag check. Fixes #11900. --- code/game/objects/items/weapons/storage/secure.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 8b11055d40..51c53bc64c 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -33,7 +33,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(locked) - if (emag_act(INFINITY, user, "You slice through the lock of \the [src]")) + if (istype(W, /obj/item/weapon/melee/energy/blade) && emag_act(INFINITY, user, "You slice through the lock of \the [src]")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() From a00a6ae0e66b6a68e1f4e489ed380dce43669a8e Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Sun, 10 Jan 2016 22:12:12 +0000 Subject: [PATCH 148/148] Fix #11955 --- code/modules/power/cable.dm | 80 ++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 45 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 5d6aa52281..02e2147f28 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -347,64 +347,54 @@ obj/structure/cable/proc/cableColor(var/colorC) . = list() // this will be a list of all connected power objects var/turf/T -///// Z-Level Stuff - if (d1 == 11 || d1 == 12) + // Handle up/down cables + if(d1 == 11 || d1 == 12 || d2 == 11 || d2 == 12) var/turf/controllerlocation = locate(1, 1, z) for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d1 == 12) + if(controller.up && (d1 == 12 || d2 == 12)) T = locate(src.x, src.y, controller.up_target) if(T) . += power_list(T, src, 11, 1) - if(controller.down && d1 == 11) + if(controller.down && (d1 == 11 || d2 == 11)) T = locate(src.x, src.y, controller.down_target) if(T) . += power_list(T, src, 12, 1) -///// Z-Level Stuff - //get matching cables from the first direction - else if(d1) //if not a node cable - T = get_step(src, d1) - if(T) - . += power_list(T, src, turn(d1, 180), powernetless_only) //get adjacents matching cables - if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles - T = get_step(src,d1&3) // go north/south + // Handle standard cables in adjacent turfs + for(var/cable_dir in list(d1, d2)) + if(cable_dir == 11 || cable_dir == 12 || cable_dir == 0) + continue + var/reverse = reverse_dir[cable_dir] + T = get_step(src, cable_dir) if(T) - . += power_list(T, src, d1 ^ 3, powernetless_only) //get diagonally matching cables - T = get_step(src,d1&12) // go east/west - if(T) - . += power_list(T, src, d1 ^ 12, powernetless_only) //get diagonally matching cables - - . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables - -///// Z-Level Stuff - if(d2 == 11 || d2 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d2 == 12) - T = locate(src.x, src.y, controller.up_target) + for(var/obj/structure/cable/C in T) + if((C.d1 && C.d1 == reverse) || (C.d2 && C.d2 == reverse)) + . += C + if(cable_dir & (cable_dir - 1)) // Diagonal, check for /\/\/\ style cables along cardinal directions + for(var/pair in list(NORTH|SOUTH, EAST|WEST)) + T = get_step(src, cable_dir & pair) if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d2 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) -///// Z-Level Stuff - else - //do the same on the second direction (which can't be 0) - T = get_step(src, d2) - if(T) - . += power_list(T, src, turn(d2, 180), powernetless_only) //get adjacents matching cables + var/req_dir = cable_dir ^ pair + for(var/obj/structure/cable/C in T) + if((C.d1 && C.d1 == req_dir) || (C.d2 && C.d2 == req_dir)) + . += C - if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles - T = get_step(src,d2&3) // go north/south - if(T) - . += power_list(T, src, d2 ^ 3, powernetless_only) //get diagonally matching cables - T = get_step(src,d2&12) // go east/west - if(T) - . += power_list(T, src, d2 ^ 12, powernetless_only) //get diagonally matching cables - . += power_list(loc, src, d2, powernetless_only) //get on turf matching cables + // Handle cables on the same turf as us + for(var/obj/structure/cable/C in loc) + if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) // if either of C's d1 and d2 match either of ours + . += C - return . + if(d1 == 0) + for(var/obj/machinery/power/P in loc) + if(P.powernet == 0) continue // exclude APCs with powernet=0 + if(!powernetless_only || !P.powernet) + . += P + + // if the caller asked for powernetless cables only, dump the ones with powernets + if(powernetless_only) + for(var/obj/structure/cable/C in .) + if(C.powernet) + . -= C //should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf. //needed as this can, unlike other placements, disconnect cables