From 7197a893e687eef3710e8f819585f8390b209ebe Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 01:59:53 +0200 Subject: [PATCH 1/8] Switch AI announcement back to text input --- code/modules/mob/living/silicon/ai/say.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 55eed0a2570..acf3a2db3c0 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -35,7 +35,7 @@ var/const/VOX_PATH = "sound/vox_fem/" src << "Please wait [round((announcing_vox - world.time) / 10)] seconds." return - var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as message|null + var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as text|null last_announcement = message From e27f84df7d309e2583657e629b141b9e8e2cd250 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 03:59:03 +0200 Subject: [PATCH 2/8] Dead people can emote! --- code/game/machinery/doors/door.dm | 3 +- .../objects/items/weapons/implants/deadman.dm | 35 +++++++++---------- .../objects/items/weapons/implants/implant.dm | 1 - .../mob/living/carbon/alien/humanoid/emote.dm | 3 -- .../mob/living/carbon/alien/larva/emote.dm | 3 -- code/modules/mob/living/carbon/brain/emote.dm | 3 -- code/modules/mob/living/carbon/human/emote.dm | 5 +-- .../mob/living/carbon/metroid/emote.dm | 3 -- code/modules/mob/living/silicon/emote.dm | 3 -- code/modules/mob/living/silicon/pai/emote.dm | 3 -- .../modules/mob/living/silicon/robot/emote.dm | 3 -- 11 files changed, 20 insertions(+), 45 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a9559ea01f6..d61e1ec37f1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -263,7 +263,8 @@ L.emote("roar") else if(ishuman(L)) //For humans L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.emote("scream") + if(L.stat == CONSCIOUS) + L.emote("scream") L.Weaken(5) else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) diff --git a/code/game/objects/items/weapons/implants/deadman.dm b/code/game/objects/items/weapons/implants/deadman.dm index 1759a4f4531..29433380d7e 100644 --- a/code/game/objects/items/weapons/implants/deadman.dm +++ b/code/game/objects/items/weapons/implants/deadman.dm @@ -4,8 +4,8 @@ var/obj/item/device/assembly/signaler/signaler icon_state = "implant_evil" - get_data() - var/dat = {" +/obj/item/weapon/implant/deadman/get_data() + var/dat = {" Implant Specifications:
Name: Robust Corp RX-79 Deadman Switch Implant
Life: Activates upon death.
@@ -14,23 +14,22 @@ Implant Details:
Function: Contains a compact, electric signaller that activates upon host death.
Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - return dat + return dat - implanted(mob/source as mob) - signaler = new /obj/item/device/assembly/signaler(src) - signaler.interact(source) - usr.mind.store_memory("Deadman switch will broadcast signal on [signaler.frequency] using encryption [signaler.code].", 0, 0) - usr << "Deadman switch will broadcast signal on [signaler.frequency] using encryption [signaler.code]." +/obj/item/weapon/implant/deadman/implanted(mob/source as mob) + signaler = new /obj/item/device/assembly/signaler(src) + signaler.interact(source) + usr.mind.store_memory("Deadman switch will broadcast signal on [signaler.frequency] using encryption [signaler.code].", 0, 0) + usr << "Deadman switch will broadcast signal on [signaler.frequency] using encryption [signaler.code]." +/obj/item/weapon/implant/deadman/trigger(emote, source as mob) + if(emote == "deathgasp") + src.activate("death") + return - trigger(emote, source as mob) - if(emote == "deathgasp") - src.activate("death") - return +/obj/item/weapon/implant/deadman/activate(var/cause) + if((!cause) || (!src.imp_in)) return 0 + signaler.signal() - activate(var/cause) - if((!cause) || (!src.imp_in)) return 0 - signaler.signal() - - islegal() - return 0 \ No newline at end of file +/obj/item/weapon/implant/deadman/islegal() + return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 447e862c751..b93db8244e2 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -116,7 +116,6 @@ Implant Specifics:
"} Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} return dat - /obj/item/weapon/implant/dexplosive/trigger(emote, source as mob) if(emote == "deathgasp") src.activate("death") diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index 69d1eb600dc..a80a0d5892c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -1,7 +1,4 @@ /mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null) - if(stat) - return - var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 134350e2517..88437be1392 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -1,7 +1,4 @@ /mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null) - if(stat) - return - var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 054a9b6e71c..0441eb00ac4 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -1,7 +1,4 @@ /mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null) - if(stat) - return - if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index f7e988f3a70..414335a243e 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,7 +1,4 @@ -/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null) - if(stat) - return - +/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force) var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/metroid/emote.dm index 3c95bea1a43..fa7e5c07466 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/metroid/emote.dm @@ -1,7 +1,4 @@ /mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) - if(stat) - return - if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) //param = copytext(act, t1 + 1, length(act) + 1) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index 8c28d407ede..f7ead12e4cc 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -1,7 +1,4 @@ /mob/living/silicon/emote(var/act, var/m_type=1, var/message = null) - if(stat) - return - var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm index 2fce92f2883..a8eeac8cbb7 100644 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ b/code/modules/mob/living/silicon/pai/emote.dm @@ -1,7 +1,4 @@ /mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null) - if(stat) - return - switch(act) if ("help") src << "ping, beep, buzz." diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 45a086f0fe7..9c01f9ee5ec 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,7 +1,4 @@ /mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null) - if(stat) - return - var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) From 00fc1dd812d0d1002f25f87c81dea68563a25fda Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 04:31:52 +0200 Subject: [PATCH 3/8] Move up related accounts in the player panel --- code/modules/admin/admin.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8e008fccb4f..721fd897214 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -55,7 +55,11 @@ var/global/nologevent = 0 body += "SM - " body += "[admin_jump_link(M, src)]\]
" - body += "Mob type = [M.type]

