From 0d8537700c7272a8e96c20a06a20a73877a456be Mon Sep 17 00:00:00 2001 From: MrSnapwalk Date: Sun, 15 Feb 2015 17:38:27 -0600 Subject: [PATCH 01/30] Adds the Bosun's Whistle. --- code/game/objects/items/toys.dm | 19 ++++++++++++++++++- icons/obj/toy.dmi | Bin 15559 -> 4836 bytes 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 8a974df69a..38b646a03a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -6,6 +6,7 @@ * Toy gun * Toy crossbow * Toy swords + * Toy bosun's whistle * Toy mechs * Crayons * Snap pops @@ -98,7 +99,7 @@ icon_state = "syndballoon" item_state = "syndballoon" w_class = 4.0 - + /obj/item/toy/nanotrasenballoon name = "criminal balloon" desc = "Across the balloon the following is printed: \"Man, I love NT soooo much. I use only NanoTrasen products. You have NO idea.\"" @@ -498,6 +499,22 @@ if(..(user, 0)) user << text("\icon[] [] units of water left!", src, src.reagents.total_volume) +/* + * Bosun's whistle + */ + + /obj/item/toy/bosunwhistle + name = "bosun's whistle" + desc = "A genuine Admiral Krush Bosun's Whistle, for the aspiring ship's captain! Suitable for ages 8 and up, do not swallow." + icon = 'icons/obj/toy.dmi' + icon_state = "bosunwhistle" + var/cooldown = 0 + +/obj/item/toy/bosunwhistle/attack_self(mob/user as mob) + if(cooldown < world.time - 35) + user << "You blow on [src], creating an ear-splitting noise!" + playsound(user, 'sound/misc/boatswain.ogg', 20, 1) + cooldown = world.time /* * Mech prizes diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index a921d45d4830b1a9783fc082814cc381d07abec4..5f52d20fccfdfc8a6f9a40d541f909530f1d2545 100644 GIT binary patch literal 4836 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 S2K<3CAoWS^W2LCB-~RzQt>A$G From 5ffa0e639758584541b7ed1eb18a72931baf7b18 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Mon, 16 Feb 2015 19:53:12 +0100 Subject: [PATCH 02/30] fixes curbstomp, adjusts texts --- .../living/carbon/human/human_attackhand.dm | 1 + .../mob/living/carbon/human/unarmed_attack.dm | 31 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index bb02aee5e0..5029c283ec 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -116,6 +116,7 @@ if(src.grabbed_by.len || src.buckled || !src.canmove || src==H) accurate = 1 // certain circumstances make it impossible for us to evade punches + rand_damage = 5 // Process evasion and blocking var/miss_type = 0 diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index c98e3788c0..d033e70610 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -64,7 +64,7 @@ target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour) if("l_leg", "l_foot", "r_leg", "r_foot") if(!target.lying) - target.visible_message("[src] gives way slightly.") + target.visible_message("[target] gives way slightly.") target.apply_effect(attack_damage*3, AGONY, armour) else if(attack_damage >= 5 && !(target == user) && (stun_chance + attack_damage * 5 >= 100) && armour < 2) // Chance to get the usual throwdown as well (25% standard chance) if(!target.lying) @@ -118,22 +118,28 @@ user.visible_message("[user] slapped [target] across \his cheek!") if(3 to 4) user.visible_message(pick( - 80; "[user] [pick(attack_verb)] [target] in the head!", //striking someone with a 'closed fist' is called punching them. - 20; "[user] struck [target] in the head[pick("", " with a closed fist")]!" + 40; "[user] [pick(attack_verb)] [target] in the head!", + 30; "[user] struck [target] in the head[pick("", " with a closed fist")]!", + 30; "[user] threw a hook against [target]'s head!" )) if(5) user.visible_message(pick( - 10; "[user] gave [target] a resounding slap to the face!", - 90; "[user] smashed \his [pick(attack_noun)] into [target]'s [organ]!" + 30; "[user] gave [target] a resounding [pick("slap", "punch")] to the face!", + 40; "[user] smashed \his [pick(attack_noun)] into [target]'s face!", + 30; "[user] gave a strong blow against [target]'s jaw!" )) else // ----- BODY ----- // switch(attack_damage) - if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!") - if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") - if(5) user.visible_message("[user] smashed \his [pick(attack_noun)] into [target]'s [organ]!") + if(1 to 2) user.visible_message("[user] threw a glancing punch at [target]'s [organ]!") + if(1 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") + if(5) + user.visible_message(pick( + 50; "[user] smashed \his [pick(attack_noun)] into [target]'s [organ]!", + 50; "[user] landed a striking [pick(attack_noun)] on [target]'s [organ]!" + )) else - user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "slammed their [pick(attack_noun)] into")] [target]'s [organ]!") //why do we have a separate set of verbs for lying targets? + user.visible_message("[user] [pick("punched", "threw a punch against", "struck", "slammed their [pick(attack_noun)] into")] [target]'s [organ]!") //why do we have a separate set of verbs for lying targets? /datum/unarmed_attack/kick attack_verb = list("kicked", "kicked", "kicked", "kneed") @@ -177,7 +183,7 @@ /datum/unarmed_attack/stomp attack_verb = null - attack_noun = list("kick") + attack_noun = list("stomp") attack_sound = "swing_hit" damage = 0 @@ -189,7 +195,7 @@ if(!istype(target)) return 0 - if (!user.lying && (target.lying || zone in list("l_foot", "r_foot"))) + if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot")))) if(target.grabbed_by == user && target.lying) return 0 var/datum/organ/external/E = user.organs_by_name["l_foot"] @@ -214,6 +220,5 @@ attack_damage = Clamp(attack_damage, 1, 5) switch(attack_damage) - if(1 to 2) user.visible_message("[user] [pick("stepped on", "treaded on")] [target]'s [organ]!") //stepped on conveys the same meaning and is more recognizable as an actual word than "clomped" - if(3 to 4) user.visible_message("[pick("[user] stomped on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") + if(1 to 4) user.visible_message("[pick("[user] stomped on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") if(5) user.visible_message("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/ \ No newline at end of file From 27ee550ddbeb3fba9774c1e3593743e1ca458c73 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 17 Feb 2015 01:43:03 -0500 Subject: [PATCH 03/30] Fixes #7870 --- icons/mob/robots.dmi | Bin 155561 -> 155583 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index f83d75f3f6430d8b2909e075e4d7ef524b3ce659..777f68c62e6f10f6b587c24c9e7a02387ff3aa06 100644 GIT binary patch delta 10728 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 delta 10706 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 TyTjK506 Date: Tue, 17 Feb 2015 17:01:10 +0300 Subject: [PATCH 04/30] Fixes a sanity check turned insanity check forcing everyone to go commando. --- code/modules/client/preferences_savefile.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 17003ddc3c..76b25c9659 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -191,9 +191,11 @@ if(isnull(species) || !(species in playable_species)) species = "Human" + if(isnum(underwear)) var/list/undies = gender == MALE ? underwear_m : underwear_f underwear = undies[undies[underwear]] + if(isnum(undershirt)) undershirt = undershirt_t[undershirt_t[undershirt]] @@ -219,8 +221,6 @@ r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) - underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) From 52072bc7cf00abc77d0a5cd8399ba6b29a2e1a34 Mon Sep 17 00:00:00 2001 From: MrSnapwalk Date: Tue, 17 Feb 2015 20:38:13 -0600 Subject: [PATCH 05/30] Adds action figures, large and small plushies, and the toy cult sword. Adds all new toys to the arcade machine. --- code/game/machinery/computer/arcade.dm | 7 +- code/game/objects/items/toys.dm | 301 ++++++++++++++++++++++++- code/game/objects/random/random.dm | 60 +++++ icons/obj/toy.dmi | Bin 4836 -> 30094 bytes 4 files changed, 365 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 2915bf0761..c95bc1dff3 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,6 +1,6 @@ /obj/machinery/computer/arcade name = "arcade machine" - desc = "Does not support Pin ball." + desc = "Does not support pinball." icon = 'icons/obj/computer.dmi' icon_state = "arcade" circuit = "/obj/item/weapon/circuitboard/arcade" @@ -32,7 +32,10 @@ /obj/item/toy/prize/mauler = 1, /obj/item/toy/prize/odysseus = 1, /obj/item/toy/prize/phazon = 1, - /obj/item/toy/waterflower = 1 + /obj/item/toy/waterflower = 1, + /obj/random/action_figure = 1, + /obj/random/plushie = 1, + /obj/item/toy/cultsword = 1 ) /obj/machinery/computer/arcade diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 38b646a03a..321196c76b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -14,6 +14,9 @@ * Therapy dolls * Toddler doll * Inflatable duck + * Action figures + * Plushies + * Toy cult sword */ @@ -559,7 +562,6 @@ desc = "Mini-Mecha action figure! Collect them all! 4/11." icon_state = "gygaxtoy" - /obj/item/toy/prize/durand name = "toy durand" desc = "Mini-Mecha action figure! Collect them all! 5/11." @@ -595,6 +597,207 @@ desc = "Mini-Mecha action figure! Collect them all! 11/11." icon_state = "phazonprize" +/* + * Action figures + */ + + +/obj/item/toy/figure + name = "Completely Glitched action figure" + desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death." + icon_state = "assistant" + icon = 'icons/obj/toy.dmi' + +/obj/item/toy/figure/cmo + name = "Chief Medical Officer action figure" + desc = "A \"Space Life\" brand Chief Medical Officer action figure." + icon_state = "cmo" + +/obj/item/toy/figure/assistant + name = "Assistant action figure" + desc = "A \"Space Life\" brand Assistant action figure." + icon_state = "assistant" + +/obj/item/toy/figure/atmos + name = "Atmospheric Technician action figure" + desc = "A \"Space Life\" brand Atmospheric Technician action figure." + icon_state = "atmos" + +/obj/item/toy/figure/bartender + name = "Bartender action figure" + desc = "A \"Space Life\" brand Bartender action figure." + icon_state = "bartender" + +/obj/item/toy/figure/borg + name = "Cyborg action figure" + desc = "A \"Space Life\" brand Cyborg action figure." + icon_state = "borg" + +/obj/item/toy/figure/gardener + name = "Gardener action figure" + desc = "A \"Space Life\" brand Gardener action figure." + icon_state = "botanist" + +/obj/item/toy/figure/captain + name = "Captain action figure" + desc = "A \"Space Life\" brand Captain action figure." + icon_state = "captain" + +/obj/item/toy/figure/cargotech + name = "Cargo Technician action figure" + desc = "A \"Space Life\" brand Cargo Technician action figure." + icon_state = "cargotech" + +/obj/item/toy/figure/ce + name = "Chief Engineer action figure" + desc = "A \"Space Life\" brand Chief Engineer action figure." + icon_state = "ce" + +/obj/item/toy/figure/chaplain + name = "Chaplain action figure" + desc = "A \"Space Life\" brand Chaplain action figure." + icon_state = "chaplain" + +/obj/item/toy/figure/chef + name = "Chef action figure" + desc = "A \"Space Life\" brand Chef action figure." + icon_state = "chef" + +/obj/item/toy/figure/chemist + name = "Chemist action figure" + desc = "A \"Space Life\" brand Chemist action figure." + icon_state = "chemist" + +/obj/item/toy/figure/clown + name = "Clown action figure" + desc = "A \"Space Life\" brand Clown action figure." + icon_state = "clown" + +/obj/item/toy/figure/corgi + name = "Corgi action figure" + desc = "A \"Space Life\" brand Corgi action figure." + icon_state = "ian" + +/obj/item/toy/figure/detective + name = "Detective action figure" + desc = "A \"Space Life\" brand Detective action figure." + icon_state = "detective" + +/obj/item/toy/figure/dsquad + name = "Space Commando action figure" + desc = "A \"Space Life\" brand Space Commando action figure." + icon_state = "dsquad" + +/obj/item/toy/figure/engineer + name = "Engineer action figure" + desc = "A \"Space Life\" brand Engineer action figure." + icon_state = "engineer" + +/obj/item/toy/figure/geneticist + name = "Geneticist action figure" + desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued." + icon_state = "geneticist" + +/obj/item/toy/figure/hop + name = "Head of Personel action figure" + desc = "A \"Space Life\" brand Head of Personel action figure." + icon_state = "hop" + +/obj/item/toy/figure/hos + name = "Head of Security action figure" + desc = "A \"Space Life\" brand Head of Security action figure." + icon_state = "hos" + +/obj/item/toy/figure/qm + name = "Quartermaster action figure" + desc = "A \"Space Life\" brand Quartermaster action figure." + icon_state = "qm" + +/obj/item/toy/figure/janitor + name = "Janitor action figure" + desc = "A \"Space Life\" brand Janitor action figure." + icon_state = "janitor" + +/obj/item/toy/figure/agent + name = "Internal Affairs Agent action figure" + desc = "A \"Space Life\" brand Internal Affairs Agent action figure." + icon_state = "agent" + +/obj/item/toy/figure/librarian + name = "Librarian action figure" + desc = "A \"Space Life\" brand Librarian action figure." + icon_state = "librarian" + +/obj/item/toy/figure/md + name = "Medical Doctor action figure" + desc = "A \"Space Life\" brand Medical Doctor action figure." + icon_state = "md" + +/obj/item/toy/figure/mime + name = "Mime action figure" + desc = "A \"Space Life\" brand Mime action figure." + icon_state = "mime" + +/obj/item/toy/figure/miner + name = "Shaft Miner action figure" + desc = "A \"Space Life\" brand Shaft Miner action figure." + icon_state = "miner" + +/obj/item/toy/figure/ninja + name = "Space Ninja action figure" + desc = "A \"Space Life\" brand Space Ninja action figure." + icon_state = "ninja" + +/obj/item/toy/figure/wizard + name = "Wizard action figure" + desc = "A \"Space Life\" brand Wizard action figure." + icon_state = "wizard" + +/obj/item/toy/figure/rd + name = "Research Director action figure" + desc = "A \"Space Life\" brand Research Director action figure." + icon_state = "rd" + +/obj/item/toy/figure/roboticist + name = "Roboticist action figure" + desc = "A \"Space Life\" brand Roboticist action figure." + icon_state = "roboticist" + +/obj/item/toy/figure/scientist + name = "Scientist action figure" + desc = "A \"Space Life\" brand Scientist action figure." + icon_state = "scientist" + +/obj/item/toy/figure/syndie + name = "Doom Operative action figure" + desc = "A \"Space Life\" brand Doom Operative action figure." + icon_state = "syndie" + +/obj/item/toy/figure/secofficer + name = "Security Officer action figure" + desc = "A \"Space Life\" brand Security Officer action figure." + icon_state = "secofficer" + +/obj/item/toy/figure/warden + name = "Warden action figure" + desc = "A \"Space Life\" brand Warden action figure." + icon_state = "warden" + +/obj/item/toy/figure/psychologist + name = "Psychologist action figure" + desc = "A \"Space Life\" brand Psychologist action figure." + icon_state = "psychologist" + +/obj/item/toy/figure/paramedic + name = "Paramedic action figure" + desc = "A \"Space Life\" brand Paramedic action figure." + icon_state = "paramedic" + +/obj/item/toy/figure/ert + name = "Emergency Response Team Commander action figure" + desc = "A \"Space Life\" brand Emergency Response Team Commander action figure." + icon_state = "ert" + /obj/item/toy/katana name = "replica katana" desc = "Woefully underpowered in D20." @@ -656,6 +859,102 @@ item_state = "egg3" // It's the green egg in items_left/righthand w_class = 1 +/* + * Plushies + */ + +//Large plushies. +/obj/structure/plushie + name = "generic large plushie" + desc = "A very generic plushie. It seems to not want to exist." + icon = 'icons/obj/toy.dmi' + icon_state = "ianplushie" + anchored = 0 + density = 1 + var/phrase = "I don't want to exist anymore!" + +/obj/structure/plushie/attack_hand(mob/user) + if(user.a_intent == "help") + user.visible_message("[user] hugs [src]!","You hug [src]!") + else if (user.a_intent == "hurt") + user.visible_message("[user] punches [src]!","You punch [src]!") + else if (user.a_intent == "grab") + user.visible_message("[user] attempts to strangle [src]!","You attempt to strangle [src]!") + else + user.visible_message("[user] pokes the [src].","You poke the [src].") + visible_message("[src] says, \"[phrase]\"") + +/obj/structure/plushie/ian + name = "plushie corgi" + desc = "A plushie of an adorable corgi! Don't you just want to hug it and squeeze it and call it \"Ian\"?" + icon_state = "ianplushie" + phrase = "Arf!" + +/obj/structure/plushie/drone + name = "plushie drone" + desc = "A plushie of a happy drone! It appears to be smiling, and has a small tag which reads \"N.D.V. Icarus Gift Shop\"." + icon_state = "droneplushie" + phrase = "Beep boop!" + +/obj/structure/plushie/carp + name = "plushie carp" + desc = "A plushie of an elated carp! Straight from the wilds of the Nyx frontier, now right here in your hands." + icon_state = "carpplushie" + phrase = "Glorf!" + +/obj/structure/plushie/beepsky + name = "plushie Officer Sweepsky" + desc = "A plushie of a popular industrious cleaning robot! If it could feel emotions, it would love you." + icon_state = "beepskyplushie" + phrase = "Ping!" + +//Small plushies. +/obj/item/toy/plushie + name = "generic small plushie" + desc = "A very generic small plushie. It seems to not want to exist." + icon = 'icons/obj/toy.dmi' + icon_state = "nymphplushie" + var/phrase = "Please, end my existance! I beg you!" + +/obj/item/toy/plushie/attack_self(mob/user as mob) + if(user.a_intent == "help") + user.visible_message("[user] hugs [src]!","You hug [src]!") + else if (user.a_intent == "hurt") + user.visible_message("[user] punches [src]!","You punch [src]!") + else if (user.a_intent == "grab") + user.visible_message("[user] attempts to strangle [src]!","You attempt to strangle [src]!") + else + user.visible_message("[user] pokes the [src].","You poke the [src].") + +/obj/item/toy/plushie/nymph + name = "diona nymph plushie" + desc = "A plushie of an adorable diona nymph! While it's level of self-awareness is still being debated, it's level of cuteness is not." + icon_state = "nymphplushie" + +/obj/item/toy/plushie/mouse + name = "mouse plushie" + desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." + icon_state = "mouseplushie" + +/obj/item/toy/plushie/kitten + name = "kitten plushie" + desc = "A plushie of a cute kitten! Watch as it purrs it's way right into your heart." + icon_state = "kittenplushie" + +/obj/item/toy/plushie/lizard + name = "lizard plushie" + desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi." + icon_state = "lizardplushie" + +//Toy cult sword +/obj/item/toy/cultsword + name = "foam sword" + desc = "An arcane weapon (made of foam) wielded by the followers of the hit Saturday morning cartoon \"King Nursee and the Acolytes of Heroism\"." + icon = 'icons/obj/weapons.dmi' + icon_state = "cultblade" + item_state = "cultblade" + w_class = 4 + attack_verb = list("attacked", "slashed", "stabbed", "poked") /* NYET. /obj/item/weapon/toddler diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index d62d1d1a54..4c7a3ecb41 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -113,3 +113,63 @@ prob(2);/obj/item/weapon/storage/belt/utility,\ prob(5);/obj/random/tool,\ prob(2);/obj/item/weapon/tape_roll) + +/obj/random/action_figure + name = "random action figure" + desc = "This is a random action figure." + icon = 'icons/obj/toy.dmi' + icon_state = "assistant" + item_to_spawn() + return pick(/obj/item/toy/figure/cmo,\ + /obj/item/toy/figure/assistant,\ + /obj/item/toy/figure/atmos,\ + /obj/item/toy/figure/bartender,\ + /obj/item/toy/figure/borg,\ + /obj/item/toy/figure/gardener,\ + /obj/item/toy/figure/captain,\ + /obj/item/toy/figure/cargotech,\ + /obj/item/toy/figure/ce,\ + /obj/item/toy/figure/chaplain,\ + /obj/item/toy/figure/chef,\ + /obj/item/toy/figure/chemist,\ + /obj/item/toy/figure/clown,\ + /obj/item/toy/figure/corgi,\ + /obj/item/toy/figure/detective,\ + /obj/item/toy/figure/dsquad,\ + /obj/item/toy/figure/engineer,\ + /obj/item/toy/figure/geneticist,\ + /obj/item/toy/figure/hop,\ + /obj/item/toy/figure/hos,\ + /obj/item/toy/figure/qm,\ + /obj/item/toy/figure/janitor,\ + /obj/item/toy/figure/agent,\ + /obj/item/toy/figure/librarian,\ + /obj/item/toy/figure/md,\ + /obj/item/toy/figure/mime,\ + /obj/item/toy/figure/miner,\ + /obj/item/toy/figure/ninja,\ + /obj/item/toy/figure/wizard,\ + /obj/item/toy/figure/rd,\ + /obj/item/toy/figure/roboticist,\ + /obj/item/toy/figure/scientist,\ + /obj/item/toy/figure/syndie,\ + /obj/item/toy/figure/secofficer,\ + /obj/item/toy/figure/warden,\ + /obj/item/toy/figure/psychologist,\ + /obj/item/toy/figure/paramedic,\ + /obj/item/toy/figure/ert) + +/obj/random/plushie + name = "random plushie" + desc = "This is a random plushie." + icon = 'icons/obj/toy.dmi' + icon_state = "nymphplushie" + item_to_spawn() + return pick(/obj/structure/plushie/ian,\ + /obj/structure/plushie/drone,\ + /obj/structure/plushie/carp,\ + /obj/structure/plushie/beepsky,\ + /obj/item/toy/plushie/nymph,\ + /obj/item/toy/plushie/mouse,\ + /obj/item/toy/plushie/kitten,\ + /obj/item/toy/plushie/lizard) \ No newline at end of file diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 5f52d20fccfdfc8a6f9a40d541f909530f1d2545..043a93c6a4c81b766042d29af8d862164dc54ede 100644 GIT binary patch literal 30094 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 literal 4836 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 Date: Tue, 17 Feb 2015 20:21:27 +0100 Subject: [PATCH 06/30] Custom ninja spawn points. The ninja should no longer risk spawning far away from the station, with no clue where to go to reach it. --- code/game/gamemodes/ninja/ninja.dm | 13 ++++------ code/game/objects/effects/landmarks.dm | 8 +++++- maps/exodus-1.dmm | 34 +++++++++++++------------- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index 87a15e622d..b4c0c5f555 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -27,18 +27,15 @@ ninja.special_role = "Ninja" ninja.original = ninja.current - /*if(ninjastart.len == 0) - ninja.current << "\red A proper starting location for you could not be found, please report this bug!" - ninja.current << "\red Attempting to place at a carpspawn."*/ + if(ninjastart.len == 0) + for(var/obj/effect/landmark/L in landmarks_list) + if(L.name == "carpspawn") + ninjastart.Add(L) - //Until such a time as people want to place ninja spawn points, carpspawn will do fine. - for(var/obj/effect/landmark/L in landmarks_list) - if(L.name == "carpspawn") - ninjastart.Add(L) if(ninjastart.len == 0 && latejoin.len > 0) ninja.current << "\red No spawneable locations could be found. Defaulting to latejoin." return 1 - else if (ninjastart.len == 0) + else ninja.current << "\red No spawneable locations could be found. Aborting." return 0 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index b88847c6aa..b9facb09b8 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -6,7 +6,6 @@ unacidable = 1 /obj/effect/landmark/New() - ..() tag = text("landmark*[]", name) invisibility = 101 @@ -113,6 +112,13 @@ return 1 +/obj/effect/landmark/start/ninja + name = "ninja" + +/obj/effect/landmark/start/ninja/New() + ..() + ninjastart += loc + //Costume spawner landmarks /obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 3957bfdda7..6f08ee69da 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -1420,7 +1420,7 @@ "aBp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) "aBq" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/library) "aBr" = (/obj/structure/closet/lasertag/red,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 6},/area/crew_quarters/fitness) -"aBs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/library) +"aBs" = (/obj/effect/landmark/start/ninja,/turf/space,/area/space) "aBt" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarstarboard) "aBu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aBv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) @@ -1763,7 +1763,7 @@ "aHU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Bar\\Library Maintenance"; req_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) "aHV" = (/obj/structure/closet,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/bar) "aHW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/bar) -"aHX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Fore Starboard Solar Access"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) +"aHX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Fore Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/library) "aHY" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 4; sortType = "Chapel"; name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) "aHZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/bar) "aIa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) @@ -6972,7 +6972,7 @@ "cEd" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes,/obj/machinery/light/small{dir = 8},/obj/item/weapon/deck,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cEe" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) "cEf" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical,/obj/machinery/camera{c_tag = "Drone Fabrication"; dir = 8; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cEh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/engine_smes) "cEi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_smes) "cEj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_smes) @@ -7329,7 +7329,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaabaabaabaabaabaaaaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaabaabaabaabaabaaaaabaabaabaabaabaaaaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaabaabaabaabaabaaaaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7340,7 +7340,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaanaamaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaajaaoaapaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaaaaaaaaaaaaaaraapaasaataafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaaaaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacKraawaavaaacKraawaavaaacKraawaavaafaafaamaaaaaaaaaaaaaaaaafaafaahaaxaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaayaayaayaayaayaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaamaaacKraazaavaaacKraazaavaaacKraazaavaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaAaaBaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaCaaDaaEaaDaaEaaDaaFaayaayaaGaaHaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaamaaacKraazaavaaacKraazaavaaacKraazaavaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaAaaBaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaCaaDaaEaaDaaEaaDaaFaayaayaaGaaHaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaauaaaaaaaauaauaauaauaauaauaauaaaaaaaauaaaaaaaauaaaaaaaaaaaaaaaaaaaaIaafcKraazaavaaacKraazaavaafcKraazaavaafaaaaaaaafaafaaJaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaKaaLaafaayaaMaaNaaNaaNaaNaaNaaOaaPaaQaaRaaSaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaauaauaauaauaauaauaauaauaauaaaaauaauaauaauaaaaaaaaaaaaaaaaaaaafaaacKraazaavaafcKraazaavaaacKraazaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaTaaTaaTaaTaaTaaTaaTaafaaaaayaaUaaVaaEaaVaaEaaVaaWaaXaaYaaZabaaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaauaauaauaauaauaauaauaauaauaaaaauaauaauaauaaaaaaaaaaamaamaaIaafaaacKraazaavaafcKraazaavaaacKraazaavaafaaaaaaaacaaaaafaafabcabdabdabdabdabeabfaaaaaaaaTabgabgabhabgabgaaTaaaaafaayabiabjaaXabkaaXabjaaXaayablaaZabmaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7351,13 +7351,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaacKrapgaavaafcKrapgaavaaacKrapgaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfacVaaTadnadoadpadradqadsadtaduaoZadaacQadvadcaddadwadxadyacQadzadzadzaddadAacradBadladCadladladladCaaLaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadEaaTadFacXacXacXacXacEacXadGaoZadaacQadvadHadIadJadKadLadMadNadNadNadOadPacradQadlabbadRadSadlabbaaLaaLaafaaaaafaaaaaLaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaafcKrapgaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadEaaTaaTadVadUadWadXacEadXaaTaaTadYacQadbacQaddadZaeaadyadMadNaebadNaecaedacradQaeeabbabbabbabbabbaaLaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaaaaaaaauaauaauaauaacaaaaaaaaaaaaaaaaaqaafcKrarDaavaaacKrarDaavaaacKrarDaavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegaaTaaTaaTaaTaaTaaTaehaaTaaTaaTaeiaejaekaelaemaenaeoaepaeqaeraesaeraetaeuacradBaevabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEaexaeyaezaaTaeAaeBaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLaeMaeLaeNaeOaePaeQaeRabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaaaaaaaauaauaauaauaBsaaaaaaaaaaaaaaaaaqaafcKrarDaavaaacKrarDaavaaacKrarDaavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegaaTaaTaaTaaTaaTaaTaehaaTaaTaaTaeiaejaekaelaemaenaeoaepaeqaeraesaeraetaeuacradBaevabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEaexaeyaezaaTaeAaeBaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLaeMaeLaeNaeOaePaeQaeRabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaeTaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVaeWaaTaeAaeAaeXaeYaeZaeFafaafbafcafdaddafeaffafgacQacQafhacQafiafjacrafkaflabbafmafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadEafqafrafsaaTaftafuafvafwafxafyafzafAafBafAafCafDadxafEafFacQafhacQafGafHafIafJafKafLadlafMafNafOafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUafVafWafXafYafZafZafZafZafZafZagaagbagcagbaaTageagdagfaggaghaeFagiagjagkaglagmagnagoagpagqagragsagtaguagpagvagwagxabbadlagyafoafoagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfagAagBafZafZafZafYafYafZagCagDagDagDagDagDagDagDagDagDagDarCaaTagFagGagHagIagJaeFagKagLagLagLaddagMagNagOagPagQagRagQagPagSagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUagVagWagWagWagWagWagWagWagDagXagYagZagWahaahbahcahdaheahfahgahhahiahjahkahmahlahnahnahnahnaddahoahpahqahrahsahtahuahvahwagvahxahyaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUagVagWagWagWagWagWagWagWagDagXagYagZagWahaahbahcahdaheahfahgahhahiahjahkahmahlahnahnahnahnaddahoahpahqahrahsahtahuahvahwagvahxahyaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRahAabfahBadEagWahCahDahEahFahGahHagDagZahIahFahJahKahLahLahMahNahOahPacXacXacEacXahQahRahSacQacQacQaddahTahUahVahWahXahYahZaiaaibagvahxaicabOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaifabfaigadEagWaihaiiaijaikailaimagDagZahIainagWaioahLaipaiqahKahOairaisacXaitacXacXaiuacZahSacQacQaddaiwaixaiyagPagPaizagPagPaiAagvaiBaiCactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahzaaaaaaahzaaaaaaahzahzahzahzahzahzahzaaaaaaahzaaaaaaahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiEaiFaiGaiHaiIahFagDaiJaiKaiLagWaiMaiNaiOaiOaiPaiQaiRaiSaiTacEaiUaiVaeFaiWaiXaiYaiZakNajeajcajdakfajfajgajhagPajiagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzaaaahzahzahzahzahzahzahzahzahzaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7370,7 +7370,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfankagWagWagWagWanlanmannanoanmanmanmanmanpaoPanpanraoQaojaoRanvaoSaoTaoUanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOanPasyanRanSaaaaaaaafaaaaafaaLaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaobaocagWaodaoealKaogaohaoibqKaokaolaomaonaooaonaopaoqaoraonaoOaotamgamgaouaovaowamiaoxanEamXaoyanGaozaoAaoBaoCaoDaoEaoFanGaoGanQanQanQanQaoIaoJaoHaoLarPaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalJaaaaaaaaaaafaaaaaaaaaaamaaaahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaacaaaaaaaaaanXanXapaapbagDalMapcapdapeapfaofaphapiaoMaonaonapkaplaonapmapnaoraonapoaonaoNapqapramgamfamgamTaosamYanEamXaptanGapuapvapwapxapyapzapAanGapBaoHapCapDapEapFapGaoHaoHapHaoHaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaahzahzahzahzaaaaaaahzahzahzahzahzahzahzaaaaaaahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapLapMagWalgapNalKapOapPapQapRaokapSanWapUapVapWapXapYapZaqaanUaqcaqdaovaqeaovaqfaqgaqhaqiaqjaqkanGaqlaqmapyaqnaqoaqpaqoaqqaqraqsapFaqtaquapFaqvaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapLapMagWalgapNalKapOapPapQapRaokapSanWapUapVapWapXapYapZaqaanUaqcaqdaovaqeaovaqfaqgaqhaqiaqjaqkanGaqlaqmapyaqnaqoaqpaqoaqqaqraqsapFaqtaquapFaqvaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaBsaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWaqCalRagWalWalWalWaqDaqEapkaqFaqGaqHaonaqIaqJaqKaqLanyaqNaqOaqPaqQaqRaqSanxaqUaqVaqWamVanGaqXaqYaqZaraarbarcardanGarearfapFaqtaqtapFargaoHarhariarjaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaobarlagWarmarnalKaogaroaoiaokarparqarrarsartaonarualWarvarwarxalLarzarAamUamzamyarEarFarGarHamjanGanGarIanGanGanGanGanGanGarJarKarLarMarMapFarNaoHaoHarOaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLamxaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarQaqBagDarRapcarSarTarUaefapharWaloaonaonarYarZasaasbaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslasmasnasoasoaspaspasqasrassastastasuasvasvaswasxatraszaqsaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahzahzahzahzahzahzahzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7386,10 +7386,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGaAHaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawXaAgaAhaBbayRaBdaBeaBfaBgaBhaBiaBjaBjaBkaBjatPaBlaBmaBnaBoaBpaBrayiaxvaylayjatRatRatRatRatRatRatRatRatRatRavyaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvaDzaDAaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaBEaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaBOaBPaAFaBQaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaCeaCfaCgaChaCfaCiaCjazTaCkarAaAdayPaClarEaJCasZaAZaAYaBaatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaCtatPatPazgaziazhatRatRatRatRatRatRatRatRatRatRavzaafaaaaaaaaaaaaaaaazjaaaaaaaafaaaaCvaEXaEYazkaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaCHaCIazlaAFaCKaCLaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaDcayLayLayLarAaAdayPayQarEaAiasZaxTaBcauvatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaDnaDoaDpaDqaGwaDsatPatPazmatiatiatiatiatiaznatiatiatiatiaAraafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvaGxaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaxAaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFaDYaDZaCMaEaaEbaEcaEdaEeaEfaEgaEhaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaEvaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaEMaEKaENaEOaBjaEPaEQaERaESaETaCnaDsaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaDCaAtaAsaDCaBqaCxaBsaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaFhaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaxAaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFaDYaDZaCMaEaaEbaEcaEdaEeaEfaEgaEhaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaEvaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaEMaEKaENaEOaBjaEPaEQaERaESaETaCnaDsaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaDCaAtaAsaDCaBqaCxaHXaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaFhaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkaFlaFlaFmaFnaFoaFpaFqaFlaFlaFraFsaFtaDPayuaBLaFvayxaBMazCaBMaBNaCDavHaFuaDQaFxaCpaDraCJaFIaFJaFKaFLaFLaFLaFMaFLaFLaFNaFOaCMaaaaBYaFPaElaFQaEnaFRaBYaaaazJazOazPaFSaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYaFZazTaGaarAaGbaGcaGdarEaAiaDeaDfaDtaCoaDeaDvaDuaGkaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaGqaDpaGraGsaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEWaEVaFdaEZaFcaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaGHaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaGJaGKaFlaGLaFlaGLaFlaGLaFlaGLaFlaGMaGNaGOaDPayuaBLaGPaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazaFEaFCaHcaFLaFLaFLaFLaFLaFLaFLaFNaHdaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaHkaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGuaDyaEUaGvaDwaDxaFyaFwatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpaHIaDpaHJaHKaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDCaGjaFzaGzaGzaGBaGAaDCaDCaIcaDCaIdaIeaIfaIgaGFaIhaGFaIiaIjaIkaIlbinaInaIoaIpaIqaIraIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaGLaFlaGLaIxaGLaIyaGLaFlaGMaGNaGOaDPaFFaIAaIAaFGaICaIDaICaIAaIAaIEaIFaFCaGQaFHaGWaGVaFCaIKaILaIMaFLaFLaINaFLaIOaIPaIKaCMaaaaBYaBYaIQaIRaIQaBYaBYaaaazJazOazPaISaITaIUaFTaIVazPaIWaIXayLaIYazTaIZaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaECaCuaCuaCuaCuaCuaHRaGCaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaJsaJtaGsaGsaDqaJvaDsaDsaJwaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHTaHSaHWaHUaHYaHXaIaaIaaJjaIbaIgaJIaJJaJKaJLaJMaJNaIgaJOaJPaGFaJQaJRaJSaJTbinaJUaIoaJVaJkaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaGLaFlaGLaIxaGLaIyaGLaFlaGMaGNaGOaDPaFFaIAaIAaFGaICaIDaICaIAaIAaIEaIFaFCaGQaFHaGWaGVaFCaIKaILaIMaFLaFLaINaFLaIOaIPaIKaCMaaaaBYaBYaIQaIRaIQaBYaBYaaaazJazOazPaISaITaIUaFTaIVazPaIWaIXayLaIYazTaIZaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaECaCuaCuaCuaCuaCuaHRaGCaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaJsaJtaGsaGsaDqaJvaDsaDsaJwaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHTaHSaHWaHUaHYaIaaIaaIaaJjaIbaIgaJIaJJaJKaJLaJMaJNaIgaJOaJPaGFaJQaJRaJSaJTbinaJUaIoaJVaJkaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaGJaGKaFlaGLaFlaGLaFlaGLaFlaGLaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaIzaIHaIGaIJaIIaJZaJYaJAaKaaFCaIKaKmaKnaKoaKpaIKaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaKxaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaKHaKIaKJaKKaKLaJeaEDaKNaKOaKPaEEaKRaaaaaaaJlaKSaJGaJBaJlaKVaJnaJnaJnaKWaJnaJnaJnaBjaDpaKXaDpaDpaDpaDpaKYaDpaKZaLaaLbaLcaLdaLeaLfaLgaLhaLfaLfaLfaLfaLfaLiaLfaLfaLfaLfaLfaLfaLfaLfaJHaIgaLjaLkaLlaEFaLnaLoaIgaLpaJWaGFaLraLsaLtaJTaRraJUaIoaJVaIoaLvaLwaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkaFlaFlaFlaLAaFlaFlaLBaFlaFlaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuaLYaKuaKuaLZaMaaLZaJeaJeaMbaMcaJeaJeaJeaJeaMdaMeaKTaKbaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaKUaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaMvaMwaMxaMyaMzaKZaMAaMBaMCaMCaMDaLfaMEaMFaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJHaIgaMPaMQaMRaMSaMTaMUaIgaMVaMWaMXaMYaMZaNaaNbaGFaGGaNcaJVaIoaNdaNeaNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaNjaNjaNkaNjaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNAaNBaNzaNCaNzaNzaNzaNzaNDaNEaNFaNGaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaNPaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMgaMfaOhaOiaOjaOkaOlaOmaOnaJlaOoaOpaOqaOraOsaOtaOuaOvaOwaOxaKZaOyaOzaOAaOAaOBaLfaOCaODaOEaOEaOEaOEaOFaOGaOHaOIaOJaOKaOKaOLaOMaLfaJHaIgaONaOOaOPaOQaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7432,10 +7432,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbTgaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbTsbPfbTtbTvbTubTwbNFbTxbTybTzbTAbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbTObLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbTTbTUbTVbRjbTWbTXbTYbRnbPObMObTZbQWbPQbLxbLnbNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbMVbMVbMVbUkbMVbUlbQabUmbMVbUnbUobUnbOObUpbUqbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbUwbNwbUxaaabUybPcbPcbUzbUAbPfbPfbUBbPfbUCbNFbUDbTMbTNbNFbTPbTPbTPbTPbTPbTPbTPbTPbUHbUIbUJbUKbUKbUMbNUbDtbUNbUebUFbUQbURbwabUTbUUbUVbUWbUXbUTbUYbUZbVabVbbVcbVdbVebVfbVgbVhbVibUGbVkbUObRjbUPbVmbUPbRnbPObMObVnbWcbVpbVqbVrbVsbVtbVubUgbzAbVvbzAbzAbVwbCxbSLbCxbVxaafbnxbVzbrBbVBbVCbVBbVDbVEbVFbMVbVGbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbVObLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVPbVQbVQbVRbVSbNxbVTbRSbVUbNxaaaaaaaaaaaabNybVVbVWbVXbVZbVYbPfbNFbWabWbbNIbNFbTPbWdbWfbWebWhbWgbWibTPcaqcaqcaqcaqcaqbTFbWjbWkbWlbWmbWnbWobWpbxgbWrbWsbWtbWubWtbWvbWtbWwbWxbWybWzbWAbWBbWAbWCbWDbWEbWFbWGbWHbWIbWJbWKbWLbWMbxVbMObxWbzmbzlbWSbWTbWUbWSbWSbWVbWWbWXbWYbWZbCxbCxbSLbCxbFTaafbnxbXabXbbXcbXdbXebXfbXgbXhbMVbXibVHbXjbOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQmbQmbQmbQmbQmbQmbXkbLTbQlbQmbXlbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmbXnbXobXpbRSbXqbXrbRSbXsbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbTPbXubXwbXvbXvbXwbXxbTPbXzbXybXybXAcaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbASbAVbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYnbYobYpbYqbYrbYsbYtbYrbYubYvbILaafbnxbXablSbVBbYxbVBbYebYzbYAbMVbXjbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmbXnbXobXpbRSbXqbXrbRSbXsbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbTPbXubXwbXvbXvbXwbXxbTPbXzbXybXybXAcaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbASbAVbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYnbYobYpbYqbYrbYsbYtbYrbYubYvbILaafbnxbXablSbVBbYxbVBbYebYzbYAbMVbXjbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVQbVQbVRbYEbYFbYGbNxbYHbNxbYIbYJbYKbYIbYIbYLbYMbYNbYObYPbYQbYybYSbYRbYUbYTbYVbXwbYXbYWbYZbYYbZbbZabZdbZcbZfbZecaqbZhbNSbZibZjbZkbZlbZlbZmbnEbZobZpbTJbTJbZqbZrbTJbTJbZsbZgbZTbVibZvbWQbZxbZybZzbZybZAbZUbZCbZUbZAbWRbYfbMNbIwbZEbXWbXVbZVbZIbZJbZKbMObMObwwbwwbwwbwwbwwboIbnFbofbwwbMVbMVbMVbMVbMVbUkbMVbMVbMVbMVbMVbZObZPbZQbZRbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaambZSaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaabZWbZXbZXbZXcaabZXbZXcahcagbYIbZYbZZbYIcaicabcaccadcaecafcakcajcamcalcaocancapbXwbYXcaJcbibYYcbjbTPcaqcaqcaqcaqcaqcarbNSbDtcascatcaucavcawcaxcaycazbTJcaAcaBcaCcaDcaEcaFcaGcaHcaIbZxbWQcbkbZycaKcaLbZAcaMcaNcaObZAbXXbYfbPObIwbXYbYabXZbXYbXYbIwbIwbIwcaRcaScaTcaUcaVbwwbwwcaWbwwbwwcaXcaYcaZcbabXjcbbbXjbXjcbccbdcbecbfcbgcbhbUnbUnbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbUubUsbUsbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcblcbncbmcbpcbocbycbqcbAcbzbYIcbrcbsbYIbYIcbtcbucbvcbwcbxcbCcbBbYSbYRbYUcbDcbEbXwbXwcbKcbQbXwccAbTPcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJcbJccBbTJcbLcbMcbNcbOcaEcbPccCcbRcaIbZxbWQbZxbZycbScbTbZAcbUcbVcbWbZAbYjbYfbYbbYdbYcbYiccDcdebYcchBbYkbYlcktbZDbZwbZFcktccrbZGbZHccqccrccscctcctcctcctccucctcctcctcctcctccvccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbNdbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcblcbncbmcbpcbocbycbqcbAcbzbYIcbrcbsbYIbYIcbtcbucbvcbwcbxcbCcbBbYSbYRbYUcbDcbEbXwbXwcbKcbQbXwccAbTPcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJcbJccBbTJcbLcbMcbNcbOcaEcbPccCcbRcaIbZxbWQbZxbZycbScbTbZAcbUcbVcbWbZAbYjbYfbYbbYdbYcbYiccDcdebYcchBbYkbYlcktbZDbZwbZFcktccrbZGbZHccqccrccscctcctcctcctccucctcctcctcctcctccvccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbNdbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccEccEcbmccPccFcbyccQccSccRbYIccGccHccIccJccKccLccMccNccOccUccTccWccVccYccXcdaccZcdBcdbcelcekcencemcdccddaJEcdfcaqbTFcbIcdgcdhcdicdjcdkcdlcdmcdncdocdpcdqcdrcdscdtcaEcducdvcdwcaIbZxbWQbZxbZycdxcdybZAcdzcdAceobZAcaPbYfbYfcaQbYccbYcbXcbZbYcchBccacjfcdLcdLbyFbBucdLcdOcdPcdQcdRcdOcdSbBpbyebydcdScdScdScdSbAebyebydcdScdSbXjcdXcdYcdZceacebcecbxTbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycbyccefcegcegcehbKtbKtbLTbLTceibLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejceqcepbYIbYIbYIbYIbYIbYJcescercercerceucetbYSbYRbYUcevbYVcewceycexceTceSceUbTPcezaJFceeaJFcaqbTFcbIceDceEceEceEceFceGbTJceHceIbTJcbLcbNceJcbOcaEceKceLceMcaIbZxbWQceNbZyceOcePbZAbZAbZAbZAbZAccbceRbYfcaQbYcccdcccbYcbYcchBccecjfcdLceZcfacfbcfccdOcfdcfecffcdOcfgcfhcfhcfhcficeWcfkcflcfmcfncfocfpcdScfqcfrcfsbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcftceXcfvbNebKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcfwcfxcfycfzcfAcejcfjceYcfBcfucfDcfCcfEcfEcfGcfFcfFcfHcfIcbBbYSbYRbYUcfJcapcfKcfMcfLcfOcfNcfPbTPaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcfZcgacfYcgbcgccgdcgecaEcgfceLcggcaIcghccfcgjbZycgkcglbZycgmbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLcgxcgycgycgzcgActsctyctscgDcgEcgFcgGcgGcgHcgIcgIcgJcgKcgLcgLcgMcdScgNcgOcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7461,14 +7461,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaafaamaafaafaafczgczGczFcAhczHcAucAtcAwcAvcAycAxcAAcAzcAucptczGcABcADcACcAycAEcmMcmMcmMcmMcmMcmMcmMcmMcAHcAFcyLcAIcAJcoIcAKcoIcoIcwxcoIcoIcAScoIcAJcBtcBvcBucBxciCcCNcCOcCPcCQcAObPwcCRcCScCTcCacAGcAVcBwcCacHPcHLcHQcCYcCXaaaaaaaaaaaaaaaaaacqvcCZctDcuQcDacDbcuQcDccDdcDeaafaaachxchFchEclXaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacyhcyhcyhcyhaaacyhcyhcyhcyhcyhcyhcyhcyhcyhaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcByaaaaaaaaaaamaaaaaaaaacBzcBBcBAcBDcBCcBFcBEcBGcBCcBFcBEcBGcBCcBFcBHcBHcBIcBGcBCcBFcBJcmMaaacBLcBKcBNcBMcBPcBOcBRcBQcBScBScBUcBTcCrcCpcCtcCscCpcCtcCrcCucCwcCvcCucyLcyLcAOcDNcDOcDPcDQcAObNUcDRcDScDTcCacCbcDUcCbcCacHTcmWcDfaafaaaaaaaaaaaaaaaaaaaaacqvcCZcDVcDWcDXcDXcDWcsPcDYcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDZcplcplcomcEacplcplcomcEacplcplcdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaaacrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcClcqLcqLcqLcpEcpIcpIcpIcqLcpIcpPcpIcpGcpIcpPcpIcpGcpIcpPcpIcpGcpIcqLcpIcpRcpIcpGcpIcqNaafaaacCycCxcCAcCzcCCcCBcBRcCDcBScCEcCGcCFcCIcCHcCKcCJcCMcCLcCIcCUcDgcCVcCuaaaaafcAOcEBcECcEDaafaaabNUbPxbPxbSkcCaclZcEFclYcCaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcEHcuXcEIcEJcEJcEIcuQcEKcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcplcplcplcomcELcplcplcomcELcplcplcdOaacaaacrPaaaaaaaafaafaafaaaaaacmTaafaaaaaaaafaafaaaaaacrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaaaaqaaaaaaaaaaafcfQcldclccDjcfQcldclccDjcfQcldclccDkcfQaaacfQcDlclccDkcfQaaaaafaaacCycEdcDocDncDmcDpcDrcDqcBScDscDucDtcCIcDvcDxcDwcDzcDycCIcDAcDCcDBcCuaaaaaacAOcFgcFhcFiaaaaaabNUbPxbPxbNUcCacmUcmUcmUcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcFmcFncuQcuQcuQcuQcuQcFocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcmYcmYcmYckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacmZaaaaaaaaacrPcrPcrPbZScrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaacrPaafaafaaaaaaaaqaaaaaaaaaaafcfQcldclccDjcfQcldclccDjcfQcldclccDkcfQaaacfQcDlclccDkcfQaaaaafaaacCycEdcDocDncDmcDpcDrcDqcBScDscDucDtcCIcDvcDxcDwcDzcDycCIcDAcDCcDBcCuaaaaaacAOcFgcFhcFiaaaaaabNUbPxbPxbNUcCacmUcmUcmUcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcFmcFncuQcuQcuQcuQcuQcFocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcmYcmYcmYckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacmZaaaaaaaaacrPcrPcrPbZScrPaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaaaamaaaaaaaaaaafcfQcDDcDFcDEcfQcDGcDIcDHcfQcDJcDLcDKcfQaafcfQcDMcEccEbcfQaaaaafaaacCycEGcCAcDmcDmcEecEgcEfcEicEhcEkcEjcEmcElcEocEncEqcEpcEscErcEucEtcCuaafaaacFJcDNcFKcAOcFLaaabNUcFMbPxcFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcFPcFQcEIcEIcEIcFRcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqpbqpbqpaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcfTaafcrPaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaamaaaaaaaafaafcfQcEvcEwcEvcfQcExcEycExcfQcEzcEAcEzcfQaaacfQcEzcEzcEEcfQaaaaafaaacCycBKcIxcDncDmcCBcEMcCDcBScENcEPcEOcCIcEQcEScBkcEScETcCIcEUcEWcEVcCuaaLcGgcGgcGgcGgcGgcGgcGgbNUciEciDcGjaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGlcEJcEJcEJcEJcEJcGlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaafaamaaaaafaafaaacfQcEvcEXcEvcfQcExcEYcExcfQcEzcEZcEzcfQaafcfQcEzcEzcEzcfQaafaafaafcFbcFacFdcFccFfcFecFjcCDcBScFlcFqcFpcCIcFrcFtcFscFvcFucCIcFwcFycFxcCuaaacGgcGgcGgcGgcGgcGgcGgcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCmcqxcqxcqxcCocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZSaaaaaacfQcfQcfQcfQcfQcfQcfQcfQcfQcfQcfQcfQcfQaaacFzcfQcfQcfQcfQaaaaaaaaaaaacAFcAFcAFcAFcAFcFBcFAcFAcFAcFAcFCcFAcFDcFFcFEcFFcFGcFAcFAcFHcFAcFAcFAcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZSaaaaaacfQcfQcfQcfQcfQcfQcfQcfQcfQcfQcfQcfQcfQaaacFzcfQcfQcfQcfQaaaaaaaaaaaacAFcAFcAFcAFcAFcFBcFAcFAcFAcFAcFCcFAcFDcFFcFEcFFcFGcFAcFAcFHcFAcFAcFAcGgcGgcGgcGgcGgcGgcGgaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhaBsaaacyhcyhcyhcyhcyhcyhcyhaaaaaacyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScFIcFTcFScFVcFUcFXcFWcFZcFYcERcGacFkcGccGfcGecGicGhcGncGpcGmcGocGpcFAcGgcGgcGgcGgcGgcGgcGgaafaaacGQcCWcGQcCWcGQcCWaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScFIcGrcGqcGtcGscGvcGucGxcGwcGCcGLcGzcGBcGdcGycGdcGdcGdcGkcGdcGbcGDcFAcGgcGgcGgcGgcGgcGgcGgaafaafcHOcHOcHOcHOcHOcHOaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScFIcGrcGEcGJcGIcGKcGucGMcGPcGTcGmcGmcGmcHfcGUcHjcGmcGmcGPcHmcHlcHocFAcFAcFAcHAaaaaaaaaaaaacJqaaacGOcGOcGOcGOcGOcGOaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScFIcGrcGEcGJcGIcGKcGucGMcGPcGTcGmcGmcGmcHfcGUcHjcGmcGmcGPcHmcHlcHocFAcFAcFAcHAaaaaaaaaaaaacJqaaacGOcGOcGOcGOcGOcGOaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScFIcGYcGXcHacGZcHccHbcHecHdcHJcHkcHkcHkcHCcHicHBcHkcHkcHEcHDcGNcHIcHHcHGcHFcHscHrcHrcHrcHrcHrcHrcIvcIucIvcIucIvcHOaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcHucHwcHvcHycHxcHzcFWcGAcGmcGmcGmcJpcJocJkcJlcJicJjcJncGVcIycJmcIscJhcIZcJdcHscHtcHNcHtcHNcHtcHNcHtcHNcHtcHNcHtcHOaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcIMcILcFAcHWcGmcGmcGmcIIcFAcHScIQcHRcFAcIRcIScITcGNcINcIOcIPcFAaaacGOcGOcGOcGOcIbcGOcGOcGOcGOcGOcGOcGOaafcGWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyhcyhcyhcyhcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7484,7 +7484,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaamaamaaqaaIaaIaaIaaIaamaaIaaIaamcKoaafaaaaaaaaaaaaaaacKpaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaacHKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqaaaaaaaaacKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqcKqcKqcKqcKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqaaaaaacKqaaaaaacKqcKqcKqcKqcKqcKqcKqaaaaaacKqaaaaaacKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqaaaaaacKqaaaaaacKqcKqcKqcKqcKqcKqcKqaaaaaacKqaaaaaacKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBscKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqcKqcKqcKqaaacKqcKqcKqcKqcKqcKqcKqcKqcKqaaacKqcKqcKqcKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqcKqcKqcKqaaacKqcKqcKqcKqcKqcKqcKqcKqcKqaaacKqcKqcKqcKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKqcKqcKqcKqaaacKqcKqcKqcKqcKqcKqcKqcKqcKqaaacKqcKqcKqcKqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From c6b66a1000a036cf1eff26ceaa8384d716f9ec93 Mon Sep 17 00:00:00 2001 From: Akai Alonkai Date: Wed, 18 Feb 2015 15:09:40 -0500 Subject: [PATCH 07/30] Defines icon file for purple comb Fixes #8133 --- code/game/objects/items/weapons/cosmetics.dm | 1 + html/changelog.html | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 6241bd5051..437daa86bb 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -71,6 +71,7 @@ name = "purple comb" desc = "A pristine purple comb made from flexible plastic." w_class = 1.0 + icon = 'icons/obj/items.dmi' icon_state = "purplecomb" item_state = "purplecomb" diff --git a/html/changelog.html b/html/changelog.html index b534169136..17cacc5bb5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,15 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

