From dca36b1723553df1441d6e5413538b9bc5c0dc74 Mon Sep 17 00:00:00 2001 From: TheNightingale Date: Sat, 14 Nov 2015 17:43:43 +0000 Subject: [PATCH 01/62] * Elite Syndicate hardsuit added ** Operative-only; fireproof, with bonus resistances ** Added to Operative uplinks --- code/datums/uplink_item.dm | 14 +++++++--- code/modules/clothing/spacesuits/hardsuit.dm | 27 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index c2f8600e463..56f68d8e864 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -373,7 +373,6 @@ var/list/uplink_items = list() desc = "A box of shurikens from ancient Earth martial arts. They are highly effective throwing weapons, and will embed into limbs when possible." item = /obj/item/weapon/storage/box/throwing_stars cost = 6 - excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/edagger name = "Energy Dagger" @@ -583,6 +582,16 @@ var/list/uplink_items = list() cost = 8 excludefrom = list(/datum/game_mode/gang) +/datum/uplink_item/device_tools/hardsuit + name = "Elite Syndicate Hardsuit" + desc = "The elite Syndicate hardsuit is worn by only the best nuclear agents. Features much better armoring and complete fireproofing, as well as a built in jetpack. \ + When the built in helmet is deployed your identity will be protected, even in death, as the suit cannot be removed by outside forces. Toggling the suit into combat mode \ + will allow you all the mobility of a loose fitting uniform without sacrificing armoring. Additionally the suit is collapsible, small enough to fit within a backpack. \ + Nanotrasen crewmembers are trained to report red space suit sightings; these suits in particular are known to drive employees into a panic." + item = /obj/item/clothing/suit/space/hardsuit/syndi/elite + cost = 8 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/device_tools/thermal name = "Thermal Imaging Glasses" desc = "These goggles can be turned to resemble common eyewears throughout the station. \ @@ -793,7 +802,6 @@ var/list/uplink_items = list() You can also play card games with them or leave them on your victims." item = /obj/item/toy/cards/deck/syndicate cost = 1 - excludefrom = list(/datum/game_mode/nuclear) surplus = 40 /datum/uplink_item/badass/syndiecash @@ -874,4 +882,4 @@ var/list/uplink_items = list() U.purchase_log += "\icon[C]" for(var/item in bought_items) new item(C) - U.purchase_log += "\icon[item]" + U.purchase_log += "\icon[item]" \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 1e9bf5303a6..095465dd72e 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -254,6 +254,33 @@ jetpack = new /obj/item/weapon/tank/jetpack/suit(src) ..() + +//Elite Syndie suit +/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite + name = "elite syndicate hardsuit helmet" + desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders." + alt_desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders." + icon_state = "hardsuit1-syndi" + item_state = "syndie_helm" + item_color = "syndi" + armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) + heat_protection = HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + + +/obj/item/clothing/suit/space/hardsuit/syndi/elite + name = "elite syndicate hardsuit" + desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode." + alt_desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode." + icon_state = "hardsuit1-syndi" + item_state = "syndie_suit" + item_color = "syndi" + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite + armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + + //The Owl Hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl name = "owl hardsuit helmet" From 0437176bee36a4f07c9f3c4ce22f57c3ae45cc61 Mon Sep 17 00:00:00 2001 From: Yolopanther Date: Mon, 16 Nov 2015 19:35:03 -0800 Subject: [PATCH 02/62] Allows light replacer to be refilled with box of lights --- code/game/objects/items/devices/lightreplacer.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index e722223bc6a..0fed7a28a76 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -98,6 +98,20 @@ user << "You need a working light!" return + if(istype(W, /obj/item/weapon/storage/box/lights)) + var/obj/item/weapon/storage/box/lights/B = W + if(!B.contents.len) + user << "The [B.name] is empty!" + else if(uses == max_uses) + user << "The [src.name] is full!" + else + B.close_all() + while(src.uses < max_uses && B.contents.len > 0) + B.contents.Cut(1,2) + AddUses(1) + user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." + return + /obj/item/device/lightreplacer/emag_act() if(!emagged) Emag() From 082538240e51c6399cecd71fb0862237e531fad0 Mon Sep 17 00:00:00 2001 From: Yolopanther Date: Mon, 16 Nov 2015 19:40:26 -0800 Subject: [PATCH 03/62] Haha indentation fixes. --- .../objects/items/devices/lightreplacer.dm | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 0fed7a28a76..949182190b5 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -98,19 +98,19 @@ user << "You need a working light!" return - if(istype(W, /obj/item/weapon/storage/box/lights)) - var/obj/item/weapon/storage/box/lights/B = W - if(!B.contents.len) - user << "The [B.name] is empty!" - else if(uses == max_uses) - user << "The [src.name] is full!" - else - B.close_all() - while(src.uses < max_uses && B.contents.len > 0) - B.contents.Cut(1,2) - AddUses(1) - user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." - return + if(istype(W, /obj/item/weapon/storage/box/lights)) + var/obj/item/weapon/storage/box/lights/B = W + if(!B.contents.len) + user << "The [B.name] is empty!" + else if(uses == max_uses) + user << "The [src.name] is full!" + else + B.close_all() + while(src.uses < max_uses && B.contents.len > 0) + B.contents.Cut(1,2) + AddUses(1) + user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." + return /obj/item/device/lightreplacer/emag_act() if(!emagged) From 93b5ef000cc472e90616b50912e296156acf6789 Mon Sep 17 00:00:00 2001 From: Yolopanther Date: Mon, 16 Nov 2015 23:21:08 -0800 Subject: [PATCH 04/62] replacing broken lights with broken lights since 1999 --- .../objects/items/devices/lightreplacer.dm | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 949182190b5..204f0da8237 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -100,15 +100,24 @@ if(istype(W, /obj/item/weapon/storage/box/lights)) var/obj/item/weapon/storage/box/lights/B = W - if(!B.contents.len) - user << "The [B.name] is empty!" + var/tmp/useable_lights = 0 + for(var/obj/item/weapon/light/L in B.contents) + if(L.status == 0) // If the light is not broken or burned out + useable_lights = 1 + break + if(!useable_lights) // This check necessitates the loop above, as I figure it to be useful to know the box has no useable lights first. + user << "The [B.name] contains no useable lights!" else if(uses == max_uses) user << "The [src.name] is full!" else B.close_all() - while(src.uses < max_uses && B.contents.len > 0) - B.contents.Cut(1,2) - AddUses(1) + for(var/obj/item/weapon/light/L in B.contents) + if(L.status == 0) // Don't want to allow broken or burnt out lights to be useable + if(src.uses < max_uses) + qdel(L) + AddUses(1) + else + break user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." return From 12c7d7a90dee9e5667810a6ee2b58ee8a4994499 Mon Sep 17 00:00:00 2001 From: Yolopanther Date: Tue, 17 Nov 2015 04:46:25 -0800 Subject: [PATCH 05/62] Now only loops through the content of the box once instead of twice. --- .../objects/items/devices/lightreplacer.dm | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 204f0da8237..af2d4742de3 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -100,26 +100,30 @@ if(istype(W, /obj/item/weapon/storage/box/lights)) var/obj/item/weapon/storage/box/lights/B = W - var/tmp/useable_lights = 0 - for(var/obj/item/weapon/light/L in B.contents) - if(L.status == 0) // If the light is not broken or burned out - useable_lights = 1 - break - if(!useable_lights) // This check necessitates the loop above, as I figure it to be useful to know the box has no useable lights first. - user << "The [B.name] contains no useable lights!" - else if(uses == max_uses) - user << "The [src.name] is full!" + var/tmp/replacement_status = 1 // 0-useable lights found, 1-no useable lights, 2-light replacer was full + + if(src.uses == max_uses) + if(!B.contents.len) // empty box + replacement_status = 1 + else // I REAALLYYY want 'no useable lights' to be the primary warning + replacement_status = 2 else - B.close_all() for(var/obj/item/weapon/light/L in B.contents) if(L.status == 0) // Don't want to allow broken or burnt out lights to be useable + replacement_status = 0 if(src.uses < max_uses) qdel(L) AddUses(1) else break - user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." - return + + if(replacement_status == 1) + user << "The [B.name] contains no useable lights!" + return + else if(replacement_status == 2) + user << "The [src.name] is full!" + return + user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." /obj/item/device/lightreplacer/emag_act() if(!emagged) From 922df5f02c513920879d422ebacb612695a5aae9 Mon Sep 17 00:00:00 2001 From: Yolopanther Date: Tue, 17 Nov 2015 19:06:31 -0800 Subject: [PATCH 06/62] Single loop and looks nice. --- .../objects/items/devices/lightreplacer.dm | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index af2d4742de3..e66828df703 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -98,32 +98,32 @@ user << "You need a working light!" return - if(istype(W, /obj/item/weapon/storage/box/lights)) - var/obj/item/weapon/storage/box/lights/B = W - var/tmp/replacement_status = 1 // 0-useable lights found, 1-no useable lights, 2-light replacer was full + if(istype(W, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = W + var/found_good_light = 0 + var/replaced_something = 0 - if(src.uses == max_uses) - if(!B.contents.len) // empty box - replacement_status = 1 - else // I REAALLYYY want 'no useable lights' to be the primary warning - replacement_status = 2 - else - for(var/obj/item/weapon/light/L in B.contents) - if(L.status == 0) // Don't want to allow broken or burnt out lights to be useable - replacement_status = 0 + for(var/obj/item/I in S.contents) + if(istype(I,/obj/item/weapon/light)) + var/obj/item/weapon/light/L = I + if(L.status == LIGHT_OK) + found_good_light = 1 if(src.uses < max_uses) qdel(L) AddUses(1) + replaced_something = 1 else break - if(replacement_status == 1) - user << "The [B.name] contains no useable lights!" + if(!found_good_light) + user << "The [S.name] contains no useable lights!" return - else if(replacement_status == 2) + + if(!replaced_something && src.uses == max_uses) user << "The [src.name] is full!" return - user << "You fill the [src.name] with lights from the [B.name]. You have [uses] lights remaining." + + user << "You fill the [src.name] with lights from the [S.name]. You have [uses] lights remaining." /obj/item/device/lightreplacer/emag_act() if(!emagged) From f767524d3e9dbcdaf734e48d762e75ee8fa2ed7e Mon Sep 17 00:00:00 2001 From: Yolopanther Date: Wed, 18 Nov 2015 00:52:16 -0800 Subject: [PATCH 07/62] Proper formatting of the notifications. --- code/game/objects/items/devices/lightreplacer.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index e66828df703..47020fbc330 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -116,14 +116,14 @@ break if(!found_good_light) - user << "The [S.name] contains no useable lights!" + user << "\The [S] contains no useable lights!" return if(!replaced_something && src.uses == max_uses) - user << "The [src.name] is full!" + user << "\The [src] is full!" return - user << "You fill the [src.name] with lights from the [S.name]. You have [uses] lights remaining." + user << "You fill \the [src] with lights from \the [S]. You have [uses] lights remaining." /obj/item/device/lightreplacer/emag_act() if(!emagged) From e9ac6d50f272c3f87addda6c76ff5f0702e40a02 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Wed, 18 Nov 2015 19:05:38 +0000 Subject: [PATCH 08/62] Updates Hologram code to use AltClick, Lazykor.jpg --- code/game/machinery/hologram.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index c8e1c81efcb..2cbb499925f 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -71,7 +71,10 @@ var/const/HOLOPAD_MODE = RANGE_BASED default_deconstruction_crowbar(P) -/obj/machinery/hologram/holopad/attack_hand(mob/living/carbon/human/user) //Carn: Hologram requests. +/obj/machinery/hologram/holopad/AltClick(mob/living/carbon/human/user) + interact(user) + +/obj/machinery/hologram/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return if(user.stat || stat & (NOPOWER|BROKEN)) @@ -108,7 +111,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED else if(href_list["mainmenu"]) temp = "" - updateUsrDialog() + updateDialog() add_fingerprint(usr) /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) From e555811830a679eabdf30167129f1ba6d9bb33f1 Mon Sep 17 00:00:00 2001 From: GunHog Date: Wed, 18 Nov 2015 18:35:57 -0600 Subject: [PATCH 09/62] The Hand Tele now displays the target name. The Hand Tele will now display the target's name before teleporting. --- code/game/objects/items/weapons/teleportation.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index f30bfdfc4da..029c0fd0238 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -145,9 +145,9 @@ Frequency: for(var/obj/machinery/computer/teleporter/com in machines) if(com.target) if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) - L["[com.id] (Active)"] = com.target + L["[get_area(com.target)] (Active)"] = com.target else - L["[com.id] (Inactive)"] = com.target + L["[get_area(com.target)] (Inactive)"] = com.target var/list/turfs = list( ) for(var/turf/T in ultra_range(10, orange=1)) if(T.x>world.maxx-8 || T.x<8) continue //putting them at the edge is dumb From c9333630622a7b3c66c057bffd9316c57d206f9a Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 21 Nov 2015 19:24:14 +0200 Subject: [PATCH 10/62] Adds the toolspeed var and adds it to most usages of tools which has a timer --- code/ATMOSPHERICS/atmospherics.dm | 2 +- .../components/unary_devices/vent_pump.dm | 2 +- .../components/unary_devices/vent_scrubber.dm | 2 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 8 ++++---- code/game/machinery/alarm.dm | 4 ++-- code/game/machinery/atmoalter/meter.dm | 2 +- code/game/machinery/buttons.dm | 2 +- code/game/machinery/computer/buildandrepair.dm | 8 ++++---- code/game/machinery/computer/computer.dm | 4 ++-- code/game/machinery/constructable_frame.dm | 8 ++++---- code/game/machinery/doors/airlock.dm | 8 ++++---- code/game/machinery/doors/firedoor.dm | 14 +++++++------- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/droneDispenser.dm | 2 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/machinery.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 4 ++-- code/game/machinery/portable_turret.dm | 4 ++-- code/game/machinery/suit_storage_unit.dm | 4 ++-- code/game/objects/items.dm | 1 + code/game/objects/items/devices/geiger_counter.dm | 2 +- code/game/objects/items/devices/multitool.dm | 1 + code/game/objects/items/devices/pizza_bomb.dm | 2 +- code/game/objects/items/devices/taperecorder.dm | 2 +- code/game/objects/items/nuke_tools.dm | 1 + code/game/objects/items/weapons/storage/secure.dm | 4 ++-- code/game/objects/items/weapons/tools.dm | 7 +++++++ code/game/objects/structures/ai_core.dm | 6 +++--- .../objects/structures/crates_lockers/closets.dm | 2 +- code/game/objects/structures/displaycase.dm | 4 ++-- code/game/objects/structures/door_assembly.dm | 12 ++++++------ code/game/objects/structures/girders.dm | 14 +++++++------- code/game/objects/structures/janicart.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 2 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/musician.dm | 4 ++-- code/game/objects/structures/reflector.dm | 6 +++--- code/game/objects/structures/signs.dm | 2 +- code/game/objects/structures/statues.dm | 6 +++--- code/game/objects/structures/table_frames.dm | 2 +- code/game/objects/structures/tables_racks.dm | 4 ++-- .../structures/transit_tubes/transit_tube.dm | 2 +- .../transit_tubes/transit_tube_construction.dm | 2 +- code/game/objects/structures/watercloset.dm | 4 ++-- code/game/objects/structures/windoor_assembly.dm | 12 ++++++------ code/game/objects/structures/window.dm | 8 ++++---- code/game/turfs/simulated/floor/plating.dm | 2 +- code/game/turfs/simulated/walls.dm | 2 +- .../food&drinks/kitchen machinery/microwave.dm | 4 ++-- code/modules/hydroponics/hydroponics.dm | 4 ++-- code/modules/library/lib_items.dm | 4 ++-- code/modules/mob/living/silicon/robot/robot.dm | 4 ++-- .../simple_animal/friendly/drone/interaction.dm | 4 ++-- code/modules/paperwork/photocopier.dm | 2 +- code/modules/power/apc.dm | 4 ++-- code/modules/power/lighting.dm | 2 +- code/modules/power/singularity/emitter.dm | 4 ++-- code/modules/power/singularity/field_generator.dm | 4 ++-- code/modules/power/solar.dm | 6 +++--- code/modules/power/tracker.dm | 2 +- .../projectiles/guns/projectile/revolver.dm | 4 ++-- code/modules/recycling/disposal-construction.dm | 2 +- code/modules/recycling/disposal-structures.dm | 4 ++-- code/modules/recycling/disposal-unit.dm | 2 +- 65 files changed, 136 insertions(+), 126 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 4b6d445a3db..95aa9e2af9a 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -140,7 +140,7 @@ Pipelines + Other Objects -> Pipe network user << "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?" unsafe_wrenching = TRUE //Oh dear oh dear - if (do_after(user, 20, target = src) && !gc_destroyed) + if (do_after(user, 20/W.toolspeed, target = src) && !gc_destroyed) user.visible_message( \ "[user] unfastens \the [src].", \ "You unfasten \the [src].", \ diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 8af67d3555a..67581c3aa98 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -266,7 +266,7 @@ if (WT.remove_fuel(0,user)) playsound(loc, 'sound/items/Welder.ogg', 40, 1) user << "You begin welding the vent..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(!welded) diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index ac52a1d1178..c67090bf6d5 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -297,7 +297,7 @@ if(WT.remove_fuel(0,user)) playsound(loc, 'sound/items/Welder.ogg', 40, 1) user << "Now welding the scrubber." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index c96b6a5f70b..c185717aeff 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -75,7 +75,7 @@ var/bomb_set if(istype(I, /obj/item/weapon/screwdriver/nuke)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) user << "You start removing [src]'s front panel's screws..." - if(do_after(user, 60,target=src)) + if(do_after(user, 60/I.toolspeed,target=src)) deconstruction_state = NUKESTATE_UNSCREWED user << "You remove the screws from [src]'s front panel." update_icon() @@ -84,7 +84,7 @@ var/bomb_set if(istype(I, /obj/item/weapon/crowbar)) user << "You start removing [src]'s front panel..." playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) - if(do_after(user,30,target=src)) + if(do_after(user,30/I.toolspeed,target=src)) user << "You remove [src]'s front panel." deconstruction_state = NUKESTATE_PANEL_REMOVED update_icon() @@ -95,7 +95,7 @@ var/bomb_set playsound(loc, 'sound/items/Welder.ogg', 100, 1) user << "You start cutting [src]'s inner plate..." if(welder.remove_fuel(1,user)) - if(do_after(user,80,target=src)) + if(do_after(user,80/I.toolspeed,target=src)) user << "You cut [src]'s inner plate." deconstruction_state = NUKESTATE_WELDED update_icon() @@ -104,7 +104,7 @@ var/bomb_set if(istype(I, /obj/item/weapon/crowbar)) user << "You start prying off [src]'s inner plate..." playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) - if(do_after(user,50,target=src)) + if(do_after(user,50/I.toolspeed,target=src)) user << "You pry off [src]'s inner plate. You can see the core's green glow!" deconstruction_state = NUKESTATE_CORE_EXPOSED update_icon() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index d1a86f5d3ee..2e83cfc3ddc 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -749,7 +749,7 @@ user.visible_message("[user.name] removes the electronics from [src.name].",\ "You start prying out the circuit...") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - if (do_after(user, 20, target = src)) + if (do_after(user, 20/W.toolspeed, target = src)) if (buildstage == 1) user <<"You remove the air alarm electronics." new /obj/item/weapon/electronics/airalarm( src.loc ) @@ -971,7 +971,7 @@ FIRE ALARM playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user.visible_message("[user.name] removes the electronics from [src.name].", \ "You start prying out the circuit...") - if(do_after(user, 20, target = src)) + if(do_after(user, 20/W.toolspeed, target = src)) if(buildstage == 1) if(stat & BROKEN) user << "You remove the destroyed circuit." diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 621bd8221b1..fed2393ef09 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -95,7 +95,7 @@ if (istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40, target = src)) + if (do_after(user, 40/W.toolspeed, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ "You unfasten \the [src].", \ diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 19e4235007a..838cc8ddc9b 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -94,7 +94,7 @@ if(!device && !board && istype(W, /obj/item/weapon/wrench)) user << "You start unsecuring the button frame..." playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) user << "You unsecure the button frame." transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src))) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index dffd5241c8c..db965e30f6a 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -309,7 +309,7 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You start wrenching the frame into place..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) user << "You wrench the frame into place." anchored = 1 state = 1 @@ -321,7 +321,7 @@ return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) user << "You start deconstructing the frame..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) if(!src || !WT.isOn()) return user << "You deconstruct the frame." var/obj/item/stack/sheet/metal/M = new (loc, 5) @@ -331,7 +331,7 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You start to unfasten the frame..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) user << "You unfasten the frame." anchored = 0 state = 0 @@ -372,7 +372,7 @@ if(C.get_amount() >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user << "You start adding cables to the frame..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) if(C.get_amount() >= 5 && state == 2) C.use(5) user << "You add cables to the frame." diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 9e6944cc3cb..c23c37cc018 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -97,11 +97,11 @@ update_icon() return -/obj/machinery/computer/attackby(obj/I, mob/user, params) +/obj/machinery/computer/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << " You start to disconnect the monitor..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) A.circuit = circuit A.anchored = 1 diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 6c3ea2b3b4b..10cf11f1c01 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -67,7 +67,7 @@ if(C.get_amount() >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user << "You start to add cables to the frame..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) if(C.get_amount() >= 5 && state == 1) C.use(5) user << "You add cables to the frame." @@ -80,7 +80,7 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user.visible_message("[user] disassembles the frame.", \ "You start to disassemble the frame...", "You hear banging and clanking.") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/P.toolspeed, target = src)) if(state == 1) user << "You disassemble the frame." var/obj/item/stack/sheet/metal/M = new (loc, 5) @@ -89,7 +89,7 @@ if(istype(P, /obj/item/weapon/wrench)) user << "You start [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/P.toolspeed, target = src)) if(state == 1) user << "You [anchored ? "un" : ""]secure [name]." anchored = !anchored @@ -98,7 +98,7 @@ if(istype(P, /obj/item/weapon/wrench)) user << "You start [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/P.toolspeed, target = src)) user << "You [anchored ? "un" : ""]secure [name]." anchored = !anchored diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 3eb9c4243e3..f03cb2eaa8b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -797,7 +797,7 @@ About the new airlock wires panel: updateUsrDialog() return -/obj/machinery/door/airlock/attackby(obj/C, mob/user, params) +/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) @@ -816,7 +816,7 @@ About the new airlock wires panel: "You begin [welded ? "unwelding":"welding"] the airlock...", \ "You hear welding.") playsound(loc, 'sound/items/Welder.ogg', 40, 1) - if(do_after(user,40,5,1, target = src)) + if(do_after(user,40/C.toolspeed,5,1, target = src)) if(density && !operating)//Door must be closed to weld. if( !istype(src, /obj/machinery/door/airlock) || !user || !W || !W.isOn() || !user.loc ) return @@ -847,7 +847,7 @@ About the new airlock wires panel: if(p_open && charge) user << "You carefully start removing [charge] from [src]..." playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - if(!do_after(user, 150, target = src)) + if(!do_after(user, 150/C.toolspeed, target = src)) user << "You slip and [charge] detonates!" charge.ex_act(1) user.Weaken(3) @@ -861,7 +861,7 @@ About the new airlock wires panel: playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") - if(do_after(user,40, target = src)) + if(do_after(user,40/C.toolspeed, target = src)) if(src.loc) if(src.doortype) var/obj/structure/door_assembly/A = new src.doortype(src.loc) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 2d85875a50b..9e23c4b60c3 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -54,7 +54,7 @@ playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) user.visible_message("[user] starts undoing [src]'s bolts...", \ "You start unfastening [src]'s floor bolts...") - if(!do_after(user, 50, target = src)) return + if(!do_after(user, 50/C.toolspeed, target = src)) return playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] unfastens [src]'s bolts.", \ "You undo [src]'s floor bolts.") @@ -208,7 +208,7 @@ playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) user.visible_message("[user] starts prying something out from [src]...", \ "You begin prying out the wire cover...") - if(!do_after(user, 50, target = src)) return + if(!do_after(user, 50/C.toolspeed, target = src)) return if(constructionStep != CONSTRUCTION_PANEL_OPEN) return playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \ @@ -220,7 +220,7 @@ playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) user.visible_message("[user] starts bolting down [src]...", \ "You begin bolting [src]...") - if(!do_after(user, 30, target = src)) return + if(!do_after(user, 30/C.toolspeed, target = src)) return user.visible_message("[user] finishes the firelock.", \ "You finish the firelock.") playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) @@ -235,7 +235,7 @@ playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1) user.visible_message("[user] starts cutting the wires from [src]...", \ "You begin removing [src]'s wires...") - if(!do_after(user, 60, target = src)) return + if(!do_after(user, 60/C.toolspeed, target = src)) return if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return user.visible_message("[user] removes the wires from [src].", \ "You remove the wiring from [src], exposing the circuit board.") @@ -250,7 +250,7 @@ playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) user.visible_message("[user] starts welding a metal plate into [src]...", \ "You begin welding the cover plate back onto [src]...") - if(!do_after(user, 80, target = src)) return + if(!do_after(user, 80/C.toolspeed, target = src)) return if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) user.visible_message("[user] welds the metal plate into [src].", \ @@ -263,7 +263,7 @@ user.visible_message("[user] begins removing the circuit board from [src]...", \ "You begin prying out the circuit board from [src]...") playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - if(!do_after(user, 50, target = src)) return + if(!do_after(user, 50/C.toolspeed, target = src)) return if(constructionStep != CONSTRUCTION_GUTTED) return user.visible_message("[user] removes [src]'s circuit board.", \ "You remove the circuit board from [src].") @@ -296,7 +296,7 @@ playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) user.visible_message("[user] begins cutting apart [src]'s frame...", \ "You begin slicing [src] apart...") - if(!do_after(user, 80, target = src)) return + if(!do_after(user, 80/C.toolspeed, target = src)) return if(constructionStep != CONSTRUCTION_NOCIRCUIT) return user.visible_message("[user] cuts apart [src]!", \ "You cut [src] into metal.") diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7d611a644c9..e67d52b408b 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -285,7 +285,7 @@ playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the [src.name].", \ "You start to remove electronics from the [src.name]...") - if(do_after(user,40, target = src)) + if(do_after(user,40/I.toolspeed, target = src)) if(src.p_open && !src.density && !src.operating && src.loc) var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc) switch(base_state) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 86bdf54f452..1917c75065f 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -201,7 +201,7 @@ playsound(src, 'sound/items/Welder.ogg', 50, 1) user.visible_message("[user] begins patching up [src] with [WT].", \ "You begin restoring the damage to [src]...") - if(!do_after(user, 40, target = src)) + if(!do_after(user, 40/O.toolspeed, target = src)) return if(!src || !WT.remove_fuel(1, user)) return user.visible_message("[user] fixes [src]!", \ diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 407db623ab9..c261956806f 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -43,7 +43,7 @@ if (bulb) user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb...") playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - if(do_after(user, 30, target = src) && bulb) + if(do_after(user, 30/W.toolspeed, target = src) && bulb) user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.") bulb.loc = src.loc bulb = null diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 76c9b375d4e..e44961c36b7 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -371,7 +371,7 @@ Class Procs: if(istype(W)) user << "You begin [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, time, target = src)) + if(do_after(user, time/W.toolspeed, target = src)) user << "You [anchored ? "un" : ""]secure [name]." anchored = !anchored playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index a0b3c353862..3eedfeec907 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -723,7 +723,7 @@ var/list/obj/machinery/newscaster/allCasters = list() if(istype(I, /obj/item/weapon/wrench)) user << "You start [anchored ? "un" : ""]securing [name]..." playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 60, target = src)) + if(do_after(user, 60/I.toolspeed, target = src)) user << "You [anchored ? "un" : ""]secure [name]." new /obj/item/wallframe/newscaster(loc) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index a23489333ea..64be7f512b5 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -81,7 +81,7 @@ if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to fasten \the [src] to the floor..." - if (do_after(user, 40, target = src)) + if (do_after(user, 40/W.toolspeed, target = src)) add_fingerprint(user) user.visible_message( \ "[user] fastens \the [src].", \ @@ -94,7 +94,7 @@ else if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src] from the floor..." - if (do_after(user, 20, target = src)) + if (do_after(user, 20/W.toolspeed, target = src)) add_fingerprint(user) user.visible_message( \ "[user] unfastens \the [src].", \ diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 31929f6e94f..d66e9a41776 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -709,7 +709,7 @@ playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) user << "You start to remove the turret's interior metal armor..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) if(!src || !WT.remove_fuel(5, user)) return build_step = 1 user << "You remove the turret's interior metal armor." @@ -785,7 +785,7 @@ playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) user << "You begin to weld the turret's armor down..." - if(do_after(user, 30, target = src)) + if(do_after(user, 30/I.toolspeed, target = src)) if(!src || !WT.remove_fuel(5, user)) return build_step = 8 diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 053485e1d40..179eff07051 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -530,7 +530,7 @@ user.visible_message("[user] starts removing [src]'s damaged wires.", \ "You begin removing the damaged wires from [src]...") playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) - if(!do_after(user, 30, target = src)) + if(!do_after(user, 30/I.toolspeed, target = src)) return user.visible_message("[user] removes the damaged wires from [src].", \ "You remove the damaged wiring from [src].") @@ -560,7 +560,7 @@ user.visible_message("[user] starts removing [src]'s broken interior plating.", \ "You begin removing the damaged interior plating from [src]...") playsound(src, 'sound/items/Crowbar.ogg', 50, 1) - if(!do_after(user, 30, target = src)) + if(!do_after(user, 30/I.toolspeed, target = src)) return user.visible_message("[user] removes the damaged interior plating from [src].", \ "You remove the damaged interior plating from [src].") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f06293ac369..9699b28d06e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -97,6 +97,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES var/heat = 0 var/sharpness = IS_BLUNT + var/toolspeed /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) if(((src in target) && !target_self) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside)) || is_type_in_list(target, can_be_placed_into)) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 49b124453b7..b3e4214e7af 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -122,7 +122,7 @@ return 0 user.visible_message("[user] unscrews [src]'s maintenance panel and begins fiddling with its innards...", "You begin resetting [src]...") playsound(user, 'sound/items/Screwdriver.ogg', 50, 1) - if(!do_after(user, 40, target = user)) + if(!do_after(user, 40/I.toolspeed, target = user)) return 0 user.visible_message("[user] refastens [src]'s maintenance panel!", "You reset [src] to its factory settings!") playsound(user, 'sound/items/Screwdriver2.ogg', 50, 1) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index bd2ae7268f6..7bfbc084f41 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -17,6 +17,7 @@ origin_tech = "magnets=1;engineering=1" var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage hitsound = 'sound/weapons/tap.ogg' + toolspeed = 1 // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index 1e6d2a5244b..3bcfbdc464d 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -76,7 +76,7 @@ user << "You can't see the box well enough to cut the wires out!" return user.visible_message("[user] starts removing the payload and wires from \the [src].", "You start removing the payload and wires from \the [src]...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/I.toolspeed, target = src)) playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1) user.unEquip(src) user.visible_message("[user] removes the insides of \the [src]!", "You remove the insides of \the [src].") diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 2266c0aacc0..2c3baa3985e 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -269,7 +269,7 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user, params) if(ruined && istype(I, /obj/item/weapon/screwdriver)) user << "You start winding the tape back in..." - if(do_after(user, 120, target = src)) + if(do_after(user, 120/I.toolspeed, target = src)) user << "You wound the tape back in." fix() diff --git a/code/game/objects/items/nuke_tools.dm b/code/game/objects/items/nuke_tools.dm index f8a0a093a12..dc36d390d6c 100644 --- a/code/game/objects/items/nuke_tools.dm +++ b/code/game/objects/items/nuke_tools.dm @@ -66,6 +66,7 @@ icon = 'icons/obj/nuke_tools.dmi' icon_state = "screwdriver_nuke" item_state = "screwdriver_nuke" + toolspeed = 2 /obj/item/weapon/screwdriver/nuke/New() //to skip screwdriver icon update diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 181dd0a771a..a91ba35482c 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -34,14 +34,14 @@ /obj/item/weapon/storage/secure/attackby(obj/item/weapon/W, mob/user, params) if(locked) if (istype(W, /obj/item/weapon/screwdriver)) - if (do_after(user, 20, target = src)) + if (do_after(user, 20/W.toolspeed, target = src)) src.open =! src.open user.show_message(text("You [] the service panel.", (src.open ? "open" : "close"))) return if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) user.show_message(text("Now attempting to reset internal memory, please hold."), 1) src.l_hacking = 1 - if (do_after(usr, 100, target = src)) + if (do_after(usr, 100/W.toolspeed, target = src)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 8d9cdb1d80e..f878422481f 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -27,6 +27,7 @@ materials = list(MAT_METAL=150) origin_tech = "materials=1;engineering=1" attack_verb = list("bashed", "battered", "bludgeoned", "whacked") + toolspeed = 1 /obj/item/weapon/wrench/suicide_act(mob/user) user.visible_message("[user] is beating \himself to death with the [src.name]! It looks like \he's trying to commit suicide.") @@ -51,6 +52,7 @@ materials = list(MAT_METAL=75) attack_verb = list("stabbed") hitsound = 'sound/weapons/bladeslice.ogg' + toolspeed = 1 /obj/item/weapon/screwdriver/suicide_act(mob/user) user.visible_message(pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \ @@ -114,6 +116,7 @@ origin_tech = "materials=1;engineering=1" attack_verb = list("pinched", "nipped") hitsound = 'sound/items/Wirecutter.ogg' + toolspeed = 1 /obj/item/weapon/wirecutters/New(loc, var/param_color = null) ..() @@ -165,6 +168,7 @@ var/can_off_process = 0 var/light_intensity = 2 //how powerful the emitted light is when used. heat = 3800 + toolspeed = 1 /obj/item/weapon/weldingtool/New() ..() @@ -429,6 +433,7 @@ change_icons = 0 can_off_process = 1 light_intensity = 1 + toolspeed = 2 //Proc to make the experimental welder generate fuel, optimized as fuck -Sieve @@ -465,6 +470,7 @@ materials = list(MAT_METAL=50) origin_tech = "engineering=1" attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") + toolspeed = 1 /obj/item/weapon/crowbar/suicide_act(mob/user) user.visible_message("[user] is beating \himself to death with the [src.name]! It looks like \he's trying to commit suicide.") @@ -485,3 +491,4 @@ throw_range = 3 materials = list(MAT_METAL=70) icon_state = "crowbar_large" + toolspeed = 2 diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index b56722da39d..7b97f9cc674 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -16,7 +16,7 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You start wrenching the frame into place..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) user << "You wrench the frame into place." anchored = 1 state = 1 @@ -27,7 +27,7 @@ return playsound(loc, 'sound/items/Welder.ogg', 50, 1) user << "You start to deconstruct the frame..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) if(!src || !WT.remove_fuel(0, user)) return user << "You deconstruct the frame." new /obj/item/stack/sheet/plasteel( loc, 4) @@ -36,7 +36,7 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You start to unfasten the frame..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/P.toolspeed, target = src)) user << "You unfasten the frame." anchored = 0 state = 0 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index fc34408821c..cdf69fe37b9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -213,7 +213,7 @@ return user << "You begin cutting \the [src] apart..." playsound(loc, cutting_sound, 40, 1) - if(do_after(user,40,5,1, target = src)) + if(do_after(user,40/W.toolspeed,5,1, target = src)) if( !opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc ) return playsound(loc, cutting_sound, 50, 1) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 4f7d765d7c0..bdeda3da687 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -126,7 +126,7 @@ qdel(src) return user << "You start to [open ? "close":"open"] the [src]" - if(do_after(user, 20, target = src)) + if(do_after(user, 20/W.toolspeed, target = src)) user << "You [open ? "close":"open"] the [src]" open = !open update_icon() @@ -187,7 +187,7 @@ if(istype(I, /obj/item/weapon/wrench)) user << "You start disassembling [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 30, target = src)) + if(do_after(user, 30/I.toolspeed, target = src)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) qdel(src) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index d1c53fa6d5f..e7df765745b 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -460,7 +460,7 @@ "You start to disassemble the airlock assembly...") playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if( !WT.isOn() ) return user << "You disassemble the airlock assembly." @@ -492,7 +492,7 @@ "You start to secure the airlock assembly to the floor...", \ "You hear wrenching.") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if( src.anchored ) return user << "You secure the airlock assembly." @@ -506,7 +506,7 @@ user.visible_message("[user] unsecures the airlock assembly from the floor.", \ "You start to unsecure the airlock assembly from the floor...", \ "You hear wrenching.") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if( !src.anchored ) return user << "You unsecure the airlock assembly." @@ -532,7 +532,7 @@ user.visible_message("[user] cuts the wires from the airlock assembly.", \ "You start to cut the wires from the airlock assembly...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if( src.state != 1 ) return user << "You cut the wires from the airlock assembly." @@ -562,7 +562,7 @@ user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if( src.state != 2 ) return user << "You remove the airlock electronics." @@ -625,7 +625,7 @@ user.visible_message("[user] finishes the airlock.", \ "You start finishing the airlock...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(src.loc && state == 2) user << "You finish the airlock." var/obj/machinery/door/airlock/door diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 5b1b6e07594..295499ee016 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -20,7 +20,7 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] disassembles the girder.", \ "You start to disassemble the girder...", "You hear clanking and banging noises.") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(state != GIRDER_DISPLACED) return state = GIRDER_DISASSEMBLED @@ -31,7 +31,7 @@ else if(state == GIRDER_REINF) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) user << "You start unsecuring support struts..." - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(state != GIRDER_REINF) return user << "You unsecure the support struts." @@ -44,7 +44,7 @@ return playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user << "You start securing the girder..." - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) user << "You secure the girder." var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) @@ -52,7 +52,7 @@ else if(state == GIRDER_NORMAL) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user << "You start unsecuring the girder..." - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) user << "You unsecure the girder." var/obj/structure/girder/displaced/D = new (loc) transfer_fingerprints_to(D) @@ -77,7 +77,7 @@ else if(istype(W, /obj/item/weapon/wirecutters) && state == GIRDER_REINF_STRUTS) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) user << "You start removing support struts..." - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) user << "You remove the support struts." new /obj/item/stack/sheet/plasteel(get_turf(src)) var/obj/structure/girder/G = new (loc) @@ -125,7 +125,7 @@ transfer_fingerprints_to(T) qdel(src) return - + if(!istype(W,/obj/item/stack/sheet)) return @@ -322,7 +322,7 @@ if(WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) user << "You start slicing apart the girder..." - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if( !WT.isOn() ) return user << "You slice apart the girder." diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index aa6b7d59ecf..a02c6ea02f8 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -80,7 +80,7 @@ mybag.attackby(I, user) else if(istype(I, /obj/item/weapon/crowbar)) user.visible_message("[user] begins to empty the contents of [src].", "You begin to empty the contents of [src]...") - if(do_after(user, 30, target = src)) + if(do_after(user, 30/I.toolspeed, target = src)) usr << "You empty the contents of [src]'s bucket onto the floor." reagents.reaction(src.loc) src.reagents.clear_reagents() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 4bc45ba6bcf..14ad3320de6 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -40,7 +40,7 @@ if(istype(I, /obj/item/weapon/crowbar)) if(!src.buckled_mob) playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) user << "You pry the spikes out of the frame." new /obj/item/stack/rods(loc, 4) var/obj/F = new /obj/structure/kitchenspike_frame(src.loc,) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index e74d5e4449c..9f99e9a2482 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -70,7 +70,7 @@ if(WT.remove_fuel(0, user)) user << "You begin repairing [src]..." playsound(src, 'sound/items/Welder.ogg', 100, 1) - if(do_after(user, 10, target = src)) + if(do_after(user, 10/I.toolspeed, target = src)) if(!user || !WT || !WT.isOn()) return user << "You repair [src]." diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 5969168b473..b497f7e3e6b 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -349,7 +349,7 @@ if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << " You begin to tighten \the [src] to the floor..." - if (do_after(user, 20, target = src)) + if (do_after(user, 20/O.toolspeed, target = src)) user.visible_message( \ "[user] tightens \the [src]'s casters.", \ "You tighten \the [src]'s casters. Now it can be played again.", \ @@ -358,7 +358,7 @@ else if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << " You begin to loosen \the [src]'s casters..." - if (do_after(user, 40, target = src)) + if (do_after(user, 40/O.toolspeed, target = src)) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ "You loosen \the [src]. Now it can be pulled somewhere else.", \ diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 72f0435425b..e30c156a284 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -41,7 +41,7 @@ if(istype(W, /obj/item/weapon/wrench)) if(anchored) user << "Unweld the [src] first!" - if(do_after(user, 80, target = src)) + if(do_after(user, 80/W.toolspeed, target = src)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You dismantle the [src]." qdel(src) @@ -54,7 +54,7 @@ user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ "You start to weld \the [src] to the floor...", \ "You hear welding.") - if (do_after(user,20, target = src)) + if (do_after(user,20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return anchored = 1 @@ -65,7 +65,7 @@ user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ "You start to cut \the [src] free from the floor...", \ "You hear welding.") - if (do_after(user,20, target = src)) + if (do_after(user,20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return anchored = 0 diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 5c21ff8be4c..ae64e41c6a9 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -22,7 +22,7 @@ user.visible_message("[user] starts removing [src]...", \ "You start unfastening [src].") playsound(src, 'sound/items/Ratchet.ogg', 50, 1) - if(!do_after(user, 30, target = src)) + if(!do_after(user, 30/O.toolspeed, target = src)) return playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] unfastens [src].", \ diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index f54046e7065..94e395d6ac9 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -24,7 +24,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] is loosening the [name]'s bolts.", \ "You are loosening the [name]'s bolts...") - if(do_after(user,40, target = src)) + if(do_after(user,40/W.toolspeed, target = src)) if(!src.loc || !anchored) return user.visible_message("[user] loosened the [name]'s bolts!", \ @@ -37,7 +37,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] is securing the [name]'s bolts...", \ "You are securing the [name]'s bolts...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src.loc || anchored) return user.visible_message("[user] has secured the [name]'s bolts.", \ @@ -68,7 +68,7 @@ playsound(loc, 'sound/items/Welder.ogg', 40, 1) user.visible_message("[user] is slicing apart the [name].", \ "You are slicing apart the [name]...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src.loc) return playsound(loc, 'sound/items/Welder2.ogg', 50, 1) diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index cddb027e0e8..c05d1251165 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -24,7 +24,7 @@ if(istype(I, /obj/item/weapon/wrench)) user << "You start disassembling [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 30, target = src)) + if(do_after(user, 30/I.toolspeed, target = src)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) for(var/i = 1, i <= framestackamount, i++) new framestack(get_turf(src)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index f882d328baf..e76e706323b 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -339,14 +339,14 @@ if(src.status == 2) user << "You start weakening the reinforced table..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if (do_after(user, 50, target = src)) + if (do_after(user, 50/W.toolspeed, target = src)) if(!src || !WT.isOn()) return user << "You weaken the table." src.status = 1 else user << "You start strengthening the reinforced table..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if (do_after(user, 50, target = src)) + if (do_after(user, 50/W.toolspeed, target = src)) if(!src || !WT.isOn()) return user << "You strengthen the table." src.status = 2 diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index e0429724bd5..28e788c0c2f 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -46,7 +46,7 @@ obj/structure/transit_tube/ex_act(severity, target) return user.visible_message("[user] starts to deattach \the [src].", "You start to deattach the [name]...") playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 35, target = src)) + if(do_after(user, 35/W.toolspeed, target = src)) user << "You deattach the [name]." var/obj/structure/R = new tube_construction(src.loc) R.icon_state = src.icon_state diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 772b8e33c1b..010200185ee 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -95,7 +95,7 @@ if(istype(I, /obj/item/weapon/wrench)) user << "You start attaching the [name]..." src.add_fingerprint(user) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/I.toolspeed, target = src)) if(!src) return user << "You attach the [name]." var/obj/structure/transit_tube/R = src.buildtube() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 27a759dfc2b..365acba4a54 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -50,7 +50,7 @@ if(istype(I, /obj/item/weapon/crowbar)) user << "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]..." playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) - if(do_after(user, 30, target = src)) + if(do_after(user, 30/I.toolspeed, target = src)) user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() @@ -185,7 +185,7 @@ user << "The water temperature seems to be [watertemp]." if(istype(I, /obj/item/weapon/wrench)) user << "You begin to adjust the temperature valve with \the [I]..." - if(do_after(user, 50, target = src)) + if(do_after(user, 50/I.toolspeed, target = src)) switch(watertemp) if("normal") watertemp = "freezing" diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index ba1f9b119cd..829869976a4 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -83,7 +83,7 @@ user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...") playsound(loc, 'sound/items/Welder2.ogg', 50, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src || !WT.isOn()) return user << "You disassemble the windoor assembly." var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) @@ -104,7 +104,7 @@ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src || anchored) return for(var/obj/machinery/door/window/WD in loc) @@ -123,7 +123,7 @@ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src || !anchored) return user << "You unsecure the windoor assembly." @@ -180,7 +180,7 @@ playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src || state != "02") return @@ -218,7 +218,7 @@ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(!src || !electronics) return user << "You remove the airlock electronics." @@ -248,7 +248,7 @@ playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/W.toolspeed, target = src)) if(loc && electronics) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cb0c4bc4957..9431ee3dc3d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -200,7 +200,7 @@ else if(!reinf) user << (anchored ? "You begin to unscrew the window from the floor..." : "You begin to screw the window to the floor...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40/I.toolspeed, target = src)) if(reinf && (state == 1 || state == 2)) //If state was unfastened, fasten it, else do the reverse state = (state == 1 ? 2 : 1) @@ -217,7 +217,7 @@ else if (istype(I, /obj/item/weapon/crowbar) && reinf && (state == 0 || state == 1)) user << (state == 0 ? "You begin to lever the window into the frame..." : "You begin to lever the window out of the frame...") playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/I.toolspeed, target = src)) //If state was out of frame, put into frame, else do the reverse state = (state == 0 ? 1 : 0) user << (state == 1 ? "You pry the window into the frame." : "You pry the window out of the frame.") @@ -228,7 +228,7 @@ if(WT.remove_fuel(0,user)) user << "You begin repairing [src]..." playsound(loc, 'sound/items/Welder.ogg', 40, 1) - if(do_after(user, 40, target = src)) + if(do_after(user, 40/I.toolspeed, target = src)) health = maxhealth playsound(loc, 'sound/items/Welder2.ogg', 50, 1) else @@ -239,7 +239,7 @@ else if(istype(I, /obj/item/weapon/wrench) && !anchored) playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) user << " You begin to disassemble [src]..." - if(do_after(user, 40, target = src)) + if(do_after(user, 40/I.toolspeed, target = src)) if(disassembled) return //Prevents multiple deconstruction attempts diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 9ed49d5e41a..27b035a4c0a 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -98,7 +98,7 @@ if(istype(C, /obj/item/weapon/wrench)) user << "You begin removing rods..." playsound(src, 'sound/items/Ratchet.ogg', 80, 1) - if(do_after(user, 30, target = src)) + if(do_after(user, 30/C.toolspeed, target = src)) if(!istype(src, /turf/simulated/floor/engine)) return new /obj/item/stack/rods(src, 2) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 5f9d7596609..074a31dabc3 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -178,7 +178,7 @@ if( WT.remove_fuel(0,user) ) user << "You begin slicing through the outer plating..." playsound(src, 'sound/items/Welder.ogg', 100, 1) - if(do_after(user, slicing_duration, target = src)) + if(do_after(user, slicing_duration/W.toolspeed, target = src)) if( !istype(src, /turf/simulated/wall) || !user || !WT || !WT.isOn() || !T ) return 1 if( user.loc == T && user.get_active_hand() == WT ) diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm index 94326f51489..878d51853b1 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food&drinks/kitchen machinery/microwave.dm @@ -66,7 +66,7 @@ "[user] starts to fix part of the microwave.", \ "You start to fix part of the microwave..." \ ) - if (do_after(user,20, target = src)) + if (do_after(user,20/O.toolspeed, target = src)) user.visible_message( \ "[user] fixes part of the microwave.", \ "You fix part of the microwave." \ @@ -77,7 +77,7 @@ "[user] starts to fix part of the microwave.", \ "You start to fix part of the microwave..." \ ) - if (do_after(user,20, target = src)) + if (do_after(user,20/O.toolspeed, target = src)) user.visible_message( \ "[user] fixes the microwave.", \ "You fix the microwave." \ diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 85d0851f300..13c40680a50 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -768,7 +768,7 @@ user.visible_message("[user] begins to wrench [src] into place.", \ "You begin to wrench [src] in place...") playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - if (do_after(user, 20, target = src)) + if (do_after(user, 20/O.toolspeed, target = src)) if(anchored) return anchored = 1 @@ -778,7 +778,7 @@ user.visible_message("[user] begins to unwrench [src].", \ "You begin to unwrench [src]...") playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - if (do_after(user, 20, target = src)) + if (do_after(user, 20/O.toolspeed, target = src)) if(!anchored) return anchored = 0 diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 3cb02b4f5ed..1af63f8b489 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -38,13 +38,13 @@ if(0) if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) user << "You wrench the frame into place." anchored = 1 state = 1 if(istype(I, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) user << "You pry the frame apart." new /obj/item/stack/sheet/mineral/wood(loc, 4) qdel(src) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index cb46e615cc5..a2d3d7eccf6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -429,7 +429,7 @@ if (WT.remove_fuel(0, user)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. if(src == user) user << "You start fixing youself..." - if(!do_after(user, 50, target = src)) + if(!do_after(user, 50/W.toolspeed, target = src)) return adjustBruteLoss(-30) @@ -510,7 +510,7 @@ else playsound(src, 'sound/items/Ratchet.ogg', 50, 1) user << "You start to unfasten [src]'s securing bolts..." - if(do_after(user, 50, target = src) && !cell) + if(do_after(user, 50/W.toolspeed, target = src) && !cell) user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") deconstruct() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 603edee9c56..9e4eac0075c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -98,7 +98,7 @@ if(istype(I, /obj/item/weapon/screwdriver) && stat != DEAD) if(health < maxHealth) user << "You start to tighten loose screws on [src]..." - if(do_after(user,80,target=user)) + if(do_after(user,80/I.toolspeed,target=user)) adjustBruteLoss(-getBruteLoss()) visible_message("[user] tightens [src == user ? "their" : "[src]'s"] loose screws!", "You tighten [src == user ? "your" : "[src]'s"] loose screws.") else @@ -110,7 +110,7 @@ user.visible_message("[user] starts resetting [src]...", \ "You press down on [src]'s factory reset control...") playsound(src, 'sound/items/Ratchet.ogg', 50, 1) - if(!do_after(user, 50, target = src)) + if(!do_after(user, 50/I.toolspeed, target = src)) return user.visible_message("[user] resets [src]!", \ "You reset [src]'s directives to factory defaults!") diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 99fcaf0a589..75e9cc96ee3 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -262,7 +262,7 @@ return playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You start [anchored ? "unwrenching" : "wrenching"] [src]..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/O.toolspeed, target = src)) if(gc_destroyed) return user << "You [anchored ? "unwrench" : "wrench"] [src]." diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index dc7c033d22a..fd551750440 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -386,7 +386,7 @@ return playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues - if(do_after(user, 50, target = src)) + if(do_after(user, 50/W.toolspeed, target = src)) if (has_electronics==1) has_electronics = 0 if ((stat & BROKEN) || malfhack) @@ -518,7 +518,7 @@ "You start welding the APC frame...", \ "You hear welding.") playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 50, target = src)) + if(do_after(user, 50/W.toolspeed, target = src)) if(!src || !WT.remove_fuel(3, user)) return if (emagged || malfhack || (stat & BROKEN) || opened==2) new /obj/item/stack/sheet/metal(loc) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 287aa0d28bd..4fe6a72c161 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -60,7 +60,7 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) usr << "You begin deconstructing [src]..." - if (!do_after(usr, 30, target = src)) + if (!do_after(usr, 30/W.toolspeed, target = src)) return new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) user.visible_message("[user.name] deconstructs [src].", \ diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 63c1566b534..eecacac5f85 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -228,7 +228,7 @@ user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ "You start to weld \the [src] to the floor...", \ "You hear welding.") - if (do_after(user,20, target = src)) + if (do_after(user,20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return state = 2 user << "You weld \the [src] to the floor." @@ -239,7 +239,7 @@ user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ "You start to cut \the [src] free from the floor...", \ "You hear welding.") - if (do_after(user,20, target = src)) + if (do_after(user,20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return state = 1 user << "You cut \the [src] free from the floor." diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 92c5e2070d1..008416ac9e5 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -130,7 +130,7 @@ field_generator power level display user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ "You start to weld \the [src] to the floor...", \ "You hear welding.") - if (do_after(user,20, target = src)) + if (do_after(user,20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return state = 2 user << "You weld the field generator to the floor." @@ -142,7 +142,7 @@ field_generator power level display user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ "You start to cut \the [src] free from the floor...", \ "You hear welding.") - if (do_after(user,20, target = src)) + if (do_after(user,20/W.toolspeed, target = src)) if(!src || !WT.isOn()) return state = 1 user << "You cut \the [src] free from the floor." diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index cbc325ef706..cc806f113fe 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -60,7 +60,7 @@ if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...") - if(do_after(user, 50, target = src)) + if(do_after(user, 50/W.toolspeed, target = src)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc @@ -391,10 +391,10 @@ data["connected_tracker"] = (connected_tracker ? 1 : 0) return data -/obj/machinery/power/solar_control/attackby(obj/I, mob/user, params) +/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) if (src.stat & BROKEN) user << "The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 874b2ca1733..233685983a3 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -63,7 +63,7 @@ if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar tracker.", "You begin to take the glass off the solar tracker...") - if(do_after(user, 50, target = src)) + if(do_after(user, 50/W.toolspeed, target = src)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 7cc46f27a26..2b98c2d7e15 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -122,7 +122,7 @@ afterattack(user, user) //you know the drill user.visible_message("[src] goes off!", "[src] goes off in your face!") return - if(do_after(user, 30, target = src)) + if(do_after(user, 30/A.toolspeed, target = src)) if(magazine.ammo_count()) user << "You can't modify it!" return @@ -135,7 +135,7 @@ afterattack(user, user) //and again user.visible_message("[src] goes off!", "[src] goes off in your face!") return - if(do_after(user, 30, target = src)) + if(do_after(user, 30/A.toolspeed, target = src)) if(magazine.ammo_count()) user << "You can't modify it!" return diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 5d869bde26c..b1227bb5b80 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -237,7 +237,7 @@ if(W.remove_fuel(0,user)) playsound(loc, 'sound/items/Welder2.ogg', 100, 1) user << "You start welding the [nicetype] in place..." - if(do_after(user, 20, target = src)) + if(do_after(user, 20/I.toolspeed, target = src)) if(!loc || !W.isOn()) return user << "The [nicetype] has been welded in place." diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index 0589e10be6d..7ea048f1bf3 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -693,7 +693,7 @@ if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) user << "You start slicing the disposal pipe..." - if(do_after(user,30, target = src)) + if(do_after(user,30/I.toolspeed, target = src)) if(!src || !W.isOn()) return Deconstruct() user << "You slice the disposal pipe." @@ -827,7 +827,7 @@ if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) user << "You start slicing the floorweld off \the [src]..." - if(do_after(user,20, target = src)) + if(do_after(user,20/I.toolspeed, target = src)) if(!src || !W.isOn()) return user << "You slice the floorweld off \the [src]." stored.loc = loc diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 0607f28e607..74be5a2317d 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -89,7 +89,7 @@ return playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) user << "You start slicing the floorweld off \the [src]..." - if(do_after(user,20, target = src)) + if(do_after(user,20/I.toolspeed, target = src)) if(!W.isOn()) return user << "You slice the floorweld off \the [src]." From 9fe09959a4d828bab0d6c3e2e19b5a777ca75ab4 Mon Sep 17 00:00:00 2001 From: Firecage Date: Sat, 21 Nov 2015 19:40:20 +0200 Subject: [PATCH 11/62] Changes the base toolspeed var to 1 --- 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 9699b28d06e..746612b4796 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -97,7 +97,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES var/heat = 0 var/sharpness = IS_BLUNT - var/toolspeed + var/toolspeed = 1 /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) if(((src in target) && !target_self) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside)) || is_type_in_list(target, can_be_placed_into)) From 9a2c60cac6e3d77488bead0c52bb9e0cf9ca90c6 Mon Sep 17 00:00:00 2001 From: ktccd Date: Tue, 24 Nov 2015 01:09:01 +0100 Subject: [PATCH 12/62] Fixes issue #13126and also a few other areas blobs shouldn't be win from absorbing (centcom, SPACE etc). :cl: ktccd Fixes bug #13126 and also a few other areas blobs shouldn't be win from absorbing (centcom, SPACE etc). Added a variable to areas. Kept the original blobs list as a list of all blobs, in case that was used somewhere else, and instead made a separate list for legit blobs. /:cl: --- code/game/area/Space Station 13 areas.dm | 6 ++++++ code/game/area/areas.dm | 1 + code/game/gamemodes/blob/blob.dm | 3 ++- code/game/gamemodes/blob/blob_finish.dm | 2 +- code/game/gamemodes/blob/theblob.dm | 10 ++++++++-- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index cdcbfd1526a..7094a194340 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -97,6 +97,7 @@ var/list/teleportlocs = list() power_environ = 0 valid_territory = 0 ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg',) + blob_legit = 0 //Eating up space doesn't count for victory as a blob. /area/space/nearstation icon_state = "space_near" @@ -164,6 +165,7 @@ var/list/teleportlocs = list() icon_state = "centcom" requires_power = 0 has_gravity = 1 + blob_legit = 0 //Should go without saying, no blobs should take over centcom as a win condition. /area/centcom/control name = "Centcom Docks" @@ -190,6 +192,7 @@ var/list/teleportlocs = list() icon_state = "syndie-ship" requires_power = 0 has_gravity = 1 + blob_legit = 0 //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win. /area/syndicate_mothership/control name = "Syndicate Control Room" @@ -206,6 +209,7 @@ var/list/teleportlocs = list() icon_state = "asteroid" requires_power = 0 has_gravity = 1 + blob_legit = 0 //Nope, no winning on the asteroid as a blob. Gotta eat the station. /area/asteroid/cave name = "Asteroid - Underground" @@ -1011,6 +1015,7 @@ var/list/teleportlocs = list() name = "Ruskie DJ Station" icon_state = "DJ" has_gravity = 1 + blob_legit = 0 //Nope, no winning on the DJ station as a blob. Gotta eat the main station. /area/djstation/solars name = "DJ Station Solars" @@ -1022,6 +1027,7 @@ var/list/teleportlocs = list() /area/derelict name = "Derelict Station" icon_state = "storage" + blob_legit = 0 //Nope, no winning on the derelict as a blob. Gotta eat the station. /area/derelict/hallway/primary name = "Derelict Primary Hallway" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 966b9acdd64..965b6dae214 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -23,6 +23,7 @@ 'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\ 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\ 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') + var/blob_legit = 1 //Does it count for blobs score? By default, all areas count. /area/New() icon_state = "" diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index f8f120c4b22..de3df02c364 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -1,9 +1,10 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 //Few global vars to track the blob -var/list/blobs = list() +var/list/blobs = list() //complete list of all blobs made. var/list/blob_cores = list() var/list/blob_nodes = list() +var/list/blobs_legit = list() //used for win-score calculations, contains only blobs counted for win condition /datum/game_mode/blob diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 55f79d883b8..b177798cdcd 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -1,7 +1,7 @@ /datum/game_mode/blob/check_finished() if(infected_crew.len > burst)//Some blobs have yet to burst return 0 - if(blobwincount <= blobs.len)//Blob took over + if(blobwincount <= blobs_legit.len)//Blob took over return 1 if(!blob_cores.len) // blob is dead if(config.continuous["blob"]) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 70d6796e6ce..5392efe7ca9 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -19,7 +19,10 @@ /obj/effect/blob/New(loc) - blobs += src + var/area/Ablob = loc + if (Ablob.blob_legit) //Is the area Legit for blobs? + blobs_legit += src + blobs += src //Keep track of the blob in the normal list either way src.dir = pick(1, 2, 4, 8) src.update_icon() ..(loc) @@ -31,7 +34,10 @@ return /obj/effect/blob/Destroy() - blobs -= src + var/area/Ablob = loc + if (Ablob.blob_legit) //Only remove for blobs in Legit places, else they didn't add points to begin with. + blobs_legit -= src + blobs -= src //It's still removed from the normal list if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) return ..() From 8f24c37f46c48f696714116f8d7542609e6109a9 Mon Sep 17 00:00:00 2001 From: ktccd Date: Tue, 24 Nov 2015 17:48:21 +0100 Subject: [PATCH 13/62] Fixes issue #13126 (Better this time) :cl: ktccd bugfix: Blob pieces on some areas no longer count for blob mode victory (Such as space or asteroid). bugfix: Asteroid areas are no longer valid gang territory. /:cl: --- code/game/area/Space Station 13 areas.dm | 3 +++ code/game/area/areas.dm | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 7094a194340..d2a22b2dc82 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -30,6 +30,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/lightswitch = 1 var/valid_territory = 1 //If it's a valid territory for gangs to claim + var/blob_legit = 1 //Does it count for blobs score? By default, all areas count. + var/eject = null var/requires_power = 1 @@ -210,6 +212,7 @@ var/list/teleportlocs = list() requires_power = 0 has_gravity = 1 blob_legit = 0 //Nope, no winning on the asteroid as a blob. Gotta eat the station. + valid_territory = 0 /area/asteroid/cave name = "Asteroid - Underground" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 965b6dae214..966b9acdd64 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -23,7 +23,6 @@ 'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\ 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\ 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') - var/blob_legit = 1 //Does it count for blobs score? By default, all areas count. /area/New() icon_state = "" From 5b86fd84b0fe2ac63c4382c2b43cdacba47fae5b Mon Sep 17 00:00:00 2001 From: Incoming Date: Tue, 24 Nov 2015 21:54:20 -0500 Subject: [PATCH 14/62] OOC will now scrub out messages that start with . ; or : (the say channel modifiers and let the player know that they almost goofed up. (if you want to make a fake IC in OOC joke you still can by adding a space before the message) --- code/game/verbs/ooc.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 51dafa08dd5..0e589a92ec0 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -14,6 +14,10 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return + if(copytext(msg, 1, 2) in list(".",";",":")) + src << "Your message \"[msg]\" looks like it was meant for in game communication." + return + if(!(prefs.chat_toggles & CHAT_OOC)) src << "You have OOC muted." return From cf2e566a0019f40f2f6bc1022288116ff624754d Mon Sep 17 00:00:00 2001 From: Incoming5643 Date: Tue, 24 Nov 2015 22:03:26 -0500 Subject: [PATCH 15/62] Hashtag obscure functionality --- 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 0e589a92ec0..2df276bee51 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -14,7 +14,7 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - if(copytext(msg, 1, 2) in list(".",";",":")) + if(copytext(msg, 1, 2) in list(".",";",":","#")) src << "Your message \"[msg]\" looks like it was meant for in game communication." return From b304e6bd9a7cb232b531ef1304f48883ddd4173c Mon Sep 17 00:00:00 2001 From: Incoming5643 Date: Tue, 24 Nov 2015 22:51:31 -0500 Subject: [PATCH 16/62] Preserves shitposting when you type something that looks like IC in OOC you'll get a pop up that will let you actually say it if that's what you meant to do. It defaults to no so real accidental IC OOC can mash out of the command in case what they said was ";help!" --- code/game/verbs/ooc.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 2df276bee51..2728f9dffe6 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -14,9 +14,9 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - if(copytext(msg, 1, 2) in list(".",";",":","#")) - src << "Your message \"[msg]\" looks like it was meant for in game communication." - return + if((copytext(msg, 1, 2) in list(".",";",":","#")) || (lowertext(copytext(msg, 1, 4)) == "say")) + if(alert("Your message \"[msg]\" looks like it was meant for in game communication, say it in OOC?", "Meant for OOC?", "No", "Yes") != "Yes") + return if(!(prefs.chat_toggles & CHAT_OOC)) src << "You have OOC muted." From 29814ec89ca1bada6b5b901cf7fbe16005d8a162 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Wed, 25 Nov 2015 13:56:45 -0800 Subject: [PATCH 17/62] Changes event fire rate from 5-15 minutes to 3-10 minutes Because of the increase in the number of events possible, it seems it would make sense to raise how often events fire --- code/controllers/subsystem/events.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index dc7a82ac4ae..0791d5c563f 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -8,8 +8,8 @@ var/datum/subsystem/events/SSevent var/list/running = list() //list of all existing /datum/round_event var/scheduled = 0 //The next world.time that a naturally occuring random event can be selected. - var/frequency_lower = 3000 //5 minutes lower bound. - var/frequency_upper = 9000 //15 minutes upper bound. Basically an event will happen every 5 to 15 minutes. + var/frequency_lower = 1800 //3 minutes lower bound. + var/frequency_upper = 6000 //10 minutes upper bound. Basically an event will happen every 3 to 10 minutes. var/list/holidays //List of all holidays occuring today or null if no holidays var/wizardmode = 0 From fd335fc0452861a7a27dee865938dcc59da85cf3 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Wed, 25 Nov 2015 21:25:47 -0500 Subject: [PATCH 18/62] Changeling add_profile now only adds profile refactored old functionality into add_new_profile and changes all previous usage to add_new_profile --- code/game/gamemodes/changeling/changeling.dm | 39 ++++++++++++++----- .../gamemodes/changeling/evolution_menu.dm | 2 +- .../gamemodes/changeling/powers/absorb.dm | 4 +- .../gamemodes/changeling/powers/hivemind.dm | 8 +++- .../gamemodes/changeling/powers/tiny_prick.dm | 2 +- .../living/simple_animal/hostile/headcrab.dm | 2 +- 6 files changed, 41 insertions(+), 16 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 427de546b75..bd417180b6d 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -358,12 +358,8 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas return return 1 -/datum/changeling/proc/add_profile(var/mob/living/carbon/human/H, var/mob/living/carbon/user, protect = 0) - if(stored_profiles.len > dna_max) - if(!push_out_profile()) - return - - var/datum/changelingprofile/prof = new() +/datum/changeling/proc/create_profile(mob/living/carbon/human/H, mob/living/carbon/human/user, protect = 0) + var/datum/changelingprofile/prof = new H.dna.real_name = H.real_name //Set this again, just to be sure that it's properly set. var/datum/dna/new_dna = new H.dna.type @@ -391,12 +387,22 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas else continue + return prof + +/datum/changeling/proc/add_profile(datum/changelingprofile/prof) + if(stored_profiles.len > dna_max) + if(!push_out_profile()) + return + stored_profiles += prof absorbedcount++ +/datum/changeling/proc/add_new_profile(mob/living/carbon/human/H, mob/living/carbon/human/user, protect = 0) + var/datum/changelingprofile/prof = create_profile(H, protect) + add_profile(prof) return prof -/datum/changeling/proc/remove_profile(var/mob/living/carbon/human/H, force = 0) +/datum/changeling/proc/remove_profile(mob/living/carbon/human/H, force = 0) for(var/datum/changelingprofile/prof in stored_profiles) if(H.real_name == prof.name) if(prof.protected && !force) @@ -416,7 +422,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas return 1 return 0 -/proc/changeling_transform(var/mob/living/carbon/human/user, var/datum/changelingprofile/chosen_prof) +/proc/changeling_transform(mob/living/carbon/human/user, datum/changelingprofile/chosen_prof) var/datum/dna/chosen_dna = chosen_prof.dna user.real_name = chosen_prof.name user.underwear = chosen_prof.underwear @@ -476,4 +482,19 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas /datum/changelingprofile/Destroy() qdel(dna) - return ..() \ No newline at end of file + return ..() + +/datum/changelingprofile/proc/copy_profile(datum/changelingprofile/newprofile) + newprofile.name = name + newprofile.protected = protected + newprofile.dna = new dna.type + dna.copy_dna(newprofile.dna) + newprofile.name_list = name_list.Copy() + newprofile.appearance_list = appearance_list.Copy() + newprofile.flags_cover_list = flags_cover_list.Copy() + newprofile.exists_list = exists_list.Copy() + newprofile.item_color_list = item_color_list.Copy() + newprofile.item_state_list = item_state_list.Copy() + newprofile.underwear = underwear + newprofile.undershirt = undershirt + newprofile.socks = socks diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index db88f244ce0..af9cd88b91b 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -372,7 +372,7 @@ var/list/sting_paths var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste if(ishuman(C)) - var/datum/changelingprofile/prof = mind.changeling.add_profile(C) + var/datum/changelingprofile/prof = mind.changeling.add_new_profile(C, src) mind.changeling.first_prof = prof return 1 diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 0bdc2becb54..97aa442b108 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -54,7 +54,7 @@ target << "You are absorbed by the changeling!" if(!changeling.has_dna(target.dna)) - changeling.add_profile(target, user) + changeling.add_new_profile(target, user) if(user.nutrition < NUTRITION_LEVEL_WELL_FED) user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED) @@ -152,7 +152,7 @@ target << "[user] tightens their grip as a painful sensation invades your body." if(!changeling.has_dna(target.dna)) - changeling.add_profile(target, user) + changeling.add_new_profile(target, user) changeling.remove_profile(user) var/mob/dead/observer/ghost = target.ghostize(0) diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index 74bee7886f1..d7497e6d290 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -47,7 +47,9 @@ var/list/datum/dna/hivemind_bank = list() if(!chosen_dna) return - hivemind_bank += chosen_dna + var/datum/changelingprofile/uploaded_dna = new chosen_dna.type + chosen_dna.copy_profile(uploaded_dna) + hivemind_bank += uploaded_dna user << "We channel the DNA of [chosen_name] to the air." feedback_add_details("changeling_powers","HU") return 1 @@ -85,7 +87,9 @@ var/list/datum/dna/hivemind_bank = list() if(!chosen_prof) return - changeling.add_profile(chosen_prof, user) + var/datum/changelingprofile/downloaded_prof = new chosen_prof.type + chosen_prof.copy_profile(downloaded_prof) + changeling.add_profile(downloaded_prof) user << "We absorb the DNA of [S] from the air." feedback_add_details("changeling_powers","HD") return 1 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index da55f48d844..80df685d5a5 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -175,7 +175,7 @@ /obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target) add_logs(user, target, "stung", "extraction sting") if(!(user.mind.changeling.has_dna(target.dna))) - user.mind.changeling.add_profile(target, user) + user.mind.changeling.add_new_profile(target, user) feedback_add_details("changeling_powers","ED") return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index ea921265e4a..9f4c0d7d686 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -80,7 +80,7 @@ if(!origin.changeling) M.make_changeling() if(origin.changeling.can_absorb_dna(M, owner)) - origin.changeling.add_profile(owner, M) + origin.changeling.add_new_profile(owner, M) origin.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) M.key = origin.key From ddef6bdb681c4f2236241b72c37fe269093727c6 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 26 Nov 2015 00:34:46 -0800 Subject: [PATCH 19/62] Makes False Alarm only choose events that actually have alarms --- code/modules/events/false_alarm.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 5c7a0c4d47a..ed258b85c61 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -11,11 +11,15 @@ /datum/round_event/falsealarm/announce() var/list/events_list = list() for(var/datum/round_event_control/E in SSevent.control) - if(!E.wizardevent && !E.holidayID) //No holiday cheer allowed during non-holidays. Not even fake holiday cheer. - events_list += E //No holiday cheer allowed during non-holidays. Not even fake holiday cheer. + if(Event.announceWhen < 0 || E.holidayID || E.wizardevent) + continue + events_list += E + var/datum/round_event_control/event_control = pick(events_list) if(event_control) var/datum/round_event/Event = new event_control.typepath() message_admins("False Alarm: [Event]") Event.kill() //do not process this event - no starts, no ticks, no ends - Event.announce() //just announce it like it's happening \ No newline at end of file + Event.announce() //just announce it like it's happening + + From 63d5d82720af4d85ef08f6a76223c1408e26b17f Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 26 Nov 2015 00:38:02 -0800 Subject: [PATCH 20/62] False Alarm compile fix --- code/modules/events/false_alarm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index ed258b85c61..8b39e6dbb6f 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -11,7 +11,7 @@ /datum/round_event/falsealarm/announce() var/list/events_list = list() for(var/datum/round_event_control/E in SSevent.control) - if(Event.announceWhen < 0 || E.holidayID || E.wizardevent) + if(E.announceWhen < 0 || E.holidayID || E.wizardevent) continue events_list += E From 3d64925e999fb71c81ca666734065b6a52abbdf5 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 26 Nov 2015 00:42:30 -0800 Subject: [PATCH 21/62] fucking event_control vs event datums confusing me --- code/modules/events/false_alarm.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 8b39e6dbb6f..6066834f961 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -11,7 +11,10 @@ /datum/round_event/falsealarm/announce() var/list/events_list = list() for(var/datum/round_event_control/E in SSevent.control) - if(E.announceWhen < 0 || E.holidayID || E.wizardevent) + if(E.holidayID || E.wizardevent) + continue + var/datum/round_event/event = E.typepath + if (inital(E.typepath) < 0) continue events_list += E From 7dd0f1ad7f48005036325339926d045d78fb701c Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 26 Nov 2015 01:10:06 -0800 Subject: [PATCH 22/62] I shouldn't code while drunk. --- code/modules/events/false_alarm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 6066834f961..4cca0ecad2c 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -14,7 +14,7 @@ if(E.holidayID || E.wizardevent) continue var/datum/round_event/event = E.typepath - if (inital(E.typepath) < 0) + if (initial(E.typepath) < 0) continue events_list += E From 90acd39626fe6eb191b179fd6245a2d5ee5311d4 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 Nov 2015 15:08:54 -0600 Subject: [PATCH 23/62] Guardian recall --- .../mob/living/simple_animal/guardian/guardian.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index b9a2a102043..5f958469b1d 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -156,6 +156,16 @@ log_say("[src.real_name]/[src.key] : [text]") +/mob/living/proc/guardian_recall() + set name = "Recall Guardian" + set category = "Guardian" + set desc = "Forcibly recall your guardian." + for(var/mob/M in mob_list) + if(istype (M, /mob/living/simple_animal/hostile/guardian)) + var/mob/living/simple_animal/hostile/guardian/G = M + if(G.summoner == src) + G.Recall() + /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() if(!luminosity) SetLuminosity(3) From 7b6bbbb58e88879584e43ae06b809a1bc5a1c0e2 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 Nov 2015 15:17:23 -0600 Subject: [PATCH 24/62] Good catch --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 5f958469b1d..35e3b932419 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -608,6 +608,7 @@ G << "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself." G << "[G.playstyle_string]" user.verbs += /mob/living/proc/guardian_comm + user.verbs += /mob/living/proc/guardian_recall() switch (theme) if("magic") G.name = "[mob_name] [capitalize(picked_color)]" From 4e0fd916885d2a8745643d4e02e3679d7a57ff8b Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 Nov 2015 15:19:11 -0600 Subject: [PATCH 25/62] Why am I so bad at coding? --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 35e3b932419..b8da3474ead 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -608,7 +608,7 @@ G << "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself." G << "[G.playstyle_string]" user.verbs += /mob/living/proc/guardian_comm - user.verbs += /mob/living/proc/guardian_recall() + user.verbs += /mob/living/proc/guardian_recall switch (theme) if("magic") G.name = "[mob_name] [capitalize(picked_color)]" From bf7fb2aa8c6b5f33d12cbf4fe379c0f7d6e81ddc Mon Sep 17 00:00:00 2001 From: ktccd Date: Thu, 26 Nov 2015 22:48:36 +0100 Subject: [PATCH 26/62] Fixed looking up the /area of the loc, not the turf. I messed up, thanks Aranclanos! --- code/game/gamemodes/blob/theblob.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 5392efe7ca9..ca99254b6f8 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -19,7 +19,7 @@ /obj/effect/blob/New(loc) - var/area/Ablob = loc + var/area/Ablob = get_area(loc) if (Ablob.blob_legit) //Is the area Legit for blobs? blobs_legit += src blobs += src //Keep track of the blob in the normal list either way @@ -34,7 +34,7 @@ return /obj/effect/blob/Destroy() - var/area/Ablob = loc + var/area/Ablob = get_area(loc) if (Ablob.blob_legit) //Only remove for blobs in Legit places, else they didn't add points to begin with. blobs_legit -= src blobs -= src //It's still removed from the normal list From 9df0dfe2c067aa590113f1a65d52a94ce07349e6 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Thu, 26 Nov 2015 17:46:35 -0500 Subject: [PATCH 27/62] Fixes dominator error message issue. --- code/game/gamemodes/gang/recaller.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 236be07cb64..293855f00b1 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -286,7 +286,8 @@ usr << "The dominator will secure your gang's dominance over the station. Turn it on when you are ready to defend it." pointcost = 30 else - usr << "The dominator can be spawned only on territory controlled by your gang." + usr << "The dominator can be spawned only on territory controlled by your gang!" + return if(item_type) gang.points -= pointcost From d8e27fb1683b4c00589d96211ab112924959f00b Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 Nov 2015 17:18:02 -0600 Subject: [PATCH 28/62] Reroll guardian --- .../living/simple_animal/guardian/guardian.dm | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index b8da3474ead..dac601c6b93 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -166,6 +166,27 @@ if(G.summoner == src) G.Recall() +/mob/living/proc/guardian_reset() + set name = "Reset Guardian Player (One Use)" + set category = "Guardian" + set desc = "Re-rolls which ghost will control your Guardian. One use." + for(var/mob/M in mob_list) + if(istype (M, /mob/living/simple_animal/hostile/guardian)) + var/mob/living/simple_animal/hostile/guardian/G = M + if(G.summoner == src) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [G.real_name]?", "pAI", null, FALSE, 100) + var/mob/dead/observer/new_stand = null + if(candidates.len) + new_stand = pick(candidates) + G << "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance." + src << "Your guardian has been successfully reset." + message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") + G.ghostize() + G.key = new_stand.key + src.verbs -= /mob/living/proc/guardian_reset + else + src << "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now." + /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() if(!luminosity) SetLuminosity(3) @@ -609,6 +630,7 @@ G << "[G.playstyle_string]" user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall + user.verbs += /mob/living/proc/guardian_reset switch (theme) if("magic") G.name = "[mob_name] [capitalize(picked_color)]" From 3533be60c8e2811444cd1705da13b895bdb22c83 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 Nov 2015 18:15:46 -0600 Subject: [PATCH 29/62] Fixes lists --- .../living/simple_animal/guardian/guardian.dm | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index dac601c6b93..14a03d2dbb9 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -160,32 +160,28 @@ set name = "Recall Guardian" set category = "Guardian" set desc = "Forcibly recall your guardian." - for(var/mob/M in mob_list) - if(istype (M, /mob/living/simple_animal/hostile/guardian)) - var/mob/living/simple_animal/hostile/guardian/G = M - if(G.summoner == src) - G.Recall() + for(var/mob/living/simple_animal/hostile/guardian/G in mob_list) + if(G.summoner == src) + G.Recall() /mob/living/proc/guardian_reset() set name = "Reset Guardian Player (One Use)" set category = "Guardian" set desc = "Re-rolls which ghost will control your Guardian. One use." - for(var/mob/M in mob_list) - if(istype (M, /mob/living/simple_animal/hostile/guardian)) - var/mob/living/simple_animal/hostile/guardian/G = M - if(G.summoner == src) - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [G.real_name]?", "pAI", null, FALSE, 100) - var/mob/dead/observer/new_stand = null - if(candidates.len) - new_stand = pick(candidates) - G << "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance." - src << "Your guardian has been successfully reset." - message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") - G.ghostize() - G.key = new_stand.key - src.verbs -= /mob/living/proc/guardian_reset - else - src << "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now." + for(var/mob/living/simple_animal/hostile/guardian/G in mob_list) + if(G.summoner == src) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [G.real_name]?", "pAI", null, FALSE, 100) + var/mob/dead/observer/new_stand = null + if(candidates.len) + new_stand = pick(candidates) + G << "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance." + src << "Your guardian has been successfully reset." + message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") + G.ghostize() + G.key = new_stand.key + src.verbs -= /mob/living/proc/guardian_reset + else + src << "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now." /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() if(!luminosity) From c261aa30e5af187c0670d0786e36d050b07a40a8 Mon Sep 17 00:00:00 2001 From: Incoming5643 Date: Fri, 27 Nov 2015 17:03:40 -0500 Subject: [PATCH 30/62] adds functionality to catch dsay and asay mistakes, moves the check below things like OOC muting --- code/game/verbs/ooc.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 2728f9dffe6..3dae0081cdf 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -14,10 +14,6 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - if((copytext(msg, 1, 2) in list(".",";",":","#")) || (lowertext(copytext(msg, 1, 4)) == "say")) - if(alert("Your message \"[msg]\" looks like it was meant for in game communication, say it in OOC?", "Meant for OOC?", "No", "Yes") != "Yes") - return - if(!(prefs.chat_toggles & CHAT_OOC)) src << "You have OOC muted." return @@ -42,6 +38,10 @@ log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return + + if((copytext(msg, 1, 2) in list(".",";",":","#")) || (findtext(lowertext(copytext(msg, 1, 5)), "say"))) + if(alert("Your message \"[msg]\" looks like it was meant for in game communication, say it in OOC?", "Meant for OOC?", "No", "Yes") != "Yes") + return log_ooc("[mob.name]/[key] : [msg]") From 395cd5a68c4c6a136304d6d067bd06ed4b689604 Mon Sep 17 00:00:00 2001 From: ktccd Date: Sat, 28 Nov 2015 01:06:27 +0100 Subject: [PATCH 31/62] Rewrote a bit of blob code to fix... a lot Stuff fixed: My sad attempt at fixing #13126. The expand() proc for blobs is hopefully less intensive now (WHY did it used to spawn a blob only to destroy it? That must've been such a waste...). Destroy code no longer needs to adjust for the expand() proc doing weird things. The antag panel will now show the correct variable used to determine blob progress. Renamed the variables I used so they're not so similar to each other. blob_legit and blobs_legit was WAY to easy to mix up. --- code/game/area/Space Station 13 areas.dm | 14 +++---- code/game/gamemodes/blob/blob_finish.dm | 2 +- code/game/gamemodes/blob/theblob.dm | 47 ++++++++++++++---------- code/modules/admin/player_panel.dm | 2 +- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index d2a22b2dc82..53d7093e514 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -30,7 +30,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/lightswitch = 1 var/valid_territory = 1 //If it's a valid territory for gangs to claim - var/blob_legit = 1 //Does it count for blobs score? By default, all areas count. + var/blob_allowed = 1 //Does it count for blobs score? By default, all areas count. var/eject = null @@ -99,7 +99,7 @@ var/list/teleportlocs = list() power_environ = 0 valid_territory = 0 ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg',) - blob_legit = 0 //Eating up space doesn't count for victory as a blob. + blob_allowed = 0 //Eating up space doesn't count for victory as a blob. /area/space/nearstation icon_state = "space_near" @@ -167,7 +167,7 @@ var/list/teleportlocs = list() icon_state = "centcom" requires_power = 0 has_gravity = 1 - blob_legit = 0 //Should go without saying, no blobs should take over centcom as a win condition. + blob_allowed = 0 //Should go without saying, no blobs should take over centcom as a win condition. /area/centcom/control name = "Centcom Docks" @@ -194,7 +194,7 @@ var/list/teleportlocs = list() icon_state = "syndie-ship" requires_power = 0 has_gravity = 1 - blob_legit = 0 //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win. + blob_allowed = 0 //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win. /area/syndicate_mothership/control name = "Syndicate Control Room" @@ -211,7 +211,7 @@ var/list/teleportlocs = list() icon_state = "asteroid" requires_power = 0 has_gravity = 1 - blob_legit = 0 //Nope, no winning on the asteroid as a blob. Gotta eat the station. + blob_allowed = 0 //Nope, no winning on the asteroid as a blob. Gotta eat the station. valid_territory = 0 /area/asteroid/cave @@ -1018,7 +1018,7 @@ var/list/teleportlocs = list() name = "Ruskie DJ Station" icon_state = "DJ" has_gravity = 1 - blob_legit = 0 //Nope, no winning on the DJ station as a blob. Gotta eat the main station. + blob_allowed = 0 //Nope, no winning on the DJ station as a blob. Gotta eat the main station. /area/djstation/solars name = "DJ Station Solars" @@ -1030,7 +1030,7 @@ var/list/teleportlocs = list() /area/derelict name = "Derelict Station" icon_state = "storage" - blob_legit = 0 //Nope, no winning on the derelict as a blob. Gotta eat the station. + blob_allowed = 0 //Nope, no winning on the derelict as a blob. Gotta eat the station. /area/derelict/hallway/primary name = "Derelict Primary Hallway" diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index b177798cdcd..5bd7dc2b321 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -19,7 +19,7 @@ /datum/game_mode/blob/declare_completion() if(round_converted) //So badmin blobs later don't step on the dead natural blobs metaphorical toes ..() - if(blobwincount <= blobs.len) + if(blobwincount <= blobs_legit.len) feedback_set_details("round_end_result","win - blob took over") world << "The blob has taken over the station!" world << "The entire station was eaten by the Blob" diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index ca99254b6f8..2acc5df04b1 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -17,10 +17,9 @@ var/fire_resist = 1 var/mob/camera/blob/overmind - /obj/effect/blob/New(loc) var/area/Ablob = get_area(loc) - if (Ablob.blob_legit) //Is the area Legit for blobs? + if (Ablob.blob_allowed) //Is this area allowed for winning as blob? blobs_legit += src blobs += src //Keep track of the blob in the normal list either way src.dir = pick(1, 2, 4, 8) @@ -35,11 +34,10 @@ /obj/effect/blob/Destroy() var/area/Ablob = get_area(loc) - if (Ablob.blob_legit) //Only remove for blobs in Legit places, else they didn't add points to begin with. + if (Ablob.blob_allowed) //Only remove for blobs in areas that counted for the win blobs_legit -= src blobs -= src //It's still removed from the normal list - if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Expand() is no longer broken, no check necessary. return ..() @@ -130,24 +128,33 @@ else T = null if(!T) return 0 - var/obj/effect/blob/B = new /obj/effect/blob/normal(src.loc) + //We can keep the above code in this proc, it probably works fine? + //new blob code with less BS: + var/Blob_spawnable = 1 if(istype(T, /turf/space) && prob(65)) - B.health = 0 - B.color = a_color - B.density = 1 - if(T.Enter(B,src))//Attempt to move into the tile - B.density = initial(B.density) - B.loc = T - B.update_icon() - else - T.blob_act()//If we cant move in hit the turf - B.loc = null //So we don't play the splat sound, see Destroy() - qdel(B) - - for(var/atom/A in T)//Hit everything in the turf - A.blob_act() + Blob_spawnable = 0 + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Let's give some feedback that we DID try to spawn in space, since players are used to it + for (var/atom/A in T) + if (A.density != 0) // Unless density is 0, don't spawn a blob + Blob_spawnable = 0 + A.blob_act() //Hit everything + if (T.density != 0) //Check for walls and such dense turfs + Blob_spawnable = 0 + T.blob_act() //Hit the turf + if (Blob_spawnable == 1) + var/obj/effect/blob/B = new /obj/effect/blob/normal(src.loc) + B.color = a_color + B.density = 1 + if(T.Enter(B,src)) //NOW we can attempt to move into the tile + B.density = initial(B.density) + B.loc = T + B.update_icon() + else + T.blob_act() //If we cant move in hit the turf + qdel(B) //We should never get to this point, since we checked before moving in. Destroy blob anyway for cleanliness though return 1 + /obj/effect/blob/ex_act(severity, target) ..() var/damage = 150 - 20 * severity diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 39f37bc3d1a..dff4818781c 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -544,7 +544,7 @@ if(istype(ticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/mode = ticker.mode dat += "
" - dat += "" + dat += "" for(var/datum/mind/blob in mode.infected_crew) var/mob/M = blob.current From b269e5bab8a962eed8fc835451728b31e3f32221 Mon Sep 17 00:00:00 2001 From: ktccd Date: Sat, 28 Nov 2015 01:27:29 +0100 Subject: [PATCH 32/62] Update to bring code in line with standards Removes some unecessary text as well. --- code/game/gamemodes/blob/theblob.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 2acc5df04b1..cec621db36a 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -19,7 +19,7 @@ /obj/effect/blob/New(loc) var/area/Ablob = get_area(loc) - if (Ablob.blob_allowed) //Is this area allowed for winning as blob? + if(Ablob.blob_allowed) //Is this area allowed for winning as blob? blobs_legit += src blobs += src //Keep track of the blob in the normal list either way src.dir = pick(1, 2, 4, 8) @@ -34,7 +34,7 @@ /obj/effect/blob/Destroy() var/area/Ablob = get_area(loc) - if (Ablob.blob_allowed) //Only remove for blobs in areas that counted for the win + if(Ablob.blob_allowed) //Only remove for blobs in areas that counted for the win blobs_legit -= src blobs -= src //It's still removed from the normal list playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Expand() is no longer broken, no check necessary. @@ -134,14 +134,14 @@ if(istype(T, /turf/space) && prob(65)) Blob_spawnable = 0 playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Let's give some feedback that we DID try to spawn in space, since players are used to it - for (var/atom/A in T) - if (A.density != 0) // Unless density is 0, don't spawn a blob + for(var/atom/A in T) + if(A.density) // Unless density is 0, don't spawn a blob Blob_spawnable = 0 A.blob_act() //Hit everything - if (T.density != 0) //Check for walls and such dense turfs + if(T.density) //Check for walls and such dense turfs Blob_spawnable = 0 T.blob_act() //Hit the turf - if (Blob_spawnable == 1) + if(Blob_spawnable) var/obj/effect/blob/B = new /obj/effect/blob/normal(src.loc) B.color = a_color B.density = 1 From 6fe6db75be90284c2a3d66bff3f46cec2c40f5ac Mon Sep 17 00:00:00 2001 From: ktccd Date: Sat, 28 Nov 2015 01:57:28 +0100 Subject: [PATCH 33/62] Brings code up to current specs Also removes some of my unneded comments. --- code/game/gamemodes/blob/theblob.dm | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index cec621db36a..157c5760e69 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -42,8 +42,10 @@ /obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 + if(height==0) + return 1 + if(istype(mover) && mover.checkpass(PASSBLOB)) + return 1 return 0 @@ -97,7 +99,8 @@ var/list/dirs = list(1,2,4,8) dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us for(var/i = 1 to 4) - if(!dirs.len) break + if(!dirs.len) + break var/dirn = pick(dirs) dirs.Remove(dirn) var/turf/T = get_step(src, dirn) @@ -124,18 +127,18 @@ var/dirn = pick(dirs) dirs.Remove(dirn) T = get_step(src, dirn) - if(!(locate(/obj/effect/blob) in T)) break - else T = null - - if(!T) return 0 - //We can keep the above code in this proc, it probably works fine? - //new blob code with less BS: + if(!(locate(/obj/effect/blob) in T)) + break + else + T = null + if(!T) + return 0 var/Blob_spawnable = 1 if(istype(T, /turf/space) && prob(65)) Blob_spawnable = 0 playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) //Let's give some feedback that we DID try to spawn in space, since players are used to it for(var/atom/A in T) - if(A.density) // Unless density is 0, don't spawn a blob + if(A.density) //Unless density is 0, don't spawn a blob Blob_spawnable = 0 A.blob_act() //Hit everything if(T.density) //Check for walls and such dense turfs From 1b0bfaaef9bc90dff0d9a2c534feb65b1a97ec7c Mon Sep 17 00:00:00 2001 From: swankcookie Date: Sat, 28 Nov 2015 00:29:54 -0600 Subject: [PATCH 34/62] creates snowman head Signed-off-by: swankcookie --- code/modules/clothing/head/misc.dm | 8 ++++++++ icons/mob/head.dmi | Bin 134924 -> 136107 bytes icons/obj/clothing/hats.dmi | Bin 64740 -> 65106 bytes 3 files changed, 8 insertions(+) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 1e84341c640..c733bde4e74 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -71,6 +71,14 @@ flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE +/obj/item/clothing/head/snowman + name = "Snowman Head" + desc = "A ball of white styrofoam. So festive." + icon_state = "snowman_h" + item_state = "snowman_h" + flags_cover = HEADCOVERSEYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + /obj/item/clothing/head/justice name = "justice hat" desc = "Fight for what's righteous!" diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 181d43bb15912acd80fd583ecd0af88eda6bdd0f..9d0b4605590bba804ad1298721b867b942641fab 100644 GIT binary patch delta 21257 zcmc$_1yodB_%A$2BdrKZ450#|guIl*kbDk z{9O$Qgv9;r3w;koD|d_6cCH?FF3u2$&)2k+MP%%hj$_ z`9prcoS9Q-OYhe+_XIfNYVSv>iuTca@ZXO}vGRnZwz#Pa%cW6#$_-(EJ?5ty@1L%CHZiS7%%HW)y3jHI$8qrP4_a$|GZDpmy`y|n1(cN$^{?lApf_|-dY#MBf0V!6gDQGcz9yz;44FEC^&mKCB%G#baE z|8u@w=4r+6>uN`HJ2KM#Q_}v*09_1!tg>xMzqKwe6Pk~hSF5&S7@&Fcc~?4s_@wW4 zm^s>%dTQsIXl0vdJ6QzhO;^gr0(Z_1x@2p0%Nj;!9`jZ|N?l3@XKt?+*2FjGkD8S2 zA8clQzM0srFa0xd+~O1qt80AuXK`)oCw1&oR10Nn|58hbexdhJ6^atQ=-YWd_Y$KBbUOoo`8(jg&@)+4QIADx`T69zp*Wh)tgNZ))~CmJlauVIKaW2~NY5(a zIEcN{~(W$aEaNeTvK4Cu8rvXS!uHnR+iWwn~N(z9Jl zZ$6K-XhFm-EaP8&bNVF2JfoY#`$$NtVzx!vS2+)`IQq=hZ57%5OrKt|}rKAPK>uf5J|D2Rib6B5z5 zlc|VD$6mF4ZEkZX8mJZ9Zu^nEu=+w!s_?fHW1rK915f5tdMjV6aQfGB9VIF8L{gnU z2n-xvtOYI<1|_P&J`i)Bi&4u`oETl7PU|FoS_rn)kn>JT*HVaAmj< z5%PFYmi6bp6}Y@FsdI>|v2j!9gFL6@4PNnpy{>l9-b;ZjXY$0*vVm^1yjOvb{3g}i z&bv%XxNL%S8=Tg4yV za}OMUk=`TB)5LkZIW07POqqDyL4;&a`U#Kp>q)()*PL3BX0IT(d~-jC=+xhNg%l+( z$B6EozS0*uctl9)+Y<6ZD!Jt z*;}XZQGaD1{k-i!?+4kzqQB02$cB~`A}KJps_(C5?GkpvmjUqainf|kDJ=mzo?dP^3LH*u?D_Yw|SJ)!9I?R9W^hf34E?da<-91?As zS&l+wv3?H-YM*HK=|AD4t@&#GjJnc4XkmDVuzf)3u`CexWi9Y}Gd;!j^_<<|p{EO) z9&>w!Ms#M;IbQB zwZe5?fF9<_4JJBhm5XN5TDHBm-}`*Sw6kZj?*%_p6D^}Uo;a08zYt0 z`Jps}0Z=jB!|?$A7wYGL{MNpPQOP)(5oeQJK_v$5Ydx3dn!_QHuTByOREIv4sXTeo zA-0+L%sIq6HcGdhOJ2yg7xLp1N6&lWl>{92ZFbR!#HotbV7*jXI>mDxgP<&hmGV~v zxnHR*1mGdfMn;Rju2-kOZFpwM{id369>Ji|BEIm4rOXA;KWo?y%G$s{jI1+>(4_S& zM7`M)*Ka;z+N3#PlvB^xzDaWuawX(`>@KxcyS@af+3o^gf6OCu;rDLrfY5dKNYdGd zr7J44Mlp(z7B$0sYCPt;O9kQSx!0+=U9Kzk+wYiqCnjscoTtZL9DcE^xfpIcSwr{k z8=FrbCA0}BY)RP_+^!b$HWToMT$KWy0G9n^$=XbRUq|PwQrm}=zSyY@2ybT)#hWCz8ziy zHYyloodEG@+q`EnfTuPg^LY}#xPNa@Q7^^ri{y}qSOT6Kw^Rx$r8P~0-V8Zc8l}+| zEE;Hye>ojb;zi$W*4}3JeX|C~GG-(DeafNNnJjM-zsV2uVNO|!X!*vCY5GCXvo6u9 zHV!1&p1P#STswnb1oGy5%XHVb@oT<&R$Ei}o^{Sr~Sc(H@<5P#v>MJjm4OnP>%`ad)e{qSUMbLU8J7b5*kuNP$)X|_S`iZaf+c>UVI-p)=4xPg zd6tQyCAa>4+4aF7@z+&MCx0wnva@FgJU109K8e7%&{fAoqi$J;iqG==2`*1<0UCdz zyyp(;B0oA4gL3rsig|eX2OdB48U5&1u|Lkx8e&w?WPaf<7e)9XsYswLur6R@q7>l! z?*2!}aZ1pPzkI2gY6c~)$m@E2F;7Gw%iGMwNapl4C9^1{WQ~*jQxBJfB)!GFrw}tT zc|}FV^t^C(458DCe@gX$EukjavHM{Aqql!`jKEEsIRDIW?b(WW?taiQ1b)F6l5|d) z9SMKAVj`L^Y!%o!T<<=14+_R$QojJKD^CW-KX~4Y%^AtsfT6rzJW3!(7e|kfU40jP zIIA&+dMI_a?9-P`T5}KcwhQ+`4!Lfh(esF*yZ=z{9O}x7=Qd?=iFf08iDU*=FOuZm zVG|`P_ch1P#X4nE7)V#M+BDM}$Lgj2Vp3I0ue=jgF<2tbBi8xXSgPXi;R1(f`X48+L{5YNn>1$oj=z3b8G17{=VXU z)>#8-|0&ZM7tEy0LpcAr0M22i|EP%{vVdH2_VSX6BOv>i{!EI5{hx=5zmNWR69fN? zUB6@q{4F!DWw+O2YdtB}SXNsd6#4hnGg~bV`RU(~L%&d&qC6BzUY?L=xBEeBa*Cw& zY$kE<9gjMavy`ehzgF+z{{k4 zLCkv;2xo7h>E8n?Yhf-MfN(7$?*LeU3Op5w?!&NynuLJX2~9 zB+7D9fqgBDZh_rII)2&zZZg5-V}b9R!!>2$2j*~KUoLaF7Y_kEvl~9?95>XngN1&m z#F|fcQ@kR*V(x!yVmgk{pzt+yaFTxsdlmODkt%cJALNUQ6-}6~N%%)J4nb!CSS-e1 z@ysT^#bpHAmG-n3F4JVi<3(Z6hrDUNfBBl;_D2&yM4+)m7YgRpFY~I~?5nTfvIb{R zmT446LCx1(ZwB@S-oEqX{FL-WJzI^?HDD&=fZJ?~g1rDIx}-6P`o86Dz_jT%&&%s$ zHR(1LHwl4QU-a=ewY=;IXd;0FJCCSyb0J9t#y1|TZW30WBX@R(m@&xyT@8lh^w`#8 z4iP*?(vx^4{Qo(){rzo?)S$$0uXU^mWtsI;@uj_~mHg`(M{8${aG zw99(Y=w9IL4>2>v+gYYw+UKLE~sP zWe#uc1T2hP{=W5v9Fq!SaF#oMcK2k|lkpDtA31M3&c0~?hCGE{L|@@Z+l6muQ=bK) zYD+tS20)*$?z<39)bEf@MVEemicEq5}Fa+qHdb2R=({rhac}A z+f^LHK?&BmvCqbn+L%uOaDi)&5eBmvQ6(?fz05k=Y;=ptwVgewJSQfQ={%pGOIGEd zPo^er`8}1E?ij7)7+a^>-TZ1d@?zFfuo6!Y=L|fMA^uiBdOu+I5P9!(GgftI$~=aU z7Jw8;1TB~Nw`&j%TL+GPwIzc+eR1^DQpqW*WYmm}Mmr&z4Q_k7qPF(xUB@eXnC5KT z?vN4R1I=R>A1+9LybrZ#wG+4*e&D!;-Oh!liwzl)2p4{(w>Ga#<8Mch)*^HVAROWf z$zQHn*UDdgWohqM{w8A#GgbpqGa?;@X)K1oWk$(H(A#^!)`Af%gUfr9dz~ZyCx17Fr6|sff zZEel*pVPnHzI$7h3OX_}ny|RIK;^{okD^}3~2mZUI1M) zkL{;C@_x!!*#=xn1S+W(^pQI_vBnl~gzqiHdpV)s9-Qm9^%OJ1 zYoVmywSPp=_Q~i1w34)B+oR};c_bMepPwI`nEM1rw!H!`t%SnmdTT|rsatW!FUskY zen*sXQ03iIWw87hww2B4Zh4b0@56jq{~DFiDEd;sf%4KgEc|UEW^jL7G8V0? zx9^CQJblvU?R$~S66j>GnNJy86jrU=@yL)Ia23=u!9Io~7QFdrC|o)|CkFH;x|4_n z$c`}iSmD+F)~BGg8XukI>saCZ@QY8wFv*1WU2{qpI5S-h7q}wHc$TtHZcSM(56zp{ zlaVcEQ^Zz>)ADTj+qb@}v2LC*6MeS`U3M;Y2x#}$PHN3pNbd0RlIs@h7}@}p(;q&5 zFxcfi$r5|n8lp0FN9Mui}8Ho)^M)E9V~TdV_KQd zO;1j2yzsuS&mHC|X&V$8nbg&`BAlF(4cL3Y;UZi4+U6eO=DUV2sO1{K4`{O zV9P}2SwFnD)I}8kV~c^mEe;JY?_fxI!u5JjohMJqom7H6Rq4yyLPeQOYf}le3sF`_ z;W#n(bKyq(vjyD9RnGWdd^DTH@d#YUmD|U?9VgALQ%kZ>;x9nEy1N(n!rFiOKW#K< z?^6dzipMEZ2kusv_1af2gD=1&Xa-SLQ_Gta16rKDNpm?_W&HH*rMdq03}E1tp3frB zNZB!?>R!NT(JMB(nNf++P9DDTv*a1|AYnP}mQuNq-0+a01eaAdN-wI4)_|t2Ro%~Z zw_%`kh`!87(T)PkyT?SJ=7-C;7=46-qLTfy=BJr8o^Z|aKdcCH7dY%lfpP?sp#4k?pcOx>#owXgj0G;uPN!{NiGnaY|QEXXXsqnrm5TPT8fq z`653peQ{G`d3+s+p)Bf%n4KZCoeS^D>=M4Fcxf)&YhW&$KxGZAIU(Wt?K^kuNX>aa zb}WAQKs)6qnlxKda-X-_!onieueqY4;&OKB6)Fuo`819{lAI^Rwft!BiQ(#2_u02 zKZ1_`D&_$Gj|D%ElK&2}8U#I{Qc6N)e3Er-?HH#V89KV*u-MDs3R~okW(S@E2v+Nv z`O>3t%(M7$5*MG+c~T9nUJ@i3k+QfR(dm_j$C>Agjn{9IE|s`A`w#r8r{d_x>HUrn zSa^Yq7ELz7Z$(Kupb%&Kyqj2r>*Hu$;B3qB`F5Xk$6PAstmp1r)?f(+Qtl{PHHknw zsq6zTMFNdfQR^`->)!Uofb+!z{fipTYMRHfEM?8O`NmV#eL!QpHgnj99N`SQWz1Ok zxbps|3GxMfFbrv`XaSX&7Z|SyHp)~>qezijsHl6B16U(E(lzTze4GuDcWQGu z|0&U`5ksJ`E>bdwxDutzny3v`SieWMN7`wWQ~I_aFL%5*Om%i=)kofynXS?H`$(g* z7>fXZ$ERum`|StQKU;t1Xr3VMRpDmD*q(D{U(-zfM7^?mjF94J!cVpwCV%&yz4tWr zm#JZ`a~~ZgR18p4#fAyLN+@6>U=k76Hcaw7c^#_Eoyo(^I!aV)KF=J-yEII$DyLhN zmx0un!5EVseK6F1AVp@-7!Wm5tj9z_u_L&kj<5`sG=VeQq$ZFieY2UfT~pJx`#AMSjrlIOVFF-6XRaz2H1KfXZD|eelaq+b zK==WBC-Vv3X5oT@OPP9dVt1jL5okQ0(H(bjgFMVZ_VxZg;fha|P&G`tQG1nn+e=LX zk~+L^Wo2tD&Ut~c-KKDevjEOH?NBjrQfJgjV48yP6L<7a!s9(pwC?jL|yKCnw zj*l7peM*qe4qVBW`7iXbox>V{WT&3_(Hd7zf7Mke0GXbp>E(gJ8qxKmgJ@ zL>jwNSNd3=Y{Ur7!A0c87*Jpt%HDOb5)li_$^2Co2F+IZfH_dm>kBub%c{HRw}J$E z8WzW=^Erz~itXUL4iv^`XmiII<(@^&uD<3oe6_}NeS*!~mz_u9q zAdrVk!>;ihPAt{^Zlh>A?7a^f0!L&Et3kZoOi;xJ2K+zO;xFka%DmuXb%Xy+`4x~> zdkcTQLMX7{bxwP{Ll@bJ4zNcD0f67)4^uo6F~80C(G>6y!@=PypS6+VID)h-*V$c# zUmPtI#TnulUL%`apD#B8K<3gCc@%w;!Ht=9_kR$5j${hBk3Zn1LKn$y-Bhu}G(%qfbt@zh0oWOoVP`ZT zyhIAQ-yjUxG}WN}XJ$A0Gj=uiqq2dCm&ZMGsx}Y!C@9np6}q7WkkKwuGqdRAnT2w^ z7y~$!p7@T#{#4WIx&RO(_+H^GcDEK<$m-)%GCThz->#YrA)^vC8%Flm+#a0oqqZ-& z3q`XJx96w4#lk1T2vPamKA2BFsH%u8&n2I%eLh*^m5iG&8Dq!O@6Qkk1OLXMmtiR3 z*QJg`_|w*BwKIYx=!coim%mf=X{5`@(v8wN$$c(!@&iy9;6{HHK-cDK***;#$1VS{ zNDkc=T5mz=pZ$5@}xzVih%VDarGG0*)HS-(~N z`^^FS`DzFz{#+_GIP!c`iJUOr%~5i}|MWV*29mN24SW>E741oyI8>GGoVvWb|KzT4 zICR=z+IYPCb9eTuCDtU8!nmj+8VJu2q~V7cF6a;CWX4fdmOBHH*jVqWH<&Ik8(;HC z3OKBi(C~MB_b#ST(_!FCGHvc4k=D6V(2r?d8q;f?J_k8Kny>}55WR@X4;kxL(gZSU zJFS&z99Ba5=~L%d*QK16qM3-LZ`tdld4ioTf|3^+3k&q35is?nhp_qMI(qZhkaPt# zS!xCfi2GmZa(v$2h!nc`g&4e9A@-sKcW}gxa-(~TqEHC9@!`-!WVt~sK&q0GtT(tE zgKwgLZz?7$VGz^*Fw?Ba0fd%-t7}6yWN_fG3^^oJ;^ zDi4j{`n1DGpKctUK~=4fmVU&CkmtdJQS98AgB#>KX2bup&8rDsOh`E>VQ9mXzj#Lx zdeG(}&J}h9??AJ9{H`{QZE7(`j_IY#{~w+uME`I`#^^5qlq9StQvl9JLVf1s3S>=M zobt|{>C4K@cQhMPI>5BWpm!GcP=c7$B27ZVRM;eGASiR_#cKZ<>>GeJ{PK?hzN_%q zABapapS_Bf+zzPqj5-pTO!ZLj{~dyfidio8K3REpXDM=HnBXQXDW@uvjHCGqEv$ra z2RM1vgc=NZn*OMLB|oD8HDq(KpCYESu_@4XXnOEVMe&%TZK0W4EA>-R*~yfMtOw)U z0pdV~%|dZHfBKGyaI@_RC!dqBaAZh!mnrPH~)6KFvFtL&YCG3>>&$DX4^PIo#}^X(N@nRjvNi@oAV0k(|(1 zr>J_89^A}|XX+!g)@&|}j9w1k)J3aE1&fBQKiS%$ss1c<@j(b@QP!d$ccbcXGJ-w! zyMX4aN=cgnmi{B3U2sScI!19sl3~^d?uV$6eKc6ZtxFY}ikaCX!(W01qYDkhwKx{^ zp|=%iTc>LZ{eym6q{DZgog;*Zv^r>3hSK6d_(q5=H06!#Qzx2Q*cmTNe#KZz6qzwJ|`ODg&plT@s{mw~6?OA0m$H40055la-5_kXx zFZTlm!kBam%~v5dJQi%zF~Ein#z+H&rUF5NS&oL5M})Z&+SY*u z9$CtjuytPUxQ4N@j6F`ii(h>pqiDe!i17B)NrCg;FIaf#GV3{BZ^qw$V;H?YXj%*>kXLkizV%p~ z21E0${ZGI>ZL!|M#c56`!duSK-iuG0|qK`^S&9>xXe29-Yb^ZGGKt% z042zE%DdlKpJEej?4(g=llvhP>-LhDG*3W|N?}G>%>5T#$195%Bv6iICsuzMvZ8xi!QA7fv481ar=&JnV-3W2ag zo+!$_*ki+YbcSXgkv|Dg!zNCqLteMI;Rz*>W~#Z^y%3c9#@Yqwmlse zseXUhz%@&gu;TH|xL9V&Irf&b)cM@(UN^qJHe`_d_SpjzyvYGJ;pmA+e<^KE^xkFE z1rBG+HynzEW&2+k`@a-2@wOb$&8#^>pQM+qQk~gL(Ink%x1q`GzlbkSk9(=+5qf zzz$^4?zEWn754YoV^W0Elb7~ihzYawOLg_dVnUp%skV_C#6-s7?*3Ri0gF=I*3b~s zSVVD+C~iSk`j?&p4HkGruLf|uh{nQ7@m%n!JIBY2{#XfQ+?7{baQtxTlGosAPWc}S za%6Z7p5bb^{HAnWmcV7;$03T7n=s{BdoD0fcwZu zfL<9#{8eI#DTEztM)}|lNkb<{zY5C0aHwgW>$J-V+AA;P-XkmJkizbR=s zAGy3EyarSwnLvH+D#&H%TT;pzT^Q}px%DF2(B*4(@;s6S-!(IWuJv3HJy*DsW6Uos zO>Ii-u}zZzZCfTtWw#)S)JsV$D~T?`-!m$nOJTQ1$GfvIFDzG;0YU6@tD99bW( zz*9Ge`8}`jzbB@)B3LJJ4vN0XzVLglLo=Yk3ibyyS1H1B$4kolCgyb>Sj{S5bw@No z-5%bhY&L74rOtOI`KlM*=AUfxz{7BMr-v7UK05-R7z{WfWiEV{sm`!YlyWn#&_LGA z0iq)T6+vq8$I73MO+;3eY=ky|rK<}XxAd8SRA_boJQvj{L}VAW6fxYOQNu%bH-nlh zN{FcbLkCUZeh%5eTbf+2LT-dTBIwvkzmS(En(ueNb z3jtA&X50@Kg|~R$=l;`9`cf`_l8EPqo+~bG%e4%f{<4aUqEXxM3cytC^>5ca-&5xe zBm!Qu*K6KP%a#_H{ng{?dEYg8fUeYcMd*&yBLZRrJM>VHyc0H_t6Ni7mmfr6&K6(^ z8$IH`e_OTtNUjg!>2PX3tG;+mle6QSl#RTKhPC^n+WpO&F4|i(^+Jl96MZy7NksPB zU5n0&N+-(B3v?H&z#!tPQwQ@t7EaGF4K=9031%W@XD~Y%d|D=&d{SgjB){Ynd6COn z>4-$vzQb~codPq%Qmebo`GRg{9cUNz2S0X}((=XtAE)qZq!+WM7H=_0@4hz3-nP-4I2dJD>+%HH^ zW>}WwdiDq-5}b`gG)kS)oKJCQy!5uq=e=FG!=pVlPlf{4XA6d(rE zqd{A?y;nlajg;o7^Bs#g!5@7d@92pUc)MDQo)X^-#!MYT9r*5 zi6JZ!udiEKafgMm4}iIUdD{O3jrJlhOn*l!boHjd+`UE~&SW_xJ+{#7r6F0CD(#|4soLXkiM9-Ir*NM*vYF4a}q3af5;G zeczA~2}HlP`qpOsE1Qtc?#Dc=l3ucb85uQY4K+7x2EQi0rY&NFc5U z5_N-AZF0tQGF~HEcS^u@7pVza*_T{FW;+D_#TX#f+>Eb#v2_V7Ba|P^s&=Xp5kwT}u8RCj1?$eX7UO0+WKm_bE$B}R1K`0VZ$9b&YR3~Wo&&&k(Pk~2e zZwi?pf`S{W;C{VY=tK#-8v|WW4(Op9sC8xswO3h&jmRV*$|$KLdwTl@t#1+nVnLzlZ3kU%AG z5_ar1dHWWjtou@T@EK6a`Zut42|a9gJLnx!^bQe|^Yu$sWaKxe> z{N)_2Lo}dB*!~%{)0iL)98A0Nt3rX)X>*RZb=7Uy$<>?otyT&lW1_@C<0H3cXydf( zaUlxoEzUf=1g=E{2cALOfS+l-d^xcZ2ZdaUhDARx?j89wYepKp$@z9t@`_RpggEAE z#-B$oDSPR9>3Ir;vvVpccP+`TQStN@d!G9km^`4iTwpJ0!F_=i%lMUOfhdZGfd7Ed zoAw9oU9bbkXN~zuEo%jZ(#1>)A9SEHYc-{8#if6Qnjq@Kq{`4AxY!@5dNFUnU!I-9+ zFZXNXia}R=()6f9_tUBs0zYbu`G+hVia8Vmr(H1Q!1uuOysp9Ig+EpV=9rfk0}4&D z7bpyM$+lT5u-$M6fOR}ygAYU%kOE!XpL~LAckuN#Lk<2$#sWo`ZwTIq*5eshbFUVf z4(;Mh6WpirOrs~c4~Z<$Sx~@&j8h(NVyzfe)4Qoai}lw+jZZ_Vq z7^XX#RE~2aV-n=(epC^B5U1$?ycyre7lga=fVNfMI*94AUyvI_*rQwj*{l5ni_1<| zUS(Hb@-?s$syJ}v@EfRj|4Tn2)%d6;5|zGmxbKJ!{{tmA z56*FzkD$(@;gTgiQ+Q=l(JH|Ff{KF-Vl&I1My*ImtBtUTpeE!0Zn2-@E&&N3G9xsb z^<6Vkca3Ldm5hWzNCHoGXGC81(*xO8ivOr-L#{*61p#zQ{F$H&L#onnc|6XL3RbAuq>nO@jF$1%LOS)94SQtsdL`p{Jl0XuI?@5elgCz)=&W#SIGR-U5-uS zg)E?Kn~%uFI)@+Cpn;ZIwc`&%X z`1pdmb$SN-%{n-;2ylT9xD{^tBk(y8@$(-hsVj$X*RMH~We|LH8Ql{Txu*ES-`B2Q z?V109*$fUQIGjZywDJ4vXK-hQHIE$u_+|^d%dfGgv|6a6tt}(_x8t~s-CNYFIoLB`DL-s?@n88P8)d^BI3w`)6=r57%bXa$7XkofVCR2#;@*OE98pJBL- zxwZ)SiQn8zoSm0RH>qdEqg}t3VWd z#q8i(^FP^%I_8>ohHAh*#;DPsQxsnY5K%2P;0kXXZ;oCfI-APh%_R)CKb_;TKt@v- z)L}lN5jHWgjMG@4*9D%9^Md4hyZB+M3^ZQfFluIFfei|X%=w(u*Urb`-CaoEr4zhf zH9oJfEcc97kAcWIwt@D`FbvFXu1IK1esN#N>wjtZRfxM%nB5YlREqDHTBnRN@RkY!8Pr}P znGS(~J{v}-4$?Wvl z05*Ac4r_ib>Gf6LYT9q{YFr$?hlA1JzkVm+N%j$E?!*V$|7P$B5jwJ;<$Fi);A6R` zn0UwjuMZa?~OdZ9j!hm{k-yX}iKSKkFjH7U^*Xf{%M_$RHksAZOnDu#5`G->H7qfC0cIyFM z8|I|asjb69z3Sq9W96_F5zk>b+yn?P;J*RE~L@u3S^)yRe!Ojuh!!vbN{F46iW z1yLJU*|)Y~r`=VLmmeY166fZ zT4-}B^0wh+?Il!DIPL8^oCv8mRXbY{Qfl-%iqCCav;buE7Yx?#mr}@e&-i*gQo>tE zG>$FCo4>wu^<=O!92#!7Qc>6lm(g^CiTak?JRsZ5+{ zd!+gI7`b|iSch1$jv0+k|D&hRtKgjvTmzV+Zv{k_%`Uv5=!^>=hfTm4?{O9X`WUZc z>-Hio*i8%iX_y3sv>BY>sPv_E-n#iVZKL6_7>cr)ztZ;u(ANf!o*X(nEj_HwOhh#7 zHJ|cZb;Vqs+Xz44sX*eLbN!)y&X2&O9732Pq*~$j!_gJgtxSjen(<+Yr)Y&^N?I4; z?PgqWw9F9uxzF9~ZHW99QJ#wTSUiM%VwCXfJ>Fd z#?=^4O$$g9cFsCp{3xTOsJ10gw9=uXKSzE3yX`G7?r#;~zW$W$_VKI@q%L5j@$I`{ zL4@s;gS+60+f_y2%8t{GE*Gsb|N2h806gGnN^^gR_Vj1IDmYH(rZCynO%h)_33*A+ zP*5i?@CZvP4+Gcw$ezHBsbFI>!H74Ha{wehsilf7D=SOfZJFrv0-%;Ui=Q;?NH`eh zYkGwj_##A8JGHY6;J2;cR;i^0M!gDBFlen0GGu>C5;^$>@%StYc=TsGBqLZ}@*DF0 zdi8ck+(L7^>sdU}A`MR49(kRv$g!*l+o`owr)11HCSr^2(Nzr}byb2djsA2dg>t+UIjj!BsyF6!uMFzxk4mL#t>Np#c|0loyAu zC9a#?Bl~jGCHQvme8g|_oOiy(8Y2RxzODG*{`i>9Ja_V!4Y{Q zK%7NZmN7aqO2i3oiW$L(-VE4i{?(j1vYtZvbQ&Lr-&K-&q08?LI#VjCl(6IUh2j!5 z9tFkFub25cimSWHpBGqtEbESCXtr*7AadFdwV$8{%hxoFiVhS)om!2t1l3RHumAx9zhkV13wBXSU z#tynz&st+ROHol*-VqK8G25)xUHViV?@&MzJ|}VV^HZm!r0_`SWhW#h z0bDZtCg_v(O$_*bz+D+p`OT>c!r%sviO;dDl7GE1+q1Jz153710nH_%M5LZUjY^i1 z{YAxM=Djbh#v*SgdFDL6UH>c(%n6<45UxYz4Nwu38rtawxa*e-6@4o{)JZa+wT2a@ zVi$p{F7{N8QE9Kl8wJ^XhJ}F(2!x)th4Ma6WSbC#v>r?6K?1>&9rlv-)tDl%oTNdd zbnBti6N7_AspIl+JBwc(x578Yj0N&&F8Oo0%#TrwQsNpIbTOE#fH&^Gy>l>hn!UEH zR*i$#qqT`}XC@`!(ut7ylnm>}>6t>4xg`?w;-~Fv*)LSFA*u9iS=Dmy3 z#$-{c=ih*si5{BAqHoc;IjZPwJ>cg{-*5-=rqVhx2s>Ah^IlR@3Fdjey3*^{4@;yw zgzOdRy>_3to!!*RxWa_5E2?(-p`AJaG_>moX>Bce5AlT3UQwcQW%p2gzpgpzXpr0InXbb=u< zimJBJ3ynYJ&dTqkyqTWsachoB?{Q2QNMtb^3q3I2Q~xTXzp!?SceCK{2Bm<*1HhXe zEH+tpn@->m2SrB5tgq?2sfjGkzVYC2q=Fp3pI<)l=l)G$*In^ItG9x%ZA$y?HONsH zbnzTfgT}dx=zL13zS^RsxgPGhD-R#WVK>e@Les+^f*PRr1BU`F6Vt|b89_nKRANrd zU&&AOo@sM(anUg_z zp$Z1Zw!_6+*Qql|4BhBJs>8l41xVoU-57w40mY>5 z84ZN&yMcw@=&0P-{mqb7G{0rO@CBJ0h*5Pb9j;*keB)f2{zptn&mTzOox-7I@b=q2 zzE4c4KJ*`w%gzpmm-t+FWXr+uftqL~r$g_rMtl?t5V((@`Ew3~=${PuRY3`>pes!- zPcCkK?t~w%or*1w6+Um@ZhUTFK%P2at%~jKRehnW%L#*-UcICEh$(|I0Ro`}gf9;h zy!mtc&(TqJ!*@$dYaS42CV=SQzhP-@eW@$KogPU+6EbeE^zxaw)3CvLscb>Mmuie{#&b$lUhrN# zn?!=j<42h^?+mnU$WaUO`pX4A-4*@)CfV7}n^3)r43zR&Y}p8fkhGY2@iK4|v4t>LyL z$Fe21QRRB&;pFRL+T7-SP&47W*s$A!c{8Zd!6Jn7%A#N>A31TE8KB^!zM+S#0H0aV zr4?#gGMZ_l?=;L^A|-ucUftup%CZQTMMt!0)5qa5lWm4d(ZUwO011@+P>d2D9U^B| z_LthnH)vlxw|mM<{>G)O5HX6Afp_>1YsYC%Z!pDG*lA_Q-vX~;$WQ^(iXYZ_$N z3xu0rI%R)i8KDw^e-)6-)oPBz-BG|M?#O;}xY9M1qUXgLs(kaf_=XY>$wzg^^kt)KX(!pqckA0sbBSeE8rRrml{gn2AH4l~y7o%?NX{1r{}smn83SCPIo5yA5W$HY*@XavR9F0z*d9U%GP)WNz8hm=7Uc{7F5xuF)w0Gz(cdn%L zP|8M>)g}I^0h>P8a8+Jj9Jx2jfFIM7&z>u6b_w@@-9n=`g20vGE9OOCmTn@k#Lr7+ z881_}I}9i8&)v1Gu9L^q9IB-pCISZ8>>OCi^V&1wFH(symxtzco^LN}0>gDluxLs1 zxBT=FI=^6T=BFv=hUh#o2Zz{M6a6wj?6TQQ0E3ZuwMglwPT~cuptz*ZsVi?qb;Hg9 z82&PYyj28AO#^0L&k!KVbQ;_$;m}o!N&4$y{=>g6Z#m8p6nQwoaXiXOJn_-~|!@ckim;eOadkKtgO zB6i1Km_Ds`I3t1M=`bP7wC%(2zI1Arz)S1Kk5);mtb3q4$a`pJu~iIM3IvXwx^qD% znIz&^Sracae3>2FxJ`+<{@V)n)S8gGnc&d5V53W>EEXXda0H7IX~}s%mB(Z+DOMz! zO7p(UOl0g7U6`(&m8Mp;JA=P;0ZXp@AW+_W3%tP?&hE#%wi>GmHX-1*!8E~k2`0*T z0m0FeX)!GP)ZRtc`;MVbj?^>=zNuNnh0_(P_sQE$utTYD7y>Ru5Xcsc?Z&FWI6*dd zky65keL3?peBbz**<}Z`yL(@-=m9*wX{w$Pw$M|6m#I*VOSpRVR61p5)}m{1KN<51 zVbJ(hWEgjo*l_%NudD$i$larG~AgCR=V{Z3y z!zk+_t49WnM)wDRgPxHQ7R`6@t!{A|h9i#hFFN+#ttyYsSL!X_edVrU-cUt$3Ee=B zKAe~zm)9xt_)VXtE%lti>*=*OSd4_F(Bbf50=J&%-G@8h zt3>B=nWP$O*>tUtW!uR#SRqs)7C?L=lO09bkqTgb-KoQD0Y@l-KFy>)SSz>5=tm!7 zfrTyh@9ZLJA~fPgTV!*3A*XWp$D*!#$DbnN@h{pQ9?kuaUo(W{lIkUqNaVG&v=__# zMR|4gp|OP>3re^Bh2el((eU8)yIb#TocZ0{=UA^8PNtqwr8n2+FHlVbiTHCf$BVwa z?F$1AoU1Y^xDpCG{Zd=>%wgyJZO$pZUK#W`n;2Hn8DmCFls-4J8Tf)LT%57|H-+OdqM8{BnG*0P=k57J${dr5ySP1D9N#MoDnGL-6#gBZXeAK_ZF@j5W zy#=s2h}R>7b?1P#FGi`g`XT=M8ab%hB=8WxV?^`qYPH3W;_5}qFB-Hrx<`ro8Jmjl zw1E8KDXYI^!n#?iS4ZRjXmdrShh=JgjwoC5)O+2O!_b?b%5vYST#zNERZN`rCkPcZ zIQ*?E{`@HH$+W1*8QL{@(~V!>J{FV_%){3}Q@kLe31=$CMdYW-%SIUy$xvTaBimpQ z|LA4`uXe@ww`6GW%E$bVZ8cVuW$)ZUCcoOCBdKQ$YQ;aVC>E@flF8K20Xg<+Rl!hg zMRnflQgHLbp_^S@$G~1LsIFGrT!YxGV`9zYg8KVFAm+rAa^K_n8OMG-wMVI1YuC$m z+A$gd84oO*%>@Z76a(_mO}nZ@|ITE^83ql1_-ct6; zyx9RP`P~stQDJcr@$%wCt)!ygTi+XdqEu5BE}x1H@Wwf@W)y#t)4EulU4qJ!@3wg1 z-lHKeI4JgXf3*aF84#4>mNPmlO~EZX@_1E1q;#yr1xHx5{iJ* zdkYYXNC{O4gw%WR`9IJ5es|rq?)vWf-gUE9PQp2R_RQ=(dw#QjGohq_HZFrUfdk;D zrG`Ktzv)HUArNYNe`9km4Tl$Yp3cv_oIRdGAby|IE$)3lNS{^OCDPpscq8wV>g7M9 zE1a&!=njNYU$i}Q9ZqLh(g<&*dFk%{?Jb{Dz@NbYe(lgUid<+KGMKb-U^7qvgTa(* z9AmRyx+vpo0|Jw~K2^PR2@WPezA;8z>lYaRY9Z;nzB{w5iD{{KnLk;nv~2mKnyb9*KCD?m^?Q z(8}oX&O+C})ZupCHDiUZmGWDyKy*`u(DBn^pL$>W;-NfW`?tqRagqKF1!YeB)X0kq z$5%MY7n($(Rd*hK=;VLMLZ0>mI5$RXY^ScZpjya1NWfzr&5RVibUE6!7CN}0*Iqrl z-q4c1YGb%KF3P4>k0w8B(9q|T>Hwj0ur>O{^}~nfRVa5*X_7v|p+lYp6Kfj@SeWm_qGJ|``2wOTQ-;6slBRprcrTV3K!pdCF*ySs+7oF=0 z9*GVg>G3eIBAzg}%iWmSqWtkeNqm^)-pkx)m$=uqw>-Pa%R1iYASifu8L}*2eUwNh zCDoFJ;Y2Af@!syCx+zyvb1n)%M57lU-}Uem>3aC=AnL)rx3(xzEB2Sef3#ynS6WpgRDLxY4C1&+;#GJhvkg9 zH`drGkKC!%-4)3ak=RzV$?eIY+=rJVn+@wPllRy@AZ)9)d9T{uY1M}K0~hkoYSb`Z z@1e*BhJNfUUK09p#Q3(9`TZnA(RL0a?|rBZoquYeJbCt>;i!R{WR+B~!dcm~;ILr) z+{#rR24{=1dhJ@McxT3J*;gW3mAocc__(#ISEC*RFr-JrMZPIr$CpfMz)afVD* zNq9|%=Jz|*6pGUPKiV0pOY8z0+n3JfDvPaGOmH?HT*~tLVP&(|8>=A@7E8vt_0EFP zboEnAkkX|#EW%GV#VrLe^}M!b5Q8}HZGcikc=>s zdfsan)w%v?cLrU4q0uIOrZ`V(B!KSx6^IjyKZnNy zrVI+Wb$M!i>Cwd`akG+qiINHNf(xIxZbi{LPFW|V@a`FoNhQ)X8eI0c{kxyNw1Vd` zRdaz#s2HsfUp}3m-s1;KM(ukgj+A~&EiRgn!!Mq)+A2D;6K`avBDi9J-x;Adk{|0J zj<4x2EiRv(6MzcRG3=+Ph@4p4o%hd}QxTIXL5Bai(%yQnJ}@Bp;POZ;LOC@wG3+kl zMop%gtm?o(k|@V@JRkK!F)NfPY(whNoN9DB+_hap&V5LNxlr{p)c*-A2b%tv(3c zOV3gy>(UG1Grgk*b<%!VURl}J@5YaC;&C&Zd8{lc`;fUQw%sRyY*}hGui^V|J^FL? zEzMHlaW+|%=v7Sxdjef#S-^hsHV40(+`UvDM;u*?-84;ZT1i|8VC|ABIC`ifQfe1h zuMU%XsX1aB@U-e;n?JF)=sGOp$~CPAEcbuH^J#C~v|y=bVN|KJHX6R{+SPuW{&vA# z?HUYugtBK-NQpA{Ox>LZ!9z}aPFNq8A`O;CKyL2-#J$|`FVqcRsL9mZfq?ke#e*ao;swbNy6iT7kuX2i;pR&& z9QUTiM@vh`%S>wA%O(c4{zxI}Zc0d4mU&qE)ZCEKb#1Yi8P$1ltIqIw3zgq$FfXOO z3R&I(&Q3O3Dmt{ef9*y75;{G5_(Z+BP`k>c0Ay?pbm?z>*Pe0e49W3_)nJ1*+B zsO?gFvi!HEx7gX+~IL)-jR5|TCow%g_Yy3EOpEMQr!TjJPuxN>9ac+&ZN11*_^S)%45Douk zoeW=V@zE?dB;iBqYvsw-r1^x`BkgbstU2zYaNSY!pOWy6Mmuj8{V~yX)ZNZVE?`M&Is}+lKR}H8`H;+kAIJDe@e3>uwP*}DYLZ+ zN{R6>?5%ATy&^}nBt@>j;$k|Yz*AhI5ZGm7))$n*4^Me%W!iW`{=Agmv*@}7%o3in zUKYf?ndek`cGDuN_WP78YkBQGbnn%^?ncY*CAXyqf$6CsTewe4b>2|tc-ZoBP35eH zMn)SeuNyX7gVm}1a@+V^dm^z6kq}lX2!#7`4n6$fvARwW{9fUig za)hKQPv=_2tAFGPV6?WxU69B4wxOlUwUDhrRWEQ2>ueKbLPB|d+p>^rlmZtoUOYBb zXC{Q!@3;2PI@Xf?p!z23Xq&G1vVSyBH}2w}S;6urx4gF#Oe}%niiISTV{SK^`vF)j z+n+yYRn!*m#zm1+p--k{6oBsZ3&jE`W1fH%s}W$+U9v{Jb6}cY& z-u-;9@IQW%B9c}pbG}`wRm0%5yer-EM&DGq5JmM1pjcwYbHFNcVyz>Rp5yAn#+y5N zx@(-8R{c+33ttKHw<$Z^2&&s_O)yz|{3)#o7oefg_`{0YTIoR*Vw;Yw?P-HJMMcJ3 zVFN`F@WZ@+=fzt%#~V@?@zH4`=2tvQjJ#&59eSBy_%BofeV-&)Ct1MjSXewX7}M@h z*3^USW{v><*8FU#Bl2}ZB$@WgU;PFgHHhUiuls}dB9zxK0Y5P|TTDdTAGbJ6jJ+Vs zgY}-E_&?=5Md>M+!L~m;AzVE#(kP-7;AIkgM}EJl5i_@2RHpH-*QEtb8vcL2YrxI! z^*@EM{Obk0dvaDK=3lQLsOykZ*PgyAdLR-1+-~NhVE)(5i+}w8PYVP8A5|x@huAj{ zKXhJied0JJ(^Oti7y3^p#;iOc@AuVS2$fm|Y_}o&Y;M+|P>7MMK8;0W5yG|qh^-&D zh3U$AnF5{EkRN?RBa^5pO=a(e<;nB@_k)5IX1f@p^JE{mM#p{YmWI4tE3bW{9^7l{ z>~5}I^;E-F`8;HeN z^uP{KgX#mPmr0o>(m=Un4TIxUPlx{IWDB%q z1I2sX;XCJOT)r8L@3$KzXU=o~T)$xW`K(GXguHEkZtASc#*YeHhAN#ITEHz*IuGsJ z(B`{rZTysz3NlKbP}Udpk$cFD406tie7}ze1^3tqUm7cpn6h~kdXDi+_){zCkcU4` zC@R~?S53ziccWLxAf%rXZAvsuWC3s%l3L{+D;34lZs8#Rm7Tr&J>RBS-^sFK=$3K+ z)$bQL%SWN3P!%BgsTE&HP(lMKrG>nrgHB#OoEl28f2E$WPElG)yzBarQxzTb_Q;8x}Ob5_@` z#KVV_)SBcS&THE(pTn~f> za=$*NyV5!x*Q>8}2Y%GkYm;Q>;K|g?Cq)jnou7>fiXg|QQZDlCGps{H1q4UQAnN7e zK246glp$VAtAgak?^sPjJ_jk^qM1)LKS6ok#U8tSXX|gvz4}(d7C`@uo==U^+x+v5 zyv@L_o7)dFRIx<7JhsO{`525D{$dEr%LzEzwfyr>g2&|1n&|1Zpn*xn3=+%Ud zd-22c1321du9$+y1AEx;^}S1U=RW?8W3U1}!p_N-jEAthqrW`vJcM9*or10vm`kVP ze&k4^`0WN{i~=M_cfcP9In>$?O)5Ex`4x+UW0Sw7$IOyCmoT~TR_qPG4x%I&tRIOo zuDBQPQz?$cDz#kvi3P5mOspos z@;U~Hi>RB)P84jb=Ih+Egyb-;WRHgAS*CHnXE>=TPkJ^2_rf#C*rkl{dvCZKU@xjj zKkv>F?;ib@?%D{EY2@7-zIFurxzxSATkROa%p-7j)w#wpi|YD~38m>kbC)2Oxkf_D zYY%DQv{-)^QCR9ZPKv9O@x}-42Dol3wRZ0aThfc$o0gIh*Zr=E$0YD5`nhrcg9wUq z4px*CrcaD6e3R5%-I&$P{!uV!`Nyc<<@kfq`&F1PN1a13!_|Kw%*gJ5P&zs5$@t6H zW!KEBqRb_*T+qoK)7K2rU1BQ$q`B2d-+m~fP!4_RS|!DMqxXr8)3QZN>Yh5)=QyXc z>LvccE#nGZ;?aA>tXsniHq9dr7n=*v_FfXI?zjs)?j z351|zD*)x0DUXiUFL^&n$}qQa_oUsdc5>!q%gp9!F1-oWI)eY& z9s+Fxq7{hyqZO92j}cDJC_~SSl_bA%P}c-&su&B|1TDks;Ys#i4g!4(#uh;<2WDk6 zS6dlMgm0Q$W-KeOv7Y4gdra#4J2y);!0)BWi0<$2S6YDXztKuT{)8zpMez0dgI$A59FL9Ix1g+`@7zh{X2;}Mj zgp4ONIwcNmMRifF&+KAujwGFwc;2K*q}O3rQ8@ehTn|&8Ci^HVQ-1y7*aTUTwj;W! z_wO16kOG$%3&e!vby-^7yB{sh*r7~_d<}E09*VTPPr~-)7W zDI`o@wOy0&o^>AqyQ1QTyRtRSbasP=?bpu=kHCd;Ms0`5q=CN}c51r-T+NId*w@M# zH$zl$si`EYS3@mTZ>7 zGRz~N?kmr3oY^5>vL>{Eqi1gbmxr#uM=gbeUUT|qIv>LU!I?}?w`}rwBZA=igFXe- zQRLcpy;=tnjGD~s6H#kTyVv|RO`Qvb8*v}}(8ouwN;{7Gm?#PnQP%Ig8|Yb1C-=|W zLq=F+>9)QHY5(CN>U=qG#5OELy!fMTmMx3+PcpU6FY}HwtF;0bzs#;4%mdA$7s-q3 z##rYFcbWlg0Em!PjsZpxZv->TeP72gTE`>Uqrrb8T~cy#3so_0sqF$akZljoEtI&E$~A z_S6vLB589uk6da&1SkO>v3~62s-v-Oxmdz1e_;!FABM>MT2G?V`P5S61H1U;f;!TP z^nnKiiA2wvnj_G?+ge(J^#NCKnYoKcYs&vEAJ}(&7W==QNB}W0|9_+%|H(Rl|Kl0W ze^mPq{432ODA#V^vbbI@uH5{y1N$aNnT2I!m-jTM!rp@e%Q?&h!sXn`aHlNIr$ z(taH;+!3y|hI1%J{%dnp7b}&9<$2r#l)n6srF9B=fpW$67c$r~whF)k_j9q1we7#K zGB)#uC8Pn;pw2Ey?t{EDnxjHbs;+fQy1!8>`wr^UK=D8^6NJ7%Er57ns^U)yFbtY; zPnLOM&YB6-AiP#Q+MC&5jVp6r`;vKtKi-*_Y$45?Aj9M{h4A%vtgI^z;HH^@<`%+W zhVp-#^T#pcJb_x1SBlSa97}2NB&S)CWM*%fo7psZn<;p;YvnHa6!foItSxds;|Za7 z8@?A0WtL|RMGurQK@RwM@-%>mdR0@^GjR>{$oVVy-Jxb0Em8VoFEVU@snyG8T)!C< zMe~%g{r8!tsn)$-*KcwmdxiyS8LH`Z_C7C4D;_M0#u7;{_OXq zkKrD4W$>MJr;mGu=D+d_+WZujDu&MNlDu~nbGDGJbSu%m6O&~~e{up4rT5Md7|hkv zu`h&DAH5o$%(HIfvo)ytp{w8S*Y0jk8kEv8H!gkuA=Q3k`QSr+@X*o~dp2WQCbdcT z>Ec=sXxQh^YMdUzaoksf@iJ~EhOK;WzaF1Bqs|B251qEG*C~QO6Z^=Q9?}#wIcZ~) z9CEZI@Z+b%_lTzN^|tc`fMp_hLr3rJz>Nj}l6vCUcA~aU_#Xdv)+3V8Zg3u(gS1ZKhGgA$mT1v0)eJ3XU%^n<|0s!Qi{W>!hB)eug;ljJK zkm;(R=-R!mE$p#(NbiCXfFu_?NTVE)<6% zs!jKSxgh;rEdy4SwgG{NDk3zh^+0Se*Za^q#t%H+m~!skeyPS6f&zMquyKnAw;INzIAnwQCCJW)3TUg- zz-};xJ&c5kaS6m+$IDJFNrH|Y>0lZW(7uN;uoMR*xVE#uX1jMHw?%?I6V4-d>mLD}4K(vWbpbqg+I z;R(lPd}H!e7fdKA&~tqPNkp3MY&!sFD!yGHH6#gX7kTgi@beRmr=p-oCWg}IXxF$z zck&~lzQ{4|V2R?qc-X|OoLu3^xJ(rE^%UNo^i20v(0*#>78VT#vyeTv+ci8SL|Llp znLdXtn(Rx~p54SJwkCfYHoLNzVd)>DBJBuX&^cemIJLN`uJPgTW&p&GK}X9bM?c3h zt5H)G0c%_W1mt}T83YW`F5-4c!~{)9R7bq<`HJe2V@(5BCBmQ7>gGeX2=7S8kE$c?S z)Z?Es7Qy^;VvG-K9K8evBV@uG$k+GgG;OMRq6GZ+1q9Qx2qu}<>pZ^1k*L;_DKhsE z@Y;TUO_rGy{D5XPD+Nlg8-jdzB)nRjVRdbLiGlM3wf#dQl7U~ys4P*uGkU7jAPK*HPr2h-Dfy^bKOe9>&>SToda)wT-o@FCCX^RTd+ z5f&7ocSxH3n=slkxSTDr+g2U>Xtg(!Ihi$9%8BhJj3X>j9Oy_+Td6vIYG8-$d0of= z@sQM=o*u@)Tdvry9H!VsO!(d+>MQyyn3m(ueEpgiBg!2{)v$|fTznm@He0!PMBuJ? zwH<0#-~;Ne@dK7e5bsjniMiuV+zw3AwHflI#Q4%ll_V&i-*eU8l zaG!_?A|gj!8(V~<5bF6149=h8g1MzQVoDBluZgAMXKdGez7i=m&&aF5ux|1rOBLDX zUFJF)Hgg_#?}J;aaWpXOnw%WAXf%EySU@G{Atf3(K0i&z;!+ln@ZgcS7go+UO{(Za z*zl~yD#zzeCWznTeX*<+rY}EPUz??qg%sFW8y(?GV~H-@7VJ|;eV^~7v-u8@Uyp)< zdPV)+Ha2f%(ts@;ZVjTXHVUOO5X zFjJFH2PJ{m46=}~`U4`ChaKF+&ASP9XWjXSlQ2L}eHoOuXd44zCn?G(KOZ1i9-aSvS$&AV<_~BDTQ_C=s zFd_-&Y7Y>Z1&81j3b_)1f|PFpGgMNfNe&pPgwn|kM+T9CqF#ez;q>ACAsVlpV)!0c zPt&l}nyw3UkBW|tE^>+{1pnR$vtC9qOGp7wuTS3&9=vT;sYK?DWOvvist`x0FMGT8 z(C$~oEA*M`-4So| zD#lwGUtIuN>Z4&VUZ!dyteLdaf*$)oawanIH)k*RyRxBC^e_m&#I3SAWl9zkD6P-j z^(g*ZOIpD8(3vlT#KIznvoK01=E=BxdbUF1raJSl&XIb(28gpwQ_IsJ8kkGkA&u(A zb)e!pr9mgt%Fx#j@;LP}u#kNmX)#S$OgmDVh-Ln6ji;h>i+sx^7F{!E-PF2A@l4S- zi1uO_@t99C%81spc^Wrs)h&FH`yc}}Z@-(a#;`*rYhoR3#IyD(lN2vT9s? z(ZC%}5_4s%Sv(RWVdfZLu`-^sAN^quOE!Ka7t*}!8R&!~|4In)Z(wcTc25Z$^Cu~&^*jg%4o3a$Gk4KL1H9> z93*Fho1qN^ddzZ^DkNlW4|vKH0$Kc~2J{>bA!K$svISN4w}MBzfxR#7pVB=P$~z69 z@1~IVQ+V47(Y`ygMQ8bLPKR~=9;XRupN;?pW(B^r%2VVD7&?X&dSz*a!`7}k>B&!w zXYO1S#}Di3-gBK7{buA$v(osH=SA(rz_@-0_eDGE7#*np&BGTv?+xyU>U~Sa0%KPF z7f937oK4acxsE}hWz1Yu>`yBS1|iNd>s~M^_pi5UbGV{-%D4JT%2??!L;>2N}AAE`d-S*7!!9{RKIr{zk z7nKNc%|zIZ>-A2jVT z*Zqbc^(A@0<`;)z7#{_r$aAvcp!hHAd!q9Yz38~{S@dcT0A9&B zUL<%4p@E*eFUb@bzwR9HM(bR2?4|G6l(bHF9GNl=r;#!-HWlqgz1@;E4ttR}k%Vsd zQ6GP1x1lTkFrK6kX0q2IvCbjCEOn z>b4Sl{x8l?#}KEO*ZYadDN42F3Tpo1kPMcM3|ly z3;yv_IVSe7vnq~myS}ndRn(>nXachn7$XH^-JIBIStDH8HR(fT1#;I0xv&eiXhnMx z5VT57NmVzY7bz+x*4=p=-&Bfys!tdDLt(~E8uILJlg&H@_idpGIgI<=_aEL%tdn)Q z)OBFD?@yZ|DwjGhsSG>F%8Y+Ly7AqG>aHwi6{Fzlwz7L>oFeGf;V@7kSaryu)|EgS z!@`!Ml+^Trk*Un1PL(f418CUn_<|nJmj4rye+evOdTVGO&5zv^ zyjaUnspW4xEF%(KRjXtdJ+z#byGfOp--QgH``zNuJVb%L^6K%ezf zw&&{gCX3b$y(B0ALn77c%(w9O5ebz+iNoN8-O9Wf6 zS*}xqkS|s=mqZFBG6GJN6s1t1y2SL);Pk*DQLY7iK6*7Gp3lk%)g9w=b)&Hpv&)Q; zXJ3i;jWg}v`DY|?E9j>YvfhteElA&z&IL;wlZjji`4wc=#|bHpgGJTevOb(msJjNAtV!uY6%Z z@QUHiU1s;+TDR#sa+Vj9>d5zjnTx@AZz-kJOAI|GBW>@D7pM3vPwNssL7x$Uy-|qS zN@dpgeU~{1Gm;fVTRuNbbI+r z52g%Wl`?BUgB6e8;)&8x{BN!U`1|fyCmV;(5o=CwE2juepQLkP<55tps*@fg&MCsR z+ay9rZLrL#EdH7WX~R@#?$?;DJ&4}$wLOYQ|Do;QK;TqS|NA@EApi6~y1)HjY|wvW z%KqCnJMjO$&wi_EjwJg?1*QoAy9ctFennGq!JdegT*X+8fDtpFPM_^iMt{9_M1K5tZ0Jk5rL?z|Y+_ zK2Us>iSG7Eg#=8zg``vjvQ2X%IhL%Mhi(P?N%J)Sk8IO_$fiSO{%oYo>w`XE+JhUU zokr{3xxKb$A6WX@A&+QZztXh!r|Tx6<+3C-P{^0J&wzLITy78pM9eIKX|75rctJ+CEH##aCP zEDJO+wT^AP%1e0+)Gs4@%|s!OSjRX5^H zmw^FBw1iDp6 z`#$&g4I&XhR7qWo`FulfIdcMc1j`R+zIoeoxK}QUlMo-kh>OL`*DEun^4IEVeHK zO)D#s^<)se&$6-0%TgU`2~izPAXikfr!FK&2_|-|g2Y&Gq*!1CZI;F}^M;K_K)qdvp0oRy_PYvn z+iQ`L{0zK!kjVA?H@5`X^;ZWn`4Qr~rs8WUAeUy~JsZV$Z9(P=Ob(d8n_#luvxISW z#)}1<8T>d~x2Nt!YseZrUbMkFOdWz@25CaT?%y&#&=$uXV&z>?ugskfIH|HLg<5| zF8YOfec;h2D|qk;jimMR=hW8~HZ~v;6tsJ`gPS{vwuA}75DAsM;@4Ncz@b@&{zJd} zsi>~HT7Nl%QIZ^zUBRG|cBBm7x4as!3?|mxhV4JplAu4O zEf~Omi6CI9XPqT{3uJ=EEqv#ttMA%0IaRLgEAvu3a+h$#zoCJBD1bR+w)iCm{W&ZE zi7wQ_%iG!{8Ma_Z8yKZa6LQY~B9x+ER**y+SL*^HD)AxQEX%Ayx%JoaoN{i3K^@bU z+k(*yb*QObB`=MC7pA~1J*mG3m5EXfXg2@T+L>5A&}=*3WArk z`;mbDH0d;bT?AvVYG*$wVuu7;B7cjN{`g(ebGB{eKz7Kr=_wADduenwpiMYU5dyM0fk&UR)*yUDn0yHoykhB#a2Lzvi-h@Z#(HtJ-CHqCUw${)@-sl8X|4S2P_nYzLs$>8shgBd!A!UXd-duS3cpVga!Tki zwZ6;-ey|mvk}EUfC09kdnR5#ZryVTkyEub$^YZIVIqYaJsu^p@@W?Bl?|NWz6)HJc z+>y0n7dbIyb6_`->a+>=YOf=#VJjypo>iJiI9{O7uQu`jj3gwAh))3=@FE7}cW} zYlC9l%o<3^Zq$dy@cl(C7_mE?pJg2BT5{L>r16`zaS+%ex5Og8BW&jK_`k%iwn z*Zs z5;LDKh4uAJptCno6({eWFR8WQ0BiqO3D{c?cStWcw9>I%enIDauYt4IKDa2lc)9`c zQuBrF%vbJDhf>~2=}p%wo|IQ&8();)xVkG?_USrUDabC((pXJttrKAZlg0rK4v~i3 zVG;bo$F-AyLag zmg2uBJ~)Zpwf`;js`x<9(K_2gxV+HVIK}@t-U_D_PXZ4bZf-H%dUB1pZ$#p3%rilA z1|Dc=mf7J2X=TGw%B>XWQ>Y%Fg&oFosWY>T14!KJTTMM0T!>%-#FuD( zoM$bj2+rW->qHmY(d*gt5G~l2$U{l{^D!5m7A{2-uiv5^iN17kvm{O+hS*w&-Q0?w z{n90ePq07z}HijEeV}`t~w^AUZ-MyL{eBe01oNN|DSOf0S>EFbxEus)3eGRQ`o5a)R0*JS5=IKv<+yH7I(#g?rE z(7tX^293|;kU44lt2e40pAcm#%1jHdVdocviF*7kaw94(DWt1 zXu6C40t&bU(Soy?<~6k}bVYD?IEC0FYH{cRkg9`M7Je_vSN6N+PTFO0G7IOdeRj96 zj-5TL@&^GRDcO-KO#Z5>DJ}sujT19}^DsJ?n91zHB!@s%*-jx>&RRskZeK0NeObw4 za@8l_M(8se0=8ZD_>mhAfD&&J-;(o+$B!AsTlzr1OE#vlMN#aem)?Q`*Hi(iJ#64V{@b9$4ab%ens`VYrr@Pu-`@j z;BAbz$a5T~WU2ex5ZqIah*Bnrop!=?Szd5eBek!`NH2FOwQ;axQ=d<%Kf9ugis`bv zFF4gT?`ZeN-ZZ~z{Bo5@`cbgE1oVhaE$zgcnE3q~JC2yJu?(KfuGluf0mj?HM3|{b zmRNB(qQ{0o=2L5J2O0yfy?9y=H&iyJ4)GAy>cjnPg@Pt>BC~<~e2}|0bxeww*x)H= zR60*>T*q_yx7syGs(kDAF=Ytvw^a?J6Qsr#%T-xMwbu|lB~{axM?g~L<2pD=7^2C+ zCg3E0D`sVP>sXnX#Kye=(gJ>dMHw=bH=1uc>4XrO_J4jTnr`xiufh=keqz2ZfBu+B zH;6-i!iL{uyrHrXoz(Buzn6StU+y$!^6v&RLTdNa*UgrQ)uZoQ8_q&%T|*S>7CrLc zkc{Yw=b6ETBL#RMOa|Eq=nJtiwJ>Z&t{%zCmg`33wbG|=N+yVHTAGhz;};eiXT>okOpo7!js{b_Pw+Q88%G47!zQz4+&4>|Ky^+t zh(6qc)O9Nd0x?BCDX_eSXFic&2AS#{YmyXC1ql#!P^bjczrIiEHjP1en#0y!Lu8~L znnRl%Epf$#;JVDiAy7w6B{yHZ6#c^^bR?SJWv{X|Lq$6Zoe7-QZK#)P`)A$u)18L- ztvVb@Fte2g5>uM;v~1zD1i=Ox<_AV)Fk6Tq-W>Gqp9iDQkK;*=OP{b;y^7(0N^zlw ztpN&&X;X!$+|AAWUplF4yUc_#dC2GS08Qtxvr!C+)Xa%P(n}f00yHHox4ge4jf^ zHY}PB%pf)Y{B+w`vB4!azLf?6>_;k=o_B#o8PGT27~xPEp8__9eu8U|5|5kK*ca7% zSQU5LW#IAfLd#P(Yd|}?1uW-Lpuup7a z(^fFjoZxt}YA9M^i-9tf0HqHk$E(I4_JQx$E%+;Oud&H-(uJhc8M6mLy*TL8-Vj^v z>gCk5hyo0+THLWZB;*G z9_sl+VNvgNNB?H4GqrE2b&RS4ze#EgLH2JNDX$mb-E5?EPU&GWc_H6#vx{r`xMs~A z{8^>o?R=&D!JX1?yAgY{*c3jSjK+}Rkl!MenLX}SX{v{3ne}UclO(k~r%FwF{@z}3 zmZ`k(zh#X(;EB*+xw1#b`dLV2infyv3lj(I5g3iEN-^FK8Fea$AdBXx*KfKyIYqCy zj3$*tt5;!?8}*ew~5uM6`{}Sk9f%XAjvK zc?r3I*Cu!hS#2wefZBz_!ED*tk=E&C}D_6yhuVXcKUHdbl(}(@jXGA2Idu`S#o{!hlMq=G77$` zq*4gKzs~;I;-WF==xpWkwoKmX ziC(n(lQ?vN9-zIE>`k7+V#Vzc1TlYxx6_jEIsyDwUTK4n z1Re%HRVV0ip$MV^{@#g&hbL~b%u>CD)Nvq5>k&SK{@L`<6mpK0*V>6j@e`0L?!F?` z6ddH9Fv3`~xyb-kx}8Fp?w@7P$@+m8%q5Z~6Q=K8Axzyk3qElnED)9xXI}HxIUI*q z?M_HfV^>9^kA!tL!olVnUY>gyu>ES|zJ2Q%Ba{d7E4Mn0jbsaPZ^Z7So`JzI_K|#U zD~kydvxzFmE6@#K%{>Bu8Jx%Rtb&J(JAR-TPTWBx3a+v@`urwQK&~{h_nMU9uMuH3 z+Rk9Rzmi^%)-W;)`)fFOH-Wf|MODy16s7(=z$4>zSvWakYHM$D<)v@pFqpQU9xeZ% zKYU4n4B*MyXL(@SO#5WQ&=Mq6Om{=SHWhh;-|{7}=xSh=nRA$~{QSG^YbE6ir!5U7 ztfWseY(aN#B%U`xZp1V40JIJhyYrIP52`UQ|5{=T8o#aJYlj=0H=NA^c3kGcGF68* zeUILkjq=*>xe1DacD@UM&uXvJ z)>H2w%$S5nV?f%i!zdUMeBJY@RIiQ zt{-=QIdZxu69?;oSH;7Sq+1KeKt^tHF`bEt$tX(s2xIrEMDxy9O+S*jXhUNuVR|M0 zR&kXt2mRG7#Q0w4P!B*8Yjos{S}{Xw{X;T&T@Le4KvqZEr1uPFltB2MsBb?~DUnAV z>n&IYto^KiJX@J-&Rs?ZWhgw@;|ln?w^q^m!vYcMe5P3f#suLP41Kz;X>CflZr9B( zAV4XXF*4<}~p@rs4+=jLg^-A8k%^Ow*-Lmbm-POP&X%&dU=6sP#KK*+n6X)x6ma zWZrn1qj)WR6@_-(Mu~fPbvN9|m`$xrz=A+-DPSK+{%vtG?PG6AMVT)?nz5D7VHYmy zb{UAe5M1cdXjRvF48YDP3FZ63{qi&`q#Lh$GDm?@2;ZIVW3HxWJJ0UqAW5g?bV+r0 z!9*TcmBR2AUP=H4?{Tfq;m+#u(tTg{5In&$J@OmA?X?p`ogVE(>)caR_O7=`J#^Z_ zOBiy{4P6AsE{5pw>z-hucMV)!1?Zdgz8B^(LL?kU2SsK?-T0ILPG@(aWodVJw{`)E zv`M47h`pKoPUej<_$vx#F0P^p>X5cJ6-ZmSOdz%H)|A@pm)yDRW?UyPBt*(-5CZA# z?S(+NxVV1w_ICIpgMFRrxKHk=C*7m~p@8zrtGi}N-$ikYYb!Ye-ON8t0L;j+Ki84o z0zJOPJ-a?8yJU&2QQP>D`1i;WrcUCtg`(V=^EA}*HGK}W{Gi7?7lqi-3N0JnFm>FH zh@gbDNou`4bu;MEUq{?bI6GI{z9H5>qHSO(u~`Q5ZN-;qK85dBuC57yQg9wQa)`FJ zHuD10=0Wx9T9z0f%tVqbq%@IxIm^vIlG#z{5gdm|^|v_`=6CArOGrovsXg>^x3ch; zKibm$jtZ_S?ET65fDdv%@k8_!;c=Cd&Es^ROP4M!y1h)PoW<@VYb05;dc|vH9$|Yl z4SHlGlz6G?)p$fJhC7%DD;FnZh~S^42u$SqAM=KNdNyF14#f++8{b#*ZKOofYD3h`NOEQ^8`5d(Mi9vc@1ARf$pRj->GP4mk)^EcPXRig z&6G5rr4kr;7)5;yyjx+~BiPsllV~9H@RZ2>@X-8l-eZa9Hl62=Z!HkOe`cW+VColS z*4qp8KB}3yTV!Ku8dY6=!`{isH7i2fY4EeEk59d6QhC3S(D{M1TVo(O1|wgmgOI(x z_)b6u}YzTVZsb2e+L%!t# zH6(YX=B)wUeUWBmNTAP^b0I77K|>|w9c{#Y(22uXjdVWIj`v+dD|f7bcrGbwFvwj1 zN?461xpu`dsi|`Wby;A&CW+;6rce6`N7NU*;xvS9{yP1nk!9rMjl&|pWP_X z<0p)tsdZb`CdFIJoKf`{^uep_wyL3Mf{t!L9jNB zyzNtFG+W&LcCcp2dz6pb+Y_ z&D1u)iJaTXOAK&gTls(Wa;^VRreXMjekTGdw-gAL*#$4&Z?JQ!(%06Gdp=gEf_A8zF+VW?}oJz*(-`(yB6 zCeo-$lbmV6Sau-`A+Ui)%1)w8Di^po|4p|=i_}lQ;9j;|Aya?Q66;ckDd{%A5#Y(< zyr!W~^HU4SCJ6FfB@@4Qg11W=Q2JJLItZhci^I#Jtv1!F0bQmg!tpH@dwiT`G8s?= za@rPNOV0<#9tq(3QMflRfbf zGhpn&@P4?+Sja{oZhLg-l0ltLP5#HTkn@OMfQE@bg#RU{dDi=mt*paHkGrw=$wNY3 zN-0w)%8g4Mh=b&lR_oG2M#M(LTT2@ejv`*%)kJHIhpVXp5nz}u2jKW}`U6B@@V?MI zju$I5CDsrrraMCfK1%axkWHUTNF7UES=OwFaN=ZxjQ{p#$^yao9*upO59{d+Nik0~ z_KKxa?i2pR31Rvv)K2k3IYam*?Z;{>f7|PW|iIr8Nl^JvywY7c3IscKjT@{A)46~iyElQ$-$H=vt z@eUG3p)grM52=76$5MJQR78P!o)aY=`D)@!_npjKnscxcG6gr8BdDwr^y8z5qtHt` zSkxuMUJ+cLe|{j%B^?=)Yf1`^Gt2-7M}4mAht)5R+M^{wVwxZ(R%Km~+P-L~(DNsM zzCeW-Gfm+oyizUd3vJj99zmYDy74*j=X^4FYgwVr(%lGfZ*tjAO=9(wTE%>v!9XH* z_~>>e1q&6{PPSkcM!-!9=m}@wu}7rmrKa;DaCw@|TlV$&V9I6A!eGTQczOuNt%#T2 zpb$Rn>hJF#MJ6Gga1~QJQa$R?!+hqpKb^xN%?L#9^TVK|~*DNqi7=L1B+VoqKCxSaQ0JZRPS>eY=kd%Zv5zEgPP3+`7-)QVlM znOiY#b2@1E*^EYo2VrRe<4^NMMkJT90>n%PPf3tHrVV@`*AI$Dm&4JfZeqo$DKlRj zC`~;!y5Y^?MRn*byC#fU+?jE_`AmoA`Z&D29jIbFuU1re1fv}Cw$1k_xWWtBpoJx6 zX~Nx>#+!jIDu+ET}z}>MTL)tTG>iNCvwaKp=(+_S0a9At=BqStMwfai9b>*t& zn)4P`=RM8vrE$)6%-0Do+uDBX6L^ufb!=8Z1M!=iou1NP;Aid&Bc@7_dUbgeo7s#F zU)=gp&EeJRz1p#V8Y566^?s6p1by;dhh;&BqczLnWsI{H)#l;hxd>e4ah;`W-1}dm zi*5`2vQhLp{O6457^CH#H4&v}a~#`|wA9|iHbD%$A`mNk`(d{D8SpD_%ipFe{Hi^0 zO*F##D_e@);`h(M%IBQv=ltpa5H$Uloaq59_P+&Q`LLV|DNEZ<%h4VANDerNJB%%J HASL_(B7Mi& diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a1c3c9306e55f807a7a8676b866cda3a9e20f081..af36641a53cab90ee0900b6ba7aa265c7e33bf90 100644 GIT binary patch delta 9395 zcmbVyby!s2*Y6n^1qA7oMgftQ4hca}kj}3lDTs8V)ET-%T3QnSJ)!XV=zyX(9tY3R_X&hr@qpAW=f|6yRV{I*GP1~8>t`-!wWtFlEZUviXnxP?429a{?0fj77L!0o zwb-_^xJHpI1`cWH3-6nFqBe_zw3kmdx!0!g_|~+@dzyn%zl)5%j4VNX97c%B45;C} zV@uYZDo^nTz~^y5MSi6jLH+cK#w_YaM- zeAKi-3I!oie7f}a;?b%M#ws4&E+apmDu@;(ZhAYb{a{$BE~L|xsCA`Ns+H>^Hl~!= z-)9JTz~r=nlcmOT81QGriP|*RNRTiNuD5SY9iscdC=uaRQx3B^nXfN$?x9Qkfx`&) zRH$&IY54MHa8cCp;$U`1!lZJ z=h($BQni2J$iuIF8sod{^sqb+qb+)-EzMTBzo4XFa zOJ8*3dNMqNMWgtGRKK%HZBc!lchi;u6)u)>x_);QMvGMbb|&qP?A+FjsPWqSp--f( z?ufai68&6K$eC*i*Qy|#o^#{dh+sA4#b8b6*k!EB(|4Zb7B3j;pFP*f6(6TJS9@CK zD(0wCPgMWLYmDc zoW_H&AjN{v1*W@MFVx9CB3<~(aqGE3Lknqz5ciBa%{}C2G3M+X9v{hT@AbO=VyXS& zX5V7N$^Lec9hcAO5L4cFtgu+B0N+s0=LhCYYt9@orlYWpjg?;hpV z_0=zF8nz_#kV&6PQBMs~kF~j0FS5X-5()9`2JKmT>Cfc&;cF>IodNCkJzamaYjH0t zt~klE{;2I{0rNHUuU?F|)ZIwmk%HBiexV_ImDEJ>O-USQ;>-l@aCiSz^`eYa?eDdZ zAYz!EVpPIZZcEmyQlMU4Gh1XJmayQW%Oa9ruRTa*g%@~T5q2i{W9%j|IEZqsT)N_T*qlv9{Zc}KITjky}LIy756VVVsTp;=6y3r8u{wVZ#2(ML>^mn^}J$-;>&xs0Xs zXwe;th7y59fx|+BjcLK^fJ3nrX{c^s@jdY6e8{w3yB@p3EDCoQBVYC;M(Bns zbg_}qYfY98hH$?x@s-umR7n%r=e+fD#sbxv1uG>DL*4G)ilUI3kdXaL8~aG_!F~3h zec7MLn`?Vd-$~()Zp(UvoTSs5)>l{to`e>T$CR=NYSG?ed9KfdRJ+>d2dP%^vc^&3 zg4Zp(kyC_J+Si=@+w!)%|~V$M*YD1SMxzsk6`^ zG6R07l!ZPFSi<_24IFwcdQ-Bp3YL`fkZ+$R@w?qED^lksbS!ZSES-<0AE-!^@RPQ+ z<38M{s2CPDY~eKqoqFT^??iNTkop?vho-07*_1eu4}DZLT3bb0_QlHY7^DX`STGU_{ss^h#qKxnUF%CY z*@Xi3`Y{iu)Ftq@frID#D2=IMJ#HwIYOg-n-1{*95Z-09!nN)RU0$X`*2+N3d=IC*~b?cUp9VwoBWOG}^8 z%J_;C-Bd{R7_b)lR8|JHHW+Le%UOve=wCK;hBZoI(qHg6E=mK{~g z?4%u-cC5_^uqZNz>)E-%04L;?XWX2i$BTas9wjab;C3`moaHqa!2oB^GoW7o6c;!T z6}J32zYPEj@d1X(r#FD*Ed&1TWLLltF2{!x?vyoFP7=58c_q zeK|?*=fYM*Bm2j_Ik#on7|VY6IV1SoVKQS$^M(US$Vp~akLe_F_SDkL!_5)U;4SH3 zF=4Z+p<$Yt0Ie}Kn5ABv=8&Zx78n@FxBdIXo0jNiG1OZjWP;&g+pGH#+sxq2vixQH z=8l)t{3blnj8s82`4-i-4t$I0t@Lw?GB-LNpc^Wt006oVY2?`d`l;cI*~y1r!xVer zMozIUk8Zg%Dx2%g(o8?}CKPpg6kBHCm|Iyv?cvbS$IQR~gyj{Z8zwKJsjQagzf{4Ie*7u7NPIB=CsJ-Eb$BYZ0e zY-l_o)haFgSNXa+BLDN6omv{cRcc4dgq?Z&0*+tcj$9kr#$3P=N;0yjGQ0;X>bZNr zxqF=I^Avc@AZO|X$GJ!RO$Q-Ca=%{>bBVjF9vSfzuPJ}_GuaY_|s2S!_7JGbnQl3OuS@hYE+=yN$OTJvt8V?e_jqZ!Y-#9g!CK?{lH4oE!puI^gia6nS@ULqejAx; zS-8dJeM-0j6UKehT7r=g0(Ic-3yMK-o@8nkp^UXc?P3u#$Vs@VsnsrSNAyLN?X+;m zdlE5%Q30f|eEgKQT$_1wQ6@VM^((@EMZ*h)2uDs>^TXy;Wq1-o0=D=0$s1$3h5oxZ zDjk`C*IeE`q!e?Ye60_7WfHu6Ll>v|)=@}|KBwU6n_Sdrg?)BiBClLIib&YV6Q2z48Gxd+1ZFePQw)oXJ+E|%y$-|%x8 z8@r(6|*z%nlUOmp+|ULtuk}K- z{GvweJw1KY?JymexS;o+i>p9KdmdLy%Nq1_Mx+T?H$wznIs+bpt^Cq&s8(=`ftBy# zg3p~kec_u#>g@fS(q{U~&kj=?dnZJzMY$V@ z1WoO_DwE7u?$_&N-EMqz6KJxr??f+i*jSRd{YI{LJzwd507gfj;R0Ga4oxot-bsC; z+?F*8?RD%}QU6mb*_yIalhMrWVCJy*#%TJXv}l!#?>Xok<^kDDujwMS!Cc4e{MhHW zsFT#L+RGE~M?bBF28Zf4VAaD?6ffCRuqR5WMmD~6z;JU`O6e?inH~N2C{==PL1PHJXyl?!9#I(j9FY58Tx7*KesIfu^^j#7o3#(Sn8nUA%q5dYCmS@b{FXs>=nycw z>>@=^!RiezV1M(`J$o#M5zwzmwb%vI@~%<`+ays+hyM5^QpmayMhZOkL|CEQ?jZTj zTLL5+4M8W5x;MmEeXJ z%Mi6YoN?%*s@W{Z9(n4T8>k3)9j5-(?NUzPHBExaE(F%`j}ss@g`XijC( z!JIGXB6jhd!9VnlgWG>f-=R)89baxO!6@MJq`@?gvBYUC_<<~~ zq^pZjo&QwH*~6?LJvnaeTqUhB#5^2u$ujW2sI`&3IuX-tM7kf{ z&AY1TC;8-v{q+NX1QWz+pxcPuR>ttmVh1{3>o%HB-VX;)@1pD=F$#}~bXOMpo%7S& z+1ma-2DMMKlMG(|F8%}(2cIQ0ul;lAlXf`iV{)>9lIAwrLB%B&dA01PXJ#@qVmgei z$k^BdUDj2o)~YVec+aBD_`XqhG2XW(tikN6Z5E3~8nB15@>LEqSgM*$ zg_AzpAzCVw8|na!JdM#?Yd+fVwX>6gx_WGUd^|$x#LIjw@ICDpvwM5vOCiC*@U^wI zl2I(l=?+y9`}5CS87TsE%sVr4yeK|pU`;INog4F~*L|M5nEQycr;7eZSxB2g8*I0% zJ^u0|^28`?-lp~w6nL(q1nh%P5xQvDGNu4Nf+_yz9Smqv!jZnZ=h2zyoD5A#q28Hm z)EMy;INaXc48s`wtOka0Y@&zrzZBl6sBkb=?rQtqE_e}a$b@tY1RtEzJx2%KZj7+f zyOFB3zu)ag$wviBptzM>qps(P5AA}Un3=Ks5PE*TRGSlZ2Zk1t(`Ju|6S5Qx6nsa_rL*_8e==9|vEPlz?b7xvGoH0Y}?4#sw zwUUOyuUVo^!615ryFpf#y-?ko!ck{l@_OrVm6Vhu39((=FXyVeOF2oJXK(aPfGD`G zbM^l3AyYn#HtK9aszUt_+_E%a&4d{Zq*bSTB?+(0P&G=^M*i8@Pa!=MJr~)1Jb~4o5GpvY4qgh{;QaG6T5Et3x~d-h2&U zwgiE+*(x6mXpO}b1bdez<_c$H(2NnXb>LFl*q;xH9k?3T9*CTseW7b$&}~tZTT?^E z%gaj&hfzn}fUZE6+`_^eF)=aKhCC&el}Zi{6|1`kCx`O6rMIwD?O~ram|aj+2aj;n z^bSsbd#WF)SuUmd;&f)@+3( z-R5F+><=FH1FbcY@pVC)01g(mEavZIkFUIe$0OMQ<(NR8Dgk(xfJ8`_iSo()S`}= zjEprFGeb>AwsP#0^qBDW?E_MBa8=&W+ce#M0*a5*eM>G(2Y_9ZgpqM?tJg7Nl|UED{{DJQKa5BB4a z<^l$3^O9BlOALP1`oHea8K&p<*l{H+3cQ3eFVb^+?YL4{H^S~H&tOL3@+PV-xD@zer*yY_A($0 zOuWftHPWKlhxqpHk?r4ICI4u(7uf)-MauFI%U9 z4cp{4DMfJ{t)wllsU)DKV zhV}!l(RU`_!+#_IEkQ;#cYkZ&1!#rl{U!JdR4V|vVtR|lOd5#g0|@!<-Bh>7&3nwi zV;tYzl%vNOPy!G2WR7<;#J!XmfN$TtzHQBsmzVeKf45S)lmm^c*CGJ=&Bp3 z0_~bHkmHDYBwP2-&55)V_Y5`0-85QU9Mq%p3A)N=Fi1$e!>mhXOx>7x$Ag?SAa>pV zuLF1k37ej-v4k0hEanQy<&=cUXpunfVFm8<)s=P!Rb&VWZ``7IFrb&!(_Y;KPu_Tt z#{GP{St4lYp`09%!i(-0@xZ!G>t$5a-A|7qo;#&gayda~m}$4sF3=I?Pj$`RXZE3K z%(jM2*sLcshf%VWt65L{^nA$8p3Jb{p6$MpWgLkHjct21l+R0`ZNcwNS^ixd&kB(5 zYpZaKZ4T)3*0h@Aaw7lJ<()wEb;aCztX+ysq=*rT*}$l>-Zrw>AN*_O$HS^wJO)Fg zo%j7Yd~p*W=*PIq)kV+E_#m$`pIzM9k$ScHwB6Rh%nl=^<@^CfiKuJ9T*vrRgP(HJ zNiPWvwY38e4xE8W9$!Xx(LT^?e=+8tI_r<0KHXwxM^CakE@XcEr&(HWI4sost$R{~ zL!p(pXV*0EAzt(0eY3y=;nQsVlCPGCHpY~RA*G8e)EOQicsvx0Jy_{>=XI1fB+t#q z!?=4Gmx_u@iN$S_?#zGD$#l#Rv7^3&9e;Jil8YI-nB(bIRaf7*yfOuwr5kh-th{=d zS+2>en0YMFPiS^@br0PrlTEt3*fW?V72?xhJSPsA2ETTr@iU3Xl_Q1tFCSYBK7dw6 zOaF(BdStW6UzaFW1u_5-9}YZt{0(-^hw=G?|3?A%e;!e6!!FB_DsqxjP&`_IL#&!I z61Z*+;@QN&b-Qm_*ZxOA84#Wkc(Oeeg$=9&u^0f6o6ACUM;QO_UkK+H>#^C1EclOk z@8ihL3o9xqSayo2z3AD5C`@0rdj01 zL1%Uw4nRpobC*N%4sftW5vMgh5p@pnX392ZPPMad4cPWW^2_r$8~_v+76t$uT-+~n zR)OHzf)_5Jo-G|QIjP?{HI?d*3zwf4ZrTOP=aTrIXOhMVy3~mK@HJhX;7mHG(CD{a zMm`Xe(~x3m>%~;ps@{)b_}F|kR973aGNKiJhdLr*^r3HdGVj|T1ad|}wnYVZuUhuo z=^^i4_1S;}fCLU4l%FSR61h?BsM8Fgc?{IP=(^>q1sQY?#jG!3kEfu19v^q6$?(D` zID0HF>*2v$L3%X{b31W#!x|o_f7zF6n!S!FuX*iO(!t~6u^HK6??N3dOUwM#)53gz z4vd3?gN>b?f~F>ELPA1MIG{#A3U?7&PQf*+1O;HgV0Md{&fw{ci^N^##q+gKWIz?d>x2t|29iYeB4>on2YA(~^uU96xZYq3O{LO;FdE zsN=yU6pdj31UfaDoDd9I2UPVMjF!Xke($TeX0c0|TmBkMj&ov|ogFt&%$~1+4pIe?8ru>-AI3 zuAr#iIQ%sn-40(S2bLGSmcSdD1>p`p`4{EoJonhyJNx?ZAZ>|S0g8AlD`Cv~1-Bs| zkam{9=}=0&%{m}XZ;Y^C(1Nh>+azP}%rcH}u<+dYuP0hAf~S<_}FW%oYGSAq=^2zARZB!6q}1yCaMc-Z9nH4W>zb6qlFBriG4* zj6C>>?$grMeRU)T$Z0{I@6F981wd-_7jPk0spZRkg}RZ{>PVHFFg15p$G40}!RbOD z^02SV*u3iyv^2H+wQ?WQZ+J{tzB77yD(|HUF}~FP`*xSSb9zjhsyj~Xag0u{%r>@$ zLJ8fLcL!Q42#vpV1+S=zvHS^%8LnE0vgC}uPD*G*EzU=8LoDQc1}jZ9MU0!$8hg8X zfu@}Y=#WD` zp$Spzl7iFWBZ1uCiFV=MlGOKi#RmyD5Wauo;(D%9xx36N#n~s{Ef&%BJ#|4tjDnZw;Qr9honf%z8^)Ai9jy`)1v)AR7)D+ zLH^c#LDqOYIyySTHgAvAlhM)9`0VV;lHEj3jmRSu+wQ7UT$w?Y#WygX6@YM=RB^u- zdK2+qG$2tNZy=#l@pWz!Eo4QX9S4`2Z#It_heS}ULb!C>&xRIqP(hc+(hyyc9>4({ zeGOt?cUR6eVC|cGL=`g+Rm z-@ixJzgcSc>*^+vwLdyH^%1~ZUi+RX?!Fa&v?VVU5fPyx3`NB*2S*j?-xz!a>VTOa zkMk@p9kD*_J~xI43MN~bq|;h>a(!Dl*RkGPXyMWc0sqMH=FOWsP^lcW#{zPH-xSD2 zI=p0BC2x5W(Uii7Bhd>`<))FyuM~8!Ns{;z-rN5Uf$gzN}oWM w@WtS{et_Vbjx=5ThpPPF13UKrc4Bt{rZ}foVKpLJ0O<4ViMnFtW3#~j1qg#Nwg3PC delta 9026 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 Date: Sat, 28 Nov 2015 00:50:34 -0300 Subject: [PATCH 35/62] Adds the dmitool icon merger from baystation12 Credits to GinjaNinja32@bay12 for developing dmitool and PsiOmegaDelta@bay12 for some of these scripts. Thanks also to neersighted for reminding me that we need this. Basically this is like the map merger, except for icons. You can install a hook using the instructions in the dmitool folder, and it should automatically merge your DMIs for you. This means you can solve icon conflicts effortlessly most of the time. --- .gitattributes | 4 + tools/dmitool/README.txt | 5 + tools/dmitool/build.gradle | 16 + tools/dmitool/dmimerge.sh | 8 + tools/dmitool/dmitool.jar | Bin 0 -> 202277 bytes tools/dmitool/dmitool.py | 94 ++++ tools/dmitool/git_merge_installer.bat | 6 + tools/dmitool/git_merge_installer.sh | 6 + tools/dmitool/merging.txt | 14 + tools/dmitool/src/main/java/dmitool/DMI.java | 455 ++++++++++++++++ .../src/main/java/dmitool/DMIDiff.java | 194 +++++++ .../src/main/java/dmitool/DMIException.java | 24 + .../src/main/java/dmitool/IconState.java | 280 ++++++++++ .../src/main/java/dmitool/IconStateDiff.java | 126 +++++ .../dmitool/src/main/java/dmitool/Image.java | 32 ++ tools/dmitool/src/main/java/dmitool/Main.java | 513 ++++++++++++++++++ .../main/java/dmitool/NonPalettedImage.java | 14 + .../src/main/java/dmitool/PNGChunk.java | 27 + .../src/main/java/dmitool/PalettedImage.java | 16 + tools/dmitool/src/main/java/dmitool/RGBA.java | 33 ++ 20 files changed, 1867 insertions(+) create mode 100644 tools/dmitool/README.txt create mode 100644 tools/dmitool/build.gradle create mode 100644 tools/dmitool/dmimerge.sh create mode 100644 tools/dmitool/dmitool.jar create mode 100644 tools/dmitool/dmitool.py create mode 100644 tools/dmitool/git_merge_installer.bat create mode 100755 tools/dmitool/git_merge_installer.sh create mode 100644 tools/dmitool/merging.txt create mode 100644 tools/dmitool/src/main/java/dmitool/DMI.java create mode 100644 tools/dmitool/src/main/java/dmitool/DMIDiff.java create mode 100644 tools/dmitool/src/main/java/dmitool/DMIException.java create mode 100644 tools/dmitool/src/main/java/dmitool/IconState.java create mode 100644 tools/dmitool/src/main/java/dmitool/IconStateDiff.java create mode 100644 tools/dmitool/src/main/java/dmitool/Image.java create mode 100644 tools/dmitool/src/main/java/dmitool/Main.java create mode 100644 tools/dmitool/src/main/java/dmitool/NonPalettedImage.java create mode 100644 tools/dmitool/src/main/java/dmitool/PNGChunk.java create mode 100644 tools/dmitool/src/main/java/dmitool/PalettedImage.java create mode 100644 tools/dmitool/src/main/java/dmitool/RGBA.java diff --git a/.gitattributes b/.gitattributes index 6126f5aac22..5aea6a69309 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,5 +2,9 @@ # needs additional setup, see tools/mapmerge/install.txt *.dmm merge=merge-dmm +# dmi icon merger hook +# needs additional setup, see tools/dmitool/merging.txt +*.dmi merge=merge-dmi + # force changelog merging to use union html/changelog.html merge=union diff --git a/tools/dmitool/README.txt b/tools/dmitool/README.txt new file mode 100644 index 00000000000..409ab873c3d --- /dev/null +++ b/tools/dmitool/README.txt @@ -0,0 +1,5 @@ +Uses PNGJ: https://code.google.com/p/pngj/. + +For help, use "java -jar dmitool.jar help". + +Requires Java 7. \ No newline at end of file diff --git a/tools/dmitool/build.gradle b/tools/dmitool/build.gradle new file mode 100644 index 00000000000..2e5fbc5b08e --- /dev/null +++ b/tools/dmitool/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + compile group: 'ar.com.hjg', name: 'pngj', version: '2.1.0' +} + +jar { + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + manifest { + attributes 'Main-Class': 'dmitool.Main' + } +} \ No newline at end of file diff --git a/tools/dmitool/dmimerge.sh b/tools/dmitool/dmimerge.sh new file mode 100644 index 00000000000..dbe846fc6a9 --- /dev/null +++ b/tools/dmitool/dmimerge.sh @@ -0,0 +1,8 @@ +java -jar tools/dmitool/dmitool.jar merge $1 $2 $3 $2 +if [ "$?" -gt 0 ] +then + echo "Unable to automatically resolve all icon_state conflicts, please merge manually." + exit 1 +fi + +exit 0 diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar new file mode 100644 index 0000000000000000000000000000000000000000..4cfa49f36de43117f01bfdf95913125b0fb3e5b8 GIT binary patch literal 202277 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

wHqj9#{$@Uhav+Q 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 Af&c&j literal 0 HcmV?d00001 diff --git a/tools/dmitool/dmitool.py b/tools/dmitool/dmitool.py new file mode 100644 index 00000000000..390f0d745ff --- /dev/null +++ b/tools/dmitool/dmitool.py @@ -0,0 +1,94 @@ +""" Python 2.7 wrapper for dmitool. +""" + +import os +from subprocess import Popen, PIPE + +_JAVA_PATH = ["java"] +_DMITOOL_CMD = ["-jar", "dmitool.jar"] + +def _dmitool_call(*dmitool_args, **popen_args): + return Popen(_JAVA_PATH + _DMITOOL_CMD + [str(arg) for arg in dmitool_args], **popen_args) + +def _safe_parse(dict, key, deferred_value): + try: + dict[key] = deferred_value() + except Exception as e: + print "Could not parse property '%s': %s"%(key, e) + return e + return False + +def version(): + """ Returns the version as a string. """ + stdout, stderr = _dmitool_call("version", stdout=PIPE).communicate() + return str(stdout).strip() + +def help(): + """ Returns the help text as a string. """ + stdout, stderr = _dmitool_call("help", stdout=PIPE).communicate() + return str(stdout).strip() + +def info(filepath): + """ Totally not a hack that parses the output from dmitool into a dictionary. + May break at any moment. + """ + subproc = _dmitool_call("info", filepath, stdout=PIPE) + stdout, stderr = subproc.communicate() + + result = {} + data = stdout.split(os.linesep)[1:] + #for s in data: print s + + #parse header line + if len(data) > 0: + header = data.pop(0).split(",") + #don't need to parse states, it's redundant + _safe_parse(result, "images", lambda: int(header[0].split()[0].strip())) + _safe_parse(result, "size", lambda: header[2].split()[1].strip()) + + #parse state information + states = [] + for item in data: + if not len(item): continue + + stateinfo = {} + item = item.split(",", 3) + _safe_parse(stateinfo, "name", lambda: item[0].split()[1].strip(" \"")) + _safe_parse(stateinfo, "dirs", lambda: int(item[1].split()[0].strip())) + _safe_parse(stateinfo, "frames", lambda: int(item[2].split()[0].strip())) + if len(item) > 3: + stateinfo["misc"] = item[3] + + states.append(stateinfo) + + result["states"] = states + return result + +def extract_state(input_path, output_path, icon_state, direction=None, frame=None): + """ Extracts an icon state as a png to a given path. + If provided direction should be a string, one of S, N, E, W, SE, SW, NE, NW. + If provided frame should be a frame number or a string of two frame number separated by a dash. + """ + args = ["extract", input_path, icon_state, output_path] + if direction is not None: args.extend(("direction" , str(direction))) + if frame is not None: args.extend(("frame" , str(frame))) + return _dmitool_call(*args) + +def import_state(target_path, input_path, icon_state, replace=False, delays=None, rewind=False, loop=None, ismovement=False, direction=None, frame=None): + """ Inserts an input png given by the input_path into the target_path. + """ + args = ["import", target_path, icon_state, input_path] + + if replace: args.append("nodup") + if rewind: args.append("rewind") + if ismovement: args.append("movement") + if delays: args.extend(("delays", ",".join(delays))) + if direction is not None: args.extend(("direction", direction)) + if frame is not None: args.extend(("frame", frame)) + + if loop in ("inf", "infinity"): + args.append("loop") + elif loop: + args.extend(("loopn", loop)) + + return _dmitool_call(*args) diff --git a/tools/dmitool/git_merge_installer.bat b/tools/dmitool/git_merge_installer.bat new file mode 100644 index 00000000000..18ab7c8026a --- /dev/null +++ b/tools/dmitool/git_merge_installer.bat @@ -0,0 +1,6 @@ +@echo off +set tab= +echo. >> ../../.git/config +echo [merge "merge-dmi"] >> ../../.git/config +echo %tab%name = iconfile merge driver >> ../../.git/config +echo %tab%driver = ./tools/dmitool/dmimerge.sh %%O %%A %%B >> ../../.git/config diff --git a/tools/dmitool/git_merge_installer.sh b/tools/dmitool/git_merge_installer.sh new file mode 100755 index 00000000000..e0c48823b11 --- /dev/null +++ b/tools/dmitool/git_merge_installer.sh @@ -0,0 +1,6 @@ +F="../../.git/config" + +echo '' >> $F +echo '[merge "merge-dmi"]' >> $F +echo ' name = iconfile merge driver' >> $F +echo ' driver = ./tools/dmitool/dmimerge.sh %O %A %B' >> $F diff --git a/tools/dmitool/merging.txt b/tools/dmitool/merging.txt new file mode 100644 index 00000000000..d8943efb985 --- /dev/null +++ b/tools/dmitool/merging.txt @@ -0,0 +1,14 @@ +1. Install java(http://www.java.com/en/download/index.jsp) +2. Make sure java is in your PATH. To test this, open git bash, and type "java". If it says unknown command, you need to add JAVA/bin to your PATH variable (A guide for this can be found at https://www.java.com/en/download/help/path.xml ). + +Merging +The easiest way to do merging is to install the merge driver. For this, open `-tg-station/.git/config` in a text editor, and paste the following lines to the end of it: + +[merge "merge-dmi"] + name = iconfile merge driver + driver = ./tools/dmitool/dmimerge.sh %O %A %B + +You may optionally instead run git_merge_installer.bat or git_merge_installer.sh which should automatically insert these lines for you at the appropriate location. + +After this, merging DMI files should happen automagically unless there are conflicts (an icon_state that both you and someone else changed). +If there are conflicts, you will unfortunately still be stuck with opening both versions in the editor, and manually resolving the issues with those states. diff --git a/tools/dmitool/src/main/java/dmitool/DMI.java b/tools/dmitool/src/main/java/dmitool/DMI.java new file mode 100644 index 00000000000..bb560107ae9 --- /dev/null +++ b/tools/dmitool/src/main/java/dmitool/DMI.java @@ -0,0 +1,455 @@ +package dmitool; + +import ar.com.hjg.pngj.ImageInfo; +import ar.com.hjg.pngj.ImageLineInt; +import ar.com.hjg.pngj.PngReader; +import ar.com.hjg.pngj.PngWriter; +import ar.com.hjg.pngj.PngjInputException; +import ar.com.hjg.pngj.chunks.PngChunkPLTE; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Deque; +import java.util.HashMap; +import java.util.List; + +public class DMI implements Comparator { + int w, h; + List images; + int totalImages = 0; + RGBA[] palette; + boolean isPaletted; + + public DMI(int w, int h) { + this.w = w; + this.h = h; + images = new ArrayList<>(); + isPaletted = false; + palette = null; + } + + public DMI(String f) throws DMIException, FileNotFoundException { + this(new File(f)); + } + + public DMI(File f) throws DMIException, FileNotFoundException { + if(f.length() == 0) { // Empty .dmi is empty file + w = 32; + h = 32; + images = new ArrayList<>(); + isPaletted = false; + palette = null; + return; + } + InputStream in = new FileInputStream(f); + PngReader pngr; + try { + pngr = new PngReader(in); + } catch(PngjInputException pie) { + throw new DMIException("Bad file format!", pie); + } + String descriptor = pngr.getMetadata().getTxtForKey("Description"); + String[] lines = descriptor.split("\n"); + + if(Main.VERBOSITY > 0) System.out.println("Descriptor has " + lines.length + " lines."); + if(Main.VERBOSITY > 3) { + System.out.println("Descriptor:"); + System.out.println(descriptor); + } + + /* length 6 is: + # BEGIN DMI + version = 4.0 + state = "state" + dirs = 1 + frames = 1 + # END DMI + */ + if(lines.length < 6) throw new DMIException(null, 0, "Descriptor too short!"); + + if(!"# BEGIN DMI".equals(lines[0])) throw new DMIException(lines, 0, "Expected '# BEGIN DMI'"); + if(!"# END DMI".equals(lines[lines.length-1])) throw new DMIException(lines, lines.length-1, "Expected '# END DMI'"); + if(!"version = 4.0".equals(lines[1])) throw new DMIException(lines, 1, "Unknown version, expected 'version = 4.0'"); + + this.w = 32; + this.h = 32; + + int i = 2; + + if(lines[i].startsWith("\twidth = ")) { + this.w = Integer.parseInt(lines[2].substring("\twidth = ".length())); + i++; + } + if(lines[i].startsWith("\theight = ")) { + this.h = Integer.parseInt(lines[3].substring("\theight = ".length())); + i++; + } + + List states = new ArrayList<>(); + + while(i < lines.length - 1) { + long imagesInState = 1; + if(!lines[i].startsWith("state = \"") || !lines[i].endsWith("\"")) throw new DMIException(lines, i, "Error reading state string"); + String stateName = lines[i].substring("state = \"".length(), lines[i].length()-1); + i++; + int dirs = 1; + int frames = 1; + float[] delays = null; + boolean rewind = false; + int loop = -1; + String hotspot = null; + boolean movement = false; + while(lines[i].startsWith("\t")) { + if(lines[i].startsWith("\tdirs = ")) { + dirs = Integer.parseInt(lines[i].substring("\tdirs = ".length())); + imagesInState *= dirs; + i++; + } else if(lines[i].startsWith("\tframes = ")) { + frames = Integer.parseInt(lines[i].substring("\tframes = ".length())); + imagesInState *= frames; + i++; + } else if(lines[i].startsWith("\tdelay = ")) { + String delayString = lines[i].substring("\tdelay = ".length()); + String[] delayVals = delayString.split(","); + delays = new float[delayVals.length]; + for(int d=0; d 0) System.out.println(pal.getNentries() + " palette entries"); + + palette = new RGBA[pal.getNentries()]; + int[] rgb = new int[3]; + for(int q=0; q 0) System.out.println("Non-paletted image"); + } + + int iw = pngr.imgInfo.cols; + int ih = pngr.imgInfo.rows; + + if(totalImages > iw * ih) + throw new DMIException(null, 0, "Impossible number of images!"); + + if(Main.VERBOSITY > 0) System.out.println("Image size " + iw+"x"+ih); + int[][] px = new int[ih][]; + + for(int y=0; y statesY) + // this should NEVER happen, we pre-check it + throw new DMIException(null, 0, "CRITICAL: End of image reached with states to go!"); + } + } + if(is.delays != null) { + if((Main.STRICT && is.delays.length*is.dirs != img.length) || is.delays.length*is.dirs < img.length) + throw new DMIException(null, 0, "Delay array size mismatch: " + is.delays.length*is.dirs + " vs " + img.length + "!"); + } + is.images = img; + } + } + + public IconState getIconState(String name) { + for(IconState is: images) { + if(is.name.equals(name)) { + return is; + } + } + return null; + } + + /** + * Makes a copy, unless name is null. + */ + public void addIconState(String name, IconState is) { + if(name == null) { + images.add(is); + totalImages += is.dirs * is.frames; + } else { + IconState newState = (IconState)is.clone(); + newState.name = name; + images.add(newState); + totalImages += is.dirs * is.frames; + } + } + + public boolean removeIconState(String name) { + for(IconState is: images) { + if(is.name.equals(name)) { + images.remove(is); + totalImages -= is.dirs * is.frames; + return true; + } + } + return false; + } + + public boolean setIconState(IconState is) { + for(int i=0; i 0) System.out.println("Fixing PNG chunks..."); + out.writeInt(in.readInt()); + out.writeInt(in.readInt()); + + Deque notZTXT = new ArrayDeque<>(); + + PNGChunk c = null; + + while(c == null || c.type != IEND) { + c = new PNGChunk(in); + if(c.type == zTXt && notZTXT != null) { + PNGChunk cc = null; + while(cc == null || cc.type != IHDR) { + cc = notZTXT.pop(); + cc.write(out); + } + c.write(out); + while(notZTXT.size() != 0) { + PNGChunk pc = notZTXT.pop(); + pc.write(out); + } + notZTXT = null; + } else if(notZTXT != null) { + notZTXT.add(c); + } else { + c.write(out); + } + } + if(Main.VERBOSITY > 0) System.out.println("Chunks fixed."); + } + + @Override public int compare(IconState arg0, IconState arg1) { + return arg0.name.compareTo(arg1.name); + } + + public void writeDMI(OutputStream os) throws IOException { + writeDMI(os, false); + } + public void writeDMI(OutputStream os, boolean sortStates) throws IOException { + if(totalImages == 0) { // Empty .dmis are empty files + os.close(); + return; + } + + // Setup chunk-fix buffer + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + if(sortStates) { + Collections.sort(images, this); + } + + // Write the dmi into the buffer + int sx = (int)Math.ceil(Math.sqrt(totalImages)); + int sy = totalImages / sx; + if(sx*sy < totalImages) { + sy++; + } + if(Main.VERBOSITY > 0) System.out.println("Image size: " + w + "x" + h + "; number of images " + sx + "x" + sy + " (" + totalImages + ")"); + int ix = sx * w; + int iy = sy * h; + ImageInfo ii = new ImageInfo(ix, iy, 8, true); + PngWriter out = new PngWriter(baos, ii); + out.setCompLevel(9); // Maximum compression + String description = getDescriptor(); + if(Main.VERBOSITY > 0) System.out.println("Descriptor has " + (description.split("\n").length) + " lines."); + out.getMetadata().setText("Description", description, true, true); + + Image[][] img = new Image[sx][sy]; + { + int k = 0; + int r = 0; + for(IconState is: images) { + for(Image i: is.images) { + img[k++][r] = i; + + if(k == sx) { + k = 0; + r++; + } + } + } + } + + for(int irow=0; irow myIS = new HashMap<>(); + HashMap dmiIS = new HashMap<>(); + + for(IconState is: images) { + myIS.put(is.name, is); + } + for(IconState is: dmi.images) { + dmiIS.put(is.name, is); + } + if(!myIS.keySet().equals(dmiIS.keySet())) return false; + for(String s: myIS.keySet()) { + if(!myIS.get(s).equals(dmiIS.get(s))) return false; + } + + return true; + } +} diff --git a/tools/dmitool/src/main/java/dmitool/DMIDiff.java b/tools/dmitool/src/main/java/dmitool/DMIDiff.java new file mode 100644 index 00000000000..431d9c1d15a --- /dev/null +++ b/tools/dmitool/src/main/java/dmitool/DMIDiff.java @@ -0,0 +1,194 @@ +package dmitool; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class DMIDiff { + Map newIconStates; + Map modifiedIconStates = new HashMap<>(); + Set removedIconStates; + + DMIDiff() { + newIconStates = new HashMap<>(); + removedIconStates = new HashSet<>(); + } + + public DMIDiff(DMI base, DMI mod) { + if(base.h != mod.h || base.w != mod.w) throw new IllegalArgumentException("Cannot compare non-identically-sized DMIs!"); + + HashMap baseIS = new HashMap<>(); + for(IconState is: base.images) { + baseIS.put(is.name, is); + } + + HashMap modIS = new HashMap<>(); + for(IconState is: mod.images) { + modIS.put(is.name, is); + } + + newIconStates = ((HashMap)modIS.clone()); + for(String s: baseIS.keySet()) { + newIconStates.remove(s); + } + + removedIconStates = new HashSet<>(); + removedIconStates.addAll(baseIS.keySet()); + removedIconStates.removeAll(modIS.keySet()); + + Set retainedStates = new HashSet<>(); + retainedStates.addAll(baseIS.keySet()); + retainedStates.retainAll(modIS.keySet()); + + for(String s: retainedStates) { + if(!baseIS.get(s).equals(modIS.get(s))) { + modifiedIconStates.put(s, new IconStateDiff(baseIS.get(s), modIS.get(s))); + } + } + } + /** + * ASSUMES NO MERGE CONFLICTS - MERGE DIFFS FIRST. + */ + public void applyToDMI(DMI dmi) { + for(String s: removedIconStates) { + dmi.removeIconState(s); + } + for(String s: modifiedIconStates.keySet()) { + dmi.setIconState(modifiedIconStates.get(s).newState); + } + for(String s: newIconStates.keySet()) { + dmi.addIconState(null, newIconStates.get(s)); + } + } + + /** + * @param other The diff to merge with + * @param conflictDMI A DMI to add conflicted icon_states to + * @param merged An empty DMIDiff to merge into + * @param aName The log name for this diff + * @param bName The log name for {@code other} + * @return A Set containing all icon_states which conflicted, along with what was done in each diff, in the format "icon_state: here|there"; here and there are one of "added", "modified", and "removed" + */ + public Set mergeDiff(DMIDiff other, DMI conflictDMI, DMIDiff merged, String aName, String bName) { + HashSet myTouched = new HashSet<>(); + myTouched.addAll(removedIconStates); + myTouched.addAll(newIconStates.keySet()); + myTouched.addAll(modifiedIconStates.keySet()); + + HashSet otherTouched = new HashSet<>(); + otherTouched.addAll(other.removedIconStates); + otherTouched.addAll(other.newIconStates.keySet()); + otherTouched.addAll(other.modifiedIconStates.keySet()); + + HashSet bothTouched = (HashSet)myTouched.clone(); + bothTouched.retainAll(otherTouched); // this set now contains the list of icon_states that *both* diffs modified, which we'll put in conflictDMI for manual merge (unless they were deletions + + if(Main.VERBOSITY > 0) { + System.out.println("a: " + Arrays.toString(myTouched.toArray())); + System.out.println("b: " + Arrays.toString(otherTouched.toArray())); + System.out.println("both: " + Arrays.toString(bothTouched.toArray())); + } + + HashSet whatHappened = new HashSet<>(); + + for(String s: bothTouched) { + String here, there; + if(removedIconStates.contains(s)) { + here = "removed"; + } else if(newIconStates.containsKey(s)) { + here = "added"; + } else if(modifiedIconStates.containsKey(s)) { + here = "modified"; + } else { + System.out.println("Unknown error; state="+s); + here = "???"; + } + + if(other.removedIconStates.contains(s)) { + there = "removed"; + } else if(other.newIconStates.containsKey(s)) { + there = "added"; + } else if(other.modifiedIconStates.containsKey(s)) { + there = "modified"; + } else { + System.out.println("Unknown error; state="+s); + there = "???"; + } + + whatHappened.add(s + ": " + here + "|" + there); + } + + // Removals + for(String s: removedIconStates) { + if(!bothTouched.contains(s)) { + merged.removedIconStates.add(s); + } + } + for(String s: other.removedIconStates) { + if(!bothTouched.contains(s)) { + merged.removedIconStates.add(s); + } + } + + // Modifications + for(String s: modifiedIconStates.keySet()) { + if(!bothTouched.contains(s)) { + merged.modifiedIconStates.put(s, modifiedIconStates.get(s)); + } else { + conflictDMI.addIconState(aName + "|" + s, modifiedIconStates.get(s).newState); + } + } + for(String s: other.modifiedIconStates.keySet()) { + if(!bothTouched.contains(s)) { + merged.modifiedIconStates.put(s, other.modifiedIconStates.get(s)); + } else { + conflictDMI.addIconState(bName + "|" + s, other.modifiedIconStates.get(s).newState); + } + } + + // Additions + for(String s: newIconStates.keySet()) { + if(!bothTouched.contains(s)) { + merged.newIconStates.put(s, newIconStates.get(s)); + } else { + conflictDMI.addIconState(aName + s, newIconStates.get(s)); + } + } + for(String s: other.newIconStates.keySet()) { + if(!bothTouched.contains(s)) { + merged.newIconStates.put(s, other.newIconStates.get(s)); + } else { + conflictDMI.addIconState(bName + s, other.newIconStates.get(s)); + } + } + + return whatHappened; + } + + @Override public String toString() { + String s = ""; + String t = "\t"; + String q = "\""; + String n = "\n"; + if(!removedIconStates.isEmpty()) { + s += "Removed:\n"; + for(String state: removedIconStates) + s += t + q + state + q + n; + } + if(!modifiedIconStates.isEmpty()) { + s += "Modified:\n"; + for(String state: modifiedIconStates.keySet()) + s += t + q + state + q + " [" + modifiedIconStates.get(state).toString() + "]\n"; + } + if(!newIconStates.isEmpty()) { + s += "Added:\n"; + for(String state: newIconStates.keySet()) + s += t + q + state + q + " " + newIconStates.get(state).infoStr() + n; + } + if("".equals(s)) + return "No changes"; + return s; + } +} \ No newline at end of file diff --git a/tools/dmitool/src/main/java/dmitool/DMIException.java b/tools/dmitool/src/main/java/dmitool/DMIException.java new file mode 100644 index 00000000000..e9293162894 --- /dev/null +++ b/tools/dmitool/src/main/java/dmitool/DMIException.java @@ -0,0 +1,24 @@ +package dmitool; + +public class DMIException extends Exception { + String[] desc = null; + int line = 0; + public DMIException(String[] descriptor, int line, String what) { + super(what); + desc = descriptor; + this.line = line; + } + public DMIException(String what) { + super(what); + } + public DMIException(String what, Exception cause) { + super(what, cause); + } + + @Override public String getMessage() { + if(desc != null) + return "\"" + desc[line] + "\" - " + super.getMessage(); + + return super.getMessage(); + } +} \ No newline at end of file diff --git a/tools/dmitool/src/main/java/dmitool/IconState.java b/tools/dmitool/src/main/java/dmitool/IconState.java new file mode 100644 index 00000000000..2a2202c71cd --- /dev/null +++ b/tools/dmitool/src/main/java/dmitool/IconState.java @@ -0,0 +1,280 @@ +package dmitool; + +import java.util.Arrays; +import ar.com.hjg.pngj.ImageInfo; +import ar.com.hjg.pngj.ImageLineInt; +import ar.com.hjg.pngj.PngWriter; +import ar.com.hjg.pngj.PngReader; +import ar.com.hjg.pngj.PngjInputException; +import java.io.InputStream; +import java.io.OutputStream; + +public class IconState { + String name; + int dirs; + int frames; + float[] delays; + Image[] images; // dirs come first + boolean rewind; + int loop; + String hotspot; + boolean movement; + + public String getInfoLine() { + String extraInfo = ""; + if(rewind) extraInfo += " rewind"; + if(frames != 1) { + extraInfo += " loop(" + (loop==-1 ? "infinite" : loop) + ")"; + } + if(hotspot != null) extraInfo += " hotspot('" + hotspot + "')"; + if(movement) extraInfo += " movement"; + if(extraInfo.equals("")) { + return String.format("state \"%s\", %d dir(s), %d frame(s)", name, dirs, frames); + } else { + return String.format("state \"%s\", %d dir(s), %d frame(s),%s", name, dirs, frames, extraInfo); + } + } + + @Override public IconState clone() { + IconState is = new IconState(name, dirs, frames, images.clone(), delays==null ? null : delays.clone(), rewind, loop, hotspot, movement); + is.delays = delays != null ? delays.clone() : null; + is.rewind = rewind; + + return is; + } + + public IconState(String name, int dirs, int frames, Image[] images, float[] delays, boolean rewind, int loop, String hotspot, boolean movement) { + if(delays != null) { + if(Main.STRICT && delays.length != frames) { + throw new IllegalArgumentException("Delays and frames must be the same length!"); + } + } + this.name = name; + this.dirs = dirs; + this.frames = frames; + this.images = images; + this.rewind = rewind; + this.loop = loop; + this.hotspot = hotspot; + this.delays = delays; + this.movement = movement; + } + void setDelays(float[] delays) { + this.delays = delays; + } + void setRewind(boolean b) { + rewind = b; + } + @Override public boolean equals(Object obj) { + if(obj == this) return true; + if(!(obj instanceof IconState)) return false; + + IconState is = (IconState)obj; + + if(!is.name.equals(name)) return false; + if(is.dirs != dirs) return false; + if(is.frames != frames) return false; + if(!Arrays.equals(images, is.images)) return false; + if(is.rewind != rewind) return false; + if(is.loop != loop) return false; + if(!Arrays.equals(delays, is.delays)) return false; + if(!(is.hotspot == null ? hotspot == null : is.hotspot.equals(hotspot))) return false; + if(is.movement != movement) return false; + + return true; + } + public String infoStr() { + return "[" + frames + " frame(s), " + dirs + " dir(s)]"; + } + public String getDescriptorFragment() { + String s = ""; + String q = "\""; + String n = "\n"; + s += "state = " + q + name + q + n; + s += "\tdirs = " + dirs + n; + s += "\tframes = " + frames + n; + if(delays != null) { + s += "\tdelay = " + delayArrayToString(delays) + n; + } + if(rewind) { + s += "\trewind = 1\n"; + } + if(loop != -1) { + s += "\tloop = " + loop + n; + } + if(hotspot != null) { + s += "\thotspot = " + hotspot + n; + } + if(movement) { + s += "\tmovement = 1\n"; + } + return s; + } + + private static String delayArrayToString(float[] d) { + String s = ""; + for(float f: d) { + s += ","+f; + } + return s.substring(1); + } + + /** + * Dump the state to the given OutputStream in PNG format. Frames will be dumped along the X axis of the image, and directions will be dumped along the Y. + */ + public void dumpToPNG(OutputStream outS, int minDir, int maxDir, int minFrame, int maxFrame) { + int totalDirs = maxDir - minDir + 1; + int totalFrames = maxFrame - minFrame + 1; + + int w = images[minDir + minFrame * this.dirs].w; + int h = images[minDir + minFrame * this.dirs].h; + + if(Main.VERBOSITY > 0) System.out.println("Writing " + totalDirs + " dir(s), " + totalFrames + " frame(s), " + totalDirs*totalFrames + " image(s) total."); + ImageInfo ii = new ImageInfo(totalFrames * w, totalDirs * h, 8, true); + PngWriter out = new PngWriter(outS, ii); + out.setCompLevel(9); + + Image[][] img = new Image[totalFrames][totalDirs]; + { + for(int i=0; i= frames) + throw new IllegalArgumentException("Provided frame is out of range: " + frame); + if(dir < 0 || dir >= dirs) + throw new IllegalArgumentException("Provided dir is out of range: " + dir); + + images[getIndex(dir, frame)] = splice; + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/dmitool/src/main/java/dmitool/IconStateDiff.java b/tools/dmitool/src/main/java/dmitool/IconStateDiff.java new file mode 100644 index 00000000000..a5d30db7fe0 --- /dev/null +++ b/tools/dmitool/src/main/java/dmitool/IconStateDiff.java @@ -0,0 +1,126 @@ +package dmitool; + +import java.util.HashMap; +import java.util.HashSet; + +public class IconStateDiff { + static class ISAddress { + int dir; + int frame; + + public ISAddress(int dir, int frame) { + this.dir = dir; + this.frame = frame; + } + + public String infoStr(int maxDir, int maxFrame) { + if(maxDir == 1 && maxFrame == 1) { + return ""; + } else if(maxDir == 1) { + return "{" + frame + "}"; + } else if(maxFrame == 1) { + return "{" + Main.dirs[dir] + "}"; + } else { + return "{" + Main.dirs[dir] + " " + frame + "}"; + } + } + } + int oldFrameCount = 0; + int oldDirectionCount = 0; + boolean oldRewind = false; + int oldLoop = -1; + String oldHotspot = null; + + int newFrameCount = 0; + int newDirectionCount = 0; + boolean newRewind = false; + int newLoop = -1; + String newHotspot = null; + + IconState newState; + HashMap modifiedFrames = new HashMap<>(); + HashMap newFrames = new HashMap<>(); + HashSet removedFrames = new HashSet<>(); + + public IconStateDiff(IconState base, IconState mod) { + int maxDir = Math.max(base.dirs, mod.dirs); + int maxFrame = Math.max(base.frames, mod.frames); + + oldFrameCount = base.frames; + oldDirectionCount = base.dirs; + oldRewind = base.rewind; + oldLoop = base.loop; + oldHotspot = base.hotspot; + + newFrameCount = mod.frames; + newDirectionCount = mod.dirs; + newRewind = mod.rewind; + newLoop = mod.loop; + newHotspot = mod.hotspot; + + newState = mod; + + Image baseI, modI; + for(int d=0; d d && base.frames > f) { + baseI = base.images[f * base.dirs + d]; + } else baseI = null; + if(mod.dirs > d && mod.frames > f) { + modI = mod.images[f * mod.dirs + d]; + } else modI = null; + + if(baseI == null && modI == null) continue; + + if(baseI == null) newFrames.put(new ISAddress(d, f), modI); + else if(modI == null) removedFrames.add(new ISAddress(d, f)); + else if(!baseI.equals(modI)) { + modifiedFrames.put(new ISAddress(d, f), modI); + } + } + } + } + + @Override public String toString() { + String s = ""; + String tmp; + + if(newDirectionCount != oldDirectionCount) + s += " | dirs " + oldDirectionCount + "->" + newDirectionCount; + + if(newFrameCount != oldFrameCount) + s += " | frames " + oldFrameCount + "->" + newFrameCount; + + if(newRewind != oldRewind) { + s += " | rewind " + oldRewind + "->" + newRewind; + } + + if(newLoop != oldLoop) { + s += " | loop " + oldLoop + "->" + newLoop; + } + + if(newHotspot == null ? oldHotspot != null : !newHotspot.equals(oldHotspot)) { + s += " | hotspot " + oldHotspot + "->" + newHotspot; + } + + if(!modifiedFrames.isEmpty()) { + int total_frames = Math.min(oldFrameCount, newFrameCount) * Math.min(oldDirectionCount, newDirectionCount); + tmp = ""; + for(ISAddress isa: modifiedFrames.keySet()) { + String str = isa.infoStr(oldDirectionCount, oldFrameCount); + if(!"".equals(str)) { + tmp += ", " + str; + } + } + if(!"".equals(tmp)) { + s += " | modified " + modifiedFrames.size() + " of " + total_frames + ": " + tmp.substring(1); + } else { + s += " | modified " + modifiedFrames.size() + " of " + total_frames; + } + } + + if("".equals(s)) + return "No change"; + return s.substring(3); + } +} \ No newline at end of file diff --git a/tools/dmitool/src/main/java/dmitool/Image.java b/tools/dmitool/src/main/java/dmitool/Image.java new file mode 100644 index 00000000000..2ea7ff41920 --- /dev/null +++ b/tools/dmitool/src/main/java/dmitool/Image.java @@ -0,0 +1,32 @@ +package dmitool; + +import java.io.IOException; +import java.io.OutputStream; + +public abstract class Image { + int w, h; + + abstract RGBA getPixel(int x, int y); + + public Image(int w, int h) { + this.w = w; + this.h = h; + } + + @Override public boolean equals(Object obj) { + if(obj == this) return true; + if(!(obj instanceof Image)) return false; + + Image im = (Image) obj; + + if(w != im.w || h != im.h) return false; + + for(int i=0; i argq = new ArrayDeque<>(); + for(String s: args) { + argq.addLast(s); + } + if(argq.size() == 0) { + System.out.println("No command found; use 'help' for help"); + return; + } + String switches = argq.peekFirst(); + if(switches.startsWith("-")) { + for(char c: switches.substring(1).toCharArray()) { + switch(c) { + case 'v': VERBOSITY++; break; + case 'q': VERBOSITY--; break; + case 'S': STRICT = true; break; + } + } + argq.pollFirst(); + } + String op = argq.pollFirst(); + + switch(op) { + case "diff": { + if(argq.size() < 2) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String a = argq.pollFirst(); + String b = argq.pollFirst(); + + if(VERBOSITY >= 0) System.out.println("Loading " + a); + DMI dmi = doDMILoad(a); + if(VERBOSITY >= 0) dmi.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Loading " + b); + DMI dmi2 = doDMILoad(b); + if(VERBOSITY >= 0) dmi2.printInfo(); + + DMIDiff dmid = new DMIDiff(dmi, dmi2); + System.out.println(dmid); + break; + } + case "sort": { + if(argq.size() < 1) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String f = argq.pollFirst(); + + if(VERBOSITY >= 0) System.out.println("Loading " + f); + DMI dmi = doDMILoad(f); + if(VERBOSITY >= 0) dmi.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Saving " + f); + dmi.writeDMI(new FileOutputStream(f), true); + break; + } + case "merge": { + if(argq.size() < 4) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String baseF = argq.pollFirst(), + aF = argq.pollFirst(), + bF = argq.pollFirst(), + mergedF = argq.pollFirst(); + if(VERBOSITY >= 0) System.out.println("Loading " + baseF); + DMI base = doDMILoad(baseF); + if(VERBOSITY >= 0) base.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Loading " + aF); + DMI aDMI = doDMILoad(aF); + if(VERBOSITY >= 0) aDMI.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Loading " + bF); + DMI bDMI = doDMILoad(bF); + if(VERBOSITY >= 0) bDMI.printInfo(); + + DMIDiff aDiff = new DMIDiff(base, aDMI); + DMIDiff bDiff = new DMIDiff(base, bDMI); + DMIDiff mergedDiff = new DMIDiff(); + DMI conflictDMI = new DMI(32, 32); + + Set cf = aDiff.mergeDiff(bDiff, conflictDMI, mergedDiff, aF, bF); + + mergedDiff.applyToDMI(base); + + base.writeDMI(new FileOutputStream(mergedF)); + + if(!cf.isEmpty()) { + if(VERBOSITY >= 0) for(String s: cf) { + System.out.println(s); + } + conflictDMI.writeDMI(new FileOutputStream(mergedF + ".conflict.dmi"), true); + System.out.println("Add/modify conflicts placed in '" + mergedF + ".conflict.dmi'"); + System.exit(1); // Git expects non-zero on merge conflict + } else { + System.out.println("No conflicts"); + System.exit(0); + } + break; + } + case "extract": { + if(argq.size() < 3) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String file = argq.pollFirst(), + state = argq.pollFirst(), + outFile = argq.pollFirst(); + + DMI dmi = doDMILoad(file); + if(VERBOSITY >= 0) dmi.printInfo(); + + IconState is = dmi.getIconState(state); + if(is == null) { + System.out.println("icon_state '"+state+"' does not exist!"); + return; + } + // minDir, Maxdir, minFrame, Maxframe + int mDir=0, Mdir=is.dirs-1; + int mFrame=0, Mframe=is.frames-1; + + while(argq.size() > 1) { + String arg = argq.pollFirst(); + + switch(arg) { + case "d": + case "dir": + case "dirs": + case "direction": + case "directions": + String dString = argq.pollFirst(); + if(dString.contains("-")) { + String[] splitD = dString.split("-"); + if(splitD.length == 2) { + mDir = parseDir(splitD[0], is); + Mdir = parseDir(splitD[1], is); + } else { + System.out.println("Illegal dir string: '" + dString + "'!"); + return; + } + } else { + mDir = parseDir(dString, is); + Mdir = mDir; + } + // Invalid value check, warnings are printed in parseDir() + if(mDir == -1 || Mdir == -1) return; + if(Mdir < mDir) { + System.out.println("Maximum dir greater than minimum dir!"); + System.out.println("Textual direction order is S, N, E, W, SE, SW, NE, NW increasing 0 (S) to 7 (NW)"); + return; + } + break; + case "f": + case "frame": + case "frames": + String fString = argq.pollFirst(); + if(fString.contains("-")) { + String[] splitF = fString.split("-"); + if(splitF.length == 2) { + mFrame = parseFrame(splitF[0], is); + Mframe = parseFrame(splitF[1], is); + } else { + System.out.println("Illegal frame string: '" + fString + "'!"); + return; + } + } else { + mFrame = parseFrame(fString, is); + Mframe = mFrame; + } + // Invalid value check, warnings are printed in parseFrame() + if(mFrame == -1 || Mframe == -1) return; + if(Mframe < mFrame) { + System.out.println("Maximum frame greater than minimum frame!"); + return; + } + break; + default: + System.out.println("Unknown argument '" + arg + "' detected, ignoring."); + } + } + if(!argq.isEmpty()) { + System.out.println("Extra argument '" + argq.pollFirst() + "' detected, ignoring."); + } + is.dumpToPNG(new FileOutputStream(outFile), mDir, Mdir, mFrame, Mframe); + break; + } + case "import": { + if(argq.size() < 3) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String dmiFile = argq.pollFirst(), + stateName = argq.pollFirst(), + pngFile = argq.pollFirst(); + + boolean noDup = false; + boolean rewind = false; + int loop = 0; + boolean movement = false; + String hotspot = null; + float[] delays = null; + String replaceDir = null; + String replaceFrame = null; + while(!argq.isEmpty()) { + String s = argq.pollFirst(); + switch(s.toLowerCase()) { + case "nodup": + case "nd": + case "n": + noDup = true; + break; + case "rewind": + case "rw": + case "r": + rewind = true; + break; + case "loop": + case "lp": + case "l": + loop = -1; + break; + case "loopn": + case "lpn": + case "ln": + if(!argq.isEmpty()) { + String loopTimes = argq.pollFirst(); + try { + loop = Integer.parseInt(loopTimes); + } catch(NumberFormatException nfe) { + System.out.println("Illegal number '" + loopTimes + "' as argument to '" + s + "'!"); + return; + } + } else { + System.out.println("Argument '" + s + "' requires a numeric argument following it!"); + return; + } + break; + case "movement": + case "move": + case "mov": + case "m": + movement = true; + break; + case "delays": + case "delay": + case "del": + case "d": + if(!argq.isEmpty()) { + String delaysString = argq.pollFirst(); + String[] delaysSplit = delaysString.split(","); + delays = new float[delaysSplit.length]; + for(int i=0; i= 0) System.out.println("Loading " + dmiFile); + DMI toImportTo = doDMILoad(dmiFile); + if(VERBOSITY >= 0) toImportTo.printInfo(); + IconState is = IconState.importFromPNG(toImportTo, new FileInputStream(pngFile), stateName, delays, rewind, loop, hotspot, movement); + + //image insertion + if(replaceDir != null || replaceFrame != null) { + + IconState targetIs = toImportTo.getIconState(stateName); + if(targetIs == null) { + System.out.println("'direction' or 'frame' specified and no icon state '" + stateName + "' found, aborting!"); + return; + } + if(is.images.length == 0) { + System.out.println("'direction' or 'frame' specified and imported is empty, aborting!"); + return; + } + + if(!noDup) targetIs = targetIs.clone(); + + int dirToReplace, frameToReplace; + if(replaceDir != null && replaceFrame != null) { + frameToReplace = parseFrame(replaceFrame, targetIs); + dirToReplace = parseDir(replaceDir, targetIs); + targetIs.insertImage(dirToReplace, frameToReplace, is.images[0]); + } + else if(replaceDir != null) { + dirToReplace = parseDir(replaceDir, targetIs); + targetIs.insertDir(dirToReplace, is.images); + } + else if(replaceFrame != null) { + frameToReplace = parseFrame(replaceFrame, targetIs); + targetIs.insertFrame(frameToReplace, is.images); + } + + if(!noDup) toImportTo.addIconState(null, targetIs); + } + else { + if(noDup) { + if(!toImportTo.setIconState(is)) { + toImportTo.addIconState(null, is); + } + } else { + toImportTo.addIconState(null, is); + } + } + + if(VERBOSITY >= 0) toImportTo.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Saving " + dmiFile); + toImportTo.writeDMI(new FileOutputStream(dmiFile)); + break; + } + case "verify": { + if(argq.size() < 1) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String vF = argq.pollFirst(); + if(VERBOSITY >= 0) System.out.println("Loading " + vF); + DMI v = doDMILoad(vF); + if(VERBOSITY >= 0) v.printInfo(); + break; + } + case "info": { + if(argq.size() < 1) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String infoFile = argq.pollFirst(); + if(VERBOSITY >= 0) System.out.println("Loading " + infoFile); + DMI info = doDMILoad(infoFile); + info.printInfo(); + info.printStateList(); + break; + } + case "version": + System.out.println(VERSION); + return; + default: + System.out.println("Command '" + op + "' not found!"); + case "help": + System.out.println(helpStr); + break; + } + } + + static int parseDir(String s, IconState is) { + try { + int i = Integer.parseInt(s); + if(0 <= i && i < is.dirs) { + return i; + } else { + System.out.println("Direction not in valid range [0, "+(is.dirs-1)+"]!"); + return -1; + } + } catch(NumberFormatException nfe) { + for(int q=0; q Date: Sat, 28 Nov 2015 01:49:19 -0600 Subject: [PATCH 36/62] Makes snowman body --- code/modules/clothing/suits/miscellaneous.dm | 8 ++++++++ icons/mob/suit.dmi | Bin 274039 -> 275336 bytes icons/obj/clothing/suits.dmi | Bin 90978 -> 91493 bytes 3 files changed, 8 insertions(+) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 322ac1f17a0..321556ec6ff 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -165,6 +165,14 @@ body_parts_covered = CHEST|GROIN flags_inv = HIDEJUMPSUIT +/obj/item/clothing/suit/snowman + name = "snowman outfit" + desc = "Two white spheres covered in white glitter. 'Tis the season." + icon_state = "snowman" + item_state = "snowman" + body_parts_covered = CHEST|GROIN + flags_inv = HIDEJUMPSUIT + /obj/item/clothing/suit/poncho name = "poncho" desc = "Your classic, non-racist poncho." diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 847f3d4302cd9c14761eaae00af3d79c923fab13..ef3d349f6c8ee1b61b98341293b78b157db1442f 100644 GIT binary patch delta 17867 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 d?!VW6|Ce4pW!8I_V Date: Sat, 28 Nov 2015 00:08:28 -0800 Subject: [PATCH 37/62] Removes spawn(rand(10,150)) from client database syncing This was a shitty way to do this, and the overhead from spawn() makes it not worth it now that the database is local to the server. --- code/modules/client/client procs.dm | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 363ef38f616..ec3f72d6e59 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -179,14 +179,8 @@ var/next_external_rsc = 0 else if (isnum(player_age) && player_age < config.notify_new_player_age) message_admins("New user: [key_name_admin(src)] just connected with an age of [player_age] day[(player_age==1?"":"s")]") - - - if (!ticker || ticker.current_state == GAME_STATE_PREGAME) - spawn (rand(10,150)) - if (src) - sync_client_with_db() - else - sync_client_with_db() + + sync_client_with_db() send_resources() From ac820f4ec2200b0009f10687f0b8d0daa90479c5 Mon Sep 17 00:00:00 2001 From: swankcookie Date: Sat, 28 Nov 2015 02:40:03 -0600 Subject: [PATCH 38/62] adds snowman hat and suit to autodrobe --- code/game/machinery/vending.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 9e13b5adca4..d29db61e672 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -873,7 +873,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/item/clothing/suit/whitedress = 1, /obj/item/clothing/under/jester = 1, /obj/item/clothing/head/jester = 1, /obj/item/clothing/suit/hooded/carp_costume = 1, - /obj/item/clothing/suit/hooded/ian_costume = 1) + /obj/item/clothing/suit/hooded/ian_costume = 1, + /obj/item/clothing/suit/snowman = 1, + /obj/item/clothing/head/snowman =1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 2,/obj/item/clothing/glasses/sunglasses/garb = 2) premium = list(/obj/item/clothing/suit/hgpirate = 2, /obj/item/clothing/head/hgpiratecap = 2, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe From 192460d4a94cdae24fed46a17230f4a9b2afb437 Mon Sep 17 00:00:00 2001 From: swankcookie Date: Sat, 28 Nov 2015 02:50:58 -0600 Subject: [PATCH 39/62] fixed space --- code/game/machinery/vending.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d29db61e672..75cf6e6f70f 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -875,7 +875,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /obj/item/clothing/suit/hooded/carp_costume = 1, /obj/item/clothing/suit/hooded/ian_costume = 1, /obj/item/clothing/suit/snowman = 1, - /obj/item/clothing/head/snowman =1) + /obj/item/clothing/head/snowman = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 2,/obj/item/clothing/glasses/sunglasses/garb = 2) premium = list(/obj/item/clothing/suit/hgpirate = 2, /obj/item/clothing/head/hgpiratecap = 2, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe From 0b7b49d8c4f51f01c845532c317502a2bbac10ff Mon Sep 17 00:00:00 2001 From: swankcookie Date: Sat, 28 Nov 2015 03:11:05 -0600 Subject: [PATCH 40/62] fixes issue of missing suit and hat in vendor --- code/game/objects/items/weapons/vending_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index ef6efa237bb..0192ee513a1 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -63,8 +63,8 @@ /obj/item/weapon/vending_refill/autodrobe machine_name = "AutoDrobe" icon_state = "refill_costume" - charges = list(25, 2, 3)// of 75 standard, 6 contraband, 9 premium - init_charges = list(25, 2, 3) + charges = list(27, 2, 3)// of 75 standard, 6 contraband, 9 premium + init_charges = list(27, 2, 3) /obj/item/weapon/vending_refill/clothing machine_name = "ClothesMate" From 847b4c8931151f646a0fee897e572409fa018cb9 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sat, 28 Nov 2015 02:24:19 -0800 Subject: [PATCH 41/62] Update false_alarm.dm --- code/modules/events/false_alarm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 4cca0ecad2c..38cdd546c5c 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -14,7 +14,7 @@ if(E.holidayID || E.wizardevent) continue var/datum/round_event/event = E.typepath - if (initial(E.typepath) < 0) + if(initial(event.announceWhen) <= 0) continue events_list += E From 9fd9e5c21dbacd028f10bb3d32ffbe888c2712e8 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 23 Nov 2015 15:37:34 +0100 Subject: [PATCH 42/62] Makes user explicit in spell code --- code/datums/spell.dm | 26 +- code/datums/spells/area_teleport.dm | 18 +- code/datums/spells/charge.dm | 20 +- code/datums/spells/conjure.dm | 4 +- code/datums/spells/dumbfire.dm | 14 +- code/datums/spells/emplosion.dm | 4 +- code/datums/spells/ethereal_jaunt.dm | 6 +- code/datums/spells/explosion.dm | 2 +- code/datums/spells/genetic.dm | 2 +- code/datums/spells/inflict_handler.dm | 2 +- code/datums/spells/knock.dm | 4 +- code/datums/spells/lichdom.dm | 44 +-- code/datums/spells/lightning.dm | 8 +- code/datums/spells/mime.dm | 2 +- code/datums/spells/projectile.dm | 4 +- code/datums/spells/shapeshift.dm | 2 +- code/datums/spells/summonitem.dm | 30 +- code/datums/spells/touch_attacks.dm | 6 +- code/datums/spells/trigger.dm | 2 +- code/datums/spells/turf_teleport.dm | 6 +- code/datums/spells/wizard.dm | 11 +- .../shadowling/shadowling_abilities.dm | 278 +++++++++--------- .../special_shadowling_abilities.dm | 12 +- .../living/simple_animal/hostile/statue.dm | 6 +- 24 files changed, 256 insertions(+), 257 deletions(-) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 8596b5267fe..29fe4dfd7ed 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -41,6 +41,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/spell_level = 0 //if a spell can be taken multiple times, this raises var/level_max = 4 //The max possible level_max is 4 var/cooldown_min = 0 //This defines what spell quickened four times has as a cooldown. Make sure to set this for every spell + var/player_lock = 1 //If it can be used by simple mobs var/overlay = 0 var/overlay_icon = 'icons/obj/wizard.dmi' @@ -62,9 +63,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) - user << "You shouldn't have this spell! Something's wrong." - return 0 + if(player_lock) + if(!user.mind || !(src in user.mind.spell_list) && !(src in user.mob_spell_list)) + user << "You shouldn't have this spell! Something's wrong." + return 0 + else + if(!(src in user.mob_spell_list)) + return 0 if(user.z == ZLEVEL_CENTCOM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel return 0 @@ -170,8 +175,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) - invocation() - user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name].") + invocation(user) + if(user.ckey) + user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name].") spawn(0) if(charge_type == "recharge" && recharge) start_recharge() @@ -180,7 +186,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(prob(critfailchance)) critfail(targets) else - cast(targets) + cast(targets,user=user) after_cast(targets) /obj/effect/proc_holder/spell/proc/before_cast(list/targets) @@ -227,7 +233,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin smoke.start() -/obj/effect/proc_holder/spell/proc/cast(list/targets) +/obj/effect/proc_holder/spell/proc/cast(list/targets,mob/user = usr) return /obj/effect/proc_holder/spell/proc/critfail(list/targets) @@ -334,7 +340,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin revert_cast(user) return - perform(targets) + perform(targets,user=user) return @@ -349,7 +355,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin revert_cast() return - perform(targets) + perform(targets,user=user) return @@ -418,7 +424,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(!user) revert_cast() return - perform(user) + perform(null,user=user) /obj/effect/proc_holder/spell/self/basic_heal //This spell exists mainly for debugging purposes, and also to show how casting works name = "Lesser Heal" diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 49f19c3a23f..8497a05007a 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -32,8 +32,8 @@ return thearea -/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea) - playsound(get_turf(usr), sound1, 50,1) +/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea,mob/user = usr) + playsound(get_turf(user), sound1, 50,1) for(var/mob/living/target in targets) var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) @@ -67,22 +67,22 @@ if(!success) target.loc = pick(L) - playsound(get_turf(usr), sound2, 50,1) + playsound(get_turf(user), sound2, 50,1) return -/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null) +/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null,mob/user = usr) if(!invocation_area || !chosenarea) ..() else switch(invocation_type) if("shout") - usr.say("[invocation] [uppertext(chosenarea.name)]") - if(usr.gender==MALE) - playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) + user.say("[invocation] [uppertext(chosenarea.name)]") + if(user.gender==MALE) + playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) else - playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) + playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) if("whisper") - usr.whisper("[invocation] [uppertext(chosenarea.name)]") + user.whisper("[invocation] [uppertext(chosenarea.name)]") return diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index 0c7c2800b2b..0b7ba942075 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -12,9 +12,9 @@ include_user = 1 -/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets) - for(var/mob/living/user in targets) - var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand()) +/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr) + for(var/mob/living/L in targets) + var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand()) var/charged_item = null var/burnt_out = 0 for(var/obj/item in hand_items) @@ -38,15 +38,15 @@ if(istype(item, /obj/item/weapon/spellbook/oneuse)) var/obj/item/weapon/spellbook/oneuse/I = item if(prob(80)) - user.visible_message("[I] catches fire!") + L.visible_message("[I] catches fire!") qdel(I) else I.used = 0 charged_item = I break else - user << "Glowing red letters appear on the front cover..." - user << "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]" + L << "Glowing red letters appear on the front cover..." + L << "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]" burnt_out = 1 else if(istype(item, /obj/item/weapon/gun/magic)) var/obj/item/weapon/gun/magic/I = item @@ -86,9 +86,9 @@ charged_item = item break if(!charged_item) - user << "you feel magical power surging to your hands, but the feeling rapidly fades..." + L << "you feel magical power surging to your hands, but the feeling rapidly fades..." else if(burnt_out) - user << "[charged_item] doesn't seem to be reacting to the spell..." + L << "[charged_item] doesn't seem to be reacting to the spell..." else - playsound(get_turf(usr), "sound/magic/Charge.ogg", 50, 1) - user << "[charged_item] suddenly feels very warm!" + playsound(get_turf(L), "sound/magic/Charge.ogg", 50, 1) + L << "[charged_item] suddenly feels very warm!" diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 82320dbc4ca..c6d5f24bf8f 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -15,8 +15,8 @@ var/cast_sound = 'sound/items/welder.ogg' -/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets) - playsound(get_turf(usr), cast_sound, 50,1) +/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets,mob/user = usr) + playsound(get_turf(user), cast_sound, 50,1) for(var/turf/T in targets) if(T.density && !summon_ignore_density) targets -= T diff --git a/code/datums/spells/dumbfire.dm b/code/datums/spells/dumbfire.dm index 66b0dfbe183..38a42ccb037 100644 --- a/code/datums/spells/dumbfire.dm +++ b/code/datums/spells/dumbfire.dm @@ -22,13 +22,13 @@ /obj/effect/proc_holder/spell/dumbfire/choose_targets(mob/user = usr) - var/turf/T = get_turf(usr) + var/turf/T = get_turf(user) for(var/i = 1; i < range; i++) - var/turf/new_turf = get_step(T, usr.dir) + var/turf/new_turf = get_step(T, user.dir) if(new_turf.density) break T = new_turf - perform(list(T)) + perform(list(T),user = user) /obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr) playMagSound() @@ -46,7 +46,7 @@ projectile.dir = get_dir(projectile, target) projectile.name = proj_name - var/current_loc = usr.loc + var/current_loc = user.loc projectile.loc = current_loc @@ -60,12 +60,12 @@ step(projectile, projectile.dir) if(projectile.loc == current_loc || i == proj_lifespan) - projectile.cast(current_loc) + projectile.cast(current_loc,user=user) break - var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - usr + var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - user if(L && L.stat != DEAD) - projectile.cast(L.loc) + projectile.cast(L.loc,user=user) break if(proj_trail && projectile) diff --git a/code/datums/spells/emplosion.dm b/code/datums/spells/emplosion.dm index ce92204f70b..4004237e7fd 100644 --- a/code/datums/spells/emplosion.dm +++ b/code/datums/spells/emplosion.dm @@ -8,8 +8,8 @@ action_icon_state = "emp" sound = "sound/weapons/ZapBang.ogg" -/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets) - playsound(get_turf(usr), sound, 50,1) +/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets,mob/user = usr) + playsound(get_turf(user), sound, 50,1) for(var/mob/living/target in targets) empulse(target.loc, emp_heavy, emp_light) diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 3fd6266d19c..bb0a0d7b8c6 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -15,8 +15,8 @@ var/jaunt_duration = 50 //in deciseconds action_icon_state = "jaunt" -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded - playsound(get_turf(usr), 'sound/magic/Ethereal_Enter.ogg', 50, 1, -1) +/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded + playsound(get_turf(user), 'sound/magic/Ethereal_Enter.ogg', 50, 1, -1) for(var/mob/living/target in targets) target.notransform = 1 //protects the mob from being transformed (replaced) midjaunt and getting stuck in bluespace spawn(0) @@ -50,7 +50,7 @@ jaunt_steam(mobloc) target.canmove = 0 holder.reappearing = 1 - playsound(get_turf(usr), 'sound/magic/Ethereal_Exit.ogg', 50, 1, -1) + playsound(get_turf(user), 'sound/magic/Ethereal_Exit.ogg', 50, 1, -1) sleep(20) jaunt_reappear(animation, target) sleep(5) diff --git a/code/datums/spells/explosion.dm b/code/datums/spells/explosion.dm index 7bb7195c2dd..def7db816f2 100644 --- a/code/datums/spells/explosion.dm +++ b/code/datums/spells/explosion.dm @@ -7,7 +7,7 @@ var/ex_light = 3 var/ex_flash = 4 -/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets,mob/user = usr) for(var/mob/living/target in targets) explosion(target.loc,ex_severe,ex_heavy,ex_light,ex_flash) diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm index 969372b1203..575ab6767ae 100644 --- a/code/datums/spells/genetic.dm +++ b/code/datums/spells/genetic.dm @@ -15,7 +15,7 @@ 6th bit - ? */ -/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets,mob/user = usr) playMagSound() for(var/mob/living/carbon/target in targets) if(!target.dna) diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index e82d3ce2003..fe91ace65a7 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -19,7 +19,7 @@ var/summon_type = null //this will put an obj at the target's location -/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets,mob/user = usr) for(var/mob/living/target in targets) playsound(target,sound, 50,1) diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index 6b772162c7b..647c6a5d7f7 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -12,8 +12,8 @@ action_icon_state = "knock" -/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets) - usr << sound("sound/magic/Knock.ogg") +/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) + user << sound("sound/magic/Knock.ogg") for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) spawn(1) diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index ca80db2b644..0e1042a8d1e 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -34,35 +34,35 @@ ticker.mode.round_ends_with_antag_death = 1 ..() -/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets) - for(var/mob/user in targets) +/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr) + for(var/mob/M in targets) var/list/hand_items = list() - if(iscarbon(user)) - hand_items = list(user.get_active_hand(),user.get_inactive_hand()) + if(iscarbon(M)) + hand_items = list(M.get_active_hand(),M.get_inactive_hand()) if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry marked_item = null return if(stat_allowed) //Death is not my end! - if(user.stat == CONSCIOUS && iscarbon(user)) - user << "You aren't dead enough to revive!" //Usually a good problem to have + if(M.stat == CONSCIOUS && iscarbon(M)) + M << "You aren't dead enough to revive!" //Usually a good problem to have charge_counter = charge_max return if(!marked_item || qdeleted(marked_item)) //Wait nevermind - user << "Your phylactery is gone!" + M << "Your phylactery is gone!" return - var/turf/user_turf = get_turf(user) + var/turf/user_turf = get_turf(M) var/turf/item_turf = get_turf(marked_item) if(user_turf.z != item_turf.z) - user << "Your phylactery is out of range!" + M << "Your phylactery is out of range!" return - if(isobserver(user)) - var/mob/dead/observer/O = user + if(isobserver(M)) + var/mob/dead/observer/O = M O.reenter_corpse() var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf) @@ -72,8 +72,8 @@ lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit) lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head) - lich.real_name = user.mind.name - user.mind.transfer_to(lich) + lich.real_name = M.mind.name + M.mind.transfer_to(lich) lich.hardset_dna(null,null,lich.real_name,null,/datum/species/skeleton) lich << "Your bones clatter and shutter as they're pulled back into this world!" charge_max += 600 @@ -99,15 +99,15 @@ if(ABSTRACT in item.flags || NODROP in item.flags) continue marked_item = item - user << "You begin to focus your very being into the [item.name]..." + M << "You begin to focus your very being into the [item.name]..." break if(!marked_item) - user << "You must hold an item you wish to make your phylactery..." + M << "You must hold an item you wish to make your phylactery..." spawn(50) - if(marked_item.loc != user) //I changed my mind I don't want to put my soul in a cheeseburger! - user << "Your soul snaps back to your body as you drop the [marked_item.name]!" + if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger! + M << "Your soul snaps back to your body as you drop the [marked_item.name]!" marked_item = null return name = "RISE!" @@ -118,11 +118,11 @@ marked_item.name = "Ensouled [marked_item.name]" marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..." marked_item.color = "#003300" - user << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!" - user.set_species(/datum/species/skeleton) - current_body = user.mind.current - if(ishuman(user)) - var/mob/living/carbon/human/H = user + M << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!" + M.set_species(/datum/species/skeleton) + current_body = M.mind.current + if(ishuman(M)) + var/mob/living/carbon/human/H = M H.unEquip(H.wear_suit) H.unEquip(H.head) H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit) diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index da2e4fe3466..ea21b2c8fe5 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -18,7 +18,7 @@ /obj/effect/proc_holder/spell/targeted/lightning/Click() if(!ready && cast_check()) - StartChargeup() + StartChargeup() return 1 /obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr) @@ -27,7 +27,7 @@ Snd = new/sound('sound/magic/lightning_chargeup.ogg',channel = 7) halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) - playsound(get_turf(usr), Snd, 50, 0) + playsound(get_turf(user), Snd, 50, 0) if(do_mob(user,user,100,uninterruptible=1)) if(ready && cast_check(skipcharge=1)) choose_targets() @@ -48,13 +48,13 @@ ready = 0 var/mob/living/carbon/target = targets[1] Snd=sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck? - playsound(get_turf(usr),Snd,50,0)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way. + playsound(get_turf(user),Snd,50,0)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way. if(get_dist(user,target)>range) user << "They are too far away!" Reset(user) return - playsound(get_turf(usr), 'sound/magic/lightningbolt.ogg', 50, 1) + playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1) user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) Bolt(user,target,30,5,user) diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index 6ad4f4243a3..cae1181058e 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -53,7 +53,7 @@ still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" ..() -/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) for(var/mob/living/carbon/human/H in targets) H.mind.miming=!H.mind.miming if(H.mind.miming) diff --git a/code/datums/spells/projectile.dm b/code/datums/spells/projectile.dm index 5439486b935..e12ccde655e 100644 --- a/code/datums/spells/projectile.dm +++ b/code/datums/spells/projectile.dm @@ -38,7 +38,7 @@ projectile.dir = get_dir(target,projectile) projectile.name = proj_name - var/current_loc = usr.loc + var/current_loc = user.loc projectile.loc = current_loc @@ -76,7 +76,7 @@ qdel(trail) if(projectile.loc in range(target.loc,proj_trigger_range)) - projectile.perform(list(target)) + projectile.perform(list(target),user=user) break current_loc = projectile.loc diff --git a/code/datums/spells/shapeshift.dm b/code/datums/spells/shapeshift.dm index 52a6c24785f..1a11d0476a5 100644 --- a/code/datums/spells/shapeshift.dm +++ b/code/datums/spells/shapeshift.dm @@ -15,7 +15,7 @@ var/list/current_shapes = list() var/list/current_casters = list() -/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets,mob/user = usr) for(var/mob/living/M in targets) if(M in current_shapes) Restore(M) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 2f8116ffe6b..9de9508525a 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -15,9 +15,9 @@ action_icon_state = "summons" -/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets) - for(var/mob/living/user in targets) - var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand()) +/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets,mob/user = usr) + for(var/mob/living/L in targets) + var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand()) var/butterfingers = 0 var/message @@ -58,7 +58,7 @@ var/obj/item/organ/internal/organ = item_to_retrive if(organ.owner) // If this code ever runs I will be happy - add_logs(user, organ.owner, "magically removed [organ.name] from", addition="INTENT: [uppertext(user.a_intent)]") + add_logs(L, organ.owner, "magically removed [organ.name] from", addition="INTENT: [uppertext(L.a_intent)]") organ.Remove(organ.owner) else while(!isturf(item_to_retrive.loc) && infinite_recursion < 10) //if it's in something you get the whole thing. @@ -67,7 +67,7 @@ if(issilicon(M)) //Items in silicons warp the whole silicon M.loc.visible_message("[M] suddenly disappears!") - M.loc = user.loc + M.loc = L.loc M.loc.visible_message("[M] suddenly appears!") item_to_retrive = null break @@ -95,22 +95,22 @@ item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly disappears!") - if(user.hand) //left active hand - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) + if(L.hand) //left active hand + if(!L.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) + if(!L.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) butterfingers = 1 else //right active hand - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) + if(!L.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) + if(!L.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) butterfingers = 1 if(butterfingers) - item_to_retrive.loc = user.loc + item_to_retrive.loc = L.loc item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears!") - playsound(get_turf(user),"sound/magic/SummonItems_generic.ogg",50,1) + playsound(get_turf(L),"sound/magic/SummonItems_generic.ogg",50,1) else - item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [user]'s hand!") - playsound(get_turf(user),"sound/magic/SummonItems_generic.ogg",50,1) + item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [L]'s hand!") + playsound(get_turf(L),"sound/magic/SummonItems_generic.ogg",50,1) if(message) - user << message + L << message diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index cd83738c1f7..51fa79bccc7 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -14,10 +14,10 @@ return 0 ..() -/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets) - for(var/mob/living/carbon/user in targets) +/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) + for(var/mob/living/carbon/C in targets) if(!attached_hand) - if(!ChargeHand(user)) + if(!ChargeHand(C)) return 0 while(attached_hand) //hibernate untill the spell is actually used charge_counter = 0 diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm index 3988f3bae16..9c6dc7490f3 100644 --- a/code/datums/spells/trigger.dm +++ b/code/datums/spells/trigger.dm @@ -19,7 +19,7 @@ starting_spells = null return ..() -/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets,mob/user = usr) playMagSound() for(var/mob/living/target in targets) for(var/obj/effect/proc_holder/spell/spell in contents) diff --git a/code/datums/spells/turf_teleport.dm b/code/datums/spells/turf_teleport.dm index 1d2b47f11c0..7010b9bf705 100644 --- a/code/datums/spells/turf_teleport.dm +++ b/code/datums/spells/turf_teleport.dm @@ -11,8 +11,8 @@ var/sound1 = "sound/weapons/ZapBang.ogg" var/sound2 = "sound/weapons/ZapBang.ogg" -/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets) - playsound(get_turf(usr), sound1, 50,1) +/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets,mob/user = usr) + playsound(get_turf(user), sound1, 50,1) for(var/mob/living/target in targets) var/list/turfs = new/list() for(var/turf/T in range(target,outer_tele_radius)) @@ -41,4 +41,4 @@ if(target.buckled_mob) target.unbuckle_mob(force=1) target.loc = picked - playsound(get_turf(usr), sound2, 50,1) + playsound(get_turf(user), sound2, 50,1) diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 028d23d4291..87f896b3f55 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -273,7 +273,7 @@ action_icon_state = "fireball" sound = "sound/magic/Fireball.ogg" -/obj/effect/proc_holder/spell/turf/fireball/cast(turf/T) +/obj/effect/proc_holder/spell/turf/fireball/cast(turf/T,mob/user = usr) explosion(T, -1, 0, 2, 3, 0, flame_range = 2) @@ -303,8 +303,7 @@ action_icon_state = "repulse" -/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets) - var/mob/user = usr +/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr) var/list/thrownatoms = list() var/atom/throwtarget var/distfromcaster @@ -351,9 +350,9 @@ action_icon_state = "tailsweep" action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno/cast(list/targets) - if(istype(usr, /mob/living/carbon)) - var/mob/living/carbon/C = usr +/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno/cast(list/targets,mob/user = usr) + if(istype(user, /mob/living/carbon)) + var/mob/living/carbon/C = user playsound(C.loc, 'sound/voice/hiss5.ogg', 80, 1, 1) C.spin(6,1) ..() diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 18c97414a8c..9d9457f7d7b 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -19,28 +19,28 @@ clothes_req = 0 action_icon_state = "glare" -/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets,mob/user = usr) for(var/mob/living/target in targets) if(!ishuman(target)) - usr << "You may only glare at humans!" + user << "You may only glare at humans!" revert_cast() return - if(!shadowling_check(usr)) + if(!shadowling_check(user)) revert_cast() return if(target.stat) - usr << "[target] must be conscious!" + user << "[target] must be conscious!" revert_cast() return if(is_shadow_or_thrall(target)) - usr << "You cannot glare at allies!" + user << "You cannot glare at allies!" revert_cast() return var/mob/living/carbon/human/M = target - usr.visible_message("[usr]'s eyes flash a blinding red!") + user.visible_message("[user]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") - if(in_range(target, usr)) - target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights..." + if(in_range(target, user)) + target << "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by the heavenly lights..." else //Only alludes to the shadowling if the target is close by target << "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty..." target.Stun(10) @@ -80,11 +80,11 @@ blacklistLuminosity += extinguishItem(F) H.SetLuminosity(blacklistLuminosity) //I hate lightcode for making me do it this way -/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets) - if(!shadowling_check(usr) && !admin_override) +/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets,mob/user = usr) + if(!shadowling_check(user) && !admin_override) revert_cast() return - usr << "You silently disable all nearby lights." + user << "You silently disable all nearby lights." for(var/turf/T in targets) for(var/obj/item/F in T.contents) extinguishItem(F) @@ -95,7 +95,7 @@ for(var/obj/machinery/computer/C in T.contents) C.SetLuminosity(0) C.visible_message("[C] grows dim, its screen barely readable.") - for(var/obj/effect/glowshroom/G in orange(7, usr)) //High radius because glowshroom spam wrecks shadowlings + for(var/obj/effect/glowshroom/G in orange(7, user)) //High radius because glowshroom spam wrecks shadowlings G.visible_message("[G] withers away!") qdel(G) for(var/mob/living/H in T.contents) @@ -142,15 +142,15 @@ action_icon_state = "icy_veins" sound = 'sound/effects/ghost2.ogg' -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets,mob/user = usr) + if(!shadowling_check(user)) revert_cast() return - usr << "You freeze the nearby air." + user << "You freeze the nearby air." for(var/turf/T in targets) for(var/mob/living/carbon/M in T.contents) if(is_shadow_or_thrall(M)) - if(M == usr) //No message for the user, of course + if(M == user) //No message for the user, of course continue else M << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!" @@ -175,79 +175,78 @@ action_icon_state = "enthrall" var/enthralling = 0 -/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets) - var/mob/living/carbon/human/user = usr +/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets,mob/living/carbon/human/user = usr) listclearnulls(ticker.mode.thralls) - if(!(usr.mind in ticker.mode.shadows)) return + if(!(user.mind in ticker.mode.shadows)) return if(user.dna.species.id != "shadowling") if(ticker.mode.thralls.len >= 5) revert_cast() return for(var/mob/living/carbon/human/target in targets) - if(!in_range(usr, target)) - usr << "You need to be closer to enthrall [target]!" + if(!in_range(user, target)) + user << "You need to be closer to enthrall [target]!" revert_cast() return if(!target.key || !target.mind) - usr << "The target has no mind!" + user << "The target has no mind!" revert_cast() return if(target.stat) - usr << "The target must be conscious!" + user << "The target must be conscious!" revert_cast() return if(is_shadow_or_thrall(target)) - usr << "You can not enthrall allies!" + user << "You can not enthrall allies!" revert_cast() return if(!ishuman(target)) - usr << "You can only enthrall humans!" + user << "You can only enthrall humans!" revert_cast() return if(enthralling) - usr << "You are already enthralling!" + user << "You are already enthralling!" revert_cast() return if(!target.client) - usr << "[target]'s mind is vacant of activity." + user << "[target]'s mind is vacant of activity." enthralling = 1 - usr << "This target is valid. You begin the enthralling..." - target << "[usr] stares at you. You feel your head begin to pulse." + user << "This target is valid. You begin the enthralling..." + target << "[user] stares at you. You feel your head begin to pulse." for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) - usr << "You place your hands to [target]'s head..." - usr.visible_message("[usr] places their hands onto the sides of [target]'s head!") + user << "You place your hands to [target]'s head..." + user.visible_message("[user] places their hands onto the sides of [target]'s head!") if(2) - usr << "You begin preparing [target]'s mind as a blank slate..." - usr.visible_message("[usr]'s palms flare a bright red against [target]'s temples!") + user << "You begin preparing [target]'s mind as a blank slate..." + user.visible_message("[user]'s palms flare a bright red against [target]'s temples!") target << "A terrible red light floods your mind. You collapse as conscious thought is wiped away." target.Weaken(12) sleep(20) if(isloyal(target)) - usr << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time." - usr.visible_message("[usr] pauses, then dips their head in concentration!") + user << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time." + user.visible_message("[user] pauses, then dips their head in concentration!") target << "You feel your loyalties begin to weaken!" sleep(100) //10 seconds - not spawn() so the enthralling takes longer - usr << "The nanobots composing the loyalty implant have been rendered inert. Now to continue." - usr.visible_message("[user] relaxes again.") + user << "The nanobots composing the loyalty implant have been rendered inert. Now to continue." + user.visible_message("[user] relaxes again.") for(var/obj/item/weapon/implant/loyalty/L in target) if(L && L.implanted) qdel(L) target << "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies." if(3) - usr << "You begin planting the tumor that will control the new thrall..." - usr.visible_message("A strange energy passes from [usr]'s hands into [target]'s head!") + user << "You begin planting the tumor that will control the new thrall..." + user.visible_message("A strange energy passes from [user]'s hands into [target]'s head!") target << "You feel your memories twisting, morphing. A sense of horror dominates your mind." - if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a loyalty implant - usr << "The enthralling has been interrupted - your target's mind returns to its previous state." - target << "You wrest yourself away from [usr]'s hands and compose yourself" + if(!do_mob(user, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a loyalty implant + user << "The enthralling has been interrupted - your target's mind returns to its previous state." + target << "You wrest yourself away from [user]'s hands and compose yourself" enthralling = 0 return enthralling = 0 - usr << "You have enthralled [target.real_name]!" + user << "You have enthralled [target.real_name]!" target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out @@ -264,7 +263,7 @@ clothes_req = 0 action_icon_state = "commune" -/obj/effect/proc_holder/spell/self/shadowling_hivemind/cast(mob/living/user) +/obj/effect/proc_holder/spell/self/shadowling_hivemind/cast(mob/living/user,mob/user = usr) if(!is_shadow(user)) user << "You must be a shadowling to do that!" return @@ -273,7 +272,7 @@ return for(var/mob/M in mob_list) if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Shadowling\] [usr.real_name]: [text]" + M << "\[Shadowling\] [user.real_name]: [text]" /obj/effect/proc_holder/spell/self/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor @@ -293,13 +292,13 @@ user.visible_message("[user]'s skin suddenly bubbles and shifts around their body!", \ "You regenerate your protective armor and cleanse your form of defects.") user.adjustCloneLoss(user.getCloneLoss()) - user.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) - user.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes) - user.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit) - user.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head) - user.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) - user.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) - user.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) + user.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(user), slot_w_uniform) + user.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(user), slot_shoes) + user.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), slot_wear_suit) + user.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), slot_head) + user.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves) + user.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask) + user.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(user), slot_glasses) user.set_species(/datum/species/shadow/ling) @@ -362,8 +361,8 @@ user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." else if(thralls >= victory_threshold) - usr << "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls." - usr << "You may find Ascendance in the Shadowling Evolution tab." + user << "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls." + user << "You may find Ascendance in the Shadowling Evolution tab." for(M in living_mob_list) if(is_shadow(M)) var/obj/effect/proc_holder/spell/self/collective_mind/CM @@ -372,7 +371,7 @@ qdel(CM) M.mind.remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hatch) M.mind.AddSpell(new /obj/effect/proc_holder/spell/self/shadowling_ascend(null)) - if(M == usr) + if(M == user) M << "You project this power to the rest of the shadowlings." else M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)" //Tells all the other shadowlings @@ -440,15 +439,15 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell action_icon_state = "screech" sound = 'sound/effects/screech.ogg' -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets,mob/user = usr) + if(!shadowling_check(user)) revert_cast() return - usr.audible_message("[usr] lets out a horrible scream!") + user.audible_message("[user] lets out a horrible scream!") for(var/turf/T in targets) for(var/mob/target in T.contents) if(is_shadow_or_thrall(target)) - if(target == usr) //No message for the user, of course + if(target == user) //No message for the user, of course continue else continue @@ -482,32 +481,32 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell var/targetsDrained var/list/nearbyTargets -/obj/effect/proc_holder/spell/aoe_turf/drain_life/cast(list/targets, mob/living/carbon/human/U = usr) - if(!shadowling_check(U)) +/obj/effect/proc_holder/spell/aoe_turf/drain_life/cast(list/targets, mob/living/carbon/human/user = usr) + if(!shadowling_check(user)) revert_cast() return targetsDrained = 0 nearbyTargets = list() for(var/turf/T in targets) for(var/mob/living/carbon/M in T.contents) - if(M == usr) continue + if(M == user) continue targetsDrained++ nearbyTargets.Add(M) if(!targetsDrained) revert_cast() - usr << "There were no nearby humans for you to drain." + user << "There were no nearby humans for you to drain." return for(var/mob/living/carbon/M in nearbyTargets) - U.heal_organ_damage(10, 10) - U.adjustToxLoss(-10) - U.adjustOxyLoss(-10) - U.adjustStaminaLoss(-20) - U.AdjustWeakened(-1) - U.AdjustStunned(-1) + user.heal_organ_damage(10, 10) + user.adjustToxLoss(-10) + user.adjustOxyLoss(-10) + user.adjustStaminaLoss(-20) + user.AdjustWeakened(-1) + user.AdjustStunned(-1) M.adjustOxyLoss(20) M.adjustStaminaLoss(20) M << "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!" - usr << "You draw life from those around you to heal your wounds." + user << "You draw life from those around you to heal your wounds." /obj/effect/proc_holder/spell/targeted/revive_thrall //Completely revives a dead thrall @@ -521,20 +520,20 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell include_user = 0 action_icon_state = "revive_thrall" -/obj/effect/proc_holder/spell/targeted/revive_thrall/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/targeted/revive_thrall/cast(list/targets,mob/user = usr) + if(!shadowling_check(user)) revert_cast() return for(var/mob/living/carbon/human/thrallToRevive in targets) - var/choice = alert(usr,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel") + var/choice = alert(user,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel") switch(choice) if("Empower") if(!is_thrall(thrallToRevive)) - usr << "[thrallToRevive] is not a thrall." + user << "[thrallToRevive] is not a thrall." revert_cast() return if(thrallToRevive.stat != CONSCIOUS) - usr << "[thrallToRevive] must be conscious to become empowered." + user << "[thrallToRevive] must be conscious to become empowered." revert_cast() return var/empowered_thralls = 0 @@ -545,21 +544,21 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell if(H.dna.species.id == "l_shadowling") empowered_thralls++ if(empowered_thralls >= EMPOWERED_THRALL_LIMIT) - usr << "You cannot spare this much energy. There are too many empowered thralls." + user << "You cannot spare this much energy. There are too many empowered thralls." revert_cast() return - usr.visible_message("[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \ + user.visible_message("[user] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \ "You place your hands on [thrallToRevive]'s face and begin gathering energy...") - thrallToRevive << "[usr] places their hands over your face. You feel energy gathering. Stand still..." - if(!do_mob(usr, thrallToRevive, 80)) - usr << "Your concentration snaps. The flow of energy ebbs." + thrallToRevive << "[user] places their hands over your face. You feel energy gathering. Stand still..." + if(!do_mob(user, thrallToRevive, 80)) + user << "Your concentration snaps. The flow of energy ebbs." revert_cast() return - usr << "You release a massive surge of power into [thrallToRevive]!" - usr.visible_message("Red lightning surges into [thrallToRevive]'s face!") + user << "You release a massive surge of power into [thrallToRevive]!" + user.visible_message("Red lightning surges into [thrallToRevive]'s face!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) - usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) + user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) thrallToRevive.Weaken(5) thrallToRevive.visible_message("[thrallToRevive] collapses, their skin and face distorting!", \ "AAAAAAAAAAAAAAAAAAAGH-") @@ -574,25 +573,25 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/self/shadow_walk(null)) if("Revive") if(!is_thrall(thrallToRevive)) - usr << "[thrallToRevive] is not a thrall." + user << "[thrallToRevive] is not a thrall." revert_cast() return if(thrallToRevive.stat != DEAD) - usr << "[thrallToRevive] is not dead." + user << "[thrallToRevive] is not dead." revert_cast() return - usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \ + user.visible_message("[user] kneels over [thrallToRevive], placing their hands on \his chest.", \ "You crouch over the body of your thrall and begin gathering energy...") thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive) - if(!do_mob(usr, thrallToRevive, 30)) - usr << "Your concentration snaps. The flow of energy ebbs." + if(!do_mob(user, thrallToRevive, 30)) + user << "Your concentration snaps. The flow of energy ebbs." revert_cast() return - usr << "You release a massive surge of power into [thrallToRevive]!" - usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!") + user << "You release a massive surge of power into [thrallToRevive]!" + user.visible_message("Red lightning surges from [user]'s hands into [thrallToRevive]'s chest!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) - usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) + user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) sleep(10) thrallToRevive.revive() thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes.", \ @@ -615,8 +614,8 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell charge_max = 600 action_icon_state = "extend_shuttle" -/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/living/carbon/human/U = usr) - if(!shadowling_check(U)) +/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/living/carbon/human/user = usr) + if(!shadowling_check(user)) revert_cast() return for(var/mob/living/carbon/human/target in targets) @@ -624,23 +623,23 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell revert_cast() return if(!is_thrall(target)) - usr << "[target] must be a thrall." + user << "[target] must be a thrall." revert_cast() return if(SSshuttle.emergency.mode != SHUTTLE_CALL) - usr << "The shuttle must be inbound only to the station." + user << "The shuttle must be inbound only to the station." revert_cast() return var/mob/living/carbon/human/M = target - U.visible_message("[U]'s eyes flash a bright red!", \ + user.visible_message("[user]'s eyes flash a bright red!", \ "You begin to draw [M]'s life force.") M.visible_message("[M]'s face falls slack, their jaw slightly distending.", \ "You are suddenly transported... far, far away...") - if(!do_after(U, 50, target = M)) + if(!do_after(user, 50, target = M)) M << "You are snapped back to reality, your haze dissipating!" - U << "You have been interrupted. The draw has failed." + user << "You have been interrupted. The draw has failed." return - U << "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!" + user << "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!" M.visible_message("[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.", \ "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") M.death() @@ -650,7 +649,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell timer += more_minutes priority_announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes..", "System Failure", 'sound/misc/notice1.ogg') SSshuttle.emergency.setTimer(timer) - U.mind.spell_list.Remove(src) //Can only be used once! + user.mind.spell_list.Remove(src) //Can only be used once! qdel(src) @@ -666,25 +665,25 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell clothes_req = 0 action_icon_state = "glare" -/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets,mob/user = usr) for(var/mob/living/target in targets) if(!ishuman(target) || !target) - usr << "You nay only glare at humans!" + user << "You nay only glare at humans!" revert_cast() return if(target.stat) - usr << "[target] must be conscious!" + user << "[target] must be conscious!" revert_cast() return if(is_shadow_or_thrall(target)) - usr << "You cannot glare at allies!" + user << "You cannot glare at allies!" revert_cast() return var/mob/living/carbon/human/M = target - usr.visible_message("[usr]'s eyes flash a bright red!") + user.visible_message("[user]'s eyes flash a bright red!") target.visible_message("[target] freezes in place, their eyes clouding...") - if(in_range(target, usr)) - target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are starstruck by the heavenly lights..." + if(in_range(target, user)) + target << "Your gaze is forcibly drawn into [user]'s eyes, and you are starstruck by the heavenly lights..." else //Only alludes to the shadowling if the target is close by target << "Red lights suddenly dance in your vision, and you are starstruck by their heavenly beauty..." target.Stun(5) //Roughly 50% as long as the normal one @@ -749,7 +748,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell return for(var/mob/M in mob_list) if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Thrall\] [usr.real_name]: [text]" + M << "\[Thrall\] [user.real_name]: [text]" log_say("[user.real_name]/[user.key] : [text]") @@ -766,19 +765,17 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell action_icon_state = "annihilate" sound = 'sound/magic/Staff_Chaos.ogg' -/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr - if(SHA.phasing) - usr << "You are not in the same plane of existence. Unphase first." +/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets,mob/living/simple_animal/ascendant_shadowling/user = usr) + if(user.phasing) + user << "You are not in the same plane of existence. Unphase first." revert_cast() return - for(var/mob/living/boom in targets) if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. - usr << "Making an ally explode seems unwise." + user << "Making an ally explode seems unwise." revert_cast() return - usr.visible_message("[usr]'s markings flare as they gesture at [boom]!", \ + user.visible_message("[user]'s markings flare as they gesture at [boom]!", \ "You direct a lance of telekinetic energy into [boom].") sleep(4) if(iscarbon(boom)) @@ -796,32 +793,31 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell clothes_req = 0 action_icon_state = "enthrall" -/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr - if(SHA.phasing) +/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets,mob/living/simple_animal/ascendant_shadowling/user = usr) + if(user.phasing) revert_cast() - usr << "You are not in the same plane of existence. Unphase first." + user << "You are not in the same plane of existence. Unphase first." return for(var/mob/living/carbon/human/target in targets) if(is_shadow_or_thrall(target)) - usr << "You cannot enthrall an ally." + user << "You cannot enthrall an ally." revert_cast() return if(!target.ckey || !target.mind) - usr << "The target has no mind." + user << "The target has no mind." revert_cast() return if(target.stat) - usr << "The target must be conscious." + user << "The target must be conscious." revert_cast() return if(!ishuman(target)) - usr << "You can only enthrall humans." + user << "You can only enthrall humans." revert_cast() return - usr << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall." + user << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall." target << "An agonizing spike of pain drives into your mind, and--" target.mind.special_role = "thrall" ticker.mode.add_thrall(target.mind) @@ -835,20 +831,19 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell clothes_req = 0 action_icon_state = "shadow_walk" -/obj/effect/proc_holder/spell/self/shadowling_phase_shift/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr - for(SHA in targets) - SHA.phasing = !SHA.phasing - if(SHA.phasing) - SHA.visible_message("[SHA] suddenly vanishes!", \ +/obj/effect/proc_holder/spell/self/shadowling_phase_shift/cast(list/targets,mob/living/simple_animal/ascendant_shadowling/user = usr) + for(user in targets) + user.phasing = !user.phasing + if(user.phasing) + user.visible_message("[user] suddenly vanishes!", \ "You begin phasing through planes of existence. Use the ability again to return.") - SHA.incorporeal_move = 1 - SHA.alpha = 0 + user.incorporeal_move = 1 + user.alpha = 0 else - SHA.visible_message("[SHA] suddenly appears from nowhere!", \ + user.visible_message("[user] suddenly appears from nowhere!", \ "You return from the space between worlds.") - SHA.incorporeal_move = 0 - SHA.alpha = 255 + user.incorporeal_move = 0 + user.alpha = 255 /obj/effect/proc_holder/spell/aoe_turf/ascendant_storm //Releases bolts of lightning to everyone nearby @@ -861,13 +856,12 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell action_icon_state = "lightning_storm" sound = 'sound/magic/lightningbolt.ogg' -/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr - if(SHA.phasing) - usr << "You are not in the same plane of existence. Unphase first." +/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets,mob/living/simple_animal/ascendant_shadowling/user = usr) + if(user.phasing) + user << "You are not in the same plane of existence. Unphase first." revert_cast() return - usr.visible_message("A massive ball of lightning appears in [usr]'s hands and flares out!", \ + user.visible_message("A massive ball of lightning appears in [user]'s hands and flares out!", \ "You conjure a ball of lightning and release it.") for(var/turf/T in targets) @@ -878,7 +872,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell playsound(target, 'sound/magic/LightningShock.ogg', 50, 1) target.Weaken(8) target.take_organ_damage(0,50) - usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) + user.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) /obj/effect/proc_holder/spell/self/shadowling_hivemind_ascendant //Large, all-caps text in shadowling chat @@ -896,5 +890,5 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell text = "[text]" for(var/mob/M in mob_list) if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Ascendant\] [usr.real_name]: [text]" //Bigger text for ascendants. + M << "\[Ascendant\] [user.real_name]: [text]" //Bigger text for ascendants. log_say("[user.real_name]/[user.key] : [text]") diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 9b1c0835efc..b696426ba03 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -9,8 +9,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N clothes_req = 0 action_icon_state = "hatch" -/obj/effect/proc_holder/spell/self/shadowling_hatch/cast(mob/living/carbon/human/H) - if(usr.stat || !ishuman(usr) || !usr || !is_shadow(usr)) return +/obj/effect/proc_holder/spell/self/shadowling_hatch/cast(mob/living/carbon/human/H,mob/user = usr) + if(user.stat || !ishuman(user) || !user || !is_shadow(user)) return var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") switch(hatch_or_no) if("No") @@ -27,8 +27,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(50) var/turf/simulated/floor/F - var/turf/shadowturf = get_turf(usr) - for(F in orange(1, usr)) + var/turf/shadowturf = get_turf(user) + for(F in orange(1, user)) new /obj/structure/alien/resin/wall/shadowling(F) for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky qdel(R) @@ -60,7 +60,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N var/newNameId = pick(possibleShadowlingNames) possibleShadowlingNames.Remove(newNameId) H.real_name = newNameId - H.name = usr.real_name + H.name = user.real_name H.SetStunned(0) H << "YOU LIVE!!!" @@ -107,7 +107,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N clothes_req = 0 action_icon_state = "ascend" -/obj/effect/proc_holder/spell/self/shadowling_ascend/cast(mob/living/carbon/human/H) +/obj/effect/proc_holder/spell/self/shadowling_ascend/cast(mob/living/carbon/human/H,mob/user = usr) if(!shadowling_check(H)) return var/hatch_or_no = alert(H,"It is time to ascend. Are you sure about this?",,"Yes","No") diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index d5b8135442b..b16d811e5ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -163,7 +163,7 @@ clothes_req = 0 range = 14 -/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets,mob/user = usr) for(var/turf/T in targets) for(var/obj/machinery/light/L in T) L.flicker() @@ -179,7 +179,7 @@ clothes_req = 0 range = 10 -/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets,mob/user = usr) for(var/mob/living/L in living_mob_list) var/turf/T = get_turf(L.loc) if(T && T in targets) @@ -198,7 +198,7 @@ range = -1 include_user = 1 -/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets,mob/user = usr) for(var/mob/living/target in targets) if(istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target From b14e9133d289d80d151b9fe69908e9b10e78c994 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 23 Nov 2015 16:14:21 +0100 Subject: [PATCH 43/62] Academy Update --- _maps/RandomZLevels/Academy.dmm | 91 +++--- code/datums/spells/lightning.dm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 5 + .../awaymissions/mission_code/Academy.dm | 268 +++++++++++++++++- .../mob/living/simple_animal/corpse.dm | 9 +- .../living/simple_animal/hostile/wizard.dm | 79 ++++++ .../mapGenerators/syndicate.dm | 2 +- icons/mob/animal.dmi | Bin 196410 -> 200373 bytes tgstation.dme | 1 + 9 files changed, 415 insertions(+), 42 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/wizard.dm diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index e4cda266055..35db5c812c6 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -22,7 +22,7 @@ "av" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aw" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "ax" = (/obj/structure/bed/stool,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) -"ay" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"ay" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/mirror/magic/lesser{pixel_y = 32},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "az" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/stack/sheet/animalhide/monkey,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aA" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aB" = (/obj/structure/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) @@ -30,10 +30,10 @@ "aD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aE" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aF" = (/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) -"aG" = (/obj/structure/safe/floor,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"aG" = (/obj/structure/safe/floor,/obj/item/voodoo,/obj/item/weapon/gun/magic/wand/fireball,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aI" = (/obj/structure/table/reinforced,/obj/item/device/laser_pointer/upgraded,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) -"aJ" = (/obj/structure/cult/tome,/obj/item/weapon/staff,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"aJ" = (/obj/structure/cult/tome,/obj/item/weapon/dice/d20/fate,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aK" = (/obj/structure/bed/chair/wood/wings{dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aL" = (/obj/item/clothing/suit/space/hardsuit/wizard,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) @@ -94,7 +94,7 @@ "bP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/academy/headmaster) "bQ" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/headmaster) "bR" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/awaymission/academy/headmaster) -"bS" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/academy/headmaster) +"bS" = (/obj/structure/academy_wizard_spawner,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "bT" = (/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/academy/headmaster) "bU" = (/obj/machinery/autolathe,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "bV" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/awaymission/academy/classrooms) @@ -136,7 +136,7 @@ "cF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "cG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/academy/headmaster) "cH" = (/obj/structure/sign/nosmoking_1,/turf/simulated/wall,/area/awaymission/academy/headmaster) -"cI" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) +"cI" = (/obj/structure/divine/trap/damage,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "cJ" = (/obj/item/stack/sheet/metal,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "cK" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/academy/classrooms) "cL" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/academy/headmaster) @@ -178,7 +178,7 @@ "dv" = (/obj/item/seeds/eggyseed,/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dw" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dx" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/academy/classrooms) -"dy" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/landmark{name = "awaystart"},/obj/item/weapon/weldingtool,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) +"dy" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel,/area/awaymission/academy/headmaster) "dz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "dA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "dB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) @@ -301,14 +301,14 @@ "fO" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/academyaft) "fP" = (/turf/simulated/floor/plasteel{icon_state = "vault"},/area/awaymission/academy/classrooms) "fQ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "vault"},/area/awaymission/academy/classrooms) -"fR" = (/obj/structure/bed/chair,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/awaymission/academy/classrooms) +"fR" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/academy/classrooms) "fS" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms) "fT" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/academy/classrooms) "fU" = (/obj/item/target,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "fV" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "fW" = (/obj/structure/target_stake,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "fX" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) -"fY" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) +"fY" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/academy/classrooms) "fZ" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "ga" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/academy/classrooms) "gb" = (/obj/structure/table,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) @@ -399,7 +399,7 @@ "hI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) "hJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) "hK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/weapon/caution,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/academy/academyaft) -"hL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/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/awaymission/academy/academyaft) +"hL" = (/obj/structure/mecha_wreckage/durand,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "hM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "hN" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft) "hO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/academy/academyaft) @@ -442,7 +442,7 @@ "iz" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) "iA" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) "iB" = (/obj/structure/rack,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) -"iC" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) +"iC" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "iD" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) "iE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/rack,/obj/item/stack/sheet/metal,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "iF" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) @@ -481,7 +481,7 @@ "jm" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) "jn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "white"; dir = 4},/area/awaymission/academy/academyaft) "jo" = (/obj/structure/table,/obj/item/organ/internal/brain{name = "The preserved brain of Harry Houdini"},/turf/simulated/floor/plasteel/airless{icon_state = "whitered"; dir = 4},/area/awaymission/academy/academyaft) -"jp" = (/obj/effect/landmark{name = "awaystart"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/awaymission/academy/academyaft) +"jp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/item/weapon/weldingtool,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "jq" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/awaymission/academy/academyaft) "jr" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/academy/academyaft) "js" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel/airless{icon_state = "white"; dir = 4},/area/awaymission/academy/academyaft) @@ -534,7 +534,7 @@ "kn" = (/obj/machinery/gateway{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "ko" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "kp" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) -"kq" = (/obj/structure/cable,/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"kq" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/academy/classrooms) "kr" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "ks" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) "kt" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) @@ -543,6 +543,21 @@ "kw" = (/obj/machinery/button/door{id = "AcademyGate"; pixel_y = -24},/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission/academy/academygate) "kx" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission/academy/academygate) "ky" = (/obj/machinery/door/poddoor/shutters{id = "AcademyGate"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaymission/academy/academygate) +"kz" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/carpet,/area/awaymission/academy/classrooms) +"kA" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{icon_state = "escape"; dir = 6},/area/awaymission/academy/classrooms) +"kB" = (/obj/structure/bed/chair,/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/awaymission/academy/classrooms) +"kC" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) +"kD" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) +"kE" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) +"kF" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) +"kG" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft) +"kH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/awaymission/academy/academyaft) +"kI" = (/obj/structure/cable,/obj/machinery/gateway/centeraway{calibrated = 1},/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"kJ" = (/obj/structure/mecha_wreckage/honker,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) +"kK" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/item/weapon/book/manual/ripley_build_and_repair,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) +"kL" = (/obj/item/weapon/bikehorn,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) +"kM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/divine/trap/chill,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft) +"kN" = (/obj/structure/divine/trap/fire,/turf/simulated/floor/engine,/area/awaymission/academy/academyaft) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -571,12 +586,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacarahahasasatasasasauavawacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasayazaAaBasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaCahaDasaEaFaFaGasaHahaIacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasaJaKaFaLasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasaJaKbSaLasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaMahahasasasasasasapahakacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNahahahahaOahalanavahafacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahahahahahapahahahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPababababaQababaRababababaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaTaFaFahaFaFapaFaFasabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaTaFaFcIaFaFapaFaFasabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaFaFaFahaFaUavaFaFaFabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPacaFahahahaVapahahahaWacaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaXahahaYaZbabbahahbcabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -586,31 +601,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaSaSaSaSaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaPaaaaabasasasasbpbqasasasasabaaaaaPaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaaPaaaaabbrbrbrbrahapbrbrbrbrabaaaaaPaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsbtbubvbvbwbtbsbsbsbsbsbsbsbsbsbsabbrbxbybrahapbrbxbybrababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaabsbsbzbAbBbBbCbzbDbEbFbGbGbGbGbGbGbHasbIbJbKbrahapbrbJbKbLasbMbNbObPbQbRbSbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbUbzbBbBbBbBbVbzbEbWbXbYbZbZcabZbWasbrcbccbrahapbrbrbrbrabcdcecdasascfbTcgchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscibzbBcjbBbBbzbzbEbWbZbZbZbXbZbZbWasbrbrbrbrahapahahahahckclcmcnascocfbTbScpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscqbVbBbBbBbBbzcrbEcsbZbZbZbZbZbZcsasbrctctbrahapcuahcuahabcdcecdcvcwcxbTbTcyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsczbzbBbBbBbBbzbzbEcAcBbZbZbZbZbZcCasbrcDcDbrahcEanananancFbOcGclcHascfbTbScpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscIbzbBbBcJbBbzbVbEcAcKcKcKcKcKcKcCasbrcLbrbrahapbrbrbrbrabcdclcdclcdcfcgbTchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscMbzcNbBbBcObzbVbEcPcQcQcQcQcQcQcRascSbxbybrahapbrbxbybLascTcdclcUcVcWbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaabsbsbzbAbBbBbCbzbDbEbFbGbGbGbGbGbGbHasbIbJbKbrahapbrbJbKbLasbMbNbObPbQbRbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbUbzbBbBbBbBbVbzbEbWbXbYbZbZcabZbWasbrcbccbrahapbrdybrbrabcdcecdasascfbTcgchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscibzbBcjhLbBbzbzbEbWbZbZbZbXbZbZbWasbrbrbrbrahapahahahahckclcmcnascocfbTbTcpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscqbVbBbBbBbBbzcrbEcsbZbZbZbZbZbZcsasbrctctdyahapcuahcuahabcdcecdcvcwcxbTbTcyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsczbzkJbBbBbBbzbzbEcAcBbZbZbZbZbZcCasbrcDcDbrahcEanananancFbOcGclcHascfbTbTcpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabskKbzkLbBcJbBbzbVbEcAcKcKcKcKfRcKcCasbrcLbrbrahapbrdybrbrabcdclcdclcdcfcgbTchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscMbzcNbBbBcObzbVbEcPcQfYcQcQcQcQcRascSbxbybriCapbrbxbybLascTcdclcUcVcWbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscXcYcZcZcZcZdabzbEdbdcdcdcdcdcdcddasbrbJbKbrahapbrbJbKbrasasasasasasasasasabbsbsbsbsbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebVbVbzcMbzbEdcdcdfdcdfdcdgdcasbrbrbrbrahapbrbrbrbrasdhdidjdkdidididjdidlbEdmdmdnbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdodpdqbVbzbzcMdrbEdcdcdsdcdsdcdsdcasaFaFaFaFahapaFaFaFaFasdtdudvbzdudwbzbzbzdxbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdydzdAcYcYcYdBbzbEdcdcdcdcdfdcdfdcasaFdCdCaFahapaFdCdCaFasdtbzbzbzbzbzbzdDdEdxdFdmdmdmdGbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsjpdzdAcYcYcYdBbzbEdcdcdcdcdfdcdfdcasaFdCdCaFahapaFdCdCaFasdtbzbzbzbzbzbzdDdEdxdFdmdmdmdGbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdHdpdIbVbzbzcMbzbEdcdcdcdcdsdcdsdcasaFdCdCaFahapaFdCdCaFasdtdudwbzdudJbzdKdLdxbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebzbVbzcMbzbEdcdcdcdcdcdcdcdcasaFdCdCaFahapaFdCdCaFasdtbzbzbzbzbzbzdMdNdOdPdQdRdmdSbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbEbEbEdTdUbEbEbEdVdVbEbEbEbEbEasasasasasahapasasasasasdtdudwbzbzdWbzbzdXdxbEdYdZdmdSbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabseaeabsebecedeeefegeheiejejejejejekejehejejejejelemejejejejbEeneoeoeoeoeobzbzepeqbEdYdZdmerbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsesesbseteueveeefejejejejejejejejewejejejejejejejewejejejejbEbEbEbEbEbEbEexexbEbEbEbEeybEbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaezeAbBbBeBbzeCbzbzefejelelelelelelelemelelelelelelelemelelelejbEeDeDeDeEeFeDeDeDeDeGeHeHeIeHbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeJbsbBbBeseKeKeKeLefejeleMeNeleMeNeleOeNeleMeNeleMeNemeMeNelePbEeDeDeDeQeDeDeDeDeDeReHeHeIeSbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeJbsbBbBeseTeTeTeUefejeleVeWeleVeWeleXeWeleVeWeleVeWemeVeWelejeYeDeDeDeZeDeEeDeDeDeGeHeHeIfabsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeJbsbBbBeseKkqeKeLefejeleMeNeleMeNeleOeNeleMeNkzeMeNemeMeNelePbEeDeDeDeQeDkAeDeDeDeReHeHeIeSbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeJbsbBbBeseTeTeTeUefejeleVeWkzeVeWeleXeWeleVeWeleVeWemeVeWelejeYeDeDeDeZeDeEeDeDeDeGeHeHeIfabsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbeAbBbBeBbzfcbzbzefejelelelelelelelemelelelfdfefefefffefefefgfhfifififififjfifififkflflfmfnbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsesesbsfoeufpeeefejejejejejejejejewejejejewejejejejejejejejbEeDfqfrfseDeZeDeDeDeGeHeHeHftbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsesesbsfoeufpeeefejejejejejejejejewejejejewejejejejejejejejbEeDfqfrfseDeZeDkAeDeGeHeHeHftbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabseaeabsfufvfweefxfyfgfgfgfgfzejejfAfgfgfgfBelejejelelejejejbEeDeDeDeDfCeDeDeDeDeGeHeHeHbsbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbsbsbEdTdUbEbEbEbEbEesesesesbEbEfDfEfFfDfDfFfFfDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbsbsaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBbBfGfHfIfJfKfKfLbEfMdcdcdcdcdcbEfNfEfFfNfNfFfFfObEfPfQfRfPfPcAfSfTfUfVbzbzfWbsbsaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfXfYbBfZgabzbzbzgbgcbEdcgddcgegfdcggghgifFfNfNfFfFfNbEgjgkglgmgjcAbzgnbzbzbzbzbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBbBfGfHfIfJfKfKfLbEfMdcdcdcdcdcbEfNfEfFfNfNfFfFfObEfPfQkBfPfPcAfSfTfUfVbzbzfWbsbsaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfXbBbBfZgabzbzbzgbgcbEdcgddcgegfdcggghgifFfNfNfFfFfNbEgjgkglgmgjcAbzgnbzbzbzbzbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsgobBbBgpgabzgqbzbzgrbEdcdfdcdcdcdcgsfNfFfFfNfNfFfFfNbEgjgtgjgjgjcAfSfTbzbzfWbsbsaPaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgugugufZgabzdubzbzgvbEgwdsdcgfgxdcgsfNfFfFfNfNfFfFgybEgzgtgjgjgjcAbzgAbzgBbsbsaPaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgCgCgCfZgabzgDbzgqgrbEdcgddcdcdcdcgEghgFgGfNfNfFfFfNbEgjgtgHgIgJcAgKfTfWbsbsaPaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -618,23 +633,23 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsgQbBbBfZgabzgqbzgqgrbEdcdsdcdcdcdcgRfFfFgSghghgFgFgFgTgUgVgJgJgWcAgXbsbsaPaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBgLgYgZhahbhahbdmbEdcdcdcdcdcdcbEfNfFfEfNfNfFfFfNbEgjgjgOgOgOcAbsbsaPaaaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchchchchchchchchchchcfDfDfDfDfDfDfDfDfDhdfDfDhefDfDfDfDfDfDfDfDfDhchchchchchchchchchchchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhghhhhhihjhkhlhchmhchnhohohphohohqfFfFfEfFfFfFfFfFhnhohohphohohrhchmhchshthuhvhwhxhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhyhzhhhAhohBhChDhEhDhFhGhGhGhGhGhHgFgFhIhJgFgFgFgFhFhGhGhGhGhGhKhDhLhDhjhMhshohfhfhNhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhghhhhhihjhkhlhchmhchnhohohphohohqfFkCfEfFfFfFfFfFhnhohohphohohrhchmhchshthuhvhwhxhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhyhzhhhAhohBhChDhEhDhFhGhGhGhGhGhHgFgFhIhJgFgFgFgFhFhGhGhGhGhGhKhDkMhDhjhMhshohfhfhNhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhOhfhfhPhshshQhchRhchnhShThUhVhWfDhXhXhXfEfFhXhXhXfDhYhZiaibichqhchRhcidiehshshfhfhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhyhzhhifighoihhchchcfDfDfDfDfDfDfDhXiihXfEfFhXiihXfDfDfDfDfDfDfDhchchcijhshshshfhfhNhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhOhfhfikhshsihhcaahcilililimilinfDhXiihXfEfFhXiihXfDililimilililhcaahciohshohshfhfhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhOhfhfikhshsihhcaahcilililimilinfDhXiihXfEkChXiihXfDililimilililhcaahciohskDhshfhfhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfiphzhhhMhshsiqhcaahcililililililirhXiihXfEfFhXiihXirililililililhcaahcisithshshfhfhNhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhfhfhfhshohsiuhcaahcivililiwfDfDfDixiihXfEfFhXiiiyfDfDfDizililiAhcaahciBhshshshfhfhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshoighshshohQhcaahcililililiriCfDhXiihXfEfFhXiihXfDiDirililililhcaahciEhohshshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshshohohsiFhcaahcivilililfDfDfDhXiihXfEfFhXiihXfDfDfDilililiAhcaahchohohshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhfhfhfkEhohsiuhcaahcivililiwfDfDfDixiihXfEfFhXiiiyfDfDfDizililiAhcaahciBhskEhshfhfhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshoighshshohQhcaahcililililiriGfDhXiihXfEfFhXiihXfDiDirililililhcaahciEhohshshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshshohohsiFhcaahckFilililfDfDfDhXiihXfEfFhXiihXfDfDfDilililiAhcaahchohohshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshohshshohcaPhcililililiriGfDiHiihXfEfFhXiihXfDiDirililililhcaPhchohshshsiIhchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchchciJhchcaahcivililiwfDfDfDhXiihXfEfFhXiihXfDfDfDizililiAhcaahchciJhchchchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchchciJhchcaahcivilkGiwfDfDfDhXiihXfEfFhXiihXfDfDfDizilkGiAhcaahchciJhchchchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahciKiLiMiMhcaPhcililililiriNfDhXhXiOgifFhXhXhXfDiDirililililhcaPhciMiMiLiPhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaahciMiMiMiMhcaPhchchcfDfDfDfDfDfDfDhdfDfDhefDfDfDfDfDfDfDhchchcaPhciMiMiMiMhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaahckNkNkNkNhcaPhchchcfDfDfDfDfDfDfDhdfDfDhefDfDfDfDfDfDfDhchchcaPhckNkNkNkNhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaahciQiQiQiQhcaaaaaahciRiSiTghiUgFgFhIgFgFgFgFgFgFghiViWiXhcaaaaaahciQiQiQiQhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaSaSaaaaaaaaaaaaaaaaaahciYiZiZjahcaaaaaajbhGjcjdfNfEfFfFfFfFfFfFfFfFfFfNjejfjgjhaaaaaahciYiZiZjahcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaSaSaaaaaaaaaaaaaaaaaahciYiZiZjahcaaaaaajbhGjcjdfNfEfFfFfFfFfFkCfFfFfFfNjejfjgjhaaaaaahciYiZiZjahcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcjijjjdfNjkfDfDjlfDfDjlfDfDjmfNjejnjohcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajbhGjpjdfNfEfFjqhohohohojrfFfFfNjejsjgjtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajbhGkHjdfNfEfFjqkDhohohojrfFfFfNjejsjgjtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcjujvjdfNfEfFjwjxjxjxjxjyfFfFfNjejzjAhcjBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchcjCjdfNfEjDfFfFfFfFfFfFjDfFfNjejChchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchcjEfNjFeujGfFfFfFfFjHeujGfNjEhchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -650,7 +665,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjWjWkejWjWkfkgkhjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWjWkikjkfkfkfkkkljWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkmknkokfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkpkqkrkfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkpkIkrkfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWjWkfksktkukfkfjWjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkvjWkfkfkfkfjWkvjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkwkfkfkfkfkxjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index ea21b2c8fe5..7dc5189f21c 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -18,7 +18,7 @@ /obj/effect/proc_holder/spell/targeted/lightning/Click() if(!ready && cast_check()) - StartChargeup() + StartChargeup() return 1 /obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 483b0c97a41..cb04b9085df 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -839,3 +839,8 @@ ..() user <<"[src] suddenly vanishes!" qdel(src) + +/obj/item/weapon/spellbook/oneuse/random/New() + var/real_type = pick(subtypesof(/obj/item/weapon/spellbook/oneuse)) + new real_type(loc) + qdel(src) diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 1e1f03457ac..4cfa7bb36b7 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -40,4 +40,270 @@ name = "The Lens of Truesight" desc = "I can see forever!" icon_state = "monocle" - item_state = "headset" \ No newline at end of file + item_state = "headset" + + +/obj/structure/academy_wizard_spawner + name = "Academy Defensive System" + desc = "Made by Abjuration Inc" + icon = 'icons/obj/cult.dmi' + icon_state = "forge" + anchored = 1 + var/health = 200 + var/mob/living/current_wizard = null + var/next_check = 0 + var/cooldown = 600 + var/faction = "wizard" + var/broken = 0 + +/obj/structure/academy_wizard_spawner/New() + SSobj.processing |= src + +/obj/structure/academy_wizard_spawner/process() + if(next_check < world.time) + if(!current_wizard) + for(var/mob/living/L in player_list) + if(L.z == src.z && L.stat != DEAD && !(faction in L.faction)) + summon_wizard() + break + else + if(current_wizard.stat == DEAD) + current_wizard = null + summon_wizard() + if(!current_wizard.client) + give_control() + next_check = world.time + cooldown + +/obj/structure/academy_wizard_spawner/proc/give_control() + if(!current_wizard) + return + spawn(0) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as Wizard Academy Defender?", "wizard") + var/mob/dead/observer/chosen = null + + if(candidates.len) + chosen = pick(candidates) + message_admins("[key_name_admin(chosen)] was spawned as Wizard Academy Defender") + current_wizard.ghostize() // on the off chance braindead defender gets back in + current_wizard.key = chosen.key + +/obj/structure/academy_wizard_spawner/proc/summon_wizard() + var/turf/T = src.loc + + var/mob/living/carbon/human/wizbody = new(T) + wizbody.equipOutfit(/datum/outfit/wizard/academy) + var/obj/item/weapon/implant/exile/Implant = new/obj/item/weapon/implant/exile(wizbody) + Implant.implant(wizbody) + wizbody.faction |= "wizard" + wizbody.real_name = "Academy Teacher" + wizbody.name = "Academy Teacher" + + var/datum/mind/wizmind = new /datum/mind() + wizmind.name = "Wizard Defender" + wizmind.special_role = "Academy Defender" + var/datum/objective/O = new("Protect Wizard Academy from the intruders") + wizmind.objectives += O + wizmind.transfer_to(wizbody) + ticker.mode.wizards |= wizmind + + wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt) + wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile) + wizmind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball) + + current_wizard = wizbody + + give_control() + +/obj/structure/academy_wizard_spawner/proc/update_status() + if(health<0) + visible_message("[src] breaks down!") + icon_state = "forge_off" + SSobj.processing.Remove(src) + broken = 1 + +/obj/structure/academy_wizard_spawner/attackby(obj/item/weapon/W, mob/living/user, params) + add_fingerprint(user) + user.changeNext_move(CLICK_CD_MELEE) + if(!broken) + health -= W.force + update_status() + ..() + +/obj/structure/academy_wizard_spawner/bullet_act(obj/item/projectile/Proj) + if(!broken) + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + health -= Proj.damage + update_status() + ..() + return + +/datum/outfit/wizard/academy + name = "Academy Wizard" + r_pocket = null + r_hand = null + +/obj/item/weapon/dice/d20/fate + name = "Dice of Fate" + desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky." + icon_state = "d20" + sides = 20 + var/used = 0 + var/rigged = -1 + +/obj/item/weapon/dice/d20/fate/diceroll(mob/user) + ..() + if(!used) + if(!ishuman(user) || !user.mind || (user.mind in ticker.mode.wizards)) + user << "You feel the magic of the dice is restricted to ordinary humans!" + return + if(rigged > 0) + effect(user,rigged) + else + effect(user,result) + +/obj/item/weapon/dice/d20/fate/equipped(mob/user, slot) + if(!ishuman(user) || !user.mind || (user.mind in ticker.mode.wizards)) + user << "You feel the magic of the dice is restricted to ordinary humans! You should leave it alone." + user.drop_item() + + +/obj/item/weapon/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll) + used = 1 + visible_message("The die flare briefly.") + switch(roll) + if(1) + //Dust + user.dust() + if(2) + //Death + user.death() + if(3) + //Swarm of creatures + for(var/direction in alldirs) + var/turf/T = get_turf(src) + new /mob/living/simple_animal/hostile/creature(get_step(T,direction)) + if(4) + //Destroy Equipment + for (var/obj/item/I in user) + if (istype(I, /obj/item/weapon/implant)) + continue + qdel(I) + if(5) + //Monkeying + user.monkeyize() + if(6) + //Cut speed + var/datum/species/S = user.dna.species + S.speedmod += 1 + if(7) + //Throw + user.Stun(3) + user.adjustBruteLoss(50) + var/throw_dir = pick(cardinal) + var/atom/throw_target = get_edge_target_turf(user, throw_dir) + user.throw_at(throw_target, 200, 4) + if(8) + //Fueltank Explosion + explosion(src.loc,-1,0,2, flame_range = 2) + if(9) + //Cold + var/datum/disease/D = new /datum/disease/cold + user.ForceContractDisease(D) + if(10) + //Nothing + visible_message("[src] roll perfectly.") + if(11) + //Cookie + var/obj/item/weapon/reagent_containers/food/snacks/cookie/C = new(get_turf(src)) + C.name = "Cookie of Fate" + if(12) + //Healing + user.revive() + if(13) + //Mad Dosh + var/turf/Start = get_turf(src) + for(var/direction in alldirs) + var/turf/T = get_step(Start,direction) + if(rand(0,1)) + new /obj/item/stack/spacecash/c1000(T) + else + var/obj/item/weapon/moneybag/M = new(T) + for(var/i in 1 to rand(5,50)) + new /obj/item/weapon/coin/gold(M) + if(14) + //Free Gun + new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(src)) + if(15) + //Random One-use spellbook + new /obj/item/weapon/spellbook/oneuse/random(get_turf(src)) + if(16) + //Servant & Servant Summon + var/mob/living/carbon/human/H = new(get_turf(src)) + H.equipOutfit(/datum/outfit/butler) + var/datum/mind/servant_mind = new /datum/mind() + var/datum/objective/O = new("Serve [user.real_name].") + servant_mind.objectives += O + servant_mind.transfer_to(H) + + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [user.real_name] Servant?", "wizard") + var/mob/dead/observer/chosen = null + + if(candidates.len) + chosen = pick(candidates) + message_admins("[key_name_admin(chosen)] was spawned as Dice Servant") + H.key = chosen.key + + var/obj/effect/proc_holder/spell/targeted/summonmob/S = new + S.target_mob = H + user.mind.AddSpell(S) + + if(17) + //Tator Kit + new /obj/item/weapon/storage/box/syndicate/(get_turf(src)) + if(18) + //Captain ID + new /obj/item/weapon/card/id/captains_spare(get_turf(src)) + if(19) + //Instrinct Resistance + user << "You feel robust." + var/datum/species/S = user.dna.species + S.brutemod *= 0.5 + S.burnmod *= 0.5 + S.coldmod *= 0.5 + if(20) + //Free wizard! + user.mind.make_Wizard() + + +/datum/outfit/butler + name = "Butler" + uniform = /obj/item/clothing/under/suit_jacket/really_black + shoes = /obj/item/clothing/shoes/laceup + head = /obj/item/clothing/head/bowler + glasses = /obj/item/clothing/glasses/monocle + gloves = /obj/item/clothing/gloves/color/white + +/obj/effect/proc_holder/spell/targeted/summonmob + name = "Summon Servant" + desc = "This spell can be used to call your servant, whenever you need it." + charge_max = 100 + clothes_req = 0 + invocation = "JE VES" + invocation_type = "whisper" + range = -1 + level_max = 0 //cannot be improved + cooldown_min = 100 + include_user = 1 + + var/mob/living/target_mob + + action_icon_state = "summons" + +/obj/effect/proc_holder/spell/targeted/summonmob/cast(list/targets,mob/user = usr) + if(!target_mob) + return + var/turf/Start = get_turf(user) + for(var/direction in alldirs) + var/turf/T = get_step(Start,direction) + if(!T.density) + target_mob.Move(T) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 7e8d710e44b..75e71a6ed77 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -154,4 +154,11 @@ corpsehelmet = /obj/item/clothing/head/bearpelt /obj/effect/landmark/mobcorpse/russian/ranged - corpsehelmet = /obj/item/clothing/head/ushanka \ No newline at end of file + corpsehelmet = /obj/item/clothing/head/ushanka + +/obj/effect/landmark/mobcorpse/wizard + name = "Space Wizard" + corpseuniform = /obj/item/clothing/under/color/lightpurple + corpsesuit = /obj/item/clothing/suit/wizrobe + corpseshoes = /obj/item/clothing/shoes/sandal + corpsehelmet = /obj/item/clothing/head/wizard \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm new file mode 100644 index 00000000000..b8ddd18df4f --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -0,0 +1,79 @@ +/mob/living/simple_animal/hostile/wizard + name = "Space Wizard" + desc = "EI NATH?" + icon_state = "wizard" + icon_living = "wizard" + icon_dead = "wizard_dead" + speak_chance = 0 + turns_per_move = 3 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + speed = 0 + maxHealth = 100 + health = 100 + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 5 + attacktext = "punches" + attack_sound = 'sound/weapons/punch1.ogg' + a_intent = "harm" + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("wizard") + status_flags = CANPUSH + + retreat_distance = 3 //out of fireball range + minimum_distance = 3 + + var/obj/effect/proc_holder/spell/dumbfire/fireball/fireball = null + var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null + var/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/mm = null + + var/next_cast = 0 + + +/mob/living/simple_animal/hostile/wizard/New() + ..() + fireball = new /obj/effect/proc_holder/spell/dumbfire/fireball + fireball.clothes_req = 0 + fireball.human_req = 0 + fireball.player_lock = 0 + AddSpell(fireball) + + mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile + mm.clothes_req = 0 + mm.human_req = 0 + mm.player_lock = 0 + AddSpell(mm) + + blink = new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink + blink.clothes_req = 0 + blink.human_req = 0 + blink.player_lock = 0 + blink.outer_tele_radius = 3 + AddSpell(blink) + +/mob/living/simple_animal/hostile/wizard/death(gibbed) + ..(gibbed) + new /obj/effect/landmark/mobcorpse/wizard(src.loc) + new /obj/item/weapon/staff(src.loc) + qdel(src) + return + +/mob/living/simple_animal/hostile/wizard/handle_automated_action() + . = ..() + if(target && next_cast < world.time) + if((get_dir(src,target) in list(SOUTH,EAST,WEST,NORTH)) && fireball.cast_check(0,src)) //Lined up for fireball + src.dir = get_dir(src,target) + fireball.choose_targets(src) + next_cast = world.time + 10 //One spell per second + return . + if(mm.cast_check(0,src)) + mm.choose_targets(src) + next_cast = world.time + 10 + return . + if(blink.cast_check(0,src)) //Spam Blink when you can + blink.choose_targets(src) + next_cast = world.time + 10 + return . diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural mapping/mapGenerators/syndicate.dm index 7973471ed54..a9fe00c8b6d 100644 --- a/code/modules/procedural mapping/mapGenerators/syndicate.dm +++ b/code/modules/procedural mapping/mapGenerators/syndicate.dm @@ -49,4 +49,4 @@ /datum/mapGeneratorModule/border/syndieWalls,\ /datum/mapGeneratorModule/syndieFurniture, \ /datum/mapGeneratorModule/splatterLayer/syndieMobs, \ - /datum/mapGeneratorModule/bottomLayer/repressurize) \ No newline at end of file + /datum/mapGeneratorModule/bottomLayer/repressurize) diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 93856d3e80d8317e86e553f3c9c6349020e0910a..b1c94f4780cf5ab88f5fffefd928419b534bf18a 100644 GIT binary patch delta 31438 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 delta 27444 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 Z@?k|rZ)~uAC Date: Fri, 27 Nov 2015 21:56:59 -0300 Subject: [PATCH 44/62] Jobban cleanup & performance improvements Clients now cache their jobbans to save on DB queries. Legacy jobbans and "new" (savefile) jobbans have been removed. These are old cruft that has been unused for years, and since we require a DB for notes anyway we might as well just get rid of the legacy stuff. I considered removing legacy bans as well, but I was unsure if that would go way beyond the scope of this PR (my main goal here is making jobban_isbanned not awful). Also note that this was basically untested, as I do not have a test database. Any help testing this would be much appreciated. --- README.md | 7 +- code/modules/admin/admin.dm | 21 -- code/modules/admin/admin_verbs.dm | 13 -- code/modules/admin/banjob.dm | 127 +++-------- code/modules/admin/newbanjob.dm | 276 ------------------------ code/modules/admin/topic.dm | 38 ---- code/modules/admin/verbs/diagnostics.dm | 23 -- code/modules/admin/verbs/mapping.dm | 3 - code/modules/client/client defines.dm | 1 + code/world.dm | 3 - tgstation.dme | 1 - 11 files changed, 31 insertions(+), 482 deletions(-) delete mode 100644 code/modules/admin/newbanjob.dm diff --git a/README.md b/README.md index 8f2d270db37..d7e17e395b8 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,8 @@ where the admin rank must be properly capitalised. Finally, to start the server, run Dream Daemon and enter the path to your compiled tgstation.dmb file. Make sure to set the port to the one you specified in the config.txt, and set the Security box to 'Safe'. Then press GO -and the server should start up and be ready to join. +and the server should start up and be ready to join. It is also recommended that +you set up the SQL backend (see below). ###HOSTING ON LINUX We use BYGEX for some of our text replacement related code. Unfortunately, we @@ -112,9 +113,7 @@ To enable an away mission open fileList.txt in the _maps/RandomZLevels directory ##SQL SETUP -The SQL backend for the library and stats tracking requires a -MySQL server. Your server details go in /config/dbconfig.txt, and the SQL -schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: http://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database +The SQL backend requires a MySQL server. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: http://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database ##IRC BOT SETUP diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 642e7003c2b..47ec6ac32b3 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -380,19 +380,6 @@ var/global/floorIsLava = 0 onclose(usr, "admincaster_main") - -/datum/admins/proc/Jobbans() - if(!check_rights(R_BAN)) return - - var/dat = "Job Bans!


Blob
Progress: [blobs.len]/[mode.blobwincount]
Progress: [blobs_legit.len]/[mode.blobwincount]
" - for(var/t in jobban_keylist) - var/r = t - if( findtext(r,"##") ) - r = copytext( r, 1, findtext(r,"##") )//removes the description - dat += text("") - dat += "
[t] (unban)
" - usr << browse(dat, "window=ban;size=400x400") - /datum/admins/proc/Game() if(!check_rights(0)) return @@ -695,14 +682,6 @@ var/global/floorIsLava = 0 message_admins("[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.") feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/unjobban_panel() - set name = "Unjobban Panel" - set category = "Admin" - if (src.holder) - src.holder.unjobbanpanel() - feedback_add_details("admin_verb","UJBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - /datum/admins/proc/output_ai_laws() var/ai_number = 0 for(var/mob/living/silicon/S in mob_list) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4a7d2553f84..894d847646b 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -64,8 +64,6 @@ var/list/admin_verbs_admin = list( ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, - /client/proc/jobbans, - /client/proc/unjobban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel ) @@ -372,17 +370,6 @@ var/list/admin_verbs_hideable = list( feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return -/client/proc/jobbans() - set name = "Display Job bans" - set category = "Admin" - if(holder) - if(config.ban_legacy_system) - holder.Jobbans() - else - holder.DB_ban_panel() - feedback_add_details("admin_verb","VJB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - /client/proc/unban_panel() set name = "Unban Panel" set category = "Admin" diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 1399c6310a5..d3eede9153b 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -1,109 +1,36 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -var/jobban_runonce // Updates legacy bans with new info -var/jobban_keylist[0] //to store the keys & ranks - -/proc/jobban_fullban(mob/M, rank, reason) - if (!M || !M.key) return - jobban_keylist.Add(text("[M.ckey] - [rank] ## [reason]")) - jobban_savebanfile() - -/proc/jobban_client_fullban(ckey, rank) - if (!ckey || !rank) return - jobban_keylist.Add(text("[ckey] - [rank]")) - jobban_savebanfile() - //returns a reason if M is banned from rank, returns 0 otherwise /proc/jobban_isbanned(mob/M, rank) - if(M && rank) - for (var/s in jobban_keylist) - if( findtext(s,"[M.ckey] - [rank]") == 1 ) - var/startpos = findtext(s, "## ")+3 - if(startpos && startpos Now())) AND isnull(unbanned)") + if(!query.Execute()) + log_game("SQL ERROR obtaining jobbans. Error : \[[query.ErrorMsg()]\]\n") + return + if(query.NextRow()) + var/reason = query.item[1] + return reason ? reason : 1 //we don't want to return "" if there is no ban reason, as that would evaluate to false + else + return 0 + + if(!M.client.jobbancache) + jobban_buildcache(M.client) + + if(rank in M.client.jobbancache) + var/reason = M.client.jobbancache[rank] + return (reason) ? reason : 1 //see above for why we need to do this return 0 -/* -DEBUG -/mob/verb/list_all_jobbans() - set name = "list all jobbans" - - for(var/s in jobban_keylist) - world << s - -/mob/verb/reload_jobbans() - set name = "reload jobbans" - - jobban_loadbanfile() -*/ - -/proc/jobban_loadbanfile() - if(config.ban_legacy_system) - var/savefile/S=new("data/job_full.ban") - S["keys[0]"] >> jobban_keylist - log_admin("Loading jobban_rank") - S["runonce"] >> jobban_runonce - - if (!length(jobban_keylist)) - jobban_keylist=list() - log_admin("jobban_keylist was empty") - else - if(!establish_db_connection()) - world.log << "Database connection failed. Reverting to the legacy ban system." - diary << "Database connection failed. Reverting to the legacy ban system." - config.ban_legacy_system = 1 - jobban_loadbanfile() +/proc/jobban_buildcache(client/C) + if(C && istype(C)) + C.jobbancache = list() + var/DBQuery/query = dbcon.NewQuery("SELECT job, reason FROM [format_table_name("ban")] WHERE ckey = '[sanitizeSQL(C.ckey)]' AND (bantype = 'JOB_PERMABAN' OR (bantype = 'JOB_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") + if(!query.Execute()) + log_game("SQL ERROR obtaining jobbans. Error : \[[query.ErrorMsg()]\]\n") return - - //Job permabans - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)") - query.Execute() - while(query.NextRow()) - var/ckey = query.item[1] - var/job = query.item[2] - - jobban_keylist.Add("[ckey] - [job]") - - //Job tempbans - var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()") - query1.Execute() - - while(query1.NextRow()) - var/ckey = query1.item[1] - var/job = query1.item[2] - - jobban_keylist.Add("[ckey] - [job]") - -/proc/jobban_savebanfile() - var/savefile/S=new("data/job_full.ban") - S["keys[0]"] << jobban_keylist - -/proc/jobban_unban(mob/M, rank) - jobban_remove("[M.ckey] - [rank]") - jobban_savebanfile() - + C.jobbancache[query.item[1]] = query.item[2] /proc/ban_unban_log_save(var/formatted_log) text2file(formatted_log,"data/ban_unban_log.txt") - - -/proc/jobban_updatelegacybans() - if(!jobban_runonce) - log_admin("Updating jobbanfile!") - // Updates bans.. Or fixes them. Either way. - for(var/T in jobban_keylist) - if(!T) continue - jobban_runonce++ //don't run this update again - - -/proc/jobban_remove(X) - for (var/i = 1; i <= length(jobban_keylist); i++) - if( findtext(jobban_keylist[i], "[X]") ) - jobban_keylist.Remove(jobban_keylist[i]) - jobban_savebanfile() - return 1 - return 0 diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm deleted file mode 100644 index 2c429f6de82..00000000000 --- a/code/modules/admin/newbanjob.dm +++ /dev/null @@ -1,276 +0,0 @@ -var/savefile/Banlistjob - - -/proc/_jobban_isbanned(client/clientvar, rank) - if(!clientvar) return 1 - ClearTempbansjob() - var/id = clientvar.computer_id - var/key = clientvar.ckey - if (guest_jobbans(rank)) - if(config.guest_jobban && IsGuestKey(key)) - return 1 - Banlistjob.cd = "/base" - if (Banlistjob.dir.Find("[key][id][rank]")) - return 1 - - Banlistjob.cd = "/base" - for (var/A in Banlistjob.dir) - Banlistjob.cd = "/base/[A]" - if ((id == Banlistjob["id"] || key == Banlistjob["key"]) && rank == Banlistjob["rank"]) - return 1 - return 0 - - -///proc/UpdateTime() //No idea why i made this a proc. -// CMinutes = (world.realtime / 10) / 60 -// return 1 - -/proc/LoadBansjob() - - Banlistjob = new("data/job_fullnew.bdb") - log_admin("Loading Banlistjob") - - if (!length(Banlistjob.dir)) log_admin("Banlistjob is empty.") - - if (!Banlistjob.dir.Find("base")) - log_admin("Banlistjob missing base dir.") - Banlistjob.dir.Add("base") - Banlistjob.cd = "/base" - else if (Banlistjob.dir.Find("base")) - Banlistjob.cd = "/base" - - ClearTempbansjob() - return 1 - -/proc/ClearTempbansjob() - UpdateTime() - - Banlistjob.cd = "/base" - for (var/A in Banlistjob.dir) - Banlistjob.cd = "/base/[A]" - //if (!Banlistjob["key"] || !Banlistjob["id"]) - // RemoveBanjob(A, "full") - // log_admin("Invalid Ban.") - // message_admins("Invalid Ban.") - // continue - - if (!Banlistjob["temp"]) continue - if (CMinutes >= Banlistjob["minutes"]) RemoveBanjob(A) - - return 1 - - -/proc/AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, rank) - UpdateTime() - var/bantimestamp - if (temp) - UpdateTime() - bantimestamp = CMinutes + minutes - if(rank == "Heads") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Captain") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - return 1 - if(rank == "Security") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Warden") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Detective") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Security Officer") - return 1 - if(rank == "Engineering") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Atmospheric Technician") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "Research") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Scientist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - return 1 - if(rank == "Medical") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Medical Doctor") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chemist") - return 1 - if(rank == "CE_Station_Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "CE_Atmospheric_Tech") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Atmospheric Technician") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "CE_Shaft_Miner") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Shaft Miner") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "Chemist_RD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chemist") - return 1 - if(rank == "Geneticist_RD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist") - return 1 - if(rank == "MD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Medical Doctor") - return 1 - if(rank == "Scientist_RD") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Scientist") - return 1 - if(rank == "AI_Cyborg") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "AI") - return 1 - if(rank == "Detective_HoS") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Detective") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") - return 1 - if(rank == "Virologist_RD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Virologist") - return 1 - - Banlistjob.cd = "/base" - if ( Banlistjob.dir.Find("[ckey][computerid][rank]") ) - usr << text("Banjob already exists.") - return 0 - else - Banlistjob.dir.Add("[ckey][computerid][rank]") - Banlistjob.cd = "/base/[ckey][computerid][rank]" - Banlistjob["key"] << ckey - Banlistjob["id"] << computerid - Banlistjob["rank"] << rank - Banlistjob["reason"] << reason - Banlistjob["bannedby"] << bannedby - Banlistjob["temp"] << temp - if (temp) - Banlistjob["minutes"] << bantimestamp - - return 1 - -/proc/RemoveBanjob(foldername) - var/key - var/id - var/rank - Banlistjob.cd = "/base/[foldername]" - Banlistjob["key"] >> key - Banlistjob["id"] >> id - Banlistjob["rank"] >> rank - Banlistjob.cd = "/base" - - if (!Banlistjob.dir.Remove(foldername)) return 0 - - if(!usr) - log_admin("Banjob Expired: [key]") - message_admins("Banjob Expired: [key]") - else - log_admin("[key_name(usr)] unjobbanned [key] from [rank]") - message_admins("[key_name_admin(usr)] unjobbanned:[key] from [rank]") - ban_unban_log_save("[key_name(usr)] unjobbanned [key] from [rank]") - feedback_inc("ban_job_unban",1) - feedback_add_details("ban_job_unban","- [rank]") - - for (var/A in Banlistjob.dir) - Banlistjob.cd = "/base/[A]" - if ((key == Banlistjob["key"] || id == Banlistjob["id"]) && (rank == Banlistjob["rank"])) - Banlistjob.cd = "/base" - Banlistjob.dir.Remove(A) - continue - - return 1 - -/proc/GetExpjob(minutes as num) - UpdateTime() - var/exp = minutes - CMinutes - if (exp <= 0) - return 0 - else - var/timeleftstring - if (exp >= 1440) //1440 = 1 day in minutes - timeleftstring = "[round(exp / 1440, 0.1)] Days" - else if (exp >= 60) //60 = 1 hour in minutes - timeleftstring = "[round(exp / 60, 0.1)] Hours" - else - timeleftstring = "[exp] Minutes" - return timeleftstring - -/datum/admins/proc/unjobbanpanel() - var/count = 0 - var/dat - //var/dat = "
Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total
" - Banlistjob.cd = "/base" - for (var/A in Banlistjob.dir) - count++ - Banlistjob.cd = "/base/[A]" - dat += text("") - - dat += "
(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetExpjob(Banlistjob["minutes"]) ? GetExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlistjob["bannedby"]])(Reason: [Banlistjob["reason"]])
" - dat = "
Bans: (U) = Unban , - ([count] Bans)
[dat]" - usr << browse(dat, "window=unbanp;size=875x400") - -/*/datum/admins/proc/permjobban(ckey, computerid, reason, bannedby, temp, minutes, rank) - if(AddBanjob(ckey, computerid, reason, usr.ckey, 0, 0, job)) - M << "\redYou have been banned from [job] by [usr.client.ckey].\nReason: [reason]" - M << "\red This is a permanent ban." - if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" - else - M << "\red No ban appeals URL has been set." - log_admin("[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") - message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") -/datum/admins/proc/timejobban(ckey, computerid, reason, bannedby, temp, minutes, rank) - if(AddBanjob(ckey, computerid, reason, usr.ckey, 1, mins, job)) - M << "\redYou have been jobbanned from [job] by [usr.client.ckey].\nReason: [reason]" - M << "\red This is a temporary ban, it will be removed in [mins] minutes." - if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" - else - M << "\red No ban appeals URL has been set." - log_admin("[usr.client.ckey] has jobbanned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")*/ -//////////////////////////////////// DEBUG //////////////////////////////////// - -/proc/CreateBansjob() - - UpdateTime() - - var/i - var/last - - for(i=0, i<1001, i++) - var/a = pick(1,0) - var/b = pick(1,0) - if(b) - Banlistjob.cd = "/base" - Banlistjob.dir.Add("trash[i]trashid[i]") - Banlistjob.cd = "/base/trash[i]trashid[i]" - Banlistjob["key"] << "trash[i]" - else - Banlistjob.cd = "/base" - Banlistjob.dir.Add("[last]trashid[i]") - Banlistjob.cd = "/base/[last]trashid[i]" - Banlistjob["key"] << last - Banlistjob["id"] << "trashid[i]" - Banlistjob["reason"] << "Trashban[i]." - Banlistjob["temp"] << a - Banlistjob["minutes"] << CMinutes + rand(1,2000) - Banlistjob["bannedby"] << "trashmin" - last = "trash[i]" - - Banlistjob.cd = "/base" - -/proc/ClearAllBansjob() - Banlistjob.cd = "/base" - for (var/A in Banlistjob.dir) - RemoveBanjob(A, "full") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index dc08a87351b..e5123e44cb8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -483,10 +483,6 @@ var/banreason = appearance_isbanned(M) if(banreason) - /* if(!config.ban_legacy_system) - usr << "Unfortunately, database based unbanning cannot be done through this panel" - DB_ban_panel(M.ckey) - return */ switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No")) if("Yes") ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban") @@ -895,9 +891,6 @@ if(notbannedlist.len) //at least 1 unbanned job exists in joblist so we have stuff to ban. switch(alert("Temporary Ban?",,"Yes","No", "Cancel")) if("Yes") - if(config.ban_legacy_system) - usr << "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban." - return var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) return @@ -912,7 +905,6 @@ feedback_inc("ban_job_tmp",1) DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job) feedback_add_details("ban_job_tmp","- [job]") - jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") //Legacy banning does not support temporary jobbans. if(!msg) msg = job else @@ -934,7 +926,6 @@ feedback_inc("ban_job",1) DB_ban_record(BANTYPE_JOB_PERMA, M, -1, reason, job) feedback_add_details("ban_job","- [job]") - jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") if(!msg) msg = job else msg += ", [job]" add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) @@ -961,7 +952,6 @@ DB_ban_unban(M.ckey, BANTYPE_ANY_JOB, job) feedback_inc("ban_job_unban",1) feedback_add_details("ban_job_unban","- [job]") - jobban_unban(M, job) if(!msg) msg = job else msg += ", [job]" else @@ -1029,21 +1019,6 @@ var/edit_log = query_noteedits.item[1] usr << browse(edit_log,"window=noteedits") - else if(href_list["removejobban"]) - if(!check_rights(R_BAN)) return - - var/t = href_list["removejobban"] - if(t) - if((alert("Do you want to unjobban [t]?","Unjobban confirmation", "Yes", "No") == "Yes") && t) //No more misclicks! Unless you do it twice. - log_admin("[key_name(usr)] removed [t]") - message_admins("[key_name_admin(usr)] removed [t]") - jobban_remove(t) - href_list["ban"] = 1 // lets it fall through and refresh - var/t_split = text2list(t, " - ") - var/key = t_split[1] - var/job = t_split[2] - DB_ban_unban(ckey(key), BANTYPE_JOB_PERMA, job) - else if(href_list["newban"]) if(!check_rights(R_BAN)) return @@ -1103,19 +1078,6 @@ if("Cancel") return - else if(href_list["unjobbanf"]) - if(!check_rights(R_BAN)) return - - var/banfolder = href_list["unjobbanf"] - Banlist.cd = "/base/[banfolder]" - var/key = Banlist["key"] - if(alert(usr, "Are you sure you want to unban [key]?", "Confirmation", "Yes", "No") == "Yes") - if (RemoveBanjob(banfolder)) - unjobbanpanel() - else - alert(usr,"This ban has already been lifted / does not exist.","Error","Ok") - unjobbanpanel() - //Watchlist else if(href_list["watchadd"]) var/target_ckey = locate(href_list["watchadd"]) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 399afc597b5..dce65ac5269 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -97,26 +97,3 @@ message_admins("[key_name_admin(usr)] manually reloaded admins") load_admins() feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/print_jobban_old() - set name = "Print Jobban Log" - set desc = "This spams all the active jobban entries for the current round to standard output." - set category = "Debug" - - usr << "Jobbans active in this round." - for(var/t in jobban_keylist) - usr << "[t]" - -/client/proc/print_jobban_old_filter() - set name = "Search Jobban Log" - set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output." - set category = "Debug" - - var/filter = input("Contains what?","Filter") as text|null - if(!filter) - return - - usr << "Jobbans active in this round." - for(var/t in jobban_keylist) - if(findtext(t, filter)) - usr << "[t]" diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 255c01abe52..74384f6a8c4 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -153,8 +153,6 @@ var/intercom_range_display_status = 0 src.verbs += /client/proc/cmd_admin_areatest src.verbs += /client/proc/cmd_admin_rejuvenate src.verbs += /datum/admins/proc/show_traitor_panel - src.verbs += /client/proc/print_jobban_old - src.verbs += /client/proc/print_jobban_old_filter src.verbs += /client/proc/disable_communication src.verbs += /client/proc/print_pointers src.verbs += /client/proc/count_movable_instances @@ -162,7 +160,6 @@ var/intercom_range_display_status = 0 src.verbs += /client/proc/cmd_show_at_list src.verbs += /client/proc/manipulate_organs src.verbs += /client/proc/reload_nanoui_resources - //src.verbs += /client/proc/cmd_admin_rejuvenate feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index c9217c164f7..e5b4a1d2895 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -6,6 +6,7 @@ var/datum/admins/holder = null var/buildmode = 0 + var/jobbancache = null //Used to cache this client's jobbans to save on DB queries var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent. diff --git a/code/world.dm b/code/world.dm index fe34671e0e2..d47c2a97b62 100644 --- a/code/world.dm +++ b/code/world.dm @@ -34,12 +34,9 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG load_mode() load_motd() load_admins() - LoadBansjob() if(config.usewhitelist) load_whitelist() - jobban_loadbanfile() appearance_loadbanfile() - jobban_updatelegacybans() LoadBans() investigate_reset() diff --git a/tgstation.dme b/tgstation.dme index b775bf90359..b6f960e23bc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -841,7 +841,6 @@ #include "code\modules\admin\holder2.dm" #include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\newbanjob.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" #include "code\modules\admin\sql_notes.dm" From b662b470a98fbf388cee0a59ef3cdf782878d1fe Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 28 Nov 2015 18:14:52 +0100 Subject: [PATCH 45/62] Enables ghost to go through ladders Adds Cold snow turf Adds Infinite Candles --- code/game/objects/items/candle.dm | 19 +++++++--- code/game/objects/structures/ladders.dm | 35 ++++++++++++------- code/game/turfs/simulated/floor/misc_floor.dm | 3 ++ .../awaymissions/mission_code/Academy.dm | 20 ++++++++++- 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index ba55eebe335..1171c646104 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -8,10 +8,14 @@ w_class = 1 var/wax = 200 var/lit = 0 + var/infinite = 0 + var/start_lit = 0 heat = 1000 - proc - light(var/flavor_text = "[usr] lights the [name].") +/obj/item/candle/New() + ..() + if(start_lit) + light() /obj/item/candle/update_icon() var/i @@ -51,14 +55,16 @@ light() //honk return -/obj/item/candle/light(var/flavor_text = "[usr] lights the [name].") +/obj/item/candle/proc/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) src.lit = 1 //src.damtype = "fire" for(var/mob/O in viewers(usr, null)) O.show_message(flavor_text, 1) SetLuminosity(CANDLE_LUMINOSITY) - SSobj.processing |= src + if(!infinite) + SSobj.processing |= src + update_icon() /obj/item/candle/process() @@ -99,4 +105,9 @@ /obj/item/candle/is_hot() return lit * heat + +/obj/item/candle/infinite + infinite = 1 + start_lit = 1 + #undef CANDLE_LUMINOSITY \ No newline at end of file diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index a1f3b4079de..c27f6cc9540 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -41,35 +41,43 @@ else //wtf make your ladders properly assholes icon_state = "ladder00" -/obj/structure/ladder/attack_hand(mob/user) +/obj/structure/ladder/proc/use(mob/user,is_ghost=0) if(up && down) switch( alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") ) if("Up") - user.visible_message("[user] climbs up \the [src].", \ + if(!is_ghost) + user.visible_message("[user] climbs up \the [src].", \ "You climb up \the [src].") + up.add_fingerprint(user) user.loc = get_turf(up) - up.add_fingerprint(user) if("Down") - user.visible_message("[user] climbs down \the [src].", \ + if(!is_ghost) + user.visible_message("[user] climbs down \the [src].", \ "You climb down \the [src].") + down.add_fingerprint(user) user.loc = get_turf(down) - down.add_fingerprint(user) if("Cancel") return else if(up) - user.visible_message("[user] climbs up \the [src].", \ - "You climb up \the [src].") + if(!is_ghost) + user.visible_message("[user] climbs up \the [src].", \ + "You climb up \the [src].") + up.add_fingerprint(user) user.loc = get_turf(up) - up.add_fingerprint(user) else if(down) - user.visible_message("[user] climbs down \the [src].", \ - "You climb down \the [src].") + if(!is_ghost) + user.visible_message("[user] climbs down \the [src].", \ + "You climb down \the [src].") + down.add_fingerprint(user) user.loc = get_turf(down) - down.add_fingerprint(user) + + if(!is_ghost) + add_fingerprint(user) - add_fingerprint(user) +/obj/structure/ladder/attack_hand(mob/user) + use(user) /obj/structure/ladder/attack_paw(mob/user) return attack_hand(user) @@ -77,6 +85,9 @@ /obj/structure/ladder/attackby(obj/item/weapon/W, mob/user, params) return attack_hand(user) +/obj/structure/ladder/attack_ghost(mob/dead/observer/user) + use(user,1) + /obj/structure/ladder/unbreakable/Destroy() return QDEL_HINT_LETMELIVE diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 067ebe88eed..30db7ef2984 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -51,6 +51,9 @@ /turf/simulated/floor/plating/snow/ex_act(severity, target) contents_explosion(severity, target) +/turf/simulated/floor/plating/snow/cold + temperature = 220 //Enough to deal cold damage on breathing. TODO : Make these points defines + /turf/simulated/floor/plating/snow/gravsnow icon_state = "gravsnow" diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 4cfa7bb36b7..90d50af1e8b 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -20,6 +20,14 @@ name = "\improper Academy Gateway" icon_state = "away4" +/area/awaymission/academy/academycellar + name = "\improper Academy Cellar" + icon_state = "away4" + +/area/awaymission/academy/academyengine + name = "\improper Academy Engine" + icon_state = "away4" + //Academy Items /obj/singularity/academy @@ -306,4 +314,14 @@ for(var/direction in alldirs) var/turf/T = get_step(Start,direction) if(!T.density) - target_mob.Move(T) \ No newline at end of file + target_mob.Move(T) + +/obj/structure/ladder/unbreakable/rune + name = "Teleportation Rune" + desc = "Could lead anywhere." + icon = 'icons/obj/rune.dmi' + icon_state = "1" + color = rgb(0,0,255) + +/obj/structure/ladder/unbreakable/rune/update_icon() + return \ No newline at end of file From 74a4227d0e51efb5fb69b8d4e1b607daf6e3e5bc Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 28 Nov 2015 18:15:31 +0100 Subject: [PATCH 46/62] Academy Update Part Two --- _maps/RandomZLevels/Academy.dmm | 277 ++++++++++++++++++++++---------- 1 file changed, 196 insertions(+), 81 deletions(-) diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 35db5c812c6..5feea503c69 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -30,12 +30,12 @@ "aD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aE" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aF" = (/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) -"aG" = (/obj/structure/safe/floor,/obj/item/voodoo,/obj/item/weapon/gun/magic/wand/fireball,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"aG" = (/turf/indestructible/rock,/area/space) "aH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aI" = (/obj/structure/table/reinforced,/obj/item/device/laser_pointer/upgraded,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aJ" = (/obj/structure/cult/tome,/obj/item/weapon/dice/d20/fate,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) "aK" = (/obj/structure/bed/chair/wood/wings{dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) -"aL" = (/obj/item/clothing/suit/space/hardsuit/wizard,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"aL" = (/turf/simulated/wall/mineral/wood,/area/awaymission/academy/academycellar) "aM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aN" = (/obj/structure/table/reinforced,/obj/item/weapon/coin/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) "aO" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster) @@ -190,7 +190,7 @@ "dH" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "dI" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "dJ" = (/obj/machinery/hydroponics/constructable,/obj/item/seeds/replicapod,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) -"dK" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) +"dK" = (/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) "dL" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dM" = (/obj/machinery/hydroponics/constructable,/obj/item/seeds/bluespacetomatoseed,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) @@ -314,8 +314,8 @@ "gb" = (/obj/structure/table,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "gc" = (/obj/structure/table,/obj/item/weapon/lazarus_injector,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/awaymission/academy/classrooms) "gd" = (/obj/structure/bed/chair/wood/normal,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"ge" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"gf" = (/obj/structure/bookcase,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"ge" = (/obj/item/candle/infinite,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"gf" = (/obj/structure/holohoop,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) "gg" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "gh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/academyaft) "gi" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) @@ -333,7 +333,7 @@ "gu" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "gv" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/awaymission/academy/classrooms) "gw" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"gx" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/medical_cloning,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"gx" = (/obj/structure/closet/athletic_mixed,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) "gy" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/academy/academyaft) "gz" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gA" = (/obj/machinery/door/window{dir = 4},/obj/item/ammo_casing,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/academy/classrooms) @@ -348,8 +348,8 @@ "gJ" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gK" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms) "gL" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) -"gM" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/hydroponics_pod_people,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) -"gN" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"gM" = (/obj/item/toy/beach_ball/holoball,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"gN" = (/obj/structure/mineral_door/wood,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) "gO" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gP" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/academy/classrooms) "gQ" = (/obj/machinery/light/small{dir = 8},/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) @@ -558,46 +558,161 @@ "kL" = (/obj/item/weapon/bikehorn,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "kM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/divine/trap/chill,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft) "kN" = (/obj/structure/divine/trap/fire,/turf/simulated/floor/engine,/area/awaymission/academy/academyaft) +"kO" = (/mob/living/simple_animal/hostile/retaliate/clown,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kP" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kQ" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kR" = (/obj/effect/rune/malformed,/mob/living/simple_animal/hostile/skeleton,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kS" = (/obj/structure/table/wood,/obj/item/candle/infinite,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kT" = (/obj/structure/table/wood,/obj/item/weapon/kitchen/knife/ritual,/obj/item/candle/infinite,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kU" = (/obj/effect/decal/remains/human,/obj/effect/rune/malformed,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kV" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kW" = (/obj/structure/ladder/unbreakable/rune{id = "academy_cellar"},/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kX" = (/obj/structure/bookcase/random,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kY" = (/obj/effect/decal/cleanable/xenoblood,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"kZ" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"la" = (/obj/structure/divine/trap/damage,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"lb" = (/mob/living/simple_animal/hostile/retaliate/bat,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"lc" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/mineral/uranium,/area/awaymission/academy/academycellar) +"ld" = (/turf/simulated/floor/mineral/uranium,/area/awaymission/academy/academycellar) +"le" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"lf" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"lg" = (/obj/structure/table/wood,/obj/item/weapon/guardiancreator/choose,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"lh" = (/obj/structure/falsewall/wood,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"li" = (/mob/living/simple_animal/hostile/retaliate/bat,/turf/simulated/floor/mineral/uranium,/area/awaymission/academy/academycellar) +"lj" = (/mob/living/simple_animal/hostile/poison/giant_spider/hunter,/turf/simulated/floor/engine/cult,/area/awaymission/academy/academycellar) +"lk" = (/obj/structure/safe/floor,/obj/item/voodoo,/obj/item/weapon/gun/magic/wand/fireball,/obj/item/clothing/suit/space/hardsuit/wizard,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"ll" = (/turf/indestructible/riveted,/area/awaymission/academy/academyengine) +"lm" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster) +"ln" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"lo" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"lp" = (/obj/machinery/power/apc{dir = 1; pixel_y = 32},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"lq" = (/turf/simulated/wall/rust,/area/awaymission/academy/academyengine) +"lr" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"ls" = (/obj/machinery/power/smes/magical,/obj/structure/cable,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"lt" = (/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"lu" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lv" = (/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lw" = (/obj/item/weapon/ectoplasm,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lx" = (/obj/effect/rune/malformed,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"ly" = (/obj/effect/decal/cleanable/oil,/obj/structure/table,/obj/item/weapon/staff,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lz" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lA" = (/obj/structure/table,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lB" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lC" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lD" = (/obj/structure/table,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lE" = (/obj/structure/rack,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lF" = (/turf/indestructible/fakeglass,/area/awaymission/academy/academyengine) +"lG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lI" = (/obj/structure/ladder/unbreakable/rune{id = "academy_engine"},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lJ" = (/obj/structure/mineral_door/iron,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lK" = (/obj/effect/immovablerod{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lL" = (/mob/living/simple_animal/slaughter{name = "engine demon"},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lM" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lN" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lQ" = (/obj/structure/table,/obj/item/weapon/gun/magic/wand/polymorph,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lR" = (/obj/structure/table,/obj/item/stack/sheet/animalhide/monkey,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lS" = (/obj/structure/table,/obj/item/stack/sheet/runed_metal,/obj/item/stack/sheet/mineral/wood,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lT" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/sheet/xenochitin,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lU" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lV" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"lW" = (/obj/structure/ladder/unbreakable/rune{height = 1; id = "academy_storage"},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) +"lX" = (/obj/structure/ladder/unbreakable/rune{height = 1; id = "academy_coldroom"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/academy/classrooms) +"lY" = (/obj/structure/table/wood,/obj/item/seeds/kudzuseed,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) +"lZ" = (/obj/structure/bookcase/random,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"ma" = (/obj/structure/ladder/unbreakable/rune{height = 1; id = "academy_cellar"},/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) +"mb" = (/obj/structure/ladder/unbreakable/rune{height = 1; id = "academy_engine"},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) +"mc" = (/turf/simulated/wall,/area/awaymission/academy/academyengine) +"md" = (/turf/simulated/wall/r_wall,/area/awaymission/academy/academyengine) +"me" = (/obj/structure/constructshell,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"mf" = (/obj/structure/constructshell,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"mg" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"mh" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"mi" = (/obj/machinery/door/airlock/vault,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"mj" = (/obj/structure/rack,/obj/item/weapon/spellbook/oneuse/summonitem,/obj/item/weapon/pen/fourcolor,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"mk" = (/obj/structure/rack,/obj/item/weapon/claymore,/obj/item/toy/figure/wizard,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"ml" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/vault,/area/awaymission/academy/academyengine) +"mm" = (/obj/structure/closet/coffin,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"mn" = (/obj/structure/rack,/obj/item/weapon/gun/magic/wand,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"mo" = (/obj/structure/rack,/obj/item/weapon/staff,/turf/simulated/floor/plating,/area/awaymission/academy/academyengine) +"mp" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"mq" = (/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"mr" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"ms" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/light,/area/awaymission/academy/academyengine) +"mt" = (/turf/simulated/floor/light,/area/awaymission/academy/academyengine) +"mu" = (/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mv" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mw" = (/obj/item/target,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"mx" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/light,/area/awaymission/academy/academyengine) +"my" = (/obj/structure/bed/chair/wood/normal,/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mz" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/deck,/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mA" = (/obj/structure/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mB" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mC" = (/obj/structure/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mD" = (/turf/simulated/mineral/random,/area/awaymission/academy/academycellar) +"mE" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"mF" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"mG" = (/mob/living/simple_animal/hostile/skeleton,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"mH" = (/obj/effect/decal/remains/robot,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"mI" = (/mob/living/simple_animal/hostile/wizard,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"mJ" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mK" = (/obj/machinery/vending/magivend,/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mL" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mM" = (/obj/structure/bed/chair/wood/normal{dir = 1},/turf/simulated/floor/wood,/area/awaymission/academy/academyengine) +"mN" = (/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mO" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mP" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/awaymission/academy/academygate) +"mQ" = (/obj/structure/ladder/unbreakable/rune{id = "academy_storage"},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"mR" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyengine) +"mS" = (/obj/structure/ladder/unbreakable/rune{id = "academy_coldroom"},/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mT" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mU" = (/obj/item/weapon/reagent_containers/food/snacks/meat/slab,/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mV" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mW" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mX" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating/snow/cold,/area/awaymission/academy/academycellar) +"mY" = (/turf/simulated/mineral/random,/area/space) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababadaeafaeaeagaeahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahaiahahahaiahahajababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacakahahahahalamananaoapaqacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacarahahasasatasasasauavawacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasayazaAaBasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaCahaDasaEaFaFaGasaHahaIacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasaJaKbSaLasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaMahahasasasasasasapahakacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNahahahahaOahalanavahafacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahahahahahapahahahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPababababaQababaRababababaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaTaFaFcIaFaFapaFaFasabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaFaFaFahaFaUavaFaFaFabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPacaFahahahaVapahahahaWacaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaXahahaYaZbabbahahbcabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPabbdahbebfbgbhbiahahbjabaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaacaFahahahahbkblahahbmacaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaPaPabaFbnaFaFahapaFaFbnboabaPaPabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaLaLaLaLaLaLaLaLaLaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaLaLdKdKgegfgedKdKaLaLaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaLaLdKdKdKdKdKdKdKdKdKaLaLaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaLgxdKdKdKdKdKdKdKdKdKdKaLaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaLgxdKdKdKgedKgedKdKdKdKaLaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaLaLdKdKdKdKgMdKdKdKdKaLaLaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaLaLdKdKdKdKdKdKdKaLaLaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaLaLdKdKdKdKdKaLaLaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaLaLgedKgeaLaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaLaLaLaLaLaLaLaLaGaLaLgNaLaLaGaLaLaLaLaLaLaLaLaLaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaLdKdKdKdKdKdKaLaGaGaLdKaLaGaGaLkOaLaLkPaLaLkQaLaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaLdKkRkSdKkUkTaLaLaLgedKgeaLaLaLkVaLaLkVaLaLkVaLaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaLdKdKdKdKdKdKgNdKdKdKkWdKdKdKgNdKdKdKdKdKdKdKgeaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaLdKdKdKdKdKdKaLaLaLgedKgeaLaLaLkVaLaLkVaLaLkVaLaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaLkXkXkXkXkXkXaLaGaGaLdKaLaGaGaLkYaLaLdKaLaLkZaLaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaLaLaLaLaLaLaLaLaLaLaLaLaLgNaLaLaLaLaLaLaLaLaLaLaLaLaLaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaLdKladKaLlclblddKldlbaLledKdKlfaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaLlgladKlhlblddKlilbldaLledKljdKaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababadaeafaeaeagaeahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaLdKdKdKaLlddKlidKlddKlhleledKljaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahaiahahahaiahahajababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacakahahahahalamananaoapaqacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacarahahasasatasasasauavawacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasayazaAaBasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaCahaDasaEaFaFlkasaHahaIacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGllllllllllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxahasaJaKbSlmasapaxaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGlllolnlpllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaMahahasasasasasasapahakacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqaGaGaGlllslrltllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNahahahahaOahalanavahafacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGlqlvlulvlvlvlwlxlvlulvlzlylAlqlqlqlqllllllllllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababahahahahahahapahahahababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGlqlvlvlBlvlvlvlClwlvlvlvlvlDlqlElulBlFlHlGlvllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPababababaQababaRababababaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGlqlIlvlvlvlvlvlvlvlvlvlvlvlvlJlvlvlvlFlvlKlLllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaTaFaFcIaFaFapaFaFasabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGlqlvlvlvlvlBlvlvlvlvlBlvlvlvlqlNlMlvlFlPlOlvllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaFaFaFahaFaUavaFaFaFabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGlqlvlvlMlvlRlQlTlSlvlMlvlUlVlqlqlqlqllllllllllaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPacaFahahahaVapahahahaWacaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGlqlqlqlqlqlqlqlqlqlqlqlqlqlqlqaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaXahahaYaZbabbahahbcabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPabbdahbebfbgbhbiahahbjabaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaacaFahahahahbkblahahbmacaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaG +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPabaPaPabaFbnaFaFahapaFaFbnboabaPaPabaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaPaaaaabasasasasbpbqasasasasabaaaaaPaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaPaaaPaaaaabbrbrbrbrahapbrbrbrbrabaaaaaPaaaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsbtbubvbvbwbtbsbsbsbsbsbsbsbsbsbsabbrbxbybrahapbrbxbybrababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -605,14 +720,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbUbzbBbBbBbBbVbzbEbWbXbYbZbZcabZbWasbrcbccbrahapbrdybrbrabcdcecdasascfbTcgchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscibzbBcjhLbBbzbzbEbWbZbZbZbXbZbZbWasbrbrbrbrahapahahahahckclcmcnascocfbTbTcpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscqbVbBbBbBbBbzcrbEcsbZbZbZbZbZbZcsasbrctctdyahapcuahcuahabcdcecdcvcwcxbTbTcyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsczbzkJbBbBbBbzbzbEcAcBbZbZbZbZbZcCasbrcDcDbrahcEanananancFbOcGclcHascfbTbTcpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsczbzkJbBlWbBbzbzbEcAcBbZbZbZbZbZcCasbrcDcDbrahcEanananancFbOcGclcHascfbTbTcpabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabskKbzkLbBcJbBbzbVbEcAcKcKcKcKfRcKcCasbrcLbrbrahapbrdybrbrabcdclcdclcdcfcgbTchabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscMbzcNbBbBcObzbVbEcPcQfYcQcQcQcQcRascSbxbybriCapbrbxbybLascTcdclcUcVcWbTbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscXcYcZcZcZcZdabzbEdbdcdcdcdcdcdcddasbrbJbKbrahapbrbJbKbrasasasasasasasasasabbsbsbsbsbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebVbVbzcMbzbEdcdcdfdcdfdcdgdcasbrbrbrbrahapbrbrbrbrasdhdidjdkdidididjdidlbEdmdmdnbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebVbVbzcMbzbEdcdcdfdcdfdcdgdcasbrbrbrbrahapbrbrbrbrasdhdidjdkdidididjdidlbElXdmdnbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdodpdqbVbzbzcMdrbEdcdcdsdcdsdcdsdcasaFaFaFaFahapaFaFaFaFasdtdudvbzdudwbzbzbzdxbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsjpdzdAcYcYcYdBbzbEdcdcdcdcdfdcdfdcasaFdCdCaFahapaFdCdCaFasdtbzbzbzbzbzbzdDdEdxdFdmdmdmdGbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdHdpdIbVbzbzcMbzbEdcdcdcdcdsdcdsdcasaFdCdCaFahapaFdCdCaFasdtdudwbzdudJbzdKdLdxbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdHdpdIbVbzbzcMbzbEdcdcdcdcdsdcdsdcasaFdCdCaFahapaFdCdCaFasdtdudwbzdudJbzlYdLdxbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebzbVbzcMbzbEdcdcdcdcdcdcdcdcasaFdCdCaFahapaFdCdCaFasdtbzbzbzbzbzbzdMdNdOdPdQdRdmdSbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbEbEbEdTdUbEbEbEdVdVbEbEbEbEbEasasasasasahapasasasasasdtdudwbzbzdWbzbzdXdxbEdYdZdmdSbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabseaeabsebecedeeefegeheiejejejejejekejehejejejejelemejejejejbEeneoeoeoeoeobzbzepeqbEdYdZdmerbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -625,13 +740,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabseaeabsfufvfweefxfyfgfgfgfgfzejejfAfgfgfgfBelejejelelejejejbEeDeDeDeDfCeDeDeDeDeGeHeHeHbsbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbsbsbEdTdUbEbEbEbEbEesesesesbEbEfDfEfFfDfDfFfFfDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbsbsaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBbBfGfHfIfJfKfKfLbEfMdcdcdcdcdcbEfNfEfFfNfNfFfFfObEfPfQkBfPfPcAfSfTfUfVbzbzfWbsbsaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfXbBbBfZgabzbzbzgbgcbEdcgddcgegfdcggghgifFfNfNfFfFfNbEgjgkglgmgjcAbzgnbzbzbzbzbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfXbBbBfZgabzbzbzgbgcbEdcgddclZlZdcggghgifFfNfNfFfFfNbEgjgkglgmgjcAbzgnbzbzbzbzbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsgobBbBgpgabzgqbzbzgrbEdcdfdcdcdcdcgsfNfFfFfNfNfFfFfNbEgjgtgjgjgjcAfSfTbzbzfWbsbsaPaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgugugufZgabzdubzbzgvbEgwdsdcgfgxdcgsfNfFfFfNfNfFfFgybEgzgtgjgjgjcAbzgAbzgBbsbsaPaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgugugufZgabzdubzbzgvbEgwdsdclZlZdcgsfNfFfFfNfNfFfFgybEgzgtgjgjgjcAbzgAbzgBbsbsaPaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgCgCgCfZgabzgDbzgqgrbEdcgddcdcdcdcgEghgFgGfNfNfFfFfNbEgjgtgHgIgJcAgKfTfWbsbsaPaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaabsbBgLbBgpgabzdubzdugrbEdcdfdcgMgNdcbEfNfFfEfNfNfFfFfNbEgjgtgOgOgOcAbzgPbsbsaPaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaabsbBgLbBgpgabzdubzdugrbEdcdfdclZlZdcbEfNfFfEfNfNfFfFfNbEgjgtgOgOgOcAbzgPbsbsaPaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsgQbBbBfZgabzgqbzgqgrbEdcdsdcdcdcdcgRfFfFgSghghgFgFgFgTgUgVgJgJgWcAgXbsbsaPaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBgLgYgZhahbhahbdmbEdcdcdcdcdcdcbEfNfFfEfNfNfFfFfNbEgjgjgOgOgOcAbsbsaPaaaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBgLgYgZhahbhahbdmbEmadcdcdcdcdcbEfNfFfEfNfNfFfFfNbEgjgjgOgOgOcAbsbsaPaaaaaaaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchchchchchchchchchchcfDfDfDfDfDfDfDfDfDhdfDfDhefDfDfDfDfDfDfDfDfDhchchchchchchchchchchchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhghhhhhihjhkhlhchmhchnhohohphohohqfFkCfEfFfFfFfFfFhnhohohphohohrhchmhchshthuhvhwhxhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhyhzhhhAhohBhChDhEhDhFhGhGhGhGhGhHgFgFhIhJgFgFgFgFhFhGhGhGhGhGhKhDkMhDhjhMhshohfhfhNhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -641,7 +756,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfiphzhhhMhshsiqhcaahcililililililirhXiihXfEfFhXiihXirililililililhcaahcisithshshfhfhNhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchfhfhfhfkEhohsiuhcaahcivililiwfDfDfDixiihXfEfFhXiiiyfDfDfDizililiAhcaahciBhskEhshfhfhfhfhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshoighshshohQhcaahcililililiriGfDhXiihXfEfFhXiihXfDiDirililililhcaahciEhohshshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshshohohsiFhcaahckFilililfDfDfDhXiihXfEfFhXiihXfDfDfDilililiAhcaahchohohshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshsmbhohsiFhcaahckFilililfDfDfDhXiihXfEfFhXiihXfDfDfDilililiAhcaahchohohshshohshchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchshohshshohcaPhcililililiriGfDiHiihXfEfFhXiihXfDiDirililililhcaPhchohshshsiIhchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchchchciJhchcaahcivilkGiwfDfDfDhXiihXfEfFhXiihXfDfDfDizilkGiAhcaahchciJhchchchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahciKiLiMiMhcaPhcililililiriNfDhXhXiOgifFhXhXhXfDiDirililililhcaPhciMiMiLiPhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -656,33 +771,33 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahchcfNjIjJgFgGfFfFfFfFjKfFfNhchcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcfNfNfNfNfEfFfFfFfNfNfNfNhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcfNjLjMfNfEfFfFfFfNjNjOfNhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcjPhchchcjQhchcjRhchchcjPhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjTjUjVjVjWjTjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXjVjUjVjVjWjVjXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXjVjUjVjVjWjVjXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXjYjZjYjYkajYjXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjWkbkckckckdjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjWjWkejWjWkfkgkhjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWjWkikjkfkfkfkkkljWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkmknkokfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkpkIkrkfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWjWkfksktkukfkfjWjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkvjWkfkfkfkfjWkvjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkwkfkfkfkfkxjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkykykykyjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahcjPhchchcjQhchcjRhchchcjPhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjTjUjVjVjWjTjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXjVjUjVjVjWjVjXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmcmcmcmcmcmcmcmcmcmcmcmdmdmdmdmdaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXjVjUjVjVjWjVjXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmcmemflvlvlvlulvlvlvlumdmgltmhmdaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXjYjZjYjYkajYjXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmemelvlvlvlvlvlvlvlvmiltmjltmdaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjWkbkckckckdjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmemelvlvlBlvlvlvlClvmdltmkltmdaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjWjWkejWjWkfkgkhjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmclvlvlvlvlvlvlvlvlvlvmdltmlltmdaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWjWkikjkfkfkfkkkljWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmmmmlvmnmnmcmcmcmclJmcmdmdmdmdmcmcaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkmknkokfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmmmmlvmomomcmpmqmqmqmqmqmrmqmqmqmcaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWkfkfkpkIkrkfkfkfjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmmmmlMmomomcmqmcmcmcmcmcmcmcmclJmcmcmcaGaGaGaGaGaGaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjWjWkfksktkukfkfjWjWjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmcmcmcmcmcmcmcmqmcmcmtmsmtmumumumumumvmcaGaGaGaGaGaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkvjWkfkfkfkfjWkvjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmqmrmqmwmwmwmqmqmcmcmtmtmtmumumumumumumcaGaGaGaGaGaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkwkfkfkfkfkxjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmqmqmqmqmqmqmqmqmcmcmtmtmxmumumymumumumcaGaGaGaGaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSkykykykyjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmqmqmqmqmqmqmqmqmcmcmumumumumAmzmCmBmumcaGaGaGaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaGaGaGaGaGaGmDmDmDmDmDmDaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSmEkfmFkfmGmHjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmwmqmqmqmqmImqmqmcmcmKmJmLmumumMmumumumcaGaGaGaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaGaGaGmDmDmDmDmDmDmNmNmOmOmDaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSkfmGkfmPmFkfjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmwmQmqmqmqmqmqmqmcmcmcmcmclFlFlFlFlFlFmcaGaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaGaGmDmDmNmNmNmNmNmNmNmOmOmDmDmDaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSkfmFmGkfmGkfjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGmcmwmqmqmqmRmqmqmqmcaGaGaGaGaaaaaaaaaaaaaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaGmDmNmNmSmNmNmNmTmNmOmOmDmDmDmDmDmDaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajSjSjSjSjSjSjSjSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmcmcmcmcmcmcmcmcmcmcaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaGmDmNmNmNmNmUmNmNmNmNmDmDmDmNmNmNmDmDmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaGmDmVmNmTmUmNmUmNmNmNmDmDmNmNmWmNmNmNmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaGmDmVmNmNmNmUmNmNmNmDmDmDmNmNmNmNmXmNmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaGmDmVmUmNmNmTmNmNmNmDmDmDmNmXmNmNmNmNmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaGmDmDmNmNmNmNmNmUmNmNmNmNmNmNmUmNmXmNmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaGmDmDmDmNmNmNmNmNmNmNmNmNmNmTmNmNmDmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaGaGmDmDmDmDmNmNmNmNmDmDmDmDmDmDmDaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaGaGaGmDmDmDmDmDmDmYaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 9a434b669c68770c71d3b40b90084d35d50f7a46 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 28 Nov 2015 22:05:20 +0100 Subject: [PATCH 47/62] Academy Fixes --- code/game/objects/structures/ladders.dm | 50 ++++++++++--------- .../awaymissions/mission_code/Academy.dm | 19 ++++++- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index c27f6cc9540..d5dc481041d 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -41,43 +41,38 @@ else //wtf make your ladders properly assholes icon_state = "ladder00" +/obj/structure/ladder/proc/go_up(mob/user,is_ghost) + if(!is_ghost) + show_fluff_message(1,user) + up.add_fingerprint(user) + user.loc = get_turf(up) + +/obj/structure/ladder/proc/go_down(mob/user,is_ghost) + if(!is_ghost) + show_fluff_message(0,user) + down.add_fingerprint(user) + user.loc = get_turf(down) + /obj/structure/ladder/proc/use(mob/user,is_ghost=0) if(up && down) switch( alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") ) if("Up") - if(!is_ghost) - user.visible_message("[user] climbs up \the [src].", \ - "You climb up \the [src].") - up.add_fingerprint(user) - user.loc = get_turf(up) + go_up(user,is_ghost) if("Down") - if(!is_ghost) - user.visible_message("[user] climbs down \the [src].", \ - "You climb down \the [src].") - down.add_fingerprint(user) - user.loc = get_turf(down) + go_down(user,is_ghost) if("Cancel") return - else if(up) - if(!is_ghost) - user.visible_message("[user] climbs up \the [src].", \ - "You climb up \the [src].") - up.add_fingerprint(user) - user.loc = get_turf(up) - + go_up(user,is_ghost) else if(down) - if(!is_ghost) - user.visible_message("[user] climbs down \the [src].", \ - "You climb down \the [src].") - down.add_fingerprint(user) - user.loc = get_turf(down) + go_down(user,is_ghost) if(!is_ghost) add_fingerprint(user) /obj/structure/ladder/attack_hand(mob/user) - use(user) + if(can_use(user)) + use(user) /obj/structure/ladder/attack_paw(mob/user) return attack_hand(user) @@ -88,6 +83,15 @@ /obj/structure/ladder/attack_ghost(mob/dead/observer/user) use(user,1) +/obj/structure/ladder/proc/show_fluff_message(up,mob/user) + if(up) + user.visible_message("[user] climbs up \the [src].","You climb up \the [src].") + else + user.visible_message("[user] climbs down \the [src].","You climb down \the [src].") + +/obj/structure/ladder/proc/can_use(mob/user) + return 1 + /obj/structure/ladder/unbreakable/Destroy() return QDEL_HINT_LETMELIVE diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 90d50af1e8b..ba6feda23f2 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -63,6 +63,7 @@ var/cooldown = 600 var/faction = "wizard" var/broken = 0 + var/braindead_check = 0 /obj/structure/academy_wizard_spawner/New() SSobj.processing |= src @@ -79,7 +80,11 @@ current_wizard = null summon_wizard() if(!current_wizard.client) - give_control() + if(!braindead_check) + braindead_check = 1 + else + braindead_check = 0 + give_control() next_check = world.time + cooldown /obj/structure/academy_wizard_spawner/proc/give_control() @@ -149,6 +154,8 @@ name = "Academy Wizard" r_pocket = null r_hand = null + suit = /obj/item/clothing/suit/wizrobe/red + head = /obj/item/clothing/head/wizard/red /obj/item/weapon/dice/d20/fate name = "Dice of Fate" @@ -324,4 +331,12 @@ color = rgb(0,0,255) /obj/structure/ladder/unbreakable/rune/update_icon() - return \ No newline at end of file + return + +/obj/structure/ladder/unbreakable/rune/show_fluff_message(up,mob/user) + user.visible_message("[user] activates \the [src].","You activate \the [src].") + +/obj/structure/ladder/can_use(mob/user) + if(user.mind in ticker.mode.wizards) + return 0 + return 1 \ No newline at end of file From eefecb56bcc10acfff5c793fe213562d8b4275ae Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 09:14:14 +0000 Subject: [PATCH 48/62] Automatic changelog generation for PR #13203 --- html/changelogs/AutoChangeLog-pr-13203.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13203.yml diff --git a/html/changelogs/AutoChangeLog-pr-13203.yml b/html/changelogs/AutoChangeLog-pr-13203.yml new file mode 100644 index 00000000000..314289c2836 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13203.yml @@ -0,0 +1,4 @@ +author: incoming5643 +delete-after: True +changes: + - rscadd: "OOC will now take steps to try and prevent accidental IC from people who mistakenly use OOC instead of say. This doesn't catch all mistakes, so please don't test it." From 4ecb2d17a34dc86cb1d4c70bf2688e301782b18c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:04:46 +0000 Subject: [PATCH 49/62] Automatic changelog generation for PR #13074 --- html/changelogs/AutoChangeLog-pr-13074.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13074.yml diff --git a/html/changelogs/AutoChangeLog-pr-13074.yml b/html/changelogs/AutoChangeLog-pr-13074.yml new file mode 100644 index 00000000000..b4a25911dd9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13074.yml @@ -0,0 +1,4 @@ +author: Yolopanther12 +delete-after: True +changes: + - rscadd: "Added the ability to use a box of lights on a light replacer to more quickly refill it to capacity." From 964a28cb48e2c3e1300e33dfcac362f358b3b000 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:05:38 +0000 Subject: [PATCH 50/62] Automatic changelog generation for PR #13024 --- html/changelogs/AutoChangeLog-pr-13024.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13024.yml diff --git a/html/changelogs/AutoChangeLog-pr-13024.yml b/html/changelogs/AutoChangeLog-pr-13024.yml new file mode 100644 index 00000000000..bdc2d4d5310 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13024.yml @@ -0,0 +1,5 @@ +author: TheNightingale +delete-after: True +changes: + - rscadd: "Nuclear operatives can now buy the Elite Syndicate Hardsuit for 8 TC that has better armor and fireproofing." + - tweak: "Added throwing stars and Syndicate playing cards to nuclear operative's uplink." From 2ae93dd24754daebb539896a3c31e0598d68f78e Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:05:51 +0000 Subject: [PATCH 51/62] Automatic changelog generation for PR #13097 --- html/changelogs/AutoChangeLog-pr-13097.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13097.yml diff --git a/html/changelogs/AutoChangeLog-pr-13097.yml b/html/changelogs/AutoChangeLog-pr-13097.yml new file mode 100644 index 00000000000..f9725392d9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13097.yml @@ -0,0 +1,4 @@ +author: Remie + Kor +delete-after: True +changes: + - tweak: "Holopads now use AltClick to request the AI" From 65b234e64316c28aab24f5f1970928b3fe328fad Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:06:02 +0000 Subject: [PATCH 52/62] Automatic changelog generation for PR #13104 --- html/changelogs/AutoChangeLog-pr-13104.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13104.yml diff --git a/html/changelogs/AutoChangeLog-pr-13104.yml b/html/changelogs/AutoChangeLog-pr-13104.yml new file mode 100644 index 00000000000..ee2e835b7e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13104.yml @@ -0,0 +1,4 @@ +author: GunHog +delete-after: True +changes: + - tweak: "Nanotrasen has improved the interface for the hand-held teleportation device. It will now provide the user with the name of the destination tracking beacon." From b9454acded5c609da549af6269450e07dec9971f Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:06:17 +0000 Subject: [PATCH 53/62] Automatic changelog generation for PR #13149 --- html/changelogs/AutoChangeLog-pr-13149.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13149.yml diff --git a/html/changelogs/AutoChangeLog-pr-13149.yml b/html/changelogs/AutoChangeLog-pr-13149.yml new file mode 100644 index 00000000000..cc76f13b2f1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13149.yml @@ -0,0 +1,4 @@ +author: Firecage +delete-after: True +changes: + - rscadd: "Hand tools now have variable operating speeds." From 4a483b03031165f8bc2b124085193daf4953757d Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:06:48 +0000 Subject: [PATCH 54/62] Automatic changelog generation for PR #13187 --- html/changelogs/AutoChangeLog-pr-13187.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13187.yml diff --git a/html/changelogs/AutoChangeLog-pr-13187.yml b/html/changelogs/AutoChangeLog-pr-13187.yml new file mode 100644 index 00000000000..7a4ddf53b25 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13187.yml @@ -0,0 +1,6 @@ +author: ktccd +delete-after: True +changes: + - bugfix: "Blob pieces on some areas no longer count for blob mode victory (Such as space or asteroid)." + - bugfix: "Blobcode no longer spawns and destroys blobs uselessly, which fixes other stuff too." + - bugfix: "Asteroid areas are no longer valid gang territory." From dd3593ed1d8df0afd2d356fef2e4fb7603a71122 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:07:19 +0000 Subject: [PATCH 55/62] Automatic changelog generation for PR #13230 --- html/changelogs/AutoChangeLog-pr-13230.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13230.yml diff --git a/html/changelogs/AutoChangeLog-pr-13230.yml b/html/changelogs/AutoChangeLog-pr-13230.yml new file mode 100644 index 00000000000..82dc82ea671 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13230.yml @@ -0,0 +1,4 @@ +author: JJRcop +delete-after: True +changes: + - bugfix: "Fixes changeling Hive Absorb DNA ability runtime." From de394769f7f1640396deb1a755b478758591873c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:07:30 +0000 Subject: [PATCH 56/62] Automatic changelog generation for PR #13246 --- html/changelogs/AutoChangeLog-pr-13246.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13246.yml diff --git a/html/changelogs/AutoChangeLog-pr-13246.yml b/html/changelogs/AutoChangeLog-pr-13246.yml new file mode 100644 index 00000000000..495863cc642 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13246.yml @@ -0,0 +1,5 @@ +author: KorPhaeron +delete-after: True +changes: + - rscadd: "Guardians and holoparasites can now be manually recalled by their master." + - rscadd: "The ghost controlling a guardian or holoparasite can be repicked by their master, only one use which is removed when a new ghost is chosen." From c5489f8a75e59ff7243f8078b90db76b18e3ef1c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 10:08:14 +0000 Subject: [PATCH 57/62] Automatic changelog generation for PR #13275 --- html/changelogs/AutoChangeLog-pr-13275.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13275.yml diff --git a/html/changelogs/AutoChangeLog-pr-13275.yml b/html/changelogs/AutoChangeLog-pr-13275.yml new file mode 100644 index 00000000000..1f64d09f6a9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13275.yml @@ -0,0 +1,5 @@ +author: swankcookie +delete-after: True +changes: + - bugfix: "Fixes issue of space-Christians forgetting about the true, humbling values of space-Christmas." + - rscadd: "Adds snowmen outfits" From 2c39ab0c4ded4677a6398b1a3ede54cb0320000a Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Sun, 29 Nov 2015 21:15:30 +1100 Subject: [PATCH 58/62] changelog --- html/changelog.html | 45 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 35 +++++++++++++++++ html/changelogs/AutoChangeLog-pr-13024.yml | 5 --- html/changelogs/AutoChangeLog-pr-13074.yml | 4 -- html/changelogs/AutoChangeLog-pr-13097.yml | 4 -- html/changelogs/AutoChangeLog-pr-13104.yml | 4 -- html/changelogs/AutoChangeLog-pr-13149.yml | 4 -- html/changelogs/AutoChangeLog-pr-13187.yml | 6 --- html/changelogs/AutoChangeLog-pr-13203.yml | 4 -- html/changelogs/AutoChangeLog-pr-13230.yml | 4 -- html/changelogs/AutoChangeLog-pr-13246.yml | 5 --- html/changelogs/AutoChangeLog-pr-13275.yml | 5 --- 12 files changed, 80 insertions(+), 45 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13024.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13074.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13097.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13104.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13149.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13187.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13203.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13230.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13246.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13275.yml diff --git a/html/changelog.html b/html/changelog.html index c517cd19db7..d9bfecf6610 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,23 @@ -->

29 November 2015

+

Firecage updated:

+
    +
  • Hand tools now have variable operating speeds.
  • +
+

GunHog updated:

+
    +
  • Nanotrasen has improved the interface for the hand-held teleportation device. It will now provide the user with the name of the destination tracking beacon.
  • +
+

JJRcop updated:

+
    +
  • Fixes changeling Hive Absorb DNA ability runtime.
  • +
+

KorPhaeron updated:

+
    +
  • Guardians and holoparasites can now be manually recalled by their master.
  • +
  • The ghost controlling a guardian or holoparasite can be repicked by their master, only one use which is removed when a new ghost is chosen.
  • +

MrStonedOne updated:

  • Re-adds 100% chance timed injectors, as it was removed over a misunderstanding.
  • @@ -67,6 +84,29 @@
  • Teleprods can have their crystal removed and be made back into stunprods by using them in your hand when they have no cell installed.
  • Mounted chainsaws now have a unique inhand sprite.
+

Remie + Kor updated:

+
    +
  • Holopads now use AltClick to request the AI
  • +
+

TheNightingale updated:

+
    +
  • Nuclear operatives can now buy the Elite Syndicate Hardsuit for 8 TC that has better armor and fireproofing.
  • +
  • Added throwing stars and Syndicate playing cards to nuclear operative's uplink.
  • +
+

Yolopanther12 updated:

+
    +
  • Added the ability to use a box of lights on a light replacer to more quickly refill it to capacity.
  • +
+

incoming5643 updated:

+
    +
  • OOC will now take steps to try and prevent accidental IC from people who mistakenly use OOC instead of say. This doesn't catch all mistakes, so please don't test it.
  • +
+

ktccd updated:

+
    +
  • Blob pieces on some areas no longer count for blob mode victory (Such as space or asteroid).
  • +
  • Blobcode no longer spawns and destroys blobs uselessly, which fixes other stuff too.
  • +
  • Asteroid areas are no longer valid gang territory.
  • +

neersighted updated:

  • Nanotrasen would like to announce NanoUI 2.0, now being rolled out across all our stations. Existing NanoUI devices have been updated, and more will be added soon. Please report any bugs to Nanotrasen Support.
  • @@ -74,6 +114,11 @@
  • Some NanoUI interfaces have had more information added.
  • Drones can now interact with NanoUI windows.
+

swankcookie updated:

+
    +
  • Fixes issue of space-Christians forgetting about the true, humbling values of space-Christmas.
  • +
  • Adds snowmen outfits
  • +

28 November 2015

TechnoAlchemisto updated:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 56d72683ca9..a891a084519 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2604,6 +2604,17 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. TechnoAlchemisto: - tweak: Cloaks are now worn in your exosuit slot! 2015-11-29: + Firecage: + - rscadd: Hand tools now have variable operating speeds. + GunHog: + - tweak: Nanotrasen has improved the interface for the hand-held teleportation device. + It will now provide the user with the name of the destination tracking beacon. + JJRcop: + - bugfix: Fixes changeling Hive Absorb DNA ability runtime. + KorPhaeron: + - rscadd: Guardians and holoparasites can now be manually recalled by their master. + - rscadd: The ghost controlling a guardian or holoparasite can be repicked by their + master, only one use which is removed when a new ghost is chosen. MrStonedOne: - rscadd: Re-adds 100% chance timed injectors, as it was removed over a misunderstanding. - bugfix: Fixes bug with injectors having a 100% power chance despite not being @@ -2616,6 +2627,26 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Teleprods can have their crystal removed and be made back into stunprods by using them in your hand when they have no cell installed. - imageadd: Mounted chainsaws now have a unique inhand sprite. + Remie + Kor: + - tweak: Holopads now use AltClick to request the AI + TheNightingale: + - rscadd: Nuclear operatives can now buy the Elite Syndicate Hardsuit for 8 TC that + has better armor and fireproofing. + - tweak: Added throwing stars and Syndicate playing cards to nuclear operative's + uplink. + Yolopanther12: + - rscadd: Added the ability to use a box of lights on a light replacer to more quickly + refill it to capacity. + incoming5643: + - rscadd: OOC will now take steps to try and prevent accidental IC from people who + mistakenly use OOC instead of say. This doesn't catch all mistakes, so please + don't test it. + ktccd: + - bugfix: Blob pieces on some areas no longer count for blob mode victory (Such + as space or asteroid). + - bugfix: Blobcode no longer spawns and destroys blobs uselessly, which fixes other + stuff too. + - bugfix: Asteroid areas are no longer valid gang territory. neersighted: - experiment: Nanotrasen would like to announce NanoUI 2.0, now being rolled out across all our stations. Existing NanoUI devices have been updated, and more @@ -2623,3 +2654,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Many NanoUI interfaces have had +/- buttons replaced with input fields. - tweak: Some NanoUI interfaces have had more information added. - bugfix: Drones can now interact with NanoUI windows. + swankcookie: + - bugfix: Fixes issue of space-Christians forgetting about the true, humbling values + of space-Christmas. + - rscadd: Adds snowmen outfits diff --git a/html/changelogs/AutoChangeLog-pr-13024.yml b/html/changelogs/AutoChangeLog-pr-13024.yml deleted file mode 100644 index bdc2d4d5310..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13024.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TheNightingale -delete-after: True -changes: - - rscadd: "Nuclear operatives can now buy the Elite Syndicate Hardsuit for 8 TC that has better armor and fireproofing." - - tweak: "Added throwing stars and Syndicate playing cards to nuclear operative's uplink." diff --git a/html/changelogs/AutoChangeLog-pr-13074.yml b/html/changelogs/AutoChangeLog-pr-13074.yml deleted file mode 100644 index b4a25911dd9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13074.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Yolopanther12 -delete-after: True -changes: - - rscadd: "Added the ability to use a box of lights on a light replacer to more quickly refill it to capacity." diff --git a/html/changelogs/AutoChangeLog-pr-13097.yml b/html/changelogs/AutoChangeLog-pr-13097.yml deleted file mode 100644 index f9725392d9a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13097.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Remie + Kor -delete-after: True -changes: - - tweak: "Holopads now use AltClick to request the AI" diff --git a/html/changelogs/AutoChangeLog-pr-13104.yml b/html/changelogs/AutoChangeLog-pr-13104.yml deleted file mode 100644 index ee2e835b7e8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13104.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: GunHog -delete-after: True -changes: - - tweak: "Nanotrasen has improved the interface for the hand-held teleportation device. It will now provide the user with the name of the destination tracking beacon." diff --git a/html/changelogs/AutoChangeLog-pr-13149.yml b/html/changelogs/AutoChangeLog-pr-13149.yml deleted file mode 100644 index cc76f13b2f1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13149.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Firecage -delete-after: True -changes: - - rscadd: "Hand tools now have variable operating speeds." diff --git a/html/changelogs/AutoChangeLog-pr-13187.yml b/html/changelogs/AutoChangeLog-pr-13187.yml deleted file mode 100644 index 7a4ddf53b25..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13187.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: ktccd -delete-after: True -changes: - - bugfix: "Blob pieces on some areas no longer count for blob mode victory (Such as space or asteroid)." - - bugfix: "Blobcode no longer spawns and destroys blobs uselessly, which fixes other stuff too." - - bugfix: "Asteroid areas are no longer valid gang territory." diff --git a/html/changelogs/AutoChangeLog-pr-13203.yml b/html/changelogs/AutoChangeLog-pr-13203.yml deleted file mode 100644 index 314289c2836..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13203.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: incoming5643 -delete-after: True -changes: - - rscadd: "OOC will now take steps to try and prevent accidental IC from people who mistakenly use OOC instead of say. This doesn't catch all mistakes, so please don't test it." diff --git a/html/changelogs/AutoChangeLog-pr-13230.yml b/html/changelogs/AutoChangeLog-pr-13230.yml deleted file mode 100644 index 82dc82ea671..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13230.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: JJRcop -delete-after: True -changes: - - bugfix: "Fixes changeling Hive Absorb DNA ability runtime." diff --git a/html/changelogs/AutoChangeLog-pr-13246.yml b/html/changelogs/AutoChangeLog-pr-13246.yml deleted file mode 100644 index 495863cc642..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13246.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: KorPhaeron -delete-after: True -changes: - - rscadd: "Guardians and holoparasites can now be manually recalled by their master." - - rscadd: "The ghost controlling a guardian or holoparasite can be repicked by their master, only one use which is removed when a new ghost is chosen." diff --git a/html/changelogs/AutoChangeLog-pr-13275.yml b/html/changelogs/AutoChangeLog-pr-13275.yml deleted file mode 100644 index 1f64d09f6a9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13275.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: swankcookie -delete-after: True -changes: - - bugfix: "Fixes issue of space-Christians forgetting about the true, humbling values of space-Christmas." - - rscadd: "Adds snowmen outfits" From 921c9eede157a6229aacbf7839263ab655698f11 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Sun, 29 Nov 2015 07:19:49 -0800 Subject: [PATCH 59/62] Asset cache Fixes Fixes asset cache locking up the MC initialization at world start. Fixes asset cache not pre-loading resources to clients that connect from a world reboot. Fixes a null reference runtime relating to the client disconnecting at the wrong time (I still conciser this to be a byond bug) Fixes crew monitor registering assets because they exist Fixes crew monitor trying to send zlevel assets for zlevels it hasn't processed. Fixes nano ui sometimes not sending the template asset to the client on open. --- code/game/machinery/computer/crew.dm | 12 +++-- code/modules/client/asset_cache.dm | 50 +++++++++++++++--- code/modules/html_interface/html_interface.dm | 8 +-- nano/{images => image_source}/icon-eye.xcf | Bin .../source/NTLogoRevised.fla | Bin .../source/icon-eye.xcf | Bin .../source/uiBackground-Syndicate.xcf | Bin .../source/uiBackground.fla | Bin .../source/uiBackground.xcf | Bin .../source/uiBasicBackground.xcf | Bin .../source/uiIcons16Green.xcf | Bin .../source/uiIcons16Red.xcf | Bin .../source/uiIcons24.xcf | Bin .../source/uiNoticeBackground.xcf | Bin .../source/uiTitleBackground.xcf | Bin .../{images => image_source}/uiBackground.xcf | Bin nano/{images => image_source}/uiIcons24.xcf | Bin .../uiNoticeBackground.xcf | Bin .../uiTitleBackground.xcf | Bin 19 files changed, 54 insertions(+), 16 deletions(-) rename nano/{images => image_source}/icon-eye.xcf (100%) rename nano/{images => image_source}/source/NTLogoRevised.fla (100%) rename nano/{images => image_source}/source/icon-eye.xcf (100%) rename nano/{images => image_source}/source/uiBackground-Syndicate.xcf (100%) rename nano/{images => image_source}/source/uiBackground.fla (100%) rename nano/{images => image_source}/source/uiBackground.xcf (100%) rename nano/{images => image_source}/source/uiBasicBackground.xcf (100%) rename nano/{images => image_source}/source/uiIcons16Green.xcf (100%) rename nano/{images => image_source}/source/uiIcons16Red.xcf (100%) rename nano/{images => image_source}/source/uiIcons24.xcf (100%) rename nano/{images => image_source}/source/uiNoticeBackground.xcf (100%) rename nano/{images => image_source}/source/uiTitleBackground.xcf (100%) rename nano/{images => image_source}/uiBackground.xcf (100%) rename nano/{images => image_source}/uiIcons24.xcf (100%) rename nano/{images => image_source}/uiNoticeBackground.xcf (100%) rename nano/{images => image_source}/uiTitleBackground.xcf (100%) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 71e3c28f84c..dd65277eb70 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -29,6 +29,7 @@ var/global/datum/crewmonitor/crewmonitor = new var/const/MAX_ICON_DIMENSION = 1024 var/const/ICON_SIZE = 4 var/initialized = FALSE + var/max_initialized_zlevel = 0 /datum/crewmonitor/New() . = ..() @@ -79,8 +80,6 @@ var/global/datum/crewmonitor/crewmonitor = new src.data = list() register_asset("crewmonitor.js",'crew.js') register_asset("crewmonitor.css",'crew.css') - for (var/z = 1 to world.maxz) - register_asset("minimap_[z].png", file("[getMinimapFile(z)].png")) /datum/crewmonitor/Destroy() if (src.interfaces) @@ -261,15 +260,18 @@ var/global/datum/crewmonitor/crewmonitor = new /datum/crewmonitor/proc/generateMiniMaps() for(var/z = 1 to world.maxz) generateMiniMap(z) + for (var/z = 1 to world.maxz) + register_asset("minimap_[z].png", file("[getMinimapFile(z)].png")) + + max_initialized_zlevel = world.maxz + world << "All minimaps have been generated." - for(var/client/C in clients) - sendResources(C) initialized = TRUE /datum/crewmonitor/proc/sendResources(var/client/client) send_asset(client, "crewmonitor.js") send_asset(client, "crewmonitor.css") - for (var/z = 1 to world.maxz) + for (var/z = 1 to max_initialized_zlevel) send_asset(client, "minimap_[z].png") /datum/crewmonitor/proc/getMinimapFile(z) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 7cc89dcd5f2..daac7306695 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -1,4 +1,21 @@ -#define ASSET_CACHE_SEND_TIMEOUT 25 // Amount of time MAX to send an asset, if this get exceeded we cancel the sleeping. +/* +Asset cache quick users guide: + +Make a datum at the bottom of this file with your assets for your thing. +The simple subsystem will most like be of use for most cases. +Then call get_asset_datum() with the type of the datum you created and store the return +Then call .send(client) on that stored return value. + +You can set verify to TRUE if you want send() to sleep until the client has the assets. +*/ + + +// Amount of time(ds) MAX to send per asset, if this get exceeded we cancel the sleeping. +// This is doubled for the first asset, then added per asset after +#define ASSET_CACHE_SEND_TIMEOUT 7 + +//When sending mutiple assets, how many before we give the client a quant little sending resources message +#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8 //List of ALL assets for the above, format is list(filename = asset). /var/global/list/asset_cache = list() @@ -10,6 +27,7 @@ var/last_asset_job = 0 // Last job done. //This proc sends the asset to the client, but only if it needs it. +//This proc blocks(sleeps) unless verify is set to false /proc/send_asset(var/client/client, var/asset_name, var/verify = TRUE) if(!istype(client)) if(ismob(client)) @@ -28,8 +46,11 @@ client << browse_rsc(asset_cache[asset_name], asset_name) if(!verify || !winexists(client, "asset_cache_browser")) // Can't access the asset cache browser, rip. - client.cache += asset_name + if (client) + client.cache += asset_name return 1 + if (!client) + return 0 client.sending |= asset_name var/job = ++client.last_asset_job @@ -41,7 +62,7 @@ "}, "window=asset_cache_browser") var/t = 0 - var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len + var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() sleep(1) // Lock up the caller until this is received. t++ @@ -53,6 +74,7 @@ return 1 +//This proc blocks(sleeps) unless verify is set to false /proc/send_asset_list(var/client/client, var/list/asset_list, var/verify = TRUE) if(!istype(client)) if(ismob(client)) @@ -69,15 +91,18 @@ var/list/unreceived = asset_list - (client.cache + client.sending) if(!unreceived || !unreceived.len) return 0 - + if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) + client << "Sending Resources..." for(var/asset in unreceived) if (asset in asset_cache) client << browse_rsc(asset_cache[asset], asset) if(!verify || !winexists(client, "asset_cache_browser")) // Can't access the asset cache browser, rip. - client.cache += unreceived + if (client) + client.cache += unreceived return 1 - + if (!client) + return 0 client.sending |= unreceived var/job = ++client.last_asset_job @@ -101,11 +126,15 @@ return 1 //This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start. +//The proc calls procs that sleep for long times. proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) for(var/file in files) + if (!client) + break if (register_asset) register_asset(file,files[file]) send_asset(client,file) + sleep(-1) //queuing calls like this too quickly can cause issues in some client versions //This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. //if it's an icon or something be careful, you'll have to copy it before further use. @@ -118,6 +147,11 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) var/datum/asset/A = new type() A.register() + for(var/client/C in clients) + //doing this to a client too soon after they've connected can cause issues, also the proc we call sleeps + spawn(10) + getFilesSlow(C, asset_cache, FALSE) + //These datums are used to populate the asset cache, the proc "register()" does this. //all of our asset datums, used for referring to these later @@ -238,5 +272,5 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) if(!islist(uncommon)) uncommon = list(uncommon) - send_asset_list(client, uncommon, FALSE) - send_asset_list(client, common, TRUE) \ No newline at end of file + send_asset_list(client, uncommon) + send_asset_list(client, common) \ No newline at end of file diff --git a/code/modules/html_interface/html_interface.dm b/code/modules/html_interface/html_interface.dm index 07a436813ac..38fb620fddb 100644 --- a/code/modules/html_interface/html_interface.dm +++ b/code/modules/html_interface/html_interface.dm @@ -109,7 +109,7 @@ mob/verb/test() // A type associated list of assets the interface needs. //Sent to the client when the interface opens on the client for the first time. - var/static/asset_list = list() + var/static/list/asset_list /datum/html_interface/New(atom/ref, title, width = 700, height = 480, head = "") html_interfaces.Add(src) @@ -143,7 +143,8 @@ mob/verb/test() for (var/R in resources) register_asset(R,resources[R]) assetlist += R - + if (!asset_list) + asset_list = list() asset_list[type] = assetlist /datum/html_interface/proc/createWindow(datum/html_interface_client/hclient) @@ -220,7 +221,8 @@ mob/verb/test() hclient = getClient(hclient, TRUE) if (istype(hclient)) - send_asset_list(hclient.client,asset_list[type], TRUE) + if (type in asset_list && islist(asset_list[type])) + send_asset_list(hclient.client, asset_list[type], TRUE) if (!winexists(hclient.client, "browser_\ref[src]")) src.createWindow(hclient) diff --git a/nano/images/icon-eye.xcf b/nano/image_source/icon-eye.xcf similarity index 100% rename from nano/images/icon-eye.xcf rename to nano/image_source/icon-eye.xcf diff --git a/nano/images/source/NTLogoRevised.fla b/nano/image_source/source/NTLogoRevised.fla similarity index 100% rename from nano/images/source/NTLogoRevised.fla rename to nano/image_source/source/NTLogoRevised.fla diff --git a/nano/images/source/icon-eye.xcf b/nano/image_source/source/icon-eye.xcf similarity index 100% rename from nano/images/source/icon-eye.xcf rename to nano/image_source/source/icon-eye.xcf diff --git a/nano/images/source/uiBackground-Syndicate.xcf b/nano/image_source/source/uiBackground-Syndicate.xcf similarity index 100% rename from nano/images/source/uiBackground-Syndicate.xcf rename to nano/image_source/source/uiBackground-Syndicate.xcf diff --git a/nano/images/source/uiBackground.fla b/nano/image_source/source/uiBackground.fla similarity index 100% rename from nano/images/source/uiBackground.fla rename to nano/image_source/source/uiBackground.fla diff --git a/nano/images/source/uiBackground.xcf b/nano/image_source/source/uiBackground.xcf similarity index 100% rename from nano/images/source/uiBackground.xcf rename to nano/image_source/source/uiBackground.xcf diff --git a/nano/images/source/uiBasicBackground.xcf b/nano/image_source/source/uiBasicBackground.xcf similarity index 100% rename from nano/images/source/uiBasicBackground.xcf rename to nano/image_source/source/uiBasicBackground.xcf diff --git a/nano/images/source/uiIcons16Green.xcf b/nano/image_source/source/uiIcons16Green.xcf similarity index 100% rename from nano/images/source/uiIcons16Green.xcf rename to nano/image_source/source/uiIcons16Green.xcf diff --git a/nano/images/source/uiIcons16Red.xcf b/nano/image_source/source/uiIcons16Red.xcf similarity index 100% rename from nano/images/source/uiIcons16Red.xcf rename to nano/image_source/source/uiIcons16Red.xcf diff --git a/nano/images/source/uiIcons24.xcf b/nano/image_source/source/uiIcons24.xcf similarity index 100% rename from nano/images/source/uiIcons24.xcf rename to nano/image_source/source/uiIcons24.xcf diff --git a/nano/images/source/uiNoticeBackground.xcf b/nano/image_source/source/uiNoticeBackground.xcf similarity index 100% rename from nano/images/source/uiNoticeBackground.xcf rename to nano/image_source/source/uiNoticeBackground.xcf diff --git a/nano/images/source/uiTitleBackground.xcf b/nano/image_source/source/uiTitleBackground.xcf similarity index 100% rename from nano/images/source/uiTitleBackground.xcf rename to nano/image_source/source/uiTitleBackground.xcf diff --git a/nano/images/uiBackground.xcf b/nano/image_source/uiBackground.xcf similarity index 100% rename from nano/images/uiBackground.xcf rename to nano/image_source/uiBackground.xcf diff --git a/nano/images/uiIcons24.xcf b/nano/image_source/uiIcons24.xcf similarity index 100% rename from nano/images/uiIcons24.xcf rename to nano/image_source/uiIcons24.xcf diff --git a/nano/images/uiNoticeBackground.xcf b/nano/image_source/uiNoticeBackground.xcf similarity index 100% rename from nano/images/uiNoticeBackground.xcf rename to nano/image_source/uiNoticeBackground.xcf diff --git a/nano/images/uiTitleBackground.xcf b/nano/image_source/uiTitleBackground.xcf similarity index 100% rename from nano/images/uiTitleBackground.xcf rename to nano/image_source/uiTitleBackground.xcf From 59963b89b5038d8b8690f7b8fb0c285d289d4228 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 29 Nov 2015 08:00:33 -0800 Subject: [PATCH 60/62] quant --> quaint --- code/modules/client/asset_cache.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index daac7306695..721a7827941 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -14,7 +14,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the // This is doubled for the first asset, then added per asset after #define ASSET_CACHE_SEND_TIMEOUT 7 -//When sending mutiple assets, how many before we give the client a quant little sending resources message +//When sending mutiple assets, how many before we give the client a quaint little sending resources message #define ASSET_CACHE_TELL_CLIENT_AMOUNT 8 //List of ALL assets for the above, format is list(filename = asset). @@ -273,4 +273,4 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) uncommon = list(uncommon) send_asset_list(client, uncommon) - send_asset_list(client, common) \ No newline at end of file + send_asset_list(client, common) From a6304bc60ae5549654e5ab95cc5c9388224dc8db Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 29 Nov 2015 16:16:02 +0000 Subject: [PATCH 61/62] Automatic changelog generation for PR #13315 --- html/changelogs/AutoChangeLog-pr-13315.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13315.yml diff --git a/html/changelogs/AutoChangeLog-pr-13315.yml b/html/changelogs/AutoChangeLog-pr-13315.yml new file mode 100644 index 00000000000..80b7dc7bca3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13315.yml @@ -0,0 +1,6 @@ +author: MrStonedOne +delete-after: True +changes: + - bugfix: "Fixes the excessive amount of time it took the game to initialize." + - bugfix: "Fixes some interface bugs." + - rscadd: "when an interface window has to send a lot of resources before it can open, it will now tell you with a \"sending resources\" line so you know why it's not opening right away." From 3dae15798a8bc34a4fa719db1624a382ad1da32a Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sun, 29 Nov 2015 16:17:15 +0000 Subject: [PATCH 62/62] Automatic changelog compile --- html/changelog.html | 3 +++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-13315.yml | 6 ------ 3 files changed, 8 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13315.yml diff --git a/html/changelog.html b/html/changelog.html index d9bfecf6610..a745df8b633 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -77,6 +77,9 @@
  • Re-adds 100% chance timed injectors, as it was removed over a misunderstanding.
  • Fixes bug with injectors having a 100% power chance despite not being timed
  • +
  • Fixes the excessive amount of time it took the game to initialize.
  • +
  • Fixes some interface bugs.
  • +
  • when an interface window has to send a lot of resources before it can open, it will now tell you with a "sending resources" line so you know why it's not opening right away.

PKPenguin321 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index a891a084519..6abd4e726ed 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2619,6 +2619,11 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Re-adds 100% chance timed injectors, as it was removed over a misunderstanding. - bugfix: Fixes bug with injectors having a 100% power chance despite not being timed + - bugfix: Fixes the excessive amount of time it took the game to initialize. + - bugfix: Fixes some interface bugs. + - rscadd: when an interface window has to send a lot of resources before it can + open, it will now tell you with a "sending resources" line so you know why it's + not opening right away. PKPenguin321: - rscadd: Teleprods can now be constructed. Make them via tablecrafting, or by putting a bluespace crystal onto a stunprod. They warp the target to a random nearby diff --git a/html/changelogs/AutoChangeLog-pr-13315.yml b/html/changelogs/AutoChangeLog-pr-13315.yml deleted file mode 100644 index 80b7dc7bca3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13315.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: MrStonedOne -delete-after: True -changes: - - bugfix: "Fixes the excessive amount of time it took the game to initialize." - - bugfix: "Fixes some interface bugs." - - rscadd: "when an interface window has to send a lot of resources before it can open, it will now tell you with a \"sending resources\" line so you know why it's not opening right away."