From 90113838a7ae3324748df95a399ba0e97d21aec5 Mon Sep 17 00:00:00 2001 From: Artur Date: Mon, 2 Dec 2019 19:48:02 +0200 Subject: [PATCH] Iconfix and co Traits instead of procs for fakedeath Quickfix Whoops this too Loadsa fixes Nerfs stamina regen Too slow Hm --- .../game/gamemodes/bloodsucker/bloodsucker.dm | 3 +- .../bloodsucker/bloodsucker_life.dm | 22 +++------ .../bloodsucker/bloodsucker_powers.dm | 3 +- .../bloodsucker/bloodsucker_sunlight.dm | 2 +- .../bloodsucker/datum_bloodsucker.dm | 8 ++-- .../bloodsucker/objects/bloodsucker_coffin.dm | 8 ++-- .../bloodsucker/objects/bloodsucker_crypt.dm | 44 +----------------- .../bloodsucker/objects/bloodsucker_lair.dm | 4 +- .../bloodsucker/powers/bs_brawn.dm | 6 +-- .../bloodsucker/powers/bs_haste.dm | 2 +- .../bloodsucker/powers/bs_lunge.dm | 25 ++++------ .../bloodsucker/powers/bs_mesmerize.dm | 18 +++---- code/modules/crafting/craft.dm | 1 - code/modules/crafting/recipes/recipes_misc.dm | 38 +++++++++++++++ .../modules/mob/living/carbon/damage_procs.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 2 +- icons/mob/hud.dmi | Bin 17456 -> 17871 bytes tgstation.dme | 1 - 18 files changed, 87 insertions(+), 102 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index c0f5f80c1f..08f9a628b6 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -29,7 +29,8 @@ Bloodsuckers: The crew are cattle, while you are both shepherd and slaughterhouse.\n\ Crew: Put an end to the undead infestation before the station is overcome!" - +/datum/game_mode/traitor/bros/generate_report() + return "Reports indicate that some of your crew may have toppled statues in the past week, angering the gods and becoming cursed with undeath and a desire for blood. Watch out for crewmembers that seem to shun the light or are found pale and delirious." // Seems to be run by game ONCE, and finds all potential players to be antag. /datum/game_mode/bloodsucker/pre_setup() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index be557148bd..9eaddad5b5 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -23,8 +23,8 @@ while (owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src // Deduct Blood - if (owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA) && !istype(owner.current.loc, /obj/structure/closet/crate/coffin)) - AddBloodVolume(-0.08) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) + if (owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) + AddBloodVolume(-0.09) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) // Heal if (HandleHealing(1)) @@ -154,7 +154,7 @@ description = "I slept poorly in a makeshift coffin during the day.\n" mood_change = -3 timeout = 1000 - + /datum/mood_event/daylight_2 description = "I have been scorched by the unforgiving rays of the sun.\n" mood_change = -6 @@ -175,13 +175,10 @@ if (poweron_masquerade == TRUE || owner.current.AmStaked()) return FALSE - owner.current.adjustStaminaLoss(-5 * (regenRate * 4) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. + owner.current.adjustStaminaLoss(-2 * (regenRate * 4) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-1 * (regenRate * 4) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) - owner.current.setOxyLoss(0) - owner.current.setToxLoss(0) - // No Bleeding if (ishuman(owner.current)) var/mob/living/carbon/human/H = owner.current @@ -364,10 +361,9 @@ /datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin=FALSE) owner.current.stat = UNCONSCIOUS owner.current.fakedeath("bloodsucker") // Come after UNCONSCIOUS or else it fails - //owner.current.update_stat() - ADD_TRAIT(owner.current, TRAIT_NODEATH,"bloodsucker") // Without this, you'll just keep dying while you recover. - ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE,"bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. - ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE,"bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. + ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. // Visuals owner.current.update_sight() owner.current.reload_fullscreen() @@ -380,16 +376,12 @@ /datum/antagonist/bloodsucker/proc/Torpor_End() owner.current.stat = SOFT_CRIT owner.current.cure_fakedeath("bloodsucker") // Come after SOFT_CRIT or else it fails - //owner.current.update_stat() REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. to_chat(owner, "You have recovered from Torpor.") - - - /datum/antagonist/proc/AmFinalDeath() // Standard Antags can be dead OR final death return owner && (owner.current && owner.current.stat >= DEAD || owner.AmFinalDeath()) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index a609a502b3..821df92a19 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -92,10 +92,11 @@ if(!can_be_staked && owner.AmStaked()) if(display_error) to_chat(owner, "You have a stake in your chest! Your powers are useless.") + return FALSE // Incap? if(must_be_capacitated) var/mob/living/L = owner - if (L.incapacitated(TRUE, TRUE) || L.lying && !can_be_immobilized) + if (L.incapacitated(TRUE, TRUE) || L.resting && !can_be_immobilized) if(display_error) to_chat(owner, "Not while you're incapacitated!") return FALSE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index 29af94616f..726eb8c452 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -1,4 +1,4 @@ -#define TIME_BLOODSUCKER_NIGHT 1080 // 12 minutes +#define TIME_BLOODSUCKER_NIGHT 900 // 15 minutes #define TIME_BLOODSUCKER_DAY_WARN 90 // 1.5 minutes #define TIME_BLOODSUCKER_DAY_FINAL_WARN 25 // 25 sec #define TIME_BLOODSUCKER_DAY 60 // 1.5 minutes // 10 is a second, 600 is a minute. diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 6561c51a6e..8b5c8dff46 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -79,6 +79,7 @@ vamp_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
" vamp_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
" vamp_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
" + vamp_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
" to_chat(owner, vamp_greet) owner.current.playsound_local(null, 'sound/bloodsucker/BloodsuckerAlert.ogg', 100, FALSE, pressure_affected = FALSE) @@ -201,7 +202,7 @@ S.brutemod *= 0.5 S.burnmod += 0.2 // <-------------------- Start small, but burn mod increases based on rank! S.coldmod = 0 - S.stunmod *= 0.5 + S.stunmod *= 0.25 S.siemens_coeff *= 0.75 //base electrocution coefficient 1 //S.heatmod += 0.5 // Heat shouldn't affect. Only Fire. //S.punchstunthreshold = 8 //damage at which punches from this race will stun 9 @@ -209,7 +210,6 @@ S.punchdamagehigh += 1 //highest possible punch damage 9 // Clown if(istype(H) && owner.assigned_role == "Clown") - //to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.") H.dna.remove_mutation(CLOWNMUT) to_chat(H, "As a vampiric clown, you are no longer a danger to yourself. Your nature is subdued.") // Physiology @@ -217,7 +217,7 @@ // Language owner.current.grant_language(/datum/language/vampiric) // Soul - owner.current.hellbound = TRUE + //owner.current.hellbound = TRUE Causes wierd stuff owner.hasSoul = FALSE // If false, renders the character unable to sell their soul. owner.isholy = FALSE // is this person a chaplain or admin role allowed to use bibles // Disabilities @@ -256,7 +256,7 @@ // Soul if (owner.soulOwner == owner) // Return soul, if *I* own it. owner.hasSoul = TRUE - owner.current.hellbound = FALSE +//owner.current.hellbound = FALSE datum/antagonist/bloodsucker/proc/RankUp() set waitfor = FALSE diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index 8ec6c72daf..128398a3b0 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -36,7 +36,7 @@ // DONE to_chat(owner, "You have claimed the [claimed] as your place of immortal rest! Your lair is now [lair].") to_chat(owner, "You have learned new construction recipes to improve your lair.") - to_chat(owner, "Bloodsucker Tip: Find new lair recipes in the Structures tab of the Crafting Menu at the bottom of the screen, including the Persuasion Rack for converting crew into Vassals.

") + to_chat(owner, "Bloodsucker Tip: Find new lair recipes in the misc tab of the Crafting Menu at the bottom of the screen, including the Persuasion Rack for converting crew into Vassals.