18 February 2015

+

TwistedAkai updated:

+
    +
  • Purple Combs should now be visible and have their proper icon
  • +
+
+ +

1 September 2015

updated:

From cfa8bf1e975b9a0b8f48149a579511f94e840132 Mon Sep 17 00:00:00 2001 From: Akai Alonkai Date: Wed, 18 Feb 2015 15:24:33 -0500 Subject: [PATCH 08/30] Probable typo fix September hasn't passed yet, but 1/9 could also be January 9th. --- html/changelog.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 17cacc5bb5..69f8fc0809 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -66,8 +66,8 @@ should be listed in the changelog upon commit though. Thanks. -->
-

1 September 2015

-

updated:

+

9 January 2015

+

Zuhayr updated:

  • Voice changers no longer use ID cards. They have Toggle and Set Voice verbs on the actual mask object now.
From 583390937e4cffc431720a1c41005a91c984fd43 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 17 Feb 2015 11:57:08 -0500 Subject: [PATCH 09/30] Improves bullet projectile embedding handling Commit b1546ee3ebaf1fe87ad72eb33fbd36a4216e3d9c contained a rather bone-headed mistake, that resulted in embedding with penetrating projectiles to not behave as desired. This commit fixes that, and provides a cleaner implementation. --- .../mob/living/carbon/human/human_defense.dm | 4 ++-- code/modules/projectiles/projectile.dm | 10 +++------ .../modules/projectiles/projectile/bullets.dm | 22 +++++++++++++++---- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index cb13034af5..83076373e4 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -38,9 +38,9 @@ emp_act return -1 // complete projectile permutation //Shrapnel - if (P.can_embed()) + if(P.can_embed()) var/armor = getarmor_organ(organ, "bullet") - if(P.embed && prob(20 + max(P.damage - armor, -10))) + if(prob(20 + max(P.damage - armor, -10))) var/obj/item/weapon/shard/shrapnel/SP = new() SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel" SP.desc = "[SP.desc] It looks like it was fired from [P.shot_from]." diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e25b4491da..996a0a2bd3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -66,14 +66,10 @@ return //Checks if the projectile is eligible for embedding. Not that it necessarily will. -//Mainly used to ensure that projectiles won't embed if they are penetrating the mob. /obj/item/projectile/proc/can_embed() //embed must be enabled and damage type must be brute if(!embed || damage_type != BRUTE) return 0 - //can't embed if the projectile is penetrating through the mob - if(penetrating > 0 && damage > 20 && prob(damage)) - return 0 return 1 //return 1 if the projectile should be allowed to pass through after all, 0 if not. @@ -206,9 +202,9 @@ for(var/mob/M in A) attack_mob(M, distance) - //penetrating projectiles can pass through things that otherwise would not let them + //penetrating projectiles can pass through things that otherwise would not let them if(!passthrough && penetrating > 0) - if(check_penetrate(A)) + if(check_penetrate(A)) passthrough = 1 penetrating-- @@ -311,4 +307,4 @@ trace.firer = user var/output = trace.process() //Test it! del(trace) //No need for it anymore - return output //Send it back to the gun! + return output //Send it back to the gun! \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 6e15021b44..01454e4b8b 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -7,23 +7,37 @@ check_armour = "bullet" embed = 1 sharp = 1 + var/mob_passthrough_check = 0 /obj/item/projectile/bullet/on_hit(var/atom/target, var/blocked = 0) if (..(target, blocked)) var/mob/living/L = target shake_camera(L, 3, 2) +/obj/item/projectile/bullet/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier) + if(penetrating > 0 && damage > 20 && prob(damage)) + mob_passthrough_check = 1 + else + mob_passthrough_check = 0 + ..() + +/obj/item/projectile/bullet/can_embed() + //prevent embedding if the projectile is passing through the mob + if(mob_passthrough_check) + return 0 + return ..() + /obj/item/projectile/bullet/check_penetrate(var/atom/A) - if(!A || !A.density) return 1 //if whatever it was got destroyed when we hit it, then I guess we can just keep going + if(!A || !A.density) return 1 //if whatever it was got destroyed when we hit it, then I guess we can just keep going if(istype(A, /obj/mecha)) return 1 //mecha have their own penetration handling if(ismob(A)) + if (!mob_passthrough_check) + return 0 if(iscarbon(A)) - //squishy mobs absorb KE - if(can_embed()) return 0 - damage *= 0.7 + damage *= 0.7 //squishy mobs absorb KE return 1 var/chance = 0 From 2db45d592fd86095e6f36f78ebcdaef9c673b635 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 18 Feb 2015 18:42:58 -0500 Subject: [PATCH 10/30] Makes the Z8 wearable on the back, adjusts some desc text. --- .../modules/projectiles/ammunition/bullets.dm | 4 ++-- .../projectiles/guns/projectile/automatic.dm | 11 ++++++----- .../projectiles/guns/projectile/sniper.dm | 2 +- icons/mob/back.dmi | Bin 44626 -> 45319 bytes 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 98ca3ca41f..f0a406e467 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -118,14 +118,14 @@ /obj/item/ammo_casing/a145 name = "shell casing" - desc = "A 14.5mm AP shell." + desc = "A 14.5mm shell." icon_state = "lcasing" spent_icon = "lcasing-spent" caliber = "14.5mm" projectile_type = /obj/item/projectile/bullet/rifle/a145 /obj/item/ammo_casing/a556 - desc = "A 5.56 bullet casing." + desc = "A 5.56mm bullet casing." caliber = "a556" projectile_type = /obj/item/projectile/bullet/rifle/a556 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 91129e6979..e331482d97 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -70,15 +70,16 @@ /obj/item/weapon/gun/projectile/automatic/z8 name = "\improper Z8 Bulldog" - desc = "An older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56 rounds. Makes you feel like a space marine when you hold it." + desc = "An older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56mm rounds. Makes you feel like a space marine when you hold it." icon_state = "carbine" item_state = "shotgun" - w_class = 4.0 + w_class = 4 force = 10 caliber = "a556" origin_tech = "combat=8;materials=3" ammo_type = "/obj/item/ammo_casing/a556" fire_sound = 'sound/weapons/Gunshot.ogg' + slot_flags = SLOT_BACK load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/a556 @@ -92,13 +93,13 @@ /obj/item/weapon/gun/projectile/automatic/sts35 name = "\improper STS-35 automatic rifle" - desc = "A durable, rugged looking automatic weapon of make popular on the frontier, despite it's bulk. Uses 7.62mm rounds. It is unmarked." + desc = "A durable, rugged looking automatic weapon of a make popular on the frontier. Uses 7.62mm rounds. It is unmarked." icon_state = "assltrifle" item_state = "shotgun" w_class = 4 force = 10 caliber = "a762" - origin_tech = "combat=5;materials=1;syndicate=8" + origin_tech = "combat=6;materials=1;syndicate=4" slot_flags = SLOT_BACK load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/c762 @@ -117,7 +118,7 @@ slot_flags = 0 max_shells = 50 caliber = "a762" - origin_tech = "combat=5;materials=1;syndicate=2" + origin_tech = "combat=6;materials=1;syndicate=2" slot_flags = SLOT_BACK ammo_type = "/obj/item/ammo_casing/a762" fire_sound = 'sound/weapons/Gunshot_smg.ogg' diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index a6fd3917c1..8364876563 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -1,6 +1,6 @@ /obj/item/weapon/gun/projectile/heavysniper name = "\improper PTRS-7 rifle" - desc = "A portable anti-armour rifle fitted with a scope. Originally designed to used against armoured exosuits, it is capable of punching through non-reinforced walls with ease. Fires 14.5mm AP shells." + desc = "A portable anti-armour rifle fitted with a scope. Originally designed to used against armoured exosuits, it is capable of punching through non-reinforced walls with ease. Fires armor piercing 14.5mm shells." icon_state = "heavysniper" item_state = "shotgun" w_class = 4 diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 893b58c6637d54df110cbf9a9fcdfa7c4c2553b9..8322b7b4f5899319059cde38deb5e44064a55d14 100644 GIT binary patch literal 45319 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 m}nz{}h4< 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
Q#&Rh(Dx*C*<=Tjy_&OZxu zJrsQJ4GDW=8TA_y3PR{xY5jJQb$e7q#2bK&02>0%yfjg6q|~qMgiG^CNY1>nf$y7E z()Da+g{V_}xiXTC!+*ES5Fo^?2mAODIXLk5K0HGudR#bPK?ET3mC`H}dJS3mE5F=# zIYFOUK@wruN@wPKZ|HkXi{EOxPy2`KY+2vF{n|o({rc6Q(k3dNZ5(@gM5=W}gq)!= zg?S8E{%H+~o-pS3+@3b9bdpeWQUsA?Z~C=~tPWcIsg4c-1WLYkFg=Hw{eAAMs631U z9AW!sVN0N|y_<4@vjCBkn~(3lw)V&Q4K@}Qin#8#-@b8!0o>`N^XJkS96dU>$k19< zC29=-!c7hiWh+}-iQ^Y3A3w4q&`qz1GJ3kZwGo^`0Hd78)Qi#7v)>_?5Y!Q~pQl>TX~ZIgXdzb2C#bG*r|4>k%zy-E&Rb$ml~|ouudbFfkb3afz9; zXwqQA(p+}&5)pe%wJhbn(O)vup_Ib<+2VJv>UVf`79oeJ-wdYA#fAagr_#48%6D=> z(z~4cyj26RmQP@zF%8jOwV4NMeY=UPN5krZJP@-83`ovDoogNBdr`$cv#-?nj1O72 z>+_jt9p|E1V&q65dZFjRoFdovR|iXLHRNoGW;%lQ`z1P}S!8m$?xyyC0Cea`p2i!n z!DSGC2ZANC#PlQ3m6=raAt;ZE1hjU!1G2;q)olTq7?5}`DkrFEXxRD{|9YF9{SUSU_a9z>ALW%Xpw^gi z_Tj6YaOC&BG%E%83cth6_d5Ac=3DkSLUi(fSK4a!3;MYt&j`FkJ_1Q6%Vn+w$O^7V z=I(gVOF&cA($!u1jMa4lZLgi$Dqz}RcU6I%{p--O(U>`wP|Lr;Igz(&;qt5siB=%V zb<c}ZG4TIm+k*)@9&aQ zb7Q7dr)J5-;`eFl0#6V9`sWl@2G!>2%gY*_y=Bht#zJ(ARv!^m~hlXgsPdARD;Po-~OKF_-ucW zg{qnd(X*Nfql75DagdPzq2p~XF17Ws;?$LXHZ6(m^RWxU+Fk#{O_DtX^Jtp2L(u^4 zJIrn&JzNUQU{AHW z_O7l)PztB8Y#bqgMArdAIZOW>Sw6DL4rgy~&&XG4zz1mBZpvlhxbCGxp%^{7@1Of^ za=(0mz+-aWV;qtnxB#Z%-@V0;2?_7$%mc1$tqiCfZO@bko_YtI?RA0d6iX|}$w}g| z(s$3zO<3A%W63)mln4(axOBj<0yX1H%)$C_O)mzCWZalrm}<4MvLXZg9b!TewgK3% z$DDDCUs>}K_(3CpA@z1~8oqLD$tN3ig^rF38(XIhf>_HB4!z;XBoVL8Dtm$IoRuOK zERg0AZ9gh%x5%qc{11lIhDyy9&Ma{OeVGbu!QT1=B_{R5TYt|P<3qf9>9}7X;d>9S z%F;nD&a6MVUnS3;5@cvT_H2@O7~^xCs?nHaZ~gG$Vv$)hqh)90y;ra57YQL-n@U3l zY0qy59$P634~u|)00sgPG})id8@OV0grQ?r{h_XGh*$O1!P80vmxu%#se=>+BJ|IR zO534wOSSuIYGB}808xK!yqseoLk=a$%qvrqAEtv9BUU`|Z18v{UAAf61*B2`xPg z%lA72H*9X@M41Vf|CvkaMM*d{wx5-tL1(Nwfcv_q2ctryMF% zQjGi|+h`dsYBvvOmdQ6f{*KZ}LP1JOswbXDryclnT-O&=(&YTd+_vX(Bj^Yq7dWQ6t;Mi&fui3ImYd6}4`S$1(7ThjR*FB0BBE5$m59d(swDIr*A-+U-R zE>5;!_Xe@#Da_l`fnNlJk+Sj>tz-)e3tA^Qhw-SE*lRn7mRBhL$bI*et;mnco1M2e(nSv$-v$@e9X`Ay9fzcw1?Y_9b|yau%QBj zTnFWjzJQ-ul@KFD8)(b%0{2@)YX=zAXK(AVt`lBEJv~}!pY2G{5|7@$teq-%o{SF#8}6(f<<{+@w!nRkFWvVT%?nhwgyZ>xE#1F58^33%QX3oOck0)5m# z;8@hXmm|FQ%*yH(C95nMv^G^M2=W6t`-KlNEXsT3mS|^6K6P*Jngz@cpV9GR?W(M3 zFH7OUbea4Kn5rDA6f=1!kz=a!KAt=&)~7WT={OV~Do$Ypu5gEqNrsGIW{7%?R|nFS zRggQo-TyW$Pn1zl7fPvBJy(%9STO8!&tgv*t))HXG6!ZvC{I>%Z%?6Wo`md z4g^Htx|(OhABR~cPm+nEMJjR;Q!(RP-bLm+IFmeJ&LV^kHwzlq3hL^{R|i!C0-CZ5 z>U{TZf(SP9oW*Bxo(hCT>Fts<4^!di!BvA7Q0C?iV6G%3t-AdIC_5t0*=qvw)PO*Y%%${YVhQQ2x<2=*wP>$Kmz<~QnrhHVA zc@P5_+qEm2PToS`XAjc3wC2*Xd#$R2Z&JDW9$W^2EgIio*oWuC`BkE9eMm|$x zC~ToysthBSjNlmj#in8jT%Y30Ec{~RK?f#I#-7Hmc1k$l*cE_FwsXslZDt^6Pj9a< z7%8-YoFIG;g;GYKNBg7+UU&$Gr2Ofo zh_KJLNs&Q$R!61wyLazy%E_?+{;MHvf7KCq>@2VtG*AmfJS`J|zTk)6cn8owqqOGD z;Y@L#%eS+>EJ%xZW6?-nUcDmf7UmDK+|JMp&cSwzmotIbLJ_tZBNYT?%6#4?gAji3#e%&PoUxRvwc9B&8k}@d}mgi2-OA&y0c=ZaOJx&#;0Gs1eV?{47u?Fw0 z4>>uvriB^^A)!E_*p!qHrj6dC#+pC|xY-%aaw)Yx^z&zWU~3v3dM2YOgX*sDtu^3V zSm=nLziUNyhnKh9r|rs_{Rfp_$ExlB`H)30Q~?~h3bBGjn_K_rV_I4yfMWpw?nYY! zjO!umgA+Qo0A9eG!opVoTe7^o%+147ATbV-vo@UgSBASYk5~*C)OrUSqn9Kiw@JPb z-u1A;qRMcX=UApL@J$d(P`L~-SEvl!dxkvR+`$-rMWq2&2R7T+-BwB`$9unedVYc| z6YlM?ngyIR<1K+Q^0;G5z#BY>pac07Ai*znb@ad~>E1X1s>Pg+xPpp`t3c~d1jM`g zlmN<{4Yi|C1Yb3P&6VRQ%5muGP)zNbxR77KCF<3UyueJ&$M=8y7U$-cj9jImVJRI< z5xX>1;}j=OY@)3lGFqr_+4otPTTsv^4ch1f&959rnGjT>q9gnMI=?u!;l|Ib;4tTnu4b&hWuVKH1RsetokC*sbjf4Yu!%aUKigtM`aUPZti^jno zX)j0e2t-JfyXhW0d7}F8Avtt|m-iCzqfv~x6r2-SVc&T`?Fz~AMqZu``a`MkmkdnH z+ztsPY(fA*NHPEdM%GwcX2QR=WjI#5C^X$?a$$oPSh?SfsF)uPU;8B6G5%lbF}264 zzr!e5UISwJO!;}Wk&39zU$6FKMbR9$o@gj7><`L}0ocjS&8-M*mY`Az94M@- ztD6mbl&Bm1}0x)4+*I%ytTGmW*2?yr&$ieL+foQ6RNwL=RAZK07RHZCvd zZBEYpG5D3@7Tm-4(|Cy=sThB+E8!sbc{k4Non`oM-@A8@0O-UQAOM6N++%KlF>0CL z^YQYR5mc$=WI_o(ZA2O%qP6LIk;Cm7-rIRI&RxI*7z?m27|XT9-mEboY4EtET8gJ8 zq|5kRJh#%O0TU!D>Xo4(!(&dG;0CrF?c`&yB{Y}8Xf>$htcfrZ;=h7-~9hzqPR|`KxteZ8? z%zj}ye23{*U3Q-GYlexHG^VBPC#KV(=7hxmGsN_Mm|-?NA0y`$qpa4kg$TuS`ifhq z{C}V6i2K)n?`V>(SdHRW+F_2g82$b%l<88jhXoe)6GK}2yhx$?$$6BWm5TlG4rz9k zPPy$`^ZxEz1$T~YPdz+?eof=rJXq0o&A`{(-<4$9M@&MZwtGwbsNwRd8769qK8io-y32H(n*}Q53B81K z+CgC9Wsr#^SIKgirTpPCXBf`PvgPajqgc`+J^IM3alH?d>+_)}?sishb#rcz z`soI?{ANSf)hg_s;9ZHr_caPQ;vu=j2Xo}~#kfRPe`Yki$&VEUQxQVo_e%VQQ198- zhK4B1ZCDfg;R$HCQXyvbA2ZqPk~Dx?veo;fMaa1Kg zOY<(rrda+<18^>D?o8~>3#e6$4?4{x>6Pg)dtw@NWOGWEc=8Z5HK{DGJbMaVJI)#y_T{+;Jjt1)2KX_~nEPZt$Ss(n!ha zW?xMNRoBx#o65i4T$z9Rl11uXcuMH%>OSZfW@rCVxLi?9PV@+N%;3D4|L49TA=rF5 z2+O=j_5eR$D*cS42s5S2FJAoq87%dKj`gHt>OYSt03Oi~IhS0Z7Nf_|t3SK6@r=k0 zL}>uO&VdU~o~|q~jhr)%e0i~p1LQivmgAeCa*x=aX|x2j)ba6R48W7@{AQ0IUtZ}; zezUM(0p$7aE$Q>LOskm(Yy*&2e}zXj-FUSt7B z+&`W+_rF$eyZ~Jd=E>8A>bF1?mZ{ePUb<{j==aj+s&n|zNBF_xIur~rgWK`$3ua(; z2Ly(+S*Dl+Ex;k68yogKdw1^KDf2_y1D=!wfFsbk&SlX6riN0oY#9g+)v>|+H?H^(ydbzv18=yG?=)C3xsO|@b zKOrq`)9y~{Q!Op1wX*Xui3`&}Ta4^$fKguVp)&~Tw1@&sCuz6@u;j`?rV%trxVQND z6zaSo7XDF&(Ad~uNh~QueKqUP^t;|@!>h>#utiJkGN9&0DshII3KW$Sk*gl=5TwMg z>0Ph4N7%hDB_)*F|H}`v&WUu`gQWuG^#f3|vlq_cJOH`>tTs7k7%VI-W)}ZjdciZ} zsaM_rVPe8d&*68Ms^=a5MK7qjxs@mKoIJCuweH#d@s-{msWaYSd8Km}eJw~t_QG1j zm6|f$X&QxDUpD6;M-1Q`ZgF!JLY2H=ETN$*P zHrCzKqXeqwa-SVD9^ox-8K7^ROD65@?R8GOXvtS3)%X9TIREbtoB4VybAR=r>?eQAO!VwVq|=QhuzV2n zZx6fs>hLt`?xz2`gfp-cn&>sTEq1;yCY62x5E2;u^v+!W#lrrk5huu(%4KFCKDZ^G z>Q`J177XtHtaxRysy^A}Fffo5)RSKw1E1YXU%X(6O%(|`^VL{%XvRLjwzB@=Uuus; zeKha|IXjmC7rRctKws2(M)uxXDDy*J*qd}HSh28!XO7rS8s|LBIrv?3=z-OzC1fSO1IH% z>@a;7M(0={ktk!H!lkNVTGDIVYPy+SI?L69sbOSM5|By6{vAp${*K#bWGP@^^q0TOFuUxPaUWc=e8_O83wvHzg_YX5#9~3A$29kiTQ^ z#POkH4AZ$Z*8va`0IMI<(`RmI0Yr1|PfL`+{}<%(mYn83(C=mhlFHjWW}Ly}0qgAO z^G1L~*G4ah(#n7~xXdDb?OY8M6im7c9J;Q^Iqo|S($CQ&YGuxCPSMs>8YfUCP7)e& z`kvG22V3Ue%g^0n8Jv@8>DZ#*7`h-Teu`Md@%JdRXA?jE7;PQF#&p|CEX0qOht%w3 z$HJiYvL~O&+z~M+R?}r&<4^SJ_Eq(jFzF1qk5upmtmCKc&Q+WpVYPD*BJXJoXYV(Y zuB_XZi)g7}a&mGre&nZrgASvW9t=~aUVU^*g9#6hizLzckjTnu+V;{QG}ks9AsE?a zg`fwUQ=@xO@Jk;mMQaVxm*sc7N+C{JYPzm;=%B8dT|+N*?2k)O^W7KVn`V%h^xmdkq9t6OLy5N!APP z@1x=RdU_V%1-I0z;eV2Mn(V}L7JyHIDiiO^5A14xwgaj@#c^pH8m{{aIGh{p4TZ+$ z5C!w|;y%4q?saRT(4W-TM=VsU%N5tscV2rjIk&}rbrG%4P?+;qU!Y{bkc>IiQK+mo z+R-92EqBomk1Cs@_+1J_oM`rr8)oZV#?>@RY?m-|5}O?0F(d}6G!T4LayCn^o5|y) zR#@2x^~A)8baiwVJ(Qv*0PN5!HhG@`Rv6LXPpE7ZFx)M2SpJKRwBiQxKnGdhqqVlK z{}=wyP#gR#tn7w_z=Dtko(L7pXQ=Z#%+axEYPksRjb;<`s?W-R%%7Uo(%j)8Wi|VP zWfvNWA>I2Oe`ruUFMf9FE9JaBMUEG^)0Ip??rYaWDv2Jadb-fmVDnL{7ON$K`d%rt z;cF*Hc^(@O!bb>r#75`Fs8~chRwVN;kAfU(POge<X@m2lwB8}>I znCIimAcY&iB&?9IE)Rutb*l|syldwE$%6q@_W`a)+d@mpg)gXx9%h6I$rjeZo1BeP z(Z~O0+9^H22Gko zoGEcYVA!O02`E`0y+Qm1sLWYMrr;I**OR+OG;359a}NJEDG62{)D^U;vurcv^3I z!PjpL|IT{9U88n7G>p@%bu{l5=){^Ii}pHKSyOxoBxc-GrwZRT?~T@u8XP-CE${+oKGB5PCrSt}iWJq1d4hib!tmT@W@k1tOfpZ6n zr{5{j?r1mdzlBi-8x9x6+0SLTkb8v~qNp8DghyKrv3mvTcyt`y zRVci*-LSfm0N?JzSk65AS<;_Ud-c@210K=iwwvvypUAxD7J*w$Ys3Tvth0!N5W zaisKt4l^F;9&;a%9A-uv&M$J_L^Aka5_sMlrd-Nb|7VdF+biXQZa!8@w-zzl&v(xt zN8IVkOKB4S8U?qp0!+%lz<~Gkr2+fui;z~PpkYP(7Ixn1mEWGl@^?xWSKQgFx9`G; zpsY#cOm^?9e{fm%53vkJUh4bRE-_`hu4xJ|R(-Fv8%~eGVyrLEu&JptLmL--(MxFb z6e^{xiAcp6uWNpUwmLesmCr4j3%Ve2wDlG}6{Cpt|MDQx1$pBLyg8N?@EgU?6Za+@ zZpr*f$DdL{yL(C7_<&V>i}L9qOTfS)E?JWYJlTx~jq8WBCc&5^#rc$@+1HokM{)1E zwkf_T7a1*24fK0XOq26itc+iCoBu?6rFs=)LO`W=1IHq$>KD!e=6}9Rfr=11N%ds$GvqqJRARi#@A*8D_i_F_;fGa)Pj(oqL)$Oi1lD>?H3*z=Ed z;sTe!$hDZ9A!0say)0_KeLjvS>x2Set+gH;=$tV$D()FKj}Jb7->;pRLYFgoP-A+Ui~-s6xIXx=A=|yu{vV|_|903g~eW)1brkz>~+^8!G}{d z@TM}y47<4&BE*?(^tH8-Q|W+!R~CxRRQeh$Hi>dX48PDx$)}fMW_Y9H)5HRZ$Pg^w zS)Xr&hb6TXKP*wV!57sS3lSOs$z`x3Ln0-yCq0??zb^v0w9O z&0+qOf=%n0doPQ+9lE7r|GjGTF$kmQ>rKO(y8d@BD^2mV9I^nQd-h^`TGSotuDigm z_*ViH0*D-iCev$LG6<#!+6eFxEPgH~L1`kSd4Q=CtSu$5n9YKJSk{y)sXFjt*h@85 z>plLl8HG>g!@0Yd2TUJnhO(M_ttxE8fuK03*oL90mUo1@IreF>&!*j1U3dusQoN1f zS4v7(gLaqYA<44U;%odVWxRX)DMqWkJ{~#)AH0WCTc@d7is~w`nbtNodOg!%@l1P z>4gHV9xTQLHWZmermt5#2RNjq8SP7~t*w9k`W2g)nO|vd#QNG4n{UX|FIV+}LXwfM z&{sO~Zc_CeQz~#Hc=4QqHSqHwGCL>uH;sMgc#bsBbYa zH3D|{^@L+0<6QmwjgfpRpb-L>(Q-H-!{6?Ez}%yX#R~_{|G~*}p15K~&1%%E2;3d{ zS1$UMsF~QbJI&-8z{m^50`YykB*Suu+2_Q*z6xcKYprKJ_kFK;2er6?6MTK%WEIHb zMN3z%NY0)yZVNgn9yDA>k81`H@tC^kN<~7~U@h6kaDF_0`%f*iX+j9laxnYz^})~D zzj`EWGWKjuxZOv!W3?bleixhsf!!`g!_xRsM_E9tSB;+|z^Vb~MQ3bZ$*!F=vMJou z;u4_s(RO5R*r&J9&9wjd)p6_HLHneqNviN;7q6)KHyKdRKx09rj9kUWE{8|Ic%wMX zm(i06N8Qo&Zntj_>BzzGjgGy%B(WJJ%;D=0)p}lj(fPY}&K)OJ)K?aKjIjV>>(f>DgM)JWyF!x z+SD6qcV~SlF)qQZ}7@XAtvFX6hSrbbteIzvat0&+_fGl;PV%h|;R1wCTsF1RBXe(ZKR z5L}`!8Rt5Ej5VjeVYBO=AwwP_sKI(q5AUuJq;T;oHB#*(;oUJ<8<6zP z4)>`fDBur?55XKt#;Y76Iy&x8B{hTpzpEUcLkQ3tQ$X0|vZUmnG=8!UW$NGgR3!xk zv>>Yn0h$@S0zjdNB%uKT2g)x!*+x=6y%G4Zt9dDEB6>c$y;5=DJ8~nFR?-c#z~et% za4+~#N&sp4U|yYtgTe8cdpldE@jnY=S`0Mjn9ftALW)afRyfu1NDvV&Fas{zBqEoPzt=QGZwPe zAGG4aV(4wQkGIkeWX+M*));FJ25CKmEOS z<&Fb6-bLTYvt`wTLSIK`QEr2#`8TDmj!tJs&I8aSNYD>iy1O9J?lO2}0=%U%)wD4Z zVkWDrO2);B#c@9|7tSXw5o`?aou?qhq6HVF|i>#cqtxyVlj30e(i) z#DC|`BG@o!10+$F((yuU7XUHjuKZ5^K&1S6hY!}2l$5!6XbkTTV}xJ45B$%&X?dHM zGZRk2-9l0K7N?En@XeGB6^<#ed0CItv5oh%JFShFcc$aVSdg_N_Nc`6 zeZ6GU*@MXRt8yONqHKiZ>Oilri!XgH+T_40FHofayg&cp%NO>5MK6}+Mc{n}8uxyW zKUyD|CH1Rz4~aN@-m_!{msC$3YTS{$MKQ+!L@BRH25O;vsgJ{ zR_;9ozV+^Uidu=Gic7;*IrMG^zdpO!25{e}F7S{GM%UCgb_Xjvefv6f=v}_v`3~KA z9Lmv(pgUR>&!?J*pX=hESpj{T%JvckTx0ux&YA(InDGNI;3txhNB;-nVdSZh{jztg)O6jlz5I3J^DP~pJP-aP%*ePJ zLdPeaS1M?Sier|TYf@TV5Hd_3xulFzP1smuJ`DNli>wlpQ5vKmo- zGRStjP}+_CzU@^g(E!q{C&OtGc?__TuVv}ts@MJMl#y2b@=<$sW%Kn*{C@S4ojp$- zAi>S{|1W zA2&zx%J;s3aoe6zYYQ)kB8t_a`L6Q}{=s$b_xkSKa zZS#ucWM_Z7zwZt(%71Am!>AXf;edy6FA4(qiWf!N0onE%K;W~0(G?%UdM-sTIRQ#R z6x&^Pn&sq*3ckyCzD~Qacs62{;}+SM*G^7dg-)$K@HFY0@NB<7pDsOu;J+BD_UJz1 z>=DQf-|@D&(uChqBb-F1YP^@@f$Qmc?6Rm~429V8 z%w}XHwy{gwGLyI@6%`eCkz)ur^ll`_Hv@WNT4Oy!bY=sRI*@@f{1#v4YbuJHSMK`2 z^W)NPQJrFb`S~3+c^D=CTdE(|ZeBe#$eh6?cbeq}GmG#!#sY2o=z}3ys)41`Z_m!Q zCQu}93zD(CGo_7L#@zFcds3FPA-LDmW3|=q;d0ZnMG5uANzx51B~{O@=t&7-zHos= zWdU@AH_J}w<(^9vY3_5s&LqpZ+R;f_S~!=i*+4E7mJ@_c+pqUSNuGv(|pQ=MID_utv%tJ4*vCSJ12gU4`O<}yZEpL)`{cxmOW-EzmPLo-&ve) zL7>0fy|uJFREKEq^#sHRcff`LI$kYLWT#$(W@msuxdrKo{8z=>)DUIA!`omgNZJyX z$TpGZRgeG0Mbh>0?@g2*2O)ton7VKC-7{J4F_5u<-ZbNhpG7mPUqcW|myeHwV^@Y2 zX&)jSf)(G~8S)tyjak&?!CgEze0cBmy|}Ce)7ziXq&_UCIcXkued2n*P03Uq-}`sA zWJMr`%1m+b@j`K*maZ@W7V_5{)Q=vz*(!-@AjUiO=m=}lA;~^8`!3}N8)HlWkMI+~ zrkl!`f$qUZj365d{Z3Yb#zf3F7fBX=nB?Z!}O1phhc)IlC6VPXm^Y0KiZ0-Am0r@VIzitpNPG zqWg;G=k>K)cK~AB84Uh6Brz?Fa z_%(b|RRTC1#w%`;aM-*m??F&o@p6zVMA)^1?0fYN>gZu(x>CgNn zCs=v~X`HmDdOf!M# z0np~b#Do9f{tIwjWy2^=YZvL++uIjP1req>?tKP~+b2z%QDP(nJ2-^6th}?dzW(JywjyKueGq`+Gk5Jg99NUbET1ORQA z-JWeBS+6GnM8uj^Z{jygYim0~kywR-&9ICWxZ(i|c?3MqvdjN~3V{}yj>zEkH(GSb zSNYht${V1Uq*>G`ZSuB}&s;|9p?5$Exx%<>PZ~AoN zEj2)c7q<%&1v;qy&>fS0WZ?*YxCnDX^F^!QYGe&>RTjGLG5cvSXxH(HPYed*6~Hik z4QkkP)@rz)AWI-nGeZ`09*rIxSG)Qv{^Zq^eyy-66_g)4@$e4h(%ILv{8pjg&P)*R zRTyHB*P;y=e>JoejIDotc%Z<^(XnV8A5>mMu@~4)54+{D)b?_e*d{W=t||mLGv_^D zCj!LY4jNA643bWB{&OztUi1aXK%Ivjm8vcC1}&^fJxf8FGA~c(V7Yrl&%tSDw!%=2 z9gFe~)rMRWC`-hAx2acGqZZI!yCh&Oeo!7n5`618W&^@+YbAl(DdT__p%8dig!DRg zhnW<0e&}}oo3QJ!B)uy<+$fBUl*jx3{LsIPEsLh!PCSBr{iDQP){K%TJ$Y`pqn#)i zQuRxzC`jb|^PCiO;0Q%43NC=%?=H0 zSQ*Gr%Q_uwRU8pp{nnsz2ZNHW#t~xu#33JH8G+|w6p2~O8%39Hg!-QTG>cyOo#h#S z{^Jo=W2i;~@=@bnzYgKda0tYUK<5So3V~MP4GT5C7Ff$RCM`D)AP zTB-B)B8c4y+bZC`6;?!Zd~dNV059RElyl~D2!IlQ%u!)cB<|8TYEEXeLinVl23;m@ z={(6ePu_?v7Qh+1^-9+Olm(=wfQZ9W&rGA>P9Sv7^>|;G%5dj7!9N}ngx#vwus^90 z0ptgj*&%`-^0X0H?ulk>WDFlO)&)f9ya_%tz)`QkihLy9jd5n4)cr_=vG-8LICyv| z(jjWQ!}U{&t;u5TAE)OK2w}NVD$X&2)|j<2Qb_Hkn%zf5+)7+?X?gQt60HM>cm)9d zjWGbT)VSy5RYmE#4ByyTMEm$^wN$kO#>pv&k=K-moX6UyiHWfz4c^hB` zz=gf&RU2_Z%6Mgd z78X9!Ojcosq{m{=_xL6*T~GLtDnnaX1bGqfpxDosw;7!+q7gRrF+}9tDL&xET$n_Q ztNm3(3b!<^te$v8?p2uCgsux)3voV+oeZ{k|2uT@n3a{akMYH#{QNhcH+Yw_fglj*A-F{z z7=uRxH=Yxe0&xe4qHD>1g4kR>h9?ghN#*6ai-4i$0=xnOZ$lD_-gf zzUtH#*M;D))Wk+Eg24YS5E={<%|8+D1RP3vt2{VJCS*QIl1VN0%3^}dyomnrke-k+ zce`6XTO|MF@yEdvu@=PE!Q=^r~Yy=s8TBqyy(^}P4 zvX-^F33Zjqq&JeDu9x9es}`cc1v+(1Qwpdh(gyA_JAkO1gE`P5w}6MB;32Oy?`L_s z;udxcG?^)E2nVFc(#}4kRZxFW-%;^~T{!h@qh4);mK2dntG$w363ch~A0P#{*ItL|Y zq1SEUg!ZhObu-lL04)Xuhn~ETY75t^H$O%#&kZOAd&sBFgPTQoS_EUUXZt{>vNOo? zCP_|b_>c$Oy*Iygz$)(U%D|=K`n3%sS4n&WGNPn60hhBPrNHrK>6plPrW0~SEzxU* zCi*(HraV^1GtZ~-r$$&&1R2GQK{jn1h#Z3vV=6+u;Sa$EWSeq?jH2hunSEU#r0b*5 z(X&YPa0};mu(s%94_HBvp-o&PgUmGG=-RI%ic5hqBL&)kktO*Lahmv>266RD^M-oL zDDlzc5S&1GJ^_C+I8f_m{WwKI=el9VebPeHudw-$px}{5A}-u`GL@}g=YCakx#uR} z3dZm>L3;lvkaG-NFTD7tg*6>4o`ks6sBe$r6D3W`E227*rKo`k_*t><4t8EYmof5% zL#rItp3 zO^Ohu%#E))sf0p#iWM0EjY-6)!}=)oeV)WLuub?ai^1^u{)=ek)aUZ0MB-RJtFMtS zOCKSB@fU#thp&EjjvT?YrAvtMrNj-yu=%(_OB*bueVTZv%v6Oz zXqe6ya|G@^H6{`CK3lpu6OPq70-BWjpzzbe-Af57eaFiTI>&V|RFia5`*(b?iQR$6 z&IM=4eiOxrqhxX?I~3gxNw_e%Ai2Aj;**EuJ-#5F*Adc8Qh7HrvhS3>Iju+>9XzGu zi31DYTmy?p7`ggFgY`=B;1&VoTmHoT{r}F4V*yCVcdb{{1CNE#SVY5rE-lsMAYC=47%*zF0T2xJZ}}AsAFPT`?S34i9r!drqyS2@bXUIQ2?+&`h}I$2P#48 zr5M%PerF-;CW|8)8AvBao=bej)%$Ga7_{@q)cLASTyU2Lg|mXNT}2tu zRkyouTL^mQS7$-N2L!P%tE>&g-44Gq?_>f77qCGfB92>L2Ygn)B0B9K;nlqisxVl{h)v zjDYoqlk_ZtmxFqf;;~bLfz}X9wvRB@BCoc4WXcX~hJk^-2BK($*X zfdQh}?iDH9fO}4;S833|jyCQIp$gWZrcOr}QAb#`Xt`DIACPuX&Y4<7YAEfz-c7xp z0EIno@~^EjCHQaFE~gHH&)+ycYK>qm1N>4VoicjoSp6l@a_^+72sz;$~AR(vHO z61_NfCC)PB&NG+L2CJWeKjY&s;h$XwVax(=?8B;0!v}saCQ1@9eEj1jW6C{=5CSvv zsNZ;wuZX(!y~w5$C;&4Ko}fPsHfNYBU5h?>D=_K4*&mR7n z&BKt^%z?kIbwK=8EaDa3ONl^;HP(Jpu6Y*zEM3~ps^Q^95EQEfW|Uh$cr;hQ%KgN z(X8aDw_8J27ngsLm`7d~GL}4`t$2eJDdtMmW37d$PcB=MJ#6n zf#^65GxBTL_E_^cHa68C%Z}<`0lr}Xi3r!*7z(HE0FGtHueTT zLPAuWG*0()b}|Aj0s*kzzzzAa>YCow4j^`;`v~W2yaB83NAEpP^X!xU5aD*d#A#FI z+YdR?Fs%(->?EwO&y!S=I;gh?(ORFuT5xL^#pDv}Ro9lgDUc+SGqQ~OyU**rHNO=QKw8#P`!y+3mp+6*)}R1sxss5}eiwup@iyvHFF ziU@RSc_A}K+!(@>9SE+}2U(7~c0K-NamN@+&n95F;IvokU*A&lkXXIQ?ou!V-##vl zxFQpqJ?2TY$ZE<%R?woVIP@|ToFEMs9W3+Dh*0yU>|{0RqxPzW`i8{P-uc z4FmZLmhESwwhg%5?(m2R!2QU4=|Kv>jDSl^EnYVa1mkX>Vmf7S>K`VW*RRs$a47&# zmPs0Jy0Ns%x<(<(Q^XCL*bl_?FtU8g?6Ag#aKiHdkxXC|w9^7;tB7R%kg7(XaO<}I zw>R&N3>_}LI0$!r-XO|0x%Vkx4_9HL@i479`Dr$JzQP899-EOh0cBv@| z?`_k4?`%brz++2L_~SvR_e8Z*d!9}{xglZXOqf-x%=Y``<)JRxV=}t*VQ`vT4U!&BkzRq!$OrBj5(M3k@kZt6K-FPXdf8r&+ohuqHT}) z8cO?$iMBV-ZWf@(PeD>Cl5ykqK<2;@sGVpM+aDk)vcG=4l7iohllING8m@F!-$KL| zQPX}UlBJM0Z4v1hbHvC|fg9NUoY)F5A2x%`N4u~k~J96EOK^_NE9M}8Kvt#Utp}%ZV|Ly$N zPwMBczxNDzi_bkd?8|Atb7lV~AVqOW*bJm|L<1sYqVGvDfHHp)K|Kb>zzoty(JYii zA0`rTvHWSHq$Sag)t=ZwZeWwMq?a-C2L1R-KSxR;EL1E~wio6oHItal;k$}CO_B4P z#=&`O?kc2N$THH2d9olyUkg(q>4yRq0d)Lb0uJzT9`9)DattdRj!gn$5-wBPUS z=i4j#BzpeE)BxSiU8hy}#cXAzn}DulI$mL-zdz}Fd45RGoFV+}+qa3uiYhuh$!fFB zVwVL4O(5wygo&jW%%*?4MR7Lh@*;|ie_tW>3Fhk8a^S0MTDaAlfj3rStW9-orm}9?P zk{z#oCkwI_M@iz&2Lb9K&ir|>WjS1Ru_qf5BV>JvvtCnyFZOs8zL#)f&^#pP08@GP zdi<&>OOCl^^KR3HKiF}E=BUa+ssDUm$%Nyk+jL&c;5omjPZ10%lfxSyT%h&ow#UP~ zG@+ZfZfkS@E8wX)Y)K(y11I18&$5C4XPLx~8^w)>iKo9Uo@cCO0WJ7K;(_p2PPPTj zCWNnD%!MRmu)ee2LM?Qp^eP0z>*t`KnIv)LXo|T{dTKTjPJE45!nSG-s3481tiHh~ z;|p@^p?wqdx&?5DrL{UBjFk1!lJ&xc7e!kQ4vy6TDHaZL1h$??GDsHh$+tg*ToV=P z9uN)*Z$_^z)<4xGD-r8*UjC4pXZted?OonQ#UCCgq7uJXvZh`;Z>WA*o5hXHpyd}Q z(pkm%3|CJdSnW%G!ob7^LVtG;P~D*3?beB2LVy4X*e+WsY+-c_rX70Cz;hv0c_qi9 zbE#AzT|G(W2^Xs3jGKqC96uNAcSdMgjLb;}?47Veg=VSE;3%W!J?Q=;exkmzrw9Jz zQ0KxQQgF1tKB3o|`NaI5Y6^DLf}c3FOtcF#qr~-w`euvR)02RB9An700UjfTYI zy4})34k3Ng$c*B05YG+u4kR{nZ;n@3)w0Fn!vA@dD{5r=`L|gNboUn8&NVL(! zNF|c?B+)0yX8(7A+~x*z))Kz85|8m%n^>{5@l5mdAZPE=egjkv&Dq8Use3%f3Vn|# zf{w#7#w3_*EU)-U?|C@j8n8wvILypxFO5+2&-0w%XRAPOU?w-gr&pmwfzg`@E?3o(n z@$7WP?vS0axq;8w(Z0b_^|QgcRAqH-Ws+>;J_;is)ax2Vctn2NXD+z`)|mmf?^j@u zKY)XN$^BcT8+GnlI>U!#uCA`1hRf7Zmq#`^H!#OJk#hGMI4FWz<VNMv-5wfA;ARChJ~`{v8mQCMzhnoLB)qGm2dg=n5%iDr$8D z?R#g8JknWyZMT!mOkOy*^aZg-y7R(wpa3IntikD0^*7K;7wgKy6+X-`xgvQ;2gqiQ zg(!^D5Q6RzA7B9r15p#Wgj@gVZ;cXyqpalCJqcv)xrfyP?4fm|vYxOMe1Cs6(Lq0` z8;`>9Vm}?Uotf2eH9uXE^iT9>BP;Y8+8N0|@c8D`sf~!gVNN{gJxPKLRBkd#a3y1y zyIJt_+Ur94mTob`d!VIwNl-9Rw;ddxw}M^X=5bxoB8Y-sgqd9V?}H|-7$TpzDT}zY zedWcIV$M2o_w`pFnoL-St$B40;M+AW<5lzR!l|#_tTGyUhdp+fgZMWmWT%>3%tP}e z{0r+-yikUgq_n!K+7Ym9)TVyB)5)ERH3n?^4V({$+G@@fI_Y6DQ-bz9)+OSlEJmJ5P63ELJyUC z;*B$62%Kc9kO-XzuGZQ#vB~d^5d~i;}gD*Z=BfZ8q-vR;19CR zHM4-U>ITWVXV0F!I)SR!@rYl(d}nndO*Sh&!@xr%ITnllx=z-+1_z39-rj3?5GPAz zUAF|h#O>`NEYR^Ou*mVxv+kAsLG08BoZH)J6PU%o&jXai3xY$pOM8FBhG>qi7p~#- zp40OvfTj7cjfH+8NQtjTGfMN&MDr|yk63^l+}~Cc<=VjER2JyKn#rfi4bAxsK+MMa zD{0?2VlEj5*U>K^6>h7P3gqM0RuOCFaW&TGmxxHMG;AT1d_u{?U1R9WaGr@j&%`7K8MsDtaFaM&LafyKP0Y*`c+Vl-l^l9i#&+mR z!@$Q;Z-Ob|(CIsIGp&D(nNOa$*Z+VlI#WjFrf<@A+Yu zAQLiI&gAD5A6;;uUlNd)*V~U)e19=i!p3EFr)`5299md>owB671k_bwaJ;l(mHo?; zvUwm|r?0+8NMKti+yu2PMZ|fJ&VY0084aRdQo8?1vy21h1n0>qgk2MkX5iR^ zYZ`CejY{fAdFQQ#uX#k5p@dj6eW%<)$GQQlr^yq*ohv}qO^A{;I|&5@Cj7bY2@=+k z-ybm$Qx6V%J4BmA#Ti2FvO2g(UcM$%jiw(7<--4#aO!)!c3ihE%Uq0){g30|oWF<2 z|I=gP|0NJy`?~HM$n3#x(DvIF z3RJ3jpUv0|0Sx}uWzEiQKq;ka5w8dn6=ohW_(po?>u0A88r(}`q-EU=)b-K8IPxzE zahtZCoMZGEq-`mwr#ee!MJ24$Q}h(+ApvAjfFfsa>3Tue+_#83v1d&O(r-e7qE-4@ z-yKaVV5IaDIq3oq$!lMa1*pYdT+rr(VPhj*dx z&Ths%r?NA4+^~Jb{cH{Qq%z7FxtF1$0_idG)BM_px@1+Pypn(q){!1-#BcKO+W6xc zys0!nlY{$YDPRG#^IqKC9(>zFR96Z$(kh>%`~6&`wjaH4l1TsazRFterjsm~J)WSS zdL}=*qTh>cMRI{P%nXytXR0S9N4324 zV+CKV9~K_1%ufbclOv1!86UiTP^0-YBVhlx=gu;s@%^F1Q@I*qkfoG!M7-#Q?+lNB z=;#?6TQ-1SG|q2r|6?g&4Ztt7G1OWz+w?pPNoUny!hQQ*Sv7kis+u??>0 zs}QtazRW!8dHUz0)DkB~3Ar6*WMVl*`h>p&jj&F!+0uB(9FT2c^q69p1=5y23_NjT!8 z1en}7Nu2yguOmN~-?qJqII?Ci3nGEe{>@Usq)vcyg4ANCTFa8dxy<45otAHLsez4) zOE+!2JnA{3Cm0D3N`Flqmu-y6*6K%%9c{xzZ^1$#$jq0DRPSpdPm)ECwL6cl&cpd- ztlvX|IDS|^c*fe>_k|Beb~~_9-u$&tO+xVBX3If15bL?@;7?v6sH09h3>q*Z!{5G3 zm>(72AeY279**0I)2emr$&EllyFEW@(!&W&8ez?@af&5txV*k%Qb-S3W+d!f6ry~mFYl#?|<(Bjs;^jQtCNHXxAOHOOar}k6v z<*~(M&}zlQRoL%hBsQF@ma7=$EB35xY3ATL`p!bf;tFy-fHb|?(Y3O37dFAOtqm8` zklvym1i|MTWTFq&GLP%F9Hu|?@0=83UO4>{;oqs}%3Z@#Hxpz_h&QQK=WDHnU*VzG zR?9&ZVC=JFx!CsWyV&GdD{?)8rD5#2tpjZy*sf@@4@`<$=bvlHmIpy&2` zjEvXWA4;X`Dq?!$V{*px6peSU_61~lLj6$z6A(zLas7Pj2%^Pl**viuTTsnf$1);K6#nNRTnBHk^RyDod|kHJwybE=Jb?c>&>XAw@^G{BU@~jNq>UT29!7;A3P=T&_LPF>-~Aem!`5q zr!v0R58KcRwgju=KuTY*wSPO$AF0+0CY|U(ektD$RP0Nhy{D z#crK1t=R2~YHQnoi?A}V|E-hyQ2C!Ww0mbxU~#E0xRQEda^l_fih+?DG>+}W&69I) z)Nv4qockO#4pqdk^YX{0w^w`d6W((3df{^um5L_tfbi9B-Nggs8@?(#FL!&d(C^)q z^+X4SgO>GThMh4Y62|*VCgtRdidDO(-prh|Sf~+E%w+GGD&A=T3mJD=(}5wh8p>A! z-09PTin~Vq2s{$&o@`8kR=y&n?w8B{2rZJXly%eXxj>EKZC;JF z{_W)K#HHd)dBB}jbUi8vf`PIdM;W(|(4v8tI5v+jYO+IZ4; z+rXoDY@9pm_Q=#8sTcXL5l(&ZcLnv!!e34)!JNei2Tw)MdVRW@Vo4iUY7^dX&|ImA zKA(m@;^7V0XY6C0vxk{GcO+eB+PR+bPQ{W*$V#BW%TtCrgCh+~BJT zm-KBV!trtOdXI2+!1?fHQG-w^Q_`q6zNu>dKF{i6IzP3du;rABxHuu(x+MZlRGF_d z{Xy|S^>*sd1J91ylK_waMEq{-j(|Y5 z?Z8#j{L9&gznGYIC0=$Z%CTeVt&|Be>TOLS545I#fTuqsj1TTh#5(#u^202mOZ~c| zqX1HPd-yP_*E2vf%nO;^rbpytv9cBc$>2%Ubus~1ao}@m5@^Si# ztGV8DJHE_;bI(A$mg^`<2@pdQRei~V(8NnG>P$G@!)X==n@B6%6Nw*)WjG5t8q~_a zWjn$6q4Jh32nyGhK7AS7-IXM*dWWK>Yq><^(ptXrQ8OcuB)^*Xm|JKF-|~gmzBo8M zIa(^{_Sg3fJR+m)&89>KM#fWb{*@-YwI*sx66Ud$qaw-b3dEZMT%v%0EBpW8Au14^ z_a9h*FXHty;;}{R`r$(cDQQOd{)pgC9379vy2i4zH6O2gu1V3 z2jdx<`Z&l2kYR2oUEL?{#`j*nyb4Cv#f3ttALi$vw^Ap{VF)*xglNTOy)#1p{E4Fy zX~EhZ5+x5&wd(<^PKRlDYvLIE5UQ#}o?f&*S2fWFf;9>qp7rTQMWA-ZRl8ePL}Lt+ ziQm3`8?AQYwb)w>3lFd9D%!nu7K?V=K-8BKx7rBx8j*GoA|CDZR6hYd<_(HzwKN4_ zEz0id>c-`kGADH`#mB{+*f*K60XU$c$+Vx09*4px+{>Ie6^ZwfJwzGXQZ_d255)l{YqB2X<>&82fO*tO1aL9`RqESd%TsW(rQ^HK@k1c?Gbn+e{8(^RVD4JK zwnso5K+XOlloL0g*nV)MI=_anVhdZQsV%j5!6WC))|Y(T7n?0>KgtI#9#pKSold1MMAl+$97~<9_C}brtL%3JRj$fC{Je?cckkYvTlwv#<9nf}Y!nVP zFCp>|5`X^mKdPe-!xwX6(blwJAf3MAi(TnV59+NK7+%>20>B^_Mon{bhFBila?WM- zDhpB=sMKb4Ndl}^s4;Y4ZtjgKX`>6SrejbfVWcYY7Wcm=;X)oBLl578&yWXRTmjX^MS$c3 z2*l((Hvr#u)O6iv8;I>jfFwH@!=AlvRGr833dgAny#CvXm#Yg%wQ_-G>u}2vP{0TH zvC|vyCmV=>QTX2#Vo9VfBOW}ngX~u`M!b8+mlMJ%=^fCy1T^c<`1qi2sx7)7Q1doq ze?8uPH7aG@l)qyHaL5kDul*y9QR`5DGoo-QQKyuI7#cAr;-h=P{QTI5=0?BT3uJ*b z$LWzz_ljM;dK1)x5C^Jc@44j9w|%RR*M2VyKb_oH01JfuZHSl5-`4aZ^|8GB)@0qh zj!K ze8h;Uc}bD=-;>Zrc+*66O0^jyO=cBf!k2{h|1Tfm9p~VJ1b0IzLCp{{2wT|fF_(%| zT>p|HSV8~3lHL?uOFLyR2tx~)@B&p#R=`wrzCGA$DD*k`*+r}qL(WhKVWQ=#bQ$r` z`C;S+LittUQ-i;DNWfZh@h|F`F_iv)V3Gd!*6jajqi&SPO~owcUbyCw*Gy0>?*kz3 zQb32BSbMp01c3hnMbBj+&B;P(?meCdmOr#K&OokQzxFC+Vv-Z<#C?du?Qpsg?Rp?< zb)pSKZ>UvZ?b3E0>r}nho1%3AQAfx^+Jqw~jnrCn1gB}2tM-TWsR7FpVpDAf(JEF^ zqt^WF!Oo^(w5nXG%ppoay&w`_tsY>TFG-QRURSeORVwGYp!&JJ&I=s{YT*ELn0%ug z;!RKZTlHsSqMBisPhUTQ0rGE?reU=kxCngkRNvO76XwX#8gp3fhtt$Fr`kpl2^T^` zk5faIn}b_QoKPx27wHz#186VG3zBt*z+b-n-XDVaUo2c+G#HPkcsq0ox(|oDtK2m4 zcN2=*+?XbKM)T&`8c`&~V^Wt-_>GaR;CscLXT%p48{Yub)xBNovD zaVFrzZl>8Rb}MsR8_2BEoaIo1HIyA3o$iQ1?>B&dKQw_p?4L^?wruq|qvCWfv3 z`9_l{?eK2?+qWz7?j3ta0QdFTL8x(oN}>Uz(k`%&w^T7IETU%O=jl&J@m1jTM zyxtOmuf6~-O^O3F{4+!!zxBZ9+-GVcP$iTTq11*RF_5g)r+4fz00*IMkeyO~^FQq7 znKGgWVAaTWgT*y;H=0L8du#vOe{$1&hQ+)H*V>8+T~MI@HtKP1Te@mW>Lvv1#6mLG zHl#)8%X=dr^<#F4^@ab2xkbK>`=2Cw_N8@PjyoY%Yv-SNUx z$MHR=;PVg?VPr($v#;#&=SReo$v-Y*aBEZI81bP820A1AN*yrZUYMJcBn|<=2dE#= zRWee1b2I z7%qOjx4Zl6;~%a?ML0zNSz^fLZ}QSSUO(xcHra0L6|Vs|x(8tL3-Jt}h85vp*2tPag1VbM?;rl^$-SM{KjuRhgDADj*L%vnfuIBC7=@fCnQ#qq z65X$X;lx$2qiZl2j2@8cB^_3~Ua%S|Fz8y_K3F}k{&jbzpHN>d=-M&P}84pBytwZxn73nfY{r?vYi$x7@6b5DMd40{|G4qu9;*Hp9x zOe!~XVx#n-9^oTGZ^#oxwo*)$Zxuvp(AqXNaHYfP_Eef5rEUV>cSTh6E^y+X`zenV zjwlYfj;5mULit_0&N3QTuJ2zJVw&B{JvwQmZy6+Wqw2 z_7Vm0%!cotR_!1Hu#8~z>sH5oh{4Gu`(ulc6ON`OLYHi-as9~9Vi_?b7%v;|wM~19 z=#O;(7m1kz1kZ57(Y)qw%w#pP`CI8okr#`mr%CmF2n@|jPZP{8p#3-mEW)S!(9e}E z2DFDeNHGt5ejOe{!RIVbNy`od+fCW1Kpbc_CEXc9YFuPeN}4Di)SS75SkWKf;#h4y znx32c0bl%!@H`qs9VOB-E6gRb=)ph$L(cYR!@pw@t{{aA;5d0Z9qkOh-V#Hd*1Z!8 z*ks4vS7Dw@%M%jz0~RTuB$kZB7Z7qejsN5j2P>%B6kE(5mQlh*ijZA7wAB9r9j=)E z&tv8P#xs>(f(Tx|d`7tKsdOOVvFL9PX}th`W~`1UIL2eVvA1!|mk8@=9w7f z4H67!05s-2;3f|@AP%RGw|e?z?XKL5`oF(ZRu>eSVT6=e_w)3d122xugM)Z${TG0h z+9^58z~(^(kXsN{K(|zmrsG!7_7PDBrDN)@Ng=EbgYjNXVf&~G$Q7@q-Ek(8`G#RK zU2&&0lrJwS9e>RVY~E18w-6>GKw zWisIPWrBAArfr)ay3u;AW>_tz7-GR%yZNo8M7-d6wK@>6O}Ow1z%eJ_gXHN$-yX5v zup4J?fAr|7>q^Y>PH&Q|@Pv(TC*2G0YDeI?$u(>D^ppcZh+eZ_T?nNui?Vu>G;R<^ zjdc<^+uhFM-g)~$Xtv@81TUMi|x z;^?nJm03n?rxr@lfQSm~#R z9Q=04I^T?)eZBQ7$RX<52HcWJmL7wrPR}NS8V{94X-cOJZiYb~QRTNi$YBZK1_);k z%*L4c+93!;rP~NezD(g5`p$PL2ou*3ND!zz^Do2h6$_KFbLnbK!kvA%gf8(n%EyW^ z5H{dC8;DvweBr}A=k|^dRwC-Pig%-aU5r+G(N&i0J`gLYo}Alhz*legAusJ+`MYBF z93Y1JrON*hDxNV;8rA>Ch{xx^HWu=!;0Jj{Eo%gdH3k9%%WK0OSxF=SCWS6IBl?o7 zLSx2~e=F#nRvsOH%Uy>YRgDw{%LgJGh=ZOD#8tAAQZ&x`zwl@~NIcs7+^D-##BsS& zqOLh{GsD&1XSQDJn1%~Tt*3sc-T-{$aL_`qA5O@AjO#KN?fn1WK|#ES@zd7Fv4}*SR5u)5qPIBiF7z)aF0? z#@4s86yDgeYzNQ+X~0dTfn+zbCexCk#qc5h%PBHg3JB@$>MW`G_+mXsh3j(Kr%#s_ z>QCI3(X@Z#atq8x^rd$AiZ-L@Ay+u?(^u1uT_y9?hs%h4%=W|(UtZPvX&i_v(APzO z#JAKLH0@zjwqL)3H{oT@M!X}*K4`^v6W&k(-vw5Qy8MwJxbWG1uj45)MR<^FW4uB= zGGN;i>Pw`c4+2KKt4dbsa}$?mePJ=K*bg0Gx*n^`!1-x?+K(4TUq7`EJOUUa^fbW< zj4-Ku5kzyo*LtdJO(QF}8yMx+nC00-5E^`!*oUTTHG2lu1!1TgCIIoEHEP&CkDib% zc0+Xo?mPeaNCK{+JlmavKIyAI)cLoZ0)DD0{BduOM=CaLT(E}866Ftv4zi$Hoe{P4Pd}G_nah;5Z~|~-8UK&xBzjs^cI3NOB)YIPw4;K zMV$2@8A|oW5|h-EHNa*1UJi5rqICjjXJh0Lfr}@qR6o>}ry*Dvls4%0ZRWCu;()my zsDM%8iPYv_0_XKFRZpPtAWo?t5IbXA$$fuyI$vx_(2nRVW8}@AmD58{lLwhvp8k zxlh*3dG_#r{iB`Eypv=V8lYOjdb>i??kyQ7+F-gP%cKt!?An^-7Hs3KAoPys0dg4Bp~ z_yDE15JW(wsx&Fmi%1tKN(q7#=`FMX0VBPJ5(tFkOuqYD>#nob{o|fL&RSvZlD#K; zUS?*`yzlcq5B6%THn&*!`qXs5`k8ZWvF(7{dtt24l%(yh3^ff86(n58E>&g%ah;!= z98kd&oWnC8yFqF)VEcY*h_hDAN?RsWc1T>%G1R)|cU10~OZCa&<@xjT-+0{`3rmo@ zj}4Lvo53ShpvB`u4Ga20&H@iti#_zu2))C=Lpu6$@f)71GtJ*-X|vreQe<{)Y9KL7 z`V`0BDefNWmq5BrNa#iLKHeAb0r1pqU73^3w2$TOOoZ9r0gyUQx{QhkL(Bt#MVYgMQe2-IrE%Y3ED* zSqW1K(n?v9{~C}9D;1ogg1N|cnwR0*KMbL-69hfJR@&3X#l!H4CVW) zTf-RoCJ|(7#`tird&!@viWIniS42YRE(o1miRweHX47m^G{0Qu2RyNzY1lyaA{=7ZSy>zwpI=kpxjdKnu;UlusCo?6V%Ly>~j}9EP)nz$y zrbtUr=GPhd0`;f}lr+vj|Go8+z$mb&ZUGrPKN@3LF{r9 z7t_Y=+g_|K;KFvd{Ibw-0X`V&YYx zB(VwbE+U1Fz_NdUnLQ_`n%pQv2|U(sE)iQu0tr7Su3>px@pF#DO8w7?Qv4V-2^K1Y+HQVr>=H7T^>Gd8M6xko00^dK8|;baV)43xn^TIu zz}a6kJfSD)%i-U1RL=6Ijb299ibe(C_kAmVN2)MF_g^Y|lIemD(QbfN>35kJW z{M_xXIl9l1;Q&P@GWxxAqQ1Qsw0UTzA-cO*o1yIOy$sH-cpAK;ppGL&8G*N7jFb!v ze;!3_ksaH?6e+^@w8kC%DgT!8_%I`jjX7b(+}LH>x{Dm(mh;1@$m5H{wAN#Lsx}xy zkv*+f!&X8R$&8A%0g4-2yZFezlcze@olxoKE&5FGN$-&8^@-!l#ta01Tx3kNX zGy?{6^e>XFN}$x!)mZH26Qy4A1k(&OW^kUiAl5q-xmlj%E+N$c72L;-H&a3N-HDRs zDLmrcmshk3AK?EvCuL7_n9U+fOg>hBd=^x@GJMNF} zydPB3j4XZ7zG_>OV}lLj?287SUCpHN!wWir&Midxme{xt4YgfS%-_4-H|bmp@Z`%6 zR5%uQP4^xlOn7W>QOOI(o$^Q4+~1CIZSW_>aT+aK))ue2Tpj%hz%-*)h1nF4V5j(> zVz5gJ*OHTWVA~kNqP0Q&SA}KvOwj0+XB7Zp1^ldLx6cXbQaVr9A}K+W&s$D93}hb* zJv~-w&kD%^CXR^6NQ9*s2o%_1L}}sHvW|oFpo4a{c`mc?Lvyk(_nSGICirB{3f8SY zHmrJkF7wV41yM#;`?*F{VwlmT=S9Oey}_64N`?4Fp5P}}GLI}(EmMA|>g_3ew>MT) zF$%#8T1xas#}3=pRl&KMFWg#lZ>4wCIkpsx7n93ioy#mqjXJN*@=7a4*SO3VivQ80 z=?}PgIyg`2<=`t;B_SZ=$2_z3&=`nl3;?xeDmRUZ6u|6pBiM>BhXT2Xw6AmWehlR# zC$9~5CV`EgSr)c>y4FMxSXn-*?y+w_J%N zyJ}WU)cb8qi>`QX0r4&HPMb^NQc0V!w-B50y-`=3;Z=ATe_y;e{R<2GT34suA8YeE zS29y>IKkEyYF1o%8j+)-1nv7Gl99z*ehHRQerGyLNIn4nny>&Uz3|VvBOj<`JK}Cw z{22By&VzYRk5(3PruuD4n|W*2TM<6cTm%8y&b2S3@y(+v9v6` zPVW!U6TTj7;$Kzgim}BemGOOTzadk1$?o^Fx`SR8lf%L+4uw}q+92-p6AxGGi+iKc(NsydX61X5%!KaEIuMfo$Ud+H@4y7y;m6PiJ3-S5(G3)@M%Jemf0v#@4%78=fO<$9kh-mtH26BGtU zl^J)Y>tbU6;tO3cH-UkiCF{|9^DIOP4S)6TAcs%){(w|<0oz)rO zi!UhTg~Rz^`Xc%?5bUNOO&h(}iV2_5FdNE}&FmU`P?Fi`wp|QgMpk5)H92@ZH7K$~ z7w-RXU?0!%0}37v5{81=ln?__`3Ar27n|#pp#0I=K%zUoLojyV!p@>kb~sJWLk$F= zq0DDv@czFIlugn}2>4?bN6RukR22LZb>5vD@|_K1<3>|}@^l}$99(z${h^@Pq}WYTaq6wt@Q_H0j=Q_$Up@q4 z?&F1wU!ojTb5Kdb>f<8}7gum$+@m^QW5B*Hf{p>Q8@&h&(@};?-GU)9XhELxd(%f8 z&;LkyzJyyGgpm@ARf--+AOhtsLM;E8!#bhP1Jm3^|6mXdY7n#8kK3jB{MDkn99Zd* zo}S*y9yMc&$}U&^8<@?LZWlo|)1r;dVVumM1~KBFL(qxW8fte8)zu5x&qAAT z@E$ZxQZd}3ii#G1LJl*H+_-InxPie2M+{I_3a40fR*?44?cm;|M#3(_4k!&?n8t