" + body += "Mob type: [M.type]
" + if(M.client.related_accounts_cid.len) + body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
" + if(M.client.related_accounts_ip.len) + body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]

" body += "Kick | " body += "Warn | " @@ -176,7 +180,6 @@ var/global/nologevent = 0 Builder , Wraith \] Shade -
"} if (M.client) @@ -190,16 +193,12 @@ var/global/nologevent = 0 Thunderdome Admin | Thunderdome Observer | "} - if(M.client.related_accounts_cid.len) - body += "

Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
" - if(M.client.related_accounts_ip.len) - body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]
" body += {"
"} - usr << browse(body, "window=adminplayeropts;size=550x515") + usr << browse(body, "window=adminplayeropts;size=550x615") feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From d0cb82a81b5eb7b558e0a20a7f94e04a7dbd63d2 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 04:49:47 +0200 Subject: [PATCH 4/8] Map pipe fix --- _maps/map_files/cyberiad/cyberiad.dmm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index fe596449bdc..3a53d963a2c 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2669,9 +2669,9 @@ "aZq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/hallway/primary/port) "aZr" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port) "aZs" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port) -"aZt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/port) +"aZt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor,/area/hallway/primary/port) "aZu" = (/obj/structure/cable{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,/area/hallway/primary/port) -"aZv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor,/area/hallway/primary/port) +"aZv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/hallway/primary/port) "aZw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/port) "aZx" = (/obj/structure/cable{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/port) "aZy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{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/port) @@ -2747,7 +2747,7 @@ "baQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port) "baR" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor,/area/hallway/primary/port) "baS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/port) -"baT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) +"baT" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech) "baU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/hallway/primary/port) "baV" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port) "baW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/port) @@ -5853,7 +5853,6 @@ "ciC" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/toxins/test_area) "ciD" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber East"; dir = 8; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor/airless,/area/toxins/test_area) "ciE" = (/turf/simulated/wall/r_wall,/area/storage/tech) -"ciF" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech) "ciG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/storage/tech) "ciH" = (/obj/machinery/camera{c_tag = "Tech Storage"; dir = 2; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "Tech Storage APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cyborgrecharger{pixel_x = -4; pixel_y = -2},/obj/item/weapon/circuitboard/mech_bay_power_console{pixel_x = 2; pixel_y = 2},/obj/item/weapon/circuitboard/mech_recharger,/obj/item/weapon/circuitboard/mechfab{pixel_y = 3},/turf/simulated/floor/plating,/area/storage/tech) "ciI" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/healthanalyzer,/turf/simulated/floor/plating,/area/storage/tech) @@ -8351,8 +8350,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqaUaaKHaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaMvaaaaabaaaaUlaUmaUlaaaaabaaaaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHaaaaaaaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTaUZaVaaVbaVcaVbaVbaVbaVbaVdaVbaVbaVeaVbaVfaVgaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaSeaaaaaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWtaWuaUTaWvaWwaWxaWyaWzaUTaWAaWBaWCaWDaWCaWEaWFaWGaWHaWIaWJaWKaWLaWMaWNaVbaWOaRtaWPaWQaWRaVjaWSaVlaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaSeaaaaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXNaXOaXPaXPaXPaXPaXPaXPaXQaXRaXSaXTaXUaXVaXWaXXaXYaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYjaYkaYlaYmaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYDaWNaYEaYFaYGaYHaWNaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZuaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZFaZGaZHaZIaZJaZKaZLaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMeaZTaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalbakaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaTbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebbsbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGbbHbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZFaZGaZHaZIaZJaZKaZLaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMeaZTaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalbakaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebbsbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGbbHbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbcSbcTbcUbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbbdcbddbdebdebdebdebdfbdgaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAaaaaaaaaaaaaaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfbdBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDaaaaaaaaaaaaaaaaaaaaabcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEaaaaaaaaaaaaaaaaaaaaabcKbeGaYibeHaMebeIbcNbcSbcSbcSbcSbcSbeJbeKbcSbcSbcSbeLbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWbeXbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabaaaaaabfmaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDaaaaaaaaaaaabcEbcEbcEbcEbfPbfQbfRbfSbfTbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEaaaaaaaaaaaabcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbcSbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvbeXbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaQfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8391,7 +8390,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbF aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabcejbUTbUTbUTcekbUTbUTcelbUVcemcenceocepceqcercescetceucevcewccKcexceycezceAceBceBceBceBceCceDceEceFceGceFceHceIceJceKceLceMceNceOcePceQceRceSceTceUceVceWceXceYceZcfacfbcfccfdcfdcfdcfecffcfgcfhcficfjcfjcfkcfjcflcfmcfncfocbPcfpcfqcfrcfscfrcftcfucfvcdCbPTcfwbPTbPTcfxcfybZnbBxbEXbUAcfzbUAbUAcfAcfBcfCcfDcfEcebcfFcfGcfHcdUcfHcdUcfIcdUcdUbUAcfJcfKcfLcfMaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcfObXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcfPcfQcfRbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecgfcgfcggcghcgicgjcgkcglcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzcgAcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFcgHcgJcgJcgKcgLcgMcgNcgOcgPcbPcgQcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbEXchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejchochpchqbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchuchvchwchxchychychzchAcglbGybGychBchCchDbGybGybGychEchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcfdcfdcfdcfdcfdcfdcgIbSqchOchPchQchRchSchTchUchVcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwcixciycizaacaacaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejbUTcfScejaaaaaaaaaaaaciEciFciGciHciIciJciKciLciMciNciOciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcfdcfdcjlcjpcjpcjpcjpckNclSckUcjqcjqcjrcjscjtcbAcjucjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejbUTcfScejaaaaaaaaaaaaciEbaTciGciHciIciJciKciLciMciNciOciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcfdcfdcjlcjpcjpcjpcjpckNclSckUcjqcjqcjrcjscjtcbAcjucjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjaaaaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMaaacjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZckackbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclbclbclbclccldcleclfclgclhclicjLcljcelcjMaaaclkcllclmclnclocjSclpclqclrclsciLcltcgdcbkciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOclPcfhcfhcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMaaaclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcmPcmQcmQcmRcmSchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbcnccndcnecnfcngcnhcklcnicfdcnjcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 4b8a5e226aee6ae7d4f808b64d78c703ae496dff Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 05:24:03 +0200 Subject: [PATCH 5/8] Fix docility not updating when host is unconscious --- code/modules/mob/living/simple_animal/borer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 3e0c3605eda..df0a4d533b2 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -67,7 +67,7 @@ if(host) - if(!stat && !host.stat) + if(!stat && host.stat != DEAD) if(host.reagents.has_reagent("sugar")) if(!docile) From 94bab2b4a419bc6ec39003ba65632a6d913f312d Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 05:25:35 +0200 Subject: [PATCH 6/8] Announcement computer cooldown fix --- code/game/machinery/computer/communications.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 207042aeb37..7a6ffcdc22a 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -164,7 +164,7 @@ var/shuttle_call/shuttle_calls[0] nanomanager.update_uis(src) return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") - if(!input || ..() || !(is_authenticated(usr) == 2)) + if(!input || message_cooldown || ..() || !(is_authenticated(usr) == 2)) nanomanager.update_uis(src) return crew_announcement.Announce(input) From 0ffc27eded85537ec76082df18bac807e931f991 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 05:54:33 +0200 Subject: [PATCH 7/8] Fix borer surgery --- code/modules/mob/living/simple_animal/borer.dm | 8 ++++---- code/modules/surgery/implant.dm | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index df0a4d533b2..aef888f3893 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -294,7 +294,7 @@ if(!host || !src) return if(src.stat) - src << "You cannot infest a target in your current state." + src << "You cannot release a target in your current state." return src << "You wiggle out of [host]'s ear and plop to the ground." @@ -360,7 +360,7 @@ mob/living/simple_animal/borer/proc/detatch() if(!host) return - src.loc = get_turf(host) + src.forceMove(get_turf(host)) reset_view(null) machine = null @@ -426,7 +426,7 @@ mob/living/simple_animal/borer/proc/detatch() M << "Something disgusting and slimy wiggles into your ear!" src.host = M - src.loc = M + src.forceMove(M) if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M @@ -442,7 +442,7 @@ mob/living/simple_animal/borer/proc/detatch() /mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M) src.host = M - src.loc = M + src.forceMove(M) if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index d4d51e41f76..80223eafe04 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -155,7 +155,7 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) + var/obj/item/organ/external/affected = target.get_organ(target_zone) var/find_prob = 0 @@ -185,6 +185,7 @@ if(worm.controlling) target.release_control() worm.detatch() + worm.leave_host() obj.loc = get_turf(target) if(istype(obj,/obj/item/weapon/implant)) From a93304e67309beb87a82de4613c22cb83652a6c9 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 2 Oct 2015 20:25:09 +0200 Subject: [PATCH 8/8] Fix IPC brain surgery --- code/modules/organs/subtypes/machine.dm | 2 +- code/modules/surgery/robotics.dm | 6 +- code/modules/surgery/surgery.dm | 92 ++++++++++++------------- 3 files changed, 49 insertions(+), 51 deletions(-) diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 90259b14c6a..9fcad11f440 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -118,7 +118,7 @@ // This is very ghetto way of rebooting an IPC. TODO better way. spawn(1) if(owner && owner.stat == DEAD) - owner.stat = 0 + owner.stat = CONSCIOUS owner.visible_message("\The [owner] twitches visibly!") /obj/item/organ/mmi_holder/posibrain/New() diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index f0da9944abf..d525b014e21 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -370,8 +370,8 @@ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if(target_zone != "head") - return + if(target_zone != "chest") + return 0 var/obj/item/device/mmi/M = tool var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -418,7 +418,7 @@ var/obj/item/organ/mmi_holder/holder = new(target, 1) target.internal_organs_by_name["brain"] = holder user.unEquip(tool) - tool.loc = holder + tool.forceMove(holder) holder.stored_mmi = tool holder.update_from_mmi() diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 19425d3a3c5..d353c4f49f7 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -1,5 +1,4 @@ /* SURGERY STEPS */ - /datum/surgery_step var/priority = 0 //steps with higher priority would be attempted first @@ -18,57 +17,56 @@ //How much blood this step can get on surgeon. 1 - hands, 2 - full body. var/blood_level = 0 - //returns how well tool is suited for this step - proc/tool_quality(obj/item/tool) - for (var/T in allowed_tools) - if (istype(tool,T)) - return allowed_tools[T] +//returns how well tool is suited for this step +/datum/surgery_step/proc/tool_quality(obj/item/tool) + for (var/T in allowed_tools) + if (istype(tool,T)) + return allowed_tools[T] + return 0 + +// Checks if this step applies to the user mob at all +/datum/surgery_step/proc/is_valid_target(mob/living/carbon/human/target) + if(!hasorgans(target)) return 0 - // Checks if this step applies to the user mob at all - proc/is_valid_target(mob/living/carbon/human/target) - if(!hasorgans(target)) - return 0 + if(allowed_species) + for(var/species in allowed_species) + if(target.species.name == species) + return 1 - if(allowed_species) - for(var/species in allowed_species) - if(target.species.name == species) - return 1 + if(disallowed_species) + for(var/species in disallowed_species) + if(target.species.name == species) + return 0 - if(disallowed_species) - for(var/species in disallowed_species) - if(target.species.name == species) - return 0 + return 1 - return 1 +// checks whether this step can be applied with the given user and target +/datum/surgery_step/proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return 0 +// does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too +/datum/surgery_step/proc/begin_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) + if (can_infect && affected) + spread_germs_to_organ(affected, user) + if (ishuman(user) && prob(60)) + var/mob/living/carbon/human/H = user + if (blood_level) + H.bloody_hands(target,0) + if (blood_level > 1) + H.bloody_body(target,0) + return - // checks whether this step can be applied with the given user and target - proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return 0 +// does stuff to end the step, which is normally print a message + do whatever this step changes +/datum/surgery_step/proc/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return - // does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too - proc/begin_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) - if (can_infect && affected) - spread_germs_to_organ(affected, user) - if (ishuman(user) && prob(60)) - var/mob/living/carbon/human/H = user - if (blood_level) - H.bloody_hands(target,0) - if (blood_level > 1) - H.bloody_body(target,0) - return +// stuff that happens when the step fails +/datum/surgery_step/proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return null - // does stuff to end the step, which is normally print a message + do whatever this step changes - proc/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return - - // stuff that happens when the step fails - proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return null - -proc/spread_germs_to_organ(obj/item/organ/external/E, mob/living/carbon/human/user) +/proc/spread_germs_to_organ(obj/item/organ/external/E, mob/living/carbon/human/user) if(!istype(user) || !istype(E)) return var/germ_level = user.germ_level @@ -77,7 +75,7 @@ proc/spread_germs_to_organ(obj/item/organ/external/E, mob/living/carbon/human/us if(!(E.status & ORGAN_ROBOT)) //Germs on robotic limbs bad E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no. -proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) +/proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) if(!istype(M)) return 0 if (user.a_intent == I_HARM) //check for Hippocratic Oath @@ -101,16 +99,16 @@ 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. 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 -proc/sort_surgeries() +/proc/sort_surgeries() var/gap = surgery_steps.len var/swapped = 1 while (gap > 1 || swapped)