") RunLair() // Start return TRUE @@ -229,7 +229,7 @@ ///obj/item/stack/packageWrap = 8, ///obj/item/pipe = 2) time = 150 - category = CAT_STRUCTURE + category = CAT_MISC always_availible = TRUE /datum/crafting_recipe/bloodsucker/meatcoffin @@ -240,7 +240,7 @@ reqs = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5, /obj/item/restraints/handcuffs/cable = 1) time = 150 - category = CAT_STRUCTURE + category = CAT_MISC always_availible = TRUE /datum/crafting_recipe/bloodsucker/metalcoffin @@ -250,5 +250,5 @@ /obj/item/screwdriver) reqs = list(/obj/item/stack/sheet/metal = 5) time = 100 - category = CAT_STRUCTURE + category = CAT_MISC always_availible = TRUE diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 08d60caa94..2a4e2b31c6 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -247,12 +247,12 @@ if (bloodsuckerdatum.lair != get_area(src)) to_chat(user, "You may only activate this structure in your lair: [bloodsuckerdatum.lair].") return - switch(alert(user,"Do you wish to afix this structure here?","Secure [src]","Yes", "No")) + switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore","Secure [src]","Yes", "No")) if("Yes") owner = user density = FALSE anchored = TRUE - return + return //No, you cant move this ever again // No One Home if (!has_buckled_mobs()) @@ -463,7 +463,6 @@ if (HAS_TRAIT(target, TRAIT_MINDSHIELD)) to_chat(target, "You give in to the will of your torturer. If they are successful, you will no longer be loyal to the station!") - /obj/structure/bloodsucker/vassalrack/proc/disloyalty_refuse(mob/living/target) // FAILSAFE: Still on the rack? if (!(locate(target) in buckled_mobs)) @@ -525,45 +524,6 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/crafting_recipe/bloodsucker/vassalrack - name = "Persuasion Rack" - //desc = "For converting crewmembers into loyal Vassals." - result = /obj/structure/bloodsucker/vassalrack - tools = list(/obj/item/weldingtool, - ///obj/item/screwdriver, - /obj/item/wrench - ) - reqs = list(/obj/item/stack/sheet/mineral/wood = 3, - /obj/item/stack/sheet/metal = 2, - /obj/item/restraints/handcuffs/cable = 2, - ///obj/item/storage/belt = 1 - ///obj/item/stack/sheet/animalhide = 1, // /obj/item/stack/sheet/leather = 1, - ///obj/item/stack/sheet/plasteel = 5 - ) - //parts = list(/obj/item/storage/belt = 1 - // ) - - time = 150 - category = CAT_STRUCTURE - always_availible = FALSE // Disabled til learned - - -/datum/crafting_recipe/bloodsucker/candelabrum - name = "Candelabrum" - //desc = "For converting crewmembers into loyal Vassals." - result = /obj/structure/bloodsucker/candelabrum - tools = list(/obj/item/weldingtool, - /obj/item/wrench - ) - reqs = list(/obj/item/stack/sheet/metal = 3, - /obj/item/stack/rods = 1, - /obj/item/candle = 1 - ) - time = 100 - category = CAT_STRUCTURE - always_availible = FALSE // Disabled til learned - - // OTHER THINGS TO USE: HUMAN BLOOD. /obj/effect/decal/cleanable/blood diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm index b2b91f8929..63f8838882 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm @@ -36,8 +36,8 @@ while (!AmFinalDeath() && coffin && lair) - // WAit 10 Sec and Repeat - sleep(100) + // WAit 1 min and Repeat + sleep(60) // Coffin Moved SOMEHOW? if (lair != get_area(coffin)) diff --git a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm index a09cc1358c..b5c5c2f265 100644 --- a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm +++ b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm @@ -4,8 +4,8 @@ name = "Brawn"//"Cellular Emporium" desc = "Snap restraints with ease, or deal terrible damage with your bare hands." button_icon_state = "power_strength" - bloodcost = 8 - cooldown = 100 + bloodcost = 10 + cooldown = 600 target_range = 1 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" @@ -75,7 +75,7 @@ "[user] has knocked you down!", null, COMBAT_MESSAGE_RANGE) target.Knockdown( min(5, rand(10, 10 * powerlevel)) ) // Chance of KO - if (rand(5 + powerlevel) >= 5 && target.stat <= UNCONSCIOUS) + if (rand(3 + powerlevel) >= 5 && target.stat <= UNCONSCIOUS) target.Unconscious(40) // Attack! playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1) diff --git a/code/modules/antagonists/bloodsucker/powers/bs_haste.dm b/code/modules/antagonists/bloodsucker/powers/bs_haste.dm index 53db94ef66..c3337eb391 100644 --- a/code/modules/antagonists/bloodsucker/powers/bs_haste.dm +++ b/code/modules/antagonists/bloodsucker/powers/bs_haste.dm @@ -54,7 +54,7 @@ // Did I get knocked down? if (owner && owner.incapacitated(ignore_restraints=TRUE,ignore_grab=TRUE))// owner.incapacitated()) // We're gonna cancel. But am I on the ground? Spin me! - if (user.lying) + if (user.resting) var/send_dir = get_dir(owner, T) new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) owner.spin(10) diff --git a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm index e507b3a14f..4a36431b18 100644 --- a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm +++ b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm @@ -46,7 +46,6 @@ /datum/action/bloodsucker/targeted/lunge/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. - var/mob/living/user = owner var/mob/living/carbon/target = A var/turf/T = get_turf(target) // Clear Vars @@ -55,26 +54,20 @@ var/do_knockdown = !is_A_facing_B(target,owner) || owner.alpha <= 0 || istype(owner.loc, /obj/structure/closet) // CAUSES: Target has their back to me, I'm invisible, or I'm in a Closet // Step One: Heatseek toward Target's Turf + walk_towards(owner, T, 0.1, 10) // NOTE: this runs in the background! to cancel it, you need to use walk(owner.current,0), or give them a new path. - var/safety = 10 - while(get_turf(owner) != T && safety > 0 && !(isliving(target) && target.Adjacent(owner))) - if(owner.incapacitated()) - sleep(1) - safety -- - // Did I get knocked down? - if (owner && owner.incapacitated()) - if (user.lying) - var/send_dir = get_dir(owner, T) - new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) - owner.spin(10) - break - // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination) - if (target.Adjacent(owner)) + if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && owner.resting) + var/send_dir = get_dir(owner, T) + new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) + owner.spin(10) + // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination) + sleep(1) + if(target.Adjacent(owner)) // LEVEL 2: If behind target, mute or unconscious! if (do_knockdown) // && level_current >= 1) target.Knockdown(15 + 10 * level_current,1) // Cancel Walk (we were close enough to contact them) - walk(owner,0) + walk(owner, 0) //target.Paralyze(10,1) target.grabbedby(owner) // Taken from mutations.dm under changelings target.grippedby(owner, instant = TRUE) //instant aggro grab diff --git a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm index fc396dbeea..bd185958d3 100644 --- a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm +++ b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm @@ -53,7 +53,7 @@ to_chat(owner, "Your victim is not [(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))?"alive":"conscious"].") return FALSE // Check: Target has eyes? - if (!target.getorganslot("heart")) + if (!target.getorganslot(ORGAN_SLOT_EYES)) if (display_error) to_chat(owner, "They have no eyes!") return FALSE @@ -77,7 +77,7 @@ to_chat(owner, "You must be facing your victim.") return FALSE // Check: Target facing me? - if (!target.lying && !is_A_facing_B(target,owner)) + if (!target.resting && !is_A_facing_B(target,owner)) if (display_error) to_chat(owner, "Your victim must be facing you to see into your eyes.") return FALSE @@ -91,11 +91,13 @@ var/mob/living/carbon/target = A var/mob/living/user = owner - if (istype(target)) - ADD_TRAIT(target, TRAIT_MUTE, "bloodsucker_mesmerize") + if(istype(target)) + target.Stun(40) //Utterly useless without this, its okay since there are so many checks to go through + target.silent += 40 //Shhhh little lamb - if (do_mob(user, target, 40, 0, TRUE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target))) + if(do_mob(user, target, 40, 0, TRUE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target))) PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN! + ADD_TRAIT(target, TRAIT_MUTE, "bloodsucker_mesmerize") var/power_time = 90 + level_current * 15 to_chat(user, "[target] is fixed in place by your hypnotic gaze.") target.Stun(power_time) @@ -103,12 +105,12 @@ target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. spawn(power_time) - if (istype(target)) + if(istype(target)) target.notransform = FALSE - REMOVE_TRAIT(target, TRAIT_MUTE, "bloodsucker_mesmerize") // They Woke Up! (Notice if within view) - if (istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) ) + if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) ) to_chat(user, "[target] has snapped out of their trance.") + REMOVE_TRAIT(target, TRAIT_MUTE, "bloodsucker_mesmerize") /datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index f310ae3887..0e14f9f5be 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -6,7 +6,6 @@ CAT_WEAPONRY, CAT_ROBOT, CAT_MISC, - CAT_STRUCTURE, CAT_PRIMAL, CAT_FOOD, CAT_CLOTHING) diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm index fdfb959fe6..5a05375933 100644 --- a/code/modules/crafting/recipes/recipes_misc.dm +++ b/code/modules/crafting/recipes/recipes_misc.dm @@ -315,3 +315,41 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/security = 1) category = CAT_MISC + + /datum/crafting_recipe/bloodsucker/vassalrack + name = "Persuasion Rack" + //desc = "For converting crewmembers into loyal Vassals." + result = /obj/structure/bloodsucker/vassalrack + tools = list(/obj/item/weldingtool, + ///obj/item/screwdriver, + /obj/item/wrench + ) + reqs = list(/obj/item/stack/sheet/mineral/wood = 3, + /obj/item/stack/sheet/metal = 2, + /obj/item/restraints/handcuffs/cable = 2, + ///obj/item/storage/belt = 1 + ///obj/item/stack/sheet/animalhide = 1, // /obj/item/stack/sheet/leather = 1, + ///obj/item/stack/sheet/plasteel = 5 + ) + //parts = list(/obj/item/storage/belt = 1 + // ) + + time = 150 + category = CAT_MISC + always_availible = FALSE // Disabled til learned + + + /datum/crafting_recipe/bloodsucker/candelabrum + name = "Candelabrum" + //desc = "For converting crewmembers into loyal Vassals." + result = /obj/structure/bloodsucker/candelabrum + tools = list(/obj/item/weldingtool, + /obj/item/wrench + ) + reqs = list(/obj/item/stack/sheet/metal = 3, + /obj/item/stack/rods = 1, + /obj/item/candle = 1 + ) + time = 100 + category = CAT_MISC + always_availible = FALSE // Disabled til learned diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 8042cf1f90..d893108bcd 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -76,7 +76,7 @@ return amount /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) - if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) // FULPSTATION 5/8/19 - Vamps don't heal naturally. + if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally. return FALSE if(!forced && (status_flags & GODMODE)) return FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 7d568ed510..ff182b19ea 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -44,7 +44,7 @@ C.faction |= "slime" /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely + if(H.stat == DEAD && HAS_TRAIT(src, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for vampires return if(!H.blood_volume) H.blood_volume += 5 diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 5177b5518388af3e26c424507cae1cea2256ce1f..8ea155256cf1f0fe576c5ad6a0e01b8d93454871 100644 GIT binary patch literal 17871 zcmch(AR5Qu92^f*ro)CB%%O#p$;=J~yR&oouCN-6eZBW$#>7-u=y0(_kUezJ&vm3yyd;A1hI45#(+6>-)%xOuLW{A9 z&xnZ}Ls6Gv$)COBBN4tkCLd=mE>GO9qiSG{ZVF5>78a5_=f}q$y6r|N)Ry=oG1_2@ zJ%1Eu^`zc4NFNc6OF7CC599H-|QdH8T7tFnW&1qob!Wo{*@QT4A3p zb>}UO4QCv~n!wK)9mlk1(Fz({mdx+N7VGpUX&tsSyu#c3b>PvD^h87Fs~a9)NG*Rv z;Mr<2Q4a)>a_&k*vTsS{DnFS0adBN%@iB=zM}Gftn#XVe`KC%lO}4{)ciclev%(ic zu@QG`8Kjcc**+ZdNxz>G@9aLW#-z*pqEzu4>caKg=M%+Bb0=M*Cxa8JYVh5`cd*!bTEXeB>sd$rOQFEXL-C203?B-bNw z!$@J_c7D9}oaSL^Gr#e2b#lg{`0|$rEgh_(mzM`FcjcXx6)1|waa}M19kjTKyN55B3Qe{l7b>E6;Ts9M13du`>tm5^~=9 z9lc2|Px&n}x6Ixe>l zvDw3oUeez`(Mgi?(7Cxc^RYm5(PMRVC4PJ7S%`^R@zi@geEVZ+#EZAeQps7_dq2)J z55J{kn`V+=z!`ooB+_Ld+sdaj_g&I+>1FNO(nMGg#B0yHgi}#us7HcGMFPbgJ@7pj zXZ-!FS=yE5%NkA=ZkOZu;|2VeUqE2ZkigV?0R%m4`s*{T@1w6eY!?_ufaj&;p36>e zp7^-x-{H4}iiRYs0oj3-+#+VXsG* z&+uE?>HFZcB@|NzERatjkW_ih(bq9rZtvoC4+OdmQhoOLrBCYitbYK*N+x9w^XVtU z<;Q1fLPJ^Fg3o&)bcORvR2T{;-nG{n72ObQA0tm2Foyb-}+;9 zgI^M9RIIkAVkuLDPS>BT`aYb36Aq>kLql8vwht{~zN?jJ zRi!E$y_?n|R=+)jk(H5d+KQNBJmfn$XdS;)#ug_5X)jTK0yme)x1Atfi>nJs=LqvL z#AUnE`;j&K(jhG!@Tg~5hPb7@SL^uP++UTeh(E;_;w zWgd~p75FnIbFFT5QdbQ2uy(a%O?I`WN*>R@LsXFuVH>`KSH3DZlV4^|Uhj_0u~OS! zBTNxu&CB8T46$7}@PL$K{}RkJ-E}$_diPx0kI_-wi&3t+< zK0WC4ghl&{Jx5|uhIx(+i=q6Y&yj9(#+Off)##IRR9971t@QXf_OQg{$ey&Dh1oPV zzg5OT-b75`#2StYcdxd8j->>2FH_!4Pk61AZF1qI#i)m9q9|SsaU*3IF{q=P=*dAE z?#27lOCC3|lY_w&NqFx%;;6G?HZ?qmyN=U>*RvCy6~MjG8T$-RUCW@R*&UF=ai-Sg zubWStffPyMe=2~EV>wat z)q*jqnqBt(XH9f;?yB-~TBzzrQmKDiG;P>H7y(BknwLK&IOjJoT_G>oa}{*Sro%~j zj;<|qMs8JTX{KV6BlPn6QE5Ko+m*(dNm6(z+4^s0R^97cmM)jdC>*}Nj;)E1DXfXT>8IW`C@XKDHXi; z*Vr6{xYxkpw@orbb*f)=@+Qv^6z;;}*32bJ{hM%@SJhQxYvxCv&mhwvxT+@EK(Z#O zu|}41qIsE+Mlq+^hEw1zX<&*ob~+7`JV2%pk2onO4_7hphqXC^NYpzj4*BYF;TSGK z$o^7%cXvGda302f5YakUGG3Onx0E)x8o^@81J z4Fat<>*va|TXO!1d%_%e1{6I;%{i|@Lxe_7M$BD*-a!p&qq=w#1Ue^0dkNIztsjZc zTe|rGblcgw=@ReO672fvd!xT~hW6jv-M0XNZv6wNU;7jXH_3jHSRKRd1F8~xA_&H+5-6CZ$aZ;6Nrp zoLFI{u7s;YmB-n@np6aE8ZvfURlI7#W{wVL5 zDZd0dvQ_2)y;E}_nnhaiBUG7w>9l?Z8us+nxexu3MZe*{pi!0WSK)U_Sa+A4T?045 zpZS6LEH*e)XRdQ(^<00qHK=Q80&D6F#^Y1KCtv)%_ax^{&fOEYHg(ZFR#O6}AReji6~@M${;qd6|veCLmON0#j)$hw)wiWj zTAZ;rO{G1;hlsr`nQNldL+O*gcnT)Nfn}J8GDvHKQJ#S66o?k{IJQ$aXzV;nV%`Sz1Z_|C-F(UXQXWKjn zXRXo?GA@H05?w+BUJ!l*4l4=Z^*p=jo`3;geTdCn?Pe!kuN9%Dt27O0wb-NemZ#uz zqA57ZMvtNE5$y6ZhMnH6tq8T!XH;t~^XIt&nP%=hh25rf@e0gFNlP#7D64Mzj^Z{Fj_l|uGtQKTnSZ)BtLLrx`2Xvhi`;hmmyeP)=%9ndJXl42&#L!HsBFB6~t3MKjnY4A$U2 z_oOjD@m?~P``Uy*LQK*zwfVdXC>!tuMo2C?HO6fqEM^zEzP^Q?x+ll ztdX~gx%3*7!XMg+8)NxAYX&c0zJebi?!*Y9@#MobV=@ts)6>?D!Om!9D45dU`;=jR za}_*icvf9lYTHfT0jF*dJCw1f(PxGHVEtAWk-HD3W|a21Vq!;LvpuhLZIK(8D9Po+P_tNpGw7LgsS%jC<(wI2o5QU2Y->n-IM$Lbn{PI(zH-$23 zQyYKNla}s*c@B83wr*DV7KGuh>eG-bjw?+ahF2-8Ps%+UOFvR(Z2cXcy7)VSDI3}5 zDX}zLOl9Vs_^oK?mb{MZO`O^=m#g>*`yr){Ql-`g9j|sU$fWG!pgbr@|D;8;eUVkh zD_@k*R&-nH%X*6t|vYFf*p6K;Nhx%d@3n6`ao=i3Eix3d8&!+HF%Sl6>epaY)% zGXJU9o?tTK`9%9?jTQT<@Q+PFrso-*H&tJFy=W~kY5uDzXwN$>gU*D5+NC`%9M>Og zvewjksmBwL_85#PI79g99WV?h&np=TqXI>1`SARI2H^jM9en=;!4CqRkAto}MMWfB zZN`je!(wv8x=D}JnMiWd5OidOKGtAxBgvJZtTE@r4Oy=E%#1S+w2xX-H4J(P3VuE$ z7NhbEVdh`b*Vo6T8pb3%QBpTo=p$EJt}gYe6+>JS?!}|uEyi{TFX*}ZC9Chu<@T+4 zqjQomDzRp~q=-H(`4?ABf?lk1%V8&&^pzhDO zVLwGh@)-qT7i#@m!VzdV%U5>rEjE>Zs2-qp!a$atP)JD7N|sfS~;>-SStORBZp zo~{`kr{onWP<+QHCf;>Ldtb*rqdM~ls&8yubb(%IG*#N2i~C|jZSBOS%#6pF<|eW( zimRa1DQpP8c;m2xaOn?!E=)Da+WoA6DyHSg?6)0&s2c01r;Rkz<)oz@#~PFCf%&BD zaS5=VF7yhu)v! z09;_2kBKu4hQshMF@cB{VoPu(IJY`0n#oZVvxnf{&0&kK{P?b}7SUB_WUYj7Is`%U znYa?c0iJu7t*x1%AaDIxQStNZidXBD3%>zvwF=KD1H4q5eurh)Pv}4|r&gkV4_Fvn zp=%MpKUyUG*{ox!Tg&By2=UynSY@?kgSt)?)+r1hcy~S-gzb!KuU7p!u`xM3lJLxg zmZR5TZ~x#|+sNIvCbj-c_L)!@S6AUvEK*`vr363_^#;s%k-<9m7MPMW=|d)=-vF3x z(?l5m`q2eWahllVmg6@mOo^eP7mIuwY)Q~^UzyUMgnh5;pPc{Wb>~FbFG;CG zKU`;QVORTb=_9;ua4l#h1!Lb?5n^NFwdmS%&?72~z9tZ)>K8C!==I@@3F+G8S}F&( zdOchkT$v8D8B7j8!rw)nzjfX?Gv2pzCF}f0^g{7hHWxhcoO0VnuC4#st+jk;g<$*I zj3P5Z(ZTqn)Rv-vI_v#Zx3B!piYOO_=020xxqsBYMmc@$lW*FXpVhvJk>ni8h)Cdx zhdmM#6)YC<$T2dQ+q)}8{X_ObI!_wL&l7twmkz0OaZ+#Zq$&NQ;u}v>C0_0N4V=JU zon-xBt#VtE7k;&0WZvYjnS-s@lHxj1G-n>VFvr$k+9=A7lGuRW1_TE)3=cj8j6C#? zbu!#qWqs3!^9q1>=f|S|j~e`o+nx2KHnbM>`OtR?JXu;F+a1o^{~h+G_ca|pT_m(e zSI*jLOpXg;(dXV4)BE?f z0uM(&4fIF8a+nYnrjr0X1yQj#J%6!z{?TR;e;fVI-kzH~{Y=5Yk-khaQ{__Z%tLW6BLH#bFvHjt8FEN9GDMnR(- zg}@W8wZw!3yWZ=pcu-}9D0OSmoA+D=WZ`bEwWPt6>b&Zg5)unG;Ddv*w}|CCp(-+a zfAnH=65vrUOhzBOPrU2IZZDJu=fELk9817niAd>A8l&{cYF2TwiF*-vI|-iN%yU?vVORig^dJvVS+x032;jb|CU zuiW6#=x(wugK*$u;UQ8j7q8jLhcAfKEKm3s^Wa$V<3-~eG5f=dU4US?FmT!XJ?N=EPH^p^-`r)aq+KH_U6k`P&Qh~yf6i$pd0HkyP|&3WIn|^|5lu@ z!1vlztGd_8)B)0hNa5U}DfW0=R#C~rA$2|_p z&QER2ZXO52vIU8JE{-c@(u&iSbI)sYB-xwwUAfIX&Ru57sgIvwbN*=FTrx=4U)L&S zcIFBtlFP1b0X5wZQaU|DD>=M6h{>vX^IzIz>NBb|;qz%||FZ~Boz z?D#z0=vh>HLR`}W48S?1Nc}Ri76#+;Hl^kXJz+iAo-?<%qSI8RVoJLFgjy{ZU^EK7 zCeB`dcZ&)!l>Ebc&bPboYv=teNOucKUQg*y>G^ap#aKup)%6GNp zXih!RY4OrJO{FXC>epUmi{7RkEn+-3GMMRB(cfHYhE%__EAwaug}Ao-&EV;mOED4K zlA%3FR>btC1WTo)>i`1qps63unQD>1xJj>UDlNfi2u7Gr-t2c+H$8M=e;ZjhCCZBb zR+W|_UJ^39U1m=N4_6bC#D2(z{d}DcBOtog$2@}!R#fp->abEL^(8u2j-dA-RhT(H zZp=Vbn6RfhS{L$(AUXXb#JX1AL;bgPmw86sbeW;F8g>0^V2Km+>mFZa9ZR=n^OW81 z2rXt76kPgU!apO>LeB_VuF|l*TE#Dk(ryF&RrpgRPbYTSSDTq0mw%Z%6?Oc87F6Db z%i=vc<*)9j3!AFlJY_^Oao)1F{^3LbYut_^9dm8uU*-RG;YkGa&gWEf;(=YPQ}6fF z^NEFJ55Gl>NJYF=TeMA|nBOzRM`Py(hW)AukX=-yskZ(f^!_K}!U<-XYl;CtjvHFw*l zS#zfVC@MI09$G;c1()GBY)(>>z7!4+HNL{H8f%r>079-UNi#h^==aYIk=_l>L~x;Q zr9tE4)A|C7g=rykrY`i7z*|tTnAnQ7KxR2$0!+O(eum>MGpGcCmzRRPV& z!;UAj7U2okcTE4lO^CT7GRN~D4@Q(ZHrgr1uX8_jN3z)hVCUt_mwy}#0|Q$&(deiA z3(R7rVv352eoGOOqCy;UKIMN`KStnVRA%m9x5I}m?hUI+-Gf)(nR{}<|6Z)M;^LkZ zr-g@W(#4+NDJ>AfT~(byi9x1>xjCtrn=~OXAvFf47w|8%1-EB7Uyy%#Z*B0{`3JUm z?M!CQUcSuYf1>Jl($HC19yTeAYH-JB45dizsol77qoB1_p?b!&$;)mmPtybdtlj_A$Qnw^}?!uHUsxMtv$TH4}^s#`o^7mx2CeE*US^9 zs+9Q+V7cV3t_d$ic$$Cyz30uMzEukc2y-o)bBJFs8rZ!7B8ik7S-pF!tRMg}jl!Mm zba=MG5|FBa>aE@5pXO=i5i_u`4$dB5=>zP;iDW}z-685#r9qD<@l89DqjF9CN z@+8LvWaVyZXVjE6Ud>IXHFp1*g`|f|@--JGS0en4nXz_0LjMnU*sxa+?6D5)v0E&P z&nlKXzE$=igB|C5vVF2rYp>}rqf#4^j!xITtp&Ln|6MFc@MX0k-R&WfH160ee;hwtW{gRwt^RE$A@VLD>%$zAl z5V3-Vi_NQ};$8IqLN^DRv@^S6C_^{S;d@dSz;B6&Y`pDiUiF;CzvLq^J5p^K@#k%E z*HWuvyU@DOVhu;1EZH_NZJRo1I|LiQ)byi{iLr1kU4FB{R_nOQ0zx^*yDhLjicC@J z$gL~dbIWlt;6xh^&o&xLGq&R5wDw0L*`{mU^A(84R-Ur+!OH=xfb{AC0$%L#OO8ri z&14hTevU)s-Sk0P>lMJ$ALpRlbP75VT5E7$d$%*wkSyi;`X|2i^P117v?e!kza)0q z5P6vdyxRT9WVPds{EUeVuCS)e2&O1o*rjjOJ5NlQGSI|umatme>7`-1pRQ+96|kDV zx3D7f+p~?TwaR3>Q~8o_&B>6q?sWCD98ZxsJufsE6sHCs?2m;tS6Fo?IasrX3lPQzwT$KH zWC-c(rDv3&E98j#`K|L5Dagl0@eD&_WCu9aOA<9R|X5KOn0oC++&F>BK~BvXfa25s$F$vj z2a>wX2k6SIf(CNVu2A&X5wvd4U-ps4hz(x5t9T`)ZxwIW&~mED`^!n%{`eB+z+Wwc z6V6iu&eO)=ZVDJw9rc;|P=o7wZ#@_Lkwy`>$wra}ioI+mspxuv* zqW<`6Y+B~_)+2qTwhAAUk!r?>uBCVAiQjjXM(Uy1$uQ%9(&nGbP!~UDU|?>bIvTo zs=cDPHkR)sdMV}M)g3=_ZMc7IlWVS#Pm%qi!f4ZxCT6k!kW+~GDKR{Q~)k44_EdYov12PW(7ZSE++@rdw>cb?~N zOngU6g{zq{zG7_(_W=@f9f(pF#tbApSpZzQgUMG z!xhGz*7&mcn|r_S-t(JC4br=O8dN<%eDLpFfO6r!2&S@qjVi0w#35`r-)dKLb(KrY&zh>>7VLN1QTUTc zsIe@aOyPILmcZMxnYlw{E3?IC#csTJ@kb3V)QQU(+o@7?Cu9N!h>YRm{I}C+Or4tP zS>PWO9)F7|V>*(eV_82dz)-$--B#AtY$6ZRu^0AjP~Azi!narZ-cTJ_x$hxs5%iYz z=(qmEa5@EU)st?t|E;nM78$wMT-E~L15>@!3?Rh+9>r{c0QC2#HxpV->apxWKil_` zZ*z$J>tNW>2U?Kw4ng~>>ZmaL?6!~QJT>RP45G~g0IWyXT}Y#u>5xWVJ8>4vRpY-B1qeEd|B`|C*v=Xbjo0S8-M z$fWX3MZ%3f8=X$|QgywVSLRGuoGkd5V+DwSPT(kcdD~#k!#dP~{o~fP5X*Vyu)&j+ zZ;K;2zXyx3EKqr?4x!9bHya%i->b2|JgB)$7&}ulsTuUS<#Z@9g!6Ptk7Mc@P2!Et z*CJi7D;^*+2l@Cp3yZ_0`YD8Sv-?L^8)Gu^@xt2={Om%So{B;onj5Z%b&=VDW9I=F zD5kc6mPhR^LsH)4e7#<$>ILbJTS0us3`&U7Z<7M!213O(kpobc{-Xi0Trs$Y^m_j( zZ&TY#?83P|gGJFC27Y#CZdE?v zC|NUl&?E#6h5DWW0tO=w?U{IN(k(HfsR#Z2&F_sIPTv(RUkpYIIV5=_{eXy;l<*;s z-vB$Ndh1#+173&e_Y$ zzl_DlO3|@`wlV=1;a|mam4@a896KPlh&o}Fy3haaN#S2Z;uOy}Np^_g&y zUOPR$eMh=g0^q4ThKo$#+${+okJu71K7`kyHId zYJ3wuWe?Cg$+H~qcNM@w;+~$KN}_-c6T7N#`~#?rFlR6$ zAMY&<78_O#0EbRcAklZJJE|^`!{o1lI`>P*G^+V3GPr@x?fBomwa13G=~Lpf?f8nX z+CW#`_&|dtIAjYY&*MG=K&h;bFr1 z0_=6ygjJIj0vovsva;^3R0xXM3`BDcCQI$vMUSks0TrmCa9XiJeOM?i^!YU#kpLfVq6k zHt*G^g59>;(BWm*nn@I@siivsq>-!A$&4=|Bdy2TgopB`ICAmz{zg%0>2t=4B2Skj z$82I+)E3*e-+{NREb`X^#_O;SM!)^x3f5a5nW)pj*l!RE@P`tX9g4kRxmpK2^qxk& zN=;2ot^S=}J^aaNzd@x3qX+gohBty!i}KwC%)jwIK-Fkkyo?juAF*aFGX|e9%xWjD z%`A7b!eb9UtRVETY|iE{MTC7BT`bNzYzxf)-ae|E)eyxN$`O#L`t57?gxtt9a=r>vlh048p^7f50wbBOz5-|(!UF@A|N3>7f6p_<_0Fx@er z(9;2p-1tcIGeXL7Ni@fT9A$pqQgdM*ehp}OESWzF9r1f1T8^wt@532~H z-Cq*ktzsUpjR2ejc8vgFe||80PLVVK+mwWu$6n!=S!5y;=jDviqp>gO>Vf|L2A6i4 znwou;mbtmHen}6^&wjw;-mT^eG-d5yEW%4j*y|)FBwndX0SkK))XU17N%lGra_%ny zfDy}GHFy1-b{g8XH8s<|<`m?@)@L&?JQn*~&Cf`u&amnU{7C(X^`o5o3}}P(o!=I8 z??+6!GX%ScuOvP`K4ASL z6887QnRz+qAIzHDH(THpu0e<5JZ5-f&7#Q!=Rt2l;Q&3IT=4*(wfpn$&qSH91T+Vc znrs`5pe9REZj_hc7q*lG>$E@FA?ZYP|A{W?QJQJB!oKMUr4U6V{R)jdR;(pL#+}Kn zI1=2==eoY%9b}?ePi-z!rQ^nD2jhP(EgS3dl<2qvjYd0uch?H0OYng-YjkA#y7Oq(}(Ih ziwf7_Wkh``{&|VDv^74X*y?rru+&w`{5g9gO4eV2jxkHy=D0KYKwv<#Jo#w0+8+rB z=8Iq9%)M6amRN5v4F6$&^~*E7+BbrvB-bj3ux%j(-F=Y~SlFLbe zAVwm;`(ejj&s^u6=Lw2CZhXus@2=J0VYpPfwz)YoN1AC4uvL3~-=kA_6i3fvk+chMbNDz+ck@w@8tlrX z@ND8-JSUSiJN}**ShuxA-2~TU*b)|5uHUKv`$Qs|@R@(3rnPu%%WrC~zQQkZvVAGM z8G|2dc-b183-HQVV+1eiUcB>Kw0$mXXNU;sQ8MsNZpa{tJ_u#yyeXGn_;ii8DU}&O z#IzKj9+g~g8`E_1^H&N=zf}x$L?^deo$Hi_*m>+d5EqLV}$J` z*aO~`7)VEAl;{u#xyJw!UD|Ni-$ii6J5D3`b2y)s>=cBMs}UQ399U=<(FxRM;iTZc2y>0l{?5i2r%s_x@WcKTdCbD z%?r>5p1}h%CvVt#O8;*swl>M=Qt7t#d_eyQuT9X6!?D$ z=6w|*4}M?v(747Aq#m8(=(Jat0jQkl>`wr)5aa!Mz?8N?Wk-m(Tj|Dlw)t;kaW|)R z%-2o@R%4bc-)%ryAzGxHYz8P|*kEJ6~k( zDkp>o$wAD{{#XYCM$^qBUDvUDHrS64)9GfXTvCjdj8N)3g?X#e2i~lV7v$1h{mg9B={?}O8q$tk{>++9) zz@Q7V$ROA!K?jH*bHnidx!_y@<@@u`Uz>;i;h^zWacS6V)@Vu>NTXrV8wm5g0{?K? ziQ-;>bL>1<2Tp&8QfdX57iT#-DeFJZ?gUa*@R^lghe#Q^8J~it^zAf~psIIKJKc`o z&iaV6eQTjs^L*)Ae zDLs(EP@ws{DiN`~3!CIe5AuuXxz=WEnjilfYXM znBeCmvcxu?9TaSw$>gHiYvH~>qKw|Ef=>XscAke*w)W_WlGFPWt_uLFs1y}YTCL(| zlbWMA3MGpVzayKo^h+xE*NS@<2DMl`{!I)N>^Y3*I?Gg|J^mG1yaujzO1rC@|88t+iUl%lH;6^* zh7)iLbhlV(L3PC~*FwxYSS6jRje^>VsM3@|R;?zaA^9nKV#A-g&!CU|o4LI|%*f9@ zV&6JRNPTfo8g$$HRUl6>FjSuZ(auD_Fan3vDc;DQC6O96`az&WATTHWBUf_dtsNIq zXKDuxy8tTh-}G$jDXkG5@JN+Js=g{=qtEl9YLmYx)m`KHGG*hFKqw=~jfrNaw_3b$ zK(4b+!ws&pq{`~n%Q2L4>v#_m&1c)nHBKoL5;K* z>*E%<1VHO7_vdeoPKWSU=UNyOg49?*ZfClK-3MA3-uNqozn}dBie?2`jO!HG@Q)k@ zTm`jV{yR1OA~!FKw6Hy0H=xH9-0o%sU~!ThJqDjgdVFn6HRYB%VnOz)cy#Kg{_Nlw|F#q{BQd*xVf1u#W!j?ZH%M#DRn(TfDGB zK!{nu@f9pi4)*BX3B2y$FrwGE%>IN2R{#85@_e8&+EbGfj-K~_cJ4cHg{zbNcl{9( zlVQi^ph{_I@)7ZBxKctQhm_QyDCISWgsZo2ebyPHdz8nNwvR0td!JY4<$YW(za$g? zpT7FHtr=4eY-*f?eMfGdV%|k};)ynB3p*x@6SzG7wTWkX0#O6zUt5Rr+NiZ-1H1|` z68X$|txWI&wkyQ5XT;M5PylqrPj`x+D%8&>18njRY!4HlzYk7aZ`#;I_azs?#4Kb{zsRV9rmJW0#V_6=A=M9*TOE6^x-TOWi9oT`e7%PUWv#Gf#pL5O{|nea@DGLbzGDJ* z78D%$OKA73(y2fA&*qP&A3zwI+raC+*ncodlQfq>!HQ%dm;clbuzvrNt@^K~?>}1Z zT3!NKOnte`YEnk+7R~t{O zvi#xOpXgy21>}x&tlNlH7dj+v{7@HakorUXnw2MdPcd5ro^i!Zr|oZXqN{LNm3&I! zz74L!QcY@`%=8C1A|GnTzT~#kSt9bO>V>lK+K?!a{fdLwoPE(+>%Ms2zYDo?$@OL7 z(sCEjT_Kp^u&byAzVv`@JZS6ZyJkhMt}{_#VTdWS1mmoz5^w$HSf?aW>(Hvj1P^sz zaqVUWfH@8pa?sI8eiOc^#<0s}CC)oB?d{oI|9Wht{F9{9%mdRa>XRt4#Rd0EK*nLY zsy45XR)TK6S{0OUQ}ISj&TD`4u!n%usv?6PFtxF*+;dSh&buc^96xw<^Tb!p9k{{U zugd$flkWkDY&cgj@3|(!&Q@-0&UY@&w8D_0LWk1df+O7%TI%3y{r&@H~z5;Oe*E^c0)UCsp2P4&E!@u?55(_66&%YY2o`jy`JDEH&c8Cfh z5s^+!n!0%!4Y_vv{8KDc>dE@daedj}?jG9e0K+SC3rS$ZgT!k#a`=T^sS_jmqXXV+ zW5k&_=i7dICx=~gvG^k!aqR(U`SOx)mAn;86qSFdIx@TjtI4r9%}$jc;WNe&qCowe zc`px~2Ntgzm;X*yOq>OO z?*05RB;fs37;UuJeT!Ejz($NgKxL#R?6yB`wYYLC=nD6x+qVCs?!BiJa%Yk6rY(fBMU8JP6C{ICBhd?!&l0GZ)J|YWKq}MIH2oC>hr_cjKwgo6a#l zn3oMwaduyTf=3(7?S|*Ha%gZ@hbg4J2e^q8N+tGgz{$w$U=$elt<~q)tT&F)iL4^o zjOEoeB~&C3$3p$TGt0`S9ko04szk9hs*7Ef@9YF0KM=+$AE9k+QW?h$&xEL?=kuV< zvJD};4u!>l+_U)8B#lh7A~5G^IA_0jXbP17$xBPdst2r3t+;NQqbA9t_;plVG@Y`yg7sxlZxd zmB|8dNNN;OiHfsq9KlN3`$oGx$t~zRy8eTG)Vu6pe~;(#$;8S6=C6J*M@hF ze8yXRQw`s`&70Q1h?lQ^KE;sr*6}^gTOX9n_~qs;Xs3>z6pVXY=T&8GNg zJ(_KT@a+?|4iEpJBz;6P+K z+TZ@ymtFYTxpK=EZ%sRM9LbY1ifHs6d+*QUfx1I;GSxOWy=#PkmlYwmG$98s#PHwa zJU1%NjF%v(8q4nGnG>xNHa8W3y;`3_sg>sZ8%|6y+49{fj>dJpDt_L96=o2UguQU9 z@Joa*cuv04VUCy{9+S8wW#ZgiF=0eDx8H0Y{220mkm9G6_sDPa>#u{~_V_s1a?RD| zX)Uz@u%vS|OAe31bgm>qyY+kqk82hO2vqx7fjaX3yVr4x*uwBNt#iJ5_x`}dIYX0Q zSwA!L&0W*VUxpfdNjI0~&3l_52a&mNlsk;$>3Yov~BTvBR>nXc7Pm$L%QR{w|dVuvMq}6E3Uaw z9~@Vq28sy^7i*KuZ$$6~GF$?c!{1SL-$)S(;Z7a!e%TS!T6Fyo$7>04flnI_+jW1q zQ4*?Am5?@27T&`j#f|M>n!wR_f1t;&=#BgikX4)ntVoRcjhd9JAQfwzXpV7~UX0xa z&ud>jMqK~W*r-+~wr_g{7&KooC!W3{i?I&Im)vtTGN@k~82tI9z`R|Bs;gqr-MUG3 z(mfnMXJ}%#bA|lL0gj)i>!sO^mQ#~pc4eqw8AC}l!!6gj>jAe61h&u?z24uWCU*DF;6uGTs8h3o-v@N%-}&Dpar^^K z{sTx%2JovbmoF}w*#IPRIyh~^{zE^>4)lodfLbZ}Cw{ut(Wuffh3F443dNQRf`%X8 zq~he2#?DTBDWd{yG0lZu=gmE-aYO>3AeM{5$-k)MHutNms~1COCF$`@o1TDu~lYWXE#uxzz04|bGaY6vdl%6Ks=AL41{TlCG-mI^EEkBo6t>~P;Db$()!jOUo zjIH*`{hOduUO}~>DK0yf7^PaOW8&JSm#||0i^0I5@mAvQ?+Dhsuh_pf(>?Pf|O!ja@vx!vGB z4C|WSJ_dyX4)CV{5I!`nJURea+;oWk{Fa(&gb5Zv{G##8cXX zTFpCwN4v0WzGa~Y@=#=WpaT&9`#8XTe&;8pKwb!sx4UB}`^F>x^a; z*+K`_(DX%5^lpCN=xitzgbEICNPSUSGA6Vu@xfuoroG7&8G7y|#j`z4?}zFg_7_s! z>6324lok5=m0GXKXl~!OV?i%j`<`etAao8qM)tjY&&?3$wp0dusPH2iH3h|{n3u1v z!PYZH^6yE=HPyC?bSgZmd~`EjD6W1iyrS}2wQI4O{I9(RiPx4F=~Zw%j@#GlTcJoAGMkg;xPZyW2mc9cXehJ3%9 z9I2+AUisZkwc3;B+1ZowFILz1!%#+V8OzFrCIzqTD9gOKqT9{+ad?G<-KF))7OZ^7 zjqix)FfMFF+^=jYKC{ImnEU(A9pa;;Z^r|qonJ_P$ z1XcdwBt@>P%{do!h0L0iXx2}Std9w8N*=5nmNVexYalc*SQK9(@WLv%REJcU&fZ4$TH!oPKSZOWOdF>g`}aQTzhOt zaJsgFuh?Y6eu+cOuw7u(@HfWRLvm+M(QiUxchYD!%Zjx7;=qwF%+f(tSMzf#KN@3hjuZ|XW-Ow$4B=ou|tXJ;nUlp6s0y-Ue z(OC!2CKFSF;G@U>cKn4;cG+D5c0XQeIHDk5cC_P9kP&aLApN3$+_f5v;*cM1;1~{> z4Y^gXZWHx5;_mhx1J_&Ci~Mhi?UTH29EH+GBs{kN5J@L>?G>7IRmI|(?^#-Y6#4Y{ z4HE(Ah1spD-oiCKcpYPz!A-Sw=(MMU-Lq$nb_xZV0>);)xNK&Tx1ch^! zE%Ge_@Cy}`@CdPFX8P;SH~KECBoQ8{Nb*7}Ldfk)pd9$mvW(i?pJm#|A2_nF`d*D= zOg8zuOwNvAmWV+K?4U9~k)fm#8uKTDsO~LaHTGXuS)>xD)ExGzs+ToO*H!Aq{E;D| z-r}@*kVwtLh_>Benp{({Th2qZDLS30LzeSk8wyTRrVfog26|6Tx0!@fKZy1qF{jb( z80YBrrE!690!SjMg{g1*!F>?u0Z94fv)4Z9TeJR<*P}m<_iQ+{xEMZOPklAQNp$1u z8yknF^qNOnKaUK!_8hDAc#NKFo=+L&1dTHH52}d2-)dsh-3_!wKWHAaKwBFZ77N|| zEl=(E>(0RUD_U(7MJLhSnVTuSA-5{VQ{M%mkT$ZFHaj6UJIcv6W6f&P-S3Y#jk0;I z`_mV!jK_5Oi?)(P2(?0U-?PK2X@{ITEfl zc~Gizij7ecwhxqMrjUVGxcQ9XK7T&?fw8ZsSSd97fr(}^P7r}kR^$TNq17TR(q8uz z36<)vTP)iIrv><|AA3{!%$j0g;DQ5ebT9G(mo-^w-xonI#HLI~*e6pS3Lv=FuocwQ z)KpF~dA)T63qeNy&?gl`@xcQJ9A-jeHzcqV5ePHCZP*V?Y07x#4RE<;ht@ z?Ot!$uU>?i34>pwQ@l-wjbRNN&PV={miv%0hm}c<-_iQO0T0iYGyzfJcP7X1goI1V z)!1TvwWOH?aTDdbk7>hgmpUT34tTh^??fuRK(gcxt~`+uP(B+Zm_AfK+eUUM#m)`> z95^^ZpAJ8Ti*6%$G`;)mZEW`SXYnOxH^4tt_oJEgs?5#d`wJ&*%ALAX$dk$w4)`1R zI47Gbiyy~Q6<;*Y&8oxJSk`rIEMmAO{ao%DPzwBJHI+zALHjPf20ge$A*3-)Q;L*! zeBp<+PNS=l3WUGnP_KW%p$kFyiSFyfj7aVuVWWkjDO$C30}O!v{e);Cpws?IgUaR4 zMAC^hFcQ2{ZQ2csPO<^=jrzyH;OtK&4yyR>-o4vBbW>xx%5MpIG)n=`Ee&wWYCf-o z86%O)+dO~4*XUI6!=`bB%C%{!1bANBGN$*sIGyx9B0)m|-mGa-Kia)I?!A4L__D~- z)weoc`{vITj%;&Ob|;-A{e_B?VvF|r*Kv8Q%8>Hi(0yVDu2`dJY>fO7s73s5uojMl9PHAB=}#e@vkaUJ0>hizN2B;n`i&309GZA6*XVQ7t>wbZts81 zL`&2xmUi71@TDBf{ z=QjY_bPw(@!Oee;GP+xy2>HpDHX*(_n0#cjg5T)wU{}&U{;w8${?(ZGfA4Ez{xKvI zsUwvHx&jJvaiO6Ffhb?KfI#AML{~xcAmSUKpsRPD{I^%i4K_E=3u{jA;@TC3Ix}IRk z!+`VsTmic61AFU0sCSxgw&GMbGTxB~Z0x1kLpUZTwMmC|6E^Km&Nb+#%2Ct(%R4*` zJO^+$xAg;YE3IRU^y)DB91pF8V*#<*gZp)x2D!8eht`>+yj6Ct25u#>1qAMx&CYKT z;76ev5Y5L>v5bw+B|QXF4*1T2X)OOmZXC+n?+YOSsdVO%*bXK4KW|vk1vX^cUVUmQ zM)bK1SNxzD2qeMxRPv7B zd1q8HIs2vLW$GaXP3Vtk%aYm{;{TXSVyR$re@gASP$`DANW3Y>0T=}oC-E;Tc>~2Z zx1709N{Q`z2E1bhxc9I}wW)4(fd4MNS=OY0U2_4YAQc-Ib`ZDDg99hM&kB^O6BNgh__?IbfO z59RrWW`lzB*h;RS&qpSWR;`}Bf|7+R!ko__>xlmS;OU*x;6ljw^o}GrqYpQaoQ2iI zTn^sX^5H7G@`)Nfk8=GxvqhTEeQ9D}%&xdA5+)!k!`bZ0Fx*;7Y!2MCT08cz6I@K* zbS)U$tcgEVyV&}bptnB^gA#rxZAuf;LlQ8+oOOj)y>o^|wnGRQXDR4#W4KNrmE$t2R^6XzREbdvMCc77Sxp23-JBwF{Pgm)}> zreS>MD)GUQkR&h^dLG=4DGe@$02$Ud#@P2vuID(KnzgXE#DGkc(dk$Zdu!=AMzu{T zlSJ*3xgnFqZ8d^n6h_Myvd*hHLK= zI#563cQJk{gZg7S_}1cDI>scr1xLO6o$I7pg2dMT+Wq@PB&di9h7V^*=o#ZfV=S;i zmn&wB)n30og5gF%nH`o@9iwH=*c~jd(Y|Xqh5T8(x$TEv>V60;k!yFO6@!qqTE$mq zsB3A0N$8b+|3B19XZ&@4KL_aH!*vY&n7mawW}{xjMmHQHsnYwMWb6GxlIqF!z3{b6UA=whS1Vg^Gp`yL zq!xRdL(ityyl(g5e)rBGR^GA%K7Hf9_$z?(3sqP6;&PS`lQ(um-zI&B?O;??O1?zm zR@O2H$^LpwjGKL9YjW=-<3hCZKLew@feNLP;7FXk0KKEE2qdTSgvIuWF(Cguur? zIC>##Hq7|gm=W@1{9z2=1{QyeF~+~3lF6Bxnu^B+c0|zsDxn0!IeVdv4c8ORT&B=| z6Dvt2Y#HE#(D=?8V#I(~iRzm3l|*qLN)y}jMSCzx*UN>;q)2r)QgPSS)3dtTvx|KV zshAww86=QWs|L(F?I}%7JF@RsoCVA3HjUfA8THliD??l(HrmlzHB`%{40IrW=I-P_ zebKt7_%K%3VWKPmqA$L&fHJwBSkmXY3p;m+cD(LXx`hD;9NOzt1YIm1g^Rte8)p?s-)bt(R=C^-8+qQ;~jg9}QenVEr z9QikDnSXWKd?qd3*8kdl>Eq2ugbXPSB?%G};rHK!yUd746dOvso;A#E@&5K*K*sN6 zg_v%6A?0sBR_kiGk_B4R}>iNIC245XFPazif? zgLu`2+<|EJL@qglK+Csf$teC$-hkh`jsUo)b=eA=z0=Xd(zr9-(5p0LxCGBes|Kd0 z!vn@?dH%6d>MmIGH>+a7>!(=}SR{Nu2BT~kC<+R4>KBSpdO2?59{KCnFE(Y>B>vGp zF;tO{bV-@2xIuF%{y?)E%gDGG+bXaia&VR$z5_A$)P#PIV{GP9_AA+^`z5jUX4ZT1 z;g6)AM|B zr2ksMqqiKU!S#kqt5uY|&R3;UL+2$&MvX#j)!AB%pONcbBu|ZY3*65tS|d$T_o%ig zo=rW|FE6thO&hRu`W(%W*mAGe-U4Y?=4l~SzS zukk87H|{BP*aG^IUtLFs0zd`3gyV3>=ej(#6xbdcFJopQ?vsYS1b)kZis#i{qlNv( zD^t@9$XsDzq35(?tuhVATOv7Rhm}(7>%B=;c4bCbqiXCd;v2U{^8>@yasxF+n19{T z)11)Tg+llsT7F1Z4|#n*AuY2nnV_5zOE(Q&O3gup| ziys7zWI$L+9}c|uRb1>?*{gs@9TrJgjc^TdV=-tBFY<`Q%mDo4fU3`8n_WJVK%jST z#P&=E3-KEt^i0=p*BJc7j+;H5g4mq~MIi9?&0L2xUKf{SpzfP^J@2q$aqxY3NW;&y zW=}$S|L4)hxc%ww0@q2v`SH!BkP8g>HX{-a&2ZqQRn6F7H^0I8HY86@JB<$JaL}r4 zY-}$gFy5Oi$cn!CwGXqD^XDRV7=wg72ht;~&k@4e(2#T-hpDfr5%sOap4V-a69#KK z@f>Ku%{_z|Lu3zB=*^8UE4P}Ll?~QdUrm2ng|AvMkQoaa6@U4wI2}zTixP#Mj|#wZ zV>($fT_=@;&)39wHj5O?PTALDCT*t4C|!;oml1xWR1;kY?r<9!=*8I){my}W4Yl~K znnzp*UlH=uB;$V#sio%ku~bn(!>Y*R>k~*#0ZZeL$lu{lkHaTw4o#8xfM&Ao&w250 zU-Vch;VEA6Z&GFoT7LdjShy8ZtZgwOCFz)%n+;xbmbC6oe(QLCLG6-9{j-m{Y`Mh8 zUD-u=2G9UZOEt`Xc)T@MA!^_@gO0nGeJv_Myk{pD3&>>0ACuHh9$yz9=0`y!NYW`j zHe{M^epXm7f73$3|AHpz;RQ^vGwo3In+C&-z@gCh0F%#cR!S)=?({T%lCoc~0^;t} zUg`g+RVVLdF@yiJ5v{M$olGeG?5npAsP#R`aED243T&oeSeK5pmD7eaBlzk#bT=Ki z!a+~VU$tbWh`VM*N$)E$x%Udj=IEOT=mLlCGcEt2+JwNB;C>Ukob_Hrl#!iiaS^!) zbaR4R$Yb@@Wn*pu0e#>|=d`&$(4}W&-{dNhXH~Rqt3Qg(@nrpsFuslI^!7BY$11ef z9#$jO)l$w2V3Ar`_geXhkisG&Rwhs1$OSGdKBDF`tay2Gexli5{Oi|Hg_Y<&(K}14 zYY@fu=gQg#uqf4jp;G73vmO-@;gGb8a{;K`YIcgB40< z=(ow0&U$TRvmesU7FnhxzF!;4WpEqp^Rw`(7Im1oo$ii8XFmXL5aVvnHFw1Q{^XH+Cz=N!OJ7$vp~e|iV!&%HGA&>ZhIYrc z?YzwjDJ~%o3L2m|J;oECjSszGQ!eykH``V`nFEZhyft}K>SJ;xhC!EKiwVe8=L0yu za+tnsHucSXyQR1Vy6$8hC%(*0)&ZQ9c3J z)>}<}(HmQcLJ5qlhz0(z7ceeK+m=?1_1LmP92LSQx#r&sa~C*LPu6&>4J~^BlvdB| zEp-+;qnb5p=;geAz(PFRYnuGlVLKZI(B@JO;q z*S6D-r6yy|>In?(2|j~-z~-8$Y)94p5ts|;qd<(yifLVq#^tfu&c~oes+0I?6EjqS z%dyIFT9jil5KDpz;k7)SE^fOcA}C*ZAGw3Y%ETm?4nzldeY{*f9`FIZh^Xj#vzFyZ zt+RPMEq@htY2-#?p~oUmw`t6DjpOhbM|5p0pK@emq+Pmc@qQw;%hIM@)7g5Vo&uW! zwMCg`u>iRSh?4}v;ez~=E{`D+P(PmZ0eQEH?~WT zckGX#yj&u|-y4(gF9A!P(fYy+xsVU{-@d)(&}e?qBXoI@Re0RCkrRlI6ndhlF}YT( z#Uhkbz~y8WRb|>V* zR*Ln_((K+j!Jc+UnBnyN)Betd)sIeu&z{fX({!S%BvppitYFs~_rkHGvW5$FJ_4zc zH`txT!<$;S_rRM_e=nfEf2Tm23+lBdCgN!C`*0g6aO=U^IODs(Q2nEpOgUct!IG0LvxbNhb?qO8fVV+un6Y~A?nw?PD7@O=(qTmI*K`Fcmn{S zYPnL)hN_ZB3g#mtoS2FS^U*5k2Qmyo`-p;sCkBQdUEVU1-V zZg>1hoxCB49#D{0Ij0>|)EAq&$69Q%lNeYH&x#HYY-9(mFD;Ln*ggQGk<-{kOng$b zhGp>1spZ}$Q2;QVMmkzNYnsY88@N5Ie zjAlLd%rD!Vpm%omsmG_3a6<%zJtjTm;a4v~821?$qoWwbWH;P*PnT4mn?|Pym5Rhx z0r+)1_V4GL!wY4 zx3YSSjUUrw&+m@Qhqm5aue6DNeQTSV6FMTb9T8Vu`P;C;duxc)|M>k3J;%mgJ`G@V zTEHO~BwR+qc_@eHwTVg5%F4=s8wyGYaGb3d+1O7q^Hcu95?EJ_!yaH%V;`%hzGH{W zg!dnflxfwAGP}nTrn2-$2L`^gc0^Vt(ua56b>v!{7w!y-VUaGa_Ho1w?wAuq(Qnbk z#qDXl=)~BXAIMA@E-}VAySep*g!uPIQ~K{@&y*rH!2$<^ibhSxcY#`i>ANye{8p;) zTG(>mXF79;U<#876@eC)`s9G>(7t{s%e`rAfA$R&xnUn}rk=PXF+Rm(uAG`+l}hbG z<<=Ta(|OzMv}BVY*mu7R$;HH_AI>^2>MY5-Ni1G|0&-u|FBwRiuHiafb>j=TVEJ{{ z;4$ZGv-TB#;W>^ZNv>{4ExIVliT>!Ac1b}RkufgD`OFf^=77j@zYVrdLi2Ph1Gi)L zhuMKYwhApWZDinB-?zGPW(K42yw9hxxoBaVig)f*VZjy&Nm+WknTRem~L~tmih@ z$L;sY-+8kCacf^$VEo-0Np6D2J(EqpW8bH9#!Y@}87FhY%*u-CK8?ppewe0{L%mY7 zecp^u>(SB|#?1+3_MIl*>YOJyBO5xN;RQR{_8A$3`xjkNQE%uxsP8tf;Viyz*r)-LpiSw0syYcaW_^y-AiNduB>4^tClZa*R4+6U5W;mfR$*yUoZ+V zBLnGah-ZT9_+`hj^woD9VO5uuroRgq=m4kC+Yh>@=7p z43I^>hWSzVi)=Fe`g_O>qQT8=jABlW-Fh`|%}60#55K(c`u5OKWgNO`PI4zOaDCgF z;5q@IXs)Q2do}g8Kk3d42mUNIM}zS`Jr&@Y!@Bm$@0B}i3zBaR4Yt8w7vXASR12qP zpMIEL-E@av6rbHqO07+;^}{z6nRD@%|_+bi2v_y{GqO+3YSi;`mTiX>M+w-V!#1rz|x zLR}_c;1?lB1d=hdBa-5r{XV~1yI@x^Z;@Yk6(skbrZdPr$EQ-J<`cCzsD)PZsiA<_ z*;Yht5yZf=1`*JE@s`k6H`7H5T4urD1GIR`U1fv+suq7|>s+<|V-k8;R;^Rk_80%( zlW~t-{{}g=K~bz$dl5RVz6NU+*#yB%vmnYYwEVH>PXR=Ex(F4<*lg!~ai2f{4M@pn6f?j%$3sp>|uRH=Kcy{oQ(&Lfl4FfVD^#9INNSniJ&dBf-taAf+J%={U$|J_a<5LZzPkLYmhg72 z^zkAsj7NYQ%bsr5A=+l2qhz|?q;3`&|085@J(J7Q6Tor%_lF759wU4COuWi|=ryW( zzXZu;mYXapu~CK6UCQ`hBB8iJ*4brn!vd@F5Z4R7tq8S){0^De9L*#;$!@5ZeilJv zZEL0JaK~sHyu&s-Bsg!Va;HRqHrjqH5CT1;P_;38Pnm3958UOLUyy)6vh2t=*f}Aq zA^<$J6agDFmwz41Xc{x>BOQ>?BR?HfV#{^0sqWq2gpM24bm}D=Z1jDazdms{iQU9J z&JPxhdt?TH!f_DzSApq(tT+hhymJaTWUaHX{RA4;IfFJf=P|_=yps*Vx*;T(6$Rm2 z==Ll)kzjM}tv#9p(>fr49njv+XnaOows`0^2?DXmUB&{SX72k;u!wYokNf8J37V_g z_$u5zurQl4tTP*#GHfwZ?-g3JdDv-RltIj-+iUMmTcvO5e4Z^R;QB}}@=gry+(ev6 zbsy=akxm@2({!Q|+kf_F_PGCJiQrr)pUpGa&$h1daQ}4Tn;usI-t!5q%n%aT7yvJv zwzsXYi=|97E_2?-Ov6~M(jrGyqn@sHSoyCIv&6Ao9JEK@FC}{e%cXWX3HShnF5Cdr zihtv`{0#-*?~r%LRQ}4b%#b(HOCrx?Ew25iZccy_P}Iyp(_Cy0Od9uLN#p}X#6Pm- z-vZ~A--#Y*_N9G0<=ym$oe%7#E^`2C+<)RsomcKSk_3UidDq<_1NoIbv*GU(@0qHq z=t1P;#_f=aY)mpsWQAC^f_79}M zr!46DV*erxLB4nzTEFQG-x&W0K~nwwE|iq2&U3pxyPGdff2W$)zcs}4`K6sLdb2n- zWw|>I)^(CkYFm(oGxERuR4VWx_2ru0gDVJfi}GZPa)acJfw!KX)T5*F>1e{y*7FM> z?H>peCQTKP+iu=UE8cu!`WEFA=9WNWT2TagRni5S`0;JJ#YNuHS`?k!-tnox8SOV= z6|7^MPQ<#4ls2mRAO*P)q@=3kMp1llb9x9dAR)^jOz|#dkYIL)zxLHOwSd7|+STPh z*OlfR+mQ1&kr$=J=1LL&1kid{2OBZQ6sU-vjBEDD#f~dhy&o|9ln1xFIMy zb1$TqP18D_<3J1HS5*`TeX2Jht!&h664rUU7LADO{J`}Fw7T|@-Ju+k+aidP!%j^R zZ(%rgmI@Avii6`h7v!)iCZFRiMx7N@W9{q~qsFg+C};8#bmzVc!IY}{KIev}*i1Ft zuo>>*cK()_nr$QfO>cu>S;Q5RAm-k&qmtj5I~nUM zxKTg$@Gk{_l5p;wXij`=u}5xLhCI-ZsPZjTUpn?BGxwiR^@fSf>xj>+jO z{^hh+&H!uOW2HZcpgH-l#;8i6R*Ni+3vHtjvs804@+1$K{)la^wjXD(j5xxXOyK7O zlF(9f&B>2CPQ@%^hXv(}WZ?Lnc;xYMKE`+!f3-2=A-&~sYF=KR=!s2Nzx(?~9m!t> z*M=8R?;gc`{S9aX>N+}cF%hY$sl68`DCb8pN(j17NnijW74koJ0Mcf>ISX{IE%bIV znw0L^!Pfn&feJ$fvHg-fu2R)jnS6m`hBnn2-mZbX7FABO^(7aIC#+HoCwC(K83Zjt z;yl0Qyr0qGwJ5@zrL3K-G9+!u3S!UEi#F1WZ3s4jDL)~>LM-Vc?N{F&r{`W1@QPKx zHCgU{`SbFfu;I}1jbYlhMb`}9LHTtQ;X1vg8qi?1H=JLam${Z&KsgnF4lm=1MA7AZ zLN)-F->QTjR%~ z=;9Oyu$!??oC>?lY(GsVAfxUVj-fRms&o2oR*cQ%^KC3uwiC`8;_ zC;|LW?Dc$_^FWYlQJwLP1?h9F}2)|E|7J! z4nROC07(52fbjRRkx1pIG{sJ)B|FEM*VQP(W#KNt+2-APL||51tQ!}z=1ihMZ4JfQ z7rHxa6;4L{>gj1+&W0R>cSR+O7KdxbwN9oLUrmdH5e| mu<#_v3}|>B&iEN@#5* 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 S)$&2WpR&Bh%aZ4BKK>8T5L%l6 diff --git a/tgstation.dme b/tgstation.dme index 32af6fb5d0..9219159405 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -25,7 +25,6 @@ #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" -#include "code\__DEFINES\bloodsucker.dm" #include "code\__DEFINES\bsql.config.dm" #include "code\__DEFINES\bsql.dm" #include "code\__DEFINES\callbacks.dm"