2Lu-}b%)y#0a@e>S=#{j`IT3uscNfkC#5c$u!NE$_Z?G?koVIVmUCe6C{}x_Hy% z&A40BIdAuaJb>QI-71@$G=~z7uqhvzGTqJV?C2D&b)mB~fB*hvfbjT^0ii9nkRCL{A$O%ViORoEUG`y1pstFZuc#Zf^OFV1_NFawYVN-MhGP7oh>YjKUg&`Pa8o( z>>e8pz6WKHTDdY1;XV-&;?26KkhyQ< zzBIX^?b=TAeRXxepy|I)bT%jrd($VNyRLB)2YkcAPmeTbx}zI2zP<&ki_%pG#?8q`6vge%{mqS_U??F=0;lO9&#mn=RJ%4|a2WkD zP4O5^+aj8PZfwg7woBY+vFMm9AZQ&=CKu5D2_vzI)5(-ilMiY&Cify69Bi}3P@mL!4v|_Gcq;V_sNGFG!V~i zPjRnFu-eK7Bxux^evwg$Q!yO)uivMqi@#6QyN7P*oe>?@P6LibGzmuaCXMMbSY~Uexe~TX~T345Lw=)mVz*4O$Kkj`zvojd)M}6DLmm02_Ue z13%#593k+MM$x@GQlu*D(tDQig>cXG)7xwM!SMRUbCk`bT+O^^7b07&T{2cZlroG94fRjcS0DvW z9qhONjzSh1J|khDkz%zD_X|WI%|V=QhJ$?paRK=IVvf>6H&7D?NQ=i@8e;xS^WUnk zUA?+d@6ZMKf%{Er;LuH%FtTmfVBrLUGWX?C>dzjJV{H8VL zHcV{)5OZ{V3s&M35MYMEVEnh1tQCcC^4X;#9c4xclNr2=8Wl%7W#=g_M!mRiN(#iC z3UKn*MEY^nuCA_ug9CpXqa&cYoXqNPkc7Jx6T1 zeT!Jp^UNaWnW_JPt^Ibyg$}Q&j{4XsadH%rvmI5S&d*k2)?o2r*H?KSv9#8Sy|ZUM zopkmTj%}8hl$uCcGyGdkd>suQjIabmLpi#Ni?vg8L=$le8v~sDl|5clLQ9A%X;5|s>aWJ$7b{^89rm!qL+#a=^}>sW2w5O#Z?Z~E=77m zpN)zn$ZitkwLC9UKsxQZq0dN}X>C=N%-Y&o!}b$1v&e>$)>d`rpdd?GZ{^6NNsYRS z!{qseg(^V$vQq2GY;yEDOsXamXg&BX;7MKDqHhnklD7*AFWP`%3cXR=XHjB=6~0bD zU^TZ0toqw0+5>AB+`n5NcK1!W`t^%q_e#WBY+aQwZ*5Hw#7$X|ga})c0$Kag55ExB zlXrLl_P6wwn_B(1Z#K!I4-2eF9F%V{sH*SZ#|?0Hb1SIQ2S`qYD`NY=&L$suC~@WB zHEJ@7T)FMae>lF2y25#v4@i5q^5lQ`U;{T3g~v`4=GJyL_#eK#ItSuc10cX-fIk=< z9^H13EqTB5iKy5YnJqNq>PM=*MJ51647?y|LeB@$1g1{A!$v3Q(%66zIb~b2?xW{!0c?+<)v8E zl$#6X2>$wtMzxDGn1m4s6yieRqJ#X0zlTB3%C;5EN29wvwx>zUz4I!&XCR0rTnbKO z4$At1UM_4mEP8wc2D@Lt>!}0EEZLr@E^*EotfAC`O-}}fhmCR6D@Pvw86D$TWG;3e zSnK`hL}bp9_)* zVh6{+&3U3CSAM)d9#{j0Vir{%Uf#|8!U~hOcTb_{|+yLwSk~U=fd`f zVdhsKh8?6YYk+rDWC;R1y}4KcKaNWE| zgz&T1nyN$4bG&{H^H}wo(HMq0&?=iUvKN4aezjfokbU)W&0okeb~r_`*ixuBh@M$UV1N^_n>JIT1Xxxqb+A?oAGL8nfh)Nm?gwuHlD zyT8CI6*aCdhFN{)XZrh}G3`(!bLGdQEIqv}y+!}kpFdwJ^l1hD3|sIU`1$kBDDEN3 zgdQ|-9Zl_%nZV$De9F5Y@%R@Y)5k0o3@?Tv8v3IL%|X|p_bD>Lhlhs+yw(S%A_-?x zIT=CsL3=>OMnxOfuY)%k7#v{wQqNP~C3nrmtVt=4u6VWj2`=a5UFkBnQiuj)!*S%j zJpGF6D?9Vuj|VTiMxBJ9!IA<@6HA2mP>M#G_pSmgBKv`;sOZS=wIdef)Pz`4*CW`= zcuW)Mj*5jW!EabWHw<3Y=n;7ey4tT-|C4_D-#Q$Ht~J97X3%4I0h9x2sOzYe-hCSK EUkPtEF8}}l From 6b6fcf81f25979da4c3257eabc5dbc5942be47ba Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 18 Feb 2015 23:55:21 -0500 Subject: [PATCH 11/30] Fixes #8075 --- code/modules/mob/inventory.dm | 12 ++--------- .../mob/living/carbon/human/update_icons.dm | 13 +++--------- code/modules/organs/organ_external.dm | 20 +++++++++---------- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 711b0594a1..653e33b2dd 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -208,6 +208,7 @@ return 1 //Attemps to remove an object on a mob. Will not move it to another area or such, just removes from the mob. +//It does call u_equip() though. So it can drop items to the floor but only if src is human. /mob/proc/remove_from_mob(var/obj/O) src.u_equip(O) if (src.client) @@ -242,16 +243,7 @@ /** BS12's proc to get the item in the active hand. Couldn't find the /tg/ equivalent. **/ /mob/proc/equipped() - if(issilicon(src)) - if(isrobot(src)) - if(src:module_active) - return src:module_active - else - if (hand) - return l_hand - else - return r_hand - return + return get_active_hand() //TODO: get rid of this proc /mob/living/carbon/human/proc/equip_if_possible(obj/item/W, slot, del_on_fail = 1) // since byond doesn't seem to have pointers, this seems like the best way to do this :/ //warning: icky code diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cc053f219d..0bdcf6d427 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -545,16 +545,9 @@ proc/get_damage_icon_part(damage_state, body_part) overlays_standing[UNIFORM_LAYER] = null // This really, really seems like it should not be mixed in the middle of display code... // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY - for( var/obj/item/thing in list(r_store, l_store, wear_id, belt) ) // - if(thing) // - u_equip(thing) // - if (client) // - client.screen -= thing // - // - if (thing) // - thing.loc = loc // - thing.dropped(src) // - thing.layer = initial(thing.layer) + for( var/obj/item/thing in list(r_store, l_store, wear_id, belt) ) + if(thing) + remove_from_mob(thing) if(update_icons) update_icons() /mob/living/carbon/human/update_inv_wear_id(var/update_icons=1) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index b45d0aafa7..a49ff2c408 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -596,14 +596,11 @@ Note that amputating the affected organ does in fact remove the infection from t update_damages() var/obj/organ //Dropped limb object + var/list/dropped_items switch(body_part) if(HEAD) - organ= new /obj/item/weapon/organ/head(owner.loc, owner) - owner.u_equip(owner.glasses) - owner.u_equip(owner.head) - owner.u_equip(owner.l_ear) - owner.u_equip(owner.r_ear) - owner.u_equip(owner.wear_mask) + organ = new /obj/item/weapon/organ/head(owner.loc, owner) + dropped_items = list(owner.glasses, owner.head, owner.l_ear, owner.r_ear, owner.wear_mask) if(ARM_RIGHT) if(status & ORGAN_ROBOT) organ = new /obj/item/robot_parts/r_arm(owner.loc) @@ -627,19 +624,22 @@ Note that amputating the affected organ does in fact remove the infection from t if(HAND_RIGHT) if(!(status & ORGAN_ROBOT)) organ= new /obj/item/weapon/organ/r_hand(owner.loc, owner) - owner.u_equip(owner.gloves) + dropped_items = list(owner.gloves) //should probably make it so that you can still wear gloves if you have one hand if(HAND_LEFT) if(!(status & ORGAN_ROBOT)) organ= new /obj/item/weapon/organ/l_hand(owner.loc, owner) - owner.u_equip(owner.gloves) + dropped_items = list(owner.gloves) if(FOOT_RIGHT) if(!(status & ORGAN_ROBOT)) organ= new /obj/item/weapon/organ/r_foot/(owner.loc, owner) - owner.u_equip(owner.shoes) + dropped_items = list(owner.shoes) if(FOOT_LEFT) if(!(status & ORGAN_ROBOT)) organ = new /obj/item/weapon/organ/l_foot(owner.loc, owner) - owner.u_equip(owner.shoes) + dropped_items = list(owner.shoes) + if(dropped_items) + for(var/obj/O in dropped_items) + owner.remove_from_mob(O) destspawn = 1 //Robotic limbs explode if sabotaged. From 82480ac1a78405cb6efb8ba4cbbffcbe975ed8c4 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 19 Feb 2015 00:09:18 -0500 Subject: [PATCH 12/30] Minor cleanup --- code/modules/mob/living/carbon/human/inventory.dm | 8 +------- code/modules/mob/mob.dm | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 0a504ca148..7846a1ac26 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -753,13 +753,7 @@ It can still be worn/put on as normal. if(slot_to_process) if(strip_item) //Stripping an item from the mob var/obj/item/W = strip_item - target.u_equip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.layer = initial(W.layer) - W.dropped(target) + target.remove_from_mob(W) W.add_fingerprint(source) if(slot_to_process == slot_l_store) //pockets! Needs to process the other one too. Snowflake code, wooo! It's not like anyone will rewrite this anytime soon. If I'm wrong then... CONGRATULATIONS! ;) if(target.r_store) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 82a5384001..a93b000e0d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -183,7 +183,7 @@ var/list/slot_equipment_priority = list( \ if(!istype(W)) return 0 for(var/slot in slot_equipment_priority) - if(equip_to_slot_if_possible(W, slot, 0, 1, 1)) //del_on_fail = 0; disable_warning = 0; redraw_mob = 1 + if(equip_to_slot_if_possible(W, slot, del_on_fail=0, disable_warning=1, redraw_mob=1)) return 1 return 0 From 01784d8d6ac93e90bc41928e03a57553c8ebbc0e Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 19 Feb 2015 00:20:38 -0500 Subject: [PATCH 13/30] Fixes cigar/pipe mob overlays not updating when lit --- code/game/objects/items/weapons/cigs_lighters.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index fb51d83c14..21c65905e4 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -119,7 +119,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.update_inv_wear_mask(0) user.update_inv_l_hand(0) user.update_inv_r_hand(1) - return /obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob, proximity) @@ -284,6 +283,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM else if(istype(W, /obj/item/device/assembly/igniter)) light("[user] fiddles with [W], and manages to light their [name] with the power of science.") + user.update_inv_wear_mask(0) + user.update_inv_l_hand(0) + user.update_inv_r_hand(1) + ///////////////// //SMOKING PIPES// ///////////////// @@ -361,6 +364,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM else if(istype(W, /obj/item/device/assembly/igniter)) light("[user] fiddles with [W], and manages to light their [name] with the power of science.") + user.update_inv_wear_mask(0) + user.update_inv_l_hand(0) + user.update_inv_r_hand(1) + /obj/item/clothing/mask/cigarette/pipe/cobpipe name = "corn cob pipe" desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters." From 12585172024435fe3673c74405764f524b3c54b9 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 19 Feb 2015 01:02:32 -0500 Subject: [PATCH 14/30] Fixes hiding mobs being layered underneath vents --- code/modules/mob/living/living_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index da94c1abde..b4310d77b5 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -16,8 +16,8 @@ if(stat == DEAD || paralysis || weakened || stunned || restrained()) return - if (layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 + if (layer != 2.45) + layer = 2.45 //Just above cables with their 2.44 src << text("\blue You are now hiding.") else layer = MOB_LAYER From 675b277d16a588529947bda8468fbaf5d86f2956 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 19 Feb 2015 10:43:10 +0100 Subject: [PATCH 15/30] NanoUIs based on embedded controllers should no longer wander across the screen. calling updateDialog() forces a NanoUI window to re-openi, which is a bit of a pain when done in process(). --- .../machinery/embedded_controller/embedded_controller_base.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 84fa419265..8661651a39 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -24,7 +24,6 @@ program.process() update_icon() - src.updateDialog() /obj/machinery/embedded_controller/attack_ai(mob/user as mob) src.ui_interact(user) From ead0f31426f9f434651c3e9eadb49e3ed6797e74 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 19 Feb 2015 18:22:19 +0100 Subject: [PATCH 16/30] Revises how Topic and NanoUI shares allowance-logic. All mob-interaction logic now resides in nanointeraction.dm and is called by the base CanUseTopic(). Specifics for when objects allows mob-interaction can be specified by overriding CanUseTopic(), see machinery.dm. --- baystation12.dme | 2 +- code/game/machinery/machinery.dm | 17 ++-- code/game/objects/objs.dm | 20 ++++- code/modules/mob/mob_helpers.dm | 6 ++ code/modules/nano/nanointeraction.dm | 111 ++++++++++++++++++++++++ code/modules/nano/nanoprocs.dm | 11 --- code/modules/nano/nanoui.dm | 125 +++------------------------ nano/css/shared.css | 10 ++- nano/js/nano_base_helpers.js | 4 + 9 files changed, 169 insertions(+), 137 deletions(-) create mode 100644 code/modules/nano/nanointeraction.dm delete mode 100644 code/modules/nano/nanoprocs.dm diff --git a/baystation12.dme b/baystation12.dme index 6640c37988..f3dc3f7072 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1224,9 +1224,9 @@ #include "code\modules\nano\JSON Reader.dm" #include "code\modules\nano\JSON Writer.dm" #include "code\modules\nano\nanoexternal.dm" +#include "code\modules\nano\nanointeraction.dm" #include "code\modules\nano\nanomanager.dm" #include "code\modules\nano\nanomapgen.dm" -#include "code\modules\nano\nanoprocs.dm" #include "code\modules\nano\nanoui.dm" #include "code\modules\nano\modules\crew_monitor.dm" #include "code\modules\nano\modules\power_monitor.dm" diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 819cc05632..042889157a 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -182,13 +182,18 @@ Class Procs: /obj/machinery/proc/inoperable(var/additional_flags = 0) return (stat & (NOPOWER|BROKEN|additional_flags)) +/obj/machinery/CanUseTopic(var/mob/user, var/be_close) + if(!interact_offline && (stat & (NOPOWER|BROKEN))) + return STATUS_CLOSE -/obj/machinery/Topic(href, href_list, var/nowindow = 0, var/checkrange = 1) - if(..()) - return 1 - if(!interact_offline && stat & (NOPOWER|BROKEN)) - return 1 - return 0 + return ..() + +/obj/machinery/CouldUseTopic(var/mob/user) + ..() + user.set_machine(src) + +/obj/machinery/CouldNotUseTopic(var/mob/user) + usr.unset_machine() //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8f54b76717..b0a01a04a0 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -21,10 +21,22 @@ if(!nowindow && ..()) return 1 - if(usr.can_interact_with_interface(nano_host(), checkrange) != STATUS_INTERACTIVE) - return 1 - add_fingerprint(usr) - return 0 + // In the far future no checks are made in an overriding Topic() beyond if(..()) return + // Instead any such checks are made in CanUseTopic() + var/obj/host = nano_host() + if(host.CanUseTopic(usr, checkrange) == STATUS_INTERACTIVE) + CouldUseTopic(usr) + return 0 + + CouldNotUseTopic(usr) + return 1 + +/obj/proc/CouldUseTopic(var/mob/user) + var/atom/host = nano_host() + host.add_fingerprint(user) + +/obj/proc/CouldNotUseTopic(var/mob/user) + // Nada /obj/item/proc/is_used_on(obj/O, mob/user) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3c983bcc22..d205412297 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -80,6 +80,12 @@ return 1 return 0 +/mob/proc/isAI() + return 0 + +/mob/living/silicon/ai/isAI() + return 1 + /proc/ispAI(A) if(istype(A, /mob/living/silicon/pai)) return 1 diff --git a/code/modules/nano/nanointeraction.dm b/code/modules/nano/nanointeraction.dm new file mode 100644 index 0000000000..42976554d9 --- /dev/null +++ b/code/modules/nano/nanointeraction.dm @@ -0,0 +1,111 @@ +/atom/movable/proc/nano_host() + return src + +/obj/nano_module/nano_host() + return loc + + +/atom/movable/proc/CanUseTopic(var/mob/user, var/be_close) + return user.can_use_topic(nano_host(), be_close) + + +/mob/proc/can_use_topic(var/src_object) + return STATUS_CLOSE // By default no mob can do anything with NanoUI + +/mob/dead/observer/can_use_topic() + if(check_rights(R_ADMIN, 0)) + return STATUS_INTERACTIVE // Admins are more equal + return STATUS_UPDATE // Ghosts can view updates + +/mob/living/silicon/pai/can_use_topic(var/src_object) + if(src_object == src && !stat) + return STATUS_INTERACTIVE + else + return ..() + +/mob/living/silicon/robot/can_use_topic(var/src_object) + if(stat || !client) + return STATUS_CLOSE + if(lockcharge || stunned || weakened) + return STATUS_DISABLED + if (src_object in view(src)) // robots can interact with things they can see within their view range + return STATUS_INTERACTIVE // interactive (green visibility) + return STATUS_DISABLED // no updates, completely disabled (red visibility) + +/mob/living/silicon/robot/syndicate/can_use_topic(var/src_object) + . = ..() + if(. != STATUS_INTERACTIVE) + return + + if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level + return STATUS_INTERACTIVE + if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle + return STATUS_INTERACTIVE + if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery + var/obj/machinery/Machine = src_object + if(Machine.emagged) + return STATUS_INTERACTIVE + return STATUS_UPDATE + +/mob/living/silicon/ai/can_use_topic(var/src_object) + if(!client || check_unable(1)) + return STATUS_CLOSE + // Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras) + // unless it's on the same level as the object it's interacting with. + var/turf/T = get_turf(src_object) + if(!T || !(z == T.z || (T.z in config.player_levels))) + return STATUS_CLOSE + + // If an object is in view then we can interact with it + if(src_object in view(client.view, src)) + return STATUS_INTERACTIVE + + // If we're installed in a chassi, rather than transfered to an inteliCard or other container, then check if we have camera view + if(is_in_chassis()) + //stop AIs from leaving windows open and using then after they lose vision + //apc_override is needed here because AIs use their own APC when powerless + if(cameranet && !cameranet.checkTurfVis(get_turf(src_object))) + return apc_override ? STATUS_INTERACTIVE : STATUS_CLOSE + return STATUS_INTERACTIVE + + return STATUS_CLOSE + +/mob/living/proc/shared_living_nano_interaction(var/src_object) + if (src.stat != CONSCIOUS) + return STATUS_CLOSE // no updates, close the interface + else if (restrained() || lying || stat || stunned || weakened) + return STATUS_UPDATE // update only (orange visibility) + return STATUS_INTERACTIVE + +/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object) + if(!isturf(src_object.loc)) + if(src_object.loc == src) // Item in the inventory + return STATUS_INTERACTIVE + if(src.contents.Find(src_object.loc)) // A hidden uplink inside an item + return STATUS_INTERACTIVE + + if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates + return STATUS_CLOSE + + var/dist = get_dist(src_object, src) + if (dist <= 1) + return STATUS_INTERACTIVE // interactive (green visibility) + else if (dist <= 2) + return STATUS_UPDATE // update only (orange visibility) + else if (dist <= 4) + return STATUS_DISABLED // no updates, completely disabled (red visibility) + return STATUS_CLOSE + +/mob/living/can_use_topic(var/src_object, var/be_close = 1) + . = shared_living_nano_interaction(src_object) + if(. == STATUS_INTERACTIVE && be_close) + . = shared_living_nano_distance(src_object) + if(STATUS_INTERACTIVE) + return STATUS_UPDATE + +/mob/living/carbon/human/can_use_topic(var/src_object, var/be_close = 1) + . = shared_living_nano_interaction(src_object) + if(. == STATUS_INTERACTIVE && be_close) + . = shared_living_nano_distance(src_object) + if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction. + return STATUS_INTERACTIVE diff --git a/code/modules/nano/nanoprocs.dm b/code/modules/nano/nanoprocs.dm deleted file mode 100644 index 65432a8f24..0000000000 --- a/code/modules/nano/nanoprocs.dm +++ /dev/null @@ -1,11 +0,0 @@ -/atom/movable/proc/nano_host() - return src - -/obj/nano_module/nano_host() - return loc - -/atom/movable/proc/nano_can_update() - return 1 - -/obj/machinery/nano_can_update() - return !(stat & (NOPOWER|BROKEN)) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 04ef3cc95b..e0047f8cfb 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -132,121 +132,15 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) + var/new_status = get_status() + if(new_status == STATUS_CLOSE) + close() + else + set_status(new_status, push_update) + +/datum/nanoui/proc/get_status() var/atom/movable/host = src_object.nano_host() - if(!host.nano_can_update()) - close() - return - - var/status = user.can_interact_with_interface(host.nano_host()) - if(status == STATUS_CLOSE) - close() - else - set_status(status, push_update) - -/* - Procs called by update_status() -*/ - -/mob/living/silicon/pai/can_interact_with_interface(src_object) - if(src_object == src && !stat) - return STATUS_INTERACTIVE - else - return ..() - -/mob/proc/can_interact_with_interface(var/src_object) - return STATUS_CLOSE // By default no mob can do anything with NanoUI - -/mob/dead/observer/can_interact_with_interface() - if(check_rights(R_ADMIN, 0)) - return STATUS_INTERACTIVE // Admins are more equal - return STATUS_UPDATE // Ghosts can view updates - -/mob/living/silicon/robot/can_interact_with_interface(var/src_object) - if(stat || !client) - return STATUS_CLOSE - if(lockcharge || stunned || weakened) - return STATUS_DISABLED - if (src_object in view(client.view, src)) // robots can see and interact with things they can see within their view range - return STATUS_INTERACTIVE // interactive (green visibility) - return STATUS_DISABLED // no updates, completely disabled (red visibility) - -/mob/living/silicon/robot/syndicate/can_interact_with_interface(var/src_object) - . = ..() - if(. != STATUS_INTERACTIVE) - return - - if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level - return STATUS_INTERACTIVE - if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle - return STATUS_INTERACTIVE - if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery - var/obj/machinery/Machine = src_object - if(Machine.emagged) - return STATUS_INTERACTIVE - return STATUS_UPDATE - -/mob/living/silicon/ai/can_interact_with_interface(var/src_object) - if(!client || check_unable(1)) - return STATUS_CLOSE - // Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras) - // unless it's on the same level as the object it's interacting with. - var/turf/T = get_turf(src_object) - if(!T || !(z == T.z || (T.z in config.player_levels))) - return STATUS_CLOSE - - // If an object is in view then we can interact with it - if(src_object in view(client.view, src)) - return STATUS_INTERACTIVE - - // If we're installed in a chassi, rather than transfered to an inteliCard or other container, then check if we have camera view - if(is_in_chassis()) - //stop AIs from leaving windows open and using then after they lose vision - //apc_override is needed here because AIs use their own APC when powerless - if(cameranet && !cameranet.checkTurfVis(get_turf(src_object))) - return apc_override ? STATUS_INTERACTIVE : STATUS_CLOSE - return STATUS_INTERACTIVE - - return STATUS_CLOSE - -/mob/living/proc/shared_living_nano_interaction(var/src_object) - if (src.stat != CONSCIOUS) - return STATUS_CLOSE // no updates, close the interface - else if (restrained() || lying || stat || stunned || weakened) - return STATUS_UPDATE // update only (orange visibility) - return STATUS_INTERACTIVE - -/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object) - if(!isturf(src_object.loc)) - if(src_object.loc == src) // Item in the inventory - return STATUS_INTERACTIVE - if(src.contents.Find(src_object.loc)) // A hidden uplink inside an item - return STATUS_INTERACTIVE - - if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates - return STATUS_CLOSE - - var/dist = get_dist(src_object, src) - if (dist <= 1) - return STATUS_INTERACTIVE // interactive (green visibility) - else if (dist <= 2) - return STATUS_UPDATE // update only (orange visibility) - else if (dist <= 4) - return STATUS_DISABLED // no updates, completely disabled (red visibility) - return STATUS_CLOSE - -/mob/living/can_interact_with_interface(var/src_object, var/be_close = 1) - . = shared_living_nano_interaction(src_object) - if(. == STATUS_INTERACTIVE && be_close) - . = shared_living_nano_distance(src_object) - if(STATUS_INTERACTIVE) - return STATUS_UPDATE - -/mob/living/carbon/human/can_interact_with_interface(var/src_object, var/be_close = 1) - . = shared_living_nano_interaction(src_object) - if(. == STATUS_INTERACTIVE && be_close) - . = shared_living_nano_distance(src_object) - if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction. - return STATUS_INTERACTIVE + return host.CanUseTopic(user) /** * Set the ui to auto update (every master_controller tick) @@ -489,6 +383,9 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/open() + var/new_status = get_status() + if(new_status == STATUS_CLOSE) + return var/window_size = "" if (width && height) diff --git a/nano/css/shared.css b/nano/css/shared.css index b81990b7a3..ee4725a4bb 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -128,7 +128,7 @@ img, a img { h1, h2, h3, h4, h5, h6 { margin: 0; padding: 12px 0 6px 0; - color: #517087; + color: #FFFFFF; clear: both; } @@ -491,6 +491,14 @@ div.notice { text-align: center; } +table.fixed { + table-layout:fixed; +} + +table.fixed td { + overflow: hidden; +} + /* Table stuffs for power monitor */ table.pmon { border: 2px solid RoyalBlue; diff --git a/nano/js/nano_base_helpers.js b/nano/js/nano_base_helpers.js index d5a019e2f8..20e6160fed 100644 --- a/nano/js/nano_base_helpers.js +++ b/nano/js/nano_base_helpers.js @@ -48,6 +48,10 @@ NanoBaseHelpers = function () round: function(number) { return Math.round(number); }, + // Returns the number fixed to 1 decimal + fixed: function(number) { + return Math.round(number * 10) / 10; + }, // Round a number down to integer floor: function(number) { return Math.floor(number); From d32cffaefea46ceb1fb53b68991ed027fa246517 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 19 Feb 2015 18:23:25 +0100 Subject: [PATCH 17/30] NanoUI air alarm interface. Remote support lost. --- .../components/unary/vent_scrubber.dm | 6 +- code/game/machinery/alarm.dm | 444 ++++++------------ nano/templates/air_alarm.tmpl | 213 +++++++++ 3 files changed, 370 insertions(+), 293 deletions(-) create mode 100644 nano/templates/air_alarm.tmpl diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 068f7efdb3..63a0549acc 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -173,7 +173,7 @@ use_power = !use_power if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing - panic = text2num(signal.data["panic_siphon"] != null) + panic = text2num(signal.data["panic_siphon"]) if(panic) use_power = 1 scrubbing = 0 @@ -189,8 +189,12 @@ if(signal.data["scrubbing"] != null) scrubbing = text2num(signal.data["scrubbing"]) + if(scrubbing) + panic = 0 if(signal.data["toggle_scrubbing"]) scrubbing = !scrubbing + if(scrubbing) + panic = 0 var/list/toggle = list() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 2ffdcc6e2f..2cdfd0ee3d 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -195,7 +195,6 @@ if(RCON_YES) remote_control = 1 - updateDialog() return /obj/machinery/alarm/proc/handle_heating_cooling(var/datum/gas_mixture/environment) @@ -468,7 +467,7 @@ frequency.post_signal(src, alert_signal) /obj/machinery/alarm/attack_ai(mob/user) - return interact(user) + ui_interact(user) /obj/machinery/alarm/attack_hand(mob/user) . = ..() @@ -477,315 +476,164 @@ return interact(user) /obj/machinery/alarm/interact(mob/user) - user.set_machine(src) + ui_interact(user) + wires.Interact(user) - if(buildstage!=2) - return +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, remote = 0) + var/data[0] + var/is_locked = locked && !user.isAI() - if((get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=air_alarm") - user << browse(null, "window=AAlarmwires") - return + data["locked"] = is_locked + data["rcon"] = rcon_setting + data["screen"] = screen + populate_status(data) - else if (istype(user, /mob/living/silicon) && aidisabled) - user << "AI control for this Air Alarm interface has been disabled." - user << browse(null, "window=air_alarm") - return + if(!is_locked) + populate_controls(data) - if(wiresexposed && (!istype(user, /mob/living/silicon/ai))) - wires.Interact(user) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 625, 625) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) - if(!shorted) - user << browse(return_text(user),"window=air_alarm") - onclose(user, "air_alarm") - - return - -/obj/machinery/alarm/proc/return_text(mob/user) - if(!(istype(user, /mob/living/silicon)) && locked) - return "\The [src][return_status()]


[rcon_text()]
(Swipe ID card to unlock interface)" - else - return "\The [src][return_status()]
[rcon_text()]
[return_controls()]" - -/obj/machinery/alarm/proc/return_status() +/obj/machinery/alarm/proc/populate_status(var/data) var/turf/location = get_turf(src) var/datum/gas_mixture/environment = location.return_air() var/total = environment.total_moles - var/output = "Air Status:
" - if(total == 0) - output += "Warning: Cannot obtain air sample for analysis." - return output + var/list/environment_data = new + data["has_environment"] = total + if(total) + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - output += {" - -"} + var/list/current_settings = TLV["pressure"] + var/pressure = environment.return_pressure() + var/pressure_danger = get_danger_level(pressure, current_settings) + environment_data[++environment_data.len] = list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_danger) + data["total_danger"] = pressure_danger - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume + current_settings = TLV["oxygen"] + var/oxygen_danger = get_danger_level(environment.gas["oxygen"]*partial_pressure, current_settings) + environment_data[++environment_data.len] = list("name" = "Oxygen", "value" = environment.gas["oxygen"] / total * 100, "unit" = "%", "danger_level" = oxygen_danger) + data["total_danger"] = max(oxygen_danger, data["total_danger"]) - var/list/current_settings = TLV["pressure"] - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = get_danger_level(environment_pressure, current_settings) + current_settings = TLV["carbon dioxide"] + var/carbon_dioxide_danger = get_danger_level(environment.gas["carbon dioxide"]*partial_pressure, current_settings) + environment_data[++environment_data.len] = list("name" = "Carbon dioxide", "value" = environment.gas["carbon dioxide"] / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger) + data["total_danger"] = max(carbon_dioxide_danger, data["total_danger"]) - current_settings = TLV["oxygen"] - var/oxygen_dangerlevel = get_danger_level(environment.gas["oxygen"]*partial_pressure, current_settings) - var/oxygen_percent = round(environment.gas["oxygen"] / total * 100, 2) + current_settings = TLV["phoron"] + var/phoron_danger = get_danger_level(environment.gas["phoron"]*partial_pressure, current_settings) + environment_data[++environment_data.len] = list("name" = "Toxins", "value" = environment.gas["phoron"] / total * 100, "unit" = "%", "danger_level" = phoron_danger) + data["total_danger"] = max(phoron_danger, data["total_danger"]) - current_settings = TLV["carbon dioxide"] - var/co2_dangerlevel = get_danger_level(environment.gas["carbon_dioxide"]*partial_pressure, current_settings) - var/co2_percent = round(environment.gas["carbon_dioxide"] / total * 100, 2) + current_settings = TLV["temperature"] + var/temperature_danger = get_danger_level(environment.temperature, current_settings) + environment_data[++environment_data.len] = list("name" = "Temperature", "value" = environment.temperature, "unit" = "K ([round(environment.temperature - T0C, 0.1)]C)", "danger_level" = temperature_danger) + data["total_danger"] = max(temperature_danger, data["total_danger"]) - current_settings = TLV["phoron"] - var/phoron_dangerlevel = get_danger_level(environment.gas["phoron"]*partial_pressure, current_settings) - var/phoron_percent = round(environment.gas["phoron"] / total * 100, 2) - - //current_settings = TLV["other"] - //var/other_moles = 0.0 - //for(var/datum/gas/G in environment.trace_gases) - // other_moles+=G.moles - //var/other_dangerlevel = get_danger_level(other_moles*partial_pressure, current_settings) - - current_settings = TLV["temperature"] - var/temperature_dangerlevel = get_danger_level(environment.temperature, current_settings) - - output += {" -Pressure: [environment_pressure]kPa
-Oxygen: [oxygen_percent]%
-Carbon dioxide: [co2_percent]%
-Toxins: [phoron_percent]%
-"} - //if (other_dangerlevel==2) - // output += "Notice: High Concentration of Unknown Particles Detected
" - //else if (other_dangerlevel==1) - // output += "Notice: Low Concentration of Unknown Particles Detected
" - - output += "Temperature: [environment.temperature]K ([round(environment.temperature - T0C, 0.1)]C)
" - - //'Local Status' should report the LOCAL status, damnit. - output += "Local Status: " - switch(max(pressure_dangerlevel,oxygen_dangerlevel,co2_dangerlevel,phoron_dangerlevel,other_dangerlevel,temperature_dangerlevel)) - if(2) - output += "DANGER: Internals Required
" - if(1) - output += "Caution
" - if(0) - output += "Optimal
" - - output += "Area Status: " - if(alarm_area.atmosalm) - output += "Atmos alert in area" - else if (alarm_area.fire) - output += "Fire alarm in area" - else - output += "No alerts" - - return output - -/obj/machinery/alarm/proc/rcon_text() - var/dat = "" - - //Hackish, I know. I didn't feel like bothering to rework all of this. - dat += "
Remote Control:
" - if(rcon_setting == RCON_NO) - dat += "Off" - else - dat += "Off" - dat += " | " - if(rcon_setting == RCON_AUTO) - dat += "Auto" - else - dat += "Auto" - dat += " | " - if(rcon_setting == RCON_YES) - dat += "On" - else - dat += "On
Thermostat:
[target_temperature - T0C]C
" - - return dat - -/obj/machinery/alarm/proc/return_controls(var/source = src) - var/output = ""//"[alarm_zone] Air [name]
" + data["environment"] = environment_data + data["atmos_alarm"] = alarm_area.atmosalm + data["fire_alarm"] = alarm_area.fire != null + data["target_temperature"] = "[target_temperature - T0C]C" +/obj/machinery/alarm/proc/populate_controls(var/list/data) switch(screen) - if (AALARM_SCREEN_MAIN) - if(alarm_area.atmosalm) - output += "
Reset - Area Atmospheric Alarm
" - else - output += "Activate - Area Atmospheric Alarm
" + if(AALARM_SCREEN_MAIN) + data["mode"] = mode + if(AALARM_SCREEN_VENT) + var/vents[0] + for(var/id_tag in alarm_area.air_vent_names) + var/long_name = alarm_area.air_vent_names[id_tag] + var/list/info = alarm_area.air_vent_info[id_tag] + if(!info) + continue + vents[++vents.len] = list( + "id_tag" = id_tag, + "long_name" = sanitize(long_name), + "power" = info["power"], + "checks" = info["checks"], + "direction" = info["direction"], + "external" = info["external"] + ) + data["vents"] = vents + if(AALARM_SCREEN_SCRUB) + var/scrubbers[0] + for(var/id_tag in alarm_area.air_scrub_names) + var/long_name = alarm_area.air_scrub_names[id_tag] + var/list/info = alarm_area.air_scrub_info[id_tag] + if(!info) + continue + scrubbers[++scrubbers.len] = list( + "id_tag" = id_tag, + "long_name" = sanitize(long_name), + "power" = info["power"], + "scrubbing" = info["scrubbing"], + "panic" = info["panic"], + "filters" = list() + ) + scrubbers[scrubbers.len]["filters"] += list(list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"])) + scrubbers[scrubbers.len]["filters"] += list(list("name" = "Nitrogen", "command" = "n2_scrub", "val" = info["filter_n2"])) + scrubbers[scrubbers.len]["filters"] += list(list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"])) + scrubbers[scrubbers.len]["filters"] += list(list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"])) + scrubbers[scrubbers.len]["filters"] += list(list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"])) + data["scrubbers"] = scrubbers + if(AALARM_SCREEN_MODE) + var/modes[0] + modes[++modes.len] = list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0) + modes[++modes.len] = list("name" = "Replace Air - Siphons out air while replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 0) + modes[++modes.len] = list("name" = "Panic - Siphons air out of the room", "mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1) + modes[++modes.len] = list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_CYCLE, "selected" = mode == AALARM_MODE_CYCLE, "danger" = 1) + modes[++modes.len] = list("name" = "Fill - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FILL, "selected" = mode == AALARM_MODE_FILL, "danger" = 0) + modes[++modes.len] = list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0) + data["modes"] = modes + data["mode"] = mode + if(AALARM_SCREEN_SENSORS) + var/list/selected + var/thresholds[0] - output += {" -Scrubbers Control
-Vents Control
-Set environmentals mode
-Sensor Settings
-
-"} - if (mode==AALARM_MODE_PANIC) - output += "PANIC SYPHON ACTIVE
Turn syphoning off" - else - output += "ACTIVATE PANIC SYPHON IN AREA" - - - if (AALARM_SCREEN_VENT) - var/sensor_data = "" - if(alarm_area.air_vent_names.len) - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/data = alarm_area.air_vent_info[id_tag] - if(!data) - continue; - var/state = "" - - sensor_data += {" -[long_name][state]
-Operating: -[data["power"]?"on":"off"] -
-Pressure checks: -external -internal -
-External pressure bound: -- -- -- -- -[data["external"]] -+ -+ -+ -+ - (reset) -
-"} - if (data["direction"] == "siphon") - sensor_data += {" -Direction: -siphoning -
-"} - sensor_data += {"
"} - else - sensor_data = "No vents connected.
" - output = {"Main menu
[sensor_data]"} - if (AALARM_SCREEN_SCRUB) - var/sensor_data = "" - if(alarm_area.air_scrub_names.len) - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/data = alarm_area.air_scrub_info[id_tag] - if(!data) - continue; - var/state = "" - - sensor_data += {" -[long_name][state]
-Operating: -[data["power"]?"on":"off"]
-Type: -[data["scrubbing"]?"scrubbing":"syphoning"]
-"} - - if(data["scrubbing"]) - sensor_data += {" -Filtering: -Oxygen -[data["filter_o2"]?"on":"off"]; -Nitrogen -[data["filter_n2"]?"on":"off"]; -Carbon Dioxide -[data["filter_co2"]?"on":"off"]; -Toxins -[data["filter_phoron"]?"on":"off"]; -Nitrous Oxide -[data["filter_n2o"]?"on":"off"] -
-"} - sensor_data += {" -Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""] -Dea":"red'>A")]ctivate
-
-"} - else - sensor_data = "No scrubbers connected.
" - output = {"Main menu
[sensor_data]"} - - if (AALARM_SCREEN_MODE) - output += "Main menu
Air machinery mode for the area:
    " - var/list/modes = list(AALARM_MODE_SCRUBBING = "Filtering - Scrubs out contaminants",\ - AALARM_MODE_REPLACEMENT = "Replace Air - Siphons out air while replacing",\ - AALARM_MODE_PANIC = "Panic - Siphons air out of the room",\ - AALARM_MODE_CYCLE = "Cycle - Siphons air before replacing",\ - AALARM_MODE_FILL = "Fill - Shuts off scrubbers and opens vents",\ - AALARM_MODE_OFF = "Off - Shuts off vents and scrubbers",) - for (var/m=1,m<=modes.len,m++) - if (mode==m) - output += "
  • [modes[m]] (selected)
  • " - else - output += "
  • [modes[m]]
  • " - output += "
" - - if (AALARM_SCREEN_SENSORS) - output += {" -Main menu
-Alarm thresholds:
-Partial pressure for gases - - - -"} - var/list/gases = list( + var/list/gas_names = list( "oxygen" = "O2", "carbon dioxide" = "CO2", "phoron" = "Toxin", - "other" = "Other",) - - var/list/selected - for (var/g in gases) - output += "" + "other" = "Other") + for (var/g in gas_names) + thresholds[++thresholds.len] = list("name" = gas_names[g], "settings" = list()) selected = TLV[g] for(var/i = 1, i <= 4, i++) - output += "" - output += "" + thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = i, "selected" = selected[i])) selected = TLV["pressure"] - output += " " + thresholds[++thresholds.len] = list("name" = "Pressure", "settings" = list()) for(var/i = 1, i <= 4, i++) - output += "" - output += "" + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = i, "selected" = selected[i])) selected = TLV["temperature"] - output += "" + thresholds[++thresholds.len] = list("name" = "Temperature", "settings" = list()) for(var/i = 1, i <= 4, i++) - output += "" - output += "
min2min1max1max2
[gases[g]][selected[i] >= 0 ? selected[i] :"OFF"]
Pressure[selected[i] >= 0 ? selected[i] :"OFF"]
Temperature[selected[i] >= 0 ? selected[i] :"OFF"]
" + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = i, "selected" = selected[i])) - return output + + data["thresholds"] = thresholds + +/obj/machinery/alarm/CanUseTopic(var/mob/user) + if(buildstage != 2) + return STATUS_CLOSE + + if(aidisabled && user.isAI()) + user << "AI control for \the [src] interface has been disabled." + return STATUS_CLOSE + + . = shorted ? STATUS_DISABLED : STATUS_INTERACTIVE + + return min(..(), .) /obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/remote = 0) - if(..(href, href_list, nowindow, !remote) || !( Adjacent(usr) || nowindow || istype(usr, /mob/living/silicon)) ) // dont forget calling super in machine Topics -walter0o - usr.machine = null - usr << browse(null, "window=air_alarm") - usr << browse(null, "window=AAlarmwires") - return - - add_fingerprint(usr) - usr.set_machine(src) + if(..(href, href_list, nowindow, !remote)) + return 1 // hrefs that can always be called -walter0o if(href_list["rcon"]) @@ -798,18 +646,19 @@ table tr:first-child th:first-child { border: none;} rcon_setting = RCON_AUTO if(RCON_YES) rcon_setting = RCON_YES - else - return + return 1 if(href_list["temperature"]) var/list/selected = TLV["temperature"] var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE) var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE) - var/input_temperature = input("What temperature would you like the system to mantain? (Capped between [min_temperature]C and [max_temperature]C)", "Thermostat Controls") as num|null - if(!input_temperature || input_temperature > max_temperature || input_temperature < min_temperature) - usr << "Temperature must be between [min_temperature]C and [max_temperature]C" - else - target_temperature = input_temperature + T0C + var/input_temperature = input("What temperature would you like the system to mantain? (Capped between [min_temperature] and [max_temperature]C)", "Thermostat Controls", target_temperature - T0C) as num|null + if(isnum(input_temperature)) + if(input_temperature > max_temperature || input_temperature < min_temperature) + usr << "Temperature must be between [min_temperature]C and [max_temperature]C" + else + target_temperature = input_temperature + T0C + return 1 // hrefs that need the AA unlocked -walter0o if(!locked || remote || istype(usr, /mob/living/silicon)) @@ -817,9 +666,18 @@ table tr:first-child th:first-child { border: none;} if(href_list["command"]) var/device_id = href_list["id_tag"] switch(href_list["command"]) + if("set_external_pressure") + var/input_pressure = input("What pressure you like the system to mantain?", "Pressure Controls") as num|null + if(isnum(input_pressure)) + send_signal(device_id, list(href_list["command"] = input_pressure)) + return 1 + + if("reset_external_pressure") + send_signal(device_id, list(href_list["command"] = ONE_ATMOSPHERE)) + return 1 + if( "power", "adjust_external_pressure", - "set_external_pressure", "checks", "o2_scrub", "n2_scrub", @@ -830,6 +688,7 @@ table tr:first-child th:first-child { border: none;} "scrubbing") send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) ) + return 1 if("set_threshold") var/env = href_list["env"] @@ -838,7 +697,7 @@ table tr:first-child th:first-child { border: none;} var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num if (isnull(newval)) - return + return 1 if (newval<0) selected[threshold] = -1.0 else if (env=="temperature" && newval>5000) @@ -880,9 +739,11 @@ table tr:first-child th:first-child { border: none;} selected[3] = selected[4] apply_mode() + return 1 if(href_list["screen"]) screen = text2num(href_list["screen"]) + return 1 if(href_list["atmos_unlock"]) switch(href_list["atmos_unlock"]) @@ -890,24 +751,24 @@ table tr:first-child th:first-child { border: none;} alarm_area.air_doors_close() if("1") alarm_area.air_doors_open() + return 1 if(href_list["atmos_alarm"]) if (alarm_area.atmosalert(2)) apply_danger_level(2) update_icon() + return 1 if(href_list["atmos_reset"]) if (alarm_area.atmosalert(0)) apply_danger_level(0) update_icon() + return 1 if(href_list["mode"]) mode = text2num(href_list["mode"]) apply_mode() - - if(!nowindow) - updateUsrDialog() - + return 1 /obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob) src.add_fingerprint(user) @@ -937,7 +798,6 @@ table tr:first-child th:first-child { border: none;} if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." - updateUsrDialog() else user << "\red Access denied." return diff --git a/nano/templates/air_alarm.tmpl b/nano/templates/air_alarm.tmpl new file mode 100644 index 0000000000..5b1ee24574 --- /dev/null +++ b/nano/templates/air_alarm.tmpl @@ -0,0 +1,213 @@ + +

Air Status

+{{if data.has_environment}} + {{for data.environment}} + {{:value.name}}: + {{if value.danger_level == 2}} + + {{else value.danger_level == 1}} + + {{else}} + + {{/if}} + {{:helper.fixed(value.value, 1)}} + {{:value.unit}}
+ {{/for}} + Local Status: {{if value.danger_level == 2}} + DANGER: Internals Required + {{else value.danger_level == 1}} + Caution + {{else}} + Optimal + {{/if}} +
+ Area Status: {{if data.atmos_alarm}}Atmosphere alert in area{{else data.fire_alarm}}Fire alarm in area{{else}}No alerts{{/if}} +{{else}} + Warning: Cannot obtain air sample for analysis. +{{/if}} +
+ + + + + + + + + + + + + +
+
+

Remote Control

+
+

Thermostat

+
+
+
+
+ {{:helper.link('Off', null, { 'rcon' : 1}, null, data.rcon == 1 ? 'selected' : null)}} + {{:helper.link('Auto', null, { 'rcon' : 2}, null, data.rcon == 2 ? 'selected' : null)}} + {{:helper.link('On', null, { 'rcon' : 3}, null, data.rcon == 3 ? 'selected' : null)}} +
+
+
+ {{:helper.link(data.target_temperature, null, { 'temperature' : 1})}} +
+
+{{if data.locked}} + (Swipe ID card to unlock interface) +{{else}} + {{if data.screen != 1}} +
{{:helper.link('Main Menu', null, { 'screen' : 1})}}
+ {{/if}} + {{if data.screen == 1}} +
+ {{if data.atmos_alarm}} + {{:helper.link('Reset - Area Atmospheric Alarm', null, { 'atmos_reset' : 1})}} + {{else}} + {{:helper.link('Activate - Area Atmospheric Alarm', null, { 'atmos_alarm' : 1})}} + {{/if}} +
+
+
+ {{:helper.link('Scrubbers Control', null, { 'screen' : 3})}} +
+
+ {{:helper.link('Vents Control', null, { 'screen' : 2})}} +
+
+ {{:helper.link('Set Environmental Mode', null, { 'screen' : 4})}} +
+
+ {{:helper.link('Sensor Settings', null, { 'screen' : 5})}} +
+
+ {{if data.mode==3}} + {{:helper.link('PANIC SIPHON ACTIVE - Turn siphoning off', null, { 'mode' : 1}, null, 'redButton')}} + {{else}} + {{:helper.link('ACTIVATE PANIC SIPHON IN AREA', null, { 'mode' : 3}, null, 'yellowButton')}} + {{/if}} + {{else data.screen == 2}} + {{for data.vents}} +
+ {{:value.long_name}}
+
+
+ Operating: +
+
+ {{:helper.link(value.power ? 'On' : 'Off', null, { 'id_tag' : value.id_tag, 'command' : 'power', 'val' : value.power ? 0 : 1}, null, value.power ? null : 'redButton')}} +
+
+
+
+ Operation Mode: +
+
+ {{:value.direction == "siphon" ? 'Siphoning' : 'Pressurizing'}} +
+
+
+
+ Pressure Checks: +
+
+ {{:helper.link('External', null, { 'id_tag' : value.id_tag, 'command' : 'checks', 'val' : value.checks^1}, null, value.checks&1 ? 'selected' : null)}} + {{:helper.link('Internal', null, { 'id_tag' : value.id_tag, 'command' : 'checks', 'val' : value.checks^2}, null, value.checks&2 ? 'selected' : null)}} +
+
+
+
+ External Pressure Bound: +
+
+ {{:helper.link(helper.fixed(value.external,2), null, { 'id_tag' : value.id_tag, 'command' : 'set_external_pressure'})}} + {{:helper.link('Reset', null, { 'id_tag' : value.id_tag, 'command' : 'reset_external_pressure'})}} +
+
+
+ {{empty}} + No vents connected. + {{/for}} + {{else data.screen == 3}} + {{for data.scrubbers}} +
+ {{:value.long_name}}
+
+
+ Operating: +
+
+ {{:helper.link(value.power ? 'On' : 'Off', null, { 'id_tag' : value.id_tag, 'command' : 'power', 'val' : value.power ? 0 : 1}, null, value.power ? null : 'redButton')}} +
+
+
+
+ Operation Mode: +
+
+ {{:helper.link(value.scrubbing ? 'Scrubbing' : 'Siphoning', null, { 'id_tag' : value.id_tag, 'command' : 'scrubbing', 'val' : value.scrubbing ? 0 : 1}, null, value.scrubbing ? null : 'redButton')}} +
+
+
+
+ Filters: +
+
+ {{for value.filters :filterValue:filterIndex}} + {{:helper.link(filterValue.name, null, { 'id_tag' : value.id_tag, 'command' : filterValue.command, 'val' : filterValue.val ? 0 : 1}, null, filterValue.val ? 'selected' : null)}} + {{/for}} +
+
+
+ {{empty}} + No scrubbers connected. + {{/for}} + {{else data.screen == 4}} +

Environmental Modes

+ {{for data.modes}} +
+ {{:helper.link(value.name, null, { 'mode' : value.mode }, null, value.selected ? (value.danger ? 'redButton' : 'selected') : null)}} +
+ {{/for}} + {{else data.screen == 5}} +

Alarm Threshold

+ Partial pressure for gases. + + + + + {{for data.thresholds}} + + + {{for value.settings :settingsValue:settingsIndex}} + + {{/for}} + + {{/for}} +
min2min1max1max2
{{:value.name}} + {{:helper.link(settingsValue.selected >= 0 ? helper.fixed(settingsValue.selected, 2) : "Off", null, { 'command' : 'set_threshold', 'env' : settingsValue.env, 'var' : settingsValue.val })}} +
+ {{/if}} +{{/if}} + \ No newline at end of file From 1c1e644f296bb02a3ce2ab43095ce1b99d974252 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Thu, 19 Feb 2015 21:04:27 +0300 Subject: [PATCH 18/30] Adds robot synths --- baystation12.dme | 1 + code/game/machinery/rechargestation.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 10 +- .../game/objects/items/stacks/matter_synth.dm | 50 ++++ code/game/objects/items/stacks/rods.dm | 13 +- .../game/objects/items/stacks/sheets/glass.dm | 44 ++- .../objects/items/stacks/sheets/mineral.dm | 7 +- .../items/stacks/sheets/sheet_types.dm | 33 ++- code/game/objects/items/stacks/stack.dm | 76 ++++-- .../objects/items/stacks/tiles/plasteel.dm | 12 +- .../objects/items/stacks/tiles/tile_types.dm | 23 +- code/game/turfs/simulated/floor.dm | 5 +- .../modules/mob/living/silicon/robot/robot.dm | 3 + .../mob/living/silicon/robot/robot_modules.dm | 250 ++++++++++++------ code/modules/power/cable.dm | 25 +- 15 files changed, 398 insertions(+), 156 deletions(-) create mode 100644 code/game/objects/items/stacks/matter_synth.dm diff --git a/baystation12.dme b/baystation12.dme index 7031dd9806..2d8fab2d71 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -572,6 +572,7 @@ #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" #include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\matter_synth.dm" #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\nanopaste.dm" #include "code\game\objects\items\stacks\rods.dm" diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index e4d29467e0..1285b47c3e 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -162,7 +162,7 @@ if(istype(occupant, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = occupant if(R.module) - R.module.respawn_consumable(R) + R.module.respawn_consumable(R, charge_rate) if(!R.cell) return if(!R.cell.fully_charged()) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 7e69ffe17a..713706475c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -55,7 +55,7 @@ var/uses = 0 var/emagged = 0 var/failmsg = "" - var/charge = 1 + var/charge = 0 /obj/item/device/lightreplacer/New() uses = max_uses / 2 @@ -122,11 +122,11 @@ /obj/item/device/lightreplacer/proc/AddUses(var/amount = 1) uses = min(max(uses + amount, 0), max_uses) -/obj/item/device/lightreplacer/proc/Charge(var/mob/user) - charge += 1 - if(charge > 7) +/obj/item/device/lightreplacer/proc/Charge(var/mob/user, var/amount = 1) + charge += amount + if(charge > 6) AddUses(1) - charge = 1 + charge = 0 /obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U) diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm new file mode 100644 index 0000000000..44ec536d45 --- /dev/null +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -0,0 +1,50 @@ +/datum/matter_synth + var/name = "Generic Synthesizer" + var/max_energy = 50000 + var/recharge_rate = 2000 + var/energy + +/datum/matter_synth/New(var/store = 0) + if(store) + max_energy = store + energy = max_energy + return + +/datum/matter_synth/proc/get_charge() + return energy + +/datum/matter_synth/proc/use_charge(var/amount) + if (energy >= amount) + energy -= amount + return 1 + return 0 + +/datum/matter_synth/proc/add_charge(var/amount) + energy = min(energy + amount, max_energy) + +/datum/matter_synth/proc/emp_act(var/severity) + use_charge(max_energy * 0.1 / severity) + +/datum/matter_synth/medicine + name = "Medicine Synthesizer" + +/datum/matter_synth/metal + name = "Metal Synthesizer" + +/datum/matter_synth/plasteel + name = "Plasteel Synthesizer" + max_energy = 10000 + +/datum/matter_synth/glass + name = "Glass Synthesizer" + +/datum/matter_synth/wood + name = "Wood Synthesizer" + +/datum/matter_synth/plastic + name = "Plastic Synthesizer" + +/datum/matter_synth/wire + name = "Wire Synthesizer" + max_energy = 50 + recharge_rate = 2 \ No newline at end of file diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 45350a71e9..81f1e1e98e 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -13,12 +13,21 @@ max_amount = 60 attack_verb = list("hit", "bludgeoned", "whacked") +/obj/item/stack/rods/cyborg + name = "metal rod synthesizer" + desc = "A device that makes metal rods." + gender = MALE + matter = null + uses_charge = 1 + charge_cost = 500 + stacktype = /obj/item/stack/rods + /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) ..() if (istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W - if(amount < 2) + if(get_amount() < 2) user << "\red You need at least two rods to do this." return @@ -54,7 +63,7 @@ return 1 else if(!in_use) - if(amount < 2) + if(get_amount() < 2) user << "\blue You need at least two rods to do this." return usr << "\blue Assembling grille..." diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 71fb87f9ad..43a9e9fec1 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -22,12 +22,13 @@ var/list/construction_options = list("One Direction", "Full Window") /obj/item/stack/sheet/glass/cyborg - name = "glass" - desc = "HOLY SHEET! That is a lot of glass." - singular_name = "glass sheet" - icon_state = "sheet-glass" + name = "glass synthesizer" + desc = "A device that makes glass." + gender = MALE + singular_name = "glass" matter = null - created_window = /obj/structure/window/basic + uses_charge = 1 + charge_cost = 1000 stacktype = /obj/item/stack/sheet/glass /obj/item/stack/sheet/glass/attack_self(mob/user as mob) @@ -69,7 +70,7 @@ if(!user.IsAdvancedToolUser()) return 0 var/title = "Sheet-[name]" - title += " ([src.amount] sheet\s left)" + title += " ([src.get_amount()] sheet\s left)" switch(input(title, "What would you like to construct?") as null|anything in construction_options) if("One Direction") if(!src) return 1 @@ -102,7 +103,7 @@ if("Full Window") if(!src) return 1 if(src.loc != user) return 1 - if(src.amount < 4) + if(src.get_amount() < 4) user << "\red You need more glass to do that." return 1 if(locate(/obj/structure/window) in user.loc) @@ -124,7 +125,7 @@ user << "\red There is already a windoor in that location." return 1 - if(src.amount < 5) + if(src.get_amount() < 5) user << "\red You need more glass to do that." return 1 @@ -151,10 +152,33 @@ construction_options = list("One Direction", "Full Window", "Windoor") /obj/item/stack/sheet/glass/reinforced/cyborg - name = "reinforced glass" - desc = "Glass which has been reinforced with metal rods." + name = "reinforced glass synthesizer" + desc = "A device that makes reinforced glass." + gender = MALE + matter = null + uses_charge = 1 + charge_cost = 1000 singular_name = "reinforced glass sheet" icon_state = "sheet-rglass" + var/datum/matter_synth/metal_synth + var/datum/matter_synth/glass_synth + var/metal_charge = 500 + var/glass_charge = 1000 + +/obj/item/stack/sheet/glass/reinforced/cyborg/get_amount() + return min(round(metal_synth.energy / metal_charge), round(glass_synth.energy / glass_charge)) + +/obj/item/stack/sheet/glass/reinforced/cyborg/use(var/amount) // Requires special checks, because it uses two storages + if(get_amount() < amount) + return 0 + metal_synth.use_charge(amount * metal_charge) + glass_synth.use_charge(amount * glass_charge) + return 1 + +/obj/item/stack/sheet/glass/reinforced/cyborg/add(var/amount) + metal_synth.add_charge(amount * metal_charge) + glass_synth.add_charge(amount * glass_charge) + return /* * Phoron Glass sheets diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index fccce08dc2..8c675163b1 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -137,9 +137,10 @@ obj/item/stack/sheet/mineral/iron/New() recipes = plastic_recipes /obj/item/stack/sheet/mineral/plastic/cyborg - name = "plastic sheets" - icon_state = "sheet-plastic" - perunit = 2000 + name = "plastic sheets synthesizer" + gender = MALE + uses_charge = 1 + charge_cost = 1000 stacktype = /obj/item/stack/sheet/mineral/plastic /obj/item/stack/sheet/mineral/gold diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6c440dcb3d..2d0f4adb05 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -86,12 +86,12 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ origin_tech = "materials=1" /obj/item/stack/sheet/metal/cyborg - name = "metal" - desc = "Sheets made out off metal. It has been dubbed Metal Sheets." - singular_name = "metal sheet" - icon_state = "sheet-metal" - throwforce = 14.0 - flags = CONDUCT + name = "metal synthesizer" + desc = "A device that makes metal sheets." + gender = MALE + matter = null + uses_charge = 1 + charge_cost = 1000 stacktype = /obj/item/stack/sheet/metal /obj/item/stack/sheet/metal/New(var/loc, var/amount=null) @@ -121,9 +121,19 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ flags = CONDUCT origin_tech = "materials=2" +/obj/item/stack/sheet/plasteel/cyborg + name = "plasteel synthesizer" + desc = "A device that makes plasteel sheets." + gender = MALE + singular_name = "plasteel sheet" + matter = null + uses_charge = 1 + charge_cost = 1000 + stacktype = /obj/item/stack/sheet/plasteel + /obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null) - recipes = plasteel_recipes - return ..() + recipes = plasteel_recipes + return ..() /* * Wood @@ -149,10 +159,13 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ origin_tech = "materials=1;biotech=1" /obj/item/stack/sheet/wood/cyborg - name = "wooden plank" - desc = "One can only guess that this is a bunch of wood." + name = "wood synthesizer" + desc = "A device that makes wooden planks." + gender = MALE singular_name = "wood plank" icon_state = "sheet-wood" + uses_charge = 1 + charge_cost = 1000 stacktype = /obj/item/stack/sheet/wood /obj/item/stack/sheet/wood/New(var/loc, var/amount=null) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 69b6e97533..9d79e4c56f 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -17,6 +17,9 @@ var/amount = 1 var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount var/stacktype //determines whether different stack types can merge + var/uses_charge = 0 + var/charge_cost = 1 + var/datum/matter_synth/synth = null /obj/item/stack/New(var/loc, var/amount=null) ..() @@ -27,13 +30,18 @@ return /obj/item/stack/Del() + if(uses_charge) + return if (src && usr && usr.machine == src) usr << browse(null, "window=stack") ..() /obj/item/stack/examine(mob/user) if(..(user, 1)) - user << "There are [src.amount] [src.singular_name]\s in the stack." + if(!uses_charge) + user << "There are [src.amount] [src.singular_name]\s in the stack." + else + user << "There is enough charge for [get_amount()]." /obj/item/stack/attack_self(mob/user as mob) list_recipes(user) @@ -41,14 +49,14 @@ /obj/item/stack/proc/list_recipes(mob/user as mob, recipes_sublist) if (!recipes) return - if (!src || amount<=0) + if (!src || get_amount() <= 0) user << browse(null, "window=stack") user.set_machine(src) //for correct work of onclose var/list/recipe_list = recipes if (recipes_sublist && recipe_list[recipes_sublist] && istype(recipe_list[recipes_sublist], /datum/stack_recipe_list)) var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist] recipe_list = srl.recipes - var/t1 = text("Constructions from []Amount Left: []
", src, src.amount) + var/t1 = text("Constructions from []Amount Left: []
", src, src.get_amount()) for(var/i=1;i<=recipe_list.len,i++) var/E = recipe_list[i] if (isnull(E)) @@ -60,14 +68,14 @@ if (istype(E, /datum/stack_recipe_list)) var/datum/stack_recipe_list/srl = E - if (src.amount >= srl.req_amount) + if (src.get_amount() >= srl.req_amount) t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)" else t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)
" if (istype(E, /datum/stack_recipe)) var/datum/stack_recipe/R = E - var/max_multiplier = round(src.amount / R.req_amount) + var/max_multiplier = round(src.get_amount() / R.req_amount) var/title as text var/can_build = 1 can_build = can_build && (max_multiplier>0) @@ -142,7 +150,7 @@ list_recipes(usr, text2num(href_list["sublist"])) if (href_list["make"]) - if (src.amount < 1) del(src) //Never should happen + if (src.get_amount() < 1) del(src) //Never should happen var/list/recipes_list = recipes if (href_list["sublist"]) @@ -165,28 +173,39 @@ //Return 1 if an immediate subsequent call to use() would succeed. //Ensures that code dealing with stacks uses the same logic /obj/item/stack/proc/can_use(var/used) - if (amount < used) + if (get_amount() < used) return 0 return 1 /obj/item/stack/proc/use(var/used) if (!can_use(used)) return 0 - amount -= used - if (amount <= 0) - spawn(0) //delete the empty stack once the current context yields - if (amount <= 0) //check again in case someone transferred stuff to us - if(usr) - usr.before_take_item(src) - del(src) - return 1 + if(!uses_charge) + amount -= used + if (amount <= 0) + spawn(0) //delete the empty stack once the current context yields + if (amount <= 0) //check again in case someone transferred stuff to us + if(usr) + usr.before_take_item(src) + del(src) + return 1 + else + if(!synth) + return 0 + return synth.use_charge(charge_cost * used) // Doesn't need to be deleted + return 0 /obj/item/stack/proc/add(var/extra) - if(amount + extra > max_amount) + if(!uses_charge) + if(amount + extra > get_max_amount()) + return 0 + else + amount += extra + return 1 + else if(!synth) return 0 else - amount += extra - return 1 + synth.add_charge(charge_cost * extra) /* The transfer and split procs work differently than use() and add(). @@ -196,16 +215,16 @@ //attempts to transfer amount to S, and returns the amount actually transferred /obj/item/stack/proc/transfer_to(obj/item/stack/S, var/tamount=null) - if (!amount) + if (!get_amount()) return 0 if (stacktype != S.stacktype) return 0 if (isnull(tamount)) - tamount = src.amount + tamount = src.get_amount() - var/transfer = max(min(tamount, src.amount, (S.max_amount - S.amount)), 0) + var/transfer = max(min(tamount, src.get_amount(), (S.get_max_amount() - S.get_amount())), 0) - var/orig_amount = src.amount + var/orig_amount = src.get_amount() if (transfer && src.use(transfer)) S.add(transfer) if (prob(transfer/orig_amount * 100)) @@ -220,6 +239,8 @@ /obj/item/stack/proc/split(var/tamount) if (!amount) return null + if(uses_charge) + return null var/transfer = max(min(tamount, src.amount, initial(max_amount)), 0) @@ -234,8 +255,19 @@ return null /obj/item/stack/proc/get_amount() + if(uses_charge) + if(!synth) + return 0 + return round(synth.get_charge() / charge_cost) return amount +/obj/item/stack/proc/get_max_amount() + if(uses_charge) + if(!synth) + return 0 + return round(synth.max_energy / charge_cost) + return max_amount + /obj/item/stack/proc/add_to_stacks(mob/usr as mob) for (var/obj/item/stack/item in usr.loc) if (item==src) diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm index 7816c45f53..f44789219f 100644 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ b/code/game/objects/items/stacks/tiles/plasteel.dm @@ -3,14 +3,12 @@ singular_name = "floor tile" desc = "Those could work as a pretty decent throwing weapon" icon_state = "tile" - w_class = 3.0 force = 6.0 matter = list("metal" = 937.5) throwforce = 15.0 throw_speed = 5 throw_range = 20 flags = CONDUCT - max_amount = 60 /obj/item/stack/tile/plasteel/New(var/loc, var/amount=null) ..() @@ -18,6 +16,16 @@ src.pixel_y = rand(1, 14) return +/obj/item/stack/tile/plasteel/cyborg + name = "floor tile synthesizer" + desc = "A device that makes floor tiles." + gender = MALE + matter = null + uses_charge = 1 + charge_cost = 250 + stacktype = /obj/item/stack/tile/plasteel + build_type = /obj/item/stack/tile/plasteel + /* /obj/item/stack/tile/plasteel/attack_self(mob/user as mob) if (usr.stat) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 7ad6abdd60..7f2588b1c7 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -1,9 +1,18 @@ /* Diffrent misc types of tiles * Contains: + * Prototype * Grass * Wood * Carpet */ + +/obj/item/stack/tile + name = "tile" + singular_name = "tile" + desc = "A non-descript floor tile" + w_class = 3 + max_amount = 60 + var/build_type = null /* * Grass @@ -13,13 +22,11 @@ singular_name = "grass floor tile" desc = "A patch of grass like they often use on golf courses." icon_state = "tile_grass" - w_class = 3.0 force = 1.0 throwforce = 1.0 throw_speed = 5 throw_range = 20 flags = CONDUCT - max_amount = 60 origin_tech = "biotech=1" /* @@ -30,13 +37,19 @@ singular_name = "wood floor tile" desc = "An easy to fit wooden floor tile." icon_state = "tile-wood" - w_class = 3.0 force = 1.0 throwforce = 1.0 throw_speed = 5 throw_range = 20 flags = CONDUCT - max_amount = 60 + +/obj/item/stack/tile/wood/cyborg + name = "wood floor tile synthesizer" + desc = "A device that makes wood floor tiles." + uses_charge = 1 + charge_cost = 250 + stacktype = /obj/item/stack/tile/wood + build_type = /obj/item/stack/tile/wood /* * Carpets @@ -46,10 +59,8 @@ singular_name = "carpet" desc = "A piece of carpet. It is the same size as a normal floor tile!" icon_state = "tile-carpet" - w_class = 3.0 force = 1.0 throwforce = 1.0 throw_speed = 5 throw_range = 20 flags = CONDUCT - max_amount = 60 diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 62facb8e4d..a821cde4ae 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -519,7 +519,10 @@ turf/simulated/floor/proc/update_icon() var/obj/item/stack/tile/T = C if (T.get_amount() < 1) return - floor_type = T.type + if(!T.build_type) + floor_type = T.type + else + floor_type = T.build_type intact = 1 if(istype(T,/obj/item/stack/tile/light)) var/obj/item/stack/tile/light/L = T diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 6b0509eea1..e30ba5f038 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -579,6 +579,9 @@ var/list/robot_verbs_default = list( show_cell_power() show_jetpack_pressure() stat(null, text("Lights: [lights_on ? "ON" : "OFF"]")) + if(module) + for(var/datum/matter_synth/ms in module.synths) + stat("[ms.name]: [ms.energy]/[ms.max_energy]") /mob/living/silicon/robot/restrained() return 0 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 3458a5bb47..b2bcaa7e3c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -7,9 +7,9 @@ flags = CONDUCT var/channels = list() var/list/modules = list() + var/list/datum/matter_synth/synths = list() var/obj/item/emag = null var/obj/item/borg/upgrade/jetpack = null - var/list/stacktypes /obj/item/weapon/robot_module/emp_act(severity) if(modules) @@ -17,40 +17,19 @@ O.emp_act(severity) if(emag) emag.emp_act(severity) + if(synths) + for(var/datum/synth/S in synths) + S.emp_act(severity) ..() return -/obj/item/weapon/robot_module/New() - ..() - // Build initial inventory. - if(stacktypes && stacktypes.len) - for(var/stack_type in stacktypes) - var/obj/item/stack/new_stack = new stack_type (src) - new_stack.amount = stacktypes[stack_type] - modules |= new_stack +/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) -/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R) + if(!synths || !synths.len) + return - if(!stacktypes || !stacktypes.len) return - - for(var/T in stacktypes) - var/obj/item/stack/S - for(var/obj/O in src.modules) - if(O.type == T) - S = O - break - - if(!S) - src.modules -= null - S = new T(src) - src.modules |= S - S.amount = 1 - - if(!istype(S)) - continue - - if(S && S.amount < stacktypes[T]) - S.amount++ + for(var/datum/matter_synth/T in synths) + T.add_charge(amount * amount) /obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules @@ -84,10 +63,6 @@ /obj/item/weapon/robot_module/surgeon name = "surgeon robot module" - stacktypes = list( - /obj/item/stack/medical/advanced/bruise_pack = 5, - /obj/item/stack/nanopaste = 5 - ) /obj/item/weapon/robot_module/surgeon/New() ..() @@ -104,26 +79,34 @@ src.modules += new /obj/item/weapon/circular_saw(src) src.modules += new /obj/item/weapon/surgicaldrill(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) - src.modules += new /obj/item/stack/nanopaste(src) src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) + synths += medicine + + var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) + N.uses_charge = 1 + N.charge_cost = 1000 + N.synth = medicine + B.uses_charge = 1 + B.charge_cost = 1000 + B.synth = medicine + src.modules += N + src.modules += B + return -/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2) + PS.reagents.add_reagent("pacid", 2 * amount) ..() /obj/item/weapon/robot_module/crisis name = "crisis robot module" - stacktypes = list( - /obj/item/stack/medical/ointment = 5, - /obj/item/stack/medical/bruise_pack = 5, - /obj/item/stack/medical/splint = 5 - ) /obj/item/weapon/robot_module/crisis/New() ..() @@ -132,9 +115,6 @@ src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/reagent_scanner/adv(src) src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/stack/medical/ointment(src) - src.modules += new /obj/item/stack/medical/bruise_pack(src) - src.modules += new /obj/item/stack/medical/splint(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) @@ -143,9 +123,29 @@ src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) + synths += medicine + + var/obj/item/stack/medical/ointment/O = new /obj/item/stack/medical/ointment(src) + var/obj/item/stack/medical/bruise_pack/B = new /obj/item/stack/medical/bruise_pack(src) + var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) + O.uses_charge = 1 + O.charge_cost = 1000 + O.synth = medicine + B.uses_charge = 1 + B.charge_cost = 1000 + B.synth = medicine + S.uses_charge = 1 + S.charge_cost = 1000 + S.synth = medicine + src.modules += O + src.modules += B + src.modules += S + return -/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules if(S.mode == 2) @@ -156,20 +156,13 @@ if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2) + PS.reagents.add_reagent("pacid", 2 * amount) ..() /obj/item/weapon/robot_module/construction name = "construction robot module" - stacktypes = list( - /obj/item/stack/sheet/metal = 50, - /obj/item/stack/sheet/plasteel = 10, - /obj/item/stack/sheet/glass/reinforced = 50, - /obj/item/stack/rods = 50 - ) - /obj/item/weapon/robot_module/construction/New() ..() src.modules += new /obj/item/device/flash(src) @@ -182,18 +175,33 @@ src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/device/pipe_painter(src) + var/datum/matter_synth/metal = new /datum/matter_synth/metal() + var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() + var/datum/matter_synth/glass = new /datum/matter_synth/glass() + synths += metal + synths += plasteel + synths += glass + + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) + M.synth = metal + src.modules += M + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synth = metal + src.modules += R + + var/obj/item/stack/sheet/plasteel/cyborg/S = new /obj/item/stack/sheet/plasteel/cyborg(src) + S.synth = metal + src.modules += S + + var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) + RG.metal_synth = metal + RG.glass_synth = glass + src.modules += R + /obj/item/weapon/robot_module/engineering name = "engineering robot module" - stacktypes = list( - /obj/item/stack/sheet/metal = 50, - /obj/item/stack/sheet/glass = 50, - /obj/item/stack/sheet/glass/reinforced = 50, - /obj/item/stack/cable_coil/robot = 50, - /obj/item/stack/rods = 15, - /obj/item/stack/tile/plasteel = 15 - ) - /obj/item/weapon/robot_module/engineering/New() ..() src.modules += new /obj/item/device/flash(src) @@ -212,6 +220,39 @@ src.modules += new /obj/item/weapon/matter_decompiler(src) src.modules += new /obj/item/device/pipe_painter(src) src.emag = new /obj/item/borg/stun(src) + + var/datum/matter_synth/metal = new /datum/matter_synth/metal(30000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(30000) + var/datum/matter_synth/wire = new /datum/matter_synth/wire() + synths += metal + synths += glass + synths += wire + + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) + M.synth = metal + src.modules += M + + var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src) + G.synth = glass + src.modules += G + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synth = metal + src.modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synth = wire + src.modules += C + + var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src) + S.synth = metal + src.modules += S + + var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) + RG.metal_synth = metal + RG.glass_synth = glass + src.modules += RG + return /obj/item/weapon/robot_module/security @@ -228,7 +269,7 @@ src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) return -/obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/device/flash/F = locate() in src.modules if(F.broken) F.broken = 0 @@ -238,7 +279,7 @@ F.times_used-- var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in src.modules if(T.power_supply.charge < T.power_supply.maxcharge) - T.power_supply.give(T.charge_cost) + T.power_supply.give(T.charge_cost * amount) T.update_icon() else T.charge_tick = 0 @@ -258,12 +299,12 @@ src.emag.name = "Lube spray" return -/obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R) + LR.Charge(R, amount) if(src.emag) var/obj/item/weapon/reagent_containers/spray/S = src.emag - S.reagents.add_reagent("lube", 2) + S.reagents.add_reagent("lube", 2 * amount) /obj/item/weapon/robot_module/butler name = "service robot module" @@ -327,12 +368,12 @@ R.add_language("Tradeband", 1) R.add_language("Gutter", 1) -/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules - E.reagents.add_reagent("enzyme", 2) + E.reagents.add_reagent("enzyme", 2 * amount) if(src.emag) var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag - B.reagents.add_reagent("beer2", 2) + B.reagents.add_reagent("beer2", 2 * amount) /obj/item/weapon/robot_module/miner name = "miner robot module" @@ -392,17 +433,6 @@ /obj/item/weapon/robot_module/drone name = "drone module" - stacktypes = list( - /obj/item/stack/sheet/wood = 1, - /obj/item/stack/sheet/mineral/plastic = 1, - /obj/item/stack/sheet/glass/reinforced = 5, - /obj/item/stack/tile/wood = 5, - /obj/item/stack/rods = 15, - /obj/item/stack/tile/plasteel = 15, - /obj/item/stack/sheet/metal = 20, - /obj/item/stack/sheet/glass = 20, - /obj/item/stack/cable_coil/robot = 30 - ) /obj/item/weapon/robot_module/drone/New() ..() @@ -419,15 +449,63 @@ src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) src.emag.name = "Plasma Cutter" + var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) + var/datum/matter_synth/wood = new /datum/matter_synth/wood(2000) + var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(1000) + var/datum/matter_synth/wire = new /datum/matter_synth/wire(30) + synths += metal + synths += glass + synths += wood + synths += plastic + synths += wire + + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) + M.synth = metal + src.modules += M + + var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src) + G.synth = glass + src.modules += G + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synth = metal + src.modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synth = wire + src.modules += C + + var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src) + S.synth = metal + src.modules += S + + var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) + RG.metal_synth = metal + RG.glass_synth = glass + src.modules += RG + + var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + WT.synth = wood + src.modules += WT + + var/obj/item/stack/sheet/wood/cyborg/W = new /obj/item/stack/sheet/wood/cyborg(src) + W.synth = wood + src.modules += W + + var/obj/item/stack/sheet/mineral/plastic/cyborg/P = new /obj/item/stack/sheet/mineral/plastic/cyborg(src) + P.synth = plastic + src.modules += P + /obj/item/weapon/robot_module/drone/add_languages(var/mob/living/silicon/robot/R) return //not much ROM to spare in that tiny microprocessor! -/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules - C.reagents.add_reagent("cleaner", 3) + C.reagents.add_reagent("cleaner", 3 * amount) var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R) + LR.Charge(R, amount) ..() return diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 12451f9a5e..4db363af0e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -482,6 +482,15 @@ obj/structure/cable/proc/cableColor(var/colorC) item_state = "coil" attack_verb = list("whipped", "lashed", "disciplined", "flogged") +/obj/item/stack/cable_coil/cyborg + name = "cable coil synthesizer" + desc = "A device that makes cable." + gender = MALE + matter = null + uses_charge = 1 + charge_cost = 1 + stacktype = /obj/item/stack/cable_coil + /obj/item/stack/cable_coil/suicide_act(mob/user) if(locate(/obj/structure/stool) in user.loc) user.visible_message("[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide.") @@ -576,7 +585,7 @@ obj/structure/cable/proc/cableColor(var/colorC) usr << "\blue You cannot do that." ..() -/obj/item/stack/cable_coil/robot/verb/set_colour() +/obj/item/stack/cable_coil/cyborg/verb/set_colour() set name = "Change Colour" set category = "Object" @@ -606,26 +615,26 @@ obj/structure/cable/proc/cableColor(var/colorC) // - Cable coil : merge cables /obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user) ..() - if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1) - src.amount-- + if( istype(W, /obj/item/weapon/wirecutters) && src.get_amount() > 1) + src.use(1) new/obj/item/stack/cable_coil(user.loc, 1,color) user << "You cut a piece off the cable coil." src.update_icon() return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W - if(C.amount >= MAXCOIL) + if(C.get_amount() >= get_max_amount()) user << "The coil is too long, you cannot add any more cable to it." return - if( (C.amount + src.amount <= MAXCOIL) ) + if( (C.get_amount() + src.get_amount() <= get_max_amount()) ) user << "You join the cable coils together." - C.give(src.amount) // give it cable - src.use(src.amount) // make sure this one cleans up right + C.give(src.get_amount()) // give it cable + src.use(src.get_amount()) // make sure this one cleans up right return else - var/amt = MAXCOIL - C.amount + var/amt = get_max_amount() - C.get_amount() user << "You transfer [amt] length\s of cable from one coil to the other." C.give(amt) src.use(amt) From 71f8a5c8e8890afa090bd84951fff93764984748 Mon Sep 17 00:00:00 2001 From: MrSnapwalk Date: Thu, 19 Feb 2015 20:37:36 -0600 Subject: [PATCH 19/30] Minor fixes, action figure refactor. --- code/game/machinery/computer/arcade.dm | 2 +- code/game/objects/items/toys.dm | 327 +++++++++++++------------ code/game/objects/random/random.dm | 45 ---- 3 files changed, 166 insertions(+), 208 deletions(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index c95bc1dff3..056c45e4f8 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -33,7 +33,7 @@ /obj/item/toy/prize/odysseus = 1, /obj/item/toy/prize/phazon = 1, /obj/item/toy/waterflower = 1, - /obj/random/action_figure = 1, + /obj/item/toy/figure = 1, /obj/random/plushie = 1, /obj/item/toy/cultsword = 1 ) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 23b12548b4..3c52121c4b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -607,196 +607,200 @@ desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death." icon_state = "assistant" icon = 'icons/obj/toy.dmi' + var/figuretype = "" -/obj/item/toy/figure/cmo - name = "Chief Medical Officer action figure" - desc = "A \"Space Life\" brand Chief Medical Officer action figure." - icon_state = "cmo" +/obj/item/toy/figure/New() + figuretype = pick("cmo","assistant","atmos","bartender","borg","gardener","captain","cargotech","ce","chaplain","chef","chemist","corgi","detective","dsquad","engineer","geneticist","hop","hos","qm","janitor","agent","librarian","md","mime","miner","ninja","wizard","rd","roboticist","scientist","syndie","secofficer","warden","psychologist","paramedic","ert") -/obj/item/toy/figure/assistant - name = "Assistant action figure" - desc = "A \"Space Life\" brand Assistant action figure." - icon_state = "assistant" + if(figuretype == "cmo") + name = "Chief Medical Officer action figure" + desc = "A \"Space Life\" brand Chief Medical Officer action figure." + icon_state = "cmo" -/obj/item/toy/figure/atmos - name = "Atmospheric Technician action figure" - desc = "A \"Space Life\" brand Atmospheric Technician action figure." - icon_state = "atmos" + if(figuretype == "assistant") + name = "Assistant action figure" + desc = "A \"Space Life\" brand Assistant action figure." + icon_state = "assistant" -/obj/item/toy/figure/bartender - name = "Bartender action figure" - desc = "A \"Space Life\" brand Bartender action figure." - icon_state = "bartender" + if(figuretype == "atmos") + name = "Atmospheric Technician action figure" + desc = "A \"Space Life\" brand Atmospheric Technician action figure." + icon_state = "atmos" -/obj/item/toy/figure/borg - name = "Cyborg action figure" - desc = "A \"Space Life\" brand Cyborg action figure." - icon_state = "borg" + if(figuretype == "bartender") + name = "Bartender action figure" + desc = "A \"Space Life\" brand Bartender action figure." + icon_state = "bartender" -/obj/item/toy/figure/gardener - name = "Gardener action figure" - desc = "A \"Space Life\" brand Gardener action figure." - icon_state = "botanist" + if(figuretype == "borg") + name = "Cyborg action figure" + desc = "A \"Space Life\" brand Cyborg action figure." + icon_state = "borg" -/obj/item/toy/figure/captain - name = "Captain action figure" - desc = "A \"Space Life\" brand Captain action figure." - icon_state = "captain" + if(figuretype == "gardener") + name = "Gardener action figure" + desc = "A \"Space Life\" brand Gardener action figure." + icon_state = "gardener" -/obj/item/toy/figure/cargotech - name = "Cargo Technician action figure" - desc = "A \"Space Life\" brand Cargo Technician action figure." - icon_state = "cargotech" + if(figuretype == "captain") + name = "Captain action figure" + desc = "A \"Space Life\" brand Captain action figure." + icon_state = "captain" -/obj/item/toy/figure/ce - name = "Chief Engineer action figure" - desc = "A \"Space Life\" brand Chief Engineer action figure." - icon_state = "ce" + if(figuretype == "cargotech") + name = "Cargo Technician action figure" + desc = "A \"Space Life\" brand Cargo Technician action figure." + icon_state = "cargotech" -/obj/item/toy/figure/chaplain - name = "Chaplain action figure" - desc = "A \"Space Life\" brand Chaplain action figure." - icon_state = "chaplain" + if(figuretype == "ce") + name = "Chief Engineer action figure" + desc = "A \"Space Life\" brand Chief Engineer action figure." + icon_state = "ce" -/obj/item/toy/figure/chef - name = "Chef action figure" - desc = "A \"Space Life\" brand Chef action figure." - icon_state = "chef" + if(figuretype == "chaplain") + name = "Chaplain action figure" + desc = "A \"Space Life\" brand Chaplain action figure." + icon_state = "chaplain" -/obj/item/toy/figure/chemist - name = "Chemist action figure" - desc = "A \"Space Life\" brand Chemist action figure." - icon_state = "chemist" + if(figuretype == "chef") + name = "Chef action figure" + desc = "A \"Space Life\" brand Chef action figure." + icon_state = "chef" -/obj/item/toy/figure/clown - name = "Clown action figure" - desc = "A \"Space Life\" brand Clown action figure." - icon_state = "clown" + if(figuretype == "chemist") + name = "Chemist action figure" + desc = "A \"Space Life\" brand Chemist action figure." + icon_state = "chemist" -/obj/item/toy/figure/corgi - name = "Corgi action figure" - desc = "A \"Space Life\" brand Corgi action figure." - icon_state = "ian" + if(figuretype == "clown") + name = "Clown action figure" + desc = "A \"Space Life\" brand Clown action figure." + icon_state = "clown" -/obj/item/toy/figure/detective - name = "Detective action figure" - desc = "A \"Space Life\" brand Detective action figure." - icon_state = "detective" + if(figuretype == "corgi") + name = "Corgi action figure" + desc = "A \"Space Life\" brand Corgi action figure." + icon_state = "ian" -/obj/item/toy/figure/dsquad - name = "Space Commando action figure" - desc = "A \"Space Life\" brand Space Commando action figure." - icon_state = "dsquad" + if(figuretype == "detective") + name = "Detective action figure" + desc = "A \"Space Life\" brand Detective action figure." + icon_state = "detective" -/obj/item/toy/figure/engineer - name = "Engineer action figure" - desc = "A \"Space Life\" brand Engineer action figure." - icon_state = "engineer" + if(figuretype == "dsquad") + name = "Space Commando action figure" + desc = "A \"Space Life\" brand Space Commando action figure." + icon_state = "dsquad" -/obj/item/toy/figure/geneticist - name = "Geneticist action figure" - desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued." - icon_state = "geneticist" + if(figuretype == "engineer") + name = "Engineer action figure" + desc = "A \"Space Life\" brand Engineer action figure." + icon_state = "engineer" -/obj/item/toy/figure/hop - name = "Head of Personel action figure" - desc = "A \"Space Life\" brand Head of Personel action figure." - icon_state = "hop" + if(figuretype == "geneticist") + name = "Geneticist action figure" + desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued." + icon_state = "geneticist" -/obj/item/toy/figure/hos - name = "Head of Security action figure" - desc = "A \"Space Life\" brand Head of Security action figure." - icon_state = "hos" + if(figuretype == "hop") + name = "Head of Personel action figure" + desc = "A \"Space Life\" brand Head of Personel action figure." + icon_state = "hop" -/obj/item/toy/figure/qm - name = "Quartermaster action figure" - desc = "A \"Space Life\" brand Quartermaster action figure." - icon_state = "qm" + if(figuretype == "hos") + name = "Head of Security action figure" + desc = "A \"Space Life\" brand Head of Security action figure." + icon_state = "hos" -/obj/item/toy/figure/janitor - name = "Janitor action figure" - desc = "A \"Space Life\" brand Janitor action figure." - icon_state = "janitor" + if(figuretype == "qm") + name = "Quartermaster action figure" + desc = "A \"Space Life\" brand Quartermaster action figure." + icon_state = "qm" -/obj/item/toy/figure/agent - name = "Internal Affairs Agent action figure" - desc = "A \"Space Life\" brand Internal Affairs Agent action figure." - icon_state = "agent" + if(figuretype == "janitor") + name = "Janitor action figure" + desc = "A \"Space Life\" brand Janitor action figure." + icon_state = "janitor" -/obj/item/toy/figure/librarian - name = "Librarian action figure" - desc = "A \"Space Life\" brand Librarian action figure." - icon_state = "librarian" + if(figuretype == "agent") + name = "Internal Affairs Agent action figure" + desc = "A \"Space Life\" brand Internal Affairs Agent action figure." + icon_state = "agent" -/obj/item/toy/figure/md - name = "Medical Doctor action figure" - desc = "A \"Space Life\" brand Medical Doctor action figure." - icon_state = "md" + if(figuretype == "librarian") + name = "Librarian action figure" + desc = "A \"Space Life\" brand Librarian action figure." + icon_state = "librarian" -/obj/item/toy/figure/mime - name = "Mime action figure" - desc = "A \"Space Life\" brand Mime action figure." - icon_state = "mime" + if(figuretype == "md") + name = "Medical Doctor action figure" + desc = "A \"Space Life\" brand Medical Doctor action figure." + icon_state = "md" -/obj/item/toy/figure/miner - name = "Shaft Miner action figure" - desc = "A \"Space Life\" brand Shaft Miner action figure." - icon_state = "miner" + if(figuretype == "mime") + name = "Mime action figure" + desc = "A \"Space Life\" brand Mime action figure." + icon_state = "mime" -/obj/item/toy/figure/ninja - name = "Space Ninja action figure" - desc = "A \"Space Life\" brand Space Ninja action figure." - icon_state = "ninja" + if(figuretype == "miner") + name = "Shaft Miner action figure" + desc = "A \"Space Life\" brand Shaft Miner action figure." + icon_state = "miner" -/obj/item/toy/figure/wizard - name = "Wizard action figure" - desc = "A \"Space Life\" brand Wizard action figure." - icon_state = "wizard" + if(figuretype == "ninja") + name = "Space Ninja action figure" + desc = "A \"Space Life\" brand Space Ninja action figure." + icon_state = "ninja" -/obj/item/toy/figure/rd - name = "Research Director action figure" - desc = "A \"Space Life\" brand Research Director action figure." - icon_state = "rd" + if(figuretype == "wizard") + name = "Wizard action figure" + desc = "A \"Space Life\" brand Wizard action figure." + icon_state = "wizard" -/obj/item/toy/figure/roboticist - name = "Roboticist action figure" - desc = "A \"Space Life\" brand Roboticist action figure." - icon_state = "roboticist" + if(figuretype == "rd") + name = "Research Director action figure" + desc = "A \"Space Life\" brand Research Director action figure." + icon_state = "rd" -/obj/item/toy/figure/scientist - name = "Scientist action figure" - desc = "A \"Space Life\" brand Scientist action figure." - icon_state = "scientist" + if(figuretype == "roboticist") + name = "Roboticist action figure" + desc = "A \"Space Life\" brand Roboticist action figure." + icon_state = "roboticist" -/obj/item/toy/figure/syndie - name = "Doom Operative action figure" - desc = "A \"Space Life\" brand Doom Operative action figure." - icon_state = "syndie" + if(figuretype == "scientist") + name = "Scientist action figure" + desc = "A \"Space Life\" brand Scientist action figure." + icon_state = "scientist" -/obj/item/toy/figure/secofficer - name = "Security Officer action figure" - desc = "A \"Space Life\" brand Security Officer action figure." - icon_state = "secofficer" + if(figuretype == "syndie") + name = "Doom Operative action figure" + desc = "A \"Space Life\" brand Doom Operative action figure." + icon_state = "syndie" -/obj/item/toy/figure/warden - name = "Warden action figure" - desc = "A \"Space Life\" brand Warden action figure." - icon_state = "warden" + if(figuretype == "secofficer") + name = "Security Officer action figure" + desc = "A \"Space Life\" brand Security Officer action figure." + icon_state = "secofficer" -/obj/item/toy/figure/psychologist - name = "Psychologist action figure" - desc = "A \"Space Life\" brand Psychologist action figure." - icon_state = "psychologist" + if(figuretype == "warden") + name = "Warden action figure" + desc = "A \"Space Life\" brand Warden action figure." + icon_state = "warden" -/obj/item/toy/figure/paramedic - name = "Paramedic action figure" - desc = "A \"Space Life\" brand Paramedic action figure." - icon_state = "paramedic" + if(figuretype == "psychologist") + name = "Psychologist action figure" + desc = "A \"Space Life\" brand Psychologist action figure." + icon_state = "psychologist" -/obj/item/toy/figure/ert - name = "Emergency Response Team Commander action figure" - desc = "A \"Space Life\" brand Emergency Response Team Commander action figure." - icon_state = "ert" + if(figuretype == "paramedic") + name = "Paramedic action figure" + desc = "A \"Space Life\" brand Paramedic action figure." + icon_state = "paramedic" + + if(figuretype == "ert") + name = "Emergency Response Team Commander action figure" + desc = "A \"Space Life\" brand Emergency Response Team Commander action figure." + icon_state = "ert" /obj/item/toy/katana name = "replica katana" @@ -865,7 +869,7 @@ //Large plushies. /obj/structure/plushie - name = "generic large plushie" + name = "generic plush" desc = "A very generic plushie. It seems to not want to exist." icon = 'icons/obj/toy.dmi' icon_state = "ianplushie" @@ -891,19 +895,19 @@ phrase = "Arf!" /obj/structure/plushie/drone - name = "plushie drone" + name = "plush drone" desc = "A plushie of a happy drone! It appears to be smiling, and has a small tag which reads \"N.D.V. Icarus Gift Shop\"." icon_state = "droneplushie" phrase = "Beep boop!" /obj/structure/plushie/carp - name = "plushie carp" + name = "plush carp" desc = "A plushie of an elated carp! Straight from the wilds of the Nyx frontier, now right here in your hands." icon_state = "carpplushie" phrase = "Glorf!" /obj/structure/plushie/beepsky - name = "plushie Officer Sweepsky" + name = "plush Officer Sweepsky" desc = "A plushie of a popular industrious cleaning robot! If it could feel emotions, it would love you." icon_state = "beepskyplushie" phrase = "Ping!" @@ -914,7 +918,6 @@ desc = "A very generic small plushie. It seems to not want to exist." icon = 'icons/obj/toy.dmi' icon_state = "nymphplushie" - var/phrase = "Please, end my existance! I beg you!" /obj/item/toy/plushie/attack_self(mob/user as mob) if(user.a_intent == "help") @@ -927,22 +930,22 @@ user.visible_message("[user] pokes the [src].","You poke the [src].") /obj/item/toy/plushie/nymph - name = "diona nymph plushie" - desc = "A plushie of an adorable diona nymph! While it's level of self-awareness is still being debated, it's level of cuteness is not." + name = "diona nymph plush" + desc = "A plushie of an adorable diona nymph! While its level of self-awareness is still being debated, its level of cuteness is not." icon_state = "nymphplushie" /obj/item/toy/plushie/mouse - name = "mouse plushie" + name = "mouse plush" desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." icon_state = "mouseplushie" /obj/item/toy/plushie/kitten - name = "kitten plushie" + name = "kitten plush" desc = "A plushie of a cute kitten! Watch as it purrs it's way right into your heart." icon_state = "kittenplushie" /obj/item/toy/plushie/lizard - name = "lizard plushie" + name = "lizard plush" desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi." icon_state = "lizardplushie" diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index e4c0ef02dc..57e9351595 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -225,51 +225,6 @@ prob(2);/obj/item/clothing/suit/storage/vest/heavy/hos,\ prob(2);/obj/item/clothing/suit/storage/vest/heavy/pcrc) -/obj/random/action_figure - name = "random action figure" - desc = "This is a random action figure." - icon = 'icons/obj/toy.dmi' - icon_state = "assistant" - item_to_spawn() - return pick(/obj/item/toy/figure/cmo,\ - /obj/item/toy/figure/assistant,\ - /obj/item/toy/figure/atmos,\ - /obj/item/toy/figure/bartender,\ - /obj/item/toy/figure/borg,\ - /obj/item/toy/figure/gardener,\ - /obj/item/toy/figure/captain,\ - /obj/item/toy/figure/cargotech,\ - /obj/item/toy/figure/ce,\ - /obj/item/toy/figure/chaplain,\ - /obj/item/toy/figure/chef,\ - /obj/item/toy/figure/chemist,\ - /obj/item/toy/figure/clown,\ - /obj/item/toy/figure/corgi,\ - /obj/item/toy/figure/detective,\ - /obj/item/toy/figure/dsquad,\ - /obj/item/toy/figure/engineer,\ - /obj/item/toy/figure/geneticist,\ - /obj/item/toy/figure/hop,\ - /obj/item/toy/figure/hos,\ - /obj/item/toy/figure/qm,\ - /obj/item/toy/figure/janitor,\ - /obj/item/toy/figure/agent,\ - /obj/item/toy/figure/librarian,\ - /obj/item/toy/figure/md,\ - /obj/item/toy/figure/mime,\ - /obj/item/toy/figure/miner,\ - /obj/item/toy/figure/ninja,\ - /obj/item/toy/figure/wizard,\ - /obj/item/toy/figure/rd,\ - /obj/item/toy/figure/roboticist,\ - /obj/item/toy/figure/scientist,\ - /obj/item/toy/figure/syndie,\ - /obj/item/toy/figure/secofficer,\ - /obj/item/toy/figure/warden,\ - /obj/item/toy/figure/psychologist,\ - /obj/item/toy/figure/paramedic,\ - /obj/item/toy/figure/ert) - /obj/random/plushie name = "random plushie" desc = "This is a random plushie." From 32b543c4e439cb88499f5be2e3c239bcef795151 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 19 Feb 2015 22:51:10 -0500 Subject: [PATCH 20/30] Firedoors and blast doors no longer block zones Firedoors no longer block zones, fixes #8169 Blast doors no longer block zones as well, which fixes some of the awkward zone geometry seen in #4798 --- code/game/machinery/doors/blast_door.dm | 7 +++++++ code/game/machinery/doors/door.dm | 3 ++- code/game/machinery/doors/firedoor.dm | 6 +++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index e456e136a8..07192d5dc6 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -24,6 +24,10 @@ dir = 1 explosion_resistance = 25 emitter_resistance = 50 // Lots of emitter blasts, it's *blast* door after all. + + //Most blast doors are infrequently toggled and sometimes used with regular doors anyways, + //turning this off prevents awkward zone geometry in places like medbay lobby, for example. + block_air_zones = 0 // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) @@ -157,6 +161,9 @@ stat &= ~BROKEN +/obj/machinery/door/blast/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 1 + return ..() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 8e354a73b3..c6f4b5803d 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -32,6 +32,7 @@ var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon var/obj/item/stack/sheet/metal/repairing + var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened. //Multi-tile doors dir = EAST @@ -115,7 +116,7 @@ /obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) return 0 + if(air_group) return !block_air_zones if(istype(mover) && mover.checkpass(PASSGLASS)) return !opacity return !density diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 55b392feff..8799273b93 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -22,6 +22,10 @@ open_layer = DOOR_OPEN_LAYER - 0.01 // Just below doors when open closed_layer = DOOR_CLOSED_LAYER + 0.01 // Just above doors when closed + //These are frequenly used with windows, so make sure zones can pass. + //Generally if a firedoor is at a place where there should be a zone boundery then there will be a regular door underneath it. + block_air_zones = 0 + var/blocked = 0 var/lockdown = 0 // When the door has detected a problem, it locks. var/pdiff_alert = 0 @@ -381,9 +385,9 @@ overlays += "welded_open" return +//These are playing merry hell on ZAS. Sorry fellas :( /obj/machinery/door/firedoor/border_only -//These are playing merry hell on ZAS. Sorry fellas :( /* icon = 'icons/obj/doors/edge_Doorfire.dmi' glass = 1 //There is a glass window so you can see through the door From a0b73140e943a9413993449538c50937171394a2 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Fri, 20 Feb 2015 13:32:10 +0300 Subject: [PATCH 21/30] Fixes for synths and decompiler --- code/game/machinery/rechargestation.dm | 2 +- .../game/objects/items/stacks/matter_synth.dm | 2 +- code/game/objects/items/stacks/rods.dm | 4 +- .../game/objects/items/stacks/sheets/glass.dm | 30 +--- .../objects/items/stacks/sheets/mineral.dm | 4 +- .../items/stacks/sheets/sheet_types.dm | 12 +- code/game/objects/items/stacks/stack.dm | 37 +++-- .../objects/items/stacks/tiles/plasteel.dm | 4 +- .../objects/items/stacks/tiles/tile_types.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 17 --- .../living/silicon/robot/drone/drone_items.dm | 131 +++++++----------- .../mob/living/silicon/robot/robot_modules.dm | 85 ++++++------ code/modules/power/cable.dm | 4 +- 13 files changed, 145 insertions(+), 189 deletions(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 1285b47c3e..22612983a8 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -162,7 +162,7 @@ if(istype(occupant, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = occupant if(R.module) - R.module.respawn_consumable(R, charge_rate) + R.module.respawn_consumable(R, charge_rate / 250) if(!R.cell) return if(!R.cell.fully_charged()) diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index 44ec536d45..0842f70d66 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -1,6 +1,6 @@ /datum/matter_synth var/name = "Generic Synthesizer" - var/max_energy = 50000 + var/max_energy = 60000 var/recharge_rate = 2000 var/energy diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 81f1e1e98e..143539968e 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -16,10 +16,10 @@ /obj/item/stack/rods/cyborg name = "metal rod synthesizer" desc = "A device that makes metal rods." - gender = MALE + gender = NEUTER matter = null uses_charge = 1 - charge_cost = 500 + charge_costs = list(500) stacktype = /obj/item/stack/rods /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 43a9e9fec1..422640ee1f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -24,11 +24,11 @@ /obj/item/stack/sheet/glass/cyborg name = "glass synthesizer" desc = "A device that makes glass." - gender = MALE + gender = NEUTER singular_name = "glass" matter = null uses_charge = 1 - charge_cost = 1000 + charge_costs = list(1000) stacktype = /obj/item/stack/sheet/glass /obj/item/stack/sheet/glass/attack_self(mob/user as mob) @@ -154,31 +154,13 @@ /obj/item/stack/sheet/glass/reinforced/cyborg name = "reinforced glass synthesizer" desc = "A device that makes reinforced glass." - gender = MALE + gender = NEUTER matter = null - uses_charge = 1 - charge_cost = 1000 + uses_charge = 2 + charge_costs = list(1000) singular_name = "reinforced glass sheet" icon_state = "sheet-rglass" - var/datum/matter_synth/metal_synth - var/datum/matter_synth/glass_synth - var/metal_charge = 500 - var/glass_charge = 1000 - -/obj/item/stack/sheet/glass/reinforced/cyborg/get_amount() - return min(round(metal_synth.energy / metal_charge), round(glass_synth.energy / glass_charge)) - -/obj/item/stack/sheet/glass/reinforced/cyborg/use(var/amount) // Requires special checks, because it uses two storages - if(get_amount() < amount) - return 0 - metal_synth.use_charge(amount * metal_charge) - glass_synth.use_charge(amount * glass_charge) - return 1 - -/obj/item/stack/sheet/glass/reinforced/cyborg/add(var/amount) - metal_synth.add_charge(amount * metal_charge) - glass_synth.add_charge(amount * glass_charge) - return + charge_costs = list(500, 1000) /* * Phoron Glass sheets diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 8c675163b1..2ec920b390 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -138,9 +138,9 @@ obj/item/stack/sheet/mineral/iron/New() /obj/item/stack/sheet/mineral/plastic/cyborg name = "plastic sheets synthesizer" - gender = MALE + gender = NEUTER uses_charge = 1 - charge_cost = 1000 + charge_costs = list(1000) stacktype = /obj/item/stack/sheet/mineral/plastic /obj/item/stack/sheet/mineral/gold diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 2d0f4adb05..004d96250f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -88,10 +88,10 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ /obj/item/stack/sheet/metal/cyborg name = "metal synthesizer" desc = "A device that makes metal sheets." - gender = MALE + gender = NEUTER matter = null uses_charge = 1 - charge_cost = 1000 + charge_costs = list(1000) stacktype = /obj/item/stack/sheet/metal /obj/item/stack/sheet/metal/New(var/loc, var/amount=null) @@ -124,11 +124,11 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ /obj/item/stack/sheet/plasteel/cyborg name = "plasteel synthesizer" desc = "A device that makes plasteel sheets." - gender = MALE + gender = NEUTER singular_name = "plasteel sheet" matter = null uses_charge = 1 - charge_cost = 1000 + charge_costs = list(1000) stacktype = /obj/item/stack/sheet/plasteel /obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null) @@ -161,11 +161,11 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ /obj/item/stack/sheet/wood/cyborg name = "wood synthesizer" desc = "A device that makes wooden planks." - gender = MALE + gender = NEUTER singular_name = "wood plank" icon_state = "sheet-wood" uses_charge = 1 - charge_cost = 1000 + charge_costs = list(1000) stacktype = /obj/item/stack/sheet/wood /obj/item/stack/sheet/wood/New(var/loc, var/amount=null) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 9d79e4c56f..ab1f767a42 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -18,8 +18,8 @@ var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount var/stacktype //determines whether different stack types can merge var/uses_charge = 0 - var/charge_cost = 1 - var/datum/matter_synth/synth = null + var/list/charge_costs = null + var/list/datum/matter_synth/synths = null /obj/item/stack/New(var/loc, var/amount=null) ..() @@ -190,9 +190,12 @@ del(src) return 1 else - if(!synth) + if(get_amount() < used) return 0 - return synth.use_charge(charge_cost * used) // Doesn't need to be deleted + for(var/i = 1 to uses_charge) + var/datum/matter_synth/S = synths[i] + S.use_charge(charge_costs[i] * used) // Doesn't need to be deleted + return 1 return 0 /obj/item/stack/proc/add(var/extra) @@ -202,10 +205,12 @@ else amount += extra return 1 - else if(!synth) + else if(!synths || synths.len < uses_charge) return 0 else - synth.add_charge(charge_cost * extra) + for(var/i = 1 to uses_charge) + var/datum/matter_synth/S = synths[i] + S.add_charge(charge_costs[i] * extra) /* The transfer and split procs work differently than use() and add(). @@ -256,16 +261,28 @@ /obj/item/stack/proc/get_amount() if(uses_charge) - if(!synth) + if(!synths || synths.len < uses_charge) return 0 - return round(synth.get_charge() / charge_cost) + var/datum/matter_synth/S = synths[1] + . = round(S.get_charge() / charge_costs[1]) + if(uses_charge > 1) + for(var/i = 2 to uses_charge) + S = synths[i] + . = min(., round(S.get_charge() / charge_costs[i])) + return return amount /obj/item/stack/proc/get_max_amount() if(uses_charge) - if(!synth) + if(!synths || synths.len < uses_charge) return 0 - return round(synth.max_energy / charge_cost) + var/datum/matter_synth/S = synths[1] + . = round(S.max_energy / charge_costs[1]) + if(uses_charge > 1) + for(var/i = 2 to uses_charge) + S = synths[i] + . = min(., round(S.max_energy / charge_costs[i])) + return return max_amount /obj/item/stack/proc/add_to_stacks(mob/usr as mob) diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm index f44789219f..3215d0efaf 100644 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ b/code/game/objects/items/stacks/tiles/plasteel.dm @@ -19,10 +19,10 @@ /obj/item/stack/tile/plasteel/cyborg name = "floor tile synthesizer" desc = "A device that makes floor tiles." - gender = MALE + gender = NEUTER matter = null uses_charge = 1 - charge_cost = 250 + charge_costs = list(250) stacktype = /obj/item/stack/tile/plasteel build_type = /obj/item/stack/tile/plasteel diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 7f2588b1c7..dcac154442 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -47,7 +47,7 @@ name = "wood floor tile synthesizer" desc = "A device that makes wood floor tiles." uses_charge = 1 - charge_cost = 250 + charge_costs = list(250) stacktype = /obj/item/stack/tile/wood build_type = /obj/item/stack/tile/wood diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index bd89b867ee..44df327240 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -16,14 +16,6 @@ integrated_light_power = 2 local_transmit = 1 - // We need to keep track of a few module items so we don't need to do list operations - // every time we need them. These get set in New() after the module is chosen. - var/obj/item/stack/sheet/metal/cyborg/stack_metal = null - var/obj/item/stack/sheet/wood/cyborg/stack_wood = null - var/obj/item/stack/sheet/glass/cyborg/stack_glass = null - var/obj/item/stack/sheet/mineral/plastic/cyborg/stack_plastic = null - var/obj/item/weapon/matter_decompiler/decompiler = null - //Used for self-mailing. var/mail_destination = "" @@ -56,15 +48,6 @@ verbs -= /mob/living/silicon/robot/verb/Namepick module = new /obj/item/weapon/robot_module/drone(src) - //Grab stacks. - stack_metal = locate(/obj/item/stack/sheet/metal/cyborg) in src.module - stack_wood = locate(/obj/item/stack/sheet/wood/cyborg) in src.module - stack_glass = locate(/obj/item/stack/sheet/glass/cyborg) in src.module - stack_plastic = locate(/obj/item/stack/sheet/mineral/plastic/cyborg) in src.module - - //Grab decompiler. - decompiler = locate(/obj/item/weapon/matter_decompiler) in src.module - //Some tidying-up. flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" updateicon() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7750ab9b9a..a42c54a346 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -151,12 +151,10 @@ icon_state = "decompiler" //Metal, glass, wood, plastic. - var/list/stored_comms = list( - "metal" = 0, - "glass" = 0, - "wood" = 0, - "plastic" = 0 - ) + var/datum/matter_synth/metal = null + var/datum/matter_synth/glass = null + var/datum/matter_synth/wood = null + var/datum/matter_synth/plastic = null /obj/item/weapon/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) return @@ -178,10 +176,10 @@ src.loc.visible_message("\red [src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","\red It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) del(M) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ + if(wood) + wood.add_charge(2000) + if(plastic) + plastic.add_charge(2000) return else if(istype(M,/mob/living/silicon/robot/drone) && !M.client) @@ -203,61 +201,66 @@ del(M) new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - stored_comms["metal"] += 15 - stored_comms["glass"] += 15 - stored_comms["wood"] += 5 - stored_comms["plastic"] += 5 + if(metal) + metal.add_charge(15000) + if(glass) + glass.add_charge(15000) + if(wood) + wood.add_charge(2000) + if(plastic) + plastic.add_charge(1000) return else continue for(var/obj/W in T) //Different classes of items give different commodities. - if (istype(W,/obj/item/weapon/cigbutt)) - stored_comms["plastic"]++ + if(istype(W,/obj/item/weapon/cigbutt)) + if(plastic) + plastic.add_charge(500) else if(istype(W,/obj/effect/spider/spiderling)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ + if(wood) + wood.add_charge(2000) + if(plastic) + plastic.add_charge(2000) else if(istype(W,/obj/item/weapon/light)) var/obj/item/weapon/light/L = W if(L.status >= 2) //In before someone changes the inexplicably local defines. ~ Z - stored_comms["metal"]++ - stored_comms["glass"]++ + if(metal) + metal.add_charge(250) + if(glass) + glass.add_charge(250) else continue else if(istype(W,/obj/effect/decal/remains/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["glass"]++ + if(metal) + metal.add_charge(2000) + if(plastic) + plastic.add_charge(2000) + if(glass) + glass.add_charge(1000) else if(istype(W,/obj/item/trash)) - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ + if(metal) + metal.add_charge(1000) + if(plastic) + plastic.add_charge(3000) else if(istype(W,/obj/effect/decal/cleanable/blood/gibs/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ + if(metal) + metal.add_charge(2000) + if(glass) + glass.add_charge(2000) else if(istype(W,/obj/item/ammo_casing)) - stored_comms["metal"]++ + if(metal) + metal.add_charge(1000) else if(istype(W,/obj/item/weapon/shard/shrapnel)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["metal"]++ + if(metal) + metal.add_charge(1000) else if(istype(W,/obj/item/weapon/shard)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ + if(glass) + glass.add_charge(1000) else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/grown)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ + if(wood) + wood.add_charge(4000) else if(istype(W,/obj/item/pipe)) // This allows drones and engiborgs to clear pipe assemblies from floors. else @@ -325,39 +328,3 @@ dat += resources src << browse(dat, "window=robotmod") - -//Putting the decompiler here to avoid doing list checks every tick. -/mob/living/silicon/robot/drone/use_power() - - ..() - if(!src.has_power || !decompiler) - return - - //The decompiler replenishes drone stores from hoovered-up junk each tick. - for(var/type in decompiler.stored_comms) - if(decompiler.stored_comms[type] > 0) - var/obj/item/stack/sheet/stack - switch(type) - if("metal") - if(!stack_metal) - stack_metal = new /obj/item/stack/sheet/metal/cyborg(src.module) - stack_metal.amount = 1 - stack = stack_metal - if("glass") - if(!stack_glass) - stack_glass = new /obj/item/stack/sheet/glass/cyborg(src.module) - stack_glass.amount = 1 - stack = stack_glass - if("wood") - if(!stack_wood) - stack_wood = new /obj/item/stack/sheet/wood/cyborg(src.module) - stack_wood.amount = 1 - stack = stack_wood - if("plastic") - if(!stack_plastic) - stack_plastic = new /obj/item/stack/sheet/mineral/plastic/cyborg(src.module) - stack_plastic.amount = 1 - stack = stack_plastic - - stack.amount++ - decompiler.stored_comms[type]--; diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index b2bcaa7e3c..7f8efa8119 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -18,18 +18,18 @@ if(emag) emag.emp_act(severity) if(synths) - for(var/datum/synth/S in synths) + for(var/datum/matter_synth/S in synths) S.emp_act(severity) ..() return -/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) +/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) if(!synths || !synths.len) return for(var/datum/matter_synth/T in synths) - T.add_charge(amount * amount) + T.add_charge(T.recharge_rate * rate) /obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules @@ -89,11 +89,11 @@ var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) N.uses_charge = 1 - N.charge_cost = 1000 - N.synth = medicine + N.charge_costs = list(1000) + N.synths = list(medicine) B.uses_charge = 1 - B.charge_cost = 1000 - B.synth = medicine + B.charge_costs = list(1000) + B.synths = list(medicine) src.modules += N src.modules += B @@ -131,14 +131,14 @@ var/obj/item/stack/medical/bruise_pack/B = new /obj/item/stack/medical/bruise_pack(src) var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) O.uses_charge = 1 - O.charge_cost = 1000 - O.synth = medicine + O.charge_costs = list(1000) + O.synths = list(medicine) B.uses_charge = 1 - B.charge_cost = 1000 - B.synth = medicine + B.charge_costs = list(1000) + B.synths = list(medicine) S.uses_charge = 1 - S.charge_cost = 1000 - S.synth = medicine + S.charge_costs = list(1000) + S.synths = list(medicine) src.modules += O src.modules += B src.modules += S @@ -183,20 +183,19 @@ synths += glass var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) - M.synth = metal + M.synths = list(metal) src.modules += M var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synth = metal + R.synths = list(metal) src.modules += R var/obj/item/stack/sheet/plasteel/cyborg/S = new /obj/item/stack/sheet/plasteel/cyborg(src) - S.synth = metal + S.synths = list(metal) src.modules += S var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) - RG.metal_synth = metal - RG.glass_synth = glass + RG.synths = list(metal, glass) src.modules += R /obj/item/weapon/robot_module/engineering @@ -217,40 +216,43 @@ src.modules += new /obj/item/device/analyzer(src) src.modules += new /obj/item/taperoll/engineering(src) src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/matter_decompiler(src) src.modules += new /obj/item/device/pipe_painter(src) src.emag = new /obj/item/borg/stun(src) - var/datum/matter_synth/metal = new /datum/matter_synth/metal(30000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(30000) + var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) var/datum/matter_synth/wire = new /datum/matter_synth/wire() synths += metal synths += glass synths += wire + var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) + MD.metal = metal + MD.glass = glass + src.modules += MD + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) - M.synth = metal + M.synths = list(metal) src.modules += M var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src) - G.synth = glass + G.synths = list(glass) src.modules += G var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synth = metal + R.synths = list(metal) src.modules += R var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synth = wire + C.synths = list(wire) src.modules += C var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src) - S.synth = metal + S.synths = list(metal) src.modules += S var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) - RG.metal_synth = metal - RG.glass_synth = glass + RG.synths = list(metal, glass) src.modules += RG return @@ -444,7 +446,6 @@ src.modules += new /obj/item/device/multitool(src) src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/matter_decompiler(src) src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src) src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) src.emag.name = "Plasma Cutter" @@ -460,41 +461,47 @@ synths += plastic synths += wire + var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) + MD.metal = metal + MD.glass = glass + MD.wood = wood + MD.plastic = plastic + src.modules += MD + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) - M.synth = metal + M.synths = list(metal) src.modules += M var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src) - G.synth = glass + G.synths = list(glass) src.modules += G var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synth = metal + R.synths = list(metal) src.modules += R var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synth = wire + C.synths = list(wire) src.modules += C var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src) - S.synth = metal + S.synths = list(metal) src.modules += S var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) - RG.metal_synth = metal - RG.glass_synth = glass + RG.synths = list(metal, glass) src.modules += RG var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synth = wood + WT.synths = list(wood) src.modules += WT var/obj/item/stack/sheet/wood/cyborg/W = new /obj/item/stack/sheet/wood/cyborg(src) - W.synth = wood + W.synths = list(wood) src.modules += W var/obj/item/stack/sheet/mineral/plastic/cyborg/P = new /obj/item/stack/sheet/mineral/plastic/cyborg(src) - P.synth = plastic + P.synths = list(plastic) src.modules += P /obj/item/weapon/robot_module/drone/add_languages(var/mob/living/silicon/robot/R) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4db363af0e..3497e4bfda 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -485,10 +485,10 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/stack/cable_coil/cyborg name = "cable coil synthesizer" desc = "A device that makes cable." - gender = MALE + gender = NEUTER matter = null uses_charge = 1 - charge_cost = 1 + charge_costs = list(1) stacktype = /obj/item/stack/cable_coil /obj/item/stack/cable_coil/suicide_act(mob/user) From 4aee297d2e27aa6697ac84334cbfe449fb75875d Mon Sep 17 00:00:00 2001 From: Kelenius Date: Fri, 20 Feb 2015 17:21:12 +0300 Subject: [PATCH 22/30] Axes drone verb category Moves verbs to "robot commands" --- code/modules/mob/living/silicon/robot/drone/drone_abilities.dm | 2 +- code/modules/mob/living/silicon/robot/drone/drone_items.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index bac16de92e..55cb1376b6 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -2,7 +2,7 @@ /mob/living/silicon/robot/drone/verb/set_mail_tag() set name = "Set Mail Tag" set desc = "Tag yourself for delivery through the disposals system." - set category = "Drone" + set category = "Robot Commands" var/new_tag = input("Select the desired destination.", "Set Mail Tag", null) as null|anything in tagger_locations diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7750ab9b9a..fa79115dc0 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -57,7 +57,7 @@ set name = "Drop Item" set desc = "Release an item from your magnetic gripper." - set category = "Drone" + set category = "Robot Commands" if(!wrapped) //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z From 5b299e0104878fdd896ef3eb92c75ed47569febf Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 19 Feb 2015 18:23:47 +0100 Subject: [PATCH 23/30] NanoUI atmosphere control and remote air alarm support. --- code/game/machinery/alarm.dm | 35 +++++--- code/game/machinery/computer/atmos_control.dm | 87 ++++++++++--------- code/game/objects/objs.dm | 4 +- code/modules/mob/mob_helpers.dm | 6 ++ code/modules/nano/nanoexternal.dm | 14 +-- code/modules/nano/nanointeraction.dm | 25 ++++-- code/modules/nano/nanomanager.dm | 3 +- code/modules/nano/nanoui.dm | 34 +++++--- code/setup.dm | 1 + nano/templates/air_alarm.tmpl | 14 +-- nano/templates/atmos_control.tmpl | 5 ++ nano/templates/atmosphere_monitor.tmpl | 37 ++++++++ 12 files changed, 175 insertions(+), 90 deletions(-) create mode 100644 nano/templates/atmos_control.tmpl create mode 100644 nano/templates/atmosphere_monitor.tmpl diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 2cdfd0ee3d..a2e78a10f9 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -479,22 +479,29 @@ ui_interact(user) wires.Interact(user) -/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, remote = 0) +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/custom_state = null) var/data[0] - var/is_locked = locked && !user.isAI() + var/remote_connection = 0 + var/remote_access = 0 + if(custom_state) + var/list/state = custom_state.href_list(user) + remote_connection = state["remote_connection"] // Remote connection means we're non-adjacent/connecting from another computer + remote_access = state["remote_access"] // Remote access means we also have the privilege to alter the air alarm. - data["locked"] = is_locked + data["locked"] = locked && !user.isSilicon() + data["remote_connection"] = remote_connection + data["remote_access"] = remote_access data["rcon"] = rcon_setting data["screen"] = screen populate_status(data) - if(!is_locked) + if(!(locked && !remote_connection) || remote_access || user.isSilicon()) populate_controls(data) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 625, 625) + ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 625, 625, master_ui = master_ui, custom_state = custom_state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -619,7 +626,7 @@ data["thresholds"] = thresholds -/obj/machinery/alarm/CanUseTopic(var/mob/user) +/obj/machinery/alarm/CanUseTopic(var/mob/user, href_list, var/datum/topic_state/custom_state) if(buildstage != 2) return STATUS_CLOSE @@ -629,10 +636,18 @@ . = shorted ? STATUS_DISABLED : STATUS_INTERACTIVE + if(. == STATUS_INTERACTIVE) + var/extra_href = custom_state.href_list(usr) + // Prevent remote users from altering RCON settings unless they already have access (I realize the risks) + if(href_list["rcon"] && extra_href["remote_connection"] && !extra_href["remote_access"]) + . = STATUS_UPDATE + + //TODO: Move the rest of if(!locked || extra_href["remote_access"] || usr.isAI()) and hrefs here + return min(..(), .) -/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/remote = 0) - if(..(href, href_list, nowindow, !remote)) +/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/custom_state) + if(..(href, href_list, nowindow, custom_state)) return 1 // hrefs that can always be called -walter0o @@ -661,8 +676,8 @@ return 1 // hrefs that need the AA unlocked -walter0o - if(!locked || remote || istype(usr, /mob/living/silicon)) - + var/extra_href = custom_state.href_list(usr) + if(!(locked && !extra_href["remote_connection"]) || extra_href["remote_access"] || usr.isSilicon()) if(href_list["command"]) var/device_id = href_list["id_tag"] switch(href_list["command"]) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index a722131102..a6eb8765f1 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -9,11 +9,11 @@ density = 1 anchored = 1.0 circuit = "/obj/item/weapon/circuitboard/atmoscontrol" - var/obj/machinery/alarm/current var/overridden = 0 //not set yet, can't think of a good way to do it req_access = list(access_ce) var/list/monitored_alarm_ids = null var/list/monitored_alarms = null + var/ui_ref /obj/machinery/computer/atmoscontrol/laptop name = "Atmospherics Laptop" @@ -32,36 +32,29 @@ monitored_alarms = dd_sortedObjectList(monitored_alarms) /obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob) - return interact(user) + return ui_interact(user) /obj/machinery/computer/atmoscontrol/attack_hand(mob/user) if(..()) return - return interact(user) + return ui_interact(user) -/obj/machinery/computer/atmoscontrol/interact(mob/user) - user.set_machine(src) - if(allowed(user)) - overridden = 1 - else if(!emagged) - overridden = 0 - var/dat = "Main Menu
" - if(monitored_alarms && monitored_alarms.len == 1) - current = monitored_alarms[1] - if(current) - dat += specific() - else - for(var/obj/machinery/alarm/alarm in monitored_alarms ? monitored_alarms : machines) - dat += "" - switch(max(alarm.danger_level, alarm.alarm_area.atmosalm)) - if (0) - dat += "" - if (1) - dat += "" - if (2) - dat += "" - dat += "[sanitize(alarm.name)]
" - user << browse(dat, "window=atmoscontrol") +/obj/machinery/computer/atmoscontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/alarms[0] + + // TODO: Move these to a cache, similar to cameras + for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : machines)) + alarms[++alarms.len] = list("name" = sanitize(alarm.name), "ref"= "\ref[alarm]", "danger" = max(alarm.danger_level, alarm.alarm_area.atmosalm)) + data["alarms"] = alarms + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 625, 625) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + ui_ref = ui /obj/machinery/computer/atmoscontrol/attackby(var/obj/item/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/card/emag) && !emagged) @@ -73,23 +66,33 @@ return return ..() -/obj/machinery/computer/atmoscontrol/proc/specific() - if(!current) - return "" - var/dat = "

[current.name]


" - dat += current.return_status() - if(current.remote_control || overridden) - dat += "
[current.return_controls(src)]" - return dat - //a bunch of this is copied from atmos alarms /obj/machinery/computer/atmoscontrol/Topic(href, href_list) if(..()) - return - if(href_list["reset"]) - current = null + return 1 + if(href_list["alarm"]) - current = locate(href_list["alarm"]) - else if(current) - current.Topic(href, href_list, 1, 1) - interact(usr) + if(ui_ref) + var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines) + if(alarm) + var/datum/topic_state/TS = generate_state(alarm) + alarm.ui_interact(usr, master_ui = ui_ref, custom_state = TS) + return 1 + +/obj/machinery/computer/atmoscontrol/proc/generate_state(var/alarm) + var/datum/topic_state/air_alarm/state = new() + state.atmos_control = src + state.air_alarm = alarm + return state + +/datum/topic_state/air_alarm + flags = NANO_IGNORE_DISTANCE + var/obj/machinery/computer/atmoscontrol/atmos_control = null + var/obj/machinery/alarm/air_alarm = null + +/datum/topic_state/air_alarm/href_list(var/mob/user) + var/list/extra_href = list() + extra_href["remote_connection"] = 1 + extra_href["remote_access"] = user && (atmos_control.allowed(user) || atmos_control.emagged || air_alarm.rcon_setting == RCON_YES || (air_alarm.alarm_area.atmosalm && air_alarm.rcon_setting == RCON_AUTO)) + + return extra_href diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b0a01a04a0..b67ce9023e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -16,7 +16,7 @@ var/damtype = "brute" var/force = 0 -/obj/Topic(href, href_list, var/nowindow = 0, var/checkrange = 1) +/obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/custom_state) // Calling Topic without a corresponding window open causes runtime errors if(!nowindow && ..()) return 1 @@ -24,7 +24,7 @@ // In the far future no checks are made in an overriding Topic() beyond if(..()) return // Instead any such checks are made in CanUseTopic() var/obj/host = nano_host() - if(host.CanUseTopic(usr, checkrange) == STATUS_INTERACTIVE) + if(host.CanUseTopic(usr, href_list, custom_state) == STATUS_INTERACTIVE) CouldUseTopic(usr) return 0 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index d205412297..bc9ba4a33d 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -80,6 +80,12 @@ return 1 return 0 +/mob/proc/isSilicon() + return 0 + +/mob/living/silicon/isSilicon() + return 1 + /mob/proc/isAI() return 0 diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index 50e2b706f8..b029019f1a 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -1,5 +1,5 @@ - // This file contains all Nano procs/definitions for external classes/objects - + // This file contains all Nano procs/definitions for external classes/objects + /** * Called when a Nano UI window is closed * This is how Nano handles closed windows @@ -15,7 +15,7 @@ if (istype(ui)) ui.close() - + if(ui.ref) var/href = "close=1" src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic() @@ -31,14 +31,14 @@ * ui_interact is currently defined for /atom/movable * * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") - * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui + * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") + * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui * @param force_open boolean Force the UI to (re)open, even if it's already open * * @return nothing */ -/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/custom_state = null) return - + // Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob /mob/var/list/open_uis = list() diff --git a/code/modules/nano/nanointeraction.dm b/code/modules/nano/nanointeraction.dm index 42976554d9..09b46eb30e 100644 --- a/code/modules/nano/nanointeraction.dm +++ b/code/modules/nano/nanointeraction.dm @@ -5,11 +5,11 @@ return loc -/atom/movable/proc/CanUseTopic(var/mob/user, var/be_close) - return user.can_use_topic(nano_host(), be_close) +/atom/movable/proc/CanUseTopic(var/mob/user, href_list, var/datum/topic_state/custom_state) + return user.can_use_topic(nano_host(), custom_state) -/mob/proc/can_use_topic(var/src_object) +/mob/proc/can_use_topic(var/mob/user, var/datum/topic_state/custom_state) return STATUS_CLOSE // By default no mob can do anything with NanoUI /mob/dead/observer/can_use_topic() @@ -23,12 +23,13 @@ else return ..() -/mob/living/silicon/robot/can_use_topic(var/src_object) +/mob/living/silicon/robot/can_use_topic(var/src_object, var/datum/topic_state/custom_state) if(stat || !client) return STATUS_CLOSE if(lockcharge || stunned || weakened) return STATUS_DISABLED - if (src_object in view(src)) // robots can interact with things they can see within their view range + // robots can interact with things they can see within their view range + if(!(custom_state.flags & NANO_IGNORE_DISTANCE) && (src_object in view(src))) return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) @@ -96,16 +97,22 @@ return STATUS_DISABLED // no updates, completely disabled (red visibility) return STATUS_CLOSE -/mob/living/can_use_topic(var/src_object, var/be_close = 1) +/mob/living/can_use_topic(var/src_object, var/datum/topic_state/custom_state) . = shared_living_nano_interaction(src_object) - if(. == STATUS_INTERACTIVE && be_close) + if(. == STATUS_INTERACTIVE && !(custom_state.flags & NANO_IGNORE_DISTANCE)) . = shared_living_nano_distance(src_object) if(STATUS_INTERACTIVE) return STATUS_UPDATE -/mob/living/carbon/human/can_use_topic(var/src_object, var/be_close = 1) +/mob/living/carbon/human/can_use_topic(var/src_object, var/datum/topic_state/custom_state) . = shared_living_nano_interaction(src_object) - if(. == STATUS_INTERACTIVE && be_close) + if(. == STATUS_INTERACTIVE && !(custom_state.flags & NANO_IGNORE_DISTANCE)) . = shared_living_nano_distance(src_object) if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction. return STATUS_INTERACTIVE + +/datum/topic_state + var/flags = 0 + +/datum/topic_state/proc/href_list(var/mob/user) + return list() \ No newline at end of file diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index ddc3fcac9f..794d9c5727 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -186,7 +186,8 @@ return 0 // wasn't open processing_uis.Remove(ui) - ui.user.open_uis.Remove(ui) + if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface) + ui.user.open_uis.Remove(ui) var/list/uis = open_uis[src_object_key][ui.ui_key] uis.Remove(ui) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index e0047f8cfb..0a6b6ede8e 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -52,6 +52,11 @@ nanoui is used to open and update nano browser uis // the current status/visibility of the ui var/status = STATUS_INTERACTIVE + // Relationship between a master interface and its children. Used in update_status + var/datum/nanoui/master_ui + var/list/datum/nanoui/children = list() + var/datum/topic_state/custom_state = null + var/cached_data = null /** @@ -68,17 +73,22 @@ nanoui is used to open and update nano browser uis * * @return /nanoui new nanoui object */ -/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) +/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/datum/nanoui/master_ui = null, var/datum/topic_state/custom_state = null) user = nuser src_object = nsrc_object ui_key = nui_key window_id = "[ui_key]\ref[src_object]" + src.master_ui = master_ui + if(master_ui) + master_ui.children += src + src.custom_state = custom_state ? custom_state : new/datum/topic_state() + // add the passed template filename as the "main" template, this is required add_template("main", ntemplate_filename) if (ntitle) - title = ntitle + title = sanitize(ntitle) if (nwidth) width = nwidth if (nheight) @@ -132,16 +142,15 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - var/new_status = get_status() + var/atom/movable/host = src_object.nano_host() + var/new_status = host.CanUseTopic(user, list(), custom_state) + if(master_ui) + new_status = min(new_status, master_ui.status) if(new_status == STATUS_CLOSE) close() else set_status(new_status, push_update) -/datum/nanoui/proc/get_status() - var/atom/movable/host = src_object.nano_host() - return host.CanUseTopic(user) - /** * Set the ui to auto update (every master_controller tick) * @@ -383,10 +392,6 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/open() - var/new_status = get_status() - if(new_status == STATUS_CLOSE) - return - var/window_size = "" if (width && height) window_size = "size=[width]x[height];" @@ -406,6 +411,8 @@ nanoui is used to open and update nano browser uis is_auto_updating = 0 nanomanager.ui_closed(src) user << browse(null, "window=[window_id]") + for(var/datum/nanoui/child in children) + child.close() /** * Set the UI window to call the nanoclose verb when the window is closed @@ -470,7 +477,7 @@ nanoui is used to open and update nano browser uis set_map_z_level(text2num(href_list["mapZLevel"])) map_update = 1 - if ((src_object && src_object.Topic(href, href_list)) || map_update) + if ((src_object && src_object.Topic(href, href_list, 0, custom_state)) || map_update) nanomanager.update_uis(src_object) // update all UIs attached to src_object /** @@ -497,5 +504,4 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update(var/force_open = 0) - src_object.ui_interact(user, ui_key, src, force_open) - + src_object.ui_interact(user, ui_key, src, force_open, master_ui, custom_state) diff --git a/code/setup.dm b/code/setup.dm index 06235da7fc..fb54f3c067 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -759,3 +759,4 @@ var/list/be_special_flags = list( #define STATUS_DISABLED 0 // RED Visability #define STATUS_CLOSE -1 // Close the interface +#define NANO_IGNORE_DISTANCE 1 \ No newline at end of file diff --git a/nano/templates/air_alarm.tmpl b/nano/templates/air_alarm.tmpl index 5b1ee24574..6ba6b14057 100644 --- a/nano/templates/air_alarm.tmpl +++ b/nano/templates/air_alarm.tmpl @@ -60,9 +60,9 @@ Used In File(s): \code\game\machinery\alarm.dm
@@ -74,8 +74,12 @@ Used In File(s): \code\game\machinery\alarm.dm
- {{:helper.link('Off', null, { 'rcon' : 1}, null, data.rcon == 1 ? 'selected' : null)}} - {{:helper.link('Auto', null, { 'rcon' : 2}, null, data.rcon == 2 ? 'selected' : null)}} - {{:helper.link('On', null, { 'rcon' : 3}, null, data.rcon == 3 ? 'selected' : null)}} + {{:helper.link('Off', null, { 'rcon' : 1}, data.remote_connection && !data.remote_access ? (data.rcon == 1 ? 'yellowButton' : 'disabled') : null, data.rcon == 1 ? 'selected' : null)}} + {{:helper.link('Auto', null, { 'rcon' : 2}, data.remote_connection && !data.remote_access ? (data.rcon == 2 ? 'yellowButton' : 'disabled') : null, data.rcon == 2 ? 'selected' : null)}} + {{:helper.link('On', null, { 'rcon' : 3}, data.remote_connection && !data.remote_access ? (data.rcon == 3 ? 'yellowButton' : 'disabled') : null, data.rcon == 3 ? 'selected' : null)}}

-{{if data.locked}} - (Swipe ID card to unlock interface) +{{if data.locked || (data.remote_connection && ! data.remote_access)}} + {{if data.remote_connection}} + (Current remote control settings and alarm status restricts access.) + {{else}} + (Swipe ID card to unlock interface.) + {{/if}} {{else}} {{if data.screen != 1}}
{{:helper.link('Main Menu', null, { 'screen' : 1})}}
diff --git a/nano/templates/atmos_control.tmpl b/nano/templates/atmos_control.tmpl new file mode 100644 index 0000000000..5e9a1acfe4 --- /dev/null +++ b/nano/templates/atmos_control.tmpl @@ -0,0 +1,5 @@ +
+ {{for data.alarms}} + {{:helper.link(value.name, null, {'alarm' : value.ref}, null, value.danger == 2 ? 'redButton' : (value.danger == 1 ? 'yellowButton' : null))}} + {{/for}} +
\ No newline at end of file diff --git a/nano/templates/atmosphere_monitor.tmpl b/nano/templates/atmosphere_monitor.tmpl new file mode 100644 index 0000000000..0089467e43 --- /dev/null +++ b/nano/templates/atmosphere_monitor.tmpl @@ -0,0 +1,37 @@ + + +{{for data.categories}} +

{{:value.category}}

+ {{for value.alarms :alarmValue:alarmIndex}} + {{if alarmValue.origin_lost}} + {{:alarmValue.name}} Alarm Origin Lost
+ {{else}} + {{:alarmValue.name}}
+ {{/if}} + {{if alarmValue.has_cameras || alarmValue.lost_sources != ""}} +
+ {{if alarmValue.has_cameras}} +
+ {{for alarmValue.cameras :cameraValue:cameraIndex}} + {{if cameraValue.deact}} + {{:helper.link(cameraValue.name + " (deactivated)", '', {}, 'inactive')}} + {{else}} + {{:helper.link(cameraValue.name, '', {'switchTo' : cameraValue.camera})}} + {{/if}} + {{/for}} +
+ {{/if}} + {{if alarmValue.lost_sources != ""}} +
+

Lost Alarm Sources: {{:alarmValue.lost_sources}}

+
+ {{/if}} +
+ {{/if}} + {{empty}} + --All Systems Nominal + {{/for}} +{{/for}} \ No newline at end of file From 83fc1689ef8c3610202eefe17784f333fc3de779 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Fri, 20 Feb 2015 20:19:12 +0300 Subject: [PATCH 24/30] Fixes a turret runtime --- code/modules/projectiles/projectile.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e25b4491da..cbac10aaef 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -167,9 +167,12 @@ target_mob.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [target_mob]/[target_mob.ckey] with a [src.type]" firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [target_mob]/[target_mob.ckey] with a [src.type]" msg_admin_attack("[firer] ([firer.ckey]) shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG - else + else if(firer) target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with a [src]" msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG + else + target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with a [src]" + msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG //sometimes bullet_act() will want the projectile to continue flying if (target_mob.bullet_act(src, def_zone) == -1) From f0a5dae1c4fe05d168e3900ba6a75980c6fba33b Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Fri, 20 Feb 2015 19:54:15 +0100 Subject: [PATCH 25/30] Icarus cannon admin logs. --- code/modules/admin/verbs/icarus.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/verbs/icarus.dm b/code/modules/admin/verbs/icarus.dm index cccda899b3..1f9b2dd4c4 100644 --- a/code/modules/admin/verbs/icarus.dm +++ b/code/modules/admin/verbs/icarus.dm @@ -3,11 +3,13 @@ set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost" set category = "Fun" + var/turf/target = get_turf(src.mob) + admin_log_and_message_admins("has fired the Icarus point defense laser at [target.x]-[target.y]-[target.z]") if(!src.holder) src << "Only administrators may use this command." return - Icarus_FireLaser(get_turf(src.mob)) + Icarus_FireLaser(target) /client/proc/FireCannons() @@ -15,11 +17,13 @@ set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost." set category = "Fun" + var/turf/target = get_turf(src.mob) + admin_log_and_message_admins("has fired the Icarus main gun projectile at [target.x]-[target.y]-[target.z]") if(!src.holder) src << "Only administrators may use this command." return - Icarus_FireCannon(get_turf(src.mob)) + Icarus_FireCannon(target) /client/proc/ChangeIcarusPosition() @@ -27,6 +31,7 @@ set desc = "Lets you chose the position of the Icarus in regards to the map." set category = "Fun" + admin_log_and_message_admins("is changing the Icarus position.") if(!src.holder) src << "Only administrators may use this command." return @@ -122,4 +127,4 @@ proc/Icarus_SetPosition(var/user) if(!direction) return - icarus_position = directions[direction] \ No newline at end of file + icarus_position = directions[direction] From 09afd35798dcdbe60c6bab5f6fbebe182a4192ea Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 20 Feb 2015 21:01:52 -0500 Subject: [PATCH 26/30] Syringe gun cartridges change name when loaded --- code/modules/projectiles/guns/launcher/syringe_gun.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 8ae6ccbd45..75c015d579 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -1,6 +1,6 @@ /obj/item/weapon/syringe_cartridge name = "syringe gun cartridge" - desc = "An impact-triggered compressed gas cartridge that can fitted to a syringe for rapid injection." + desc = "An impact-triggered compressed gas cartridge that can be fitted to a syringe for rapid injection." icon = 'icons/obj/ammo.dmi' icon_state = "syringe-cartridge" var/icon_flight = "syringe-cartridge-flight" //so it doesn't look so weird when shot @@ -25,6 +25,7 @@ user.remove_from_mob(syringe) syringe.loc = src sharp = 1 + name = "syringe dart" update_icon() /obj/item/weapon/syringe_cartridge/attack_self(mob/user) @@ -33,6 +34,7 @@ user.put_in_hands(syringe) syringe = null sharp = initial(sharp) + name = initial(name) update_icon() /obj/item/weapon/syringe_cartridge/proc/prime() From cf431370f3fb056cb1a9c95cfc27ce5d464aaabc Mon Sep 17 00:00:00 2001 From: MrSnapwalk Date: Fri, 20 Feb 2015 21:02:26 -0600 Subject: [PATCH 27/30] Action figure un-refactor, minor fix. --- code/game/objects/items/toys.dm | 313 ++++++++++++++++---------------- 1 file changed, 154 insertions(+), 159 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 3c52121c4b..d316fe22df 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -601,206 +601,201 @@ * Action figures */ - /obj/item/toy/figure name = "Completely Glitched action figure" desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death." icon_state = "assistant" icon = 'icons/obj/toy.dmi' - var/figuretype = "" -/obj/item/toy/figure/New() - figuretype = pick("cmo","assistant","atmos","bartender","borg","gardener","captain","cargotech","ce","chaplain","chef","chemist","corgi","detective","dsquad","engineer","geneticist","hop","hos","qm","janitor","agent","librarian","md","mime","miner","ninja","wizard","rd","roboticist","scientist","syndie","secofficer","warden","psychologist","paramedic","ert") +/obj/item/toy/figure/cmo + name = "Chief Medical Officer action figure" + desc = "A \"Space Life\" brand Chief Medical Officer action figure." + icon_state = "cmo" - if(figuretype == "cmo") - name = "Chief Medical Officer action figure" - desc = "A \"Space Life\" brand Chief Medical Officer action figure." - icon_state = "cmo" +/obj/item/toy/figure/assistant + name = "Assistant action figure" + desc = "A \"Space Life\" brand Assistant action figure." + icon_state = "assistant" - if(figuretype == "assistant") - name = "Assistant action figure" - desc = "A \"Space Life\" brand Assistant action figure." - icon_state = "assistant" +/obj/item/toy/figure/atmos + name = "Atmospheric Technician action figure" + desc = "A \"Space Life\" brand Atmospheric Technician action figure." + icon_state = "atmos" - if(figuretype == "atmos") - name = "Atmospheric Technician action figure" - desc = "A \"Space Life\" brand Atmospheric Technician action figure." - icon_state = "atmos" +/obj/item/toy/figure/bartender + name = "Bartender action figure" + desc = "A \"Space Life\" brand Bartender action figure." + icon_state = "bartender" - if(figuretype == "bartender") - name = "Bartender action figure" - desc = "A \"Space Life\" brand Bartender action figure." - icon_state = "bartender" +/obj/item/toy/figure/borg + name = "Cyborg action figure" + desc = "A \"Space Life\" brand Cyborg action figure." + icon_state = "borg" - if(figuretype == "borg") - name = "Cyborg action figure" - desc = "A \"Space Life\" brand Cyborg action figure." - icon_state = "borg" +/obj/item/toy/figure/gardener + name = "Gardener action figure" + desc = "A \"Space Life\" brand Gardener action figure." + icon_state = "botanist" - if(figuretype == "gardener") - name = "Gardener action figure" - desc = "A \"Space Life\" brand Gardener action figure." - icon_state = "gardener" +/obj/item/toy/figure/captain + name = "Captain action figure" + desc = "A \"Space Life\" brand Captain action figure." + icon_state = "captain" - if(figuretype == "captain") - name = "Captain action figure" - desc = "A \"Space Life\" brand Captain action figure." - icon_state = "captain" +/obj/item/toy/figure/cargotech + name = "Cargo Technician action figure" + desc = "A \"Space Life\" brand Cargo Technician action figure." + icon_state = "cargotech" - if(figuretype == "cargotech") - name = "Cargo Technician action figure" - desc = "A \"Space Life\" brand Cargo Technician action figure." - icon_state = "cargotech" +/obj/item/toy/figure/ce + name = "Chief Engineer action figure" + desc = "A \"Space Life\" brand Chief Engineer action figure." + icon_state = "ce" - if(figuretype == "ce") - name = "Chief Engineer action figure" - desc = "A \"Space Life\" brand Chief Engineer action figure." - icon_state = "ce" +/obj/item/toy/figure/chaplain + name = "Chaplain action figure" + desc = "A \"Space Life\" brand Chaplain action figure." + icon_state = "chaplain" - if(figuretype == "chaplain") - name = "Chaplain action figure" - desc = "A \"Space Life\" brand Chaplain action figure." - icon_state = "chaplain" +/obj/item/toy/figure/chef + name = "Chef action figure" + desc = "A \"Space Life\" brand Chef action figure." + icon_state = "chef" - if(figuretype == "chef") - name = "Chef action figure" - desc = "A \"Space Life\" brand Chef action figure." - icon_state = "chef" +/obj/item/toy/figure/chemist + name = "Chemist action figure" + desc = "A \"Space Life\" brand Chemist action figure." + icon_state = "chemist" - if(figuretype == "chemist") - name = "Chemist action figure" - desc = "A \"Space Life\" brand Chemist action figure." - icon_state = "chemist" +/obj/item/toy/figure/clown + name = "Clown action figure" + desc = "A \"Space Life\" brand Clown action figure." + icon_state = "clown" - if(figuretype == "clown") - name = "Clown action figure" - desc = "A \"Space Life\" brand Clown action figure." - icon_state = "clown" +/obj/item/toy/figure/corgi + name = "Corgi action figure" + desc = "A \"Space Life\" brand Corgi action figure." + icon_state = "ian" - if(figuretype == "corgi") - name = "Corgi action figure" - desc = "A \"Space Life\" brand Corgi action figure." - icon_state = "ian" +/obj/item/toy/figure/detective + name = "Detective action figure" + desc = "A \"Space Life\" brand Detective action figure." + icon_state = "detective" - if(figuretype == "detective") - name = "Detective action figure" - desc = "A \"Space Life\" brand Detective action figure." - icon_state = "detective" +/obj/item/toy/figure/dsquad + name = "Space Commando action figure" + desc = "A \"Space Life\" brand Space Commando action figure." + icon_state = "dsquad" - if(figuretype == "dsquad") - name = "Space Commando action figure" - desc = "A \"Space Life\" brand Space Commando action figure." - icon_state = "dsquad" +/obj/item/toy/figure/engineer + name = "Engineer action figure" + desc = "A \"Space Life\" brand Engineer action figure." + icon_state = "engineer" - if(figuretype == "engineer") - name = "Engineer action figure" - desc = "A \"Space Life\" brand Engineer action figure." - icon_state = "engineer" +/obj/item/toy/figure/geneticist + name = "Geneticist action figure" + desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued." + icon_state = "geneticist" - if(figuretype == "geneticist") - name = "Geneticist action figure" - desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued." - icon_state = "geneticist" +/obj/item/toy/figure/hop + name = "Head of Personel action figure" + desc = "A \"Space Life\" brand Head of Personel action figure." + icon_state = "hop" - if(figuretype == "hop") - name = "Head of Personel action figure" - desc = "A \"Space Life\" brand Head of Personel action figure." - icon_state = "hop" +/obj/item/toy/figure/hos + name = "Head of Security action figure" + desc = "A \"Space Life\" brand Head of Security action figure." + icon_state = "hos" - if(figuretype == "hos") - name = "Head of Security action figure" - desc = "A \"Space Life\" brand Head of Security action figure." - icon_state = "hos" +/obj/item/toy/figure/qm + name = "Quartermaster action figure" + desc = "A \"Space Life\" brand Quartermaster action figure." + icon_state = "qm" - if(figuretype == "qm") - name = "Quartermaster action figure" - desc = "A \"Space Life\" brand Quartermaster action figure." - icon_state = "qm" +/obj/item/toy/figure/janitor + name = "Janitor action figure" + desc = "A \"Space Life\" brand Janitor action figure." + icon_state = "janitor" - if(figuretype == "janitor") - name = "Janitor action figure" - desc = "A \"Space Life\" brand Janitor action figure." - icon_state = "janitor" +/obj/item/toy/figure/agent + name = "Internal Affairs Agent action figure" + desc = "A \"Space Life\" brand Internal Affairs Agent action figure." + icon_state = "agent" - if(figuretype == "agent") - name = "Internal Affairs Agent action figure" - desc = "A \"Space Life\" brand Internal Affairs Agent action figure." - icon_state = "agent" +/obj/item/toy/figure/librarian + name = "Librarian action figure" + desc = "A \"Space Life\" brand Librarian action figure." + icon_state = "librarian" - if(figuretype == "librarian") - name = "Librarian action figure" - desc = "A \"Space Life\" brand Librarian action figure." - icon_state = "librarian" +/obj/item/toy/figure/md + name = "Medical Doctor action figure" + desc = "A \"Space Life\" brand Medical Doctor action figure." + icon_state = "md" - if(figuretype == "md") - name = "Medical Doctor action figure" - desc = "A \"Space Life\" brand Medical Doctor action figure." - icon_state = "md" +/obj/item/toy/figure/mime + name = "Mime action figure" + desc = "A \"Space Life\" brand Mime action figure." + icon_state = "mime" - if(figuretype == "mime") - name = "Mime action figure" - desc = "A \"Space Life\" brand Mime action figure." - icon_state = "mime" +/obj/item/toy/figure/miner + name = "Shaft Miner action figure" + desc = "A \"Space Life\" brand Shaft Miner action figure." + icon_state = "miner" - if(figuretype == "miner") - name = "Shaft Miner action figure" - desc = "A \"Space Life\" brand Shaft Miner action figure." - icon_state = "miner" +/obj/item/toy/figure/ninja + name = "Space Ninja action figure" + desc = "A \"Space Life\" brand Space Ninja action figure." + icon_state = "ninja" - if(figuretype == "ninja") - name = "Space Ninja action figure" - desc = "A \"Space Life\" brand Space Ninja action figure." - icon_state = "ninja" +/obj/item/toy/figure/wizard + name = "Wizard action figure" + desc = "A \"Space Life\" brand Wizard action figure." + icon_state = "wizard" - if(figuretype == "wizard") - name = "Wizard action figure" - desc = "A \"Space Life\" brand Wizard action figure." - icon_state = "wizard" +/obj/item/toy/figure/rd + name = "Research Director action figure" + desc = "A \"Space Life\" brand Research Director action figure." + icon_state = "rd" - if(figuretype == "rd") - name = "Research Director action figure" - desc = "A \"Space Life\" brand Research Director action figure." - icon_state = "rd" +/obj/item/toy/figure/roboticist + name = "Roboticist action figure" + desc = "A \"Space Life\" brand Roboticist action figure." + icon_state = "roboticist" - if(figuretype == "roboticist") - name = "Roboticist action figure" - desc = "A \"Space Life\" brand Roboticist action figure." - icon_state = "roboticist" +/obj/item/toy/figure/scientist + name = "Scientist action figure" + desc = "A \"Space Life\" brand Scientist action figure." + icon_state = "scientist" - if(figuretype == "scientist") - name = "Scientist action figure" - desc = "A \"Space Life\" brand Scientist action figure." - icon_state = "scientist" +/obj/item/toy/figure/syndie + name = "Doom Operative action figure" + desc = "A \"Space Life\" brand Doom Operative action figure." + icon_state = "syndie" - if(figuretype == "syndie") - name = "Doom Operative action figure" - desc = "A \"Space Life\" brand Doom Operative action figure." - icon_state = "syndie" +/obj/item/toy/figure/secofficer + name = "Security Officer action figure" + desc = "A \"Space Life\" brand Security Officer action figure." + icon_state = "secofficer" - if(figuretype == "secofficer") - name = "Security Officer action figure" - desc = "A \"Space Life\" brand Security Officer action figure." - icon_state = "secofficer" +/obj/item/toy/figure/warden + name = "Warden action figure" + desc = "A \"Space Life\" brand Warden action figure." + icon_state = "warden" - if(figuretype == "warden") - name = "Warden action figure" - desc = "A \"Space Life\" brand Warden action figure." - icon_state = "warden" +/obj/item/toy/figure/psychologist + name = "Psychologist action figure" + desc = "A \"Space Life\" brand Psychologist action figure." + icon_state = "psychologist" - if(figuretype == "psychologist") - name = "Psychologist action figure" - desc = "A \"Space Life\" brand Psychologist action figure." - icon_state = "psychologist" +/obj/item/toy/figure/paramedic + name = "Paramedic action figure" + desc = "A \"Space Life\" brand Paramedic action figure." + icon_state = "paramedic" - if(figuretype == "paramedic") - name = "Paramedic action figure" - desc = "A \"Space Life\" brand Paramedic action figure." - icon_state = "paramedic" - - if(figuretype == "ert") - name = "Emergency Response Team Commander action figure" - desc = "A \"Space Life\" brand Emergency Response Team Commander action figure." - icon_state = "ert" +/obj/item/toy/figure/ert + name = "Emergency Response Team Commander action figure" + desc = "A \"Space Life\" brand Emergency Response Team Commander action figure." + icon_state = "ert" /obj/item/toy/katana name = "replica katana" @@ -889,7 +884,7 @@ visible_message("[src] says, \"[phrase]\"") /obj/structure/plushie/ian - name = "plushie corgi" + name = "plush corgi" desc = "A plushie of an adorable corgi! Don't you just want to hug it and squeeze it and call it \"Ian\"?" icon_state = "ianplushie" phrase = "Arf!" @@ -914,7 +909,7 @@ //Small plushies. /obj/item/toy/plushie - name = "generic small plushie" + name = "generic small plush" desc = "A very generic small plushie. It seems to not want to exist." icon = 'icons/obj/toy.dmi' icon_state = "nymphplushie" From ee24bdb3b1108f4d9a21c1a8a89c235b7a43cc36 Mon Sep 17 00:00:00 2001 From: MrSnapwalk Date: Fri, 20 Feb 2015 21:17:46 -0600 Subject: [PATCH 28/30] Adds the spider plushie - sprite by Bishop. --- code/game/objects/items/toys.dm | 5 +++++ icons/obj/toy.dmi | Bin 30094 -> 30967 bytes 2 files changed, 5 insertions(+) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index d316fe22df..e248c96aaf 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -944,6 +944,11 @@ desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi." icon_state = "lizardplushie" +/obj/item/toy/plushie/spider + name = "spider plush" + desc = "A plushie of a fuzzy spider! It has eight legs - all the better to hug you with." + icon_state = "spiderplushie" + //Toy cult sword /obj/item/toy/cultsword name = "foam sword" diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 043a93c6a4c81b766042d29af8d862164dc54ede..46c280252ee523df912ca928222411627f0c3b1c 100644 GIT binary patch delta 11587 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 delta 10707 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 X&b4ql6yyH|;KwU@HMw#b)8PLDH0qJh From 89da19de8a523ea2360214486a9ab545c127d9bb Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Sat, 21 Feb 2015 10:32:02 +0100 Subject: [PATCH 29/30] Fixes runtime in Topics() when called from non-NanoUI sources. --- code/game/objects/objs.dm | 3 +++ code/modules/nano/nanointeraction.dm | 2 ++ 2 files changed, 5 insertions(+) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b67ce9023e..518d615552 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -21,6 +21,9 @@ if(!nowindow && ..()) return 1 + if(!custom_state) + custom_state = default_state + // In the far future no checks are made in an overriding Topic() beyond if(..()) return // Instead any such checks are made in CanUseTopic() var/obj/host = nano_host() diff --git a/code/modules/nano/nanointeraction.dm b/code/modules/nano/nanointeraction.dm index 09b46eb30e..c8dfa630d6 100644 --- a/code/modules/nano/nanointeraction.dm +++ b/code/modules/nano/nanointeraction.dm @@ -111,6 +111,8 @@ if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction. return STATUS_INTERACTIVE +/var/global/datum/topic_state/default_state = new() + /datum/topic_state var/flags = 0 From acfd99e33cb881e0c9a50ec8c28ab97500442b00 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 21 Feb 2015 16:31:44 +0300 Subject: [PATCH 30/30] Surgery now shows up on mob, in all gory glory. --- .../mob/living/carbon/human/update_icons.dm | 57 +++++++++++------- code/modules/surgery/surgery.dm | 3 + icons/mob/surgery.dmi | Bin 0 -> 1829 bytes 3 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 icons/mob/surgery.dmi diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6b2367724b..496e09d2eb 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -107,28 +107,29 @@ Please contact me on #coderbus IRC. ~Carn x //Human Overlays Indexes///////// #define MUTATIONS_LAYER 1 #define DAMAGE_LAYER 2 -#define UNIFORM_LAYER 3 -#define TAIL_LAYER 4 //bs12 specific. this hack is probably gonna come back to haunt me -#define ID_LAYER 5 -#define SHOES_LAYER 6 -#define GLOVES_LAYER 7 -#define SUIT_LAYER 8 -#define GLASSES_LAYER 9 -#define BELT_LAYER 10 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 11 -#define BACK_LAYER 12 -#define HAIR_LAYER 13 //TODO: make part of head layer? -#define EARS_LAYER 14 -#define FACEMASK_LAYER 15 -#define HEAD_LAYER 16 -#define COLLAR_LAYER 17 -#define HANDCUFF_LAYER 18 -#define LEGCUFF_LAYER 19 -#define L_HAND_LAYER 20 -#define R_HAND_LAYER 21 -#define FIRE_LAYER 22 //If you're on fire -#define TARGETED_LAYER 23 //BS12: Layer for the target overlay from weapon targeting system -#define TOTAL_LAYERS 23 +#define SURGERY_LEVEL 3 //bs12 specific. +#define UNIFORM_LAYER 4 +#define TAIL_LAYER 5 //bs12 specific. this hack is probably gonna come back to haunt me +#define ID_LAYER 6 +#define SHOES_LAYER 7 +#define GLOVES_LAYER 8 +#define SUIT_LAYER 9 +#define GLASSES_LAYER 10 +#define BELT_LAYER 11 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 12 +#define BACK_LAYER 13 +#define HAIR_LAYER 14 //TODO: make part of head layer? +#define EARS_LAYER 15 +#define FACEMASK_LAYER 16 +#define HEAD_LAYER 17 +#define COLLAR_LAYER 18 +#define HANDCUFF_LAYER 19 +#define LEGCUFF_LAYER 20 +#define L_HAND_LAYER 21 +#define R_HAND_LAYER 22 +#define FIRE_LAYER 23 //If you're on fire +#define TARGETED_LAYER 24 //BS12: Layer for the target overlay from weapon targeting system +#define TOTAL_LAYERS 24 ////////////////////////////////// /mob/living/carbon/human @@ -509,6 +510,7 @@ proc/get_damage_icon_part(damage_state, body_part) update_inv_legcuffed(0) update_inv_pockets(0) update_fire(0) + update_surgery(0) UpdateDamageIcon() update_icons() //Hud Stuff @@ -929,6 +931,16 @@ proc/get_damage_icon_part(damage_state, body_part) if(update_icons) update_icons() +/mob/living/carbon/human/proc/update_surgery(var/update_icons=1) + overlays_standing[SURGERY_LEVEL] = null + var/image/total = new + for(var/datum/organ/external/E in organs) + if(E.open) + var/image/I = image("icon"='icons/mob/surgery.dmi', "icon_state"="[E.name][round(E.open)]", "layer"=-SURGERY_LEVEL) + total.overlays += I + overlays_standing[SURGERY_LEVEL] = total + if(update_icons) update_icons() + // Used mostly for creating head items /mob/living/carbon/human/proc/generate_head_icon() //gender no longer matters for the mouth, although there should probably be seperate base head icons. @@ -967,6 +979,7 @@ proc/get_damage_icon_part(damage_state, body_part) //Human Overlays Indexes///////// #undef MUTATIONS_LAYER #undef DAMAGE_LAYER +#undef SURGERY_LEVEL #undef UNIFORM_LAYER #undef TAIL_LAYER #undef ID_LAYER diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 825a4c582e..f44ae0fabd 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -103,6 +103,9 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) else // This failing silently was a pain. user << "\red You must remain close to your patient to conduct surgery." M.op_stage.in_progress = 0 // Clear the in-progress flag. + if (ishuman(M)) + var/mob/living/carbon/human/H = M + H.update_surgery() return 1 //don't want to do weapony things after surgery if (user.a_intent == "help") diff --git a/icons/mob/surgery.dmi b/icons/mob/surgery.dmi new file mode 100644 index 0000000000000000000000000000000000000000..20381e09090bfb3ca5f92717e6835482152e23e7 GIT binary patch literal 1829 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 D9La