From 6b844139604e6f8a2710c79d1654ebb37db0f223 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 28 May 2023 17:27:59 -0700 Subject: [PATCH 01/43] Does The Thing --- code/__DEFINES/anomalies.dm | 64 +++ code/__DEFINES/maths.dm | 11 + code/__DEFINES/mobs.dm | 2 + .../mapgen/planetary/JungleGenerator.dm | 3 +- code/datums/mapgen/planetary/LavaGenerator.dm | 13 +- code/datums/mapgen/planetary/RockGenerator.dm | 23 +- code/datums/mapgen/planetary/SandGenerator.dm | 7 +- code/datums/mapgen/planetary/SnowGenerator.dm | 11 +- code/game/objects/effects/anomalies.dm | 383 ------------------ .../objects/effects/anomalies/_anomalies.dm | 123 ++++++ .../anomalies/anomalies_bioscrambler.dm | 32 ++ .../effects/anomalies/anomalies_bluespace.dm | 104 +++++ .../effects/anomalies/anomalies_flux.dm | 87 ++++ .../effects/anomalies/anomalies_gravity.dm | 87 ++++ .../anomalies/anomalies_hallucination.dm | 47 +++ .../anomalies/anomalies_pyroclastic.dm | 65 +++ .../effects/anomalies/anomalies_vortex.dm | 64 +++ .../game/objects/effects/spawners/lootdrop.dm | 24 ++ code/game/objects/items/body_egg.dm | 2 +- .../antagonists/abductor/equipment/gland.dm | 2 +- .../abductor/equipment/glands/electric.dm | 4 +- .../abductor/equipment/glands/slime.dm | 2 +- code/modules/antagonists/cult/runes.dm | 11 +- .../antagonists/slaughter/slaughter.dm | 2 +- code/modules/assembly/signaler.dm | 24 +- code/modules/disks/disk.dm | 20 +- code/modules/events/anomaly.dm | 50 --- code/modules/events/anomaly_bluespace.dm | 14 - code/modules/events/anomaly_flux.dm | 15 - code/modules/events/anomaly_grav.dm | 26 -- code/modules/events/anomaly_pyro.dm | 14 - code/modules/events/anomaly_vortex.dm | 15 - code/modules/mob/living/brain/brain_item.dm | 4 +- .../modules/mob/living/carbon/alien/organs.dm | 6 +- .../mob/living/carbon/carbon_defense.dm | 47 +++ .../human/species_types/shadowpeople.dm | 4 +- code/modules/research/rdconsole.dm | 14 +- code/modules/surgery/organs/appendix.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 2 +- .../surgery/organs/augments_internal.dm | 2 +- code/modules/surgery/organs/heart.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 6 + code/modules/surgery/organs/stomach.dm | 2 +- code/modules/surgery/organs/tongue.dm | 2 +- code/modules/zombie/organs.dm | 2 +- icons/effects/anomalies.dmi | Bin 0 -> 33018 bytes icons/obj/assemblies/new_assemblies.dmi | Bin 18243 -> 23336 bytes shiptest.dme | 16 +- 48 files changed, 882 insertions(+), 580 deletions(-) create mode 100644 code/__DEFINES/anomalies.dm delete mode 100644 code/game/objects/effects/anomalies.dm create mode 100644 code/game/objects/effects/anomalies/_anomalies.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_bioscrambler.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_bluespace.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_flux.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_gravity.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_hallucination.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_pyroclastic.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_vortex.dm delete mode 100644 code/modules/events/anomaly.dm delete mode 100644 code/modules/events/anomaly_bluespace.dm delete mode 100644 code/modules/events/anomaly_flux.dm delete mode 100644 code/modules/events/anomaly_grav.dm delete mode 100644 code/modules/events/anomaly_pyro.dm delete mode 100644 code/modules/events/anomaly_vortex.dm create mode 100644 icons/effects/anomalies.dmi diff --git a/code/__DEFINES/anomalies.dm b/code/__DEFINES/anomalies.dm new file mode 100644 index 000000000000..e6486ba8b638 --- /dev/null +++ b/code/__DEFINES/anomalies.dm @@ -0,0 +1,64 @@ +// Max amounts of cores you can make +#define MAX_CORES_BLUESPACE 8 +#define MAX_CORES_GRAVITATIONAL 8 +#define MAX_CORES_FLUX 8 +#define MAX_CORES_VORTEX 8 +#define MAX_CORES_PYRO 8 +#define MAX_CORES_HALLUCINATION 8 +#define MAX_CORES_BIOSCRAMBLER 8 +#define MAX_CORES_DIMENSIONAL 8 + +///Defines for the different types of explosion a flux anomaly can have +#define FLUX_NO_EXPLOSION 0 +#define FLUX_EXPLOSIVE 1 +#define FLUX_LOW_EXPLOSIVE 2 + +/// Chance of anomalies moving every process tick +#define ANOMALY_MOVECHANCE 45 + +/// Blacklist of parts which should not appear when bioscrambled, largely because they will make you look totally fucked up +GLOBAL_LIST_INIT(bioscrambler_parts_blacklist, typecacheof(list ( + /obj/item/bodypart/chest/larva, + /obj/item/bodypart/head/larva, + /obj/item/bodypart/leg/left/monkey, + /obj/item/bodypart/leg/right/monkey, + /obj/item/bodypart/head, + /obj/item/bodypart/head/alien, + +))) + +/// Blacklist of organs which should not appear when bioscrambled. +/// Either will look terrible outside of intended host, give you magical powers, are irreversible, or kill you +GLOBAL_LIST_INIT(bioscrambler_organs_blacklist, typecacheof(list ( + /obj/item/organ/ears/invincible, + /obj/item/organ/ears/dullahan, + /obj/item/organ/eyes/dullahan, + /obj/item/organ/heart/cursed, + /obj/item/organ/heart/cursed/wizard, + /obj/item/organ/heart/demon, + /obj/item/organ/heart/cursed, + /obj/item/organ/tongue/golem_honk, //hatred + /obj/item/organ/tongue/uwuspeak,//see last comment + /obj/item/organ/vocal_cords, + /obj/item/organ/vocal_cords/adamantine, + /obj/item/organ/vocal_cords/colossus, + /obj/item/organ/zombie_infection, + /obj/item/organ/brain, + /obj/item/organ/brain/alien, + /obj/item/organ/brain/nightmare, + /obj/item/organ/brain/dullahan, + /obj/item/organ/brain/mmi_holder, + /obj/item/organ/brain/mmi_holder/posibrain, + /obj/item/organ/alien/eggsac, + /obj/item/organ/alien/hivenode, + /obj/item/organ/alien/plasmavessel/large/queen, + /obj/item/organ/alien/plasmavessel/large, + /obj/item/organ/body_egg, + /obj/item/organ/body_egg/alien_embryo, + /obj/item/organ/body_egg/changeling_egg, +))) + +/// List of body parts we can apply to people +GLOBAL_LIST_EMPTY(bioscrambler_valid_parts) +/// List of organs we can apply to people +GLOBAL_LIST_EMPTY(bioscrambler_valid_organs) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 478bf98f0b56..8acc099c583a 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -260,3 +260,14 @@ power++ //Transfer to output, increment power, repeat until the input pile is all used return output + + +/// Converts a probability/second chance to probability/seconds_per_tick chance +/// For example, if you want an event to happen with a 10% per second chance, but your proc only runs every 5 seconds, do `if(prob(100*SPT_PROB_RATE(0.1, 5)))` +#define SPT_PROB_RATE(prob_per_second, seconds_per_tick) (1 - (1 - (prob_per_second)) ** (seconds_per_tick)) + +//make spawners use this -Erika + +/// Like SPT_PROB_RATE but easier to use, simply put `if(SPT_PROB(10, 5))` +#define SPT_PROB(prob_per_second_percent, seconds_per_tick) (prob(100*SPT_PROB_RATE((prob_per_second_percent)/100, (seconds_per_tick)))) +// ) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b561c8394c5b..a9fafe9dc5ab 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -73,6 +73,8 @@ //Bodypart change blocking flags #define BP_BLOCK_CHANGE_SPECIES (1<<0) +#define BODYTYPE_BIOSCRAMBLE_COMPATIBLE (BODYTYPE_HUMANOID) +#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_ROBOTIC) && (bodytype & BODYTYPE_BIOSCRAMBLE_COMPATIBLE)) //Defines for Species IDs #define SPECIES_ABDUCTOR "abductor" diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index b40f26b12a88..f288d03bfbe3 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -180,7 +180,8 @@ feature_spawn_chance = 0.5 feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, - /obj/structure/spawner/ice_moon = 1 + /obj/structure/spawner/ice_moon = 1, + /obj/effect/spawner/lootdrop/anomaly = 1 ) /datum/biome/cave/jungle/dirt diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index 3a6cf4885349..6d7f643a41d4 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -93,7 +93,13 @@ /obj/structure/flora/ash/puce = 5, ) feature_spawn_chance = 0.3 - feature_spawn_list = list(/obj/structure/flora/rock/hell = 5, /obj/structure/elite_tumor = 1, /obj/structure/geyser/random = 1) + feature_spawn_list = list( + /obj/structure/flora/rock/hell = 5, + /obj/structure/elite_tumor = 1, + /obj/structure/geyser/random = 1, + /obj/effect/spawner/lootdrop/anomaly = 1, + /obj/effect/spawner/lootdrop/anomaly/big = 1 + ) mob_spawn_chance = 4 mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, @@ -147,8 +153,9 @@ open_turf_types = list(/turf/open/floor/plating/grass/lava = 50) feature_spawn_chance = 5 feature_spawn_list = list( - /obj/structure/flora/tree/dead/barren = 1, - /obj/structure/flora/tree/dead/tall/grey = 1, + /obj/structure/flora/tree/dead/barren = 50, + /obj/structure/flora/tree/dead/tall/grey = 49, + /obj/effect/spawner/lootdrop/anomaly = 1 ) /datum/biome/lavaland/plains/dense/mixed diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index 29836edc6187..bf113f9861ae 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -83,8 +83,13 @@ /datum/biome/rock open_turf_types = list(/turf/open/floor/plating/asteroid/rockplanet/lit = 1) - feature_spawn_chance = 0.1 - feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/structure/elite_tumor = 2) + feature_spawn_chance = 0.5 + feature_spawn_list = list( + /obj/structure/geyser/random = 2, + /obj/structure/elite_tumor = 1, + /obj/effect/spawner/lootdrop/anomaly = 5, + /obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker + ) flora_spawn_chance = 5 mob_spawn_chance = 3 @@ -105,7 +110,9 @@ ) /datum/biome/rock/icecap - open_turf_types = list(/turf/open/floor/plating/asteroid/snow/lit/rockplanet = 1, /turf/open/floor/plating/asteroid/snow/lit/rockplanet = 5) + open_turf_types = list( + /turf/open/floor/plating/asteroid/snow/lit/rockplanet = 1, + /turf/open/floor/plating/asteroid/snow/lit/rockplanet = 5) flora_spawn_chance = 1 mob_spawn_chance = 2 @@ -138,8 +145,14 @@ /obj/structure/flora/ash/fern = 2, /obj/structure/flora/ash/puce = 1, ) - feature_spawn_chance = 0.3 - feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/structure/elite_tumor = 2, /obj/structure/spawner/ice_moon/rockplanet = 4) + feature_spawn_chance = 0.9 + feature_spawn_list = list( + /obj/structure/geyser/random = 2, + /obj/structure/elite_tumor = 1, + /obj/structure/spawner/ice_moon/rockplanet = 4, + /obj/effect/spawner/lootdrop/anomaly = 3, + /obj/effect/spawner/lootdrop/anomaly/big = 2, + ) mob_spawn_chance = 6 mob_spawn_list = list( /mob/living/simple_animal/hostile/netherworld/asteroid = 20, diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index f165c7159341..68846a776c53 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -90,7 +90,12 @@ /obj/structure/flora/ash/stem_shroom = 4 , ) feature_spawn_chance = 0.1 - feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/structure/elite_tumor = 2) + feature_spawn_list = list( + /obj/structure/geyser/random = 4, + /obj/structure/elite_tumor = 2, + /obj/effect/spawner/lootdrop/anomaly = 4, + /obj/effect/spawner/lootdrop/anomaly/big = 1 + ) mob_spawn_chance = 4 mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index a3383a362842..2dd1516cf73d 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -112,7 +112,8 @@ feature_spawn_list = list( /obj/structure/spawner/ice_moon/demonic_portal = 1, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, - /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1 + /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, + /obj/effect/spawner/lootdrop/anomaly = 1 ) /datum/biome/snow/lush @@ -191,7 +192,9 @@ /obj/structure/spawner/ice_moon/demonic_portal = 1, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, - /obj/structure/spawner/ice_moon/demonic_portal/brimdemon = 1 + /obj/structure/spawner/ice_moon/demonic_portal/brimdemon = 1, + /obj/effect/spawner/lootdrop/anomaly = 1, + /obj/effect/spawner/lootdrop/anomaly/big = 1 ) @@ -234,7 +237,8 @@ /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon = 1, - /obj/structure/spawner/ice_moon/polarbear = 1 + /obj/structure/spawner/ice_moon/polarbear = 1, + /obj/effect/spawner/lootdrop/anomaly = 1 ) /datum/biome/cave/snow/thawed @@ -271,6 +275,7 @@ /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, + /obj/effect/spawner/lootdrop/anomaly = 1 ) /datum/biome/cave/volcanic/lava diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm deleted file mode 100644 index 84dee081a6c8..000000000000 --- a/code/game/objects/effects/anomalies.dm +++ /dev/null @@ -1,383 +0,0 @@ -//Anomalies, used for events. Note that these DO NOT work by themselves; their procs are called by the event datum. - -/obj/effect/anomaly - name = "anomaly" - desc = "A mysterious anomaly, seen commonly only in the far frontier of space..." - icon_state = "bhole3" - density = FALSE - anchored = TRUE - light_range = 3 - var/movechance = 70 - var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly - var/area/impact_area - - var/lifespan = 990 - var/death_time - - var/countdown_colour - var/obj/effect/countdown/anomaly/countdown - -/obj/effect/anomaly/Initialize(mapload, new_lifespan) - . = ..() - GLOB.poi_list |= src - START_PROCESSING(SSobj, src) - impact_area = get_area(src) - - if (!impact_area) - return INITIALIZE_HINT_QDEL - - aSignal = new aSignal(src) - aSignal.code = rand(1,100) - aSignal.anomaly_type = type - - var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) - if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven! - frequency++ - aSignal.set_frequency(frequency) - - if(new_lifespan) - lifespan = new_lifespan - death_time = world.time + lifespan - countdown = new(src) - if(countdown_colour) - countdown.color = countdown_colour - countdown.start() - -/obj/effect/anomaly/process() - anomalyEffect() - if(death_time < world.time) - if(loc) - detonate() - qdel(src) - -/obj/effect/anomaly/Destroy() - GLOB.poi_list.Remove(src) - STOP_PROCESSING(SSobj, src) - qdel(countdown) - return ..() - -/obj/effect/anomaly/proc/anomalyEffect() - if(prob(movechance)) - step(src,pick(GLOB.alldirs)) - -/obj/effect/anomaly/proc/detonate() - return - -/obj/effect/anomaly/ex_act(severity, target) - if(severity == 1) - qdel(src) - -/obj/effect/anomaly/proc/anomalyNeutralize() - new /obj/effect/particle_effect/smoke/bad(loc) - - for(var/atom/movable/O in src) - O.forceMove(drop_location()) - - qdel(src) - - -/obj/effect/anomaly/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_ANALYZER) - to_chat(user, "Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].") - -/////////////////////// - -/obj/effect/anomaly/grav - name = "gravitational anomaly" - icon_state = "shield2" - density = FALSE - var/boing = 0 - aSignal = /obj/item/assembly/signaler/anomaly/grav - -/obj/effect/anomaly/grav/Initialize(mapload, new_lifespan, drops_core) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/anomaly/grav/anomalyEffect() - ..() - boing = 1 - for(var/obj/O in orange(4, src)) - if(!O.anchored) - step_towards(O,src) - for(var/mob/living/M in range(0, src)) - gravShock(M) - for(var/mob/living/M in orange(4, src)) - if(!M.mob_negates_gravity()) - step_towards(M,src) - for(var/obj/O in range(0,src)) - if(!O.anchored) - if(isturf(O.loc)) - var/turf/T = O.loc - if(T.intact && HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) - continue - var/mob/living/target = locate() in view(4,src) - if(target && !target.stat) - O.throw_at(target, 5, 10) - -/obj/effect/anomaly/grav/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - - gravShock(AM) - -/obj/effect/anomaly/grav/Bump(atom/A) - gravShock(A) - -/obj/effect/anomaly/grav/Bumped(atom/movable/AM) - gravShock(AM) - -/obj/effect/anomaly/grav/proc/gravShock(mob/living/A) - if(boing && isliving(A) && !A.stat) - A.Paralyze(40) - var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) - A.throw_at(target, 5, 1) - boing = 0 - -/obj/effect/anomaly/grav/high - var/grav_field - -/obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) - . = ..() - INVOKE_ASYNC(src, .proc/setup_grav_field) - -/obj/effect/anomaly/grav/high/proc/setup_grav_field() - grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = 7, "host" = src, "gravity_value" = rand(0,3))) - -/obj/effect/anomaly/grav/high/Destroy() - QDEL_NULL(grav_field) - . = ..() - -///////////////////// - -/obj/effect/anomaly/flux - name = "flux wave anomaly" - icon_state = "electricity2" - density = TRUE - aSignal = /obj/item/assembly/signaler/anomaly/flux - var/canshock = FALSE - var/shockdamage = 20 - var/explosive = TRUE - -/obj/effect/anomaly/flux/Initialize(mapload, new_lifespan, drops_core = TRUE, _explosive = TRUE) - . = ..() - explosive = _explosive - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - ) - AddElement(/datum/element/connect_loc, loc_connections) - - -/obj/effect/anomaly/flux/anomalyEffect() - ..() - canshock = TRUE - for(var/mob/living/M in range(0, src)) - mobShock(M) - -/obj/effect/anomaly/flux/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - - mobShock(AM) - -/obj/effect/anomaly/flux/Bump(atom/A) - mobShock(A) - -/obj/effect/anomaly/flux/Bumped(atom/movable/AM) - mobShock(AM) - -/obj/effect/anomaly/flux/proc/mobShock(mob/living/M) - if(canshock && istype(M)) - canshock = FALSE - M.electrocute_act(shockdamage, name, flags = SHOCK_NOGLOVES) - -/obj/effect/anomaly/flux/detonate() - if(explosive) - explosion(src, 1, 4, 16, 18) //Low devastation, but hits a lot of stuff. - else - new /obj/effect/particle_effect/sparks(loc) - - -///////////////////// - -/obj/effect/anomaly/bluespace - name = "bluespace anomaly" - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - density = TRUE - aSignal = /obj/item/assembly/signaler/anomaly/bluespace - -/obj/effect/anomaly/bluespace/anomalyEffect() - ..() - for(var/mob/living/M in range(1,src)) - do_teleport(M, locate(M.x, M.y, M.z), 4, channel = TELEPORT_CHANNEL_BLUESPACE) - -/obj/effect/anomaly/bluespace/Bumped(atom/movable/AM) - if(isliving(AM)) - do_teleport(AM, locate(AM.x, AM.y, AM.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE) - -/obj/effect/anomaly/bluespace/detonate() - var/turf/T = pick(get_area_turfs(impact_area)) - if(T) - // Calculate new position (searches through beacons in world) - var/obj/item/beacon/chosen - var/list/possible = list() - for(var/obj/item/beacon/W in GLOB.teleportbeacons) - possible += W - - if(possible.len > 0) - chosen = pick(possible) - - if(chosen) - // Calculate previous position for transition - - var/turf/FROM = T // the turf of origin we're travelling FROM - var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO - - playsound(TO, 'sound/effects/phasein.ogg', 100, TRUE) - priority_announce("Massive bluespace translocation detected.", "Anomaly Alert", zlevel = virtual_z()) - - var/list/flashers = list() - for(var/mob/living/carbon/C in viewers(TO, null)) - if(C.flash_act()) - flashers += C - - var/y_distance = TO.y - FROM.y - var/x_distance = TO.x - FROM.x - for (var/atom/movable/A in urange(12, FROM)) // iterate thru list of mobs in the area - if(istype(A, /obj/item/beacon)) - continue // don't teleport beacons because that's just insanely stupid - if(A.anchored) - continue - - var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place - if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving - A.forceMove(newloc) - - if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect - var/mob/M = A - if(M.client) - INVOKE_ASYNC(src, .proc/blue_effect, M) - -/obj/effect/anomaly/bluespace/proc/blue_effect(mob/M) - var/obj/blueeffect = new /obj(src) - blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" - blueeffect.icon = 'icons/effects/effects.dmi' - blueeffect.icon_state = "shieldsparkles" - blueeffect.layer = FLASH_LAYER - blueeffect.plane = FULLSCREEN_PLANE - blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - M.client.screen += blueeffect - sleep(20) - M.client.screen -= blueeffect - qdel(blueeffect) - -///////////////////// - -/obj/effect/anomaly/pyro - name = "pyroclastic anomaly" - icon_state = "mustard" - var/ticks = 0 - aSignal = /obj/item/assembly/signaler/anomaly/pyro - -/obj/effect/anomaly/pyro/anomalyEffect() - ..() - ticks++ - if(ticks < 25) //WS Edit - Pyroclastic Rebalance - return - else - ticks = 0 - var/turf/open/T = get_turf(src) - if(istype(T)) - T.atmos_spawn_air("o2=5;plasma=5;TEMP=500") //WS Edit - Pyroclastic Rebalance - -/obj/effect/anomaly/pyro/detonate() - INVOKE_ASYNC(src, .proc/makepyroslime) - -/obj/effect/anomaly/pyro/proc/makepyroslime() - var/turf/open/T = get_turf(src) - if(istype(T)) - T.atmos_spawn_air("o2=250;plasma=250;TEMP=700") //WS Edit - Pyroclastic Rebalance - var/new_colour = pick("red", "orange") - var/mob/living/simple_animal/slime/S = new(T, new_colour) - S.rabid = TRUE - S.amount_grown = SLIME_EVOLUTION_THRESHOLD - S.Evolve() - var/datum/action/innate/slime/reproduce/A = new - A.Grant(S) - - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENCE, null, null, 100, S, POLL_IGNORE_PYROSLIME) - if(LAZYLEN(candidates)) - var/mob/dead/observer/chosen = pick(candidates) - S.key = chosen.key - S.mind.special_role = ROLE_PYROCLASTIC_SLIME - var/policy = get_policy(ROLE_PYROCLASTIC_SLIME) - if (policy) - to_chat(S, policy) - log_game("[key_name(S.key)] was made into a slime by pyroclastic anomaly at [AREACOORD(T)].") - -///////////////////// - -/obj/effect/anomaly/bhole - name = "vortex anomaly" - icon_state = "bhole3" - desc = "That's a nice region of spacetime you have there. It'd be a shame if something happened to it." - aSignal = /obj/item/assembly/signaler/anomaly/vortex - -/obj/effect/anomaly/bhole/anomalyEffect() - ..() - if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen - qdel(src) - return - - grav(rand(0,3), rand(2,3), 50, 25) - - //Throwing stuff around! - for(var/obj/O in range(2,src)) - if(O == src) - return //DON'T DELETE YOURSELF GOD DAMN - if(!O.anchored) - var/mob/living/target = locate() in view(4,src) - if(target && !target.stat) - O.throw_at(target, 7, 5) - else - SSexplosions.medobj += O - -/obj/effect/anomaly/bhole/proc/grav(r, ex_act_force, pull_chance, turf_removal_chance) - for(var/t = -r, t < r, t++) - affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) - -/obj/effect/anomaly/bhole/proc/affect_coord(x, y, ex_act_force, pull_chance, turf_removal_chance) - //Get turf at coordinate - var/turf/T = locate(x, y, z) - if(isnull(T)) - return - - //Pulling and/or ex_act-ing movable atoms in that turf - if(prob(pull_chance)) - for(var/obj/O in T.contents) - if(O.anchored) - switch(ex_act_force) - if(EXPLODE_DEVASTATE) - SSexplosions.highobj += O - if(EXPLODE_HEAVY) - SSexplosions.medobj += O - if(EXPLODE_LIGHT) - SSexplosions.lowobj += O - else - step_towards(O,src) - for(var/mob/living/M in T.contents) - step_towards(M,src) - - //Damaging the turf - if(T && prob(turf_removal_chance)) - switch(ex_act_force) - if(EXPLODE_DEVASTATE) - SSexplosions.highturf += T - if(EXPLODE_HEAVY) - SSexplosions.medturf += T - if(EXPLODE_LIGHT) - SSexplosions.lowturf += T diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm new file mode 100644 index 000000000000..7a12ae22e770 --- /dev/null +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -0,0 +1,123 @@ +//Anomalies, used for anomaly events. Anomalies cause adverse effects on their surroundings and can be mitigated by signalling their respective frequency. +/obj/effect/anomaly + name = "anomaly" + desc = "A mysterious anomaly, seen commonly in the Frontier" + icon = 'icons/effects/anomalies.dmi' + icon_state = "vortex" + density = FALSE + anchored = TRUE + light_range = 3 + + var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly + var/area/impact_area + + var/lifespan = null + var/death_time + var/research_value + + var/countdown_colour + var/obj/effect/countdown/anomaly/countdown + + /// Do we drop a core when we're neutralized? + var/drops_core = TRUE + ///Do we keep on living forever? + var/immortal = TRUE + ///Do we stay in one place? + var/immobile = TRUE + +/obj/effect/anomaly/Initialize(mapload, new_lifespan, drops_core = TRUE) + . = ..() + START_PROCESSING(SSobj, src) + impact_area = get_area(src) + + if (!impact_area) + return INITIALIZE_HINT_QDEL + + research_value = rand(500,4000) + + src.drops_core = drops_core + if(aSignal) + aSignal = new aSignal(src) + aSignal.code = rand(1,100) + aSignal.anomaly_type = type + aSignal.research = rand(500,4000) + + var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) + if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven! + frequency++ + aSignal.set_frequency(frequency) + + if(lifespan) + if(new_lifespan) + lifespan = new_lifespan + death_time = world.time + lifespan + countdown = new(src) + if(countdown_colour) + countdown.color = countdown_colour + if(immortal) + return + countdown.start() + +/obj/effect/anomaly/vv_edit_var(vname, vval) + . = ..() + if(vname == NAMEOF(src, immortal)) + if(vval) + countdown.stop() + else + countdown.start() + +/obj/effect/anomaly/process(seconds_per_tick) + anomalyEffect(seconds_per_tick) + if(death_time < world.time && !immortal) + if(loc) + detonate() + qdel(src) + +/obj/effect/anomaly/Destroy() + STOP_PROCESSING(SSobj, src) + QDEL_NULL(countdown) + QDEL_NULL(aSignal) + return ..() + +/obj/effect/anomaly/proc/anomalyEffect(seconds_per_tick) + if(!immobile && SPT_PROB(ANOMALY_MOVECHANCE, seconds_per_tick)) + step(src,pick(GLOB.alldirs)) + +/obj/effect/anomaly/proc/detonate() + return + +/obj/effect/anomaly/ex_act(severity, target) + if(severity >= EXPLODE_DEVASTATE) + qdel(src) + return TRUE + + return FALSE + +/obj/effect/anomaly/proc/anomalyNeutralize() + new /obj/effect/particle_effect/smoke/bad(loc) + + if(drops_core) + if(isnull(aSignal)) + stack_trace("An anomaly ([src]) exists that drops a core, yet has no core!") + else + aSignal.forceMove(drop_location()) + aSignal = null + // else, anomaly core gets deleted by qdel(src). + + qdel(src) + +/obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) + if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) + to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + return TRUE + + return ..() + +///Stabilize an anomaly, letting it stay around forever or untill destabilizes by a player. An anomaly without a core can't be signalled, but can be destabilized +/obj/effect/anomaly/proc/stabilize(anchor = FALSE, has_core = TRUE) + immortal = TRUE + name = (has_core ? "stable " : "hollow ") + name + if(!has_core) + drops_core = FALSE + QDEL_NULL(aSignal) + immobile = anchor diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm new file mode 100644 index 000000000000..0703708f9fe7 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm @@ -0,0 +1,32 @@ + +/obj/effect/anomaly/bioscrambler + name = "bioscrambler anomaly" + icon_state = "bioscrambler" + aSignal = /obj/item/assembly/signaler/anomaly/bioscrambler + immortal = TRUE + /// Cooldown for every anomaly pulse + COOLDOWN_DECLARE(pulse_cooldown) + /// How many seconds between each anomaly pulses + var/pulse_delay = 15 SECONDS + /// Range of the anomaly pulse + var/range = 6 + +/obj/effect/anomaly/bioscrambler/anomalyEffect(seconds_per_tick) + . = ..() + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + for(var/mob/living/carbon/nearby in range(range, src)) + nearby.bioscramble(name) + if (nearby.run_armor_check(attack_flag = "bio") >= 100) + nearby.apply_damage(10, CLONE, spread_damage = TRUE) + +/obj/effect/anomaly/bioscrambler/big + pulse_delay = 10 + range = 10 + +/obj/effect/anomaly/bioscrambler/big/Initialize(mapload, new_lifespan, drops_core) + . = ..() + + transform *= 3 diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm new file mode 100644 index 000000000000..80b4edc19fda --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -0,0 +1,104 @@ + +/obj/effect/anomaly/bluespace + name = "bluespace anomaly" + icon_state = "bluespace" + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/bluespace + ///range from which we can teleport someone + var/teleport_range = 1 + ///Distance we can teleport someone passively + var/teleport_distance = 6 + +/obj/effect/anomaly/bluespace/anomalyEffect() + ..() + for(var/mob/living/M in range(teleport_range,src)) + do_teleport(M, locate(M.x, M.y, M.z), teleport_distance, channel = TELEPORT_CHANNEL_BLUESPACE) + +/obj/effect/anomaly/bluespace/Bumped(atom/movable/AM) + if(isliving(AM)) + do_teleport(AM, locate(AM.x, AM.y, AM.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE) + +/obj/effect/anomaly/bluespace/detonate() + var/turf/T = pick(get_area_turfs(impact_area)) + if(!T) + return + + // Calculate new position (searches through beacons in world) + var/obj/item/beacon/chosen + var/list/possible = list() + for(var/obj/item/beacon/W in GLOB.teleportbeacons) + possible += W + + if(possible.len > 0) + chosen = pick(possible) + + if(!chosen) + return + + // Calculate previous position for transition + var/turf/FROM = T // the turf of origin we're travelling FROM + var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO + + playsound(TO, 'sound/effects/phasein.ogg', 100, TRUE) + priority_announce("Massive bluespace translocation detected.", "Anomaly Alert") + + var/list/flashers = list() + for(var/mob/living/carbon/C in viewers(TO, null)) + if(C.flash_act()) + flashers += C + + var/y_distance = TO.y - FROM.y + var/x_distance = TO.x - FROM.x + for (var/atom/movable/A in urange(12, FROM )) // iterate thru list of mobs in the area + if(istype(A, /obj/item/beacon)) + continue // don't teleport beacons because that's just insanely stupid + if(iscameramob(A)) + continue // Don't mess with AI eye, blob eye, xenobio or advanced cameras + if(A.anchored) + continue + + var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place + if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving + A.forceMove(newloc) + + if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect + var/mob/give_sparkles = A + if(give_sparkles.client) + blue_effect(give_sparkles) + +/obj/effect/anomaly/bluespace/proc/blue_effect(mob/M) + var/obj/blueeffect = new /obj(src) + blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" + blueeffect.icon = 'icons/effects/effects.dmi' + blueeffect.icon_state = "shieldsparkles" + blueeffect.layer = FLASH_LAYER + blueeffect.plane = FULLSCREEN_PLANE + blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + M.client.screen += blueeffect + sleep(20) + M.client.screen -= blueeffect + qdel(blueeffect) + +/obj/effect/anomaly/bluespace/stabilize(anchor, has_core) + . = ..() + + teleport_range = 0 //bumping already teleports, so this just prevents people from being teleported when they don't expect it when interacting with stable bsanoms + +/obj/effect/anomaly/bluespace/big + immortal = TRUE + teleport_range = 2 + teleport_distance = 12 + aSignal = null + +/obj/effect/anomaly/bluespace/big/Initialize(mapload, new_lifespan, drops_core) + . = ..() + + transform *= 3 + +/obj/effect/anomaly/bluespace/big/Bumped(atom/movable/bumpee) + if(iscarbon(bumpee)) + var/mob/living/carbon/carbon = bumpee + carbon.reagents?.add_reagent(/datum/reagent/bluespace, 20) + + if(!isliving(bumpee)) + return ..() diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm new file mode 100644 index 000000000000..ba62dcd0b9b8 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -0,0 +1,87 @@ +/obj/effect/anomaly/flux + name = "flux wave anomaly" + icon_state = "flux" + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/flux + var/canshock = FALSE + var/shockdamage = 20 + var/explosive = FLUX_EXPLOSIVE + var/zap_range = 1 + var/zap_power = 500 + var/zap_flags = ZAP_MOB_DAMAGE + +/obj/effect/anomaly/flux/Initialize(mapload, new_lifespan, drops_core = TRUE, explosive = FLUX_EXPLOSIVE) + . = ..() + src.explosive = explosive + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/anomaly/flux/anomalyEffect() + ..() + canshock = TRUE + for(var/mob/living/Mob in range(0, src)) + mobShock(Mob) + tesla_zap(src, zap_range, zap_power, zap_flags) + +/obj/effect/anomaly/flux/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + mobShock(AM) + tesla_zap(src, zap_range, zap_power, zap_flags) + new /obj/effect/particle_effect/sparks(loc) + +/obj/effect/anomaly/flux/Bump(atom/Atom) + mobShock(Atom) + tesla_zap(src, zap_range, zap_power, zap_flags) + +/obj/effect/anomaly/flux/Bumped(atom/movable/AM) + mobShock(AM) + tesla_zap(src, zap_range, zap_power, zap_flags) + +/obj/effect/anomaly/flux/proc/mobShock(mob/living/Mob) + if(canshock && istype(Mob)) + canshock = FALSE + Mob.electrocute_act(shockdamage, name, flags = SHOCK_NOGLOVES) + +/obj/effect/anomaly/flux/detonate() + switch(explosive) + if(FLUX_EXPLOSIVE) + explosion(src, devastation_range = 1, heavy_impact_range = 4, light_impact_range = 16, flash_range = 18) //Low devastation, but hits a lot of stuff. + if(FLUX_LOW_EXPLOSIVE) + explosion(src, heavy_impact_range = 1, light_impact_range = 4, flash_range = 6) + if(FLUX_NO_EXPLOSION) + new /obj/effect/particle_effect/sparks(loc) + +/obj/effect/anomaly/flux/minor/Initialize(mapload, new_lifespan, drops_core = FALSE, explosive = FLUX_NO_EXPLOSION) + return ..() + + +/obj/effect/anomaly/flux/big + immortal = TRUE + aSignal = null + shockdamage = 30 + + zap_range = 2 + zap_power = 2500 + zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE + +/obj/effect/anomaly/flux/big/Initialize(mapload, new_lifespan, drops_core) + . = ..() + + transform *= 3 + +/obj/effect/anomaly/flux/big/anomalyEffect() + . = ..() + + for(var/mob/living/Mob in range(2, src)) + mobShock(Mob) + tesla_zap(src, zap_range, zap_power, zap_flags) + +/obj/effect/anomaly/flux/big/Bumped(atom/movable/bumpee) + . = ..() + + if(isliving(bumpee)) + var/mob/living/living = bumpee + living.dust() + new /obj/effect/particle_effect/sparks(loc) diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm new file mode 100644 index 000000000000..ad008d940751 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -0,0 +1,87 @@ + +/atom/movable/warp_effect + appearance_flags = PIXEL_SCALE|LONG_GLIDE // no tile bound so you can see it around corners and so + icon = 'icons/effects/light_overlays/light_352.dmi' + icon_state = "light" + pixel_x = -176 + pixel_y = -176 + +/obj/effect/anomaly/grav + name = "gravitational anomaly" + icon_state = "gravity" + density = FALSE + aSignal = /obj/item/assembly/signaler/anomaly/grav + var/boing = 0 + ///Warp effect holder for displacement filter to "pulse" the anomaly + var/atom/movable/warp_effect/warp + +/obj/effect/anomaly/grav/Initialize(mapload, new_lifespan, drops_core) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/anomaly/grav/anomalyEffect() + ..() + boing = 1 + for(var/obj/O in orange(4, src)) + if(!O.anchored) + step_towards(O,src) + for(var/mob/living/M in range(0, src)) + gravShock(M) + for(var/mob/living/M in orange(4, src)) + if(!M.mob_negates_gravity()) + step_towards(M,src) + for(var/obj/O in range(0,src)) + if(!O.anchored) + if(isturf(O.loc)) + var/turf/T = O.loc + if(T.intact && HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) + continue + var/mob/living/target = locate() in view(4,src) + if(target && !target.stat) + O.throw_at(target, 5, 10) + +/obj/effect/anomaly/grav/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + + gravShock(AM) + +/obj/effect/anomaly/grav/Bump(atom/A) + gravShock(A) + +/obj/effect/anomaly/grav/Bumped(atom/movable/AM) + gravShock(AM) + +/obj/effect/anomaly/grav/proc/gravShock(mob/living/A) + if(boing && isliving(A) && !A.stat) + A.Paralyze(40) + var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) + A.throw_at(target, 5, 1) + boing = 0 + +/obj/effect/anomaly/grav/high + var/grav_field + +/obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) + . = ..() + INVOKE_ASYNC(src, .proc/setup_grav_field) + +/obj/effect/anomaly/grav/high/proc/setup_grav_field() + grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = 7, "host" = src, "gravity_value" = rand(0,3))) + +/obj/effect/anomaly/grav/high/Destroy() + QDEL_NULL(grav_field) + . = ..() + +///Bigger, meaner, immortal gravity anomaly. although this is just the super grav anomaly but bigger and shattering move force +/obj/effect/anomaly/grav/high/big + immortal = TRUE + aSignal = null + move_force = MOVE_FORCE_OVERPOWERING + +/obj/effect/anomaly/grav/high/big/Initialize(mapload, new_lifespan, drops_core) + . = ..() + + transform *= 3 diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm new file mode 100644 index 000000000000..243ed694f2af --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -0,0 +1,47 @@ + +/obj/effect/anomaly/hallucination + name = "hallucination anomaly" + icon_state = "hallucination" + aSignal = /obj/item/assembly/signaler/anomaly/hallucination + /// Time passed since the last effect, increased by delta_time of the SSobj + var/ticks = 0 + /// How many seconds between each small hallucination pulses + var/release_delay = 5 + +/obj/effect/anomaly/hallucination/anomalyEffect(delta_time) + . = ..() + ticks += delta_time + if(ticks < release_delay) + return + ticks -= release_delay + var/turf/open/our_turf = get_turf(src) + if(istype(our_turf)) + hallucination_pulse(our_turf, 5) + +/obj/effect/anomaly/hallucination/detonate() + var/turf/open/our_turf = get_turf(src) + if(istype(our_turf)) + hallucination_pulse(our_turf, 10) + +/obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, range) + for(var/mob/living/carbon/human/near in view(location, range)) + // If they are immune to hallucinations. + if (HAS_TRAIT(near, SEE_TURFS) || (near.mind && HAS_TRAIT(near.mind, SEE_TURFS))) + continue + + // Blind people don't get hallucinations. + if (near.is_blind()) + continue + + // Everyone else gets hallucinations. + var/dist = sqrt(1 / max(1, get_dist(near, location))) + near.hallucination += 50 * dist + near.hallucination = clamp(near.hallucination, 0, 150) + var/list/messages = list( + "You feel your conscious mind fall apart!", + "Reality warps around you!", + "Something's wispering around you!", + "You are going insane!", + ) + to_chat(near, span_warning(pick(messages))) + diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm new file mode 100644 index 000000000000..a9598c4d418d --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -0,0 +1,65 @@ + +/obj/effect/anomaly/pyro + name = "pyroclastic anomaly" + icon_state = "pyroclastic" + var/ticks = 0 + /// How many seconds between each gas release + var/releasedelay = 10 + aSignal = /obj/item/assembly/signaler/anomaly/pyro + +/obj/effect/anomaly/pyro/anomalyEffect(seconds_per_tick) + ..() + ticks += seconds_per_tick + if(ticks < releasedelay) + return FALSE + else + ticks -= releasedelay + var/turf/open/tile = get_turf(src) + if(istype(tile)) + tile.atmos_spawn_air("o2=5;plasma=10;TEMP=500") + return TRUE + +/obj/effect/anomaly/pyro/detonate() + INVOKE_ASYNC(src, PROC_REF(makepyroslime)) + +/obj/effect/anomaly/pyro/proc/makepyroslime() + var/turf/open/tile = get_turf(src) + if(istype(tile)) + tile.atmos_spawn_air("o2=250;plasma=750;TEMP=1000") //Make it hot and burny for the new slime + + var/new_colour = pick("red", "orange") + var/mob/living/simple_animal/slime/pyro = new(tile, new_colour) + pyro.rabid = TRUE + pyro.amount_grown = SLIME_EVOLUTION_THRESHOLD + pyro.Evolve() + var/datum/action/innate/slime/reproduce/repro_action = new + repro_action.Grant(pyro) + + +/obj/effect/anomaly/pyro/big + immortal = TRUE + aSignal = null + releasedelay = 2 + move_force = MOVE_FORCE_OVERPOWERING + +/obj/effect/anomaly/pyro/big/Initialize(mapload, new_lifespan, drops_core) + . = ..() + + transform *= 3 + +/obj/effect/anomaly/pyro/big/Bumped(atom/movable/bumpee) + . = ..() + + if(isliving(bumpee)) + var/mob/living/living = bumpee + living.dust() + +/obj/effect/anomaly/pyro/big/anomalyEffect(seconds_per_tick) + . = ..() + + if(!.) + return + + var/turf/turf = get_turf(src) + if(!isgroundlessturf(turf)) + turf.TerraformTurf(/turf/open/lava/smooth, flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm new file mode 100644 index 000000000000..2f4a28ee44c1 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm @@ -0,0 +1,64 @@ + +/obj/effect/anomaly/vortex + name = "vortex anomaly" + icon_state = "vortex" + desc = "That's a nice station you have there. It'd be a shame if something happened to it." + aSignal = /obj/item/assembly/signaler/anomaly/vortex + +/obj/effect/anomaly/vortex/anomalyEffect() + ..() + if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen + qdel(src) + return + + grav(rand(0,3), rand(2,3), 50, 25) + + //Throwing stuff around! + for(var/obj/O in range(2,src)) + if(O == src) + return //DON'T DELETE YOURSELF GOD DAMN + if(!O.anchored) + var/mob/living/target = locate() in view(4,src) + if(target && !target.stat) + O.throw_at(target, 7, 5) + else + SSexplosions.medobj += O + +/obj/effect/anomaly/vortex/proc/grav(r, ex_act_force, pull_chance, turf_removal_chance) + for(var/t = -r, t < r, t++) + affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) + +/obj/effect/anomaly/vortex/proc/affect_coord(x, y, ex_act_force, pull_chance, turf_removal_chance) + //Get turf at coordinate + var/turf/T = locate(x, y, z) + if(isnull(T)) + return + + //Pulling and/or ex_act-ing movable atoms in that turf + if(prob(pull_chance)) + for(var/obj/O in T.contents) + if(O.anchored) + switch(ex_act_force) + if(EXPLODE_DEVASTATE) + SSexplosions.highobj += O + if(EXPLODE_HEAVY) + SSexplosions.medobj += O + if(EXPLODE_LIGHT) + SSexplosions.lowobj += O + else + step_towards(O,src) + for(var/mob/living/M in T.contents) + step_towards(M,src) + + //Damaging the turf + if( T && prob(turf_removal_chance) ) + switch(ex_act_force) + if(EXPLODE_DEVASTATE) + SSexplosions.highturf += T + if(EXPLODE_HEAVY) + SSexplosions.medturf += T + if(EXPLODE_LIGHT) + SSexplosions.lowturf += T diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index f798e7452e49..b2b658001eda 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -803,3 +803,27 @@ /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/sparsegrass) lootcount = 1 + +/obj/effect/spawner/lootdrop/anomaly + name = "random anomaly spawner" + loot = list( + /obj/effect/anomaly/bioscrambler, + /obj/effect/anomaly/bluespace, + /obj/effect/anomaly/flux, + /obj/effect/anomaly/grav, + /obj/effect/anomaly/hallucination, + /obj/effect/anomaly/pyro, + /obj/effect/anomaly/vortex, + /obj/effect/anomaly/grav/high + ) + +/obj/effect/spawner/lootdrop/anomaly/big + name = "random big anomaly spawner" + loot = list( + /obj/effect/anomaly/bioscrambler/big, + /obj/effect/anomaly/bluespace/big, + /obj/effect/anomaly/flux/big, + /obj/effect/anomaly/grav/high/big, + /obj/effect/anomaly/pyro/big + + ) diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index cc4fd287c8b7..a02604db9680 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -14,7 +14,7 @@ if(iscarbon(loc)) Insert(loc) -/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune") diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 067d3d563ed7..13827e03912c 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -82,7 +82,7 @@ clear_mind_control() ..() -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(special != 2 && uses) // Special 2 means abductor surgery Start() diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index 41a545b851a7..da2a3172b44a 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -7,11 +7,11 @@ mind_control_uses = 2 mind_control_duration = 900 -/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") -/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0, drop_if_replaced) REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 30a13107595e..2857c1ab5e99 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -7,7 +7,7 @@ mind_control_uses = 1 mind_control_duration = 2400 -/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() owner.faction |= "slime" owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 4e68c4bf7fd8..acce4799bf77 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1019,16 +1019,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(51 to 60) var/datum/round_event_control/spider_infestation/SI = new() SI.runEvent() - if(61 to 70) - var/datum/round_event_control/anomaly/anomaly_flux/AF - var/datum/round_event_control/anomaly/anomaly_grav/AG - var/datum/round_event_control/anomaly/anomaly_pyro/AP - var/datum/round_event_control/anomaly/anomaly_vortex/AV - AF.runEvent() - AG.runEvent() - AP.runEvent() - AV.runEvent() - if(71 to 80) + if(61 to 80) var/datum/round_event_control/spacevine/SV = new() var/datum/round_event_control/grey_tide/GT = new() SV.runEvent() diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 3751279f095e..2929b2f2d865 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -100,7 +100,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E -/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(M.mind) M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index e745323efc0a..de1376f1416f 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -185,6 +185,7 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' resistance_flags = FIRE_PROOF var/anomaly_type = /obj/effect/anomaly + var/research /obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) if(!signal) @@ -193,8 +194,8 @@ return FALSE if(suicider) manual_suicide(suicider) - for(var/obj/effect/anomaly/A in get_turf(src)) - A.anomalyNeutralize() + for(var/obj/effect/anomaly/Anomaly in get_turf(src)) + Anomaly.anomalyNeutralize() return TRUE /obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user) @@ -208,7 +209,10 @@ to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].") ..() + + //Anomaly cores + /obj/item/assembly/signaler/anomaly/pyro name = "\improper pyroclastic anomaly core" desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research." @@ -237,7 +241,21 @@ name = "\improper vortex anomaly core" desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research." icon_state = "vortex core" - anomaly_type = /obj/effect/anomaly/bhole + anomaly_type = /obj/effect/anomaly/vortex + +/obj/item/assembly/signaler/anomaly/hallucination + name = "\improper hallucination anomaly core" + desc = "The neutralized core of a hallucination anomaly. It seems to be moving, but it's probably your imagination. It'd probably be valuable for research." + icon_state = "hallucination_core" + anomaly_type = /obj/effect/anomaly/hallucination + +/obj/item/assembly/signaler/anomaly/bioscrambler + name = "\improper delimber anomaly core" + desc = "The neutralized core of a delimber anomaly. It's squirming, as if moving. It'd probably be valuable for research." + icon_state = "delimber_core" + anomaly_type = /obj/effect/anomaly/bioscrambler + + /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/disks/disk.dm b/code/modules/disks/disk.dm index 5e16d48c3dc0..9d2f4aac8232 100644 --- a/code/modules/disks/disk.dm +++ b/code/modules/disks/disk.dm @@ -56,14 +56,16 @@ writing.appearance_flags = RESET_COLOR . += writing -/obj/item/disk/attackby(obj/item/pen, mob/user, params) - if(!user.is_literate()) - to_chat(user, "You scribble illegibly on the cover of [src]!") - return - var/inputvalue = stripped_input(user, "What would you like to label the Disk?", "Disk Labelling", "", MAX_NAME_LEN) +/obj/item/disk/attackby(obj/item/object, mob/user, params) + if(istype(object, /obj/item/pen)) + if(!user.is_literate()) + to_chat(user, "You scribble illegibly on the cover of [src]!") + return + var/inputvalue = stripped_input(user, "What would you like to label the Disk?", "Disk Labelling", "", MAX_NAME_LEN) - if(!inputvalue) - return + if(!inputvalue) + return - if(user.canUseTopic(src, BE_CLOSE)) - name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]" + if(user.canUseTopic(src, BE_CLOSE)) + name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]" + return diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm deleted file mode 100644 index e4306e8ec4a6..000000000000 --- a/code/modules/events/anomaly.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/round_event_control/anomaly - name = "Anomaly: Energetic Flux" - typepath = /datum/round_event/anomaly - - min_players = 1 - max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun. - weight = 15 - -/datum/round_event/anomaly - var/area/impact_area - var/obj/effect/anomaly/anomaly_path = /obj/effect/anomaly/flux - announceWhen = 1 - - -/datum/round_event/anomaly/proc/findEventArea() - var/static/list/allowed_areas - if(!allowed_areas) - //Places that shouldn't explode - var/list/safe_area_types = typecacheof(list( - /area/ship/science/ai_chamber, - /area/ship/engineering, - /area/ship/maintenance) - ) - - //Subtypes from the above that actually should explode. - var/list/unsafe_area_subtypes = typecacheof(list()) - - allowed_areas = make_associative(typesof(/area/ship)) - safe_area_types + unsafe_area_subtypes - var/list/possible_areas = typecache_filter_list(GLOB.sortedAreas,allowed_areas) - if (length(possible_areas)) - return pick(possible_areas) - -/datum/round_event/anomaly/setup() - impact_area = findEventArea() - if(!impact_area) - CRASH("No valid areas for anomaly found.") - var/list/turf_test = get_area_turfs(impact_area) - if(!turf_test.len) - CRASH("Anomaly : No valid turfs found for [impact_area] - [impact_area.type]") - -/datum/round_event/anomaly/announce(fake) - priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert", zlevel = impact_area.virtual_z()) - -/datum/round_event/anomaly/start() - var/turf/T = pick(get_area_turfs(impact_area)) - var/newAnomaly - if(T) - newAnomaly = new anomaly_path(T) - if (newAnomaly) - announce_to_ghosts(newAnomaly) diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm deleted file mode 100644 index 78ed91c9c8fe..000000000000 --- a/code/modules/events/anomaly_bluespace.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_bluespace - name = "Anomaly: Bluespace" - typepath = /datum/round_event/anomaly/anomaly_bluespace - - max_occurrences = 1 - weight = 15 - -/datum/round_event/anomaly/anomaly_bluespace - startWhen = 3 - announceWhen = 10 - anomaly_path = /obj/effect/anomaly/bluespace - -/datum/round_event/anomaly/anomaly_bluespace/announce(fake) - priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", zlevel = impact_area.virtual_z()) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm deleted file mode 100644 index e8691e03e4fe..000000000000 --- a/code/modules/events/anomaly_flux.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_flux - name = "Anomaly: Hyper-Energetic Flux" - typepath = /datum/round_event/anomaly/anomaly_flux - - min_players = 10 - max_occurrences = 5 - weight = 20 - -/datum/round_event/anomaly/anomaly_flux - startWhen = 10 - announceWhen = 3 - anomaly_path = /obj/effect/anomaly/flux - -/datum/round_event/anomaly/anomaly_flux/announce(fake) - priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", zlevel = impact_area.virtual_z()) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm deleted file mode 100644 index 27e50dd45c9b..000000000000 --- a/code/modules/events/anomaly_grav.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_grav - name = "Anomaly: Gravitational" - typepath = /datum/round_event/anomaly/anomaly_grav - - max_occurrences = 5 - weight = 25 - -/datum/round_event/anomaly/anomaly_grav - startWhen = 3 - announceWhen = 20 - anomaly_path = /obj/effect/anomaly/grav - -/datum/round_event_control/anomaly/anomaly_grav/high - name = "Anomaly: Gravitational (High Intensity)" - typepath = /datum/round_event/anomaly/anomaly_grav/high - weight = 15 - max_occurrences = 1 - earliest_start = 20 MINUTES - -/datum/round_event/anomaly/anomaly_grav/high - startWhen = 3 - announceWhen = 20 - anomaly_path = /obj/effect/anomaly/grav/high - -/datum/round_event/anomaly/anomaly_grav/announce(fake) - priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", zlevel = impact_area.virtual_z()) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm deleted file mode 100644 index 49d62899e8cc..000000000000 --- a/code/modules/events/anomaly_pyro.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_pyro - name = "Anomaly: Pyroclastic" - typepath = /datum/round_event/anomaly/anomaly_pyro - - max_occurrences = 5 - weight = 15 //WS Edit - Pyroclastic Rebalance - -/datum/round_event/anomaly/anomaly_pyro - startWhen = 3 - announceWhen = 10 - anomaly_path = /obj/effect/anomaly/pyro - -/datum/round_event/anomaly/anomaly_pyro/announce(fake) - priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", zlevel = impact_area.virtual_z()) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm deleted file mode 100644 index f14c7d4dc134..000000000000 --- a/code/modules/events/anomaly_vortex.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_vortex - name = "Anomaly: Vortex" - typepath = /datum/round_event/anomaly/anomaly_vortex - - min_players = 20 - max_occurrences = 2 - weight = 10 - -/datum/round_event/anomaly/anomaly_vortex - startWhen = 10 - announceWhen = 3 - anomaly_path = /obj/effect/anomaly/bhole - -/datum/round_event/anomaly/anomaly_vortex/announce(fake) - priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert", zlevel = impact_area.virtual_z()) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 7dd5d1ed4740..2fe7e281557a 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -26,7 +26,7 @@ var/list/datum/brain_trauma/traumas = list() -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) +/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE, drop_if_replaced) ..() name = "brain" @@ -254,7 +254,7 @@ QDEL_NULL(stored_mmi) return ..() -/obj/item/organ/brain/mmi_holder/Insert(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) +/obj/item/organ/brain/mmi_holder/Insert(mob/living/carbon/C, special = 0, no_id_transfer = FALSE, drop_if_replaced) if(special) return ..() if(!stored_mmi) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 33e8cb7ab708..1b2e85bc999b 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -14,7 +14,7 @@ QDEL_LIST(alien_powers) return ..() -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() for(var/obj/effect/proc_holder/alien/P in alien_powers) M.AddAbility(P) @@ -83,7 +83,7 @@ else owner.adjustPlasma(plasma_rate * 0.1) -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(isalien(M)) var/mob/living/carbon/alien/A = M @@ -106,7 +106,7 @@ var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active. alien_powers = list(/obj/effect/proc_holder/alien/whisper) -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() M.faction |= ROLE_ALIEN ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune") diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index a99baf1baf54..66f29659a10a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -627,3 +627,50 @@ ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) else if(getOxyLoss() <= 50) REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) + +/// Randomise a body part and organ of this mob +/mob/living/carbon/proc/bioscramble(scramble_source) + if (run_armor_check(attack_flag = "bio", absorb_text = "Your armor protects you from [scramble_source]!") >= 100) + return FALSE + + if (!length(GLOB.bioscrambler_valid_organs) || !length(GLOB.bioscrambler_valid_parts)) + init_bioscrambler_lists() + + var/changed_something = FALSE + var/obj/item/organ/new_organ = pick(GLOB.bioscrambler_valid_organs) + var/obj/item/organ/replaced = getorganslot(initial(new_organ.slot)) + if (!(replaced?.organ_flags & ORGAN_SYNTHETIC)) + changed_something = TRUE + new_organ = new new_organ() + new_organ.replace_into(src) + + var/obj/item/bodypart/new_part = pick(GLOB.bioscrambler_valid_parts) + var/obj/item/bodypart/picked_user_part = get_bodypart(initial(new_part.body_zone)) + if (picked_user_part && BODYTYPE_CAN_BE_BIOSCRAMBLED(picked_user_part.bodytype)) + changed_something = TRUE + new_part = new new_part() + new_part.replace_limb(src, special = TRUE) + if (picked_user_part) + qdel(picked_user_part) + + if (!changed_something) + to_chat(src, span_notice("Your augmented body protects you from [scramble_source]!")) + return FALSE + update_body(TRUE) + return TRUE + +/// Fill in the lists of things we can bioscramble into people +/mob/living/carbon/proc/init_bioscrambler_lists() + var/list/body_parts = typesof(/obj/item/bodypart/chest) + typesof(/obj/item/bodypart/head) + subtypesof(/obj/item/bodypart/l_arm) + subtypesof(/obj/item/bodypart/r_arm) + subtypesof(/obj/item/bodypart/leg/left) + subtypesof(/obj/item/bodypart/leg/right) + for (var/obj/item/bodypart/part as anything in body_parts) + if (!is_type_in_typecache(part, GLOB.bioscrambler_parts_blacklist) && BODYTYPE_CAN_BE_BIOSCRAMBLED(initial(part.bodytype))) + continue + body_parts -= part + GLOB.bioscrambler_valid_parts = body_parts + + var/list/organs = subtypesof(/obj/item/organ) + for (var/obj/item/organ/organ_type as anything in organs) + if (!is_type_in_typecache(organ_type, GLOB.bioscrambler_organs_blacklist) && !(initial(organ_type.organ_flags) & ORGAN_SYNTHETIC)) + continue + organs -= organ_type + GLOB.bioscrambler_valid_organs = organs diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index eb2663309517..d8df69779970 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -78,7 +78,7 @@ icon_state = "brain-x-d" var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk -/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(M.dna.species.id != "nightmare") M.set_species(/datum/species/shadow/nightmare) @@ -124,7 +124,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 27d974f0fb29..a214ffebbc8b 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -155,7 +155,7 @@ Nothing else in the console has ID requirements. return else playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("You insert [E] into a slot on the [src], producting [E.research] points from the plant's genetic makeup!") + visible_message("[user] inserts [E] into a slot on the [src], producting [E.research] points from the plant's genetic makeup!") stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = E.research)) plant_already_researched[E.type] = TRUE qdel(D) @@ -164,6 +164,18 @@ Nothing else in the console has ID requirements. visible_message("[src] buzzes and displays a message: Genetic data already researched!") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) return + if(istype(D, /obj/item/assembly/signaler/anomaly)) + + var/obj/item/assembly/signaler/anomaly/anomaly = D + if(!stored_research) + visible_message("Warning: No Linked Server!") + return + + playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) + visible_message("[user] inserts [anomaly] into a slot on the [src], producting [anomaly.research] points!") + stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = anomaly.research)) + qdel(anomaly) + return if(istype(D, /obj/item/research_notes)) if(!stored_research) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 8945bac15073..7a542ff565b3 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -38,7 +38,7 @@ update_icon() ..() -/obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(inflamed) M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index ac97a692be41..58a35593f8cb 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -129,7 +129,7 @@ var/on = FALSE var/datum/effect_system/trail_follow/ion/ion_trail -/obj/item/organ/cyberimp/chest/thrusters/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/cyberimp/chest/thrusters/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) . = ..() if(!ion_trail) ion_trail = new diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index a7a383927b0e..6658a8aa6ec7 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -113,7 +113,7 @@ . = ..() UnregisterSignal(M, signalCache) -/obj/item/organ/cyberimp/brain/anti_stun/Insert() +/obj/item/organ/cyberimp/brain/anti_stun/Insert(special = 0, drop_if_replaced) . = ..() RegisterSignal(owner, signalCache, .proc/on_signal) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 2c7a1a508605..7195484cd1e9 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -136,7 +136,7 @@ else last_pump = world.time //lets be extra fair *sigh* -/obj/item/organ/heart/cursed/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/cursed/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if(owner) to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!") diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 637b48283c18..c0ac47d0302b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -45,6 +45,8 @@ ///When you take a bite you cant jam it in for surgery anymore. /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) + SHOULD_CALL_PARENT(TRUE) + if(!iscarbon(M) || owner == M) return @@ -228,3 +230,7 @@ */ /obj/item/organ/proc/get_availability(datum/species/S) return TRUE + +/// Tries to replace the existing organ on the passed mob with this one, with special handling for replacing a brain without ghosting target +/obj/item/organ/proc/replace_into(mob/living/carbon/new_owner) + Insert(new_owner, special = TRUE, drop_if_replaced = FALSE) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 615428d962b5..37e117fcea09 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -107,7 +107,7 @@ ..() adjust_charge(-ETHEREAL_CHARGE_FACTOR) -/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 58a015c4c6b6..83338d76b13a 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -31,7 +31,7 @@ /obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) -/obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) ..() if (modifies_speech) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 34397a98c888..3e1b46cc2e05 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -23,7 +23,7 @@ GLOB.zombie_infection_list -= src . = ..() -/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) . = ..() START_PROCESSING(SSobj, src) diff --git a/icons/effects/anomalies.dmi b/icons/effects/anomalies.dmi new file mode 100644 index 0000000000000000000000000000000000000000..27e28ccb61f57e3e26709776fd24a455823dfd19 GIT binary patch literal 33018 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 literal 0 HcmV?d00001 diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index adb0b69c590a58a98d3f21aa31a47511f421e9eb..12f4a068582b53472148ad921461d19cfc7f06eb 100644 GIT binary patch literal 23336 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�=MI{4S=*AvaK+a)cl(P8%O!0g8u*O19(!erH{#*? zQ>HkmaWucFNk9#~Dvm-)Qt~p(Y$=?MQ7@*_h|y|1V-%up+>LqOvfu)zsF~k95@4)eY~S&nR7| z-dLhUh{D}}SWx%<)w<1%6N^mM@~TsY)p7O9iyQua#ntY8X4>Ge*av)y%gTN5;YcWoq4S*Fiyx3GGi>iO3b9id><7&gP&%K3T0rVO z5!dc&noj+o{_aE1Z#J|kqw`;9GyK9_@PpFIpQp}~BS6#50molxfbykcm8jKdDbhoY zn2oxPtHz->6soElNGV`NGhXPtiSxZS<{qOlmC=sb6~^tzj}<-_Z_4W5fIh0bh2O=A_qpB?zDX)#UTWUF4-dY^ zC|aQ~oo5B-CqPy%x-nc}M!mvZ>9ThwOmj<1AJo*;($}70?a5_*o~Tsit$`O zF2vmk=mwFiDfPk`L~kJ%k}>ERq|H9>5c{kE@VeHS4^PY*F4{@2{@Gx~z z(H2%Redfd325_syy;)I^wt9GYq3&26!|P#k-

I#K499-4olvs$3hq*Bs9k74X|% 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

@w3xVpJ>1y| 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 literal 18243 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

+~x@@V5l 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 diff --git a/shiptest.dme b/shiptest.dme index 1712d98a1885..3cfb399d230d 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -25,6 +25,7 @@ #include "code\__DEFINES\access.dm" #include "code\__DEFINES\achievements.dm" #include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\anomalies.dm" #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" @@ -1001,7 +1002,6 @@ #include "code\game\objects\objs.dm" #include "code\game\objects\structures.dm" #include "code\game\objects\effects\alien_acid.dm" -#include "code\game\objects\effects\anomalies.dm" #include "code\game\objects\effects\blessing.dm" #include "code\game\objects\effects\bump_teleporter.dm" #include "code\game\objects\effects\contraband.dm" @@ -1022,6 +1022,14 @@ #include "code\game\objects\effects\step_triggers.dm" #include "code\game\objects\effects\turf_fire.dm" #include "code\game\objects\effects\wanted_poster.dm" +#include "code\game\objects\effects\anomalies\_anomalies.dm" +#include "code\game\objects\effects\anomalies\anomalies_bioscrambler.dm" +#include "code\game\objects\effects\anomalies\anomalies_bluespace.dm" +#include "code\game\objects\effects\anomalies\anomalies_flux.dm" +#include "code\game\objects\effects\anomalies\anomalies_gravity.dm" +#include "code\game\objects\effects\anomalies\anomalies_hallucination.dm" +#include "code\game\objects\effects\anomalies\anomalies_pyroclastic.dm" +#include "code\game\objects\effects\anomalies\anomalies_vortex.dm" #include "code\game\objects\effects\decals\cleanable.dm" #include "code\game\objects\effects\decals\crayon.dm" #include "code\game\objects\effects\decals\decal.dm" @@ -1990,12 +1998,6 @@ #include "code\modules\events\_event.dm" #include "code\modules\events\abductor.dm" #include "code\modules\events\alien_infestation.dm" -#include "code\modules\events\anomaly.dm" -#include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_flux.dm" -#include "code\modules\events\anomaly_grav.dm" -#include "code\modules\events\anomaly_pyro.dm" -#include "code\modules\events\anomaly_vortex.dm" #include "code\modules\events\aurora_caelus.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\borers.dm" From a323f498ca30dadca490db1ee5766f323e788372 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 28 May 2023 17:52:48 -0700 Subject: [PATCH 02/43] linterinos? --- code/game/objects/effects/anomalies/anomalies_bluespace.dm | 2 +- code/game/objects/effects/anomalies/anomalies_vortex.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 80b4edc19fda..bf515e72cab4 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -49,7 +49,7 @@ var/y_distance = TO.y - FROM.y var/x_distance = TO.x - FROM.x - for (var/atom/movable/A in urange(12, FROM )) // iterate thru list of mobs in the area + for (var/atom/movable/A in urange(12, FROM)) // iterate thru list of mobs in the area if(istype(A, /obj/item/beacon)) continue // don't teleport beacons because that's just insanely stupid if(iscameramob(A)) diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm index 2f4a28ee44c1..8db560b3077d 100644 --- a/code/game/objects/effects/anomalies/anomalies_vortex.dm +++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm @@ -54,7 +54,7 @@ step_towards(M,src) //Damaging the turf - if( T && prob(turf_removal_chance) ) + if(T && prob(turf_removal_chance)) switch(ex_act_force) if(EXPLODE_DEVASTATE) SSexplosions.highturf += T From 02ed49e71d632d55b8259745849b19cad2a48b96 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 29 May 2023 10:50:08 -0700 Subject: [PATCH 03/43] update --- .../objects/effects/anomalies/_anomalies.dm | 12 +++- .../anomalies/anomalies_bioscrambler.dm | 24 +++++--- .../effects/anomalies/anomalies_bluespace.dm | 34 ++++++++--- .../effects/anomalies/anomalies_flux.dm | 33 ++++++---- .../effects/anomalies/anomalies_gravity.dm | 61 ++++++++++++++----- .../anomalies/anomalies_hallucination.dm | 9 ++- .../anomalies/anomalies_pyroclastic.dm | 41 +++++++++---- .../effects/anomalies/anomalies_vortex.dm | 4 ++ .../game/objects/effects/spawners/lootdrop.dm | 26 ++++---- .../modules/mob/living/carbon/status_procs.dm | 14 +++++ code/modules/overmap/objects/dynamic_datum.dm | 2 +- 11 files changed, 186 insertions(+), 74 deletions(-) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 7a12ae22e770..b22fc9551421 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -11,19 +11,25 @@ var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly var/area/impact_area - var/lifespan = null + var/lifespan = 990 var/death_time var/research_value + //for anomaly effects, range is how far the effects can reach, the cooldown lets us wire in effects that happen every pulse delay seconds + var/range = 6 + + COOLDOWN_DECLARE(pulse_cooldown) + var/pulse_delay = 15 SECONDS + var/countdown_colour var/obj/effect/countdown/anomaly/countdown /// Do we drop a core when we're neutralized? var/drops_core = TRUE ///Do we keep on living forever? - var/immortal = TRUE + var/immortal = FALSE ///Do we stay in one place? - var/immobile = TRUE + var/immobile = FALSE /obj/effect/anomaly/Initialize(mapload, new_lifespan, drops_core = TRUE) . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm index 0703708f9fe7..2483a5325878 100644 --- a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm +++ b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm @@ -4,12 +4,7 @@ icon_state = "bioscrambler" aSignal = /obj/item/assembly/signaler/anomaly/bioscrambler immortal = TRUE - /// Cooldown for every anomaly pulse - COOLDOWN_DECLARE(pulse_cooldown) - /// How many seconds between each anomaly pulses - var/pulse_delay = 15 SECONDS - /// Range of the anomaly pulse - var/range = 6 + range = 4 /obj/effect/anomaly/bioscrambler/anomalyEffect(seconds_per_tick) . = ..() @@ -19,14 +14,23 @@ COOLDOWN_START(src, pulse_cooldown, pulse_delay) for(var/mob/living/carbon/nearby in range(range, src)) nearby.bioscramble(name) - if (nearby.run_armor_check(attack_flag = "bio") >= 100) - nearby.apply_damage(10, CLONE, spread_damage = TRUE) + if (nearby.run_armor_check(attack_flag = "bio") <= 100) + nearby.apply_damage(10, CLONE) + nearby.apply_effects(stutter = 3, eyeblur = 5, drowsy = 1,) /obj/effect/anomaly/bioscrambler/big pulse_delay = 10 - range = 10 + range = 7 /obj/effect/anomaly/bioscrambler/big/Initialize(mapload, new_lifespan, drops_core) . = ..() - transform *= 3 + transform *= 1.5 + +/obj/effect/anomaly/bioscrambler/planetary + immortal = TRUE + immobile = TRUE + +/obj/effect/anomaly/bioscrambler/big/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index bf515e72cab4..68db47739508 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -5,14 +5,25 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/bluespace ///range from which we can teleport someone - var/teleport_range = 1 + range = 3 + var/reagent_amount = 3 ///Distance we can teleport someone passively var/teleport_distance = 6 /obj/effect/anomaly/bluespace/anomalyEffect() ..() - for(var/mob/living/M in range(teleport_range,src)) - do_teleport(M, locate(M.x, M.y, M.z), teleport_distance, channel = TELEPORT_CHANNEL_BLUESPACE) + for(var/mob/living/Mob in range(range,src)) + do_teleport(Mob, locate(Mob.x, Mob.y, Mob.z), teleport_distance, channel = TELEPORT_CHANNEL_BLUESPACE) + + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + for(var/mob/living/Mob in range(range,src)) + if(iscarbon(Mob)) + var/mob/living/carbon/carbon = Mob + carbon.reagents?.add_reagent(/datum/reagent/bluespace, reagent_amount) /obj/effect/anomaly/bluespace/Bumped(atom/movable/AM) if(isliving(AM)) @@ -82,23 +93,32 @@ /obj/effect/anomaly/bluespace/stabilize(anchor, has_core) . = ..() - teleport_range = 0 //bumping already teleports, so this just prevents people from being teleported when they don't expect it when interacting with stable bsanoms + range = 0 //bumping already teleports, so this just prevents people from being teleported when they don't expect it when interacting with stable bsanoms /obj/effect/anomaly/bluespace/big immortal = TRUE - teleport_range = 2 + range = 4 teleport_distance = 12 aSignal = null + reagent_amount = 20 /obj/effect/anomaly/bluespace/big/Initialize(mapload, new_lifespan, drops_core) . = ..() - transform *= 3 + transform *= 1.5 /obj/effect/anomaly/bluespace/big/Bumped(atom/movable/bumpee) if(iscarbon(bumpee)) var/mob/living/carbon/carbon = bumpee - carbon.reagents?.add_reagent(/datum/reagent/bluespace, 20) + carbon.reagents?.add_reagent(/datum/reagent/bluespace, reagent_amount) if(!isliving(bumpee)) return ..() + +/obj/effect/anomaly/bluespace/planetary + immortal = TRUE + immobile = TRUE + +/obj/effect/anomaly/bluespace/big/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index ba62dcd0b9b8..4083e65c296a 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -3,11 +3,13 @@ icon_state = "flux" density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/flux + pulse_delay = 4 + range = 0 var/canshock = FALSE var/shockdamage = 20 var/explosive = FLUX_EXPLOSIVE var/zap_range = 1 - var/zap_power = 500 + var/zap_power = 1500 var/zap_flags = ZAP_MOB_DAMAGE /obj/effect/anomaly/flux/Initialize(mapload, new_lifespan, drops_core = TRUE, explosive = FLUX_EXPLOSIVE) @@ -21,8 +23,13 @@ /obj/effect/anomaly/flux/anomalyEffect() ..() canshock = TRUE - for(var/mob/living/Mob in range(0, src)) + for(var/mob/living/Mob in range(range, src)) mobShock(Mob) + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) tesla_zap(src, zap_range, zap_power, zap_flags) /obj/effect/anomaly/flux/proc/on_entered(datum/source, atom/movable/AM) @@ -61,27 +68,29 @@ immortal = TRUE aSignal = null shockdamage = 30 + pulse_delay = 2 + range = 1 zap_range = 2 - zap_power = 2500 + zap_power = 3000 zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE /obj/effect/anomaly/flux/big/Initialize(mapload, new_lifespan, drops_core) . = ..() - transform *= 3 + transform *= 1.5 -/obj/effect/anomaly/flux/big/anomalyEffect() - . = ..() - - for(var/mob/living/Mob in range(2, src)) - mobShock(Mob) - tesla_zap(src, zap_range, zap_power, zap_flags) /obj/effect/anomaly/flux/big/Bumped(atom/movable/bumpee) . = ..() if(isliving(bumpee)) - var/mob/living/living = bumpee - living.dust() new /obj/effect/particle_effect/sparks(loc) + +/obj/effect/anomaly/flux/planetary + immortal = TRUE + immobile = TRUE + +/obj/effect/anomaly/flux/big/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index ad008d940751..57a72ebc3728 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -11,6 +11,7 @@ icon_state = "gravity" density = FALSE aSignal = /obj/item/assembly/signaler/anomaly/grav + range = 4 var/boing = 0 ///Warp effect holder for displacement filter to "pulse" the anomaly var/atom/movable/warp_effect/warp @@ -25,24 +26,35 @@ /obj/effect/anomaly/grav/anomalyEffect() ..() boing = 1 - for(var/obj/O in orange(4, src)) + for(var/obj/O in orange(range, src)) if(!O.anchored) step_towards(O,src) - for(var/mob/living/M in range(0, src)) - gravShock(M) - for(var/mob/living/M in orange(4, src)) - if(!M.mob_negates_gravity()) - step_towards(M,src) + for(var/mob/living/Mob in range(0, src)) + gravShock(Mob) + for(var/mob/living/Mob in orange(range, src)) + if(!Mob.mob_negates_gravity()) + step_towards(Mob,src) for(var/obj/O in range(0,src)) if(!O.anchored) if(isturf(O.loc)) var/turf/T = O.loc if(T.intact && HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) continue - var/mob/living/target = locate() in view(4,src) + var/mob/living/target = locate() in view(range,src) if(target && !target.stat) O.throw_at(target, 5, 10) + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + for(var/mob/living/carbon/carbon in orange(range/2, src)) + if(carbon.run_armor_check(attack_flag = "melee") >= 40) + carbon.break_random_bone() + if(carbon.run_armor_check(attack_flag = "melee") >= 60) + carbon.break_all_bones() //crunch + carbon.apply_damage(10, BRUTE) + /obj/effect/anomaly/grav/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER @@ -54,14 +66,22 @@ /obj/effect/anomaly/grav/Bumped(atom/movable/AM) gravShock(AM) -/obj/effect/anomaly/grav/proc/gravShock(mob/living/A) - if(boing && isliving(A) && !A.stat) - A.Paralyze(40) - var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) - A.throw_at(target, 5, 1) +/obj/effect/anomaly/grav/proc/gravShock(mob/living/Guy) + if(boing && isliving(Guy) && !Guy.stat) + Guy.Paralyze(40) + var/atom/target = get_edge_target_turf(Guy, get_dir(src, get_step_away(Guy, src))) + Guy.throw_at(target, 5, 1) boing = 0 + if(iscarbon(Guy)) + for(var/mob/living/carbon/carbon) + if(carbon.run_armor_check(attack_flag = "melee") >= 20) + carbon.break_random_bone() + else if(carbon.run_armor_check(attack_flag = "melee") >= 40) + carbon.break_all_bones() //crunch + carbon.apply_damage(10, BRUTE) /obj/effect/anomaly/grav/high + range = 7 var/grav_field /obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) @@ -69,7 +89,7 @@ INVOKE_ASYNC(src, .proc/setup_grav_field) /obj/effect/anomaly/grav/high/proc/setup_grav_field() - grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = 7, "host" = src, "gravity_value" = rand(0,3))) + grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = range, "host" = src, "gravity_value" = rand(0,3))) /obj/effect/anomaly/grav/high/Destroy() QDEL_NULL(grav_field) @@ -84,4 +104,17 @@ /obj/effect/anomaly/grav/high/big/Initialize(mapload, new_lifespan, drops_core) . = ..() - transform *= 3 + transform *= 1.5 + + +/obj/effect/anomaly/grav/planetary + immortal = TRUE + immobile = TRUE + +/obj/effect/anomaly/grav/high/planetary + immortal = TRUE + immobile = TRUE + +/obj/effect/anomaly/grav/high/big/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 243ed694f2af..d0cca0b3ab2d 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -6,14 +6,14 @@ /// Time passed since the last effect, increased by delta_time of the SSobj var/ticks = 0 /// How many seconds between each small hallucination pulses - var/release_delay = 5 + pulse_delay = 5 /obj/effect/anomaly/hallucination/anomalyEffect(delta_time) . = ..() ticks += delta_time - if(ticks < release_delay) + if(ticks < pulse_delay) return - ticks -= release_delay + ticks -= pulse_delay var/turf/open/our_turf = get_turf(src) if(istype(our_turf)) hallucination_pulse(our_turf, 5) @@ -45,3 +45,6 @@ ) to_chat(near, span_warning(pick(messages))) +/obj/effect/anomaly/hallucination/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index a9598c4d418d..50774f15f8f4 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -2,18 +2,33 @@ /obj/effect/anomaly/pyro name = "pyroclastic anomaly" icon_state = "pyroclastic" + range = 4 var/ticks = 0 /// How many seconds between each gas release - var/releasedelay = 10 + pulse_delay = 10 aSignal = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/pyro/anomalyEffect(seconds_per_tick) ..() + + for(var/mob/living/carbon/nearby in range(range, src)) + nearby.adjust_bodytemperature(20) + visible_message("[src] pulses!") + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + + for(var/mob/living/carbon/nearby in range(range/2, src)) + nearby.fire_stacks += 3 + nearby.IgniteMob() + visible_message("[src] ignites [nearby]!") + ticks += seconds_per_tick - if(ticks < releasedelay) + if(ticks < pulse_cooldown) return FALSE else - ticks -= releasedelay + ticks -= pulse_cooldown var/turf/open/tile = get_turf(src) if(istype(tile)) tile.atmos_spawn_air("o2=5;plasma=10;TEMP=500") @@ -39,20 +54,15 @@ /obj/effect/anomaly/pyro/big immortal = TRUE aSignal = null - releasedelay = 2 + pulse_delay = 2 + range = 6 move_force = MOVE_FORCE_OVERPOWERING /obj/effect/anomaly/pyro/big/Initialize(mapload, new_lifespan, drops_core) . = ..() - transform *= 3 - -/obj/effect/anomaly/pyro/big/Bumped(atom/movable/bumpee) - . = ..() + transform *= 2 - if(isliving(bumpee)) - var/mob/living/living = bumpee - living.dust() /obj/effect/anomaly/pyro/big/anomalyEffect(seconds_per_tick) . = ..() @@ -63,3 +73,12 @@ var/turf/turf = get_turf(src) if(!isgroundlessturf(turf)) turf.TerraformTurf(/turf/open/lava/smooth, flags = CHANGETURF_INHERIT_AIR) + + +/obj/effect/anomaly/pyro/planetary + immortal = TRUE + immobile = TRUE + +/obj/effect/anomaly/pyro/big/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm index 8db560b3077d..0276d7087c6d 100644 --- a/code/game/objects/effects/anomalies/anomalies_vortex.dm +++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm @@ -62,3 +62,7 @@ SSexplosions.medturf += T if(EXPLODE_LIGHT) SSexplosions.lowturf += T + +/obj/effect/anomaly/vortex/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index b2b658001eda..fcb89a9fb530 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -807,23 +807,23 @@ /obj/effect/spawner/lootdrop/anomaly name = "random anomaly spawner" loot = list( - /obj/effect/anomaly/bioscrambler, - /obj/effect/anomaly/bluespace, - /obj/effect/anomaly/flux, - /obj/effect/anomaly/grav, - /obj/effect/anomaly/hallucination, - /obj/effect/anomaly/pyro, - /obj/effect/anomaly/vortex, - /obj/effect/anomaly/grav/high + /obj/effect/anomaly/bioscrambler/planetary, + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/vortex/planetary, + /obj/effect/anomaly/grav/high/planetary ) /obj/effect/spawner/lootdrop/anomaly/big name = "random big anomaly spawner" loot = list( - /obj/effect/anomaly/bioscrambler/big, - /obj/effect/anomaly/bluespace/big, - /obj/effect/anomaly/flux/big, - /obj/effect/anomaly/grav/high/big, - /obj/effect/anomaly/pyro/big + /obj/effect/anomaly/bioscrambler/big/planetary, + /obj/effect/anomaly/bluespace/big/planetary, + /obj/effect/anomaly/flux/big/planetary, + /obj/effect/anomaly/grav/high/big/planetary, + /obj/effect/anomaly/pyro/big/planetary ) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 2f84bd463299..9284f80269b9 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -94,3 +94,17 @@ /mob/living/carbon/proc/break_all_bones() for(var/obj/item/bodypart/B in bodyparts) B.break_bone() + +/mob/living/carbon/proc/break_random_bone() //this doesn't work and I don't know how to make it work + var/obj/item/bodypart/B = pick(list( + /obj/item/bodypart/chest, + /obj/item/bodypart/head, + /obj/item/bodypart/l_arm, + /obj/item/bodypart/r_arm, + /obj/item/bodypart/leg/right, + /obj/item/bodypart/leg/left + )) + for(B in bodyparts) + B.break_bone() + return + diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index df63f4d02abd..bd6a188370aa 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -192,7 +192,7 @@ icon_state = "away" // DO NOT PUT UNIQUE_AREA IN THESE FLAGS FOR ANY SUBTYPE. IT CAUSES WEATHER PROBLEMS // THE ONLY REASON IT DIDN'T BEFORE IS BECAUSE THE CODE DIDN'T RESPECT THE FLAG - area_flags = HIDDEN_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | NOTELEPORT + area_flags = HIDDEN_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED flags_1 = CAN_BE_DIRTY_1 dynamic_lighting = DYNAMIC_LIGHTING_FORCED sound_environment = SOUND_ENVIRONMENT_STONEROOM From 3be7a7ad404862c8856a27170314d86e15873318 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 29 May 2023 11:03:31 -0700 Subject: [PATCH 04/43] Update RockGenerator.dm --- code/datums/mapgen/planetary/RockGenerator.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index bf113f9861ae..7a49716063d7 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -83,7 +83,7 @@ /datum/biome/rock open_turf_types = list(/turf/open/floor/plating/asteroid/rockplanet/lit = 1) - feature_spawn_chance = 0.5 + feature_spawn_chance = 0.25 feature_spawn_list = list( /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, @@ -145,7 +145,7 @@ /obj/structure/flora/ash/fern = 2, /obj/structure/flora/ash/puce = 1, ) - feature_spawn_chance = 0.9 + feature_spawn_chance = 0.5 feature_spawn_list = list( /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, From f434ea5ee4ad93595cf191e2f1e793ec5e5cbc0b Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Tue, 30 May 2023 09:57:23 -0700 Subject: [PATCH 05/43] Update anomalies_bioscrambler.dm --- code/game/objects/effects/anomalies/anomalies_bioscrambler.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm index 2483a5325878..5f8dcc47d3b3 100644 --- a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm +++ b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm @@ -13,10 +13,11 @@ COOLDOWN_START(src, pulse_cooldown, pulse_delay) for(var/mob/living/carbon/nearby in range(range, src)) - nearby.bioscramble(name) if (nearby.run_armor_check(attack_flag = "bio") <= 100) nearby.apply_damage(10, CLONE) nearby.apply_effects(stutter = 3, eyeblur = 5, drowsy = 1,) + for(nearby in range(range/2, src)) + nearby.bioscramble(name) /obj/effect/anomaly/bioscrambler/big pulse_delay = 10 From cc89df8b26fab11059fc90090f7c6e21ef390eda Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Tue, 30 May 2023 10:19:15 -0700 Subject: [PATCH 06/43] Update anomalies.dm --- code/__DEFINES/anomalies.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/__DEFINES/anomalies.dm b/code/__DEFINES/anomalies.dm index e6486ba8b638..7be75bcb4a6e 100644 --- a/code/__DEFINES/anomalies.dm +++ b/code/__DEFINES/anomalies.dm @@ -6,7 +6,6 @@ #define MAX_CORES_PYRO 8 #define MAX_CORES_HALLUCINATION 8 #define MAX_CORES_BIOSCRAMBLER 8 -#define MAX_CORES_DIMENSIONAL 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EXPLOSION 0 From eff8f8b4cf8ad415ff1c35257e63c5af6d873d9d Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:02:28 -0700 Subject: [PATCH 07/43] workworkwork --- .../objects/effects/anomalies/_anomalies.dm | 20 +++++- .../anomalies/anomalies_bioscrambler.dm | 37 ----------- .../effects/anomalies/anomalies_bluespace.dm | 20 +++--- .../effects/anomalies/anomalies_flux.dm | 12 ++-- .../effects/anomalies/anomalies_gravity.dm | 20 +++--- .../anomalies/anomalies_hallucination.dm | 1 + .../effects/anomalies/anomalies_heartbeat.dm | 43 +++++++++++++ .../effects/anomalies/anomalies_phantom.dm | 60 ++++++++++++++++++ .../effects/anomalies/anomalies_plasmasoul.dm | 51 +++++++++++++++ .../effects/anomalies/anomalies_pulsar.dm | 32 ++++++++++ .../anomalies/anomalies_pyroclastic.dm | 42 ++++++------ .../effects/anomalies/anomalies_sparkler.dm | 37 +++++++++++ .../effects/anomalies/anomalies_static.dm | 58 +++++++++++++++++ .../effects/anomalies/anomalies_veins.dm | 50 +++++++++++++++ .../effects/anomalies/anomalies_vortex.dm | 5 +- .../game/objects/effects/spawners/lootdrop.dm | 2 - code/modules/assembly/signaler.dm | 46 ++++++++++++-- .../projectiles/projectile/special/curse.dm | 4 ++ icons/effects/anomalies.dmi | Bin 33018 -> 145220 bytes shiptest.dme | 6 +- 20 files changed, 454 insertions(+), 92 deletions(-) delete mode 100644 code/game/objects/effects/anomalies/anomalies_bioscrambler.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_heartbeat.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_phantom.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_plasmasoul.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_pulsar.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_sparkler.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_static.dm create mode 100644 code/game/objects/effects/anomalies/anomalies_veins.dm diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index b22fc9551421..1d2a381e59ca 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -8,7 +8,9 @@ anchored = TRUE light_range = 3 + //aSignal drops as the core, bSignal allows people to signal to detonate var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly + var/obj/item/assembly/signaler/anomaly/bSignal = /obj/item/assembly/signaler/anomaly/det_signal var/area/impact_area var/lifespan = 990 @@ -16,9 +18,10 @@ var/research_value //for anomaly effects, range is how far the effects can reach, the cooldown lets us wire in effects that happen every pulse delay seconds - var/range = 6 + var/effectrange = 6 COOLDOWN_DECLARE(pulse_cooldown) + COOLDOWN_DECLARE(pulse_secondary_cooldown) var/pulse_delay = 15 SECONDS var/countdown_colour @@ -53,6 +56,17 @@ frequency++ aSignal.set_frequency(frequency) + if(bSignal) + bSignal = new bSignal(src) + bSignal.code = rand(1,100) + bSignal.anomaly_type = type + var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) + if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven! + frequency++ + bSignal.set_frequency(frequency) + + + if(lifespan) if(new_lifespan) lifespan = new_lifespan @@ -90,6 +104,7 @@ step(src,pick(GLOB.alldirs)) /obj/effect/anomaly/proc/detonate() + qdel(src) return /obj/effect/anomaly/ex_act(severity, target) @@ -112,9 +127,12 @@ qdel(src) + /obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + if(bSignal) + to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]." )) return TRUE return ..() diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm deleted file mode 100644 index 5f8dcc47d3b3..000000000000 --- a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm +++ /dev/null @@ -1,37 +0,0 @@ - -/obj/effect/anomaly/bioscrambler - name = "bioscrambler anomaly" - icon_state = "bioscrambler" - aSignal = /obj/item/assembly/signaler/anomaly/bioscrambler - immortal = TRUE - range = 4 - -/obj/effect/anomaly/bioscrambler/anomalyEffect(seconds_per_tick) - . = ..() - if(!COOLDOWN_FINISHED(src, pulse_cooldown)) - return - - COOLDOWN_START(src, pulse_cooldown, pulse_delay) - for(var/mob/living/carbon/nearby in range(range, src)) - if (nearby.run_armor_check(attack_flag = "bio") <= 100) - nearby.apply_damage(10, CLONE) - nearby.apply_effects(stutter = 3, eyeblur = 5, drowsy = 1,) - for(nearby in range(range/2, src)) - nearby.bioscramble(name) - -/obj/effect/anomaly/bioscrambler/big - pulse_delay = 10 - range = 7 - -/obj/effect/anomaly/bioscrambler/big/Initialize(mapload, new_lifespan, drops_core) - . = ..() - - transform *= 1.5 - -/obj/effect/anomaly/bioscrambler/planetary - immortal = TRUE - immobile = TRUE - -/obj/effect/anomaly/bioscrambler/big/planetary - immortal = TRUE - immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 68db47739508..2d25a7cab1b8 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -1,33 +1,32 @@ /obj/effect/anomaly/bluespace - name = "bluespace anomaly" + name = "jumper" icon_state = "bluespace" + desc = "A mysterious anomaly that causes teleportation around it." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/bluespace ///range from which we can teleport someone - range = 3 + effectrange = 3 var/reagent_amount = 3 ///Distance we can teleport someone passively var/teleport_distance = 6 /obj/effect/anomaly/bluespace/anomalyEffect() ..() - for(var/mob/living/Mob in range(range,src)) + for(var/mob/living/Mob in range(effectrange,src)) do_teleport(Mob, locate(Mob.x, Mob.y, Mob.z), teleport_distance, channel = TELEPORT_CHANNEL_BLUESPACE) - if(!COOLDOWN_FINISHED(src, pulse_cooldown)) return COOLDOWN_START(src, pulse_cooldown, pulse_delay) - for(var/mob/living/Mob in range(range,src)) + for(var/mob/living/Mob in range(effectrange,src)) if(iscarbon(Mob)) var/mob/living/carbon/carbon = Mob carbon.reagents?.add_reagent(/datum/reagent/bluespace, reagent_amount) /obj/effect/anomaly/bluespace/Bumped(atom/movable/AM) - if(isliving(AM)) - do_teleport(AM, locate(AM.x, AM.y, AM.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE) + do_teleport(AM, locate(AM.x, AM.y, AM.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE) /obj/effect/anomaly/bluespace/detonate() var/turf/T = pick(get_area_turfs(impact_area)) @@ -76,6 +75,7 @@ var/mob/give_sparkles = A if(give_sparkles.client) blue_effect(give_sparkles) + . = ..() /obj/effect/anomaly/bluespace/proc/blue_effect(mob/M) var/obj/blueeffect = new /obj(src) @@ -93,13 +93,12 @@ /obj/effect/anomaly/bluespace/stabilize(anchor, has_core) . = ..() - range = 0 //bumping already teleports, so this just prevents people from being teleported when they don't expect it when interacting with stable bsanoms + effectrange = 0 //bumping already teleports, so this just prevents people from being teleported when they don't expect it when interacting with stable bsanoms /obj/effect/anomaly/bluespace/big immortal = TRUE - range = 4 + effectrange = 4 teleport_distance = 12 - aSignal = null reagent_amount = 20 /obj/effect/anomaly/bluespace/big/Initialize(mapload, new_lifespan, drops_core) @@ -108,6 +107,7 @@ transform *= 1.5 /obj/effect/anomaly/bluespace/big/Bumped(atom/movable/bumpee) + . = ..() if(iscarbon(bumpee)) var/mob/living/carbon/carbon = bumpee carbon.reagents?.add_reagent(/datum/reagent/bluespace, reagent_amount) diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index 4083e65c296a..496dcdfb25af 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -1,10 +1,11 @@ /obj/effect/anomaly/flux - name = "flux wave anomaly" + name = "tesla" icon_state = "flux" + desc = "A mysterious anomaly that sends out a near constant stream of electrical arcs." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/flux pulse_delay = 4 - range = 0 + effectrange = 0 var/canshock = FALSE var/shockdamage = 20 var/explosive = FLUX_EXPLOSIVE @@ -23,7 +24,7 @@ /obj/effect/anomaly/flux/anomalyEffect() ..() canshock = TRUE - for(var/mob/living/Mob in range(range, src)) + for(var/mob/living/Mob in range(effectrange, src)) mobShock(Mob) if(!COOLDOWN_FINISHED(src, pulse_cooldown)) @@ -60,16 +61,17 @@ if(FLUX_NO_EXPLOSION) new /obj/effect/particle_effect/sparks(loc) + . = ..() + /obj/effect/anomaly/flux/minor/Initialize(mapload, new_lifespan, drops_core = FALSE, explosive = FLUX_NO_EXPLOSION) return ..() /obj/effect/anomaly/flux/big immortal = TRUE - aSignal = null shockdamage = 30 pulse_delay = 2 - range = 1 + effectrange = 1 zap_range = 2 zap_power = 3000 diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index 57a72ebc3728..9957847b6f6d 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -7,11 +7,13 @@ pixel_y = -176 /obj/effect/anomaly/grav - name = "gravitational anomaly" + name = "throngler" icon_state = "gravity" + desc = "A mysterious anomaly that sucks things towards it with a gravitational field, as you get closer, it gets more intense." density = FALSE aSignal = /obj/item/assembly/signaler/anomaly/grav - range = 4 + bSignal = null + effectrange = 4 var/boing = 0 ///Warp effect holder for displacement filter to "pulse" the anomaly var/atom/movable/warp_effect/warp @@ -26,12 +28,12 @@ /obj/effect/anomaly/grav/anomalyEffect() ..() boing = 1 - for(var/obj/O in orange(range, src)) + for(var/obj/O in orange(effectrange, src)) if(!O.anchored) step_towards(O,src) for(var/mob/living/Mob in range(0, src)) gravShock(Mob) - for(var/mob/living/Mob in orange(range, src)) + for(var/mob/living/Mob in orange(effectrange, src)) if(!Mob.mob_negates_gravity()) step_towards(Mob,src) for(var/obj/O in range(0,src)) @@ -40,7 +42,7 @@ var/turf/T = O.loc if(T.intact && HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) continue - var/mob/living/target = locate() in view(range,src) + var/mob/living/target = locate() in view(effectrange,src) if(target && !target.stat) O.throw_at(target, 5, 10) @@ -48,7 +50,7 @@ return COOLDOWN_START(src, pulse_cooldown, pulse_delay) - for(var/mob/living/carbon/carbon in orange(range/2, src)) + for(var/mob/living/carbon/carbon in orange(effectrange/2, src)) if(carbon.run_armor_check(attack_flag = "melee") >= 40) carbon.break_random_bone() if(carbon.run_armor_check(attack_flag = "melee") >= 60) @@ -81,7 +83,7 @@ carbon.apply_damage(10, BRUTE) /obj/effect/anomaly/grav/high - range = 7 + effectrange = 5 var/grav_field /obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) @@ -89,7 +91,7 @@ INVOKE_ASYNC(src, .proc/setup_grav_field) /obj/effect/anomaly/grav/high/proc/setup_grav_field() - grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = range, "host" = src, "gravity_value" = rand(0,3))) + grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = effectrange, "host" = src, "gravity_value" = rand(0,3))) /obj/effect/anomaly/grav/high/Destroy() QDEL_NULL(grav_field) @@ -98,7 +100,7 @@ ///Bigger, meaner, immortal gravity anomaly. although this is just the super grav anomaly but bigger and shattering move force /obj/effect/anomaly/grav/high/big immortal = TRUE - aSignal = null + effectrange = 7 move_force = MOVE_FORCE_OVERPOWERING /obj/effect/anomaly/grav/high/big/Initialize(mapload, new_lifespan, drops_core) diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index d0cca0b3ab2d..678dbe9eb8de 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -22,6 +22,7 @@ var/turf/open/our_turf = get_turf(src) if(istype(our_turf)) hallucination_pulse(our_turf, 10) + . = ..() /obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, range) for(var/mob/living/carbon/human/near in view(location, range)) diff --git a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm new file mode 100644 index 000000000000..0bec7c6ee31f --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm @@ -0,0 +1,43 @@ +/obj/effect/anomaly/heartbeat + name = "heartbeat" + icon_state = "heartbeat" + desc = "A mysterious anomaly, it ionizes the world around it." + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/heartbeat + effectrange = 3 + pulse_cooldown = 6 + pulse_secondary_cooldown = 18 + var/reagent_amount = 5 + +/obj/effect/anomaly/heartbeat/anomalyEffect() + ..() + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + playsound(src, 'sound/health/slowbeat.ogg', 100) + radiation_pulse(src, 500, 2) + + + if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) + return + + COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay*4) + var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) + playsound(spot, 'sound/health/slowbeat.ogg', 100) + radiation_pulse(spot, 200, effectrange) + +/obj/effect/anomaly/heartbeat/Bumped(atom/movable/AM) + var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) + playsound(spot, 'sound/health/slowbeat.ogg', 100) + radiation_pulse(spot, 200, effectrange) + +/obj/effect/anomaly/heartbeat/detonate() + radiation_pulse(src, 5000, 2) + playsound(src, 'sound/health/fastbeat.ogg', 300) + . = ..() + +/obj/effect/anomaly/heartbeat/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm new file mode 100644 index 000000000000..e06e009a7e51 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm @@ -0,0 +1,60 @@ +/obj/effect/anomaly/phantom + name = "phantom" + icon_state = "phantom" + desc = "A mysterious anomaly, the outline of a humanoid, endlessly screaming in agony." + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/phantom + effectrange = 3 + pulse_delay = 5 + + +/obj/effect/anomaly/phantom/anomalyEffect() + ..() + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + +// /tg/'s helgrasp spawn_hands proc, modified to work as an anomaly effect + for(var/mob/living/carbon/handsy in range(effectrange, src)) + var/grab_dir = turn(handsy.dir, pick(-90, 90, 180, 180)) + var/turf/spawn_turf = get_ranged_target_turf(handsy, grab_dir, 8) + if(!spawn_turf) + return + new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, handsy.dir) + playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + var/obj/projectile/curse_hand/phantom/hand = new (spawn_turf) + hand.preparePixelProjectile(handsy, spawn_turf) + if(QDELETED(hand)) + return + hand.fire() + return + + +/obj/effect/anomaly/phantom/Bumped(atom/movable/AM) + anomalyEffect() + new /obj/effect/gibspawner/human(loc) + +/obj/effect/anomaly/phantom/detonate() + var/i = 0 + while(i <= 10) + for(var/mob/living/carbon/handsy in range(effectrange, src)) + var/grab_dir = turn(handsy.dir, pick(-90, 90, 180, 180)) + var/turf/spawn_turf = get_ranged_target_turf(handsy, grab_dir, 8) + if(!spawn_turf) + return + new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, handsy.dir) + playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + var/obj/projectile/curse_hand/phantom/hand = new (spawn_turf) + hand.preparePixelProjectile(handsy, spawn_turf) + if(QDELETED(hand)) + return + hand.fire() + i++ + sleep() 20 TICKS + new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(loc) + . = ..() + +/obj/effect/anomaly/phantom/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm new file mode 100644 index 000000000000..b5e7fb4f94d1 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm @@ -0,0 +1,51 @@ +/obj/effect/anomaly/plasmasoul + name = "plasma soul" + icon_state = "plasmasoul" + desc = "A mysterious anomaly, it slowly emits plasma into the area around it." + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/plasmasoul + effectrange = 3 + pulse_cooldown = 6 + pulse_secondary_cooldown = 18 + var/reagent_amount = 5 + +/obj/effect/anomaly/plasmasoul/anomalyEffect() + ..() + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + for(var/mob/living/Mob in range(effectrange,src)) + if(iscarbon(Mob)) + var/mob/living/carbon/carbon = Mob + carbon.reagents?.add_reagent(/datum/reagent/toxin/plasma, reagent_amount) + + + if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) + return + + COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay*4) + var/turf/open/tile = get_turf(src) + if(istype(tile)) + tile.atmos_spawn_air("o2=250;plasma=750;TEMP=1000") + +/obj/effect/anomaly/plasmasoul/Bumped(atom/movable/AM) + var/turf/open/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) + if(istype(spot)) + spot.atmos_spawn_air("o2=50;plasma=300;TEMP=500") + +/obj/effect/anomaly/plasmasoul/detonate() + for(var/mob/living/Mob in range(effectrange*2,src)) + if(iscarbon(Mob)) + var/mob/living/carbon/carbon = Mob + if(carbon.run_armor_check(attack_flag = "bio") <= 40) + carbon.reagents?.add_reagent(/datum/reagent/toxin/plasma, reagent_amount*3) + var/turf/open/tile = get_turf(src) + if(istype(tile)) + tile.atmos_spawn_air("o2=600;plasma=3000;TEMP=2000") + . = ..() + +/obj/effect/anomaly/plasmasoul/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_pulsar.dm b/code/game/objects/effects/anomalies/anomalies_pulsar.dm new file mode 100644 index 000000000000..837537ee78e8 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_pulsar.dm @@ -0,0 +1,32 @@ +/obj/effect/anomaly/pulsar + name = "pulsar" + icon_state = "pulsar" + desc = "A mysterious anomaly, endless electromagnetic disturbances roll out from it" + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/pulsar + effectrange = 4 + pulse_delay = 15 + + +/obj/effect/anomaly/pulsar/anomalyEffect() + ..() + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) + empulse(spot, effectrange/2, effectrange) //yeah it's not a thrilling effect. I think it's fine though. + + +/obj/effect/anomaly/pulsar/Bumped(atom/movable/AM) + empulse(loc, effectrange/2, effectrange) + +/obj/effect/anomaly/pulsar/detonate() + empulse(loc, effectrange, effectrange*2) + . = ..() + + +/obj/effect/anomaly/pulsar/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index 50774f15f8f4..9ba12a4c38e2 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -1,17 +1,16 @@ /obj/effect/anomaly/pyro - name = "pyroclastic anomaly" + name = "plasmaball" icon_state = "pyroclastic" - range = 4 - var/ticks = 0 - /// How many seconds between each gas release + desc = "A mysterious anomaly, made of an everburning gas. Those who approach it tend to absorb it's heat, or even ignite." + effectrange = 4 pulse_delay = 10 aSignal = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/pyro/anomalyEffect(seconds_per_tick) ..() - for(var/mob/living/carbon/nearby in range(range, src)) + for(var/mob/living/carbon/nearby in range(effectrange, src)) nearby.adjust_bodytemperature(20) visible_message("[src] pulses!") @@ -19,23 +18,28 @@ return COOLDOWN_START(src, pulse_cooldown, pulse_delay) - for(var/mob/living/carbon/nearby in range(range/2, src)) + for(var/mob/living/carbon/nearby in range(effectrange/2, src)) nearby.fire_stacks += 3 nearby.IgniteMob() - visible_message("[src] ignites [nearby]!") - - ticks += seconds_per_tick - if(ticks < pulse_cooldown) - return FALSE - else - ticks -= pulse_cooldown - var/turf/open/tile = get_turf(src) - if(istype(tile)) - tile.atmos_spawn_air("o2=5;plasma=10;TEMP=500") - return TRUE + visible_message("[src] ignites [nearby]!") + + +/obj/effect/anomaly/pyro/Bumped(atom/movable/AM) + if(isobj(AM)) + var/obj/firething = AM + if(firething.resistance_flags & FIRE_PROOF) + firething.resistance_flags &= ~FIRE_PROOF + if(firething.armor.fire > 50) //*Me copies from lava code + firething.armor = firething.armor.setRating(fire = 50) + firething.fire_act(10000, 1000) + if(iscarbon(AM)) + var/mob/living/carbon/onfire + onfire.fire_stacks += 3 + onfire.IgniteMob() /obj/effect/anomaly/pyro/detonate() INVOKE_ASYNC(src, PROC_REF(makepyroslime)) + . = ..() /obj/effect/anomaly/pyro/proc/makepyroslime() var/turf/open/tile = get_turf(src) @@ -53,10 +57,8 @@ /obj/effect/anomaly/pyro/big immortal = TRUE - aSignal = null pulse_delay = 2 - range = 6 - move_force = MOVE_FORCE_OVERPOWERING + effectrange = 6 /obj/effect/anomaly/pyro/big/Initialize(mapload, new_lifespan, drops_core) . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_sparkler.dm b/code/game/objects/effects/anomalies/anomalies_sparkler.dm new file mode 100644 index 000000000000..29747fa8157a --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_sparkler.dm @@ -0,0 +1,37 @@ +/obj/effect/anomaly/sparkler + name = "sparkler" + icon_state = "sparkler" + desc = "A mysterious anomaly, constantly throwing sparks into its vicinity." + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/sparkler + effectrange = 4 + pulse_delay = 1 + +/obj/effect/anomaly/sparkler/anomalyEffect() + ..() + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) + new /obj/effect/particle_effect/sparks(spot) + return + + +/obj/effect/anomaly/sparkler/Bumped(atom/movable/AM) + tesla_zap(src, 2, 5000, ZAP_FUSION_FLAGS) + +/obj/effect/anomaly/sparkler/detonate() + var/i = 0 + while(i <= 5) + tesla_zap(src, 3, 10000, ZAP_DEFAULT_FLAGS) + anomalyEffect() + anomalyEffect() + anomalyEffect() + i = i + 1 + . = ..() + +/obj/effect/anomaly/sparkler/plantary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm new file mode 100644 index 000000000000..c0ac98d21ccf --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -0,0 +1,58 @@ +/obj/effect/anomaly/tvstatic + name = "static" + icon_state = "static" + desc = "A mysterious anomaly. A hole in the world, endless buzzing emitting from it." + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/veins + effectrange = 6 + pulse_delay = 4 + +/obj/effect/visible_heretic_influence/examine(mob/user) + . = ..() + if(IS_HERETIC(user) || !ishuman(user)) + return + + var/mob/living/carbon/human_user = user + to_chat(human_user, span_userdanger("Your mind burns as you stare at the tear!")) + human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 190) + +/obj/effect/anomaly/veins/anomalyEffect() + ..() + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) + var/obj/effect/gibspawner/mess = pick(list( + /obj/effect/gibspawner/human, + /obj/effect/gibspawner/xeno, + /obj/effect/gibspawner/generic/animal + )) + new mess(spot) + + for(var/mob/living/carbon/suckee in range(effectrange, src)) + if(suckee.run_armor_check(attack_flag = "melee") <= 40 ) + suckee.bleed(20) + suckee.apply_damage(5, BRUTE) + visible_message("Blood starts to fly off of [suckee], heading for the [src]!") + + return + + +/obj/effect/anomaly/veins/Bumped(atom/movable/AM) + anomalyEffect() + new /obj/effect/gibspawner/human(loc) + +/obj/effect/anomaly/veins/detonate() + for(var/mob/living/carbon/suckee in range(effectrange, src)) + suckee.bleed(200) + visible_message("[suckee] hemorrages, a fountain of blood heading for [src]!") + anomalyEffect() + anomalyEffect() + anomalyEffect() + . = ..() + +/obj/effect/anomaly/veins/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_veins.dm b/code/game/objects/effects/anomalies/anomalies_veins.dm new file mode 100644 index 000000000000..ce7c05d8cfab --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_veins.dm @@ -0,0 +1,50 @@ +/obj/effect/anomaly/veins + name = "fountain" + icon_state = "veins" + desc = "A mysterious anomaly, surrounded by blood of an unknown origin." + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/veins + effectrange = 6 + pulse_delay = 4 + + +/obj/effect/anomaly/veins/anomalyEffect() + ..() + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) + var/obj/effect/gibspawner/mess = pick(list( + /obj/effect/gibspawner/human, + /obj/effect/gibspawner/xeno, + /obj/effect/gibspawner/generic/animal + )) + new mess(spot) + + for(var/mob/living/carbon/suckee in range(effectrange, src)) + if(suckee.run_armor_check(attack_flag = "melee") <= 40 ) + suckee.bleed(20) + suckee.apply_damage(5, BRUTE) + visible_message("Blood starts to fly off of [suckee], heading for the [src]!") + + return + + +/obj/effect/anomaly/veins/Bumped(atom/movable/AM) + anomalyEffect() + new /obj/effect/gibspawner/human(loc) + +/obj/effect/anomaly/veins/detonate() + for(var/mob/living/carbon/suckee in range(effectrange, src)) + suckee.bleed(200) + visible_message("[suckee] hemorrages, a fountain of blood heading for [src]!") + anomalyEffect() + anomalyEffect() + anomalyEffect() + . = ..() + +/obj/effect/anomaly/veins/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm index 0276d7087c6d..c2e6cfd01b40 100644 --- a/code/game/objects/effects/anomalies/anomalies_vortex.dm +++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm @@ -1,9 +1,10 @@ /obj/effect/anomaly/vortex - name = "vortex anomaly" + name = "vortex" icon_state = "vortex" - desc = "That's a nice station you have there. It'd be a shame if something happened to it." + desc = "A mysterious anomaly, this one destroys everything around it." aSignal = /obj/item/assembly/signaler/anomaly/vortex + bSignal = null /obj/effect/anomaly/vortex/anomalyEffect() ..() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index fcb89a9fb530..3ded42182cd7 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -807,7 +807,6 @@ /obj/effect/spawner/lootdrop/anomaly name = "random anomaly spawner" loot = list( - /obj/effect/anomaly/bioscrambler/planetary, /obj/effect/anomaly/bluespace/planetary, /obj/effect/anomaly/flux/planetary, /obj/effect/anomaly/grav/planetary, @@ -820,7 +819,6 @@ /obj/effect/spawner/lootdrop/anomaly/big name = "random big anomaly spawner" loot = list( - /obj/effect/anomaly/bioscrambler/big/planetary, /obj/effect/anomaly/bluespace/big/planetary, /obj/effect/anomaly/flux/big/planetary, /obj/effect/anomaly/grav/high/big/planetary, diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index de1376f1416f..2707e650f5ce 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -198,6 +198,8 @@ Anomaly.anomalyNeutralize() return TRUE + + /obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user) user.visible_message("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!") user.set_suicide(TRUE) @@ -209,6 +211,21 @@ to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].") ..() +/obj/item/assembly/signaler/anomaly/det_signal + name = "anomaly field" + research = null + anomaly_type = null + +/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) + if(!signal) + return FALSE + if(signal.data["code"] != code) + return FALSE + if(suicider) + manual_suicide(suicider) + for(var/obj/effect/anomaly/Anomaly in get_turf(src)) + Anomaly.detonate() + return TRUE //Anomaly cores @@ -249,13 +266,32 @@ icon_state = "hallucination_core" anomaly_type = /obj/effect/anomaly/hallucination -/obj/item/assembly/signaler/anomaly/bioscrambler - name = "\improper delimber anomaly core" - desc = "The neutralized core of a delimber anomaly. It's squirming, as if moving. It'd probably be valuable for research." - icon_state = "delimber_core" - anomaly_type = /obj/effect/anomaly/bioscrambler +/obj/item/assembly/signaler/anomaly/sparkler + name = "\improper sparkler anomaly core" + desc = "The neutralized core of a sparkler anomaly. Tiny electrical sparks arc off it." + anomaly_type = /obj/effect/anomaly/sparkler + +/obj/item/assembly/signaler/anomaly/veins + name = "\improper fountain anomaly core" + desc = "The neutralized core of a fountain anomaly. Blood drips off of it." + anomaly_type = /obj/effect/anomaly/sparkler + +/obj/item/assembly/signaler/anomaly/phantom + name = "\improper phantom anomaly core" + desc = "The neutralized core of a phantom anomaly. It quietly screams." + anomaly_type = /obj/effect/anomaly/phantom + +/obj/item/assembly/signaler/anomaly/pulsar + name = "\improper pulsar anomaly core" + desc = "The neutralized core of a pulsar anomaly. Electromagnetic crackles come off it." +/obj/item/assembly/signaler/anomaly/plasmasoul + name = "\improper plasmasoul anomaly core" + desc = "The neutralized core of a plasmasoul anomaly. The air around it hisses." +/obj/item/assembly/signaler/anomaly/heartbeat + name = "\improper heartbeat anomaly core" + desc = "The neutralized core of a heartbeat anomaly. It's concerningly warm to the touch." /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index a60bf444c6dc..7187097308d0 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -49,3 +49,7 @@ animate(B, alpha = 0, time = 32) return ..() +/obj/projectile/curse_hand/phantom + name = "phantom hand" + damage = 15 + paralyze = 5 diff --git a/icons/effects/anomalies.dmi b/icons/effects/anomalies.dmi index 27e28ccb61f57e3e26709776fd24a455823dfd19..fb47b028c34ba290f81eb4c57acc7fe1bf2cf791 100644 GIT binary patch literal 145220 zcmb4qby!qi*Y*(7Wq_oh2uOFwfD#gt5&|+H(kb0TD5#W5NrTczr_|6$cgG+wbmt5V zGvDF&JkR?*-*vtJeAjh`IcLv4b7rr-_qx}8uf->AO%-wydJ+%_M6UW=Q5OWl1x|66 zi3otV@rg+UaN+Iu(#S*6%H7h<&eg-t#Tf+hNvnx(b8Z(P3m+cTGjc5{8oSq^&VSc- z1$1COC;u~7H6ce}DTuI}z5#zGhtuuH1I+NyLA{>O>*kWW@`Yc$U+p>)-rqTX%r^RI zx;EsFt@4lXqi2@<%-uh%wA*tO9$tP{uQu%^{$yWD9xuQ;YG&C_7XPLBOMx}+uy#8S zW}NmG|#kdq>sL?qV(He=i90CP4Nx z@8#R5nb3TX9N02W;aR~F)8`X2k=Q5O;aVEkBSw5a2HZ>f^djy}&|>M=K&KeIg#8zH zFURp0@-cGzFZqihS$tY=NQ(FFB&Ld@@H4VqxfOnN>488jAXP<$mp*B`>AnFkCl|4B z4q{@er$%A3@-z=wxTp)WTFHzmB8`|m3u>!twVX1zN^tEbFDH63OKJ=vrwsO(uX{plQ`{`#($@2RfXDNo(zb{%~8v|=W zunm7P9ew=|+=iv5zugc;-kjXy1odu+z679Uj9(n&`ma;J>;+KkO`GZO?GJ8vpnrG2 z-$xF*xvwvw*zC!Fb$0tE**hLIlxuxpc;SmJD@&`E^4+2} z_PiI2w-f-n^whr~!NBq~rnaFA;0XHzo6xf9R|igR{h7*`P7D-pIm|Ni1vhLpG(8V7 z?CbuvY}wyB-604Ix!70jx&P@GUY2(N6Zn@&E|zDb@#nfjxWpQfzcl2)C)GIS{ShI> zlL@4zw(B1M%7j4!wbPw+9DN>O5(fHtA}D3n zI&pix3!H)Y?O{7Pnu8>4LUBqz6mHR-*PrhV404<~+FIjg01Z+!qLerCy_@_>D_0jr ze{u#Dzufuen&J{qqPXi8I*PnYKyct`lEO89GiHitn>8)kdQ(!x-Ibm6gT$XFqAhQ@ z3oige^t?yw*GgK*V*7BavQawwzg!52+=J(KLY00wzH;Ek{@CrWNxVo;h2A?u`g1Hk z2>2%Kg>guSs@;siuLpP@{vBf6m6Tglu_uIoX8lQ1V+_L6EhA2cpi@%>gR`8Rgc1%8 zVKgi=y@qyB%c(YvZCcM5rZH*gCWY5jG(WjNMVr*IqGwPLLNIIGrFDXJc3T;$)`4Xv|hpEv+ z6Qhc&e?1eyjN*9W&T;y0?;Jf@ za{oCSM}qZ9+|a##0&PAmalUq!MpO{vJ+bo=ECSyR$AiX z%V4sq+%oy``Yke#0^Ge(cvzx5&%gwG#X_}1-+MSn%al4jTH%|H5UfB73WJK+N?fkD z^@c7t)V7VJjsNZCkXG*J(%y=ohoq-|eyP4>6jbij1Pr4RbicRC z;I*WAEhk(Jn8!G7!hx9YoL}NSN}$3BjTEJ!oL9HeK2;#q5m}=h{5YrG zFt4%ja!gR9+@S!2N7y611e*@I+Vf9qg$78a3+1_=1dsE6Wb3PJjk`Ubxx^x*EnZQw z1u`QWh;7m7a0#um5AKd$op!1xgJ~`Fq*-!}n@cUb=JHQVj+4a?P>#`qB+kXJSU~Efd>X<>EBiqSLf~e0R&ui-FOIElBMdM zuIr4>ENlx6yQCygW_Jo}h#6}}+|s#PK5J7rTxe6RiZ*5CPI8SiL1en#piCjpyEgX$nLBDWenRgr>~;y9&UZG(YUvZCz2lY)O+!H#-s!7APPME z^IG@ho}bX?{GGO;gGbd%3S%1)1gvw`vD}8T3I;J?IyPz$?Kq}eXG^n>i@das?X{yN zv@TBUy_KnkGOT!dyZ*D+)y(90c!$3VtB*A=w%lEJ0>?$J@%+?cE&N(WFk6J@#GEm( zbfYX)yKnm0^*MmXThr9Ody1&oo$pi+@M+UCUI*l^)TzxXzP+zlZQy-mlDnHm&{det zn|p9#;I#>hd;L?7$Ae7ldu*to*S+Cd*jmxRDAK?Z=i4Y@kDU6r4mGHmt~*n})z`>j z9+_;+U~YacKlDa#Ow3VI3d}>AWkcVH8&y`vm_CfU**CeSRR%Jx`kN{V_52m&+4MGdV<)+fV)X=Y@=ic3wQD&X zN-7$j95xNDwQ2j{Beq-h0qiRO7rkxQK?g>h*5gJ3UY`~?D=!Q#JboCE0p%&Q+*>Z* zdV7DzdD9@qNR_D=!o*LF8M5oB_B~fluJPGhE8a4_JZ7k3?!MHnooh36zvLHtSJ2&N zYi}C*j?0uwcUpToisrOnm>oXXReHkUSOUG4!5Rr^c2$LyWo}T65-JqkJOlVrCSQe4 z7WwAWFc38aCS_i!JC2G%5bh|1Y#Uu~2lsA^9+ja0{7*S9@!0=EYBXCZ=IGg)lK?pV z1Uze%!{{(p?f`IQ7N5wR#iqzxw00uu?$iR%7UVQ_Le^W_RCmOSllWu4o7|B?nzD5KcsJ2^)9 z!CgvlsVC^Ax|bW~n24|}Y4)kS*Ynpq40|YxpVtYeRd`XPII|CHnp~6^@pdKzw;82# zDnUh#26R*`ZyvHVBF&dbMAVopIUu|)sYHZO^ME{Tn4?~O^f>(aqQm_&46zx&TSXO}2|jK4*o>o_V6VD^qS{BE23$*e z9djDpJ8!X*r;_T{#3Y2Zh}}SR<9!ry@4yjUddsVnQNYCH&J4{~C8#1#fqm?f(3^9) zevR+eF5fN2XzW~iNr3agKsDbj^cx*-xIN&GYnEF-{_}?TWnLKQ=ZtL)d_hYbW?GO7uTn;_ZFKL_`h`J18TU zy1~@{_xWUJ??Ii;|MOi+`g!S)JXC(sf9?dBSD)&7PLxZ8#Ce!HCrbBFX?1)Ny?1xK zM_gwP*)yGTay96M;sXbwdpp8h9OshgS`?b|&~$S#GUFu&8Yfyx40q-zj1G|h1Usnj7HSwf3qr`Tb_wON;){6JbA`HQARH#?n5b6tt^E6d|Z8UmT485d49aZ2<@TV zY46KCS=3n!h`_@!%#T^20L7n7O9%Zt4GCVm!-j$ zj#6hUyaT_uxKm{<21JQtPQq{DQRRMNEx%%a+biCO$Q%p!xhkqA`E(wYjfFkCXkti* zPXCU;M%Iih|qnzb~bhSOo6?>~q*2_HqyFXu+Cr<)&a%czx-i&8Aj zx-{MuaF>h5nlXE6^d^rtLh1v0PzSQ7W;23%i5l(6{Rz3` zQg;MA&vuE}jeU>=tZ)lgOwxiCwpvn*Gt(#)`@@%`dR0Vvcb&l)!_;Vyay;qJ2EQt4 z4!9l!uOSo04S^XU#djpbjT-9NL`IDyBWKln z4R=8zV+*9{bh?T!w@22uwdqkD@R^vTdk6#l(Fj2lF8;1zb}9RK(@oupC7z+ z!?^v!s|*8#Iprko;`11l%WpF=l+o#WhoEZTQyVu55o`9gaE4e%uU zz|=F8x1-tpbK3yqUU_`IRF8ePyo`{v;Zc;>lc1h;&%^drowD2FkQ$8lrA0nC%H}0L zG@qG1vo=kT>ORmqA>Z?4u2HJ&>ch%T*;f+q=Qp<=Yo4SxDObB+lSUgoWB~&X+I#LlxEq(3Llrb6scU)=z{QTm+=B-m0mcIs6fI*2sjb>%=64a*u3WC7v>z1i;>u^_;| z8WhSw_nN<)0E{gJ2rnOn28SE+dp?7NFd@feMMa5NHjn&(C+M^UYPmiC zi|yCtPxm3n+Z4&?YOH~4WJ~J3Ij*Jj5mYZ90IbsUBr-D8CHA+hl^7_y1=<|73cANU zqNSygA?qtqP2l2J6bq(@G~e&$@FNxEOBav&F?Kgkrn%iwWJuFh{!(t)qo3ziIz_Ui zSyhXxiHNU67$spfP4m~;^cbi>I}H)}pHvyf+I;8FEsmp?%c2YyIYTcI2S!17OiEw3 zuqg_ZI09j8w==07O*AzTmbLLP^Z6eFEpC{dZbI+(q;k+F12Lga{d&BCeQs~4%o{wF z5O0naie1#CO%^|u<7D`sy%%{?=jQF&2^TP^Nl1rVx40*yGi_=(7fEt+eW4>`|JGvnD2BT zrw_1^Q>oQuaMe4Ue@KTaw@7--Go{2Z>?zkPw5r<>ly6gF@^_)_!6j<Niq7q_EszEpEq zTq?j4T>p+MiwRxsi%~oX70|q;p=2*LU*J9@$XoU5wXOSc+4Jiw@l_M@cK2@(05;!I z;_@^jsppZBa3)b;^*q{3p(4Sh;0J6lMzm4p$U9T}1fWDOtKW2y=y)Hp1oF`1DT|7U z2|3M)NRI@ZRM>Rgm}P=VhKQ<;+{+#aGu{khGzYf;8E;9r1J$~aoZX@YhQbU*wVK@ zf21KJZ)gfuNV?y-OYq5oELe~<%doRr;)Vkiv6ZcwSU(~o#gS|i@5g@<)LWB8FpkY; z3vtrfG`1)vH!fHk*g8LX#_P)p=V2K!hIv(E$kDd1Kq@HqSHa%{q>ZrzEw5-=d#7My z%iMh%%*L!8NP{ZS4OeT2?JS_eHb|7y-8GGhATFf%>6ykv&v}U*NwJ@gQ9zVr1yDU; z5w6}ay_z*@h(AP}{La9A+)8yW(h(VJ^_LrfvIRD(4<4nqnIAH&bgS321E%n4O?$!s zW4Zk`Gv@=g2fn+8ZVR0g`6@xcbbpW|HD|X{x3pvxZa$$E7o;WX8teUi?@$vA#6013 z$niGpriw92+M^2hbn!v(-W86m`=_3o(v|e)<92R~6Rkep^H_>&0<*LPTFV7+wO20asd;i$rE?nL$p60(b z(hcr>lWCfY6LPi?)KMB7<3#W_ZQjK+hhyT{!$X+m+FJ2p#INhcscF=p?P-(7ae^NS zGr$Ic!|&Q!UQ-fl6u^<@{3zgTK~;Ldb)o#p(|w&9tB z=mL=^r%g{CUWQCls*7vDm+n2=7mO~(D7EHv%6+d^;E=VJUiQETS?gXeYD!~`#B#Wa zMuAvHF`4)lNX?*sM+$*tMf$0j9_J1md%E=WfGd&hrk_g`f1x0L7F z{|_Iec9&kZHE!~$!1qD^jSv>wYpcml&E#b8Q$zW)!g(9}y%1cl*wS%~fG#||yfx!A z)8Y5x?HJV5)jM!+CqcKXgi-U}v!$lFe08M%PkxPa=Whfv4LLbEox>;Vl!Kd}$MJIk zw0!T&4oJ9IV+wY)m~Y5+3qCUP^G<1{xuASnB}x$fI^CPpv^8Eu-h_}QfLrT%jK4lo4} zKoy>IgVVQ5b~Tppgu3>ltq2ZzPOWk7P-RDa!+(rZP+H`+>uuW(qeA=G8z~jSKJw)0 z)qLFEi(JqDR2JWIe4yxK?F;`gT9-tJ>F+>_w!j`6pVxci1uTaUK5m_9my^Ft`@FK` zw^L%#bUzWyW22Gsd~ltTv97BxTw~@=Y`m=eoYNTL1LdAfPU(2RcJI|9Z`)}Ge)Zs$ z8n?l(j|B{_ zLtDv5XCZ_VJIE5`cFhunRb;xCVli~JVv7s57!~(5ldp%N1l_pg^U5HqB+JXc#L}y? z2rBIa*q5s(=^0&MuxaS5<>aG%{5j$gifTPAl`}p4*M$PFgYIF3;KDp-ko+TPSEOl= zQtu&<$uby%<>V+z=lyV^)KiXKZf5d#bocY?DXzBar|G6SA7$L18)VL(4Cghe1(-1b zNKH-cyX=-nRLGwNi`kgDY{!vlu!ncV6aVv;3mS75D%>`P;cC0_U~?(mLV#HngFO{y zDm10!EKv*$3^>TGXb9n>Muy!=rK5iJjWJFKUX+^Gtp~9(=iJ1H%9HjiMi@t(?Aa`2 zxBL_R+7+%XRNd<{I?z58lPeI!CBu3GI6czFjMw3L^WnN`FRL04G; z?F)d|?imH5(#b%l0rFLCMp&=eEXhnEw~!!tNZ%j4ODe}(giPkacjdWpV(?15Bo&fe zmibSv!>ur>yDL4S1o8*yX=jYY%6jp1=q=KQQIEHR4jt#I2ZH%*s8*IW5pG!^(bCY^p>uT&6{XQ~($#+b6Dlwg1!t=wX1Lk)ux) z&tteH9?KtzgqP8pv^g1i&R3bY;o7NObC)g=7hj4O=}qaHNr_XNzLdTJCf%dx7(>-- zzSA?8IvO4$78}0}oO0+zgoW59%FD{~=@3U`R@Igk9bPad-ho1!{LukuE?9;o)v6^Q zSn6X{BlDWk2mJAeWywyCBe${7IlWLrtos=O_u4@irMN*2h^L$t(;KaBo;m z(JXf|e?YZ#Tsp|4pi1ocBitc2aF9lYY-$MN5@D7~FzGrh<7mMhB(iZ3KTyeHpeue= zlM2pz2j$RHo_B}@l6$1eH%42Pr!rqhM|+NsjK~9obh!DF-S8z}ZFI?4-zY95P~aGd z)8`WJOiN==)J{U2^RJfsm~QtZ#mCRk<2zlM1AvH9;f7@Z5D53_@O&y66v!d~1l_T< z&T5wpy>r>2!QZ}pBLY&Ei?4{-0uO&~=M-`_@x5eu>rU_}Rp|K1Pw*El$!pG^kWJ4A zZ8V$j`XrQDCLX=shQ)}Y)8#z$VHKMJwft)Q;F(AJEZ|lf`XS57YzEv9hm!SonPxqzy2cs>_mnS8fRHfN7J*-tS1)P)8?6e{=V{-(NQV6vth;-13n6Z0n{ z1R=^ZU)qtvFn{Tjzx~Nd{yD-3#cMf zy9aBjy`i1~mQ-&L%cpR4U?Tg)MDiv`CZ!>PJFFQj@>V#yykLALmpuml)V!ddM|&C{ zwyFD3#T&5tzw~xJNYVs9xiXPVC?&xHf1xC@={N)@fnGZ$>Ej$oQ zM7e|`k%D-^0O*;VH|MH%D@0fe5j@o7G@u%D3X?5qy_xu8Y#5#i-BXB3DMM`hiGJB& zDCMgE)}s z6{VIGBCrMP8ATqTIKJFytQc$<7GtWkq%wb`IYX=;Rr2StToKpYxwgg0uL#8nz-2sp zhIdPP$tp3dWHI%DZ|K}!8{7?!!DDrtskBm`=}Ya{cdZFLKRX9dSLTLWL$^B#6Kbg86 zN5sL8>B3#bN2vX5ckd;xN3Su{omy&sw3jdig?MG*^~K<+0Pm5xEmzO^_8z2`C1kE9 z20TNhBQpO?A_-A^?nt=e&5D97xJIW*^GL6^=E;?moZ30v3JuG$_S<*|=!)$W98Cbp zwCJw0-xCwdo5GeD9u25>-r!zI4WXn&xoD~T?#lh)CdCQoG6W)1E^87hl3!d2@;V9Q zJsf@?=+%Z{)u3adLpw2ixADI=0qR>yoFvT|U;u|(xIFH^QG6D#X!Ys`4npL(r)?i! zb1mp|ka|z5t{%V#wuv1|0G=TGXdc5RlRFAuOrbCwt5Qsj|g%!I`v|XjQl6lfe543 z-}Vojf_QD7zFxFIoVxB1X_oN6(@iT&u1}MtDz~3}a###q;K~&pr_dtT~%FT7W!t75<;x8@U z>Bh=JR=qNm46&mU?>uod=ww4huT~pz3RqhC*o1JWoNLE2Gg0L35mqWCs`;1A`t*zq z>7|P&SE~pcHEK)l`n5b0I^og{>u0UWT?NX9X@fCy&~ANfw=*CLe@%j3fP|c`F9^mn|9xmIQc~Z@2 z2GdNPux($fAVv8FhoLxU)h91k#Ns{qs~iT0=U*%I*p-DJ{ly6ZD`v($BZhA5?ab+ESU!8b>Nh$LYl7v}SXu6+`HG0#aWx(j9KRkDK%)SN z=_7+fH63L7aIWwv{qtmr=aV%EKyybIT%O>MHf2V&6%AWUY=_-K+ z=E7&Y9Ify6>am^ANOo2t3@S)BhW}1$Ea%gMUA*Jiu;niIcZ^hIMQe}lazX`&%Inb9 z=%(0I-hSp4mHCH)*$TnHv{$j8Y85CWc9{4j8rhMbskz@z>XvUUKf7RbDbBSWZ)W$C zLIJQd-Z()^m5<71kvDT2F9}BdkkQ0v{@e^0!fmIYUl{XEJy^Lrs+h>(NK8yjSCD6Z zY6`Ye#3Nq~he|=A(b3Ts0SKRmw4j1gqQum;=hJGzu#D1~9 zDIA6vDJdZrz)_m@TKlFqyTHz#&H4Slp3Vp-UX!__)a73rjR+o^j)+NhD-g%MeA4 zC7wD02grpUoGfaAp_0=lTZ*W6grMaCKJO#9anCq!CkfwO?OORuXxvs}y7*b#Y`D*E z`COZ@-g%Cm=FAVtzmKp)G{>A-lvZ=jK2$_I`Obt=@h3-7HT%$*NZIpIeV#*z@(6K} z{!s%;J+S}PHnxEpPO+8d`k47gBK#d@vFVRzfYhs?r>{ZzmoLuWYHPVR$o9r$m_L)s zX~6RfB`;Ecq&LKu$aG09A}okJc&T?5s6Qs$;s46kZqBh!;Z_~Jo& z(Mg2%_GOEb4~<{gbi|NAkbtmxU!D5og}$nKQ2eoUciFmr%lrFOYoo*>9Q|5P@V=;? zy-zgLDsM|D)+oxa_VWMC)Z9x01d^^;l$%osJ)3Hv>rL64kId59KHTD#^B?o>{|E%L}coFn{SRGjWfj0zDFXR$nupTesE?@6vjv z0T%~!SDQtO+wFt@&d-~y0S#Pz=#D*&>z5jGAH7H*XtDb}{wLPYl^)f6cBLf_SN%V#U&ljL>9i7BRSCtQFECs75tH+6Om5Wgjf)Cg>HKI19t={<)8Fq&MT% zh_URVxCmnNXB{ZI=Yz50rzN5nNNcj6k77#F)E3<=q~S%oU)}Q1NBxNT?%4Bmlc2=M z;MZ!Bc&?T3P1E0%&n|N%w9c`_&x*O*k9xF`zS%pE$LK3<&$iNA5_m0oY{e1Yj(=0% zMTLB{Qf{>lLc4uu7N(Nw>Oa7TKha9M5IH{*3Y=+m4*HZ8I@_cyZCFLeA4u2BB4{M0 z$DWhpr>(z`HerL4adBR;m86#72KX~F9cH#I!%Ov1G`R15Sxy~m3h$+5 zJCmM$fK`}Z!LSP51K=`23f@QKkmru>^dvddpN>7cuCG*hcN~2ju=ZL5>@^xuRcQGz zbJ=E$8O{;97<|4U1polx+_P zvl@!jq$Y8N5QMq4Z*v;B$Qu=Y2PC<4mmTf7kD>B^qy1ED3MHI_`UKhi^|a0xHp9-+ zD%vCr+MQKsxEbPXYuT-4U&3npHw)6M^_XdAdXIJwHM62)XF71*IITniB|BX>@3GQ8 zB7B#EewcJjd0z3pxmw^ed+jmBmmYsispdL?V!HKEVBhK}=Bo(~R9Z;SN# zd@(}A_LP3_QRIY~Wq2KU`y{+D?Y@QY6XDd?UAq8x*SHt}L3pRT(}TKZ%ZYUEOy z*gZXda2>*UB<{9$Qu&m}$RBwIGk&*10+JzZ-tLb3M`B`$z#`c2wR_p*rE%s$ytcQp zGQ{`hsM^0VH{B+12_gu(5uLosJCNJ~(6@!yNV-*<2DEHC*2L^@u#31bI&;_-1vh_v z)=+dJ+^zKk!>fz+D!NKx7guOZhp|Zq$;rP)OzhuRmCCIT1qrv1m#CdcMZwUcr4D(> zq1ZMpHqghNg~xr&WiNV<&yLZfjo~s&8$6%sGz7I=Den4wJVDX6CA*nUDIQr*t5;_F z=xcmkMUr~=AH8Y(6X%p>&e1{JM}OJZ&cpv|q4#%`S$_(1O2wNPoDpX^t2JF^Ie{-$ zE$~BkgOflSH%iFLMia?B-EL48KVnUL=+^CdI`)TpL3AJD1wRTAI8fq&&DZ202JK@lNxjaQmKg9>5~=Q3MFG zoV2GI>pQ?8WIQa#2yujUXY*&jK}ux_?4eV#%D0|YO_x*4{(pg$fe zemqm?@`KsNZ4HG7`Q2F7zFw8w$9Nuxf;&ZUqj-BR5xF3`9-=Qy-IRIC(oTr0>x=R) z`Lo?)QHTE;;6Y|9jkASR7}MXR%Sa6rDXL`a0^H%v4?cv32wkRYoMmdjVY;E>i!7^5 z%3JwLY~vScW6?_lL27CtWqnS+F5b69tRah}AD<~?o=-r(KPyd3X?1B2WiFwxBtKQp z#dLURU=*f4!6VyCnR~~68B4xylINJ#ZKoFLr}_GV221l|cU4qUnejF&q9*>BIOa1p zaZlr~0JAPv5J!ynq(F?*z0Y;FN#cVK#Ohr4Frv3D<9P5u|42d~M+AT4n^6DnijYn> z@#FT@v(Imp+2`9Myke*4t+=sZ6z|}|3*XsSbboKQ?+1v)vO)}*U%1;)WLN&uMUo=n z`Um9w^6<0Wi#>wY16bXDbCwNltfS zj`aV2O+|p5m+O6Ws{5+!zLtIKc{r4>Vemr?2lMmkavw@<(HQUP>l3AXJZqbd;gaTuQM_o7s(U^8!#>_7 z#hWfLS)MNw0lJ7|gX6VyQ3Ppn-y&PxSa~DmV_f<(L;49q>YdkgH2RbAt5zM(%I&VD zQoPEj5TZ->$M=kgGK7xbc;XNdMaxmd$Pay}eDwVtyOmX3Rshw6_nq%wNk#o1mZu7( z6mmrDAQ``OJ>e?|Dk>UZJu0=i`k}bP>MJ+rQTXywp%DdHp{u=e$!T(Ys*FtLgKDi( zGEY#l$A}>y9VZ^hZKGu@?pfML^eo38$hLo)DRwL1Pu){ER;I5{j#w$q+$FNRj2tZv zSyv7EIDB-RpO4|qbs^t^YuUh?UiBL`yBG$4+s85g#6@Fx@QaLdH;0ft@8>TAc=qU) zb=VSMlFYT;11Z}vJ?#wthnpf;7{#27}9RakZtbNmNqkr0Jes=i*< zU>2WMVrFw%K>Gf{wY$oZ&vK=S>7*~sjmrMlKKKTH-2aU~Bo~9NjD`(BS%qmCQP;6l zUy>NQq3PI_i9&3Be4#=8C_$jSc|MahC#1{u4Gt~G+x(v*1UQZV0^(&bk$WozjNcZYyzTKB zV$T$mX`5f`7q5)%$EHzOfDCt5`ikFWhE5Q zucy(^R|#GGnD95VqQunYZe*j{lcY=7AGfJ71uT+1&nh5k;Oehn3z?d1rJIB}3aRS7XlNR|GKg7J=8{7@zsscRZYo?$P1zw{v2VlGwz9cN8`E#*~tq zUOvjOc<*DjyL-vXd;Dy!H;;RV)WaIw+gj>7(Hkq#X+Yu=I+$kO)RY#s`%_hB@b50( z8>6dY#`Us$$}2p0!9q0yo4VNhPkw@IS>?I$&vk~bgV|S@!dRDLhSfco%Av1ReL7>M zkI7K{wNml-Mc=5F6+82k+ctArn>SQ(MEA#Q{7sft;%z%NAm5i#NV)qy#hdncDPQ99 zsIGw0F)!m9ol#ak044Q4!fi|aQp+!I`eB-rPwq@#yUJjdP@2cY+;r#z+`A+5iMPUsGfk3>O|O2girOcLnMi0msSO) zxTr|U7Jgh$5V2*LqCP@LNEe=~?TP+gnfoCbA3inZM1n9>>rGrkzPlES7mlH4oYM{> zlNRJsaqOBb+rA&k>|}5CL+E-@(S)Qv-5~s!>w31`ymFQ|NSOw<@kJ&sw)1&qC(knE z_$MFpGwIDT@kh*0EYGI`xDs**@pZPg1dtrJb2-SRz)K+C0z(88rE`mKG{Mc5c1zeKP@FIOh=1 z0z1Lx6`^-0!-`{kJ~t)oT7#g=-pAn1J+ifj73zt9M(=&bZ5gug{qQASTC%SrO+m~d zIU*-<{Cm3@rq@-j-{z+t;EQtv|0O%#M!mpH9x-AGEo8B=g|FZ##q(Elf1DL2(TIW7C$|lit*N zP~RO7YlTv`y|Az^ux{Ye`Vk|bcg8FZ-?$P4SzfdDD!a*MP9aIrnPn~fHRK^HTv$V& z7|Rx>iL2P0X7tbmbYh~a0xll1lNTSVHCl1=ca7cI?N^CrJz*4h#0EDiMx?z~u?6_g z%5SKpGq{4T!($2U9%8G3xmgubytNlAv5blLKU@Ef-s8E~v8KdmDG{i|6qn znZ+Z+@{EdI1SR8&9J`J@9X1x%V5DTosVDVaVkpnpoL#P%?dg}%8-EQ8G7L-8NvF`$kJK-L>Zi9qhn zkmtm(TMzRVIrp1l8j7!#+y5;23lZjS(-8LXRWxj(E)8H_GhMOeJw<5mlRMrglDHnn z4w!D}ir{L#?u8CYY#RDQ9hYO0{)L;g`TQkDZ-GLhO%&(Rj^OV-pGo;D#oCALq3JU4 zm#QUSzu<#s59CHq{khbi_BdHK&Ers>K3J#yAW{{=m+_YWF5+w2Mb^p1o9f*h{%>NH z5}GvrTW<+o9ea*)VjfmWgo!5)aM)S!$JIAq8coI-q4X^)-66_;xMI2?_Dtovu=Vu}Zm6N-F+J4Zg#92NBM?LQU#rxxI+ zC_Ll4ccUlW-geOnby4qM zXglt)f}{;Wdi5k!D%JNlsD6{NX39M>nIie~wNXhh^)2&PwzZ!*jgnY#R~%k_NFG?7vZ_;Z zn4)5+v%>%8-gw;K9=E2sjc~rZyaEL_5(v{^E@%bpN&I&7nu|@#($>u1;IX6Y)XA^s zOfveSi&Z1sGrbI^1%ZSLzR5%ILW{@a)Zndmlm@kQ{jivtfnx~OrGybi7y8u>6=#Ca zEd@tmVfDf|g7Mp;r<@xeZXx9pB@KC%y`Q&oP8Uf=YPYk!lU55pu>U zJs)~o&qHPNyjQb({EuB4=aML{ z-ikN=4^v+O)mG579h~CsuEo7L!QCB-YoQc}VnvDFsjnu`G3q?Tp zo(r7lV1oIFn-uS0taRX3>(^>XYHlyWp$7l8QbYk~2b?59*KG=VSg|a1 z`CJtlL7as|DZ^xRi?6gTf~HuGz>R*1qta@1nu`o5&AEM85#mA$5bFD??F>i^=G{#+ zVLqv5X1TEYL|5VB2Rr^~*R%Qm?L@))#Xq9+e>bl1i~s+}eE+*!h0%m)U(4wDz6MiS z4X5*icY}g^^~sG(P`U8phxQ-;yYfq0k7Jo0&&?*9YJ0J4VvllXO=nqKoNmSKd38QM zp}ash&#&cM{o9%flDEkyAH+^Du`zM=TuI2)69q0m3?#8nYV{DfOk9KgJ0RlPE*c&}}Wb98}}}{+Ox;q6-QUkw^mpJzBoL5(g#w;OyLNboKmxW)|o5sSJduOy{2$ zsI#D6`&=&P26^4*xtX5dxV%+^p9@UwRjw^lVS6`x)6-K)sC2pF+nnh=i&=JCPt^o) zi`viFll0+y&_ZR$yUsgnUNuL|+?25YK|=EjP+?F|`AieIxSydg)sdmk%F zSv@~#`MU+twEN;;{07l7DZlHFFeX0P3K~(AHM-FU+%W4cF29_$bIkgzYCIK>+gax4 ztWpbu$il;k=XJgZkM_Q19i0a~XiMGin>*%n7bS9hjNj>ip2FV;(yf9pdONa|WKJ$1 zB5P|JeMh0XS1(FSpT(g6%mp+~AXp!pgJN~0BsE}n%1DE;avO89sG7BhhUURJ7;{VT zlO=0s)v?J<_QpsK%(L$Ww?|0v7U17mqnam$wx>`Agj;rTqGidXwRb$HG;pc3x#suI ze3Qzb$qGoOjW1$*}(^%5K9_Iq-NcLHJWC|3wyzDV~6I&@qRbaXBu@)_Ow67 zatfBGxi8A?SJfI(KwKy*5&2wjRLXqj-778j)~*;ZowK13*FiQ%b0-e3ps#wMujw8| zBfp9uSu+5kc}EEWK0yAxUHl5n@_VWoq5AC{KZTOut|=bXW!#Yk_GFBdfj2B!YQgGc zYg=BLxk-BOJ8h^2hmpHXW`MR8PjD}P*u7P_u57=h;IY;m*Jfoq6^Vg8^3#%Qd=&x| zbjP%_X0_&-)L1wG}4s z*i5!{P9ef!_#CSAn&TGwpzEGCgByZ*->_CVvHkC2YLeRN)x5IXyBU%Op``gCUiAjm zT`5V%=GSk;x}@O+p#Cj1Tfciz`IYP-;7`@t(eeCzQs>rrKpN=bQJdbIqU{jWu-cOU zHTd>>-M{=fN(;h7*_1uo6|yrT}x*KP7wY?9SMXVGJ$iB2}U>tcL~J9;c+? z+M~)p9L-^gn5pAl?x=D$EjdZZ1EFDR2drrb>At2(5V>zZdrkOPSVG{2#TqBM7sZIXdAIF(rgLnf% zV`qTdd$?}u#Z`+!V0rR%z$E3tc^d;OOu=ZI0WKP84SAhO>uu-AZDK?GE3e5>F@H*~ zBB89z6@ShedM?v2tD)3th^5q1L|V|eT6AHv8jxt&7>LWBYSP!tKH)}Gu^M8jJrgAS zmE=2{=Aqe)*mQ(4bVh!~=oPw0Ns%>f1Xz8$`29UBH|V~5T9phBLN4b$4L??Ti=wIC zQ(f)%+a3D+$VWRHymQ5S78#zQh#CT_q+Ry%-Bj8o>6#ucMqUmg>KOF^Gg6nh|mb_mwJwvM=7x`6ZejmJ7C(O_PivAU>E8E4es znwhtU$&)0mitiHBJI(_V9`WX=2+cSh6fTbL$FOa$#FG)8(G-@>m*+f;-JuYc`Z;yU zXD=fSfo>@X$!v|AfXS$1()P@)C^}mt#yiAlR4PklrtBF8ZCUs#@m1uofEDH|s%yz@ z##nd_niHe&!aq1ggogrWiChMx5-&%JzFM5wi7xM1c9Amw3$wn4E9XtS3UB`eab`Xx zFc%i}kSP3Iw?2B+Q(hg!M}8MSrVf<}6Ezudsk?CrTX2kmL9_=YKNjOLpJ&A%JN&OKbWR0PKJbbi4 zvmEoqd?SFk(zuWbv+iaxq!#xUqmKYwbf^3YsY9K@qV7qe&Scoajc~ACIk%q>W9Pip zt>I+Ux%ny1N8RYXh!Jl?YbI-^!Q0cz~a~bua9GP%yS1C~Ov} z4v~RiCvO(_La5gmdzi4JiHB*;N@F&QjRpWLvMD5t^4CAaOra)SlekTK?6~B^*EWcVMV5K7P!)s4<{%pD7l#e`AUro@L8EQ9Xa14{oqzIg}Y5`KZ%`1 zM|_KYX%*QOW4R&M-4!VgF}}z+2WL_z584?ED|QCR=QBPojw1!gmi*z!kxdg~-6EJ} zuvvD1VD?j=jykE2sSHO_;42KPO{E)*pMvDwhrNv*O2c_5GOqa4etN{3Fil$ebms4e zb*1+>rS1FZsAq5~B|us#CdqyIni474k+lbiZQu+*AJ!cXf$vYAt1kwB|{g`|oo-rN0%sK4LC6pqhpoj|*B5LVe>NjS(=pyr9#Er0zPt#}0qO{j`R^_N9P z@GiHV1_w8UbdHSUXOcIw8ox4s z9(?qg)jKLlu9~9L4XnEeuD|dbtu&tDA>2*;F4ebPb-)^Xi0zGJV*4IgS^@#2Z4hg{ zv7~QH>-Pc&0)x^_hUHh}AW+s0R(>WLrw3WyneAKEQiOS9s19bsVx{A39+Hy;2?Sl& z|3Yd0&1t(l))qr7|0%a^g%ZcQuVB>U)~|ddXfx_oCPe;^e^D^k352bUrZ2^Uh6ER& zJ8RsM`p!N3&y?0pn9mQ)VlHZKBoY?)GJ<~~9<0Rz_`jzNIYq&xz(Eph6M5R>@$qJ( z3xc;&mh-3!wuG^05ZdhT4!3F4YyK(U@F2cKPBfBnFA4%tVbdoP`q5^E3!;v_&&^Ra zqyt{L!*BC5yBO1Nae@qd=?5kEFJ4^v5Kpi^@z62(ZEFvYu-`xFp0 z)z$Qxu#F@SW4Z;=ub_Q}0Gzsbp8zS6ea>GH%Oiv-hp|{ZW%9{Hh_pMwX6mjqM%56; zFwqpB`)`}zT?n_=YVW%OP0~Fq2`}v`FFlm!^dr>GTce^t`?xE%-Hycl2wjS6_x#m` z_4x_vX4+y%f6q-6XmpX-?0)!6E;DueR}7z;25Q6GgzTh?mCp5J1v2^BBz5hTkycPp zKWE5s$j$|vKqB`$U*{g*Z}-IX3XcX=r@`cy4fltfMri*KKne? z;N?wF1AkY%`7+Z!y6#_KyBx&*OU<)vCxWUyoX=La2Wj1&<%e4)eAw8BeL*g>BMaO- zyE)xQGvyD9l~y>m1l+;DNXHDD!NI?Vkdad~KF|x%O&s_($B7xso_{eobv1do;uL3bO(E#v2eNN` zS3&?(0VAaoocPrNXLe#fpw;{O+=~bN#iKli37kDeL{9RaRZf!X0MTG_(N{sS!~EwD zlO{b~Zru+&is}mPQBD&l8t=4Q7se&lB5O`8TE_5+-NTTD4b^e~ZRl(s-*;Nys4ZNL zNZ3zi> z_|j%0>aPViM{xt*$}lYVN9gc-lu_2TpvwQUZ*J3upWPwj@z2<{aM!PCq2-XBSU_65 zLDkdJL<7Z{{7Myw&+E+0HuS22;tnRymi+o{P4w#N=b6V_Z!gHqO$^^&WKfBw)&iAN z#k{aKbt^r6?gP?q91eO-ZpWf-$_;;i7DCHIc*aQRCkHnL<Ga3nQ`^<2YBY+Qc&j2-hMku>8bPN8zg`;Hv~pP*47OmXo8>WBMd?CrE58hU`(5J41#SyaD4Vxh_V z-xALwA|h+W9cI&sWpZr;53W*Hc^h3zwY#2EG6q8Zk7Y4lx8z}|o+*Bl+;Z<2jAgpN zn@X%n=(_Pfk#$|)Q$ks#B%7dZc>4&`zgxcg4ob+{7Mdoydav*O`596t|~RZAY|&_Jc?EB8Fl#!KZ&=laat zGD*`7mW-y3ETR~}<0cbMANK7!aV}GIS=DnXn6gxa=|p5BK53%swXxd#U~N9&)?hb4 zmkr6b%<5;`vst$5kmPSkkg(G%aU3tyX{|J6i2AA7n@S_}1F~u^b@|LTc8}APz})AA z9Xxv2J&<^%5*QJXfNPZv0qRU6SFi2Rixvh1(|}(0hmx#5nHNnwirdK~;A9hn`}cj@ zLk!wO{JVq9@aj1!7^r1>9)$&6mnV)<&UaNJ|FQA<+?kJ3V`@{_K`@hp?vtfl!fp&E z&{o`jWhiP`P%?*IKp(=Wp~8w#iRT8cYBTp#XhZ-u*k6BZ#9GJ_2R5IQ+r2`;g`OR-vA2X)+&7%0-e;Jmgsr>;jfgNdr=cbY4EuW+HkpDrw4J{7>B__CTYrS>q_NG zwrA!HNwF!zch!DS4l~B}ygnyR`vRYkz&6eH)NrPx(uE~JH00w2egVPl5V4y_;_K3! zTJ?JzX4fkJ;MdqQI2=*gxNJs5(`tCR?lDd0XZDI{$}WurWxBWzSU=c#3e5)PK6LD{ z4XANN;;$PDCo;LC@H*Ic{^9aYnc&3}Dlkz&;8Yj12MyqWb(HJB%fi(L^mwj67oW{y z`@v6zMfP;e07< zP5x&Wk+bI-nCa|3e}+p(?t;o+75fmduGX@&=%*Txj%s!=@x$LV=w;aZoDGf^>woh) zJf!?wcVq);F#D!G`nN6LBp9|n9<{-vFuMEQot|HoELI?PlFvt0(ZP>ka_6@Ry*%3< zs^FvnxTKv=%75uRwZ`OgFMG9Xp)`2Qk)>7WnI)Y1_BEY^t=hxr#o1V1`Ogw^XSzq# zqFMFsS>ba32(MZ`cF~)dFrF=|Zdp|MRAz9vT;nF%2&bVdF-FSIr=`BPGg9vO^RIYrQz^kO5~D5HK};5}pj@wu zBpD)n=9yGjElWnKivKlm+^vNHmJn5s2fpZ{_m^7 z?N=2%wRF{mp)Aj6Q-07F6A0$7YS`M8cki}xGs*+nae zuhRN8g=|Wss{|Dud1;XpDMcM{c{x1vnVi!jf%b-GH--A?w6`Z}dgP2aex+bxfvJGx zH4&PBi`xceJ2w(Zh6Zl;x^0Fv^fG^bOF(Rg#x^RTf~MP{V$N@8JC|>gBn`&*%Sh&z zJJlw$)}=3o-%1B>eY8jW_;ifApG&c}A7!K}yWb6jY*l46aRxm0l18PyP{T9A6vNM1E>)}P08#U-KJ8*Gzb$H$fbGUw2n zTw}#brspKK*MbdoCQW$0b{0`2`mKQ?#=IJ6LPf_9t(F18-P8jbWo&vqLsp5$AP}-_Appv1&W1+KyW#Z@?*+ z)%1&PgAdo#6%(p*fq?TsaW+%6xZsebFW|`15I!vu5TR&60N$!!!tHN20*+}y#L2)( z?R{~x81xp~w;FB7BmpkaKtxXjnPYBkcq&hN?6WJcPVB`uGD9_O8h3yI(?CtX_i%m$ST;J2y32Q09y4E}kPT=F zZ3|OtBdlnmb;pC%Aa#ND*}+zXGmze!$DBgb)~4p8(B`Xo@yBTkzJep2%b53Cuk4zf zKXloUE+^&6{R(XKhJhUsaeJa&pWk&~*hYN+#y&hiSH@0_&RkWRtU%4hr)OKmDPVd* zP*xo6t###Wo8b5HLOXIu>QRbQi#porQ9fMBNKUahzqU!4pmST2|Qx>=|+Tewt0DTZ}l{KpA{!98!DFl$2S zrOMF93mryBx3Oay?&|J(y#S??_n=!1=@_aJOdri2+}pb};0Y|#6CQY3>VXg|mhe;CFT@)$877Q6F>yB68S;%0U?d$xIc#?{0Kov$?giV- zLnb;Z^x2;kC3Z;o_TK*evE?7|$NY{dHZ$-5nD-MGKs z`_>#5H_8c*S3QbKVtGjIjU0#r&bjso_0#X50?UjJ*!ALZY%^45jz4aMDWnGZ6M$Ss z8)|0_dK8qsECJvV`+I2ptr zKP)EO?WBU+Oh^Qg=B~zJa99HIDu%#ro+IoNW9Yh&%^IEY(1+yl(!4{fl&2`{AprVP z0gG0`+z`rpyeivwq8-tcdoOz&H^MhAO~LH+g7yTdzc*Pwmex>d)sPLh?Fl3`6vi4= zC)r?C%0SYnaw(4N&tSu{h8I+ti%;lTxqY}=4JHu1vKFH}<#OXsr$om!rtQA55^XdD zH)%@bK~vg)o96n>@)-=Ki}dU4fBhNe7cjlAs*uI+EeU4^M@=g3nP?TO6LnXsvg_J6 zPj$zIUlvre>?y@xi-UX=I1K95#qiWcz&`L1b&yE?0y{r|#R-#1HB|^G8N`tReTy&39=S*HjiX&{NP5GmdU-^_7;fnQ ztm|V7kgyFl1H-ke6&|~iLz!*PMJfeRP^O!s5o;tXqG#=i*~P%mAJj91f0(b|(&Xc?Ju_)a5ib4l z<&5#>_jB~vWe{=3-)UOshTMu-Y;Y}qBm8jMU1K!CO&2SzscmKC8Uyrw^$`7C6;dg0 zsH%4gllmcLlB~$L0QT&84s!-M2pV(DkopXf-k!S_iv)i2MIX05X!(g8UI9O-ZQFh- zxIwgstmHP^ZISZw;ltQ0Y~~0rHHi6_;(?6Kjs5nlCr<#QvAF8b(SH(gyT{buHLlQ6 ze)%8zTisA?3OU!S&94mh77j4RT(Ryp|6o!VM=Ib74^#Ey2QMi z%t)v6si_fv9OCtM757*+{uy(d`Z2dqvN~&zf^3MRH41)yiU9cuPiM$o&n~O~kU>+C zFX_h`;{VkGOxG61>?L9YXrjgWqg*sU`-TMG82N$g|8SaVPA-X~me)ADB{Wu6$i_dX zPVDL!X4W?&dZLw;SBfl;4HxTg6st3Tu7<=D1q=1@rKiY!1X-ws~rE|OX$)~UMP@5Zh%(VwUz-EIZrUmo5c{NncH z>?Ao80DAK0FS{1zA`ISwLR}AE61})zzu9802330Oz>tHy8ylf@PtB_e5jWL3zgn#b zI(a5PyC9ypzly1pr^^X(wO@>E1_@4pMoP3a8Z~8VwK^Qtj4HcHt)lgQo5{C5x)JEs zlltZaBlneW#YLZ_J9%HrX$?A5M^mSinpNb_E~;^m+Q4%n_7eTrtPbJK7E)w(@SGd; zEnQU}&}wY{*qcVV$K1ulS#0>tEU(s^ck}hbl_fEXkwWn^xxX+2 z)-~5rHHt3q*W7-fjLmN@T!p1!ib6x$v&KY8EO1)P{Tv5QVY8%p)x^*~15XC&WlYut zg;)LG3H~ju$z`;rj{!-h>EwzB+9m;o<#Q93SS(doDI=Ei@5xTAspA4@9A%G~R!8^- zld$QN8$w0ex)%J*mO<%8j5R)`mA7y7+c;O5_KQBdjM30YKmGU1iYQk z?vrw3Q0vt9j>DIzy42!2H-xy3;3n|L`!>>*{Jpxbe5vJL)9Ojdx+wJiwNj1rAalk>Qz~5&nhMTc4R7Am&xD z<=s;}G!FE_l|iWY`A&~^bE)K?AdpO-ICly6lXQX0ub!shW#cVeB?+m+ee=u4EfV9g z!eSHsI4_+<7`SVvoFC)3dXk zqb!*3-E;nZQMSAq?gyLyeH62K9CA(j4zrMOl5?6gS3}~|dG*jj^p2Rw(rAuf$;?k| z_Qz|aNhKo8QV{;{rQ4|^u68Bnw9^ZV-oI90$^}!JXSpwo4R!n<1BGs<`U8Ghn?Oqw z-;9c*gcD?E;9`T5+z>v7UQSZb@4WZj+6a!iqt<#<{k&f|Lw|Z@%^=GQOQA=qo3g!P zGIo<4$k z9ye=4di4_c(`2Gr;J2B+7H5sJO3`mJ{kr+d*vC<6Ai|2fk-(pz#g97p?CCBT-;)Kl zW@{0?HJK5e1y?p=1Pd`Cf8WFyWnCf32y%kW5@9GL0{==B(~cRQP|w^T3&;mV0gWjw zt$YFBEo+${)bz0>+cOiXf`#^?=;JlVrZM1i-$%)A-^^`i8<}~r*FzEv3@2@uKN&&h z2U5YFZbP`EHzAtQ{|sq^P}PXv5C?ANfa=hGOMSvVLpl>sLMa-}B^*rDf937txM53D z!2Y8^;YJY|MGp9%k3()0bk2bP{t6T47NuklkWD^u?V{0%zY434M*ZyTb33=6`KM7m z5wT8a1Z9QHQ;w63*fYV?-MbsAfdE5R z%VK7*ZN}v`5M0@5H=rl~xvVQ9KY;0P!W0d5$z~DEN6NB>iljbw=kFvEno)+H*rf>! zZV7Hc^^Gohyt^7o-l6E$pYktT^Jc5t4RTx55@v06Y;LWNN(xC%%-MHRvvF@g_E|SjAL?yc8KFVr zy(o@7M9+XhR$IM82HK722us>vsfFqXe{r-C-Wjrba$m71pRTcOj9)>A)ib=IkZ;=s zV`gr1fh&#!!p7IJrFkYHitGv8iHnrA(!>$38zO5 z2A+LdlK?V&2N~OlFi|Gy0I>kk&6PTAX9;duXbN2Oz}YkxsuQBDRbQB+BI%G0XF~5n zX@6I)s*&7jA}-GPx!Bxv58cQk1)po}A)5^{xO+IemFe>*MnkGWMbxj&1zfcPMVo{0 zOmGp+-vz9o3UwrEQ%Iz|;{;R5`E3Z`4 z)kLx@!V@11E}nY(ZXK?Yzb~lyNq0;Zt>UDSf^w?-!j4c_Ss#l}>90IOq@am1($Y!Zw z6{SzXAFn;KY))tyD%Rv#cqC+*QZDC5mnRIT+WE_t(Olh1P+eoGhM{CfH@e1VW4Bz* zqbwayFn@qVx~$=MIA0)$*Jzy=WvXLcXWaECciVuXANS%b6I-ob$fe7nzENAbHdhK^ zmYyGC{zsi>Kx`z^8T#Vb_Gi6xWFxHz6=+f_7xJJ_N>FRf=QogCOJPGbyS3@v0dIh#(i-2c1U(Fsv4PFuawh!vY!jBIw2n(a};^v(oAX%HX`-~QJK4ZTn* zLuW}my>vs^8;os_I;QElhCcEHh>ylVO5&nNSZAoPMnvjGamRwXk}m>yjP@=QV)}eG0SIuY30K1&pv==CVxI6jxOyE*O`cALUiFqgYtcuwqMg>3>_GC&TWOo!&(| zfkU+sk5q<^p!s&;#%v)LB?r-HjQi-qW$M*9%jb%382+~GiXC<2V+B!{vGd@?3V>0J z!Qsl#eXS%M)F#6+SZzzl1RgU!SV3o;ZwqYEB+GyK7Oe=y83LeY)JnUhx~1KRXnB^D9cExYY|ytf>=lEbFW=T`h0*KtE^Z8TZ^A`+|J_HpZw8;qPGUK6XI zqW=7dbTyjwhprn3O_Gh*V}|T>-$`@vyWeE`a3uNPeGb_;*x!|ox5a*%$HC5^h>K1) zBxZ|UZljvKR)ig%Zy%o?@`+Fzp)=vd9gq%jWoMe8oFuseWa>406Mz%6jfq)cnbA-- zM4{Pz^gD!kP`5qW#8?oon8k>{hTV-nQw?gDRvSkMPB^lSilC4Ie~I%nr-(6m*D?+? zbTDq;4Q`@)GxQ^sW-+3ew3#v-2*8#MwiC9i`w{z%ya?G)!M4ndNb#u2DO!D`xvS|8 zpt=-B&WAgxcO=VYL|zBmw>DLeirxvr>cXUR;@E82dZe&$_6i-X0y**usG;Q|;0#Bj zFR_o->LoR~BxG1_7XG45oH9&#GsKbv4a>ftj6t+Mg(eV!71AhdrIj>F-HsX!-0(9Y zmUl-Aeidd!=%B~A+xS!)5;hR_%8_@gf8VDsUd-h3p94z`&TN}#f=I2tcdi|{#4T8h z;2DIQAnhc$e!iV%kNG~w2bz}USBfZ_5BJge{(*Oo?aY3Ac(JCHmLw~_R3kNlGTc_A|EO>-ot_nuS7QZ6hC4esuh*N@ z7clH^V3wMpfEKCo*9b6wcPJU%+MC$`UguVUTY`7%MbYFOWcB{qHjNr+iQs zH<41+jqz>MpsebED3!FiTV_n6JzQqn_c)@6&d*}w)Y2Nf6k;xAfekWAJOkBk#ffi* zt7jTaAXvOp@Qqc)KzX85hgwJ8Fuh5dWeb6+MNx@XctpWGHV77ULrB*1HjLU~&vF>~ zzZ`p4i^fPQ#6mTBsM?;BMg|Am7PAi*1Tfl5Y?|$~76FiUAqOQDI++9tjIs{vX7^dON|8TX^gymDbE8$1bgu`kcA`)~E zc3UpDAvm8$U9hyu%hHJ)%jys+SQFsFuNtv@Xt;$xQZvv;-H*Z7vj4Pugd2-8;=Z>d zTMarfA$PnIsum%d+0K6A(lg`rYmc#PBOzDVL0`Lgr#6mj1<2!fD6VUP^k|I zn;q3+F=mu(0ewSCfieHfTB5^TUqV&0ae_nkqan=I>p@~}?5X%8XemXo|NWsg6zmm> zrw&`Ea9Z#M{D(FDm+GAGoQnM)y}?zu`#-Leg6dtRb}zw6IcnX$!Pzz$U>0*D67QBM zJk8mrdv)8=l@M+Hjl!&B*t^OU=k$1=_J4?&5_0Df6e9pR6J<%*GlxuOZTsuV&jOzU z^TW9>K@@CjW?8eMp6i6(RfNAuKeZ+{4i~MD43RXee4)B7mifieq@vd0$}36z`QF_! zu;<4=!ZdCOH2-P5b#fnPTX&yRq%;06#YkoAGprri zNayokD*rxXZ9eE?*ajgy)#pHyIgL+B{57bCzXI|kLu7uve$a3322~)asf!^0cAyP~ zRNyQ1aE35Y{8rmw4_Zl6pZP`c``;>0asm9#+?Vc}LoxwLp!2g59btI2*KVt-smqXnBLi61NRuu-w8H_cRze6O|7~OO0B0L}=MrAUH{J4JS|nVXBGQz_|8!eW6RR8vOu;=EB;z&+X6ZoQ7SOkQM-l zbp9+fG!qi&H(s15A=2=9pJsh6%GB{3``XeEWBe@!Yjfq}tlhD)gAPn@^F!XeV@QY& zHmhou#)NZZ=wLGlQaf2;Qg(>gQBzum%0KOxKQGq5;czC2qIXk;QWHFCX8vOdSS_&L zQugt|RHs9%{#QtmuF6TF_lXarGNB~;diScqe(2wgF(FN7FzLd&lO$&{R&k)mn&8{P zVzYs6k@44|NhChtC`Ad{%&?$-UV$ABPmr_bs`qY1wgJ+?gY#N#>Nrc>bQg5w&h%>{ zQWp-rYF8jxu_RBPtq^X}iiSLx>aUKYZ%)JHRSgyyZWIchQdt7kg?49!iA2$bw*MGs z8)MNW9~FF*wRVxbzAi_;nKk7a?-c!~b(g7uuHG=s*eY=)e#AIg# zD({mIi})az9Gp*%MVIt~2>i{M!3+zo^MlB*!Z&(g(`6aa-c{;^aLA~r15}??M`!?! z-B4&CusJJQ+Oq$93ReC+b-WSpULA;bS&r}YAW;?B`T4XY5{oQrWKUve@&#=1>T>_a z_eye^n9$vpBbd>7LL1Fr?g6j<*KJ+}jr2gPt2u9k+DK81CDi0{)dlsGL>@-zrB}P% zS!&?#`Dbe1H=wN`_;$I8{k*PATB#l$)k-P9kv_vZH_v5ED~R^a5n^K2A7j%K=|BY@ zf5CIOM0-sNGn{~Ccc}<8=dq}sUlnmQ6_`mTsUpLpFB%T)KX39hAUCRfu_xw0e*j^@ zqZ8pNGKKQHpOl4ep92%dc}(c9o|=NI7KL}~%|!hFekzQlzgv*PYRT(ex>9LT`4<3# zp3TpT*@@3*&nJHNq0kMznuD`-Qz2^2_X}gviDQeu>FM$mFyO+Jq5UE&qK8C8t5GNqteZ+v5KAHa>L%K)~6 zv=+Ghg&@`sCqa0=Q!1(qNZ~pB?uKJv^taMCWzRX7rI*=FJ}Qvkqf0hL#WW`NiOtwy z*>}CRUgGFv4HF+um*{BPPH&?P9` z86alie(UOwEnT`1%YgMghzGj!$z5a9aub;y>#(KidrN8a`}CKBlc*->e=hvBa|x>= zCB-G)pF9{;Hxez<0jT-x@Ed55Dav*I8O+w1Jd-+xag|?%^bnoz(|xHIe+na>l!xk z;Y`GI@;><~f^Re9e)99xyDHB;^Dj2pp8>InKZA4GHfVC5?or40_g3Lu?v}{DK=TG5 zSgCV~6LzwJ!r$Ig+hDsype(flwF?OQsE)fOBZQrrv&1Snl58&uwFho@7^be-p&t;P zuZI2zU7LHiVyi~lM*Qgq!1NBRkb8rk8uga@-Zy051b9UTa0r=MS^l)=0!DB+;s@Bm zMJ$h~ywb#Rz$*-_4W^D(WHBBv{R*OifiOM5TZ~Xuzqg=0J!sDOs@1NU9%9+dMp97a9UH(2J;Ss9*mgRc#6Qgs< znOmkF2!n1uEI=C9YweUHDiI--CaLj~9&;QGv^gVh^@)MDQ6ZnhyR_ln8bUY#gJZxP z(kVOAm_(S{Fo5|q!JI{|W|e;gg)5wGxK~K@WPtwUGrEvA$dkKL!@J}+oXhr+q{0SL zPHVkb8O%}9VxC4v)w6_MFYrt6s?$i1OllCpJ7gXVD@Nd_fqg>~1Q^B;=)3HVfj*r} z`N+;rmRxVNy`{lons&2Qm{y>nn2fTqMq^K)ub@W_>Q=EP^=| zX0&06ErnfV!*2Pv^pm2x55`7YT?vPs;MH1LjpXgKvRayGet?}D8MC`EpHLR^&jlqu zg+B=?4?UY*$k83NnV z77~3@W=pAiH0-T(hV{8c>KSHX0awQnq;O49Z=x_T!U87Ce|$6YDS3_Qn{2xw7~%NLt;;hjZU=!6s%sj{pSN247Y4B9Gp}9{&FQYQLm5Dn1zW} z7%Gpa*r$ZT>Gxi0VIt7cN3V=0P3FR)E-;d$@36D?Go4U`3=y7>aj&_M=lX@2Mr{^; zdl+4MvLc%LUnROY#N4bjA5%>o1w}nSzMbHOTEheZdTts6 zb6~Ct;iD3BBs`Jd=iR*a)84Ou)zEPpr&#$FMIV!1m8F&}JOCOaO={|a%XS0524B8?bQ)S18y@WjK#w77j}VBxl4 z58)xsXE)yP(*vz304LR)3!Zn?H<+24aeutbIN)$(s&EZ^y<3nYM`7vz5svuRfg#ky z_>T%4`q9IJ(PLDg|Il-gUZ4TyoCbQEh8^E+o_cn^B6G$Xdr2NLR#Oa8?x2)}9WwLo zfD&Gn0pROCEmQ&avuF8(P2#V$qV*XJ24-hKScrQ~t+5X2*OmlCBhDI#48B`ff(3)b z_s-t6b4npr7H%?k)lJK~M@AlM_sRS1m2*mxbOQUIa68BI*L8tW(YUUy&|^{YSy{Xt z|4;*}t6<^hAhSR{@tQYn6Xq*j(t~+vN=`pNkF1>JL8py7YuY3jaspj3{klskwh`2LTYY)s1AiBS6ZHt>`; z{aWql_IKAWUxUu+t=@jZUSe>B+s@_+K}I`_WsJFk{S96_wtyJLd=?}qTVK=|g9iUy z`I`l>(LrPo?D`en;AX4MQD>=zR9L@V6}+15)68SMcE4^eFFwE0!B(XtD_UdOmj)Mx zi(sq|o>P^Fa8!-kxMu!EPgXQtQg|%u^Pk7~!6R|b7-anCQ zKT!%!Crht0l2t?)L-T0vOV!rv2Kgxu0OkU?D1U#E;<3FrxMyUsX-Xx$+n3!f5C4YT zp9ijVCjL6XtjdAXWdyy@zP4FE*6R9|_S)K<;7#^tMqYbt4@SypZjAPG851Frr64>- zV@yatr$CZiza()awTd+>LVI$aXQGnCqLDPU>D|IOoCLfDmOZT1#Y7K#b6*CE)@7N% z%<&9tl_)fLzuI=GuvdD%idk^X)}pOczQ?-VxgvV}nlp+^3Xj|20s(qOwyn+Lpgs%Z zCsYwPOae*fhpq0fTCRGZNE8&(W*1{bZhsh#8J#{uK$zh&jH#JV=Q zW?8iWe3<-ywE*hi0*T*md`Sc_(?DB1smSDG!>#DR+`yN>TOyqFf{MbP4Yk(M z--q#%)44BKCTx>wDcSX249kc65m!woB7NDn~qkDY*7$6&3f9`<>2kN zl9g>kIsKCa22b~=cqco}p=g4Z0N4YFMI6d=h;mz-DD%k77-OW-3>&#(;7#r>TVRJpP1UiIGcT<6ue@}>?|la-i5YlE)uYeDr_PE zbJuR9v371MS&mPIWfW~bwKh(V>$_|6HPe3XcYx95`uD`3mN$DVPceDaK425as(p^% z{#%pr>uB?AzvA_L@AeqvQIY}dWc>r$Q!}axGE-+f$3&05o96?@3>YAvl*IXAfp`jW z3{M85WqwUN6s1>9DZ=;Mvc2}iE`vgVFvy;9+XOj@aUD(l^RD^=FN>n45-exRPwa=y7dKJ?J15!?QE`6asz{4jw z`zYD^j=?(3MP&UV*^``^n0x%`G=;*Y?Ljh8byaBV&63~{=AdkF`@929+mEG(M~|Ms zoaGu53vaIOlQ5uSR)U1LX8_<7b=UAG0XmCr^$bO3w=9??eMMGRq z9X1{rO)Rk+463Ql(IZseqR+A4F$)IW3)|a*$BwpLe;7N6A|-VjJG^T?=rnmQ$M_oM z<=~SB3>7Vk#J;Qo7?Nhft9#@}`D%P9bIO^Ko4FC7^+hdg62TP| zW?%XWGvl^Qobc%#M|>N4Lt=+8TZ_4&;T^OWia7Q(I4b|gDNcL$@4rl=Cp6jbSKfz$ zd$<3JiR+ez9_B(cr#6Xg>K&Eewi-NLbs^TIl1N@V)22w=0d#a7@tG@!ao+>CUiiy^ z(V_d+V~H)Nt02Yh1VELN>EC{m_s7;ez9mLdvj!=bB##o?co??IHj97ESV<^ed$Frg zJ>9AvJ$oJE=?=s{sVnYZk%w;Ms~Qs_Z=@nbAPNBe^;8V5@$1S1iR^4?BIne<{NEo7 zFel3TF)TLE@v@1X_GZ~7q2cVSE&>sIiX`PQrGdatOXyB?zuKL3CmQA}cn6jV^-dJY z<>(P`!ITml)$f9T1~dI9tpMQ;_5&k>QAblozM^oL{W~TKc}X;_JR1@b54A!)WQuCN z+F=eCLj}}7f_?Y>6w&GGm-=Tlwdiv|jPld(R!0cXGb!d|2DBLsr{d>u=Gk=d%GDPd ztk$j?RrODEZ^vZ9-lVa!o^2Nt72m-S^+v zc-f|z1v;}iW2G_QQ$6*b@Rs;yx2==S*rqW9Q*c2j%YcdP50@fMD&v0K-gM_r}LN`(cT=;7#j zy$J?T7Z+(=FJECzymx~fgw2Y_-zUW}#&u_K{NzQeR;5bsXm@tN+{VozUAFntpv)wu zFHD6gDk!(bHCY9u@m52PF>s7=w@j#h3r*Famin$(w)qG4r)~x+gqipQaT5kuqe?-9 z!J!+9;+F=!FYm3Te<275nP(V|*a$kBj>f#*%zx8y^}@-lZ{yL{o&gRjeDNMfp9VM5 zA*BOq8{kd{nxHN>KqVkS}Mct223hyPr+|X< zm0f)4!={oF=&5UJq`I8sQe{B{nSN;mRF$@;8LYnkBP3UU_A z7~x#@su1v;d;2CY*Vk$OY^1dOYg%BGd*&K;E{-FbiG$gyb@$IjxF<=6jERUm{R*Md zy*6f+0VyHZbLVr*7NUNQ$)eYQ%FV)M4n^>E!C{-M#LW>(a;d0ij@J*)_rU)~|K3Z` z!L5&>Zu`NY2k491;4^+Wf1TUxB(_HBmvDWhk{rDlVS-JJP4y^ef4_#nL7e|*4q>3T z&vzj{l5zL@R7ZANC2R5?bt8h&DBDHci>LrG0fAg01gQ(qFS_}*geAHQ@Sc}c(f;0{ zH0mTxsI8RSN)-6OCwhK7+zXK=XAZDa{5UyNp?8}i`iHl#$gxUhnz*53+;G|PjE4B1 zFvybB2FsXSzIGgWZR49G+pI32T`Jl2hVC8O-Qk2qdI8R~29tK?4Gxf$f)TtbS^)v5 z{O9xxU@2vUsD4?@XAk|PW=-lu%^ayVI}A$N?LCh*cKCt2CRnM+{QsMP)XV@?5l6G> zrTXbv_oUAtN6sNcQ@#M*E@OpB>OXiU9P*(XRrp72dOo%$->@Os(aIsH{Y_mae z5)Ha(ig))_YS5WAKn_xS`fLOr1KByig3m68?T{4{gX)hNnQu1i{&?gB=p!Y|DWTG{;d)SYf-~O$PQRb=1DyH)a^2{)Z`q1mi9ayF#r8Tr_=oA;6Rf1_o92WpLIi--k0RA`O28PW+v6er9kYxH?Ae>KVLw3Zp*4Wg{Zn83TABhV`gIf0_fw0fcCmwi}Z8GXleOO;c96D z%m~@5f}NG7s_`Gq$ok>{?wXz`s{0gxCz=CHOpm9Xxcm#~u4x9&g_{sQP`ADLp3|jV zH*|X2Z76Y9f{?8I^0}w3Jc_BATG*Em9TTq1O4uV512ul0Gjc5pdb`P{# zyMvuo;iWwHy}o-?D65e}v*HM1{@()F^hh`9Z~P4KCBC0P>P0+P^Yw1DheXS+XN-{@n*iCgeO^sH1jC(r%AXEv4cifLt~|b5 zQ!3dy#27ndA>cTIGPYmF%>_UBK$#(EX#Jiu?g`6vI2N_4Kb#r^q}E>3>GU+>u6a!t zu66-Pgcq<|C(@|^2iq8ML!0W|vW*=A5%w+*y6aWnh$vj5zBd&b^-nW)IK~&vG4`ap z|NdClrYoVduKbtwtcj-;^(-;L_{bQ?6p%w3a&`lcZH}~}mada))g?QBpFm=>Y!|?d z!Q>ntqnt$v?mCPes4Q5fG;dm-pHCqUpJT$ z6k8s!$B=%4I`@Y1Oqz?USYkKo#tjNal{W}9xmRC^~fr}G8^USlEqu5R7 zgskoqjU5AiPa`}>C_soEh1917<`m4os4l_umU;^Zb?SbKl~i}}eRh`wVuB0!t!t*Z zy3;&gTGrL9GU?pmHn-D!J$mbczX!MW4N(s&kSAjgKub@CXzFD9+&KdOng@?NG|{qi zJ+VFKWKi!lS(5{dk(7Z_)MD`bog**T1u*Ns`q($r2`yg!g!+y%WqGy0aWpb2m~q23*g-=#2;!|I*2Fkoi3 zqL97X9=E?=aIqvg5%Lll#~#k>jAgOH7pW!K%>eC6P>#Y)7pRF0pu^I@8uJb6P9UlP z+C|*CUff-KU2u;KxG9JAUy%NV)am;$vG$$OZF=38tI!if7KMWh%ZqbJ)9b<}9L>U? zjnoqMI4(siBMl*$GIV*wHHoH&FH9$p2W#ZjF5WzrTcC)pIciR;UrJnOJ{u#R``+sc zd|{#9l;s_^1+kg}-2`0Aup3_>Ckf_0eg0Tc)g@oWGh85hGRn38{RZU4iJ<>x@$qds z2R=ZS(iAVyUU9aFhZ`9Qv!7Fs6%XW+aMXqa!2?+Bwg|V5wmbW{*}#wHqF(@!&?51L z=Cbyqdh#vP&V8PHp8Hn7bL=IkF>f)OP{{(7m8m9i%m{^)lX<&{s($1}?|yp9Sl9(Y zGs#}`3-x9=RvB-s%}ottWq#t)mghD^*z*Ix-f#ic1bCt|zQ$B&%aaNKtO*Xmo3oUD zM)+}(V>)g?ZG$&)GB_99ol9E64E&M8<$c<%}GN@5i?o2IKA15xm+~`*e;vwvJbNf9jj$_uEqWA0k`_t0ij7P-Ftd~B)=cLW+2+w7h-k%cW zNR{|k_nN62l0D)7CW~lL%J=(5=<^N*mXqmBc z2J}08Y5)%SMBuL#FOFiOwqX6>8yT=aH~xoR;i)1e{^R*~8MP>52YCeCHBhL~YQ+Hp z-Ry+9*TvvOW5*XDA)P|%mtjpyjzTR!p9skxJ$jNBeyC1v!%W{gjq|@iKK>)vZ!8e> z=~rW&(T{Yza@i9L)-=xgZ!=N>P^Zza#S=9#W%`rb53TXH9vuRxZi=sabG~`W3Kvzp2#tt&}J` zRb}yZ(|7BNhj5UzI8v&T_sA34w;Zu%dD?iqMY}7nin{3xqML}(18m)Epo<24K5kRJ zrQ2rb#gYPzHEFYhMZ-MZmTvh;dE`rk*$M z>VcA-Tn%m^eiHkJ232t=V$zJ=3v?tv(Z;H`T7}sNFdos+1UUB8zfOoo{Mc|a0aoyxRRD_73E-m zp6#ZrxDS(UHs)UmQWQWqfuwj|J@ZRW(7!_kv%(zGstie;3M=3_ zXT}wy1fjXc8WkHZ-~N2D{Ue6FQ(o2llJjG>@^*bKl4s${^+*nd5E+$F#?~>;pTYqh z|E;BE9M+O761frr+PEZs)nyjn*K`{tGPOv$vgtcH-&qCmYZ2mWzHIhUGG5%hBEm*=X72$Wi*=nG{Z zlp&qd27S$lUN6gB&V(2~~E9YdF z@r*0|`=Xt{mF;qAFj77omgLj$*GAbv$U-IWxpi*%&3ADEy5%Mzg6{$Xs04~nT9(GU zl`O1G`75fiJ*Nv5=#0-^c?4IHdUT{c_BeNy*E!p7Cls0<2kskhJeS^71I_5>WR&a1tZSUlpzIokDQE-N_ciL=P1460sY$Y&gndpXcGne}7K*~mo1l18W5V5PNJ z-d(gynQ|Tx{{+Sz^X=)^SoBLHx69glbJ_LXC4l16MJxv#c!p!h;6>tcuEO=FtFNaLVQeI~Us& zl1;G@r8sBX7ZQq^!&5vaJT8+mK7YeQ5Q6%z*KB24S!~nif^N)MbD0$acKh3BVkTg! zpH#|E)JgF8Q&6NjdBY5no=sLGBzWdR%92UpQ#DI<< zfqZwZ_uE-yWFsGB>PVWTzVnOP7bQ3sDVvMZ5vjj6+h(LCb356_Qt+6R>}b(EDdunz zb|-KqyuG@fbv`RiBOaWVMwSo*X6cBtL=ee}EiWEIaE|!OmDK83Ae+u*@r~|{gu-6( zDA4MC-V0LWN)7>YIj^~%5FY-(NnO7pjlTUOIGnC2px@S(o2Z*nFrmji%xc zjG2Aj53kBLk%+5`*?Y~lWGu}#%6xEOb^MI{{yh_{iZkAtitf6e_%q?$z|O4tZ5H5m z!Iccl>61%>Pt2cK1gUpDFs;82$>Lq?5-QrHz2cDS0xztGHwG?!K*;8XR}Z*wWr1m_ zW_qf!p0zyPUtS&#WrzlIrGv-9SDSuA)=<9!4M)+9!&9n1j|SBmeRMAJ5j;O5ln`+eGM(VGm3{x_1C$}K{?%$b zE+hF+q{}fR5X%RY$j$F)2Wvx6Q*gs2{l4q=dO5eoxp6*CpSM*-jqWn21Qb{FMAN)w zq&;CnxlFU6L4(UUxe?m&iSKOJduE)owk0t50Ea*kaq43qx2{`(Z)2uY`uTFJfa58v z{88yOhnXWkdvK!#o-ggBRbjR^ykH!cavhy1n+-Cu-4esBu+1Ek7trdpdGJQx1wHLF z(!FvUt9)|R_0fUZc2c=0gbh+-HV`E_YdEnFOo3lM>Q9SaQV#EoY6==PCgNg`d+sL` zQFX)D;7HRse~RUU_f^XBf0AQM|0vEL7qs{}Wo%%g^z|RUJh{%}jpyxUDUhE(*%vnr z#!}?NLvtli%na}SVHsLF8_w$s@C^J>{A8d#)wnU5aefBgg|C&r^_cdZIz!xf% zh-KY-(=M@cv0a*HXjrbaA$JicD-tX`j^0x}a5iqG;N(i^`#pzt)IgINTEczP&s{{? z0O>3Y!;wo=0u!lzs@SKgn_-gTE`|^dw!#Ab2BBQEL=VJ-Yfy?~>^^%C4Rq5^Vow`b zT$Hf{_$kyHeS1_<6O?Ai*7@a0qzIznC)6YzD-q-jY*Bvfjbmli&2TtH0#5IR#n?g4 zr=xIKJ3Xg0Xh^@qlSeE>#7mx9RMhy|?Rulo=xDcxLF8eYwqm-D%;6aD*@ECEg^Xj8 z!a7Og!yjM^9OFtX1R!KHo!i1Oe3&6Uysc(SK`*fbY5U}pKW1Rrr5HPuLgL>zmO^5E zk|~y}%zTY9j>9(>)ijGX`HU-NE#&4Rwx(e#WC6jEnGV@^uA7Ws`sj#>X<8Pd4ggQ( zd>a(zL;RggzcvuZ6NiP!_v@4Dz_m?6!EU6RQFIQi*cG7$r_;PvFDfQGr6Bv#rnt-S z191q2g}E+r`)rX?kZ5`wM~6>DRKA7i7AseBb3kDE4Jxua`77~;?o;{zJwB4Nf#gt< zhjJA`XO}`Gw5<{zT0HTmC+eb3VPoL5z(pJO-w46;12HsYZoTqL>EP_4pS9seAlxyR z^KRM~ghl9Tn`1Sp!VFX8B~2^vQ58JSnmIQoHtG*g5n&kAR} zk!ISEtZk?+>Gw(!(KkBVFg#K4TYLHx%lJ(6EhX;voZX&erd`h4{qQK$5T-0M)9n#Z zwx{0ks*F34U7s+PPesP$6{^?8`}=sl`!XBFdefqe8%pBmgW=s*%c=;hD7!tJzl{)K2-?P&QB9q z#Opi!J8dMC1*xabDv}Yv@jkF0l32tXF~@{D*vfB1>Jv>#UqPe!&8<-SuNGrh)j1}s zB*!FiUbBJ{hke>5q<}K(1Lw4)5zK`r$&>ReVf1SVuildrot=_8Ca~+1_qRG86n6vn zZ&f|K(R6f?!(F6;?NDn!woLWoQZkVO_QK=sFN0J zpyzc)-x}v1@oR(r`2L^&>jm(A$p~+J@t}HnA6;QXIs_RL@L>=oqm&^8s~hS)Sv<>J#?QeDDHqAf57} z5}_p)`-*V3ho9QlY;^#vG+iL_lxTAThg1O@)W8((f${t?P&|1%mXZwoWGEXf<4&6P8j!AI#At3%zU!*R} z|GhQl-=LH3XiPi)qt6>J?)fds+MDa`n$3+?e|p09#e3_8S{ypsUsqbgTvHEGk2!>x z2Xr-oBt0$zp7q)4^R;<0F+tQ5!71%jY=yBl#B3V$37&%<;Vp9=?|wPy{oNt+7`W`l z8N8WtdpvOMd$-^S`r=0RBfTwo@Lgu6ehncldiP>Yq@PzF&FdU#;G(Bmbj5By8du`I z*01^*!9zIyp%03|8*GDcH65R^?y62+hCLV$!j2`SPi|8f=Zl5I{wuJEukWgU%8M}( z$R#VGT{{+$zv2k=EHYzA3UJ2v&gv$rA9pPp*}n^45j{ka$~f+15>9an7~b2qsSjQI zmO`P9g5g+nhk+N!%$LlMiNTt__LxJvas;C>uH+LikDHAkNQO$0O}ugT%SOy*8;AkI zLF0BCl&*FXVa%f|<`cZh7&L}}F`;E1)3QM-Pbl87%5VN%!vY19v~oEv$2q_UN>6KC z$)Jq30Q)yZw!5Q(cCAwr8Vk4H|E~~Zc9ng0vhtud`4`RbMunbjHklm}D1A7-b>aBYVsW=UB~QdxXZ7F=U#0U#Tl-d?wV-66#FN?E28{X;FJ(-IFX>AKBE&P0{{vnIv)C zY%||(F(io*bMCr|P3SPw)$}q&fZ|pWqreNrtK}FUzoLjfVc}UQAAsBvL`=mj)6dxj zbCIWL)MPdVaEe_Yy`jP2w=8K zv&$}U&mVCAXZu6vN2?wuck{)}nCP9AKh6iO8g5-NyX;Jo#prt*!uxKY8Pl|L7j^QN z>Bn8`C;*a32z8o-D0q3dN5hiOve@&v`9uculn?_wx9E{X!MvFvv39SQl}LwX)q%~K ztn^%@l*~&uMuGMvjD{DZChSa!zJS)Sc8fVltVoF=j?K@$I7jbMNRd_VG4_wE#Z^zn za+T_*BWWCJQ2N+vD(jxws~+q}`Q(T&8S=`D+vY!uQy zaxUG@@>7x6=w)3*@SIkn%M0n_6*0vC(cAakN$51aAN3~|1-lC;0l7YmMCduP3g>_h znWEsyuH?#5_m_~4dI(MrsyexcfO)0{+AT)5=5ugBSYYwTYunzQKNO zLpE^;`GRVKEhi_j5W#aOeKa7hN2Jh}Az@hF6P4j0I3taWsY1_u?Dc3ep2zn=%>Ec+ zEC4^l?cu!GZQ~et^Q57c;h;>zLL_Q`QlR&6ZX{q(UJAmVi;A*&4P`i$10tdR@|g)& z8ZFuz*u{r=?4()s1KKu8nOAF|7`in%x3y|GNoiOlFis4XCtNqOLu>@!DPRj)q>(4Y zIRSW3yj1;XP#jZsT!XeP#$@Ctz;m(!Wfj`Zmom zfbEV#om>dVCvZGzW%^lF2=~0&QNs-Tz%N7;q0NqhMxGZyy;AJgsfi;f7E1k5x5#K) zB!an?pDOguHu}uBYm#3J$w(=;W$kR(>X+qbr*ZaEw%L7E zJxo%#9yW^8~P71y~hc{R`QlueU8quPLF3z0wtHb=C=n1{C(BTJR4*AcB2 zt;;!qi=qB1}`yX;(u$CwTJx6gV4<$%HB-E{CtkZo0!5@23*YLc~Q| zC-MipX&#~?m@J2=x_eUSkg`#%dL3#C9kJoB5Qf5|GL#5`79u4=I(xIlyezdl{S1d; z*${-k1AKXyr0=N&z9$FkAnZrOW^hg%uBTN|6^qTJrCZfAjtTy{BLgUws0E0`ai;(+ zlO76#Mn~gm=_i>GF%4KwI#B=l{Exmu#Y<*1AAL~q=cJ#$EjY#x?^rnsqva8op8jyX z;dJ$&S%tD73yFKq%HcURXrpDyC8?3muq`PuzKHe!mkLJ^l0MaP592q_?GD#mf3q1E zGGV9|pkJE;M-Oo{uH55;7kOul+>>Gdoa|~*7#HOLW-NgAeFHtk4|_-!R9H^u(Lm4m zsvr$U3jM&Z7?w0&k0CU(GMf;$yb3dh0&SO9v>Ss_N#=4Xe@!V!oBr|uiIsK*gXx%P zb9~dK3S+0Vmyqa*dhq4PHcx%5O)^_%;}^Vw7$&q=08Ue)Pq2g3ZuP+7QBer2&oxX+ z%0^Qf$rKdPGM?wzMkJ7jZ0^aU($jF)qE%7*m>Bweu;J1~M#i4|>~8{QKzm7IMnVa& z@OkktCHm}Ja}nHw-jm{ z6ESZ)hGeA%qR-%kWbUH$CWtZ>(1;;}cN#$yj>i?~`R6}ai~wLmK4+2yV>--LY4Xc1 zCF4p~gw(%u0Y2sC91}YD^1Kys3{tPMp27l*Fd_jocrhWrUHAO)t_kqc%LguTSfB(4 zE5Ivj$T@5_SZ9zCyei73{Cb_qvEL<0;@_*qW&DTi`dXZO3MqO_S1Op&u^oja5Xwu21HYGcbm`^hMCVyXaX_S}6NE=r&+(HV06(t|> zh1Nl)2E1^q;J)ws!G{cOD}q4wwI!4(*4c0xW*Ai5@~|W5AXE9OV04Mju>4m?luJef zgrZSPPPsnzq3_GC!7z3JtCN5GK=_#{x;ofIqVf=8{5IP|&j)z< z6KR%QQEYk1RjXgm>rzDT*nju$9=whV4n8Yg-~aZkwVMc_EVpW}(&B zZ=m<|Kw^51sWy>&9JWQVfO4=@GbbnFX0=V9Ob(GegY9^VR;hC8$D`7s{P_v{caG0B zDCt>Yg2b&YX0CU^bbpd&`R=>wby3bhXI`M^YxXz^&5UC*+1l2Grw<>O*KI7iGDq!H zX+%MCNev8{KC|+wX88KFKVg2}=%=Lb&!4znKpE^0)Iwu->B4o<^r1gGrt~NK!*J;G z&qzn?hcrm=GV}Neq#tL~F7pj!55qC8e%8-XC^ORf9l?;foDC~*Ys^G|fQ?FUEmAH) zc(o@1Ak_+$=?FJ**C|}9XC?SgngHI?1Py9A-sH~Lr$udc_NEeQu*}VBsTv{$ij8C? zS_0-88f8>PB55(4lTx6?M0nrBxH8;gZ!Y2;axTs|@*o21d~H94B59)|QwoO91Jp|?B$HX>ZISQ+quO5$_s!Q;NP7N99{O(lsTb-NT&KGpl!CeKzu89W z&4=P+*^-+O2~Ov&Z)UgRS%+vbYcqQSeJIZd^ww>$4-lWv@+P2cY@z`^3fY+`&6u*# zR~BjZ+tx|BrJVTR)aXn&^_TnF^=k;^c?EMzxG6Uw#+4uO7WTKKhz9HT99u@B5^|+v z-cL70nRNIZmH?CBM&M@~tL23$HYS*f5E=&(AM}Tpxr=Iy9Z%!R0n+Js$BAZ8h6H>Wc@edyiVY77{vrw%+ndeGU~ISa20S^85A4A-QCHdd65-ENO0# z=^fy8bkoMH*>At&OO81ER6*;Ja#u_t&#U{WBs{~$CWjyVJtrSW*Ab2~=pN+yCb!$YlVc;|m8N%&@7DC-St^jQN@317* zMdOyQ-oV7U@KX8_>hnT9Di5%D;5F|D)wk)RzAC>$lqWzj7h7+TeDv1o2o!XhbN)=- z&dq-{w=mou_TfnqLx{q$HDH2me43U*yIyiN>y??lpCaOrA-o5oy`lOqTKT3wqcS`u zkFp70k(AW2KD(l4yZQx`J--HEhf)izEiH9&(Sw*h8=)UQ7s4rQ=#TsUb|tBxQMOG_ zOyN8=P~r#=K!SLzYND=D&;a4{;IkJAK-T`Y>0r5wWD!bG?J&p4#GFruLlZ!w;T&s3 z8LH|A^m?De&<_)^;IBO@eR}3m4^@^hsA{vk&$k$I^~J7|Cf|8#B}7S3vSC1yx+Im_ zy^*LsRX79D8xdvV08Fjx@@ze#g)r_S)y_6- z0T4xZ2KMjuW{nxL5;p5+rDV394=WX8zrO;)T)3{(s%M3bd{Tg(n8?i_{&cZJpMFEi zl-t}>Bv{uP`{3OK=`mYxR6<@r%&Xr@c!BfUeL5FkeN*mamA>JVj|1*wAvEBv4h~Y(9z`g2uiMf)fpgUu^fv(gAdl$v-qj zsm&gietI<>8mkY&TIg^~T--X~eMWm59P*OF#bGJz?ZHXmb5WP&jlmS7=dfgF3tA@THUYA91kIH%FVI1LV3A}QZy(>tdQKSc(Us+whF^h z9fj@7XumE<3-go|W9(D_X`5uN;j>((EYToTb2LkZS^4f9*uwC{_^?Qu(M%T7oG+%p3K1KoxkYG z=-;yoXiC-;JuC9b?j{#M%`PPmF2z_WbWvy+g zLjIDJCA8yBFa8xiKAK8!axGYwiVI$6el`PEg@ywLCLpl) z$Om-eM!&*RKPgPDJ}UAp-0)KErUh;#JdqR|kIs#DddlhXY_3@b>n9g6eVh_8r(BAA zJ}53x&iE!u4j7zsIlSM(F5V#YAm95BX@N^H`zbc@TdrKt4x_Ucu=Kd!Uz6-0LuY@h zS(`5q)l=)z@Xohjai8v7(MDg0>x4OyKL1&0O_C3vEC@;LUytG?QdbP3~I zAI^bnP+ z#VMGAD1=>)$UG^Qb$)hZD(3ucIwb1kz?;WDvH;sSgxW?&(p^sn=?O?C4^;p@9DS~X z;Jbd%GrK9BLy>V3c;UJ2Mwqv=hY%}W&CCD=!wuAxNxPya1c@O*YXn|1l-VA3L<&Oe zpjG{sAf-W_mDHvaHJ$*#ANx&Gb@CG4!6muc>|yja`vLd~D-x9T!Ibo5P)3Bsiowjd zl8$ck&JS>2LCK03&+;)*>ovp*Zwwi2xt2CW6vGg<)b>nwW!(_?1{nGBzn2O+Y%@id zrJ%mG0|@AowT}j)ec^GYaGmMj>D$lHdt7{MWYa3u>oYU~%8;maZ$R;QQnAVAo+pQt z>0IhK{Sd&S0BFeh#Pg+HDdZP!-h899(I)a6q}KDwDjzD=)+L|GbAbF=oX1Mx^VMu6ZHyjiu^ zVg^Q8Y4_c_%V%XC=2r=dt7u=kP($(s%#tsL+ec*doz+Qo!47>(C92oaB?dqpLJhj~ zKi&OH%SF4MT+L1v%K;!1UJ+DL@Sqz5tzWH$q+-UgVyHH;)~&;i)NSt;H=+holTht} zB1cn7AM~j$neKe6SDtzcPN<3s`_7aB#q&LEU;SK66U=Lt3SN*-DLk3OE2G^M%xC-~ zWT{k^=J1#`ZN2NdT?6SwbxUa(x|)_1cGI~)W{+bCLkaM4CA>#GfBkIreF)HuZECz4 zLhjz3KUwh%sFfueHYE?Zjf9x=;w{3omAGhHj%;8Ztn(D*+JH6TfoTMC<`%!&E~Vn| zQVS4<_I)OzGjY!%NBvcr|FFM!+*x*Gt%DymASCJeKXW%P}~NhM^1%sFEmyq2o8;P z)aZ%LQ3*o-PH4FSl;^P?5#=8LyWo`mpU}m}7pC5KA5n6;dsnCzu0xV{N@+Z!HOT~Yg^-ghRpMxlMmR{F(B+uSZ7tETXHw&bU+17 z!AL!)U=l`t^rc(0>*Mx6>QUbP(x!t(6ZX;?7aSsDk+rOhTx%79JfwHIlcBt8**j<< zVtk*MY5$LJEA1IGZwp=xx0gi-F@PlW!q&Ju^oPD(KoV3<$DU3 zktKtUjjMqk8M7O{Jsjp6PT}$jQzH4lD9%2ce?ugNDmNo0>~SaY{sai1?qhU{65;TV z^}#56QpdR6@r^?WjfU|dIbPt$*LQ!!B=H`iX*W6Ok?$J83vc?ZMa^D>a_$yaWP%LN z`ZMNLNCX@)fbj*s?^VUi>1ae!M-o8TIke@ysCQpl2FLe(9G2qn=m3`o%3CLVBX3-} zh%0)jTh%q(hhivY;D@4j&1T6R{j>)ef#~s;RIp^DL z3W4nU97NfS57AjXS z*LMYP@&neT;cCW}r+|GsF6e;4nvETwkJ)k9zX+2WR+++!G=+|-OH#}pUCn%fCcxbD zkzB)D#sV}X#CC(!2!eV2?TTY<{EmDM-`pS5fl1$IXHm;i{9dP=XeG<2jYrbZ-vjT7U-o6+e0 z51mFuId@!LWE;V*re#nryt^6SvmxibTyMtz?ctc$C3fzp ziojdGxJC$~xC_HtuJtX=xLO^xv??POCJCXt1om25bsBUVxz)j z-DMm=v97HBAi2viIv|=%e~U6A*GnNDUzBXF%4c$)KHvqq^i~~C9m~tsO$;;reV&}puScOx63hd<%>i{}QJ1^+$NJ0k zfNMMiOX228c}_4PxM_<%K^q`n^^(9{?z%_u-wGi@Fs}TD)}bE5K%-TuO`*zo?@bEv z^b~qCg0VZRI@BPCsbsDu5CV!jLwYb{hy*Vfu4!J*QpyuL`z^^`_-1o=<#Op|12CP~ zAqP!{N+6}fCoC?YLW6OM_1=-Kar0sO7G%>sJ-T{%rXntiWgEjfJ~p7f4@3+i(60i_ zbnIy6jPQDR$GJEeptoNAs0-Ewyroq4pWPoO_64M+Gc~f$x7v%fDaD<_yA$(z3xAtCrIVTZ2%vV-Ew0>^*Zd+Dv z^}eu78zipO`mUCg((YG;v_jUdo{51q{JS*dz~nR6&AzZS^4Z$^SFWRaBa*MHN76<^ z-34W!8remv_mrXp`nADjsse18+$G8{q30#J_bwrjE|V2$WM{t`A`P@gVb`@anLRFm zrU!hruq>lxyjcjnqlkNXRzD3M?q+whs{N8smrM@uEe5hYQDV=EeMy!BHWRV;&O1yW zxM+Y@Kz$+wB{`r0K@2#pWWfFOFLHv*UjMG~qbM7yZfj0;CRe^-xbnfudg^&MBJOJy zPo>vp^in?f>14_l5Ds0>nMd^VW^RkaLK@bjc&YuJ)@<%^4N6u(6?2!{xEnrCFTj|T z#k5=+7cKLgy*p0&6HLv{Z~m)B>U#&>y7S)udI3m!qVPDHs4hiL{f#RRIP`;PM5Thv zg12@U%nX_R`C7eZecDo#E`{$M#x(yb$iysfS1byciy=KvFS@|b)afU;4=f6j$H@^^ zD&8aYX>o)d;Ko^DchaeHYZGUG>p77qNy zSmIlR#gwmUOY~4|H?MHc4%m(GlgK89PM+43Mw=aI{6*p*1P6y8n>*eMUxTTAdE!0u zyPlj&7VF3kaqkvK+?v2={)^!=1fUVc)aOIhyY<8=b^%8T1){<24+EC_HtPn}PZ=Ss zyFg=?rv95xu+U_#$MIr8!FP|R2pH?;y;J6o-g914o)2&DkKR$$0o+70cCyu?3H`d=FM zxGpgCQ884sqs6H1~|4aglds7j{4j>xy7{Qaq?VA2x+yb3x@_$ipQlzO=P>6z) zDddsckzQNzG-%oDadWQl0re=j*}@jZ_B()--)}BeoX!W%$n&ws;l5or@88%fNQ)gH zu_0vIKyJF3k>{kyKzTW11aO0o^l@)YxMc$K(K$M|O7G_kFz~F-25z|x%FlizDJU5r zpvhz$`#*@T%PM|i|Gh7l9Q}%;{oX;MT($~Hgq&AopTA~WTAU)Tn}EC?y1npV6BLCh z8Fg{iFDsCPF6XIICAFiCUDiD*F-FgPXnf0~;U%HyZvX={oZV6A*x!#4H5{A-E6eG`3gupBt>S4*z1i_<4 zA5yIYS9?n2+ZK!YCqP3hYt!MvJ&~@CV=nyq<*mDLDA2&b}alJl0yG1CWQJh_e67=^?a_D|Ycp zSHEj`(y>lL37PPKvQm%9{_lXcizRZ#KuQrzw1}YGO_-woM(%3$!2H-(aXVY4ksjx#j#H70NINBxnsnFiy_^7;L~{GcvZf<4&=E_R?Q_P72T2C5L_y&c%S>^X)(S3@-0Y(p6LSD$l27(XRRH zV#R}A|1syw>pOftg?YxeHH4kH5oik6#_c`+4aET*UL&GG0v1F%cciZvI~_oNChlAaa8fBPAT|%ogJyT|suDbdV|B^pRJil=fD?=>PcH z2%jRUkv{+XMLzq-b&iH=b0~;Eat4EIj3oxVFhRgf{IO4%?d4KSiy0)Juzli!;7shj zQ5WU1j_gN541{v;=D|;;Vv$rY0dsi9C5}{MR97Cr83`1KN1Qj?G_nzL+jLSwxb~qW z44Q-Pn|>$2jx%5eWjW0wV6p^^0@KisL#`Z$LE;bnDen8@^!NDq)foK^TP^>GtFPdy zf{WU`bazO1Nq2X5i4xKv-Gb6BaOv)D5R@+I6r@2qFCbEq5>j*CZ`Q0eGe3a3oU_l~ zPi^7&<9FxQu4K2%K9=oOX!L$8|4HtR>KsDSye9s_up1*dsM9XIobn6M@4Km1=tIbZ z2?D$~eit(u48PF*t^3HER-fANhn$NlSAIriZpcF3j6yAfKCl0DwXzGrK&bF}A&lQg zo&`UJJ%_~<=T}(>gR!WcH%s365!{MBO?=Iq+`Ch01DZFIS7JOrJm&(usF;K1Wf{x- z`LI!2Etz90dng)`=)rLtVPCQ@i$3x142&?a6MbCmaD?*<#=0;vmqjaBKv>V_mK0S^ z2|F2i_I&sjbw8$Y^NPy%4`Q7;eO!O0cS9>!aQWPs$3EYwy+Ro!F#DV9C{RJNRz4BH zWy;B;?<~Kkm?4x^fB^|;PHsZ1_7U>g;~BH(KR1YAQ*YdeUws)je;{!2{Y3$d3)6(a zH;$&dWFHh-RCE5c%~_U1!NRCs_TQ#@y41l)>sB25qh4HC0&URfMat%maHd&k`1?b; zcbt>a@ptUqwOeO(kb793lLON*fgA^Kw${^2v{(yGd^&IXUmLuD6YX{ ztD~%Ql;Tldj5eT7b8}E{47qK@d7tHdGmiT%1m##lYU?Bq9X-v-*mmGtj9Dif59#cU z2)P@+3ZTy(l*JJo!(YhiZ@N5~R$K zfc)X+t87RsyvO+C4_plrJfa5(rjMc93tV=_TA+{C8&3YA(iXLfIgUw>F4RRS?M|zZ zVN{P0&Q4d3R?d!E^LHdehDTj(PBtkF?9pmyi8>*-S%<|AHw-wrqI)p<1( zR^)%3kLX{CX0;~y?Aw|$9E51vgJ9n0TQWsW(>bfTM0y_skK8667&-uh12SfzMqwMW zGh>W2iF#{x#2RV9a#EwyM^mk!GPit-`Q=7!`ovm5mj1Xz$1|$_pUTurjO2iL_zNO_Fj0aX!5~kx8D_{+7}II41C+GV}8BlgoQqm zud7@x5QU6=(%w?#`FUL0UVuwaGv3&q5ntmVsI>)?j7zvMia^{U`ft1%VtDOGH5maK9cMDjzc$zVIxJy|@=@59^WP zSoH${gE~RPvOMYeZuqVrHD<~uGCVa!C3e!UaQct|hgSr{6TxsbC`<_7f?=FS(ePIF z6m4~JD;hJU;DAy*P>ehWcdx5RyR=0L9=Fw5lDBM{H)z{JY{j6NssCxR03q6&@Ey9e&lDNW2!cA7%@WI(HB$`Cg@!01h-4_ctD6cb*l*ZVE3T<$}XfH{9Zrs*U zT`&Z5aHfdb)y1_ZT=O`8rfRP)gzNM`VHweTEA2pDQjWyd>~vYm{g21I2R$78(_P~D zT_|cMfH;OUH5*f2EI4rDU~3iLd><~`Zn2E40kfHWFz-~HnY!IA#K4}_0L*arp9u3_ zJOrHuV!W1JvMw6_nxyz@%j-RfPQ64^0vzY$yW$O1BA(JyuV<{E|0#KA&>sy0NjvmD z!&6XlA;$Zhv!Mjyi`#C=iOvVihHoP~5j{vVDfyjqA?6Q0<2Jy8aMKVHa264KHi;&s zC9ZTAOpqVQzMIj;p>_ZtXhHFFE!x2t+VbNpjLxu^5Yx~Q8(bNm#cI-xh{YdsTYV>~600#dUw-fPX1 zKOV>D2}3LG&Gj8944ZW17)F;68aDeJXO%woXd7(ZdH~AkCPx(zG%RUX-> zG4a7s1Jbj`1?7Q113QRPM{?9sNr8a@!nsnxoIgt~+dptl_rM&iTWiC$_Vv#sCiJFd z-+54qh2ltjDDXc0PE_IZa0{jK{NX#FC}9yAGtpRG>2 z26ieZub-!!bhtim)W9}a1O>|xO{qnB63wH6r&pKw5jY8G!eNNAq~vo5RQL|E?!C0M z#REJ7f`XZ_4F6uTTThL>W!_Nw3Sy3K)mzp%Nlud})P^TVsq ztmqzoTl;%T!Z|fY*=jNv{Q4WqsQf`zIHm4+b>rFI^55+;%>5P7Mj#Z=<-dny zvBdCR)oTZ#g*(`-J%$<=BEC5Oz;cqkSe4 zni0#>pImIY3_=!G1w7=p_fK^=aKW6fhb9uBWpP*MxpScVK#wUOdt z|4>(BK!IQlR_$IzHE-ndVK;#UL!Q2-d>5rN7UVESklC1_EB9nhdejQ8+^R9Kdk!SB z`4%87m;3E6tNX}dShcLwp#gLxjSoSn^a> z^@dtEkWN6IcGR+~&KB!JRJ$8lWXP*9)3-X8RX|B7jOS=^D8`&hdyWznbdB8NTUL0x z`K0^C-*_zgtKYTpg(&VZe*@aq^Q4-Dd9=$)hM-P7Q|#~cTrm~{d832goQ0bzNI}b- zw<(ch6x|>1Q2M^AYcbS5zqwNs>mI%fpu8zX8_4CL68cKm!x!eUNjaEelrO)Kada1) zO@r{8|0q?qkg6~?ts*kxz+3Z$1cZymT$^ydSq(&5}vy3 z^K$(bjRuud#4$9@E_kn8xGYum2;Em9W*D!9-O~(WE5mvFv52#|-{9t6wAN2(urvMA z7UDU*nRZu_c)K%Z;M1HIbjEWfg8PvqwC*|jCMY|T3P+nRYkN!Jrq<*02W-^lU^OdS)xHR_{9y-Ner#Kaf=nr>LUD@$2+$ z?pmP(>y^;2_q0jCt*O(YH!wNLuf;A%l-lpo`EG_`TA6fo_bjo~v|Wdtw?xHmes8Pi zN@81==j#ztI}P#{t9!+ASO%3Si@ENmF9YIf*6SW>LA!ppBi+A$S8eguY(YMaIj%CbkPB0 z*^6cWsyJVtmv$;t?cPgMRHa-BWBQGKmV%3ik|sGh#W?L@plDVbt_qPCp_R;Pu(w<$ z$aB=h35(BUbK^s*4dqxBdemqOnmfaCGP`HY#o{gpoL4`vXLB3bKqJ*-ZXWSXs>MK4 zR*Ysg|!^Dj3ws7X(GjA-Z@P-Y~C*cC8DVP9Y-PoO9KZW=qzj+G3vp!0J>o zRaRq$&`4Un`Uss|X{67iK-h13Sn;f~L0r|mS#h%OlyBhlVR{Mi_J=_hPio0QQJ8@^ ze_ic8V>^o_Tw$Cg&wx5(LB$?rG*c{wsJ)L!`tC`y)A)DmdAgituH5NR{6_slT?wGE zEXl9!I>3AjoWLG!&L_i90Udg--_-4Fm`WgrYKHlygF0_LtKx+r*O5Zn9lX+CM>N=} zJPdz`#qM~j8cyQhjfd#MiNpVPu)NQ<-8}^?HkdGf4kospS%|O|vj?NN<8BXjPeNE4 z2W8(&P{+F3h&i&{wL+l@nzDJ%uVEj{O%h140X6vJ$q)QVVAsJByn9}IQi4NX+vuJ) zAw{WfR44)pr@tqz%RbKZ;I)MUg#yBAr7aseHt^x75STQ0E#_$93z1OOZmvd_w{l9f z(6DCbT4xuy>2RI85S&r-aIP%z)&!3gd%DQ;ra4?+%{}vzh^E(IUilN9Ggt!PlC-$g z6HgNrYrb%_$V1&nTH_D*+jr9~9K_uIp0Kib_F;UvV&bhtc5qFIz*t8)GKhve{V zZV%6@HwU^z+1%w#x(ei8EG$kIBY!oErxB?Uf)FI(#yqPcIOw$qhVfH+zYPwM1n;IO!k_OMkE&MK3>B%D^^ zTfK`w|o@+b`|j&{JNU>%NRvm7JTf};q?TyzvwR%-(fMP7*$d2F~v7` zY9Q15C4UcO44o{X65VKA4CKNWx_NU!xq2IV;vdF1sz#Y(GBt{lN-r(aHyg>=q zr%_g)AH3dE*-h-n^*!gw-J#N=!{GY+DX+rAm>b*epTx4%mF8i1zjZi zO*NE}6z6V@#`8TWGsB5)ikZ&TgECj!u4u0&OdhF~-`=PG_n&%(2*1q3Ytm7pJ77pr zV*6Q|n2^AkpJ?>FGQ=q0B+eJ3gL9YelF5&oJp;WMAr1e_>#A9>!2OKz$?<}uk=iC0yb3x+fZN4LQo7O?zuBnhEj zK|+b7q76Wy7Koz3tlvn5q8Xj(!CzMrGK-~Iyat{NI;a~sjILWHLJx1+UlF=rP4{`1 zYb=(nFprAqi~ohm`e+!G%kD!fCO(iI6s0gUEPWqA9QvpZQ)Y}OY`G9A5jiO6x{W_B zqG!f$N7aXl`F7a9|2Qj4Y;~rq1(CAHEQ_BQOjc(_$~dmQvY`=vYiztAcdyUraqyLs zu+irJx9|5shIDyC<4*IJ=ai_R9yX;CHLe_3DKbV2KhZvusUSDabm$2I`@`q7L!_=- zrL0WgU*Jn?gVLt;s{xYl)8j@Y47A1MoW+e{{UD+^7H7P_EyR}C~=gBJP(*OS>V$|d#m2zsO-w8MqI+X*B(^lc+Wza;{+YR z8+}SV=J=<}c+JwcYCwa+p76B<=l)*ATnkgIK`)}qpWz(+sTOjWN?Dd_@^{$O1=Tz7 z0C=EG(!cngWs&F8a2ylopUNMO<|t;jp*P@*KUzAGyn{?K)wJB9M;#x0lBde{mFOmi zq=k8*y+AB8}kGrf??YbT|q8f>QcO`@*hTlx5YaL*=V2vIP8?tJD`fs5t&w5kA+|A2S7LTtk7(PR|+$pb~V2Zu+tna7%N=?FJY+n1Y2XI7T5K?Qyl%U$B@-l^oYc^Tcs7vSTVO&jjVk|@hq^{F=h2m?9`bfZJAHrvLSk39+gB=I z4|cZ25dDGd!JhEZ4~wyfJxPuJ7pefik4N4SU@YI2{An^muSte4S<)kjke^=sh@95GsZ5< zcOFc1yTR~~S#mse&SkdAoMEuk!2_i?*D8L0f6lY2+xf51RDO96IR2v0Kevq!kHHJ_ zVCsZ#1scG~jgPf$Q|wkqoW&}%1tiJt1YtP_f)_kYU9G}y5`|mln9Pky2~QX0{&&?O zD_rmHQWPizCO#a#A1YA&Y^YBn2bA^Fgy&b&lO&p;<}oA<5#ZrI*Zq5M`@;E>h(eyA zU{m@4gtiqol3v~pTnrm#b7Ld42+OmV&|zbEJweb){f7BY?q_o6-@(7Gv0y7`48c)m z%D`{G>TBJ_f5$R1ElY&p^+fz@B+1u^rRxjABBoTgBs>$d&R}9}Xc&LA8{UM|d7Dp( z_fqG}@j;djy`bmJ+!F7qvQLz&2v>?9r8$$f!_`IUv&mk)%?!DJ|6lkQ51DT z3Vs5;EsdsXIC#VsTtXCda()X2$Nn>Mru}id5^RDL5`3vk?r;!bYl&GjDTN=d7qk1< z)tU#y92i`3-Bl;|DZ|bZM=W-^^Yx<7bZ=62m%~tToS0eg%d=ao@(CL#ebo(SrtWT* z8%1#)sB5e~HmcWst*dz4u2^I!*Ay6(?)h0BwCS8=VQ`NHzP3~MKGpo zz%%_2u&6=wR*-BbU=Dyt9bhW-$%I39q~z5e>DK{6@axKRE?b%8c#l{D-vjtIkNbC*TTt) zWr#ci)Zd#VG$-@YCfe^8 zg2Ab+!Fz6qP1M~NdEVc}6Tm0;2~)9ft1!Cx_BVqx*Li8Nnt)~Y)w4!s4)@PovEJj$ z$G!;Med5DgXA}xD)Z@e45LpBIv!}^TK|8UnY3W``m+gjkW2J%j*DpRVHD9)#t%EX5veYdPzK>GAK_(BSMZN5HYvfFE) zKf>L~oc!6{Y1hh9*@i_a;Dq)DH3tg}QYYYctfzH#ZQJ`qdbG3+j=vMfHlA-JDkvM= zr~3zXCKZhcY5Nwl{?X*yUB~+7;A-Yx;_a<~b(G-$TCxoCTX)?*tL>et_{)G1#4|H( zcD=@^mxyO`@{IO`R8?wTd(uu0GA~K0HM#rGsjSX&n@tgh>SsK?NDPo5s7sX^zp-RG0xmym9l@E|bBg{2}AHzGm zBq}(R@&r8%VdV@dy_FxxqG+M=4VC5sq_KtB%{KV$(K&YNgv2CGMLbsqHw|sp4xYy*{CAKQ=7HwWlw=%?2gwx;2I4A zft}szybRxY>9oq{GBxV3NSgDq$J{AmE%9z;(;zuvr&aBtbyFOlBd;pWe2#qXqh-Lh zz~9=HbRUrtstIM2#=!>Dge8rDrEOwTE1I7>WI1HIp@%o>HU)XjQRu5 zMN_jpAzl#E@igFCR`L0p$5RVJKDR~aT{R`5K|tNfRG#Qh<7S8Fe^y@~Pg76p$oE~X zLWvMN9oA!}Y0SfZMw;xwA19;Q=}-1Vf{_I#b$63Unj^`Tg)~-pS%Lp#zA*xS;hZzg|Aqd< zzZ9yJ_Yo~~(juQ7uBRUYOG1B=w_ajFt=&_+2Rr4*1s*+{h23XV_%QYaqC;hIC~>g+ z)k(QOLr*X*ECVs2?Vl(PruI>X`Qm`Ls>}@)tYr_F3=%VwI}7aDqx<)mq%IK{^j|() z(&Nov*nJHji%L&RY??K9vWCCqgy4LNG}FKxDG$Sp0y)*isU}SqB5toWThy&b9hyal z-X{6z{44OQ>I~w`@h-u3_Owe|1^>)2jYfteqVyBuG8aPEtt-|Gh58&45IPo5dtOh> zYG0PEnSD?kXOIk%J#bEPY@($|AfP=GGG?Y~6Q^i#Cb{^7`1ZYpm>B?-1di;BL*;o# zZ7}T#i`1I8eC`T8XmX#U(uozDny!%GQP5jJMVd0dDRWN>K6%jpYFb+Z$`h%DMi@0q zxM&cn=uY=?FhcOtWYEX^Yb3vS@Zx61j@Q$DZzSozcc)FE#*Zk>k1@3nXuxAr+#c8? z|52qu$RX&?{fg7PI#br6lW|z`t+A1Oo-wI$4%?)93Up0B4DLdpDuO!@pgotDBp9_G zbU@Yo*#Ui5emn5Avc_SWrlm1%L4obK&Xt4-rqXfj3*ohF#$`n;a$qZ?d1)Tw+sYKS zy^}I}$5)5wT^J+i@3~z@h4jhv;c9yMV}5~)dT0*<4?~`+Hlte)6}m}vj%@4W)z)AD zc&T1MZg94_2~+DAU)ZW4pZ zQY&#OTfTxsb?p#u@R=&WgZ7I&Wfbp&hiO}(T616GM>ZsNraTJ>rbT}h)Y`&wR-KXj zHqjvY1Z=o@q*{3#q&P3l>WjiLO~pv_XEMnfDbf_;+2yNew(C_8x6jPn#ZT@0NFXP| zwh12rmjG|gO+mm%yu?*cBNhU%qKdpX2Nej5D7_cv)7x~J_xRvpd+9Q`TQzKzO~Ja*@7| z?6?ThVU9S7R)#X7d_eLHV}29#C1z0+{pb!iq*$3Izey_M$FF>Iu^@63R@6+#ICba! z9ubkOiP2FpB)IKyw7SJ}Ii=^K$xTU@3L5j-$vepQ7*d_{&Bv#r0AZ<8oG`=tXXs<% z%yT|PfF1R}eS~9dKPZpgJQ}q4&nEZX?7gIVDD>6T24cgA6 zk7d2ctB1aM+1*d;gRurb#1PL2Vo;9`4 zOiRJ*dQP&!^te*KSWTnf<#CmX483&mVBQmOvSu?Iy!%Z-NWLt7-gH3c(8c*0$g@97 zr_yKgCR3^LqFHMXtFBa19+pL5XCJelVRh(T5{!xiH{wTxu&Kz|@On3lg6)z^kPYx3 z>>lkk-;f1?YdJ&1&ZU36(jKt^{pTk zG?=1DKm-)+4u9|ege-Z$@{u~r(d1MZN?P+Gn61vIW4Nkg1o4%bb9e%vt!aoDMCh67 z2xTI1sa655s_+N*9I-@W5_oDCToCxHd?$S2qBJsxWqI~d{)Rl$jw)L=iKbU$`XfjR z?G!=I@Jtq@4;;AudRGl75MomR1Ty4@td4Fytx)G+5}dkoY+H3TNiu6_NbW zQM9Bfy(RSwa1HFl)_xD z=HwH47eF!57WI!kAJe$cy3!We?gqp?R6qd#R+AU;i(>eVHSYy=eW^jI(urPUx^GKE zL@S)O+jKv614%RgCt6{*<%{}zkod$#NWp1RZFLgBq32q)E2a)#sx2LCS`4koLXSA- z1BB8GDN6oFn9X_Svdmlwc;i&b~UEpEy?lHriq!{vM`0M8)%#M4J-C z-;Q`yk>xcZ9xnen?pNbi2~bH8ELJf`k(yS(aP-L`t_Ced46p{L8aUS?T*pv>=L%pt z-7S;P`s7~1ZnKJ%fgJ!z@}4Cb(;;-nv=T`(^(S;^&>5VOd2dN)INxB8Qs+ihn!`co@y;zn-Xmth~Y1eg~I_-wyWP;3{(v#k68Wg67 zAY}A}u7fG2o?xZ2EY8U9m-9EKSm2lFJROWA6*CW;WBmHGgt$;1+mk{bG@!(Gz z@5ZWM_Xz~~?Yd4OF8M&V$KmQ0d&?HbY|My^tu}LW*IIvJ_5D5V77q>-fov-yr*6E9 zcE0}^*dlj-=Aca7pM}bj!SU+a+D|`VX;Hp64<5LJK!R%!n9sgEhji!_Jhwi4o9z{J zSXRc~AsIQiJ?N8j@g#JIn0#me)?$thy`HrKjCFDsTnxz$qqTP~d+%pSRM|%d6O}R2 zYIY<*V?$(89T`4X&iOOpV`C6e9d}+)fU19BhZQ&_XJ0SyKv{_ITk2ALm_hvW7}F`F zkl_&cqSm$|d2>mI9p`;H`R9PaG=~W85Gqkr&Y{>LsAFWpA66lrkAq1KXoWEgI$gKOUR)qn zMI^VtGkTn} zz1)3K!99qr8Ua6pO(Et%5(D(y$c<06XglvTNT?+__g}h~CMs^fsM?jP*t%T`Dft}x z)vhF6AT?21)E={0xd@n@7nt)4Vod|M|S1DCgiSa%KaMCVYjVu*IKud&z3JpDf|Wd zCG$7j%ys#pT{~FiE=n=9BzW`+R+4Uy#b88?~igZw`e#CcRr zkK4fpRQpz^HlV!#SLXtf0GGn6X8!06$BOMy-E;yaRymP>uR*A(!AJpeCto6ZtdHgS z0LE@?PVI+$W)_}DvNK;&wvvl1Ww1pNq!+@qTwguJ^APBXP;4VZ+2K4Q? zs333d&T@Z6>i06B2H|;oXPFloMyp;JO|47^giikkx%n+Jk9-Q?;~$`^Tivop%uMeA z2E%TS|FecsI#^v1aL;$@{-A3uquuY4)0TSL3t7Ul-?#11lRE7QYVq!OvOt+(NR;+v zK3hPRWPhsgXM{;f&JC6QLXEe@C`g(x0FNwOiW|%Z0eEs#et`#^5F2=MFMtIeXI)53 z{859e8x6FFcKCwVFlvEpf*c4i<#H_efYi*1Z%+K`ZF+V#^zUN#2q8qbjzo@Pq3@!g z?8!nDiFiQ0@c;?A;C*9`Z%#7u=C|%dLU3NQ^L)IsIk^JGYs_)*KR3uh|47IT=}Wr6 z7;aS44o=z42?l&27jE5a581pRVU~~^WyHZrxbLMVh}7HIkgX9K z$OmlcW17n6`R5JzU^VV9W z28}MJhKL4zj+6Y)H2X#>?`n3y(W8D=0gT`qPtpFmXkJelF>jw|`s1^JMl$_ziet4R z@{bwASN$it)7NAy7*2aJOCQKqLAr#_B>w)5MxQaeO-?p95CUTo3PF{Ib7?09-jm?e zffJe92$bdrb>UeN?(F1AIO{CLpWdDD&EGxC8k=hp%x#*|*lITAI{Gt}D8>C6G`l}g zfy?iaHnw%>=cYe-;KE(ZLdRBo57adoUY)kLzYoDBMpkvl3$SE3k#p1Y4>K_Tvj6Cj zVjAJ$`EVq|IJih>eeqYGSBaSSlUHY}HRUNaIm4#tFF1lm;yPQ0aqWHAK9VRI4U&M< zpZq*s#NLqaFKvm=OTi%S@42vm>=XEer^c&djc2i6fW+>FrvOjdq=R(^5NI@HzK^gZ0_XSs$?x;zniT}77Hx7s2GbjK zIaVmXva1)YI9=oY&KZbtIyOkQFZaNy#X^6PlNsP-{-4al%ZXG+VAw8oPLM!w z<6u(VVlFEmcm)tTfKI=s%t70-Wv_5r8GBK?dOO8YBEmypu%RKAa~E#-hS&IeyAaOw zFAUloAeMwzeJyCEV!PzLll8%Xc>*}MXX0*FJR?$uGFbr}|5?CdjeiScBcQ+mgx{bx zF(ij1a4u+jfa=BdE4o4>rtd1aFzxW5>(*Iu_Sg2KssX!>Zg`-*v~ktg5`ARGFW?X zdj#ct_Cq!+_>PB>RWXd^wdxmlpV*&qtL)BJ5P7B0)@L*a+z&9VSd`54M#>S$oL^ux zSLU=h&oIDfU6o$4Ns{#=(y+h~w$lci`M&)yXfMnYO@N9xk&IBl$(;7&<5Um3@djl~ z$?ramB&iBHw?T`7=>zMtw4RqWR;6mIF%Fk38LgS%2o;NQz=VJuLzj-+G9xeILorOB zE^A#1#t=QOzXw6dt&b-vK0hvdFCiI-wtmFTbKdVs*`^UOys9QKDoy}}?fUQF>61z@ ze!E_~(c1DM6O%jGda^!VF-Jtf7vKq_vtf3La+B!`iODPi+}hhEofldw0cfRW6mku( zk&x;=<`|xuy*#UntgFLU7p)%^rVB+>dkD@Iej%~n10r-tik!#({2__uWRD)a7L3%x(XS~{82A6%zqQeixUdM(f zj?iNcry_R|*}~}hk=j#>&WUvFpknng>&YSm0U2n4;JwK!ks@9<3a&c7>-iSd2V_*n zr%vbL2Xu#JaMskPe9@moouT}yz%dOz!!K`H&0^c=gIzqXuGzppP)gkC+wWz|TeIxLJ>+{?r-9)Ij3QY>t(A@zKmJU3hBTcGeG+&ARlD zLQE+d@nsWWN9D=waH+j^b6;mwZU4-Pr{B^j2~ldR|vOG zJM>}(oTUi$qgKcD(A~HE3ksk5NVY(bXN6<`t!~C4Pg0#D8pfkcMzs=w;wzjyDz0WQ z_y_%1#4%vk}d|lD`gWyg&_MV-h+k>qFh0j+N zt{&pX@t7f}9s;2_Cn;OA)eSRsf;nccq(0I84`k0gq0b`z`39YH{3`XRW-l}2@E)di z;C$T)@@@Gw?P++f}-|GGQl`|$~Jpl)}mF@e5dGRMV`vDYnW>{j3q@-T2 zy$`?Z{`=*SEG6zeOxi8$c0#QOUq9HfthzHMCHcIhCn1CGkE=+KI$D(PYl zLbvx&+d_@d0^p+B1eb&aP0Mp!rNhE8^_v%PzGm>g|FMTu5!wS0-;9=Iu&qYSnEyyA z!+QpE`x;uy2Yra_E{l9EW4rkr^jsF~)@O=ccjELvG)K_=Wq{XH9W@+8TF|O$_uKxC z$~*EO6=H6)GMDaf53TzisLQcTSroQJjt9kzfBfC!NRja~^MF!Ki);vL250=zrKddi z>jpvx5n=Qv--LiQe0%;+bDX^c9t$XM5od!GuQZC|9+4Fh%jZ& zXTj^?u{B?lle$hWvN7Fe__no@+5@D%nf>ukg2{2@rh3h z|CI615A6CPk|zIKniyoj?#_)Viwl2%rzwAGiIhWmvTipS%Air_Ll9c42B6hz zV7S^#WBXh{c)YGLK6hR!h9Q#tfefhA*7p6c0)45%>H@~RU~s?<_H#$rB#s$tYnKJK z0oOUYD-6+c<%Uq$zTTF{{Oi?Nu=@(G9)X3K$DgG zHo((Ye0Q7f@QGcq!f=h+aYuy>sQ0AsE@_^m5Lahzo~c!GUH}T~`gt9RrfB5Y@!LHS zgdyo~1cDH@F+=ip?JmlL=T7h6+FCqnC3Ijt5Xz7{7T7KTSJ*Cy%Ud5*jcM=lW^s1g zmmrpbKl+J3eJCx zT&D)D<|EM*w0a3+fhikej7QVrQLmd8T8qz3y2FrBSEG~(6wL&Btvup&2U7vt)5jg} zBb7hzO2+c|!hF8r;Ebu|)g&vw#Zsfxw)&WFu{`HvojfPl-Ns@ylnd#838~uM8JzHf zJwgDbZlS`KhO>4{> zm~s*H1dJ;1qyWbT?o^`eAt`MG!X?8z{_V0r020_{vy7-ccCs$yn@%oL3%nw=D?Dz& zjPN6W`4%C!9F5*G!~pB4rw-p_Ghqm!H_mbf@Ket^z>f7#V%2Og<=Vbpd+Lq0k?wcq zPyWGg*=|7;0@&vQTx;~#m{fx@;iCUSgdeq!|9+|u)IP4-d+$NwhuGVA(LD(1_L`A# zn4ON@%<9n7S}dy;=c3jNUacKpmjQVq_Lh^_%W1aHI%DXKDa7zs_`O>7ONR4Ixpnq- zC#Bzw1na}7nT!HD$qUoSR_$?=u{Z}8FwJwlPO;46nkS`rrOhea2!nHeHy7<2mekiF z%H}ow;m-yGtPd-aUi}|J^Wwks-iA!{FRgiz`skJyxriGzq$GNNhP!(T|HISh*F^ga z&ceC+E2GLk7`(oA%=t~71^JXz;y^T#pBAL2YM5kxzg9CY}EH?0l?g&vTR%g48!hta^m*8+>;BCHe?b{d=N7T;5jZYQrI#4ra^DXc}vGIaqj4Olzd z-dVE0`&g@1dY&Nl!!KXe7Nnz>)wF5#g)qfxU2pWuPz(mW2uwz-MB9-pL~5JT!r?4F zn~Tfv1yQm|yvd_Xw3)$F(L&jk!pxs&!AW=`L-=J*Fwbu>Ut6?WhTraaZG4^zlCiMJ z9}HsyA#DNr`>74EWyaYyk3zwiPuU&vWN{0d8axcX9d_ghxvvKayFO7eq^O~23?|_x zF^FrBaF~~^%7H(Za^d$MA4fATH@doU$%-%=Sj~)1+dc3#p|r8y#?w+PUzu?_u7uA$*%hziMU>kpdJY7a-Hi%6|8ktlZCe;Pu zqTsn4vqD&q&`&b-2^9SWjyh}gUiAWpoNk}PMb=Wqr;~c*opo;?y~(H19~EdjW*`*$ zuqUXnjEBA@k|MuH+f5Y!8>9)YR+S&7w+#ck)yq+>Zgj?Z@Y ziy)BDn#L6C+FSh%DSJ62(%7?#6-+D>ze;1ZN$bKLZxPexk73&0(!{h-Vcs93}1Q3D;O;s!nd=Nv{fB*3_N{s+ZG{0>9>3 z3+{J0fUh*O(Qmsw*+#u@HD&x`5YW>0{c1*mfCzIhlP_cJg_YlV&~ynCr6ZP0@_Ipsl0+|Gv9EljScKcvYncu11R`|F`dM3(edChm!y8k0;uZm8H{I ze+?35`+jcQn2`xKum+@X%@O6iG@Uu=@1Cz@A=7t=(1d6iZY2tf)n3(q)0zf}0z%id z1aPw06{dQ1F1CIh@ii8(NHt+_VU1&iQi;AK-o}eyB?iVrSrbT~cnV#)yaHY;)>*Um zCjx!wP*h|>of?g&wD#SU$5Uoz!O%9T#`Im#w5HYXa|qz0HGX^(y+-yZQhsrQ6~z~A<0(mA?`?n(^_;O^#eTB?4;Uw%gX zCl-V)`W$xK6A|zWPB`j2janW_SSSKP%ab3fv}LFCHeX>{a(VgsCz%(?@zm|DEu^cc@2UIPl#K1L~y)#Yy0lz zd7PN7*GwU2$M518&O@s))nJoxUc}NFZG7!XOJ}i2q%e|J}xR6 z7F$c8h8i}+0$!OkO!wt>6a%3#Dhq!u5v*e2raAVA2|YNNJt==|Ig2$7`Rmwjmc}Kstw%q2U9Bk&=*7LRt|RIvfcR zNoi>qI)|A%{_eehoaceV>^+AaYrX4T?^*jf>)QnDXHjIsTBHhrT{&kl&}UzZ-G!1# zX+bg6U6h36ta>M8=B0Gnv%OA*zE4PM5-2MfrB&uo7d0jG`jXCK(J-nvKM0u5o3Ge` z^>>|#|NEbAQiV$i(_YlAn7)F%jm;AsY<(mIG8Z=Z=E<;KWIkZc;!Y+fInR{zgogP> zjCPS{sz7hhUfQ1G`Fl3NDIeT%(8C=_rRN+|@{?aOB>izTzu>jz&#f%UpI-kd{n$Kn zQ6TkHu;lXZO&x|zh6%k&kd~Dc10H?vy#K0zo^tPdL#Kc9rQ2t96(6JJ3b;)w`*%o+ zeVY9Bk2dRD2-~;&{sp-AtwVn*0_@dJD(>h#APIt$`9#WQsOP8ykM$n}0=%aE zPj2--?$oKgEFO5q3$EgMF(b|>lA~Mr>+`zE#)(Gwvr7}tuE9fVgxYxETaJo#h{UV2 z%D)9dE>2sc*yM@j0GpM(FH8}bMBLsLCRru}qeQ4b2YT)()WmMw;82$6On`$j!T@O!b)?P~qn zA01w6-yTDfX@ z?^%{yH%_{8+iUx|CoVCe=~=l3q7mu+WFTM?)8xY*U}M$6e^qebvf6d9Q(vFpASz)d zUs>mlc{G2?`p}2*FPC|j#~2dK59tidb&cyE?lUsOk`KtL6a=-*J2!0Q?ljLlDG`p4 z^{ziMr6cr=3#qW~={SI0Q>D8oyyH3qs%T;HR(Z@bv8`Zgr`UcatPVx85!wm=CO4KX zuGc^7liRktbKsd$xclw?CgXWdwR4<)uA0z~RIq#&vBM*v4 zt@y7e(>9sOi+b%pt4Wv+u;Ny5ip|Ef=5L^d)1|`i`C^*qfwSe>=IZC6R)RKk%I>_8 z4-|NpX?|Ji5Ug5TFOmRXEHE6T3rw(p(|u=5vh)NdU-Fms)EHO#(x?07pMl!ztA$k; z6F7c9Fe^FdhSXdNbiMG$ZS9=p%+Qs5SuY$;x#Lfa3!Hu4CO3FG?Y3-aUJ@iM(o?9MkchBu&ZM+os0p|hw90_b$Y(yEufyk{|1ajo@?f2YorEFdSOEqo# zinhezVkpS<+JkbV(lzDrkLz}0R-fMXza4h^9Nm}xvOsxI#ZX01m6zluPju5bpR!+n zWbvgCrrO!WC`T3;`~+7@)J$!7>iDE^a4;Oc#(iX8S0*62hC9PR~`ggEZfd4~#Me^z&e0ZYWeM)4gLtP4r7 zjjVwEXSx#I6sIT-muTEV#;f+yd>2y*MFUu%TOG}YtyOEpxo?bX&85<3hq5ml?;s5M zhWj{uvVQ~QHsJ0xdJjijZsVifb`BHDkC<8We46k9;pJio`QwPcIAv5*1o{WgF;?hl z5r(mMTh(@#M}M91*E)V+7y|zIWy7%rx+yord_{g;L?RSYZ1UF9Rf%1%@@cj77c%wV zx9nJjk7wp5=_pYCeIJr$$)=<(8DGeo-Ea6G>A=6sDD9zx_MqVYgV#k3k7yKcr5`1h zeZsdYbBwa>U5oys$dj~fFa1iHDYl$ah>qdwJJ>*ZBCg|l`-u6=PP@(Hx%(%Vz0VLX z3b^T{&W+^#bfk3`cc3ZePg|{|jSMraJw(<5v!|SG*vDFDeU;#228f&8HJDXOyHsj& z5W{ZBK@$-uk zkI59I`|;@g+l_}yJ9%dY+{`Lb>U9%q7&|aGRW3Q$E+M!DF$QY%jeULPG>qTge>Bz} z?b0bg{NZ_MZvMD=!TQCmY|$->4}`Ama|ImuHn8a=QY8b!)c3YW6`Ofy$)r3CU%6p_ zjc>^6%=Imnjq-~N+Be;Xe2R~YxiOnC^N!ifP8#RL&Pi=quES($E`Ltp@QV^>o(L=HXIB92 zQ4!wNo6Xh3eDtW;AcB%dR!`Rz+5v2AfzCezA6REc(_4`>Zw)OOgZCk20~ju6_0)G! zH92)BHIa|h;kP-{V+1nkjJ4Wpa@6pD=)b{j_lXdq1}kh=YOgi*F7q;PIgfic?mmhIhf=QjADR#*{rdegCtID9pUOorL%~RH z0=G;MtbF9s;xwjnQva&Wz}hIMe!QQI?-LnCF)b=~=qhwKy}Gle@NpgJh&MrR2Pzipq=g-8>T5 zFRfisv56SiVy?_X4EU_^e^|YMr~<#Fzt4IKQjArcFB;xMYRz0#Yk}BLv9t&OAqgV> zd$wHF2(JuBJfd{$f5sm?$uPcihe4$ZhJGy1N2G6?B+4f(NF-Dj?;VlPUw)-I{Ooq{ zuYaGRZ+{tys=&81HbYe7A|H-hc0>6*A~!axc!)AvZte60u#y{@{PX55W6y?#Co`Yo#B)#UTArbg@ONPP z8%>^#NtEU^gWL$s?q|I9FFQ7~H24Kbp?diKoMZ7_vkeAgfVALu$Gd~QI`EeE_KQfuHD$*&^5R_gx296l*2X)SkO$(G z0rtzvMu`-}Np2tZ@qc&A+!68bFg|^-O9Phz*^KkfKYpMyVOS5DTEirUzX;}AVWT8 z#=MsQbKBVzQ(h(b$l|}&47qhq29w*d`1k1YlDwXpi}a*_IQY1(vrl>5V~pdwfb%rIO*g(Nkx*K@ zPSqVwVFAnZyLz`{qZ)COM})`=sdk$#=0jJ__LpnnYl~)>FfXG^sjH$Rn-h(`Mbh*C z-82gQA1XG*lH^ch&A12j&$^YiVn^=5Siw`2=tfq>DU20LUn*4bBf-8DRuo^A#p;Kr zP%w5vVlgB_7z+Yo#EDku;2QAzrGq-8#2GygUaD~w8H&E5*gwT>FK&5G<+jJ2_7A_Y z)o_YlSW;ndKjEIt{ib~?gig10z~6c_L+5_L{hQ-vFSr3`jvHAiTe9|xQ6wg<1TpCw zI+hBoq=j5q@@*fM8=1vvb#q8mF%~_ybXz9Ak{`!L%J+`M&w8;`mardAxw$l7SOjq+ zQSbxb-hi6Ra<>6}1#X`qh!uT7&Be$)obPUq?tp{jWw}5%`19=p>=G+#-Xwa`P))$j z^KXviSzqz7Ig0VvV3vzPWyItjWRG{Ja69kLkb==GvRCx9#1=6E^R_KR*GfN1TPF31 zlzb(pohZJ#hXQHd%N0TRIBYPf?Wtq_WwACjyzwyECFRk>)8%b^bqOhjmdk+kF#QXQ zsQiUG#9bv#ZeaURn6$S6gj{4%e)_{^mJah}=JYm=xl!`PWSXT}`)J$9wY>zcS*m94 z$y~qpYPpp%2WBSSWsz| zxp2UMV7Z2g)+%;-!Bj!8xDnDGA=X{FKHhTiGTu;tPIR>*DX9{a{#b*5^-kK0nYcz& zLJTVR@MwIbIKAiBixDYtbE<_~p9&9rtvv@yXY45c#rSKEr)I#x{t--u5wrh#*;r+h5F@h+mxcQrm_0=R*|9?Sev9_eTJ`ALixFbjM}L&izc6IQG_@t2 zx`D65r*AQVtKo;r6vkNP#taYA6L9Xw0c!y29y>Lq@^~)~z|wKErrPvNR{?*_5$E=a zXQ1ZpUs8_~dC7%}fniE$=TH}|kS|@*yW*K-b!q3}2Md{g3m4rDl-q2qdS$VA`l99v zYDvZW;Y!oQ=>x;9`-fc4zB_jH=<%Ms9-7YPBk*Y*WIOw@==2IJU@Ljq0^1w;{N)?2 znwNnG2qCKA{v8%(b>ZZXUw{`DpB)$-p(KO?~}YP|m?@#Tt8=#TO-G*s6BJsKgnrEQ`ZVHS}t6hX(GB$=beO2haCJGco;uukUcEk0RiZ_A^-xHn|JXK0;2n=ca z#|nORjo7Dn;X_SGO^yT>e!my7s&=##5r~nFj66(|0VUCmsXvJOe*JR#`IVx(Ccy!q zQ^dR6L)p*gH!@uruBXQ4;5$Rx=t8heMi|NaTr6&;{m~F973lx#i4_?S6p%0J0FnxG?!H--eII_8H#;2KoH0ru?nCF(?Ds&X@>-iacS`aG}{@pp1B9HbQY>VWcu8VnJ^=%aTg}ndKVpjW1$uhN^1N85S3l1vw=?V7|J(X0p&AvQmUf)ur zvLam?ihiBTi6eS5?9wNcL~ zGxVh7;F=!l%RqngZM*e+mv-(Y@t5&tvr*5#^WXyW?pvecO?u;*A^2HItceKtygi@w z(>TyWX!%<}{Sw#nDxykk!3AbP-(7^>v{Ey=a$1J;yf0e<)xT1MAJT{Y$4$z<#-1ym zmxrdIHJry`4#6fVl<#?v>TK=2`M%l0_S+VPp}1$GHGg*%0RuJYs9W6)C%>X7rXvSl z!&ht*3xi2wFi7_qC^Y-mOnBJEW#zj)Prl-=TPs+<$@7-UU8Q9BTZVC2{;NLygULpm z3jdY*QB>`mtq)?R#PD`hVr5!imAFHw_Dt$|4nL74% zW+uA&>Ak^N*s)|_RJp!O1JVcaE7BvM0X6pPA@EJ8GuEvYZ4SI5@}dG48bI+CH2kLz z+3nZSqjeIVLvaf?DLD8 zPS7XN0jD!|O~28m?-&Ho${vrxH$|Mo)8N*_DDb|eugpF8rZ@^Sa)6672Li<+E`e~8 zYutc5kVn7^S_%hX#0Rw~j8t{wq9IvlmV=8DX5mLTY-L3))c@m%RnWYxT(j6M(}658 zMY&qYy)^N_eTN=}^dzOv?uuo4%(QI-4@E*EfwNx@4-}UZh@)SC3&aKT9~mlcsjIOF zCps^Lz6UkRUrYgpIH{`$lC1?$kcxKpmcKmmDp*IQTO&c7E`;7$SNvlCVTux!BX@t678Uew z=!drNx%tg$0IYf8Ke)z^VkU9LdktQ&^`t@sjB06Ox$tBBX7=(~04VSt{muKU3oq9t zSAIo7rpo3AP;~WWh$_7mD>g_pf{8wi0ci?+%R-pP4pdhu?wuVRD*%$4y(uKk`KG5g zQ-HE_M=m0O-WWoE6M=xRD?FT7`f{HMmo0r<7%#%!_7wqNpy6F)#?6q@a~VRj-)JaG zM%<;R2TKw1_H5kT0?@>1uM3Y4e!NUw z1+`1^i$0Rvr$)X8W=u5CsZz7^P5R9H$(R#G<;^R4{geN$_SK_H8B+v4Jc`fxZ!1PT zgWUW}jY&V-lRHnKpLYe!kNN^@K4mg}*0YV-AdR4ZrMP?+80l^2x9s}<2WP~~K4EG5fyrmUL_h~Gm4sv-&||2CFhUd9cU<29UC8r)WkN36CT0L?u={tKInM@miGdmtFNugt6y|9b zqXny*k&1<7fJX6O?y!c{S?1Fwyg=`)yh7PnhO20t#R5|FR1_?mKo^%@A}shw75BOZVgb&BOz`P4%IP0(7o#_XDx@!2(}>3edB| zP~*cU89H^++2ppApX{%Oj>o4mbl4qC>L$n+>+p`D*ol;vVX;!$;veZIoI8nHJ{LrV zaz(@;F5gu3$PofyoX^F1$?_ta;D8G_tShGg%IU^~0B*PR!YV9=fIf^0>CYcb1GYh; zHW|4Ho%Lg!}9cod3i$#?&{GR^k8zi z)^VL0dP0lBxba^>10nv%j_JLnYv@VG0p{=koZ!m)t#(M7O2v)0xEwSM%AF?x;-rsB z5kUr%GC0Ltxw~~ccmtY$ppx9&E{?$ju7Z`irGRhb$m^WT#N}pf5QfG7zF06WRiM}t zlmmE4xmzQP$H-L$eZ$L>rhSj1l})=5USAxKt3Xy}0Z&D|`m>-8{{$zSi%4Da+>*090HK5+s9CII@@brpv%6(D z?1*t(s-z(N$5|ox`1_zxM_3F(o_?I#u9ghCCfmRoj^m36AejDvde9~pJ~up*sLg1m&0K3Rbf$rxbJUGzZ&~-~CwGqi0v8x^!MEnK z@%TxZ1DP9xtjFqqf>l7O{Zlur%yo;Bk)34iy>?5#PB((Sd^5#p2?%OGn`T??~uJ8@dcvR4>WhYzXc+5tR!hJ>NY*jv-! zTKr1&6`~Krn?(o2r5~XBz+du2VEOX^=;G-U4z%;S9S|40?ENTl;x~Nr-NDW`_Cp*m zxRXfk`icOEd%V~7X*=X=nJ%qb(FgIxx&GJuU*EyQITUF;KQiEYaxO{9dX616FzFJV zaRyXGGcTgVd(aZX#0=xdcpDGB%Y(E7?#@_7sC>jb_>Xu7MdN~R${gfQ(ZY3$V)pc& zT%is$d&>QxSs29OjmM7Ny14owP7)}Dv%Ep?tcZ@jqPGk2jLn}pvH>KkgK;gO1Ni2z zgButneVCH+sc0R#%L#gN?KM~aa?Uem+k48tKec4SCX-5K>j7bMLb>M5acph! zuSog_wwcY}n}tEQK^ToGP@pmmG2k3dhD=61R}^^9 zg9xA-7q{#Az$460Y#We>k!KvQBTog1&yvuLws3 zfZ#1bwA>Es@-oK|`f-TNF=+`G>f7flYaoyhj7xyixU7fR_4ES=tT7Xh0nSB|^9f*{ zdhUBD7_9AZ5T{8>H-5Oh!BN#5R&e&){=)3yl6HB+d~PY#D>!gpxZ4dBu^R81hQQ;R zV~uf@+l{AD2N$lJYdIA~UTox0U-vexwCd{v#(Leiqtx>F_|whh!%$N z*e4scRdZf$7Z7KxPz2seg#aB4uW$sr*DyABNu)UF8N*~!3o6EElpiQc>G<~* zf2OOSoVWH*v41I!<7zveRxxI9_`*Qp#FHD4L^+inAyX#L7$?K-t<63Xe-MrTRc;~ywa=w5RK2jWr=aG@KI%L$Tjx3}v(B?NG_>v=ofVM_4L z+@h!9$p{|m^TnBU6*d}lm-_VXe%82Z{UsG|abe6rhYDt1%|Bw&rC&D|$B9uufP`XLN42}>8#9IS*N>Xy;>U*)^!hCo(#74hbps>MG8s(B>@o#n zBk99#O^FD~C>k?8=SY_d;x|8$mNkZcUeQpuoeDI*%}BG70##h*mF`~v6P}dX^K<(^ zQR)25=AVPw4=;)+e;UdYjIqJ&*C*@90|}4@01ZhUVmD{!`$t+Kj$j^Y+_xCG8RPi( z_|5lTI44&SDikvFjI7f^sgDAsYzTFUi6UxV-Sg%TwhEkm!DPnkxZWartmTY#^2^<` zygyTEksU*D&bzDkn7;UBL_kdYzL6REX|-dy2!Whs$6JKTOHZ;T2z>Je)c5)Q-Pa_$ zdB^7rzC3cBEpD3|tm_}%Asm&IU8ElhUp3zwXpuVpLl59*sR zU;XTm?RqC@bDEsCM9RW8E=@8b42MTH%ylD^b9P+qls)ITjG_r|r3j`7T88n5K(57v zBuu>haC^br@9}#U(;M5CS+`Gy7=klJz9z`YX-wrG?!eR2(RDhlhBGBD)rt+yCVu4P zhQ5nPIU{M^)w~&fJIquCr{(ch>_KX6^1RIR3dafW%yuODM{nPOD|gC&>biVZ+U$@q z5px16M^iR#Dc+1EJ6?_fKFWF#^Uz*<3KKFWy^cpFytygyY8;tjpvGhh_>g+v$$4+g zZ!II1Z}oBqUq6E60PvzN)YEpoqNP0+Zi2!{)FaM6g2(`fQ*Oj*IG|9k8>J0g7)?_h z<=1I|Bor*5CwRXOqF1mRJhz!_fqXJ9Qb!uz1I>s!Kwd>-?*iro7ee&OT{Hso zhR{)`^(lt&hQW1ROu{bHcVbTGinx?<`nnzlb0EideR=GSzf3<$z>e&u8hRq=teT2| zJ(QzeQK|#0s)c0m8WBjNQ08>wb2(qsp|A*p=^ds*f&&nM<}1eggGsx#LXv~m&RDXU zs#GZ_rJG}1myl~mGTgcgHRZ2od4tVJhJVPp)NE`S>3IP3+nI}pKt46xCs=|37$$$k zB{F(0;`ecIY#d@|B(H)wa<)#auGVYT>*V>b;^#R=t?qlP%`H(cv0BAkd$`?%E6n6T zV?rfSz42j*S&he6;*9MXv(W;rktyE`3qOL~KXHR^{EukgdCPw-@Xt>UYLD+^9_}*H z9_n>0y3Hlph$il4a}|ws(43Fk>0J^LJGtcm)T z;y!ru${EWUk%}K1K$Y{&tAY50?%ETO-r8$$8W|i+X<&rkD3<- zSc?$xTI5qheW}2(SomxWkq)$+?-SDy%Jb7K*4eoO52*0?#|93!r4+o$Lv%7GJYqWX ztCN@gNg+w-rQrT^#vG*Fi^?X1cV9EQ`$!kCFMK5D4>rbE(3#_do5%VW@`U>{l-y`s zd?`Q##GRi%=fC1aOT>mgWed8zI};kSI-SyGgFl7TF)pfx_#lPmLLiSt(M*bLQ9Neq z(J+nG>zuoND*&(Ss#7Ch?BSKvjksd>I?HnoUBIel`#L8ip_G zn&-|8db)ggia|`Yk*>m5060Ai=MTQK`>YmJhd@XB4gIs7@B?iWyqO9V7Ne3ehQ+vPxTdN~^wSq(e9RUcc~@ieu3p;h(Zv>AH+ zm4o48j?|+{ulm9$c6L)^@4RyNK7Ky&H+OJ@0VegW#!N-lH5#WKn^yvst*;j6E6svC zCeP%ym(3G>?``>I5dhS<;kzOz_aQP zG%4<+*iRXS`@rl@jbM6`+b}m+>Lo&6Z0@j z(G~CzsgvDiOo<=he0E4MlaYY1pP{^xt;rb-v6d%z!~=0q!qNhgU>hxHVz>1no*$&9 z@3Y%jLEGmtoiZW~aS7c^MHetuWV2cP&^iZz+|f|#2cV`4)>?ApJ77CFhvWB89f`a4 zYB=^IRW<+0-w)$A6`&{e1N8SmbKYxM9rqz27A%02-kl{&eLS;c>$#41vtTk86FTF! zyHxPE59AU#0hX93lIhBbZ18at^hAdLs<6s5h1LV>$Ce%_zT0hpcjebT4kKFE)4~pg z@DZ2XK=Y~@?B@d?`iSV9OH=5HTYb-MLH>liNZO1avz~Z*;2BUWP;4W8oDG`S2pO1I zBwK>TZ@L4cM0I%x7>}YcBfw1~z%SCx=s|-F~kwA3v|ehMauQF39Qsam6WD@`KcqiOgfu6tQxw= zo8^_9NuZ}EvZbag`k%M?9ZsDdKj!`;r)ARTlzd4h42dLQelmiAW5R|PJ2}~K(R&5w zQ4&3|dQ+eZ5WUs#a$W$^`3s{l?QT^7kNx_NhOtsKLW;N8g>n1|%928}itSC84P60_ zWcta(a{@32{}mIs^Y*rGw@_3VBeD>rtmm)QJ<%N|MWgYnu)Jx^i_8cFE~p)BVJihbJ=M`QqmR8t1UinqkFvXanSR zqs$5JD~FP*GS41_Our19n)3928Dr>lf|UXecmP8orM}ab&89qYAPghWvT#kyp{w}K z`nsug{|)qedsFbgjhf1F?isKP`#Rqw2e^JDRp$CN`^ZE4V>?bO>bH9yJ_f=orb?b| zelw0KeJ8b&x=?Ob_yByD@j7_Ks6C*F221vy=)FjUZI{|}0Pih3e$N^+=;@hO5%qhQ z-WoOUwe@63Tt8(q*Iiar$I}Etw|w-K*AxCQ3epor{_bb{aQn@bY5n7xipSku-#RjR zd`dHKpyvov)?1j6P=h&ZC1J)~#V zDB9}%h6w<vftLHfKJ>eKy)y;eUK z^(-V3tWB}o8-Mmsr;hNXJwfeg`^OLWh+Zx>Z0~q}C|?}BOb{cITk2#~qfs-|GmdW? z))9?z7b9_?BZ`!(5r{3xL=0y8iS6g4A2Kl1^ge?9ypzA^Q0m80=l0FE|FvNCJ$+P@ z9gK^JKi>;#VlM*^lA@(QAX`=Xc1esKBnw_6Ts)dy{pcLO zT+-6+r777x%F&=V`?aEoc*?>p1rV+Wu(rW5aJ>5COr2-5gzhc=HP<89KZQ{d0mhCUGJ(g7Z0`!u*AP#5M3`8wCSJXyKTVYBa zH{r~7Y%SFuoO56!7R>=1@!-BokoA$rk<8a534rYr&({w8-?i{zaB*y zy~vW^Zkl9VsZ^iHr@HkED=oj`d5?2(t4_0|z*nHAvVOrutoV`mV1CTPoWb2s%wuHL zRQQ3rsbil+t9dY0EhtUzV&!rPo|Bf;DclSC0QD|@ME>T=BC@U*EkaLTHw)SocA;8gRGI@AjHPyc>we&O zurtu^g@gCGDw6$%&GnIKI;yo3by^W;@2^_z=L6;}eE*(#P!1 zSdWkMYCXMO*YU2;rU}C(!MHs451mHdPkwUE#k9&FFLel2HU=$s^n|^fo|&A&#bjgJ)v}FoEK~ z086(}vQ~qk^&+_^JX`jdW6&%IADqWbk4hisYRr+?34o|_Bd(~YdwY897y%2d$9oc2 zpKIm&Mqi=tu#XKh)rB$cmksd5Yl&;H?>#2{B;4_%rt=SUxbjRsH+V)=if$pAB$mNbgg89oNY(;+=#`kF^ti4L%*Wx|=g(h>uQ7Vhn{W zM~^W%DWbjeL_)_-Du~*gKva5-I8=6@V#*IHTb3pj)DPgJ*k!R*QlY_Y0?+rt&dsTB z@17;#UIA{AEE{Dl9B>Vk2mX!l&Pz*sdpnq-Xe*Jsp*7uoTl@Zx%@p`05=-!topq zQK3uj-!Kj|$4?uY>C0)iEF(dD z^oc#eZ_q_2Uf+SG2A)5smR1*c3UYZ6x{(Lr3~A4Ur#P;k79B`Z;M%E?wYCj4uzr*i zg*i>0E(f;YfgB_SSVE-L|1W1Q1Qwl=%8Kqx(l;CVXO;YU@0|P;lkD6=nM&UO^OmKWd8Hyw)nWyb zjd7!lQ6(-=r{ERR2U5_+44#z zaz%S}t!^NvG(N5@e%kosx~Q+sSruFQHDK-z%4+ltV)K?f#b?N!{LG%<(z9gwph`6H3Mv@T79TzNs?H z@%RE?l#F^NX}ze`oe;5QF>$zLYqPuK+$PUYmtD*;E_jxab@vVkY3M@;#@+Hya4hlp zx&jH?wO86ZT?9%Imz?!(R-An(G)1aH2Asxu-D2psPv8?_XthwAf#9pAcAQ~r?xFeI zBhPP&>TLw`I)mrJFNr@{`xfONmnS-p4CudKAkZ@{;@UTR)1n%BISIR2yB@uA6@=tw6c{^hy0{$_4W9-Mv=FKN&1-tqC}ZY z{l^BP`&IEd;wswlhw)Lk&$Kq-ld3&MT*9DzsV>MPyvS+=P0q>k#NOh`QONRn;iQ7( zuo9yAVk*HvDc-MX(~&zk=4HoBeUUN0tqPxqV_xGDOc;teTCI5wNk3OTUH)DhJYQA!=Na(t z9Ys*&zl=4O(nb!s+E>Qj)cvS-!%6~}5XG9Lb{0^Bhw$&rfU#z?@QcV1$|e1{HmGdc?- zCjQojlfF|>ZKBaBaYL_NYCpwqRq2TDcwNYm7a#@lDwcbSFIZX>=|0bu|A|TX$SECO z`P6gv2g~=aQjm~c#&`hXQ&Nj`zg10}i{@9o6Tk2LUoF~9|L|PRU1Pam6_g{ogI<2j zlE}Hf*S!ss@7Owe8|K(!`3E->ik*~0F~d~;rTcky*~P_EEPqZcX1pc_?2^1ex6yOT z1>#Rm3;|fQ72y6F?_5n48zmF~yt1ScxbsHhz#C&qQy5_4Is2^DX~1zG{((?MBP<>w z!96Sl^V<RF)8L+1gHRzqYxB&*y5r+Um98SS-wcp8RQ4W~u(;O* zc9ji9W#jg1(QQ2d$3MNCtY*XBL0cWMH4UK`>c1k?xOhqd40Yf-QX8lkcoqLp%MSI& z$tb%P`&T94D)Jd55u;6gCX{l23tm)`{CmIVQ2j-p45g1s<+N3S=aE}&+lFWC>jNO- zPxZG5j{~WwA6STNZiYT%tk8!FV;p4A%V zi}ytZAC5^Gj(y)7$nLMDLfkjGMf(I={xpPrFWjH=u0^O|dn~o@SdA50%XUI!Mvc`4 z?W+QR{frEmsGNS|caENZ{e7|d50C4vb-S|%{%u9Qgy{8CAr`y}a6{1kr$KLKz-ITt z^&1isTK7=*mGPZdGbd_-(gNT?p1AzeIx3{BXkDokqYd8Ga_aXwD(8De^=TkZAF?{4 zXX;g2{<6a6TRYaa(((TG3Ov|JX9m0_kL**?4Zwa|=v9-gVc05lV4-#9R&_K+TPgXo z%Hc5U$s9+2ZKv)W@`yzUR>pumc{$KV!g-EjHFd7i$J6zK?K}AGM~hooPtNV9#2&aG z5zUTUJWqI&m10aC#VzSTecTHh`?0}tlh!Qn&oDbIADZBtf@exMP z1sEi#apdc_7F&`Fy_Fad!g-xH|6sO(5G+X%v@QTUO3YDO7!%&GgKqc5Zwt_?&-sj4 zHMvS5%B*=l%7&vZ35Omft;8KW@Fa}%`{FpQ_r+2w;Q2Z##i5V6P_ospvUd zG;%!b&D3eF+Pwez^>NDlRldUq3k__X;tk(bZ^&Zi89~@5y0a@g7*Q}$TAE33Dc!K& zhvC~+Ey7z>zTK4~g8lwUEb^*f8xFJ`SlPF7a1&@4-U;ul#`I1QdwrsN`o3w1omUbt zrzpx~kj?jcBD7V}fj?~CBq?QGESGzs;M(E+4+%cl2S)6ub)bLQF7bf4s3EgDCuL4- ze-3xGK{wldpp;I%lp#f5nDbtmK~Af906v2iC;#gEACp5r-y5z&+(z8UNTzaFlxbgW z@|Mi(?Z(KGTTU{?t^z;w zPJBRq23THt)c5DK%JoyCf!*~a~x-qtlN&J_}8QLb15wH<5;-zkz-+NDOJ(V{uohR1wzsv;~1&^Nw z+>KopXKk0T_(a6ld7lNz@1QS7rf=!CN5X#4B=ejD!fjdx;Q~j8#p?p8?lTD7M9twa z&yTwooo9zW^?k3sic5MYvg$FbI^0%FoeYxe zfBMMNUY6cGwrb?X39&E@cN9ty3jqEPMg1w4&Rp_Z*R;`Ld!kC{A01+g+kJ~i zf1Z>tTrQ1dQ>QYgj?Gg2ADX^98qV+g`oWOVVn&JfNiakR!RQg)s2LGN@4XYzV}z)q z_bAbOn-C#dbkV}-o#@e9^l0yV-?e^g`OjK+ZhQ7QXP^jN9A zEY&9C=i>U}qZB7O)V*x0&a>*UTypcmh)P^BGbzz17SZDP)HsIhq}4 z)5dLaFVSUUm$JHT?FDYVYG`$Zsnsw3nCa6l4PTbjXme^yvQ;qh@*qYc;vhdmre6{1 zogW^}5Hqbqf%@~qmiFwMzZ9*1$2%PkP{!9LcYWte(J4$V_HM-=bS5reKB)c7?U3Tb zgfXv9)B4_9Ga11dEadEO#k|1`nJ19pk-->X%(84S zeA%QpjVN{8yTtMaC)^md3*vDgNrB!|qt-LlN^y@ro0y@E!AE*p z@~hV3;=hxvfy3etNB3OB8-8s1X4Bq@eE93xxWYKe>m}LJdFgGnvD#8b?z18LDS-|c zM@s_%0nD%jL{~8=D=lzhw>B@6%4X-PT==&W^}-G5qF1N#c>g<5q6_7C9-xbO6C7|OC5=ETvvs95CKdEm*eizUy>as19Dj9{0((0Y z+p_m}bxh~>;#j5Y!t z?=s(1WqM3C(YeV@?cL1Ms$Z)?%Yk3(RX6GVm=D$-8Ac)o!eh0r-|zDB#|U<~e!4ql zq;!tz4i*R(6~4lsZshpYjmNSLkyi`zoNm1RsMkrG)X;d_w#|H$#`{54_{;lOA1+o7 zl3I`F?v@Rvo?J>TNG1E!khp2A;dzFA@YS_T%H7f3wVDWx_RX}nsWChL zRYoi;#`dv*{XoP^XdiVhr<>Ee@+9z~d+OGf=#)Vdc}fEh&1(Ht2N;NX+VLyakqjes z+i>qB*CAUo+V<{W9nsyn|848&y+s`M^+X4rS|1Ijb6z*N0zo4!BZG?M0(eu?j>r+}9b=sp(4V?Vtj@HS9 zK&G9rUQva%BOo1;`p)`4oAk+Y;YShh=C^(cDGqx#6g{WqS(?$h^T(|e*j;UrI;V?U z$e2)M_d)qAA4`FjH3NJkfF7geh*AGj>hs!>w49%9Jo6uYksk#a}vRPKijm&JG2I-!}db#E|t zSz~j9$vq-F(LU=saw-;x0h&a3M18iqEGA7bQ6r*4-4J31%}<@|5f?xO(8o?18M4N$ zyhR;?nBF_zhTq-(lA~Q2jO<=~|E{UwZgFm%bUvO4Dxw!7L zoGR@UVCG0|GgfzYsdWG22U)spI9!kZ&2bN?>ym zzmuJKccJL-N~iJu7iz0z^6S7H#S%M9N(LlYq0d&3Rbbo)?gJSJv_s) zPx=K0Uqr@Wu?!^2HR=U&Xju?Pptq$(suS<*ihP)k3Pf)vO+?54>~{6Z?|;z~ecvu4 zvpt}{k6M_fqAo0uhgp>p?>*n4+)Blm6s^p(Q$-!bDs3XQorV}DYF^c1%Lf=Yq|GH$k`pDiYN!4rP^kwT|TdAgqNsVZOX3Lu1CDZlb-B0EvUxChp z=PeDoxLJR}Z#&AVN=#Nac1HekTr3z)QwM?9Wb?k08cw`=&ZG`{>sPqMgFpaIg2|ZJ zPvPCiWzB0XVXs_1?1X$vJYFsw>c4BNyc1wm{!lV-;=4V`G^6MK9QNujGWLm_0U4m8JQli{%6eecfWd7-L8K!L>xiSv$LO9DT%V)s8t-wD(Oy< z;JUkMJ6&%BBKs&|RCpnAe2?23kB1x3VCgh1M?o&A8HQdc zkv~0xPIJcHwZ5d0^uXWJ?e_2K*pt~U8r%$TOfI22`KU^vYYA)*E=TA*eJQA_96Dgh z-&sKeqYBiDLIf*7yV)QXvakaFDHSg3pIxvxu5Po5;P(Bz=Lasad)$@j|4HpneL-p8 z`rjloedXzz11~pWc^Z#JyyjdNLWrrz1@fcJW%Kn?AqfEbMCT(6M#qj1Xx!A(P?geY zI+I723zOA(e(qGuNEhP8GQD7D)REe`I`?h8HlAz5NzxX1G0j!PWKEZKV~c4Ds|Lup z9O$F0Un6r;A&`#{8EI({@ERSSq+XDw6q4#_Hleccb0lqVyDfZB-WN{-6?I?I7joNd z@}bhH@i0?$WAW%>YkfrE#h?nMo>jNG%eQ+D)VA`rO((qWvvVIY0MEs#e_JYwL`qBPqNZhnmmi z%!Jmo^r~6ZUf=bP|DEXFO(7Gu zth?3C_jk+b(bxoOS+@({Y8l+ot-Pv=fwX*h-^wo{t`?>dF~WgA2tq3XrZo9byv|?? zY26p!YYp|d=R^%r>wWEnymyM1k+ZFSZgmZp;bRjanWXoUI!Y%j-<5yurKU+^$D|2S z39t%44rRGEdFs+VT8nsB{>D0KG$P5|62X?ArnQI<`WcKY!GlLCCz=1p)p2U^dBR)W zD=ud7s;ec^#M{l&Yh*;<)jA$2Rvf$SVrBGj%V36WXy(bL$r2W zy+*!Lgm2WQ@K4n@ZPvTNjo!XB7xr>ksCk44ej<1E4iMGL@VX%w62>!W-oT28U|NL` zGhXj}OA~w9*y+ck$2@4?EQs#OjiYm3FeRPG;{~7N1Kf;5EF`Lm5B!v>_y_9u@@90O zMVoWa@fezsxojv_w%##St1X;<_Ffs-Ey5`c(HwuYVvLY6E3$I#uT^%w*D%6~$HN#K zIV-c1N1gU@-d_A`12f(-mJr7NmxVGAJrYqh`P0}<-E@0b41%rTJ-2}|CJCyfd=6gOM z$5fI*pkJLOVpKji#f{(E!M~>SKJIv5bFr;+mrMC~E&KK<_S2r~i^xAlHl91D@>E3d z{s^!o=i_a|u1P{u7&R2kg6CE#A!HQ526)i6UG_$n<@+U4TBz7kTVY7`xt>ny{QV`L zllI0RCoSkYA&?Z;BX!I5M&wr2#z{Gtnc(l=N}#-ggBGHG9AW|vcy9x)#WW`^O+ zs5TT%6&zi-=Xqb`frdw{Oy<1kVTgqA^)L0*8eXiwf z8oQmgV4Vjp*8WCM&J7Ewk(5SCV@PXk#kDb=R;we5GUfEOunGo>1}zX!L6fVEyYku3 zGPCaQ{T$f*wNQzQrZBo9yIsUdkt7^1N2_HSqppI~u)^t+m3nexW@a@)WWme|0-W+u z015D%eK{$ZjkuOamQuQ$CIVns(6NguNUIWk;c{9c$SW9O{`{(+V4I0UhT?YQu3NIe z#pinb`cLZ%NhuE4)i0!~KtArnThk6wM?-mB9m-@?Q`L?Ng-7?O6brCh@Gzle*r-rpz+dQuq2)7N{pr+Pr z4%Co9G+;MK1kr_mI-a$G7ZG$C_PxDLZWU7e;!ku(+In}qD~Gyaee%aeveu||*j9W1 z88lxed8l8AR&Ro6E%+FZ$CP8os?WyVKl&jHQhPZRw39%=)QQ&YKZE7RLh@W)7fbkX z)7&!iJ+T^ETDcNIhNxd`o9Q)(!8$aT$%hm5z{&heorC}0T;)mWvtzi}IjdHMr z_J%oF#Rqu5U!sE{uR&x`PT2t?r68--;<4Q1<=tNtHX9O&I60T0Rt*ekrSDqTbx~$W z(=>;81&y_QQRzTZb-EC+i)mKEP|zj5M#_3H4u>IF*v;8zUnZynQ2>W5w=A;LXPup^ z6R8l%E0Lb*)hUovrFN6zUpmXvau!c@{P|C9Qx}IAuDiK4bxO#HLOj0oCpPN5*GOVH z>US*hr19p|)KHl0XoNHuJ|3TMrQDSw%G- z=Q0NWG%fdl@TifBe#6fLPdkITVdMXlR5!jJhiAklCFFo1%zP|)`^ogC2r5l}ur1WG zM#8JJudSTdo?9VzAE zezgn%gK$}B>{pRciz?~Yx?8d^GOC}669xak_ne~^2ba(7*&&odVMHXlB@+x)I} zGvIQaf+<#OQ~a>=q>?`6k|ImIDFb5my@j9d5`r;b+w=LQwMqz0j3q`vS1N*FT!*?G)*eBujbxLG_W0*F#J)qAlizRWCA zRpHk!Kp0tOjVH}SnGF8ml(Cw&C-ympKlRz1-?@bQ-?@Xk>2tpoMgJqItoLGfLz3sy z$qGkak{|4arxPzjx#Y?Rbet8kK-_{=Sko_UwXo+AU}V^gE~rLb z{9<%UZQ<|Hkoa{gquxM}uffz`!SF}n zqd8K(sQ0o9tEex0-|Lf6b`+e2RmF_P_GfR@>pIEkdk^3;8WBm_!Dzk{mj3^d$QfC! zH!hE6uIC4*&Zan|gznBI&nTHj>x7L&#duDkh~8uvJq6Ch{Y)LN*nev?Vm?Ml25-;0 z15zRH@gizSBnqlE>~2i+U16p{P(}UM4?^& zvNW6OmgIv??}dCC;1G;>gY3{+bsZ6PYzzP~PyfOpL=XpYlsSEJX#aqc5~saG}FJ3^Wm5s8+ z&?O(^WvY!|f?3#g1!KgR@Sx0NDizix!@sIocmz~~<`J?;9>iz8kbt*uZI(wZo^0sW z?H?H5L==C)y~z(~y&nAT#c`=vM;5Ql!f0o&((p*#LClp_@(4R7ZY zF&7G-h|s6);>eRRqZ9}!BK@RP0`f4`zP#A%qxWWdPU&U?Ta!6}@$;yoROS;PxfjyiTm}Z?MIcvyyu%0V z`3I`D0)vy@#M`CmECBK2VZZNghnoMX)&;v=%kQ;Xj9jEV(9RU$K5;kHH}4iS@LZC$ zq@{dGNh!U}rQX372q(7tS>^a&Xq*zjM;xF|=0OWa;6mF1HhnHa45=JmFh$GVdFx@B z$im9dQF*t&%|b}IHqoCzan04fHuDV&{f8T6Zt4?8IeHUj8&oRz5iq*E*D8Sk5FJ@U zqq!g&1rzNRI?-x~n;-$Cy(A0yHMy|G7t2!KcYc+qRn2Slg^+_y)DKTFL0ZZcX|4oU zJ88JM&1j&B{g9iod301~M>-HZ=ErS56Y&S6R4T-lY6*{FYm@TT z>0tn+M^{MjogqvrF&yt1TXICA^8*WnJ)56%GZ-Q}QRM9aANYx8bMx?$zm7#vKlRrq- z*>kr^(Tcj+`8_J}GxqQO{KI5Zekbv;Efs|J%X&q`Gb~{a)|4l4T?jJpY z_stP~GEStI%t&}^ttHG|!vbiJ1e|Gq!NU7@n6hgeh($M%1`Lxis+u|H;m3v!Xj9CQdU`>d%c6Vw5^^Sd;eXn#vh^`tUSO5d-MD8HVUynQ$OZoYXqW&(ften z+fvKL+YS4fq<)G{G&39B&nx5?(dSf&oYj-jB87M5 zO7L>MiN8PI-4rVl4)+9W?X;gtQYqmB%(6;!@}^0Qx^M1VAo=Mn`JSrImRp}NPvz_F zeQH>qf{rWcG}Q#GmARHhlQw3ZpIvmAmBf?`gao zsR$dPpb4_b*?0=&$tTY}@5@@#ScT#^g--cBw(Paag;oE5|78<@c}Ro$pwcE^R5d_N z8j!_nP@%83A=y0p5ACthelAI^1ZxYnF8=_?=7Z2w3Kj<$Zvk0Dm)bqLei_-cp4EX8lemz}8~>|>t> zGqf@UVrG%>k}@H)+0xD`RYrvpV@)MM&tpFo(Z&^ixS#ENfbqK9k!Vr(zA1UVami6a zNcnc-%Ct$y#m;xcd=Dr9B{Zcn*{HYR@UqF(#LuMqf{%>Qn-fa?63uLd4dzzWUX zpX`NyDc8LlQgBcJ(==%><5lsct)G6GV$9xCrpF;{c5cPpzo&xdDI`B?gA@dmC^_6z z0VNg%2y~=OD$9mi85v$NLMa=e54n<<^5TFFzwI2qEs|#Sw)2W8 zzmG!>`1s`25T`&ys=AO-Tq>w``-&M6kY@JZ8Uqxdf&PPh1jED8=fnb?H4-kG)~S(5 z`JW}*lVN4VEQs8u{U57izSnbjO9?k)*N6RlzlN~(dcu#2SO0?sV0VQ#(RH9#Gm^()`gffhJWy-16s}dRn#M#;&#)@!87~?4nf1>gSh7EI4)8 z^&}8cNG{H(8hm3Yo0N+P8~{h)P>3#YDbF*GGABUVB?<-sINg3a(P~h)eJ8aOulhIc z*?iH3+tYpAo^s$VO%4p>Sl9mq)9IxPddcwu>}RFn#G$D;_b5Z;z8KTU3D)FI6kUD} zDc%l`^n|xy#0Z1J1}oj*XnnxysO$m}0P3sI_}sL2J#;r0HgweL8&_KHmVX}r=;f=# zunqRjvwEI_%})x(la}(aj*09})B<55>uvv2q8vxY84y|( zwQ+P~72PGxb_mG$qiZ9lF9U)GfZe^M2x62{M{wEJ%8G^mNqg&W#=EAT!bVBuSsNjX zc)NbgXeQ~8Z{B6wMUA95_aQhH@>NH#2DX`a6r4#q-3V@&Sdz_?6oSBg-9YHqbu8;R zO{CT9e5Tu_jRV|iQ{w%uHp~4s*)yXkc@kz)zk_{2BI`Xh+dI#UPt`<= z@~9Lyogj>X=aR2mjBF01t3Pc8a6V zGv`Z7w(x~{0!fKcNzE&62O_<{pO3TQ5R&#^bA1)A(MdErb4PFh8~&zW$9$Rf_Y)H& zzK_{vrUR?*YBhO-b`r(AL@0|^^ajR9?s!&ngH_w9ZBh|k$}4HHcqJurN2eM1JNxnG znSN4wHh*7HQUEkWj5c?`TOkftDCF^cU=$B>1_cNK zq9g!sReBNa!^~Hy5c7z`i7*k@H~Q3g#*;jp^8I1VZ6sJJzQ7;{Ip*zeyrBQNlo^?I z^+FCHoVrTFaX1Q@QOk1Q&56B}`%QEmT>1XZx&q_y;#=?b{^1H61sWTh=!!~eHvHE@ zF=gLHJob1D0N_7rhN&ln0EsS!ugKjwF^tOKB@V2ZfdaO7y92V5Iwa2e6yxXioJC24 zsp@uzo86EXv|HnzkAq9tSxIBFGvpS;=++pfbX4e)iI6UW zAF+y?hQWLCq&7C>&imv1+yll6&X#W&6cARmy+5`c#|T?>JRafJ4yr$F6OseFp7W?v$2m1&{x4YWaIbPMVD)4CP5I*k?iaXZfoIAy7T5`+f5#R_kh+Ua~8?S};TY)^=G)C&0%e&{99(oo`QoeAi^NVsY9V{xCx; z1_G`7^Q<7Ls)nIxm8`q)qeS>a1gK27EzgtBz_UuI+)TW;$`$JQ;Mo_|cTvQ;aMv-y zL6Bb2)>A-~49IsaHRc}}f4`SU-5^t*W={D#U1acnEOQub2vJb)-7Hw4>~YN4rB2 z7qHBSM<$}Zn~WAEb4n1`)aUxc;Wu}1;;hPypBcMk(cw11bM~<=wr%6P*;Zn}LSs-o zS~MFBZDSxz`_lzVVoa{(p>EL9VeT+fpnH^Rt@D$u6GBPdAnc2=na>dNepkGbN~!I% z=#|n8mumj|NrE09XnWE={@#=w%{kIOA)_xGqf!nNNSJu);P)SOS|dJQ3`aNaAJ^NH zJ^bvs>baPa0Uks}Q^4nM>4xZO_uR@x!q;c@!N3M3-sYI&W-~D!1bF4F3`QI04+D4jeXy`CwXuJC;* z6ao6`573#b@F2GQ$bVlNYoKt$8PligkdwMqZQ-|W_9i`g(ZCfPj3FIBdhed#)7A$0 zaS>+uo06@{`2S;8Xcr%A^ZjV*R~P^x^elfM#>B$@(U0r#QkJT(RZ`y{X9CX0CSFir zNk+DQtXc9}zwWL6 z!V;D~@r;KttW$P1kH3}K!K;-wh^=r~yXGGmuR@{@?bN%F|Mfzm8h&qft zxheuD)QRMa+AcvJJ0m@yH1$+OPL&EushKy2bVZH?hW4O+L}$63j`PWdRB08px%ksL z>r|NL3=gq+tT?T7B3g#YPMo z{qdIq=bLd&KDmsJ?B0Oo;i^LAOUiza1!5v~YwvqGglP-#QGtO7oM2X42-pejivf4# zonMRXkk;Bo+8qE zTM8&j#~Hul+5XXA-QGJs*Dm zu4dDyiLhLIou*~PLEVU_q#9_eQNYp9CLqy!QgE;NnDl}iRpL^@%aNweo*1Q&s7yq_ zIRXvqOuXh|+&^fPH{IZ} zxIW&aB~NUG-ZLHjDU&~7wIhUZ)-<=-K8EwZntCkhU6rFVg`vg{Z?azI7PtTLPwyTSaJ*P0WEa%O^Q%UCsg$oaV@GC4&Ogx(N zl-AUHkJ8WQd?wvC@m+*HSk*_M6v>GA!bo^Qv5lmbTcp3Jb_`}q|NPk6pvdT7}` z#*ai9PM^2jmD}9ePQ_6CgFm%iHbdIlJIrDeH4rSsd-qwlM~BCb2{l$M9@k5Fm;C56 zouG!nF0lDD-4NG0Cf6p$*EFHBOFn+~m^ZtjImJi*H&@viHz`-0-U<4#c^dC<$0Ns- zM3MG}KD=}+x2pHnD5~+kV|qpoEr@20bYj!X39MUQ5ILh~JA2+q|->&2DsJQQTmj zw0Zl_g^xr`@=1-u<*R$u6^Vj(w$X-ILG%R11PtZ{y~V0;Ma|-|yzb^`GIP{vEBZyVUxXbjKCAcZ-&L zAd&fMhab0Y`9{Ap${@^Z(yta%%aDOKW0?Ejq7L$F{Bru~=}`sp>p3)bn7%@`m+}`UBg!{BbxrN-9+iVXDqWi5R}kAL zocH`O=y%n4Cz5r(sQxY+8|tL~ZPBzZPGnI{o;mV%c4YA+I&m5^PhgLYIrB{X>c4#0 zd;dZd(C4h4e7eqBKB7nxZucMSspO-%hXrpD5_&+Qj|`uFP#Z*9iA)7HdI^33+U}MP znJ6n2bp6EHm}*%X{$b)evGsUO5=Ye)uyJIvEHf)`IesG4u9Z`g4JT|?)1B0hmXtvxjI2ps9$Mb~wZ9uV zmwJA6Qp~$wmZIbIv_crvQSI7CZ^bJXTNwLM9Oi~W2ZD<`a=tHA~M)!$GXG{o& zg7RsS*sHb6ho6wQL6@oWZ3}7WAH3DnH=+&w$D(0L6glkY%sJ9m-F{gV2s;!lRgb?7xW!1mulY1)^|8l>yvW!`J1iJc zBnXkFFN~uT>$U_?2sYf)Jv*?RX|1*e+PpUO{6pD3sJwgGQ40@oF%xO<-gm5}?(R&~ zD7l1GPCGG!n{@X+>kl>E2|`rwgaI0b#r)fz5OZANp|&?GT33gWjwFxLefO(sHh0zvi|_z;;J?wGl2JlwDL|! zG8&y(anmRRp&S}w8VHn6-ncc3diQO|?yp2IUL0kH`Y_8>0L2uItZA3soieAJ5&{vW z-rrM_I)mrUp!sx;M;5S()?jg=ch73$322#9|>)G>ESJ}c% z597Bxq;oj_JbLDUQ38n>kgRfkOPZS`g_i0$e`2FT&as&K_FjQGUdE;sFa7&|4yc5~5oOg#9Zpzg(Gec?c@s3TG)g@wvM4o}r>>bKytrTDUgn+UrkC+R z@3g2}=qiB#H#G_g`I>qm${aYVGPo+G9c_YPwzp$@}?G_tmlSWpUTTaB{ z!Jh;of=m0^Pb6h87J^Lih_d4b{62`% zdh?TG>W*N($Jj>3LZDnI0ZifmVP!>hM>!4`OxW~cNPad*%wHkOk=n0Spbn}E2o*?H z$=$_-*4+J(%eaJCWe*F4N}e=AT+c%^zp8}PU9MLmrpwkh_R4eMv!Ti%+&n5g!4lRD zW6}WwNlyqzzCYA5($`9v?CSdIe||1?y>$5#%LRK3tI_+UD-@G4;=Y-0i+Q7@oS~)5 zOHyOhW`^Utz}C5qHC?dRB&l58zpk=K%3WJZW!NBnPSp^-2Ohco9VMsLRf~5M#}iVQ zO=?Vw2a4j;Z_3<5L2Y{~)!a!!Dg;$bQpOVF`pMxkg=2ZtW{ZT7kD+jE^23UeX>L+FOx261 zlQCKm+bh6^+77>wWobv`yk08mP0Ibq{@hY-Tv^q+eGCUxU=sV|G_nGeOja%}>PUFqg~Jq!D*x9qoh0xN$@Q4W5TZo8`Ov2ULR4 zM@|g0OyYEDyUM)?M%92Z61hLj!%M7MAt93_@dBD3W(Uyn)o&dC_Pq|i_t{G3+zHLh zfl;=Swb7m#7&7x@vJCj1S=|1F17Ah1q#}@|Ut+sgG^*joJgUEsDnR**XwwtQNK0b) zThGR_(FI9|x+skZy#C?$p{^UMx;FS$U#_1#v$UFUMLl4)#HZ^HFG&6Cric{p6U6J& zj5jwYU$SiG_$MxzRI8$zM}jloQ_+^i1$Ot_;OoJ0%p8Kbf|n1GKD`5Eiv5V@e2Xkx@N=gPaPmj@MB^ z>5Xk+$pAecb^Ppif`^T+=ex_*^$Vv+1ZvaoyoE9DB=C>I@EecPbxSRU{Mv|ksz@cx=fO$C zr!u%`=`q&vsE8c`hPTCgLj?H*S$d- zHfq?UaT?>swrw@GZ5z#vZQHhOCykvnw)NfjTkH1+JhSGRGjq<_`|Oz`JQInUF9(K# zsQl5>X)p7pryh$ffvlR~(4Xg!z*cEx?a9nZltW2dq44*os8Q4xdCmwKr2q#sQng2( zim8dGF`Oqm=2v3W(GzHZMqS|NWLQ!XoLs0IB^q-OyS9@gsg;l4M zJ50q`xUM<#x~G8M2W-sB4b8B@;a?IM3gCCb`>u#RVXBOa%)*+luIGNEH)$pXA~L?v z^7vaQ@cDZ8cOUcU8RnuUHxJ1>Y12el~z6D3WdJuB1*t*(sMD<*E~M@qx<%I_K`9Cw7aesW;?M;cG8R=8cK|=u!#qW6P`RnT6 zbRN^7=&F+2?d8?RU?_fkuQE<#Bvvbw{W`_J*&ta=37mJ~Gq_T?>4Y#0yCRaAP#2UY z9&cmUi9pt1T8LCYM>WB=@x``x+~VQWNUB!v(ToQK8K0NXfFxurS74^IbJN$esjAAhssFFCsipD6p~>>Kj>f8F#a_$OcqtEq|#x6DOFOX>$`c+9|nDS6DNL;I7;r5G17KH z0}0Eswq9O&x>{#Ygp~aq9A;A&fA}xhWJMK~Sh(0ow(g0;VN*!;`9IeBI)8J~ToUe6 zDkQ~VZ@vB-;O({&5&spUv3X{ys3Pg$^kd>E@=Ey~e_CK<3(lii?2nPd!u~Lq3O5er zXs-&iA2Llgw{|<20F!~vLP1UoJUeT^Vkc)d4!Gv z-#xchn^=DKG3@>cNhxwOu6BQMawtyK{dW4fC1xqeCYr_##jm896gQIRaIxFusyTh> znI;gFiolBXnSw?>(GmSte*CfJ>GINxH@Grzp?Y?!Z zSErS7ZmXJ&1ll~3;EFJI_i$*BMlh~PHK480!zQgOyDBloG5&rG>mgo8t#RV8tuoN0s!WEatB{^>n zz_FjCR!)8|uQ3s%V7&9j-fQTEE1L@lGy0W}!XP9+7k$l6)}UyCC-ib3J^g%cZEN!= zRE;hHLPSHG>Q&!Ghd$iqAQEs7CR8&FC6dxK4;uFyZwErM?N9Y zN?X$`pTd}!R$X{EfqC*$JS5 zp~XF2r5&dl!+iVrWl(YBsM2pjdS7fAC4RyVzN-B{@W6w5&*7e%(fP%XlP&^u{T~E= z{0*vt(4(H0=o=p0--q>>OaVp-oWDF*nqGcd>cfWfc{kzPxEK~Y<|Ger zkNzQn;0Ka@IGVHA5(bMD$w00)j|b&&PY(q0aaYbhxO+{oILHb| z!R=(&?fdS9F=OZ3*Pqs0a$l_4Q}I5lzx|x0N0I*c;6NRnP7{$$CQFF6d#t>?cr>g) zfXYvdA*QPcn4(Ad1MAxEza-<|R#Rs|0~)JY&TANN0O!h@ ztRh2@ow~$Q5Ye9)Ty<8M{EUe`duT98P_bU8f!7D zH3;Y%>m%K_(XEbF0Mt3WzI6Yl`s-k*|vU6){roE$?5Wad=!L}q2-^=c7hgO-r6 z!-fQ@wqnEx3nrD~W3@7oX8X8}fq}3#nu0V3or6Kr*h)wE5sj{((UZhOQTTqom=qd> zpycp~HU_5Lbh09rs0&PXxFEoZ6(O#IVx%#J30}r{0lZit%gdn%M8d>1(GpPrf4~w2 zWd zJ*YH`qGn_5lAyj90VuH17@$LrT!CWL0gzy2C`aU!>2EXB1ZkApj-ltk`a{z|Iom`* zL0LcSk=|kk&4$^_IHcG|@N4l#dY}Lz#y&3AUz-tXGYL#??i=tr){%@l&psLGfiSpzAS_VGOf^rYR9LXIC0%A+&}&_4&IL$rn6 z&&)4wu-ScHoZdNsRSkKtgoPO$)3A9)$D3ROL^7}1bfOMu*c|bE-qK3DcTq5c3E2|b ztL`8B|LFS+#joRw%c*bMeQzeCA>IJ|I~5M0yajzYrSO5k{qAMW*+FgcXxY=!E#m{H z#8JWil%hyROFTGeQ;aO#GXX+-)%kN9@#1ntcvEr9NoVuL{&>mHSzX-*qMK;ITa$uv zP>kD^{urhNqeBeAp*PoV;N0%oQ*`FK4~bwD^3F*7>+Uw_zvRCJ0Fp=mS!C1=l$sJe10!?HFKKgQUATj0 z-ylXTe)zn+9nwE|vr|^Q3{%>Jb;gTE4n|}upoQM`u(rRzG zqCljL?e0hf+Q8O`?woXGYj4Y|lW4|MK+>i|y1qgH6tq*WcZ=TjFX!8wPP#>9A%#iR zR)Xizh?Vps8#;^AH~bD`zeLQ$&wojB_8)IY+Q7D}qq&~#FRZ{KvuWa~YUX*+PVw9~ zXcRnV{uyGoZiJb5FF7mcwckd1zeOSVCp?wEt|GIclblDQ8w~+Wk*qZh)X`n-JWFCG z=8wN3q0E?QZ1r^l-(MMX2bqHLywmglrx0@od`B_f*; zIP_~o{ahh3HG+uFpoWW&5ZrI{+$kZ6h^x^R4P=QKTrAqz%WEkzoeXnQE@2EOV75^Z z6s!IUFyHrQiYjTY;ESTfJS#%ltA^KW8mNj~VJmWLW4`S>*%JZ2_fm`C1lJLZQr7;; zS6QMUR0A2^4Ol|Rjri?@;4WuEQ(tq6S*HS3$buIQK$ygWu;D`DxusSfUaK9DJ!vD< zd94?Wg-q+p8m#ZU9lXsAo7Ci6jby(Hw$*b_CiZA5lZt8-)k!$m1q}ApF@EuS*SviN zSXPRfgaai4dK84`h!EA0!VZRC>u9o20yh&kG}5zYPf8O+W48z-ixt#q=PSjf z@hTN|`a{R*A!-zuNd+f9&{6Uo&nPuUCeKa33W69!U1 zN?HyWFH1ti77WA!J~M~Q381RuR4oYY5Mz~&a~f6Sn?Xr^7C)fmW_WX)MejmT$m7`L zpe4SQn=5MXKjx@(MUR==yCb8(#;C`^4uM4iA47z%wV!f;kki+$22pd&q&bWZi?E9| ze=HUKi-*pRF5a0yneg#7r1GKBI(v%BA^os;W%B;`YFnf$qU$`m1Y}B$c!gl_?zZ6* zH#kgAK5qo@LFPc*5hkP?x1N0!S$^~`Ll~!I5=oeoth(^Dkc=p5dfK+~cY#GSWYsRE zjzGp|zR^?KV-N;sIt2rLaag`8>MK7*IW;ha#yV;Lrv(_*Ao06eu5LQ7Lf9fCm+vIL z0m7*js(=r)%_EOm@ZujvkaPVx_)zk2SPtMsmNA5d50-SupU(B+1edo%`CNM-nDo|B z7SJFn{3`ub7}gZ3;B#;+y1E&9lpKlxpa+0i@h#-ubEN$6@KUM@6Vy^EDI&&;HH9)R zp(An@2;%Wo2_;Pfh}EgRm#X+VoS*>*`{lqdH@(l0#4&9Rb=ENM9$f?Un`gq5@RFrF z(>`AA-?nLCg~HCh4=X2YLL`(4f<-7jr$zF-`${bti*7Dm&;So7#qs)EGL3k$6lZ-f zVYq=}Uyn-&sUWPFEGk)S{|_nxRu0_tx|!hOvzqVa5WYvm04I#%X(av%LJ=dWZF9U0 zeC?^?$lH5<_u4#g4u_lD+-MPT7&Hi-6dyj$cSuRQ^Xolv>a}Dcn9owZYgPTOmfF_=1t0 zvO29b!PQAyA-QSKXdS=G4={0LHg>jSRaK*-dwKoP6gVphZ(36ZU(1mrFP#A*0_KTR zYkj8ky&u{_B%m~i&j0!)!OMUptE8=Y&6`U{`&7X)~N6c&h+q5hQJC&F|S2f6i|sHgpfJYuQ9I z2Sd(KD zp7twNY?1fCTpr5ol!Y^A5Lo$qBpJ4tCYdbf#w5HDB_JFG`UQa3ggZ z7}~gZN%0fW2kRZ_tWOMHq+8pd(%aTMkH7) z3(f8*Ut;=9G}igl)%aitHD{yHtp($Hh*hcMit5&%OVazswn>IkZj)n-Yz70u80AcM z{~pw9L_K4}=hs#-y(nPwG`5fikN9Y`zYdd6CV%bG1^k67Nyrn?*34wr2W6bhQB;b1 z8QCvw4<5)G7;&y85Gwu)%`m5@;sQo}NnWOPfuWZl+)bV-B7_W`MpkT!m`+ zdIfG@*TVy$qLR|W1NsGoM0JwxI~6HyKJO8wz6Wn!m{WLUIScM3c%iVF0^!p2Q*5EW z+h#7j5b2h9#G|=?hMd|M+&D#G=hUpdHjFg_Ck|;>j$Uc&`d(9_RoNIPa!`Pqk1i`^ zpc*a!7EGXhpAU^rQcvCeIck^IFir2`=DY|_l{nX+%7rdTddEyOc1-DQo_8c@LpNWm zbuYUFctK(Stw*8tfq{#e&^$WpImuL%`tB!ibiVfv1@mVT6K*x7Op!_lK8qeZGsvi} z=V7PT$gulfO5=G>4(?mIbdg}|4_Xr(&v<_PoBiW^^LD`@#fzp4jTP?xJ^m?Spddj} z1-riD=R@Z3Xk7xz_p0V+ihuFOMAX`Z`=5Y(heg-s>0Y)0(s4!@N=Sw$QfCNr$Zm1r&dfcrhp%)IuyZ1Q_Z_M}s@1uDW1@Rrk zvc8e3TXnX={}B7eV?xTco;JjY(ctXSgEE__*4AT-B@7B-#Hum23N=s?RYnzK!cSp; zYu%~Z#$^XQ+Vh;5M~eFHKf|&=a}^fkDBCw(@hVC)?>;??-t?5fpQ;%671T7;VCEy|fCU$=n)2afXK@31A066gRXmGKP}ut@@==fDn%CGH>-MMm=ld~455 z5m3~Sf`pHjhxiQH z!(c)Ni(sU{`S&cCZhTd8q{ZxxsBp5b=e+6jIs5aDGa9+01pd|vcZeY*fnVO)oa~oC zn6$I`Y^WQvyT+2NqQOA;Rav8;`R%Ch1`5DGVX6;@*4ezUv_hJ@XaSiBtoqy7?ta7i zJS3-&eKw_sFV4Q_^&p6+7KsNIU=|+C{eVQHGC2`Ks|+*o8G4nsMdIWj1oW6F=xJl+ zCC1e;4-_&aQHTOa$U=5NVMCBwW$_IIUqstQVI*2sS(O&$BP+;QX6hy{v{cx1f@-pHr(97JW4 z6V)pVC@Zlu-7yWri0TldWy^Hmu64UVo)fw|=hE;82lA0iX)+FrYM7N32n8eNh@Evz z?DT(m6C}bZIRrg!3h3W<=&H&}nu=IT3J2MMfWr7b2NL)9y6ceB1_6ywkK|#=Ss&Qf4{9wd@$8@XQxDLpTyJPof2m9%v^Avmy<#|I8a)e zpUZ3Ep(dqb9a&N)AUmr;>o*m@w3G`)W;S3w9ni)l5s*jRs&u;bztXOa>UeN4>ropPI7;is z_jz_puk(59`yj{S$M-MfY9!Q5SROX#Ke_DZReZBDmgqObggWMbFZ}fMzgssS8Z^*x zT!4~D-e6%yj~6Gtj78o6US;i7?DOD36j4mNHNnNhUL@=XUe6%2?ne$mKa8{f*sBYu zeD%0@SRQK#Ob?qV$PrZi8yu9~+;nMKi&jo%!iiycITPXILE!kkteA{RU;S_g&VBFn zlqA9el9RdIomQ`=b=Eh&@pkfk5d5g*H5tN2!y+Q(<}StY+x#iYs#z*>u+QMOZsmCr z;>UKv@H52lSEYH9z5(%AW);=(Fd<=_^PaG!oNjQRX^?0wL2N>dB>CLOth)F*B9zaGAIIQa6^r)-Pe#5 zg6#fzTTr>WInIB=`8Cgfefq>y{R|OF}}c*Nra5i47bAJgC>9<;AT(GhBAp+Hf5S^+o|R-@0K;3bVO(qQXWYpM(MbKuOplLorQi zzdx}cJ4P+P_^Ptsx(W*JIARo}&lz}PJ0F86Ag5HxY#ucrSDwQ-)snz>n5us6kpJvr zl4Ko+Ph=weqM;m>`bCqZE^J>Y*3HwN>y1I8%NO%aL_4i}`PFC`C8E!~GOUCSWP&M6 zBWan}gj{#Y?WH&O$7t!LIQ$9SAiz)l$dO7I`bJON9)wt_vf5;rRyO+{QGQV^829}A zX{?mGwMo!%?Cm5S_d?9$ELc1n9B;C%{_p1*S`r_A5eWlgz zcI(c2UJOI=HapF5*eNx#?lz8pZ47gfu_j+Ve$Br-%qaaCFlPR$qF?xv*xRjZyU+Y9 z#Cy!{zkFXO&1T*1&5tVw+$zTpdcHEL+js3FYtJj=18Hrp^oOO>Tj#;YP=#<<1=6RO z>r-ZlmtWI<(jQ8svfs-D_j>EnM%HE1`f7*;FO|+h*t2ZQ9-i0Ub-UVds*0iS#8mWs z@^J&X5OX(E@(5!zRg)a^NT?n)JDx@o<`yh{>A!dk_xdF)Z96H5YhzczlQ^5JQwMJj z|BbW&N6REhjd2ueTD1!}iVMyvI@pRcgxw%|)94;aqh;7g*TiOolxk^V92m zhXeZ4)zQ(sjA1!|LKxmF5NUkqys7eYy!+|qP*i4E;iDRGvF3Aj@z76H+Y<_wZ2)O4 z*~osPosLmiHa^8X-OG?SzoNQUid}v;fHbDJ*|iCS;Mb&=r1(-_hS%M(UOe9J18oPh zjn?xC3CQ;T_yYBmOmuU8@4fsWbe2F|VKGcz9%m@7l^BvaE6hKqIoov$hGL^&p}m{u z^3F-sa4s^VxorI8QU{8-mq%C3S^Jr>C$^HbLv+XW`{n!-T+b))$<4c~REcls!(`1- zTa#AfTr2%{^B%}pn8^`z44`9=qfic)E!OgT`e*f6ToA$b{@>eVZa z5GgkZQi>%I`&Lf!9dulj_1#dF3C_XnXS-B(NGOrW97~MSnCff za@dO~f3Sr3xCF-^Vy}m1EU>PkT*`AJ;TLJFz3UYac-tSZxfJ;w)<^~GO;7vwxC|Xr z&lCH=Vr}nSJM?q|c4ys!LwA{?BB_p{t^z>8&m*MHZ z;bE^lBgV8Vak0F&b8!uoCGGVatcoo#W;Oe?0jNz?G&&a*9{~Ah6j7| zU&mL&YsA;Sbae7;cTI+4L8!9@XH-$OR1j~+i;U7h8Y=&xB-{7t=-vpe9;WDi1WynI z-Uh)~+gn`aTMNP0D4-3Lyf8Zz^{R}aItMKd>hdCfCC;aq0$iwvOtH1s3U<`6S`eR&cf27!Ag$yO>S8d% zkvuiBQkOvd2|~f$y#NLtoZWoFPxfrG%5nGQVyU1d^&x@h(;wxZS&>xNZm^(xW( zj%l_pPxxbVeQ7Lp^%{%7bh+bnHnXMC0D`? zf)J(V_^q;@5S2>ATj2IjNQ;GTqj68|G4yG8{)xno&xYz&l+ps?&YB=jb>J7ZXA51W z@+X0(Ek50mMwUD8bi23Ix#^-tgH+Oih+BUIY!k$HRb0exM&?%YKRKO-Xe7kr;o$x< z5=qGQk%AaACCGCXQZAgtVWCYpgC_l~J4Vt$k;bFxN%gjkUTf_<@55@tBXP##qN7gJ z2S;ruRIOFh_gpH)vYl&=Tg_<75o3=oDoqqG!{!H-3H@LG1l~ipHZiRJ(JuetF%$!T zZbd&Y!V=e%o;Hldc{rur{%F+ha!HA@4b!MD3&kHDHm6fYYxwU}VSDH+wT^@=Nn}b{ zZh@vUe&g7UxIa7bmjDGGG;~U&zb~q#`TSO=Tc{=v_p@1kewA090el zNur-cY=K8b2RaCJPd6$}#6g`=Jd8Y9{OA^7wS2+DLAbeCQi3BlbDb5Z#RVfz_aiN_ zC)EE==sqkh(T{jAyk61C?yQn|U$87BK(o>B>nYKqp-7|pbJti8c`79e5f&nWuR~Gu zGW&?I?`};tQwQz%q?;;sKX!cQ`k!1;Wv6-K3N^?~qaRec(D+O`oRA)K?@gModx!8P z!f~3;!S+3^ad<g@VdqRu&05T$hw>^OqpodGI_O!47Um7Dst6D-@Y_k>DR80sV!iM|Gi&*d& z^buals&T5V`FFrQ1;Wo3vIlB-;>UkOa)Im(hm^8ta9LTl41X^-sk0;qs&%?<3gL-2 zObOLv3ZldQGydU*bEhO41u36~1Doi_9;3|a5 zW^;sCwTSem&}9f~jRP5DSdt?3alc){-(5df1EKU1ATh*#_UN9lX5;VYFdnT$_(ibCriNiomVenBouXv17IDtIzPz*Ay@p8g7+ zRHL|l-0%I41o*0xwQ+h#QU85(Dy06&6z4v<364FQ(U)wd;KAe=h$S zdsz99xemFlNWfdELJeXoj)$_hXXp_IUy_ITQCf$Te!hlStQ<>CeP@Q+p;o|wn&7C1 z-M_if+H~=BVWnKJ_xYSG^KdG`*_f5O|Mw<&(Gw@_FfKS4d@KAtkR?r9mLE>Gk)ntH zkIIVh@#~Cj+G#tbAgyBgQCH8{h0k&}cDvxb7k&K}@53#hIMLs1Qg zX$TTdJp#kd1c%sd3I&I_YG{p@L@Brn6EC;>M70Zzl9+fG#5HaKA@IoflllrewG}`kyea3b#PA^I^yp|6d_8p+H`wi3B`ob{N|_~Wlp7of509(CxhFAEJaNCgtUzU zG+tJlk*za!K|#Y)XZeV~%eHO@)p0nvJU6wIn#FoCw^B&@kc9^biSK8rBE1c^pYUMZ z^b{7>WKxHq`NU2|M}#8F#iYiwf~H{K^Db=>5_Y^2U!!q#(2f*lTtJLS)VY>dZQ0st z^prEb$GS>m)0N_5;f%*v?YjA=#r7aPz<~uKq6ay~lc;3q{L4jOryj*I1-;O9cAa6< zvGo+_ZGLZ&EXh$p)~LsZwKX~G1t}kcciHjS(LJBx*5*E$38l$jVXpR;mFPnJc$q8c z1qo)Ba)G6aFH%dbFpc-0M^zi1Nl^#g4%;QXZf?(rQ+j_<+iVnJ4S86~h*Sl`1sRG+ zi=Pkfa2|U*?2LX2uxQFala>v}VME>EYqzV(7k$Gy_10`*RyKeDT-;`TIDrFFMEM)_ zmRIGP0*@5|PeV&Be);u*O>QQ6>fzVWbf8ik@RZwLN0K3Ne?|gcxh|V&>ZwdKm)o-{ zlz9OpZg+8%%#@-bsl_#`QM7?5^j8Yt+hzHf^{n!7VB4`|jhtN<&D&XHQ-c~wkR`*| z3)BPUK4vXaK_q=s5uQr?-5Hk*XRDa7vAn46p8&!Zf=whGnt`bUC4qlQ%WOs+|avku(UstbDS> zXMiB<7)1Z*B*TENp^rmoCmbY6!7mX7TPQ3A{}se^LeN_&dZS2!T#-PURvHQMds^~=nJ+AFmMIg+#{Ebw>@Lff46QX%AFYXE9C2U97K#_ikO+^ z1zPW)HCoS9y_CuUC$%?|7Jv$7hWjbc{7TmVCb=MLDeZS{xhvoQ*3Kfad#`x20(Zk3 z9HT2zwWsps8C9^yxnnCt>#7gvum}s+6#$R{7wtNt{yFN2onI?0#3wEIYvcCA#DAN5 zq&8(RiTP1W@x1ehU1htTZ#p_9`aVpt9iNN^`uLD(Gqq=k_!}`U%QEoePzjV@);8gX zp2i{<=JX}ZHsn%8<7qBB9Pp?knCD$WYkX?i1{viJe7lufv0g0 zjftGz>#={NIu{%4g8C)yi-vydwic}aKuoPDOOB2WVFDgiE+mCFQVtq?7^H+fVGe%z z#|hg_;azlW)0DGPe&wSm+@{7^%HQoL0 z|F9gERL6&@Q6z>V`z^>4SDx)%5)?NUF6JJOH_CC7xqz^5=oUkSJwUb|HUpK*s?^!G}*8e^2P zq1+E&1fH+r5%x3asbZDurQoPWwechcg(V%KBy5Oi@xH_UtNBc^zs^CT^c$rtVlKr0SYH!ELGrEwznQA z|4MbvASqW#fF<=kL_~RM2m0^k;Zxs0yO;o-&kJTM(vL6NL*^oI`O2RIR3#h7( zzza31@3hTwE>Kyp5cE{v!7~B1#(y{R;~uH%IQFj6vy{!w58p0Vn{xvI**~p>**K8* z#7x@9{r4w@>VN)aU-H{AAC3D<5g~8QCyQZs&8_ygMQ0NH)@x-Sy~YJi;9F> z6a=AXWYC}IL8-X-9C>$o7C=MC37L~4`?ydR+LU#&PLb4As30f*z_`B~svSy(U4eVM z-Z|-1ApA6BiL=yf%*nz?g7_zz18rwLAWw3bDBtJ6R!p&7$j50o{r3<};W%&-2j`L! zEzTp=KR9usFjyuLJ;E^X+W+1#vfCKMW6$ktRpTLtEv^uGzyMeX_j5+mrf;|pj8sol z?V7NUDhV=Na=(c!P)whoytw2|uW%Y$7}w?@XZN%_72cB?`MWoK8=6>cL-{`~KzgEQ!nVbv-kmK0dkhlt0x6xV zW0^1&JO=n3W}(Qi7YK6fF9E_UD>`klz^{r4ZQddOP-an4F;)etGLH*fHaUH_R%1`L zAhzM&az(wO6}ho-L0hid;=kDpfSXd^+~sO-v(yBSaa9K4_fl)4%H-3o0dFnWh*GH- z4A8qHcmQ@{V#876U~O@PZr1{g_e^qj|E)4H*HFnI@N!Q7%#_o@tE+9O+2>aIvFJCP zdpE?{wR$A)(%a8eWn00VMsx$%gaSgFW;9QI2MX(|cP~gxZbVvK8Ou3cx%t%p*wl_t zW?x6#YOINS~x-2`zu9D*R1M@2Uro>~h}3SkkcWP|NV# z%iWN@IdfLoCFi`e3dRCdA);`NX+Cy%lU4eY>HlMpFY##)KMnMj&@T(O6=33uVt}ekYwU;Q(rAn-Ki=) zGD*(LPsTRrbtHL2N;ioBep+1VMxtDDAqY#q&;E4=on038KusU|#^n9})VutvN0y~K z>dy`AMfEJjFBxLo&p?H&Ghrb-!g$!Ll3E_?LQJfms~3X1cvX~VTw2kwXt3{!32;qr z^Qb0yqcVN^OV0P|4hh))FJ}Y*CScYk2U^v5Ymt!jl1^{a?&W`Ki+glV*nK4|SJ-|{ zQ`U_r_(lqI1h>`+M%*)ORQ}PBJ3^ElC>d>~teq32Q?ruj@U-l|XQFI8mQ~iepUw6% zU!IV+1>KTxfP5Yf@9Kf3!5mV!$n#PXZ8KBs07g0CA@}97;2!pTet2A}o!|E{lD1!N zgeJp?$+YO1O!Uc?gMkt}s@jlaNvkXRl!KR@?|-bfq? z!?*wLh_^OgT@{n5ou@xP_&P)SQu3}Xv?2e*$E~<&JuosV{msucYg2>&6@eOu zVMwnAe|B9`uzxZv*uO`Vr9hR|&x9q21xf`Qx5|J_)hM&r#-ig<2bs06Ktn+U{if78 z|GvBBaM9FjKKu3K&Fw?-0B>HBfOoDUxTPiT8@{$UH}Q=m#h@U0C`F928G@w4Qpr~a z_2^kt1#Izc#8LOlN|G^z)7Pe29SMDMF^d%(%XE`TJ??tvy8GaAdcM8imDw-yF5KPP zJj;kC$OM(b@TOStFR{--Wwmib2@opgRh06O;0!fsj|cU1JlFz5#GXRJ;R4WOx%Z~X z_1HO)=D{+;8qIbSzB3l9W`*-|+N@i9zGkWON=<&%e*e>@#ckiL1X_C1m3m%^5@`W) zaT2j0_)AEbJ;f}xoFId4I6CDh1dd|&_tX;5!o4uSks61#%1D*#E>k}GL(Qn8n661+*Ag+-734dgOr4g z;+~mL0|u|l@rt4E=l_q`;p)8$-G$TEQ#H$%c8GYq9oy7^A0SC#q^i!a#B>@CH&xP2 zOxDXGKFU8jhae0q3Ia}};2ljU_%ddgCm*d&FB0Eh4X%lGy+lz@KV1~^byM?XU5e4w zk-Ws33*SZm)W8H_hr~%)3)33054Mh;N8 zP(v?paVdZIv-Op7Xe!x-FYFiP86JSU#&CXHZOeXe>9YF*%ZHo;f0~@GNoWPxwBq*S zI^UX(BVw0-gp@6(600zg?bh3z#6jodoP`Ra(IU56Y>c|Mll*GcBi;P8;$Fwj#&Hj; zGXJ%y+SdEtx_Z-L4VUlgQf_;ERO+1nWd^jg$-}$2<8NSJ(jx5`u^Fp=&I4P}LxF-W z2@&T=5E?+`pGSc*{l;^+3U=0~%*{zalgPrsz9-LSY38n%q|9`i_Lre8K7WFW_KBuA z?|KdWjre&U%usICfYAm!P*@Pno)273hFP$rJi6qceuqa||+e2j=+yY_>mZx&-LJh z92i6hj#4TH^nJ*{U%ZO)(~U+R7m9w5d4Q%izqr7~t?;>T#H#2#=OK9SH+`Cx2B@Cq z`IiPhzL~vDF*m0-*fUOAFUc||ny7YgE8XI+g*QpUx4UlTebOEvi+Qu zu}_W4F(rxbB&rlf6>qtKih~vvBc2Y5cG;Fk-2UN^`q0A-Kgz9c-Jqtq44q#3&JD9| z7xL)a9A)v|vfP=5bS1bfLJ3|EH{>?vB_@r?7is3F5ElY!R2AIZnxrB!*OA!_OVps| zmfGbdhH*UP_S;Hp>#5Ca=O)pJPh^pnZzjLXXfdgKd)%)2^C2X>5p#WF$vxftt~?nU z|9AFu{Jz!tI1{+B03vG@vBr}@T3$GF5WJ>=?Yye zx-1V>=Mus^8r8{i_k$JRw*T?p%LQ%gDr3FRNjzVNjK4i>m%eX#Z_kiyOn_XJpkRBx z;u2-2UAn7juDy`b3q_9M*~t2%6{>*?l*?0?Lzo%*XkR*p{m{U#?pA8P5#-6gN4EV- zmVLW9RcrWQ?3Uqq{%ei=)4d`-t=As5|X)xKc8BZt@Wo=YO?x0uP;!uk3DDQv~=t3lcISzo%hNa%YB=*ycAi^XdeeovdmLzg4*6k8tE^ zaj9D!b!D2_{yc!XXV|DI%8EiBe1*ZCJ<8+vZoEH+^i7o$oXL@ZY3}Zd;ojwt zs<*_8+w0+pe7W`akp*e;MsSsomTtqVZv91zOVzB|;#4w&X_?Q}HEg?*gmFqK?RPe& z>UV)^9R;cQ{>0Fw$fXa99Q^lgOP$Br_?yL5sY$zs5hd_R@n}ltnBpi=Wr|W)(;nlf`@x&+qe6N(Wl?!Qn3dtY$tAZBS8*SsE;kQ#f3?Z<3)i<T1F3dKnvvud6=R@YpC0ohUv=%BJ&sx)WyLV>Zfp^Y_tc zG7r8E?$KP|DkI&y9JcxqTIc2iAN2^RTuV+x>q;2N=lw8)`{V=YJMOxSEzkWFy zT9egw6Oj;qG~!8Gj-xNcIga~dmu>o_siC2jcNkh&ikdKH+|mw*vClo(@iKqGN1%Vsk)dZ zvlsal^(s&-DYZ%GN-;zvgQ&0-D4c`SFDRh{JLPcn7T0vqlz9ZYeD2|*)ADL~o{C5E z8D6eJ*5)(k>HGqq6Yy(HA3FWs_~%bnnuX(@m)}SYy*br)lyIw@AOs9HLA!pGKQ7fN z2Z-IS*WgfpPrv1Map&*vn(1`K)n)UseIFn7FA`uULAX*>89!NDC_5FerB*>biRKST zG%9!CN9Io=(j;pol1sh!0mi&>C1-J6vsHJy&Ckmrbsr@>vw2^&HD+y70a~1LFf(S$ zN>$kw?e)EkGEFmxA|QJ^$VrKBgpp7)(I!It8FJA?8MI&%p1_(0(e94h_0ho4VV{eF zz^&{1QQYd^V*kh0TSm3nHQ~Y`KyjzVAq2PL#T|-kp-6FeEfjYNZpB@S6?gXrx8k(8 z7k4LLp7&el{5XHIa@(xrp4qc!uDSLefHt_-f~LwjE2+|^s)nI0B^QDQMY0+OpvKa< zO2<*Rs=0iLPr>@m5oCS^&wt!b_Y!LiocA(itroiP;9}}-{!q11VkpAjuj{1qzBA1d zDWhmv?9bA+T_g~a)M4aO1$qQ0s4pWLXd*?&YL&n;Vs+$l-qr8{>!k%A1-@+dLyuG= zVdXeR5i5Oq0MDkKR<~M8`zokwaaJb(;^zd0U&QE)+HZ8ikrB|sRpcF|M#l2l`YbEz z9$#;RL@X3x8C7XsXW_nj@Z?@BEeT-3e;7`~Njc5B76kCx(GIX&cHsYD74{ceb%SPajE6@ZDllG&UuJONwm9hid3=P+!ZH7|9-#1SK-G!O2LCBbBuve2_8fxA z+#lNivi0}#kC21|KmuT+rV17^jv0(TrQ*=)k6iIUQ36Jnr^h;|nEe+a=bqJzpif)t zzT58O2ui?Si54jJnl9D#uZY6WTY>>I?;(fQ`&;AJ^9gGh6|*g>VT zK^%HnTcdSh0cZA(jWm@=7+gbUbNhUz{>y{TyT_g9Qi`j>zE+~nfntOizy{RkQcD(M2xqoxArM(oiAtybOfmq# z6F@Xxnqs{`+7S`JF-JC&Df5K;(@(J#?LMZhw-YyZq&`1|#9S4gyLo)sq*^_T%ME!~ zqNen$_d{$l8_7aQ5UK|{yR{k>2x}g zJNdFb(9}g!^V0Nb*A0;Vo&3EapGF%iI^2X)dm ziIq6b%%*LhzLpXt(=jTCrRMVxKgt65m(tq14ju<%7pVdE2!V^hUauP+M?E18hxd2r z+`nUva*9!z6ETYkZxb1ah+I#+0SSO!(>$01fPXs8yNgit=&D9M@G6{ibK#>_n8JCW zTV-im$~=FsR71|GYs&$GIQH(KRreH(5+J;gmf1-tiV`>hIJfP)cuurzZ6h5i)5X#o z>yl(*n$uvIvP}IQii!y!^m}FfZm_nF68HkItPAW$F1q;6?4M!Mb~qQ4R2p&XIFKCu zgKDI|o21A&`>~e1OHN^C4FI{vl~i5b`2_#L+nCAv_TO_uF1~1hEWk!R{{~StMY%n3 zWkiU)<5Ad!sW<0HL;td?B5|afWgv(tMnsPo7I^m+1uT3yGIjdjqi*N$W;nlYbo9SM zSD+u6?wvFL{L^U3f7n&JA3g=yD0v- zMznzfsFio^v>uZ_3BD*8P4zGhkDFvD%(5{@)j)$j<(^O?@Zenw&wOWC+817>lzW|? zq}V=bsChx^0-e)7tJPsl8LoHMYGLqAvHn2h9xG>V+)gUeJDJ1B6yaio@XrRD5h0W+h^`u$r6~KuUjp^2>D~tAljo*hD?=(j0p?6_qufMq^ z;8I{{gD4w7el>sz=zY_7o^8~+m+i3N<>~GHqs6hYZnr$c!*xTh)X%!v2LQN5>@@>S zpV~dED&9O~!NUZ>ZLG9vF${z%_wL_{H^Z(i!&LsZHk%uXDOAAT?Uz57iaDObC}arv z$bc{Fo+FQJRu1ICA>55Nmf^qqF_qbWbO}*rimu3CBLF;sfLvhUuWsl|;{~4a5tfsv z-H|cP3INcZ_U_0hqx@K`v;ML-sEx_&P#)lk56FEJ7?vh@;e{=V7+8XDf5hH>@|Sx{ zErtjh-O2IADpkXCqxbo;VEMF>fgf|%E`SuUr%IEDDDL)WWpB^Uu*-`~ihLYnRtcly zp>AMoIRu61^Ji~wY(N~aw?H(Yx~5Ll;CUg;3e(AZfR3zLcb_b*nc(Wg-hO=>W2BFU zB}f0si}8gHn`$6Ho}g!c0|Uvr>qd)=FT2IU^NXWC+r&+3X^GH{Up#y9Y_!dypkAo! z);Crdo$_;T^b`qZ=Tnna<+|YVO6J>=wz-kXr2tPEk>?%Lh10{(vg^BivwJ{7jY5vU zhCgT-PF6qUUW~=j<|}O@5fxlty&nFg_m_Yje>H)j*{5fe`cz@v&35xHRlOqU6~-kTkys`wdnXVhR8 zvSGja*R}rkqUhuT1!wY;(9EO{BW{5r;7a-{t61A1j9=v0ec)o_#!0}c>#p&1Sl?=( zC?Yk2($AaZ_g{PfA!Hgc5E(3Zj0V>t36h-X#d2OYYy`)!)FW3!@cc2F&wd!AK7*;@n%a^Cv;w@s90MVS@5g!zCMS!4G~0OPtjfF-5=XL0kQFn32{Gwzx#$yM*-D; zLb>7)CrRICIOJNdi3zH$-raQM3SZADIlZ>L9$cS`d2PE>gDNEgu~2J+03Y!R-YOVY zNpn?%W-prQ+7tgg`y!;*0}C43%kAEud3cD2ZSJdLz)H*>bS@F{Nl-t>(vbW@*uT;F z=U&tl!57DO`m#w7t-AVBv>XPz;m#9dL!6%AGbF<6CzaNT2ao}bzXLL(8WhN*IM7?m ze)TJ1YTr5K*spfMrY}Ez6XW8BoxN^cpF6c*w5KcFegN=)awU%jii#tdkfZ8Gh7ysx z7m<=LH9KxJGn9V5U570_U)$^=+9QOz;TlKa^Q+ekBkVImfPFs`rvYlALBg$m1HDzM zs^2KrzB#`RA8z&NvoDU_z+fwF7H4x5DD0$0U1BMA@vysSztjC3!1FIQD(m95Rce02 zeqwuuV3+-}Q{gaa+AfB#xt%WNsN#!Yn+Q^g8vGF{x3OhES)wbUsv^YyO|%VnW=CRv z{}3m5TJ~Mz(zrrT)@IXhH1Bf3U`7K+NT<7bb_5tZjKmhH%exYr&EpczuQ2~+qln_s zHOO`_1-nJbv^n)~ev=03_t>`{_g+7z1cQ^LL%Zz*xhAEmX=kNkYZogk;A9*BjdNdb zZAU{v7`xa@(C5q!H#@u8#0q``6bvlTvrW_>7E9-wVxpSP^8LbZ4tnMN}C+!av+QcBxOpUU)Wa%CF!x2 z#<<_HdtA4;O5t>AzV16d@P(Y@w)Nxb%Sc-Zs?y};bX)M+x2cUtcKMcX}(zx7~S{bTohYuni4>`PhNjs^ffJR9w6vq z8##VBk**m*pLNa!BVmpb8Xn7@1Gc!s)rzZ%q|s7&?J6ADDAEl_drB!*Z)?_l7iQd@ z9&bMB;k_I(_y@&ffA&Zy{n?SxmY;l3r_>RCM@SQF3LzhRkEtJ9APJI1f_f?N4;1Tu zq5%2Ydket)t6v<>{05qfzEr>7GhM)rlY4q2^e(W^4y#t@ve#9vJqrwyAz*1uNH58e zPds&XyJRZfM6O2ow8NZc7L5>pLw0}|)ANbgRXdyPWcw{a=^*SXYi$aJbOw9>`HNt= zKu=cYMSm+jo))h9t=R}3-jXdQ1IQE1kqa^dta@v`XX(S4d{5Nk?)L3Th<*L*&fBx@ z!|(Tb9S<*s>KIc^lRa%ydD9ELL7rp2A> z+ta+zB30YLzN3JJKkl&N@BS_!wqut1{#c#;pW?WZ86pE)2}Mc38dJ-W|^Pf_CNM?TJAq0mW~F%wVZYoX1AXTC+xYL7b?QU zcJdbbV82AqR0Z!5g(EP}M{4{lEJX|&k_g4VeWmVlE-^N)wm=a+NAEVBu3yPM6&qxJeT^OWWwH`K!U5TdjNe zPK>)Lz00-yOJz%3I9?riw1fyVXlEhgFkmMb)-xF$4P?stWC$H{1FwBb7Qu0j)aA_Z9oQumeTD`Iw@X_a2wurdX|r zzTr2FBvV;d+Iy=f$^S?{?!f^k#0(`825m^9(v!d&%guMz&i6m|d9!}tSFJL%ytjTG z__4B=2Z!wj0Nw(?tX$2qR?Q@Nx(u}>G&=pybmd zq7oxAA)(W?ZeX@0#UN{N>pHa|KWR*eD;A| z4IP~fK1-VXWw!`hEr_K;2xJB!L3#xc-y@qr;EXI*bR=p>@LbVFolb`k$g@&+I`F`@NisyT8v18_IN(`z(^jZFkgjQj=QeTf8Xc5a9`y$ zAqRNcJmVPtyCR3dC=E$rAw=GjL<3^*FvV?bt=#Ga;Jf+FpQ%#%a^>*XwepFf3%wQp zC`ouW^{1prarE~{+f$XDxbDTniy}@68|v;^{}lr`--mr0a%adQZ?W zv8VF={SV_{ zH|XOik&g1No&k0m7cR4QAvD>&8xZUPTJ{xc^5KhHbTSaqc!FA-y?{R2L=V6dUXz4Bi)f4;*3Jsy*{6t&tlwy zBV5eG!p~~h>i#i0tiMzYmkYWs*pb~`H|>aG#SsdL;{2|`p@sGXm6iwzupl6qlD77L zxB&g#NYUJ(;_~Ad+X#U%SMS*?XQ3pjjrho>A4XQY2nOcAFhsDdd*3|yp9wtp_&*^g zUOD>-%`94Pf1r_+LVq7A4#2JX7&TO2zUDLDc(PxV=281HMW!xRL^Dy@vi2oBfv3Wj zZshp2!1DSBmYuDUC<)B1<=NDn;&1x9+Z<@SJh&`02zQO3WwODx63+fT5H?|--4Qk^ zlU^s)4Y|uzaB{uw;>sSCpS%q6PPpZ|x)vAt+u%}pYor4G&jEcZ&-rru`U;N+9uF`? zZdHe2M?%{iCovQ}}*OZzi{?0yr06X|rd48TmbvuxvOz9}XdbJ1%<@ zC+)i2_8I#=CIls9M>B3H$U^}M0{eB&l-V?mYiXP@{#(M|l z+DDDO+9=Ns;y_9&ytX6CRxd_!>lbqHEvq7!^ulAA%*#FG4@ z+|{5TZAQ_2TK$Q8@K#|17lclygDdyGNE~&NWEN^-Le9UBhgVRW8VEpS0%6l>2YdA; zF!dQ!8(3Eotay{K_#YNzRF@(3Q#?GD_HaIgTXod=?Z*4-S}UeeWtIL43Dfm$Rm6k%#kejvogTp-3(DL+uYX`dcmxam^$8aFnDR-k$6W ze%xOKMjg9$Lszg{ZmM@-1$h(bK2`4iIWD4mF)lz{%tSAo%2}4$G+W&4f-A~MTsY;! zJcwGH7+qRA3OFJl^{?bjSg+>~?Q`)9tmu>HN5+li{{%Y4@Av4#+~z0Qe8j#U2du+q zy{T7%D}PvA2$A3Q($n@mmB?%6?BL7)Z-o2pVsWtS#m+hTzJGzQzIQ_xd3P&B+yYDR z5LOc=kY|(WQw@KH-SgxMYjEnOvos5)zbMjx=sXrtBev+{ZA7@So3zb{2VulDAyoJU z&@rK~3^TEDRR0oh0g8;!qWLcFnh<=GTt3@<9buBCmd{;+zV1BCkhQ*w+^U@vl<6=Gx$X z4!mLUdPeln7%8Thn{*pEib%cq&h4aD3CMyd0YU8-|IS&P2s8|*e(2{fjcu5GQZYHO zE*@MvIm&`r)a9(-R2%*A!-TcF0XD+*hO3c+seu{_mt}_PQPfj!@s|M0~|5tjjZ8_Yjnxw{AlCo zN~f#sa$6K@)}%@>^DTZCZkF4N|C!~rB;rfC{uO>}scD5*9q; zWMSPaQ5s1K<{t5CQ@Ew&mt9tl)l8DmTZ)+K+4^Un5)U}D|9pQ$(qBfS5wzn%mxPb% znMAfAkFJCScwT<~oMMEGM1w@gII^w4NDFY@7FKi{$YwAko@&p4!q<7^Xqsv09GjC0$s=eu z@5Gqs>A;ty@S+o&1!_2d&7}oG8l9uK^ZVOn4KK|6qd7gTe)iW~N)I66GLCF{)2V52 z6vPgt7{+BZS8D5|+6|E-z_Dd}2ITkd+{fl`nAHQ-LCXs4D0Bj;>UHFa2>dueJoD-< zpm^Tfy%}wNfA^Jr9P0ijsmPl8NxsAab4(ypD<-W~45yMSd}u9KP_W<`>k%tqgsf_s z35{?j00s7!#xR{HYdNsD)Ij@~u~+1%t<9oJ7({wUr$XUkKtRtpiN1Md4f-VQcV-+) z#=b&v@oKm~3Hi%U3k-+o=)|w^E4d<`7zRl?BT0{AU_jvQWeeUZeh&`$kV}Kh9aoql z&DVMNt@6^Sny4B+>vq4uL${*Rrxl_;u^&PI9T>m^x|iwA9~T`eL{IQzv0S*@Gp+W+ zduIQ?-^7IG5ng`jKk482T3wcM<%_L1v48y>P~QNX9T9tVS>VfPE2F&1G3gy@qI-uV z{5=>0VBDqD;8>x{KA%n&ku%q;!8f#Ph%mMae7swd=k?&8XwR^8V`0iNRN)xGYt;ufKMxvh~KxU!Lz&MszoT2NU*HF6=gaUd0eci zVmg+XtU;@n%DSBNsk!pIMwF3+{e$jX8P+e&g(z~&wK72f8;wx8_o&7QthF^6hlfLV zt#`S}VyBDIea`KrKAeH#7EbdEr)y`|FE@)KS1*$#pBDyC1`$7e<$ zJeE+sob_Z`-XBr8aW?rbcx?`9wmegM~@;Tf;*6ysjOcdJU56~+s+opS$?{fbsdhAl`+#ht?WAYsQ`0}$8jKN4kD7^Vt>+{B z%^h;0t_+x&G?W34PO^|#s$gafx<)`$Fc~KJw3Y8SFsXW5h?qn$WqMp}=~G&y%>#8T zzi9|YiCw*YfJ+e4jO}qJltQre&9@UGAXOoCm9VkWltOSdL<0;7lV$-A;!9q;EKbBO zlLKBm9yZtyv%K_uH!hq+v9td4zQhf^7kR!SqVjweiktO7eipl0`VkTEFaH>(=b+sy zrgKYf3@P*4BOj);UvH8cinRQu`tBw1Se8?o)pwSkv~g0 zq|u%8k>(*(-f+DRd$ar1R)*AtYuGL6!B?Z^MkI&J{wS)y`07?um?N(|OP`OeU?^cI zp{&MCRxmR+Q|wxnQ+lHQYtcionp9O{u(&+PWb`ryCHZ%bBCAoT237A$J_nWV5j{?7 ztd$x6*rzOF)Ax2$9kZD%M4mM<(qi^n0K6Zpb#p8lrk0n$6&4C*J5`Gl&T?|6c;>aN zxk|NUJ*fq?RJzU&Y%d1TX&FW=KxLKtxa=dvllVN68KyeF(1+Y%cg7Z|?{*ycACc@mvIYIu1Ao3 z7C92VwVOqwzf1`~=V~~NQm~|u(yCpIM$j(t^{4CO)0gKe;U8kwn0dE_??Q{ShN?Po z6nv619Zyp<7bs(Kc$g?isnkATi=x)gfo^~B;c6YnDA>m{+xmje!T`8Ia+)^N%4~u9 zntb$4&rje+|2g(+>Yfb-r~MU|nEz~a5FFfd-@Cp347blbewA^Of|h%XNWZs#-kv+1 zJja7?wd~V+Uq+VK8&;py2Sukmw5*K9g3i__sCJRY8w|AYmQ**MzFo-*AY9pNYa!hd z9QbbuM}_V$SCe9U(p(5MT;IBtM%`(}vZHb=sOc3$c~m_4Z9Mgas>xLUY-g4z=jVd} z-%H=Dju&Pz$l-_M;}SBG71->m^94D^DXfra9cSYbWDIgKguCGxg#7D(IE$(t^lj7%4|e2S|zw>E$x!Jw#S&PmpBs}LJ6GFIyT zw{2cI-_w4qmh(HJ4$=HK{LNhO4=4TxUHJAWzA7<;q$&=YIbKeBv#s{lKAJ9vz%~$4 z!Ut+KU0HjruK9R!kdEEKV{NhgZW)^7fV@;J&Nxys?Ra=OsK1@a4+Zb^(EPf3mTY<8 zVu|+0g6j%X5-n1J{I0d8;7XQY98&Q)Py<}Qpk|7dj$lV(&hH_uZmi+8k~0UN3OJ(w zM5F4GU1V4fM4V&OXP;SKpH|%*Z@L_E18hhy9FjQB;#e##EeGKG9;FZWsiX!(;R5rc z#<}W4CB_K}8~Mr)p|!Qwa_T%>M$vA%=-Sume<7IUPHc4P{ za)x1smzu7RlAY=r3dc}({BU)Yie-Y1q$w7fcyfKgW+Qa15kXw@LoVFQ z3=$AB5j@7GIRTslOfT40$Gca( z-(FJ5Txj-6y)8$Tuq_b?U5Qy%daw|rr9=Ofv~;~J3MI{t@z{s|FMrGdyXg7-2;3fh z&E{_$5n*Z!8#nYYzxxRMC+23Bjeyu=vG^tJIs@Q0NAiGNg4$sZEt!q2VE$KO2IIt& z`hR`hO?%LbeF21M`!p?_+bUkZIMMh}qUHA;KCqnLeK&^aGo@Go?S)(=#qPq56|YQ9 ztd!WH)8Z1rQ_F-w%8i3vv|z^cKo!eGsNpc6sY8NlqjUPUtg!xKC#1GXY23VOHx9>p zl0(Gv)chg`I=#%C^i|J%;SHW`r`m3R)!j6b!?(Y49zD^!0k%YH0yuaw3=PvdSP`Sp zB4yHImt{5F%|R{_upJxG?W?}cOc0E>bCV1(W(9W1Bk$8BayQhCo2T2GmTz}vH{rpAv}))1 zO#*+bI1;@5;Sn*?M36g&EdeheM2$nIdgPoP8zPz<;|!GqrBg{mKZA)=ur0RRT=3m! zJGl_dG5-v@mR@)-!2g;@!~G=mP=5ax;JZf@t$bBM{jISj+&-@_Z;5|kAOSVE5(l0p zE4Np1vitb-m--)O?TEi}7pIzF4PZ>)2X@tOR$TBfk(pYCq?hOENg3?#R+{*4?0{a1 zL=QgV^6Hu%>#=i7gi7KzUiiWXHe^)sc)$_U%&sV;C0i)SXUcwKM-Rnr6>|YMY8(tH zya=wpn7bF>K0tMz_pA@EGMSV%C+OvKyiS7gL$HI(4)+!uvC-e#p@jA8Ma!SqXz*HR zJAHe67fxc=g}JX%y?Ol+C&V$X$q?OAvPRD8e(oMX75Z_Ov_hfCMyf7WsI;)Xy4MG8 zg5>wV{8I?dy^~-j<^j`a>9VgiyyP75y*QIpA77*Q(nz9$|~UF&;kb2D%E<~E~BVx)e`;4^7#Z|B+Lgl91t;mSVY%U?uAdp#45HBMwPsS zpvVOJH+2*r;Bn#Y=wm9OiUaEkhejgAsQ7j+)fN(!YnuewS{i2}a;2qke!|lx3UiydkYdyd$JBn<57Go?LWy}@I zTRbt;l%|luN9-<*l;ABNQic+_*b51pZ~C8}8{xHStdx`xoSE`ZTG!D?r3)C> zTjc=EQeIo4>9d`s1FPC_^__R%i(={3LDxQaVFBERH>hu>^$E}P_JW+3;sSaIoQWT( zZZrRoTzNb{?e8bTTo{34{0KwJuP2!pKb~K%qK5<4Ze+}IzXt$d3(w$7qedw3nZ^S4 zzbiAO80YcdU+$*Z!7v#+)?P6Uk9Dygh%Zsqg=OzPNN@e`&(O$9Ui$*?=&yD}$v=_A z*;Qve<69eU8M&gH9K$F4gB)}7ZG}mx=r(C1JH&w-zWMSe!_i4m_yozE=DexyB4pAG z9orw7D)v8W$-lMs&9Atib=i-WfBW>W6@*#{R{&!)M#Tz^BCDxVcA^d<)puXvim;Vm zIr);y9Lb#aZ-*nDKNI>SkK&oee>216-r^Mc`UF7RTYM zy_A?s4pP!g@4kFjb~ezPyDf$ zn(Y3tYw(vmbt!Ak^Kg%Ns*~`-MdKPcZ@55UH>BF!GmPA9g-)16S{bg$*g6QmS*kEwz=ivT zPduhN2pj2*3H0I3sa_!RzZX=z0e_=o}Cu@Q9;+2doa>l>#(r6IYFH?SE6R^%u*HF(s? z{kZ81QvWN+SL1Mzy)=-CuU={#v6~2uw zfrO8=_>F<_@*r@hT*BH8xeTbA#bHY#N3iEVl=7xu(-A z|40DU>*Db1)t(W{13SypR90RoDr-pBe-`q}C}X^)qjj6d7of>+jPR=P-;+iC2pH$u zNvr!4RCGgB*|41c|566+duXjnC7p&=CZ2Z834uOt8CbNF_p}!PA3&hsSjV{J5TMNX zISTHN0IhsEHhs0E&w@lVU(nnjz)3<6ir=d9o#$KKF{%scPrBYmMbSIk+4p@(AG3w0kSNFdTAm1;_?_y!xvGR z79lB}hht{@cPW!O=rBm)f{GLc_(&-7X#VjyUYB`CHJQu+H}Q?mxn1E zG2~p?Xq~>%85miJC@G#u$|1Wu;3e_p8vxY%064Qc$^T>DP9oZeH1oVyHW@3y;yq-N zUT!a3x%ovUy3BNXg5y0|85Ah3l$b7sS{u&!o>Mj_FAF`~A32pB zxjHKAu={&s(@}-2ao-g zX~kR^^lm>s^zF~abz6{ZAfxBEzk%D6T_Q%)hDd#FxG>qk=17CJA>2TdV9pD_DUVmz zXy@(88Dxp=Ew2;ZU;Wyrc!bgu&cDlS&g#30!)Z1rP+=(-qkgtzj`^wTGUl)q%E*?Ma zQO9SXnFmigcEfs7O46c?stQDUt-1%|1Y@{(*BvDKxT`RO)Ta1QVp@1p5vQ)ajP1`I z)8Sa+)Ygix)c)}&RtnNP$RD*BQst}Y;I1q}cqYb+-H)?!87#eetZ#v1(BGLb5Jl%eq`gS;9uCd}} z7#FyrEQruzZ}sBO{pa&lG$m3=(|{hkENaw6qr~=)3DLAKb^layL5)EN86lEvC@p8| zmvf=eFg${=&pUu=L6*Rh1&}f(B>ykIpZz0^T&2tj5IXxt0`LLz3^}!JLbLP(3{+W6LuaDivzZXSV)cXnoUw)uoJEja)c#zg~dZ%4r_&~)fNz_530y9 ziMH1`$e*OgFS%MpO3DDHE+4T91yu;%F*Z7yBEz>-GiF^EbSbPjuZsFTk_;J$Asb){ zPu9t7xd;XY4`!wZ{xg4f8q}mzI3oZyemAQ@I-P+WSt zwd|w2D+XB77R#_(0P3t!#HNfzgk*!ClCH}|lP_0gBPQen$8NztZnHP*%@U6TmY!YW zW$IxjS2c*Q`pdA|hed>d>iuU zYsAFVm+kxp7iaD6jV3pXyMaA;%gOlXb?fJ79AW=3{nxIkPmXD2lL&fZzoFN>T{uHOZ z`IDEkLo~_S*E6mJ3n@^UHHJ6Q_m6>rEwM~$BaZQW`pRVH(ia@RGRaQufVb$ft2E_SYC+qma5(;tcs@GwFy`NbRq$4!&BOyOG6L&4~J1 zU-L*yzbsFv$cH+B`2iAIDMg3{4U0(gx{Pm%Y(#!O;8=!hgWheT!Q)l1DqOpciOpa^ z;416hf_UcuYrA zlT?$*)Pn$Qe7FW1u~nAuzjXN1gH)?d#UzP?t!?EO+HIPI96xUVj#!E0XD5{$RK#S# zYrLp&zGi)v1Z08^2$@jph$I+V&JERy-_4HFgqBGo6zkf4k$p2G;UW<|F4vRHY9H&j zL3F28_hQkHFeLDv5^};$fX#3Dto`dY4Grb*DZdh&p95;{QR3eyYBkefVvx9k-%cZL+u6lkjUg9w&Yu6c?wBKE@eYo(vd1ecTlDINWqo>Wv=P zM>t>mDP90gps)LxOW&-_8J+Rq0RBW97T6l*>R@V|s5_@DT%kRWJsvt(e=Af@DmAK9 zf&a~4qS60omCOj>9G1b1n;pOD#G4418NsIuUWnCBTo5RbW9GYs1C}f?cJcBj)BN${ zq_mNJ#jb(Cqb_o#Y5&9ulgyLe0`#+x1*Z+XW*>MbMH2a3DEhy)YoAsBjMo>Px$fKF+pw-N@p zZ^M|mZ5SFDHGZZRb=CkrT7*>HynmB}IS47XGQG-Z$P$@TCOi8;euT$S&RYx}JTocT zjg~`|IBNOZbjyRv&iP4RoIo=S!lSB8D=zJtRn91iT79B&(cGa50O+d)5~twkobB=V zG=;+*gg)fL)$+Fl!z`{e-y<>tvqSDjREeKYQ&_nnTcikYQ4PPAh}V@YFcR3z2x3(v z2Hrt=Petct#}y%Qa=0=*$y=w%h)T>6^|#Yy!PX3liFEIB#wDfQ^}IMFDn9<*)4M2S ztVXm(O*jbpSjyDIxer!V#w05%v;mf+43ysh9Y!(INr3rTrTpLOQK$&FN1FslLs>bA zzs{DaANJe5U>y{Z)75bb7Fx4;~~WJl}10Qf~%^?DXL5W1*pt)584thbXc6 zW6Jggkbfq;bpDr06j=D;(41=ZBgiJgx)&++pm!WwhIHi4gb!yvC%-MeYA0@|r97-# z`+ok#4V|Whr)+~vn(1=UAsNES4Bg1jp#Y9 z{JKWH-=9&*)80d!*qB>MHsuzq)Qv}5kZEB8^Wm0cjpnPAY>7sQw` z(nXI_z}93k;A;bt4C%M^3T6tc4tVZT=NJO{9xq?{OxWoN^T*%nAX9sDuyJzRS>3 z55vJ*=fGL_+T7VE^o+`&SL2c3pzQdT{P*iRRBqv028&X* z+97(Gx;XIvYP@wIW)?&~deN8Hif(p9(wsxa0zl6?Yag=IeB&Sr02M8|3gzMjF8gse z^)bwSBq(n9N!@gZ3YN2J!uB9&Xtnf>%f6A%u`-#Q5BiT`RuxS2P~67kFV|6JQM~UV zWh(0~CRavOH{#X-1^c;IMmtEX4Y%rMln+#NPgH3H9P!WbNiRk}2{>rZy>`vmgRk6ml!XR6l5&t9N~g6fRFjWSmjQXXEVV6y>5@WKXL9C&$=Huc$&q zpRD50oon@A_gvJtE3c0@sr^Fl12x2YbtIVx-%fNabc)LaHJ>_|A)yRjTEMX8OmXz}YC(s`GSp9K zGZ689$PnEVcH_q{JNg=7U=-L>8@yiV{2$=Lj@$`*6wRiA2UXQQBB8P>73$@X03BA%#-htYlQ5^rD#$E=$nREA6)bW0#T_yC`|k34x00-!_|^R|52J2 zQq~GeY3j@&_P@+~S<$ZM-mKufma+4UXWWVa)P?gZ>!@6F*D2{0U(6vlF>nHmH3T%3 z(=F15ytFFaHALDL)a~RJeKO#0M26=cgdaQ??j@u;kqld8=yr`oWB)SH1tP8Ew&W$&&j-3!t!EO|_v9`koFZVNSltSxmeF49oi0}-~ENrok+9v$J0(~JV?{e~O zf#KV423%t6ql5y?P`xa9THxuI;6cg1kbj;l!;QD3(&PjmWo&bw14LiOufi|%P463& zG`ZBd%SlH*vFMsMx&%w`%@5Y*5)*<3&HTd6%J=KhTI;@S?$!2NlSYbtE{_pop++Li zn6E%<7kY2Oi<&IVoA)w5CHyoFw?x05XLx!R=L1jRJlVE6fJSuW98+-0Kn?XR zd}3{pdOgu|i}Xox?p2Q)1U|P7b}8_0Fv^-Dyz2jNs{Kw=2MBoYQVkxWlG$;3lzCf5%-iFDFo%1Y1;B$A+IWmMMX_(wm(;lOyKS^6Vmh7H5$;k?gSj zJn!PhaH_L!Nh}rZ1i>mp7Tajk;HH(cV!;FR-|U4+(<3qTsl1KI!ImWZlPF)getxl| zIJAu9l4x1zfO|8>d{Ia*ii>i>g&yC-XajqEUTgcG?_%eCluQJ6lxJ^8-j+G~%-Cpk zO!HG+&MDN$UGL1*eMiW#*do}%`vq>0W3>@ey_W8ozA=ouDqZAhV&yz8 zDkEF>WZ#xxc)8rQOJ>OJF;ouNa1!P^*}c`SAN&jIx7KSDgdTL6N6t7V{?lVX&gb_j zi~#fg^PAT73)gKmo>orOBM@r<&r9&lPBg`VbD0zCZ_f=ok=U-r4c936dISfIj_7+5 zbk!Q<_(Xj+5MYoKScLjNl7JE2E<5=8 zKazk*6;^WRvwMA2##+%~1f9FMrm1PWA6+^L!qm zC{+a*72YLT3^Jy%Ccu^@IK_lCEiSW}Q+*pT-4t9H>*Ax#W;P8sBIPD++Dtt%X-(Vx z)z+^?j=92O*{uPc+TlI00kN0i4*=iGGk+Mg@hfbeD0lf)-1Iz0MCi$qixwfrkzPN+^m*FH)2el&VNox)6Gi5<*KQ_leK*z1MlabDi^^ zbNIvFyEB=Y-I>`oyL;!WnYdU&#{rcylZ9RD50VGLACvlI7(jf7_{a{yF-XmTqpA;M zUI;tM(DYa-g}h!57!<4aisGFRi}z%1#4@+y?acH~ic-?3cVEyA_Q)<3ro2|n=GV&s%0(8T^b&P1`4zH$bb(>S9Pg)4O z1WUDAnVVT~k!^`L>SEB@yYnpGyF{=Y&eCoFQ7jM$gI>wUnG)VIq-&2A*7!1 zt`?>IxrAiKt#!tbE3W%soTbOzmfpgvyr-_xGmP(j$q~$WdfLQEu-7n)?p{+A`AKw8 z^*!|0?RI$!Bh3A0fUAhQ#i^Y+F_6{s+|A|kRQgiM$DMPSp%Y+|=eedB)T2(^e5N5` z)^d`_46!n+qOI0+9FOaRY=+`PG304=X^onXX~-efkM}s&Zx~p{xNVB%Ccmp1=x)`K zPcN(%6P*TP<$(hgYN7lH>az!}u#GYDPaPyJZ+nYH(K|iPR~Ye_h3T2^5L_G{By^AUl)bVe zbPb2-_P$>GYOOND-*m&6`|z0c+4)~C#ztieOgENf&9Cj72uc_R1**DZ9+Y$94%)ju z1Dorx6X@w|ew@Z~f$_&2dEOsJ>uu&YH?tx2)`uqCThl?H7DCH<&%ez%9=c>q5~IY3M^@ zy)os&NawuckHq6q$3GcIH$Mim>zKA$0ISoO`kE}yT0fJcErWPoJ&K`{EbU|MzexUYai|~=GRXGCBu(0Dbv~kO}ezn}*NB#9RJD^&dEBV>zd;MFU_AhH}Bs`*g zBuxv3W#H_$CvzOTWf#g*;^_PP6mR!fbjk?$KcJ99= z@JK=U(uD@{^;)Jv$FqXdSJbJ?`H*l=+!jCcnKIk`E?m>YZIZMgUOQ*I=u?L4Ma3H_ zlEWU~72b8|dzIzG1R$PDH<=ejkDtVH%)R&g-C;SrHC4!o4bTFcS+L|$WA(u`K-?0u zQa+CbsN=ef^&bJ_M-VnlgTy>_UfwZT`3xL~r18=HNR`XJ;G zLlLCwZp&*tn6qi#{Jy6f`ZO3v3WN zFc|7cP)NLR{@b|n+~7@4$2x!Nik~E?Cx9h0y9;H;TNK%lB7|+C%)HBZwx=^Ha6HrUA8fC~Unb6fwxZ{a z(l6BNCel7Xia!o2G}v%6SGK?*>@s?*THcOc>RN|vtjTUhvZ)guzv|+T-a#_2e{QqjmPY@^IV|~PCYmFbwU(+0OgO3E{NZh%`!@R zDO-7v?RL$NJ1fn1oK?M%ya?@AJPy{B@dNLnYZh@D%=iQZFwt}zNB72WTk^C68(7c{ z9O!E%GlYC^Xf)QOVeGAG9FU99H^Ck^>-4-l4LTHpw#uJR^Nym-!qvA<})#K8vg!m%VXW=(PXmz%H6rE-Y+|} zcF#WR>3fa*0aC;_!T$S$bfS;X2L6PKr$){-wjTtE#^D}!U+ZLNpP2LQBabe`v3U^fc6fWQIDUYAz%zIhB;G-!uGIXC1i>*diO*cF|^lP5V56o?uI8Ys6fj2>R)1r zNM^l%p}$sHL3Hr!#;r*p7@zT3dWzJEc{tNbP+@%L5dddV zD2%SliujVzBBChsJ}~*@*7u(=Xb;U{1)J73feGrFd%1bMN=h2cohM#x_3&>8nmo9W z!5dB_l*WA$RT@viGP-)j=*Ig^U?q8>6BVYLIH>!FwO1({ayJv?SRO%@hlLF|{gRFr z)Ha+PmviMkvLx~ITo9tIhCK3;5?w9*0@!VtT*XqSfxUDg0~~G(2lBK_BS~9oA(w#e zj5vB^{-FAFqZf3UFM>Ji4)z!oc5%^}3$vLtQI2}SBld{@)%L7_H8p%yG-P&1rw!Z$ z7>*o7fauy>PFBG^T3`1(v7LBpbqq$5>S5Jbb~j(QYAxvEPd@sWZOFaiMyqTq$79#w zsYUE%K4IcT&WGv?TKJ_$Vo)KQ8@nj53ri+G^&_C@8HBT#xtNiu3Hk4Vi|>O2@6Z~w zA6|Eh(Md~D>LiL`N{$35)xj&^#CMFJl}A_#FM%0rBkYulIW@(MC^GkX_heGvR% zY}+u}(}R_mUXM$^RkU2}!JG`*5tcrvxVzfUB ze@vDJmuv`kK(Z;b<70Xyg*|@8aeW4D(-+QI)nXV< zj-XEwE0V z?`XJyfND}kC~hARKCz$J_!zIhf+k_t(ftR|ZlUFuVfL(=x&j9w?c*2A1xDl5?gyEd zYJJF(TBIaL&PH#)3ysg7T0<{JAa_{L&X68p@J|(+c+zeLxdqrp=ak z+ey`N3(8a22Mha`Ru3rJNMM$p!H{N#x?vV`3FObIn<}3c(Mxq9h@+_+xdR_Q9)H1~ zml;!(q5M_RP7Z1-3)4WgTqPPKjO3K6+Tj1nMCqaCpE9k7s?!H_&6}fDKz! z_XIcBzD_xI&*G0Uo3-*6`L!s>O0K)f=&W3-!Vfn>-S3q-u_IHhwpZ*D z!#1X>JuUH!=e|6+^ehfSqwl_Lu*cLR%5QQ+lY4dh6Xn*Q=GO;1X0Ag!wT~PZE=Vh% zf4{#jdmcANkia&8zo^|j3>Y%VhI!a0bmj!96c-cC#2zQhC0AYYemNZ7Z+d+&K!JJV zP?Ukoc-D+iMsOou9~n5aHs0;K{}*Dbcoys@VFH)5kstrCj{6)OJi;;3$&*rp?0Lc^ z_E6g)f9U}9Gd%agjn+18x{(i-xi`}{8S1h*cnu&s);-0`e^=}E321JI1(Wvd(7wE5 z-}yIGw9KMyF%De$9*<$UE_s#b!%FpfgkY2Nx3VJFR0!(T0Sf^{wM#fASsK$_sKga) z_-Kx(Wvr*f)romQ07Azqv*P5!1Wii9kT+%ni4=U z+EeZpFFNyV|J+I)u-x3^8)m=y#ZX0O2?_4RZ5ylCO&&|vaAY}tEjxle%BS!*M_!PH zdAY#*F`6$xCzSjou2m5E@g(Ug0=2fzdkS3?I72DU4@GXjEe=HQezSY$an*rylsC9l z2|Dvk#*TMrDJST>VGyB@K8nAS5ybNsjv>T|Swm84pBwp<9TCd@SQUz&GqzRVr|BP@4zMSXuQ2X2zF)Zq%=wNjU%6 zN-Cq{Zsh6>vJ4y@9i6RiL!?w#*SWwV{sm?N+P)5BPOHnj`#KvP)jxNXClc zGva|(`q11LoZ?2T+FT&0`m(VucKtI@{%NmRB;348$};XVbK68_EWfxTC+$vXs_gjw z#o|%vV)BdE#kmmAhpn zYS7ebMT97`XL$MW*(0WR+A;dNGkOR?kj^P#j`sC1g75OQs*wXX@!Dje_!eNTo(P@JN9;e~I1wK?$B!j@ z8amwC{$hM?$j^OX*W8Pzm$g3Z=y}BT(c&kNMO)m_m^*hhVqeCKt(jkiY?q;8+pnBM z=zQ0O@5!7B4<3>4xF?m)Bfgk_C^VI~rEyiradNNwIegpnNt3}L`>EZSN}v6O)+oy9 zFLsh_3Iys%smpjK@XKPxc zd){$`|My}G$>r9?c*i)EAN4h>!3#5Lp__abeoAd{n@$8Pzze82qYR%bvM&Ln5C^(WU;PhT-y&CzAz5Xra?yvMWDh)yRG1-$c zwa>q!FkVK{Un94-*DNa4ofun=4-C9czQVfJy;wiBosO7De--G5iXQkk09w-axed?v zA^-LZDF3N;^yEBuZ(p@d`(6U2JAU1;x1qlL?FKW9KA?E?WWWjEDnI*?nzcx9nk+14 zwRcL@b)*i=MG~66*L_6OTQ`7XET0~Lw54Xo1}K_Aklqh|(Gr$5VZzFt1oq7m-`)-< zd~QWnmGIwRJ`*0P17ke2!>S&28U(7$|6i(^(*fa3bCKL1Q=OjyLbq1W&ZR1+ z1s#$PBIEyJt-8Q2TMtf1=8ViS(j}+WNH{8_4bjzdAp5tn-rm%Kpg~f%ySVNyyD2*rs0s=+#!^6A!WL zrUmVKTDBtfFy-ygOJy{qLENRF{oPNXIXiiEov{R`#FFF9AbS(Idkt?`E28K)7>_(B zYgpVm+z0{!>$d9tzYMsa*@niaH$GIcQp;>39Lk~`+=9N6c~~C`SvlC;{vc1!h;C#* zlzori*WRD=F`3doDe{+gn0d*d(tu`QoQKBFbC(Cotkztnqk5#)SX^9aoKOs-zc;#=pXeJa1g2X;1Wm4SsPiaXJj1HDAUZyDbKtBmxSk z>l{r2N3v`Pv+Q5g)u*yaTwzTghq5IUj9EUsp=*Az^j7>0T`e}CL_8@UclpUWY?->n z%8sh(DTI}j%Phe7nmw{id8|<8-*_a#hA!rxtY|JuLFkc-ymi#=(dK9H;{M%x8HvaN zG8?lE??iiRGD5s$HKgNBB@>1z@g|x&-|;fA`&PC2i})f)&URfF&Jr4)0*Ru-gV0a; zD$F2JVY9UUIe)z^nu7rP~V4B0omOn1X67osQ3SgzRIR=01y@gG5_ z4Jr;$_`eQ~I(PQ-h5kHRU%qr1SobxACJ=RcP%@(ayT%_*!YTulE+$&wP-UA-eRQz^ z)CRnNTu?6&%%U0pRu<1?D`eNy{#7+;JyRzGf%|m_cs^w^uH7a#QF;VZ%)$$=^QyBT zmmdB<0x=$#K@M9+S4t)@&TG$ACWTLp>K(g!7P<4+XESKf1yN^!4}EtQ1r-HDLmG$9 zsj}POKLQa8ZSR{<-y(%sO+Sf~fS#m;YP=%5e$h#S#M9LgMs!67as6;zMmCQ$Bcmcw zqD36&d(IEu7}evOPQ)#>Mgvk_66~8@_-#MA(TY9!+~LO!+@bCfCvb~|?$xfN>VxaA zadkW`*8AnTox0pK;vUqh7?8u%3x#({0o@t~EJ`JO;jwFYGw#iUin~vp!8CseFCuN< z<{MNq%xcf~3=Bea7{k34fwVpU_d-+p)l^Zprr#&v4X&JHm2PO=j#`0mxMM;wqfmtR zD`VXQ0wbT!sTr)>v`*eK9m9LXe}gvO{C`NotCos^p67hP0&RyjhckMS5}%-s+V|8* zA)m#+!y~|8vo~Q+)+oPG+qrEhO4*YflW@4Cc)k38C=7j|rZrA7J z4Oe+CNz+|`tVDKZeH|C`8L&*<&-V}C`8?OdEUa5D{>Cu9q)DA7x>VIh+3c7*gM}iZ z=*=L-J2q`{)S@cjHg|$XP-8}k+^itld<-cA(?eXDx-l&17t>s{hDc?7!=q%EYf^7L z?*x9Hj%VAGfR;xqY+)1SU~UOS-Yr)@vjvEFbJ$(psW<6zu%pCk)X*?(6ll`=( zv)9UNY&3$d7M>omjjs&rhK0z^x&J$Y=G>9PPm7;k*<8v~9iblo zi+xcw9TJ6s*B2b@3V0*Zl1o{X3|~Lsf2^xT z{krD33tE-f$F^~XW$@zaALF`j3{R-N^T!S&LSKY`=%L=9#j^jp#rDQ~xU*)u4~c8c zoXToGLg^(RyC%~9Z5DMffSw8La00Pp*@!*LgV{Q6mKXYV@$p{sKc+ZxUW17C=XQrv z&}GO_ABbtIX$ze}zhuBtLKAfP;&TQTMQ)8}StQ+gWwJN2p+>w_zH{9PSa0S>?i!%9 z|Myu!hoK?-NpSz5#fP}>?;|os{W+(!G_@(_xC6#}OzL6-(sjS%jW)A3Jkxa3e1QcbypnuI zVafH13*n~|>&;Tw0Chh4>78B_&89(Vi+R9iy&i>umv(BEs3#xNt^(;9C~bi>)*H;X z(Xp2FM#gD&lk#KH>CpGStSL`kpYrd%n9Qd4rI+`kbCy1fgoA6;uc{siXi|luw$GSL z5=4LWm{^^cqJFr<8fT(SZH9yMMCPCdDW`zx~W5YA0$G!#%)-0RiM4g7;*c@^ym~eNb0`&4q4L~ zEDg)40xdL5#(=Yk!Zlnf&+R?@H<%2~cimCmD~0U|l3_r1#%I?n`V&Kw!v!d3h;qpJ z*mm*h#O?S)R>w&XGI42a-vR!_kC}CLuq&OU&*tg5xCQ@%tB%N& z`#oo%V9kQtQPt^4t*R6Hk=&{qE1oo6_oBGH^5SgM6H1@vZ*WQ@Tq(~#Jg_I=5QQJ! zM8yMOQ^MLMt?q#CbB@Iykm^U3fia&kXRp+~cd-0L`3bp(*wR79j{Q%%bAxkwrTIAa zWNaqRt8VQ=tpV*vr0I70dYWyAg*y1Agz28wQ#sY3GS#uR8TL>8Uj;R zURitOar(fK&GOnz@Ie;Nq7w^01Mxh5f46Vu4D_VQmUN~8WZ)aZoj`<_(i8ViBL4FS zVrDM$KE~Ev18%jy$$vB6dbfS#o?eM}XL~ut=KM}&Qwqh?39$~HCL*k7`x5jaKiMS! zu>wffaX~*%l45PuYpDa8AD4z#4@9)qR-s>D%SJd@o_jmf1dz7nLTua<-}cU6KH141 z5~)pHzeRu8WXG%Ob#~$%+5Pb%6FuYT2qa%>^_2Mo@2GgkEV43ykoRMF!^lb{RAt#D zhyaAbA7Km)()3Q&Xi%X)qOMJCj;vINwxZtkZEyjv|7Ygh_V|4}F8H0ZRVaJdr&uzv zn0y5MHcR^oQ8RJ79hP^7T@P{!$ZNX=5x!7cxGy-5t;9d3EAH7O038^Pt-euTEygjL zTo-PLAzVp5e_LTow|v%;{sJc_$ljvwHMM=&#Q;)BNFHqzB1anjf23~Rdtg_vCtD6mwVfjroTf5fnvjYl#@Lk~T@np?ras3k$lP7tQhbS=_P z`nUE#6$G%8Fx?P{zzx8tzkY!mb9LDg_5_O1VP;Qt{0hf`oJR-74X-rK2X=62sa;4V z+s*?WCz^cqS@yEQdm>z#_tIEQP7C~XSQY9c)U?h)$dTQqgC*w_oLG^0nMqQkE7WQJ4tA zLT;Re2JY;k4f!fabfLLXGOe5~$KlMnP;rnXVBk;%Xwz)NSGg)(bM_h}ZSqzhsD^ebZ3iO)U}VUsD+N?}`52isL;w|preM>A*uIsEjCX|5E+cAl`yp2Qp~=bMZ6qyBO@ zO$kPG@`)HQp79Lz{f$Hs*JeZ$5c(`KfAiWd13mN=u@4=l8hLkp>k}im$%i}pNR3SeRK%$cH%=w zzZOFqxe6{}e&9){m4E>s=qa3=;510IuPPL<<3-c6tZR5mG>kC-_AT>$J!MjosRF9-pxGK45op&tGOmYD=mMq^p?HSDXSIOs-sUS*toUFe@UvkMBYzJ zEr-R?ozH~hvB}}^cZc}a)xaBKCJVp@W zkBd@!!8Xz5dzUXk6cA*B%6ANWqGF**NK;7&Q-XR0eu$VjyJo*0!{e_0BBY9mF(D3M zVf{BSetgUWlnhx$8Pinrop+I}5$Uqz{FfM&Gb9wdX0C~<%ru+5u~TyVv1@<9E`kjyLW66*ZNEOyaya*vD>3jjI9&KoSt8~u-aAOgR9ydHU<8pwn&|MagLX_sBKfBZiHW}p9B literal 33018 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 diff --git a/shiptest.dme b/shiptest.dme index 3cfb399d230d..0f424c48229a 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1023,12 +1023,16 @@ #include "code\game\objects\effects\turf_fire.dm" #include "code\game\objects\effects\wanted_poster.dm" #include "code\game\objects\effects\anomalies\_anomalies.dm" -#include "code\game\objects\effects\anomalies\anomalies_bioscrambler.dm" #include "code\game\objects\effects\anomalies\anomalies_bluespace.dm" #include "code\game\objects\effects\anomalies\anomalies_flux.dm" #include "code\game\objects\effects\anomalies\anomalies_gravity.dm" #include "code\game\objects\effects\anomalies\anomalies_hallucination.dm" +#include "code\game\objects\effects\anomalies\anomalies_phantom.dm" +#include "code\game\objects\effects\anomalies\anomalies_plasmasoul.dm" #include "code\game\objects\effects\anomalies\anomalies_pyroclastic.dm" +#include "code\game\objects\effects\anomalies\anomalies_pulsar.dm" +#include "code\game\objects\effects\anomalies\anomalies_sparkler.dm" +#include "code\game\objects\effects\anomalies\anomalies_veins.dm" #include "code\game\objects\effects\anomalies\anomalies_vortex.dm" #include "code\game\objects\effects\decals\cleanable.dm" #include "code\game\objects\effects\decals\crayon.dm" From d4b84ebe461cbf85e7a24d23e6b9e75d025209d9 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 1 Jun 2023 23:05:02 -0700 Subject: [PATCH 08/43] bhhhhhh --- .../anomalies/anomalies_hallucination.dm | 5 +- .../effects/anomalies/anomalies_melter.dm | 44 ++++++++++++ .../effects/anomalies/anomalies_phantom.dm | 2 +- .../effects/anomalies/anomalies_static.dm | 69 ++++++++++--------- .../game/objects/effects/spawners/lootdrop.dm | 9 ++- code/modules/assembly/signaler.dm | 4 ++ .../modules/mob/living/carbon/status_procs.dm | 13 +--- shiptest.dme | 3 + 8 files changed, 103 insertions(+), 46 deletions(-) create mode 100644 code/game/objects/effects/anomalies/anomalies_melter.dm diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 678dbe9eb8de..4db101085986 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -7,6 +7,7 @@ var/ticks = 0 /// How many seconds between each small hallucination pulses pulse_delay = 5 + effectrange = 5 /obj/effect/anomaly/hallucination/anomalyEffect(delta_time) . = ..() @@ -24,8 +25,8 @@ hallucination_pulse(our_turf, 10) . = ..() -/obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, range) - for(var/mob/living/carbon/human/near in view(location, range)) +/obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, effectrange) + for(var/mob/living/carbon/human/near in view(location, effectrange)) // If they are immune to hallucinations. if (HAS_TRAIT(near, SEE_TURFS) || (near.mind && HAS_TRAIT(near.mind, SEE_TURFS))) continue diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm new file mode 100644 index 000000000000..58b9546f222a --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_melter.dm @@ -0,0 +1,44 @@ +/obj/effect/anomaly/melter + name = "melter" + icon_state = "melter" + desc = "A mysterious anomaly. Everburning green flames with a horrid sizzle, melting what's near" + effectrange = 4 + pulse_delay = 15 + aSignal = /obj/item/assembly/signaler/anomaly/pyro + +/obj/effect/anomaly/melter/anomalyEffect(seconds_per_tick) + ..() + + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) + return + COOLDOWN_START(src, pulse_cooldown, pulse_delay) + + for(var/mob/living/carbon/meltee in range(effectrange, src)) + for(var/X in meltee.get_equipped_items()) + var/obj/item/I = X + I.acid_level += 3 + +/obj/effect/anomaly/melter/Bumped(atom/movable/AM) + if(isobj(AM)) + var/obj/acid = AM + if(acid.resistance_flags & ACID_PROOF) + acid.resistance_flags &= ~ACID_PROOF + if(acid.armor.acid > 50) //*Me copies from lava code + acid.armor = acid.armor.setRating(fire = 50) + acid.acid_act(100,20) + + +/obj/effect/anomaly/melter/detonate() + for(var/mob/living/carbon/meltee in range(effectrange, src)) + for(var/X in meltee.get_equipped_items()) + var/obj/item/I = X + I.acid_level += 20 + for(var/obj/item in range(effectrange, src)) + item.acid_act(100,20) + . = ..() + + +/obj/effect/anomaly/melter/planetary + immortal = TRUE + immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm index e06e009a7e51..d7ea66004e5f 100644 --- a/code/game/objects/effects/anomalies/anomalies_phantom.dm +++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm @@ -51,7 +51,7 @@ return hand.fire() i++ - sleep() 20 TICKS + sleep(20 TICKS) new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(loc) . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index c0ac98d21ccf..95629b3e4318 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -3,56 +3,63 @@ icon_state = "static" desc = "A mysterious anomaly. A hole in the world, endless buzzing emitting from it." density = TRUE - aSignal = /obj/item/assembly/signaler/anomaly/veins + aSignal = /obj/item/assembly/signaler/anomaly/tvstatic effectrange = 6 - pulse_delay = 4 + pulse_delay = 6 + var/mob/living/carbon/victim -/obj/effect/visible_heretic_influence/examine(mob/user) +/obj/effect/anomaly/tvstatic/examine(mob/user) . = ..() - if(IS_HERETIC(user) || !ishuman(user)) + if(!iscarbon(user)) return + if(iscarbon(user)) + var/mob/living/carbon/bah = user + to_chat(bah, span_userdanger("Your head aches as you stare into the [src]!")) + bah.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 100) - var/mob/living/carbon/human_user = user - to_chat(human_user, span_userdanger("Your mind burns as you stare at the tear!")) - human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 190) - -/obj/effect/anomaly/veins/anomalyEffect() +/obj/effect/anomaly/tvstatic/anomalyEffect() ..() if(!COOLDOWN_FINISHED(src, pulse_cooldown)) return COOLDOWN_START(src, pulse_cooldown, pulse_delay) - var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) - var/obj/effect/gibspawner/mess = pick(list( - /obj/effect/gibspawner/human, - /obj/effect/gibspawner/xeno, - /obj/effect/gibspawner/generic/animal - )) - new mess(spot) - - for(var/mob/living/carbon/suckee in range(effectrange, src)) - if(suckee.run_armor_check(attack_flag = "melee") <= 40 ) - suckee.bleed(20) - suckee.apply_damage(5, BRUTE) - visible_message("Blood starts to fly off of [suckee], heading for the [src]!") + for(var/mob/living/carbon/looking in range(effectrange, src)) + if (HAS_TRAIT(looking, SEE_TURFS) || (looking.mind && HAS_TRAIT(looking.mind, SEE_TURFS))) + looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200) + playsound(looking, 'sound/effects/walkietalkie.ogg') + + + if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150) + var/obj/effect/anomaly/tvstatic/expansion + expansion = new(looking.loc) + visible_message(" The static overtakes [looking], [expansion] taking their place!") + //looking.death() may be cool to have someone screaming while the Static overtakes them + expansion.victim = looking + looking.forceMove(expansion) return -/obj/effect/anomaly/veins/Bumped(atom/movable/AM) +/obj/effect/anomaly/tvstatic/Bumped(atom/movable/AM) anomalyEffect() - new /obj/effect/gibspawner/human(loc) -/obj/effect/anomaly/veins/detonate() - for(var/mob/living/carbon/suckee in range(effectrange, src)) - suckee.bleed(200) - visible_message("[suckee] hemorrages, a fountain of blood heading for [src]!") - anomalyEffect() - anomalyEffect() +/obj/effect/anomaly/tvstatic/detonate() + for(var/mob/living/carbon/looking in range(effectrange, src)) + visible_message(" The static lashes out!") + sleep(5 SECONDS) + if (HAS_TRAIT(looking, SEE_TURFS) || (looking.mind && HAS_TRAIT(looking.mind, SEE_TURFS))) + looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200) + playsound(looking, 'sound/effects/walkietalkie.ogg') anomalyEffect() . = ..() -/obj/effect/anomaly/veins/planetary +/obj/effect/anomaly/tvstatic/anomalyNeutralize() + if(var/mob/living/carbon/victim) + victim.forceMove(drop_location()) + . = ..() + + +/obj/effect/anomaly/tvstatic/planetary immortal = TRUE immobile = TRUE diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 3ded42182cd7..078fff42a0fe 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -813,7 +813,14 @@ /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/pyro/planetary, /obj/effect/anomaly/vortex/planetary, - /obj/effect/anomaly/grav/high/planetary + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + /obj/effect/anomaly/melter/planetary, ) /obj/effect/spawner/lootdrop/anomaly/big diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 2707e650f5ce..44ec55eca581 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -293,6 +293,10 @@ name = "\improper heartbeat anomaly core" desc = "The neutralized core of a heartbeat anomaly. It's concerningly warm to the touch." +/obj/item/assembly/signaler/anomaly/tvstatic + name = "\improper static anomaly core" + desc = "The neutralized core of a static anomaly. Your head hurts just staring at it" + /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 9284f80269b9..b9de8a68ba2a 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -95,16 +95,7 @@ for(var/obj/item/bodypart/B in bodyparts) B.break_bone() -/mob/living/carbon/proc/break_random_bone() //this doesn't work and I don't know how to make it work - var/obj/item/bodypart/B = pick(list( - /obj/item/bodypart/chest, - /obj/item/bodypart/head, - /obj/item/bodypart/l_arm, - /obj/item/bodypart/r_arm, - /obj/item/bodypart/leg/right, - /obj/item/bodypart/leg/left - )) +/mob/living/carbon/proc/break_random_bone() //this might work + var/obj/item/bodypart/B = get_bodypart() for(B in bodyparts) B.break_bone() - return - diff --git a/shiptest.dme b/shiptest.dme index 0f424c48229a..6256447b15f0 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1027,11 +1027,14 @@ #include "code\game\objects\effects\anomalies\anomalies_flux.dm" #include "code\game\objects\effects\anomalies\anomalies_gravity.dm" #include "code\game\objects\effects\anomalies\anomalies_hallucination.dm" +#include "code\game\objects\effects\anomalies\anomalies_heartbeat.dm" #include "code\game\objects\effects\anomalies\anomalies_phantom.dm" #include "code\game\objects\effects\anomalies\anomalies_plasmasoul.dm" #include "code\game\objects\effects\anomalies\anomalies_pyroclastic.dm" +#include "code\game\objects\effects\anomalies\anomalies_melter.dm" #include "code\game\objects\effects\anomalies\anomalies_pulsar.dm" #include "code\game\objects\effects\anomalies\anomalies_sparkler.dm" +#include "code\game\objects\effects\anomalies\anomalies_static.dm" #include "code\game\objects\effects\anomalies\anomalies_veins.dm" #include "code\game\objects\effects\anomalies\anomalies_vortex.dm" #include "code\game\objects\effects\decals\cleanable.dm" From 6f7a84d6c5b6b32bf3e3481afbe7229a74d5c660 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 1 Jun 2023 23:15:44 -0700 Subject: [PATCH 09/43] h --- .../effects/anomalies/anomalies_sparkler.dm | 2 +- .../objects/effects/anomalies/anomalies_static.dm | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_sparkler.dm b/code/game/objects/effects/anomalies/anomalies_sparkler.dm index 29747fa8157a..0f75faa89746 100644 --- a/code/game/objects/effects/anomalies/anomalies_sparkler.dm +++ b/code/game/objects/effects/anomalies/anomalies_sparkler.dm @@ -32,6 +32,6 @@ i = i + 1 . = ..() -/obj/effect/anomaly/sparkler/plantary +/obj/effect/anomaly/sparkler/planetary immortal = TRUE immobile = TRUE diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 95629b3e4318..b869007fab20 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -30,16 +30,17 @@ looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200) playsound(looking, 'sound/effects/walkietalkie.ogg') - +/* if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150) + var/mob/living/carbon/victim = looking var/obj/effect/anomaly/tvstatic/expansion - expansion = new(looking.loc) + expansion = new(victim.loc) visible_message(" The static overtakes [looking], [expansion] taking their place!") //looking.death() may be cool to have someone screaming while the Static overtakes them - expansion.victim = looking - looking.forceMove(expansion) + expansion.victim = victim + victim.forceMove(expansion) return - +*/ /obj/effect/anomaly/tvstatic/Bumped(atom/movable/AM) anomalyEffect() @@ -54,11 +55,12 @@ anomalyEffect() . = ..() +/* /obj/effect/anomaly/tvstatic/anomalyNeutralize() if(var/mob/living/carbon/victim) victim.forceMove(drop_location()) . = ..() - +*/ /obj/effect/anomaly/tvstatic/planetary immortal = TRUE From 68a3cfd256cacf555e6a7d403ba04062670e9ed1 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Fri, 2 Jun 2023 11:01:29 -0700 Subject: [PATCH 10/43] d --- .../objects/effects/anomalies/_anomalies.dm | 1 + .../effects/anomalies/anomalies_melter.dm | 20 ++++++++++--------- .../effects/anomalies/anomalies_phantom.dm | 17 +--------------- .../effects/anomalies/anomalies_static.dm | 6 +++--- .../effects/anomalies/anomalies_veins.dm | 18 ++++++++--------- 5 files changed, 25 insertions(+), 37 deletions(-) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 1d2a381e59ca..a746a803c74e 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -104,6 +104,7 @@ step(src,pick(GLOB.alldirs)) /obj/effect/anomaly/proc/detonate() + new /obj/effect/particle_effect/smoke/bad(loc) qdel(src) return diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm index 58b9546f222a..a6aa01c4fc9c 100644 --- a/code/game/objects/effects/anomalies/anomalies_melter.dm +++ b/code/game/objects/effects/anomalies/anomalies_melter.dm @@ -1,9 +1,9 @@ /obj/effect/anomaly/melter name = "melter" - icon_state = "melter" + icon_state = "inferno" desc = "A mysterious anomaly. Everburning green flames with a horrid sizzle, melting what's near" effectrange = 4 - pulse_delay = 15 + pulse_delay = 10 aSignal = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/melter/anomalyEffect(seconds_per_tick) @@ -17,25 +17,27 @@ for(var/mob/living/carbon/meltee in range(effectrange, src)) for(var/X in meltee.get_equipped_items()) var/obj/item/I = X - I.acid_level += 3 + I.acid_act(20, 20) + I.update_icon() + for (var/obj/item/melt in range(effectrange, src)) + melt.acid_act(20, 10) + melt.update_icon() /obj/effect/anomaly/melter/Bumped(atom/movable/AM) if(isobj(AM)) var/obj/acid = AM - if(acid.resistance_flags & ACID_PROOF) - acid.resistance_flags &= ~ACID_PROOF - if(acid.armor.acid > 50) //*Me copies from lava code - acid.armor = acid.armor.setRating(fire = 50) acid.acid_act(100,20) + acid.update_icon() /obj/effect/anomaly/melter/detonate() for(var/mob/living/carbon/meltee in range(effectrange, src)) for(var/X in meltee.get_equipped_items()) - var/obj/item/I = X - I.acid_level += 20 + I.acid_act(200, 20) + I.update_icon() for(var/obj/item in range(effectrange, src)) item.acid_act(100,20) + item.update_icon() . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm index d7ea66004e5f..05e70b7326a4 100644 --- a/code/game/objects/effects/anomalies/anomalies_phantom.dm +++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm @@ -36,22 +36,7 @@ new /obj/effect/gibspawner/human(loc) /obj/effect/anomaly/phantom/detonate() - var/i = 0 - while(i <= 10) - for(var/mob/living/carbon/handsy in range(effectrange, src)) - var/grab_dir = turn(handsy.dir, pick(-90, 90, 180, 180)) - var/turf/spawn_turf = get_ranged_target_turf(handsy, grab_dir, 8) - if(!spawn_turf) - return - new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, handsy.dir) - playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) - var/obj/projectile/curse_hand/phantom/hand = new (spawn_turf) - hand.preparePixelProjectile(handsy, spawn_turf) - if(QDELETED(hand)) - return - hand.fire() - i++ - sleep(20 TICKS) + anomalyEffect() new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(loc) . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index b869007fab20..6b0a29eb7ee9 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -29,8 +29,7 @@ if (HAS_TRAIT(looking, SEE_TURFS) || (looking.mind && HAS_TRAIT(looking.mind, SEE_TURFS))) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200) playsound(looking, 'sound/effects/walkietalkie.ogg') - -/* + /* if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150) var/mob/living/carbon/victim = looking var/obj/effect/anomaly/tvstatic/expansion @@ -39,8 +38,9 @@ //looking.death() may be cool to have someone screaming while the Static overtakes them expansion.victim = victim victim.forceMove(expansion) + */ return -*/ + /obj/effect/anomaly/tvstatic/Bumped(atom/movable/AM) anomalyEffect() diff --git a/code/game/objects/effects/anomalies/anomalies_veins.dm b/code/game/objects/effects/anomalies/anomalies_veins.dm index ce7c05d8cfab..09ddd65ebbe5 100644 --- a/code/game/objects/effects/anomalies/anomalies_veins.dm +++ b/code/game/objects/effects/anomalies/anomalies_veins.dm @@ -4,7 +4,7 @@ desc = "A mysterious anomaly, surrounded by blood of an unknown origin." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/veins - effectrange = 6 + effectrange = 3 pulse_delay = 4 @@ -15,13 +15,7 @@ return COOLDOWN_START(src, pulse_cooldown, pulse_delay) - var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) - var/obj/effect/gibspawner/mess = pick(list( - /obj/effect/gibspawner/human, - /obj/effect/gibspawner/xeno, - /obj/effect/gibspawner/generic/animal - )) - new mess(spot) + for(var/mob/living/carbon/suckee in range(effectrange, src)) if(suckee.run_armor_check(attack_flag = "melee") <= 40 ) @@ -34,7 +28,13 @@ /obj/effect/anomaly/veins/Bumped(atom/movable/AM) anomalyEffect() - new /obj/effect/gibspawner/human(loc) + var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) + var/obj/effect/gibspawner/mess = pick(list( + /obj/effect/gibspawner/human, + /obj/effect/gibspawner/xeno, + /obj/effect/gibspawner/generic/animal + )) + new mess(spot) /obj/effect/anomaly/veins/detonate() for(var/mob/living/carbon/suckee in range(effectrange, src)) From 83cb4d6ef1a6abe4e35dde80da0d0e29d1a16654 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:11:58 -0700 Subject: [PATCH 11/43] as --- .../effects/anomalies/anomalies_melter.dm | 1 + .../effects/anomalies/anomalies_static.dm | 8 +++----- icons/effects/anomalies.dmi | Bin 145220 -> 145218 bytes 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm index a6aa01c4fc9c..95cd0ff7299a 100644 --- a/code/game/objects/effects/anomalies/anomalies_melter.dm +++ b/code/game/objects/effects/anomalies/anomalies_melter.dm @@ -33,6 +33,7 @@ /obj/effect/anomaly/melter/detonate() for(var/mob/living/carbon/meltee in range(effectrange, src)) for(var/X in meltee.get_equipped_items()) + var/obj/item/I = X I.acid_act(200, 20) I.update_icon() for(var/obj/item in range(effectrange, src)) diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 6b0a29eb7ee9..0374e8379aa5 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -26,19 +26,17 @@ COOLDOWN_START(src, pulse_cooldown, pulse_delay) for(var/mob/living/carbon/looking in range(effectrange, src)) - if (HAS_TRAIT(looking, SEE_TURFS) || (looking.mind && HAS_TRAIT(looking.mind, SEE_TURFS))) + if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD)) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200) playsound(looking, 'sound/effects/walkietalkie.ogg') - /* if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150) var/mob/living/carbon/victim = looking - var/obj/effect/anomaly/tvstatic/expansion - expansion = new(victim.loc) + var/obj/effect/anomaly/tvstatic/planetary/expansion + expansion = new(get_turf(victim)) visible_message(" The static overtakes [looking], [expansion] taking their place!") //looking.death() may be cool to have someone screaming while the Static overtakes them expansion.victim = victim victim.forceMove(expansion) - */ return diff --git a/icons/effects/anomalies.dmi b/icons/effects/anomalies.dmi index fb47b028c34ba290f81eb4c57acc7fe1bf2cf791..4cbf57f0ad5496c6c1a0d7d0f0e34869dd86f78e 100644 GIT binary patch delta 407 zcmV;I0cifj?g+x}2#_Ryb$V1-bVOxyV{&P5bZKvH004NLwUfba!Y~Ym&&^XoC{xKFUgAyhjr5tL}p%to|kf;&bKnXK{674j$%s>g*3yB&g z@dPEz;y;}+UnP{OHMW&x+MjN=cskvP-O1r2fXi-h^Vs(pQG1OCVNZTq5vYwsnjJ;g zKnYG&{Yk4@qOqd(Jg}vOTMmuK$Zz7juxV1vFV`iqugh_u z)`Q_8`vT@u{}?MZboDP#=NB=B)piNX&6<1y$d7Nhty~xZ+k>P5hok`kx1<3Apf!pg B$36f6 delta 409 zcmV;K0cQTf?g+&02#_RycY0J* z@+2kEiPyG)5@<%EhVesVFCWIDWl+MTK_U8zOSD|c35ja14U{l{Bhg-C%M6r|y^yG8 z0?$ywEdJ9P^6j`XmBw}_nD(ceEuKy{VE3Z`2;j02ZXWxN0d>%LdsnK0*&RBAD92YIZlb5nGP%Fmxi0-uf=qz-)~IMpSjn!{>ZpA4{t%^Y%J^= zlvcI=yv{B1_+~kOfL<63JeE5y40?g4MWcG*XHb_>xJr#R9}PzC7iM>iw;1gIW81mh zGcA>0?w=H=XG&WZn2XHmTAD24{|OqW2^|V*nP~!JTDaxVc!+!ymx)c2Vt(DOk$r8B z1C{Pg6Z+Ex+^7CN?o= Date: Sat, 3 Jun 2023 22:19:44 -0700 Subject: [PATCH 12/43] Update anomalies_static.dm --- code/game/objects/effects/anomalies/anomalies_static.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 0374e8379aa5..9586a9d8fe88 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -46,7 +46,6 @@ /obj/effect/anomaly/tvstatic/detonate() for(var/mob/living/carbon/looking in range(effectrange, src)) visible_message(" The static lashes out!") - sleep(5 SECONDS) if (HAS_TRAIT(looking, SEE_TURFS) || (looking.mind && HAS_TRAIT(looking.mind, SEE_TURFS))) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200) playsound(looking, 'sound/effects/walkietalkie.ogg') From 864c1dcc16840e41c4a858e37f9c302e714f069c Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:23:05 -0700 Subject: [PATCH 13/43] Update anomalies_static.dm --- .../effects/anomalies/anomalies_static.dm | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 9586a9d8fe88..4f4743f2e374 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -6,7 +6,7 @@ aSignal = /obj/item/assembly/signaler/anomaly/tvstatic effectrange = 6 pulse_delay = 6 - var/mob/living/carbon/victim + var/mob/living/carbon/stored_mob = null /obj/effect/anomaly/tvstatic/examine(mob/user) . = ..() @@ -26,16 +26,16 @@ COOLDOWN_START(src, pulse_cooldown, pulse_delay) for(var/mob/living/carbon/looking in range(effectrange, src)) - if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD)) + if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200) playsound(looking, 'sound/effects/walkietalkie.ogg') - if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150) + if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150 && looking.stat != DEAD) var/mob/living/carbon/victim = looking var/obj/effect/anomaly/tvstatic/planetary/expansion expansion = new(get_turf(victim)) visible_message(" The static overtakes [looking], [expansion] taking their place!") - //looking.death() may be cool to have someone screaming while the Static overtakes them - expansion.victim = victim + looking.death() + stored_mob = victim victim.forceMove(expansion) return @@ -46,18 +46,19 @@ /obj/effect/anomaly/tvstatic/detonate() for(var/mob/living/carbon/looking in range(effectrange, src)) visible_message(" The static lashes out!") - if (HAS_TRAIT(looking, SEE_TURFS) || (looking.mind && HAS_TRAIT(looking.mind, SEE_TURFS))) + if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200) playsound(looking, 'sound/effects/walkietalkie.ogg') anomalyEffect() . = ..() -/* + /obj/effect/anomaly/tvstatic/anomalyNeutralize() - if(var/mob/living/carbon/victim) - victim.forceMove(drop_location()) + if(stored_mob) + stored_mob.forceMove(get_turf(src)) + stored_mob = null . = ..() -*/ + /obj/effect/anomaly/tvstatic/planetary immortal = TRUE From 066f9ccd4ab1a2bda37b0d86a6cf3c271b6e3600 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 4 Jun 2023 14:23:43 -0700 Subject: [PATCH 14/43] Update anomalies_static.dm --- code/game/objects/effects/anomalies/anomalies_static.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 4f4743f2e374..5037449580b0 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -33,8 +33,8 @@ var/mob/living/carbon/victim = looking var/obj/effect/anomaly/tvstatic/planetary/expansion expansion = new(get_turf(victim)) - visible_message(" The static overtakes [looking], [expansion] taking their place!") - looking.death() + visible_message(" The static overtakes [victim], [expansion] taking their place!") + victim.death() stored_mob = victim victim.forceMove(expansion) return From 58a7c86fcda0e45f3ea0c1f5998b35c4ea918369 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Tue, 6 Jun 2023 16:05:02 -0700 Subject: [PATCH 15/43] Finishes the PR for real this time bugfixes not included --- .../mapgen/planetary/JungleGenerator.dm | 2 +- code/datums/mapgen/planetary/LavaGenerator.dm | 5 +- code/datums/mapgen/planetary/RockGenerator.dm | 6 +- code/datums/mapgen/planetary/SandGenerator.dm | 3 +- code/datums/mapgen/planetary/SnowGenerator.dm | 10 +- .../effects/anomalies/anomalies_melter.dm | 2 +- .../effects/anomalies/anomalies_static.dm | 11 +- .../effects/anomalies/anomalies_veins.dm | 9 +- .../game/objects/effects/spawners/lootdrop.dm | 119 ++++++++++++++++++ code/modules/assembly/signaler.dm | 2 +- code/modules/research/rdconsole.dm | 2 +- 11 files changed, 148 insertions(+), 23 deletions(-) diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index f288d03bfbe3..86c40769cd11 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -181,7 +181,7 @@ feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, /obj/structure/spawner/ice_moon = 1, - /obj/effect/spawner/lootdrop/anomaly = 1 + /obj/effect/spawner/lootdrop/anomaly/jungle = 1 ) /datum/biome/cave/jungle/dirt diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index 6d7f643a41d4..a2df4afffdef 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -97,8 +97,7 @@ /obj/structure/flora/rock/hell = 5, /obj/structure/elite_tumor = 1, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 1 + /obj/effect/spawner/lootdrop/anomaly/lava = 1, ) mob_spawn_chance = 4 mob_spawn_list = list( @@ -155,7 +154,7 @@ feature_spawn_list = list( /obj/structure/flora/tree/dead/barren = 50, /obj/structure/flora/tree/dead/tall/grey = 49, - /obj/effect/spawner/lootdrop/anomaly = 1 + /obj/effect/spawner/lootdrop/anomaly/lava = 1 ) /datum/biome/lavaland/plains/dense/mixed diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index 7a49716063d7..831eec309810 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -87,7 +87,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, - /obj/effect/spawner/lootdrop/anomaly = 5, + /obj/effect/spawner/lootdrop/anomaly/rock = 5, /obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker ) @@ -150,8 +150,8 @@ /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, /obj/structure/spawner/ice_moon/rockplanet = 4, - /obj/effect/spawner/lootdrop/anomaly = 3, - /obj/effect/spawner/lootdrop/anomaly/big = 2, + /obj/effect/spawner/lootdrop/anomaly/rock = 3, + /obj/effect/spawner/lootdrop/anomaly/big = 1, ) mob_spawn_chance = 6 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index 68846a776c53..a5002e141c99 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -93,8 +93,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 4, /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly = 4, - /obj/effect/spawner/lootdrop/anomaly/big = 1 + /obj/effect/spawner/lootdrop/anomaly/sand = 4, ) mob_spawn_chance = 4 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index 2dd1516cf73d..c958a9f678fe 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -113,7 +113,7 @@ /obj/structure/spawner/ice_moon/demonic_portal = 1, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, - /obj/effect/spawner/lootdrop/anomaly = 1 + /obj/effect/spawner/lootdrop/anomaly/ice = 1 ) /datum/biome/snow/lush @@ -193,8 +193,8 @@ /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon/demonic_portal/brimdemon = 1, - /obj/effect/spawner/lootdrop/anomaly = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 1 + /obj/effect/spawner/lootdrop/anomaly/ice = 1, + /obj/effect/spawner/lootdrop/anomaly/big = 0.1 ) @@ -238,7 +238,7 @@ /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon = 1, /obj/structure/spawner/ice_moon/polarbear = 1, - /obj/effect/spawner/lootdrop/anomaly = 1 + /obj/effect/spawner/lootdrop/anomaly/ice = 1 ) /datum/biome/cave/snow/thawed @@ -275,7 +275,7 @@ /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly = 1 + /obj/effect/spawner/lootdrop/anomaly/ice = 1 ) /datum/biome/cave/volcanic/lava diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm index 95cd0ff7299a..4a0f45cf4e51 100644 --- a/code/game/objects/effects/anomalies/anomalies_melter.dm +++ b/code/game/objects/effects/anomalies/anomalies_melter.dm @@ -2,7 +2,7 @@ name = "melter" icon_state = "inferno" desc = "A mysterious anomaly. Everburning green flames with a horrid sizzle, melting what's near" - effectrange = 4 + effectrange = 2 pulse_delay = 10 aSignal = /obj/item/assembly/signaler/anomaly/pyro diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 5037449580b0..9df93b304889 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -35,7 +35,7 @@ expansion = new(get_turf(victim)) visible_message(" The static overtakes [victim], [expansion] taking their place!") victim.death() - stored_mob = victim + expansion.stored_mob = victim victim.forceMove(expansion) return @@ -54,9 +54,12 @@ /obj/effect/anomaly/tvstatic/anomalyNeutralize() - if(stored_mob) - stored_mob.forceMove(get_turf(src)) - stored_mob = null + var/turf/T = get_turf(src) + if(T) + if(stored_mob) + visible_message("The static spits out [stored_mob], their body coming out in a burst!") + stored_mob.forceMove(get_turf(src)) + stored_mob = null . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_veins.dm b/code/game/objects/effects/anomalies/anomalies_veins.dm index 09ddd65ebbe5..5544829d2e88 100644 --- a/code/game/objects/effects/anomalies/anomalies_veins.dm +++ b/code/game/objects/effects/anomalies/anomalies_veins.dm @@ -1,7 +1,7 @@ /obj/effect/anomaly/veins - name = "fountain" + name = "veins" icon_state = "veins" - desc = "A mysterious anomaly, surrounded by blood of an unknown origin." + desc = "A mysterious anomaly, throbbing purple veins, suspended midair." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/veins effectrange = 3 @@ -27,6 +27,11 @@ /obj/effect/anomaly/veins/Bumped(atom/movable/AM) + if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) + return + + COOLDOWN_START(src, pulse_secondary_cooldown, 10) + anomalyEffect() var/turf/spot = locate(rand(src.x-effectrange/2, src.x+effectrange/2), rand(src.y-effectrange/2, src.y+effectrange/2), src.z) var/obj/effect/gibspawner/mess = pick(list( diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 078fff42a0fe..e4fce079f8cc 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -823,6 +823,30 @@ /obj/effect/anomaly/melter/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/safe + name = "relatively safe anomaly spawner" + loot = list( + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/dangerous + name = "relatively dangerous anomaly spawner" + loot = list( + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/vortex/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/melter/planetary, + ) + /obj/effect/spawner/lootdrop/anomaly/big name = "random big anomaly spawner" loot = list( @@ -832,3 +856,98 @@ /obj/effect/anomaly/pyro/big/planetary ) + +//handpicked lists relevant to the planets they're on + +/obj/effect/spawner/lootdrop/anomaly/jungle + name = "Jungle Anomaly Spawner" + loot = list( + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/beach + name = "Beach anomaly spawner" + loot = list( + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/sand + name = "Sand anomaly spawner" + loot = list( + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + /obj/effect/anomaly/melter/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/rock + name = "Rock anomaly spawner" + loot = list( + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/vortex/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + /obj/effect/anomaly/melter/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/lava + name = "Lava anomaly spawner" + loot = list( + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/vortex/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/ice + name = "Ice anomaly spawner" + loot = list( + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/vortex/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + +/obj/effect/spawner/lootdrop/anomaly/waste + name = "Waste anomaly spawner" + loot = list( + /obj/effect/anomaly/bluespace/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/vortex/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/melter/planetary, + ) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 44ec55eca581..a5be27f88526 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -216,7 +216,7 @@ research = null anomaly_type = null -/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) +/obj/item/assembly/signaler/anomaly/det_signal/receive_signal(datum/signal/signal) if(!signal) return FALSE if(signal.data["code"] != code) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index a214ffebbc8b..898df0c75624 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -136,7 +136,7 @@ Nothing else in the console has ID requirements. return else playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("You insert [E] into a slot on the [src], producting [E.research] points from the extract's chemical makeup!") + visible_message("[user] inserts [E] into a slot on the [src], producting [E.research] points from the extract's chemical makeup!") stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = E.research)) slime_already_researched[E.type] = TRUE qdel(D) From 239938f98e47c114075a4bd45a4b4f6e3e55a068 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 8 Jun 2023 13:54:27 -0700 Subject: [PATCH 16/43] I could have sworn I removed this. --- code/__DEFINES/anomalies.dm | 50 +------------------ .../mob/living/carbon/carbon_defense.dm | 47 ----------------- 2 files changed, 1 insertion(+), 96 deletions(-) diff --git a/code/__DEFINES/anomalies.dm b/code/__DEFINES/anomalies.dm index 7be75bcb4a6e..e5689e74e50c 100644 --- a/code/__DEFINES/anomalies.dm +++ b/code/__DEFINES/anomalies.dm @@ -1,11 +1,10 @@ -// Max amounts of cores you can make +// Max amounts of cores you can make with core implosion. Like we'll ever use that. #define MAX_CORES_BLUESPACE 8 #define MAX_CORES_GRAVITATIONAL 8 #define MAX_CORES_FLUX 8 #define MAX_CORES_VORTEX 8 #define MAX_CORES_PYRO 8 #define MAX_CORES_HALLUCINATION 8 -#define MAX_CORES_BIOSCRAMBLER 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EXPLOSION 0 @@ -14,50 +13,3 @@ /// Chance of anomalies moving every process tick #define ANOMALY_MOVECHANCE 45 - -/// Blacklist of parts which should not appear when bioscrambled, largely because they will make you look totally fucked up -GLOBAL_LIST_INIT(bioscrambler_parts_blacklist, typecacheof(list ( - /obj/item/bodypart/chest/larva, - /obj/item/bodypart/head/larva, - /obj/item/bodypart/leg/left/monkey, - /obj/item/bodypart/leg/right/monkey, - /obj/item/bodypart/head, - /obj/item/bodypart/head/alien, - -))) - -/// Blacklist of organs which should not appear when bioscrambled. -/// Either will look terrible outside of intended host, give you magical powers, are irreversible, or kill you -GLOBAL_LIST_INIT(bioscrambler_organs_blacklist, typecacheof(list ( - /obj/item/organ/ears/invincible, - /obj/item/organ/ears/dullahan, - /obj/item/organ/eyes/dullahan, - /obj/item/organ/heart/cursed, - /obj/item/organ/heart/cursed/wizard, - /obj/item/organ/heart/demon, - /obj/item/organ/heart/cursed, - /obj/item/organ/tongue/golem_honk, //hatred - /obj/item/organ/tongue/uwuspeak,//see last comment - /obj/item/organ/vocal_cords, - /obj/item/organ/vocal_cords/adamantine, - /obj/item/organ/vocal_cords/colossus, - /obj/item/organ/zombie_infection, - /obj/item/organ/brain, - /obj/item/organ/brain/alien, - /obj/item/organ/brain/nightmare, - /obj/item/organ/brain/dullahan, - /obj/item/organ/brain/mmi_holder, - /obj/item/organ/brain/mmi_holder/posibrain, - /obj/item/organ/alien/eggsac, - /obj/item/organ/alien/hivenode, - /obj/item/organ/alien/plasmavessel/large/queen, - /obj/item/organ/alien/plasmavessel/large, - /obj/item/organ/body_egg, - /obj/item/organ/body_egg/alien_embryo, - /obj/item/organ/body_egg/changeling_egg, -))) - -/// List of body parts we can apply to people -GLOBAL_LIST_EMPTY(bioscrambler_valid_parts) -/// List of organs we can apply to people -GLOBAL_LIST_EMPTY(bioscrambler_valid_organs) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 66f29659a10a..a99baf1baf54 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -627,50 +627,3 @@ ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) else if(getOxyLoss() <= 50) REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - -/// Randomise a body part and organ of this mob -/mob/living/carbon/proc/bioscramble(scramble_source) - if (run_armor_check(attack_flag = "bio", absorb_text = "Your armor protects you from [scramble_source]!") >= 100) - return FALSE - - if (!length(GLOB.bioscrambler_valid_organs) || !length(GLOB.bioscrambler_valid_parts)) - init_bioscrambler_lists() - - var/changed_something = FALSE - var/obj/item/organ/new_organ = pick(GLOB.bioscrambler_valid_organs) - var/obj/item/organ/replaced = getorganslot(initial(new_organ.slot)) - if (!(replaced?.organ_flags & ORGAN_SYNTHETIC)) - changed_something = TRUE - new_organ = new new_organ() - new_organ.replace_into(src) - - var/obj/item/bodypart/new_part = pick(GLOB.bioscrambler_valid_parts) - var/obj/item/bodypart/picked_user_part = get_bodypart(initial(new_part.body_zone)) - if (picked_user_part && BODYTYPE_CAN_BE_BIOSCRAMBLED(picked_user_part.bodytype)) - changed_something = TRUE - new_part = new new_part() - new_part.replace_limb(src, special = TRUE) - if (picked_user_part) - qdel(picked_user_part) - - if (!changed_something) - to_chat(src, span_notice("Your augmented body protects you from [scramble_source]!")) - return FALSE - update_body(TRUE) - return TRUE - -/// Fill in the lists of things we can bioscramble into people -/mob/living/carbon/proc/init_bioscrambler_lists() - var/list/body_parts = typesof(/obj/item/bodypart/chest) + typesof(/obj/item/bodypart/head) + subtypesof(/obj/item/bodypart/l_arm) + subtypesof(/obj/item/bodypart/r_arm) + subtypesof(/obj/item/bodypart/leg/left) + subtypesof(/obj/item/bodypart/leg/right) - for (var/obj/item/bodypart/part as anything in body_parts) - if (!is_type_in_typecache(part, GLOB.bioscrambler_parts_blacklist) && BODYTYPE_CAN_BE_BIOSCRAMBLED(initial(part.bodytype))) - continue - body_parts -= part - GLOB.bioscrambler_valid_parts = body_parts - - var/list/organs = subtypesof(/obj/item/organ) - for (var/obj/item/organ/organ_type as anything in organs) - if (!is_type_in_typecache(organ_type, GLOB.bioscrambler_organs_blacklist) && !(initial(organ_type.organ_flags) & ORGAN_SYNTHETIC)) - continue - organs -= organ_type - GLOB.bioscrambler_valid_organs = organs From 9b302e5f478ff113ac13c836b33d5578cdcf18e0 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 8 Jun 2023 20:16:06 -0700 Subject: [PATCH 17/43] Update WasteGenerator.dm --- code/datums/mapgen/planetary/WasteGenerator.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index 9135c75cd73e..baefc13df351 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -131,7 +131,8 @@ feature_spawn_list = list( /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, - /obj/structure/geyser/random = 1 + /obj/structure/geyser/random = 1, + /obj/effect/spawner/lootdrop/anomaly/waste = 3 ) mob_spawn_list = list( @@ -314,6 +315,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1 + /obj/effect/spawner/lootdrop/anomaly/waste = 3 ) mob_spawn_list = list( /mob/living/simple_animal/hostile/hivebot/strong/rockplanet = 70, @@ -324,9 +326,7 @@ /mob/living/simple_animal/hostile/abandoned_minebot = 15, /mob/living/simple_animal/bot/floorbot/rockplanet = 15, ) - feature_spawn_list = list( - /obj/effect/radiation = 30, - ) + flora_spawn_chance = 30 feature_spawn_chance = 4 mob_spawn_chance = 5 From aa1854269edce215378ada32efae2c82e0cb2fa9 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 8 Jun 2023 20:20:02 -0700 Subject: [PATCH 18/43] Update WasteGenerator.dm --- code/datums/mapgen/planetary/WasteGenerator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index baefc13df351..e21da27d1a52 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -314,7 +314,7 @@ feature_spawn_list = list( /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, - /obj/structure/geyser/random = 1 + /obj/structure/geyser/random = 1, /obj/effect/spawner/lootdrop/anomaly/waste = 3 ) mob_spawn_list = list( From f3519ec554108dd98f0808f2c8f1dfd06dbb7ec0 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 8 Jun 2023 21:29:03 -0700 Subject: [PATCH 19/43] Update SnowGenerator.dm --- code/datums/mapgen/planetary/SnowGenerator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index 677a92b309b2..4cfe3926fee6 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -207,7 +207,7 @@ feature_spawn_chance = 0.3 feature_spawn_list = list( /obj/effect/spawner/lootdrop/anomaly/ice = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.1 + /obj/effect/spawner/lootdrop/anomaly/big = 0.1, /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13, From 229a97f63ac3cd6317e3e6e288655d9956f9b386 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Fri, 9 Jun 2023 13:06:08 -0700 Subject: [PATCH 20/43] unthrongles for the fourth time --- .../effects/anomalies/anomalies_gravity.dm | 2 +- .../effects/anomalies/anomalies_phantom.dm | 25 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index 9957847b6f6d..ed9918c703a6 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -75,7 +75,7 @@ Guy.throw_at(target, 5, 1) boing = 0 if(iscarbon(Guy)) - for(var/mob/living/carbon/carbon) + for(var/mob/living/carbon/carbon in range(0,src)) if(carbon.run_armor_check(attack_flag = "melee") >= 20) carbon.break_random_bone() else if(carbon.run_armor_check(attack_flag = "melee") >= 40) diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm index 05e70b7326a4..20b7a09d91c7 100644 --- a/code/game/objects/effects/anomalies/anomalies_phantom.dm +++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm @@ -2,7 +2,7 @@ name = "phantom" icon_state = "phantom" desc = "A mysterious anomaly, the outline of a humanoid, endlessly screaming in agony." - density = TRUE + density = FALSE aSignal = /obj/item/assembly/signaler/anomaly/phantom effectrange = 3 pulse_delay = 5 @@ -17,17 +17,18 @@ // /tg/'s helgrasp spawn_hands proc, modified to work as an anomaly effect for(var/mob/living/carbon/handsy in range(effectrange, src)) - var/grab_dir = turn(handsy.dir, pick(-90, 90, 180, 180)) - var/turf/spawn_turf = get_ranged_target_turf(handsy, grab_dir, 8) - if(!spawn_turf) - return - new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, handsy.dir) - playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) - var/obj/projectile/curse_hand/phantom/hand = new (spawn_turf) - hand.preparePixelProjectile(handsy, spawn_turf) - if(QDELETED(hand)) - return - hand.fire() + if(handsy.stat != DEAD) + var/grab_dir = turn(handsy.dir, pick(-90, 90, 180, 180)) + var/turf/spawn_turf = get_ranged_target_turf(handsy, grab_dir, 8) + if(!spawn_turf) + return + new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, handsy.dir) + playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + var/obj/projectile/curse_hand/phantom/hand = new (spawn_turf) + hand.preparePixelProjectile(handsy, spawn_turf) + if(QDELETED(hand)) + return + hand.fire() return From d706e14b16455ef7554c6d969257d48eaa7eb3d1 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Fri, 9 Jun 2023 16:10:09 -0700 Subject: [PATCH 21/43] balance changes from tm --- .../objects/effects/anomalies/_anomalies.dm | 13 +---- .../effects/anomalies/anomalies_bluespace.dm | 5 -- .../effects/anomalies/anomalies_flux.dm | 2 +- .../anomalies/anomalies_hallucination.dm | 2 +- .../effects/anomalies/anomalies_heartbeat.dm | 3 +- .../effects/anomalies/anomalies_melter.dm | 2 +- .../effects/anomalies/anomalies_phantom.dm | 2 +- .../effects/anomalies/anomalies_plasmasoul.dm | 4 +- .../effects/anomalies/anomalies_pulsar.dm | 2 +- .../anomalies/anomalies_pyroclastic.dm | 2 +- .../effects/anomalies/anomalies_sparkler.dm | 2 +- .../effects/anomalies/anomalies_static.dm | 58 ++++++++++++++----- .../effects/anomalies/anomalies_veins.dm | 2 +- 13 files changed, 58 insertions(+), 41 deletions(-) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index a746a803c74e..6a0c1f773973 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -131,18 +131,9 @@ /obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) - to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + to_chat(user, span_notice("Analyzing... [src]'s field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code]. It's likely that pulsing it would cause it to stabilize!")) if(bSignal) - to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]." )) + to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is higly unstable." )) return TRUE return ..() - -///Stabilize an anomaly, letting it stay around forever or untill destabilizes by a player. An anomaly without a core can't be signalled, but can be destabilized -/obj/effect/anomaly/proc/stabilize(anchor = FALSE, has_core = TRUE) - immortal = TRUE - name = (has_core ? "stable " : "hollow ") + name - if(!has_core) - drops_core = FALSE - QDEL_NULL(aSignal) - immobile = anchor diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 2d25a7cab1b8..247770156dd8 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -90,11 +90,6 @@ M.client.screen -= blueeffect qdel(blueeffect) -/obj/effect/anomaly/bluespace/stabilize(anchor, has_core) - . = ..() - - effectrange = 0 //bumping already teleports, so this just prevents people from being teleported when they don't expect it when interacting with stable bsanoms - /obj/effect/anomaly/bluespace/big immortal = TRUE effectrange = 4 diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index 496dcdfb25af..f8e291495477 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -4,7 +4,7 @@ desc = "A mysterious anomaly that sends out a near constant stream of electrical arcs." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/flux - pulse_delay = 4 + pulse_delay = 4 SECONDS effectrange = 0 var/canshock = FALSE var/shockdamage = 20 diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 4db101085986..10f580273d86 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -6,7 +6,7 @@ /// Time passed since the last effect, increased by delta_time of the SSobj var/ticks = 0 /// How many seconds between each small hallucination pulses - pulse_delay = 5 + pulse_delay = 5 SECONDS effectrange = 5 /obj/effect/anomaly/hallucination/anomalyEffect(delta_time) diff --git a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm index 0bec7c6ee31f..715e17216207 100644 --- a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm +++ b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm @@ -5,8 +5,7 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/heartbeat effectrange = 3 - pulse_cooldown = 6 - pulse_secondary_cooldown = 18 + pulse_delay = 6 SECONDS var/reagent_amount = 5 /obj/effect/anomaly/heartbeat/anomalyEffect() diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm index 4a0f45cf4e51..0a5493ffbc7c 100644 --- a/code/game/objects/effects/anomalies/anomalies_melter.dm +++ b/code/game/objects/effects/anomalies/anomalies_melter.dm @@ -3,7 +3,7 @@ icon_state = "inferno" desc = "A mysterious anomaly. Everburning green flames with a horrid sizzle, melting what's near" effectrange = 2 - pulse_delay = 10 + pulse_delay = 10 SECONDS aSignal = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/melter/anomalyEffect(seconds_per_tick) diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm index 20b7a09d91c7..d2c394786dba 100644 --- a/code/game/objects/effects/anomalies/anomalies_phantom.dm +++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm @@ -5,7 +5,7 @@ density = FALSE aSignal = /obj/item/assembly/signaler/anomaly/phantom effectrange = 3 - pulse_delay = 5 + pulse_delay = 5 SECONDS /obj/effect/anomaly/phantom/anomalyEffect() diff --git a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm index b5e7fb4f94d1..011305a3e6dd 100644 --- a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm +++ b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm @@ -5,8 +5,8 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/plasmasoul effectrange = 3 - pulse_cooldown = 6 - pulse_secondary_cooldown = 18 + pulse_cooldown = 6 SECONDS + pulse_secondary_cooldown = 18 SECONDS var/reagent_amount = 5 /obj/effect/anomaly/plasmasoul/anomalyEffect() diff --git a/code/game/objects/effects/anomalies/anomalies_pulsar.dm b/code/game/objects/effects/anomalies/anomalies_pulsar.dm index 837537ee78e8..1f75acee56b8 100644 --- a/code/game/objects/effects/anomalies/anomalies_pulsar.dm +++ b/code/game/objects/effects/anomalies/anomalies_pulsar.dm @@ -5,7 +5,7 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/pulsar effectrange = 4 - pulse_delay = 15 + pulse_delay = 15 SECONDS /obj/effect/anomaly/pulsar/anomalyEffect() diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index 9ba12a4c38e2..b4c93868e670 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -4,7 +4,7 @@ icon_state = "pyroclastic" desc = "A mysterious anomaly, made of an everburning gas. Those who approach it tend to absorb it's heat, or even ignite." effectrange = 4 - pulse_delay = 10 + pulse_delay = 10 SECONDS aSignal = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/pyro/anomalyEffect(seconds_per_tick) diff --git a/code/game/objects/effects/anomalies/anomalies_sparkler.dm b/code/game/objects/effects/anomalies/anomalies_sparkler.dm index 0f75faa89746..0b26e6fd6a1c 100644 --- a/code/game/objects/effects/anomalies/anomalies_sparkler.dm +++ b/code/game/objects/effects/anomalies/anomalies_sparkler.dm @@ -5,7 +5,7 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/sparkler effectrange = 4 - pulse_delay = 1 + pulse_delay = 1 SECONDS /obj/effect/anomaly/sparkler/anomalyEffect() ..() diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 9df93b304889..82ac26a9c03f 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -4,8 +4,8 @@ desc = "A mysterious anomaly. A hole in the world, endless buzzing emitting from it." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/tvstatic - effectrange = 6 - pulse_delay = 6 + effectrange = 4 + pulse_delay = 4 SECONDS var/mob/living/carbon/stored_mob = null /obj/effect/anomaly/tvstatic/examine(mob/user) @@ -15,28 +15,38 @@ if(iscarbon(user)) var/mob/living/carbon/bah = user to_chat(bah, span_userdanger("Your head aches as you stare into the [src]!")) - bah.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 100) + bah.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 100) /obj/effect/anomaly/tvstatic/anomalyEffect() ..() + if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) + return + + COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay/4) + var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) + new /obj/effect/particle_effect/staticball(spot) + + if(!COOLDOWN_FINISHED(src, pulse_cooldown)) return COOLDOWN_START(src, pulse_cooldown, pulse_delay) for(var/mob/living/carbon/looking in range(effectrange, src)) + playsound(src, 'sound/effects/walkietalkie.ogg', 100) if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD) - looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 200) - playsound(looking, 'sound/effects/walkietalkie.ogg') + looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4, 200) + playsound(src, 'sound/effects/stall.ogg', 100) if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150 && looking.stat != DEAD) - var/mob/living/carbon/victim = looking - var/obj/effect/anomaly/tvstatic/planetary/expansion - expansion = new(get_turf(victim)) - visible_message(" The static overtakes [victim], [expansion] taking their place!") - victim.death() - expansion.stored_mob = victim - victim.forceMove(expansion) + if(prob(20)) + var/mob/living/carbon/victim = looking + var/obj/effect/anomaly/tvstatic/planetary/expansion + expansion = new(get_turf(victim)) + visible_message(" The static overtakes [victim], [expansion] taking their place!") + victim.death() + expansion.stored_mob = victim + victim.forceMove(expansion) return @@ -48,7 +58,7 @@ visible_message(" The static lashes out!") if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200) - playsound(looking, 'sound/effects/walkietalkie.ogg') + playsound(src, 'sound/effects/stall.ogg', 100) anomalyEffect() . = ..() @@ -66,3 +76,25 @@ /obj/effect/anomaly/tvstatic/planetary immortal = TRUE immobile = TRUE + +/obj/effect/particle_effect/staticball + name = "static blob" + desc = "An unsettling mass of free floating static" + icon = 'icons/effects/anomalies.dmi' + icon_state = "static" + +/obj/effect/particle_effect/staticball/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/particle_effect/staticball/LateInitialize() + flick(icon_state, src) + playsound(src, "walkietalkie", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + QDEL_IN(src, 20) + + flick(icon_state, src) + playsound(src, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + var/turf/T = loc + if(isturf(T)) + T.hotspot_expose(1000,100) + QDEL_IN(src, 20) diff --git a/code/game/objects/effects/anomalies/anomalies_veins.dm b/code/game/objects/effects/anomalies/anomalies_veins.dm index 5544829d2e88..416e325ccdbd 100644 --- a/code/game/objects/effects/anomalies/anomalies_veins.dm +++ b/code/game/objects/effects/anomalies/anomalies_veins.dm @@ -5,7 +5,7 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/veins effectrange = 3 - pulse_delay = 4 + pulse_delay = 4 SECONDS /obj/effect/anomaly/veins/anomalyEffect() From a722c4138177c6fca61b67874dd3733594ef13e3 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Fri, 9 Jun 2023 16:16:29 -0700 Subject: [PATCH 22/43] more improvements --- code/game/objects/effects/anomalies/anomalies_flux.dm | 2 +- code/game/objects/effects/anomalies/anomalies_phantom.dm | 2 +- .../game/objects/effects/anomalies/anomalies_plasmasoul.dm | 7 ++++--- code/game/objects/effects/anomalies/anomalies_static.dm | 4 ---- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index f8e291495477..56e6f2c4c15e 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -4,7 +4,7 @@ desc = "A mysterious anomaly that sends out a near constant stream of electrical arcs." density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/flux - pulse_delay = 4 SECONDS + pulse_delay = 2 SECONDS effectrange = 0 var/canshock = FALSE var/shockdamage = 20 diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm index d2c394786dba..9407bbcbf920 100644 --- a/code/game/objects/effects/anomalies/anomalies_phantom.dm +++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm @@ -5,7 +5,7 @@ density = FALSE aSignal = /obj/item/assembly/signaler/anomaly/phantom effectrange = 3 - pulse_delay = 5 SECONDS + pulse_delay = 2 SECONDS /obj/effect/anomaly/phantom/anomalyEffect() diff --git a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm index 011305a3e6dd..0ade9f09b150 100644 --- a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm +++ b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm @@ -5,8 +5,7 @@ density = TRUE aSignal = /obj/item/assembly/signaler/anomaly/plasmasoul effectrange = 3 - pulse_cooldown = 6 SECONDS - pulse_secondary_cooldown = 18 SECONDS + pulse_delay = 6 SECONDS var/reagent_amount = 5 /obj/effect/anomaly/plasmasoul/anomalyEffect() @@ -20,12 +19,14 @@ if(iscarbon(Mob)) var/mob/living/carbon/carbon = Mob carbon.reagents?.add_reagent(/datum/reagent/toxin/plasma, reagent_amount) + to_chat(mob, span_warning("Your blood feels thick..")) + playsound(mob, 'sound/effects/bubbles.ogg', 50) if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) return - COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay*4) + COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay*3) var/turf/open/tile = get_turf(src) if(istype(tile)) tile.atmos_spawn_air("o2=250;plasma=750;TEMP=1000") diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 82ac26a9c03f..8641ce9aeed1 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -20,10 +20,6 @@ /obj/effect/anomaly/tvstatic/anomalyEffect() ..() - if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) - return - - COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay/4) var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) new /obj/effect/particle_effect/staticball(spot) From b75e9bb2f432748fe265f91c8d0dd507bbfe0216 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Fri, 9 Jun 2023 16:18:47 -0700 Subject: [PATCH 23/43] Update anomalies_plasmasoul.dm --- code/game/objects/effects/anomalies/anomalies_plasmasoul.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm index 0ade9f09b150..3bb9fde4b5e0 100644 --- a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm +++ b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm @@ -19,8 +19,8 @@ if(iscarbon(Mob)) var/mob/living/carbon/carbon = Mob carbon.reagents?.add_reagent(/datum/reagent/toxin/plasma, reagent_amount) - to_chat(mob, span_warning("Your blood feels thick..")) - playsound(mob, 'sound/effects/bubbles.ogg', 50) + to_chat(Mob, span_warning("Your blood feels thick..")) + playsound(Mob, 'sound/effects/bubbles.ogg', 50) if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown)) From bf3b33456da35a3290511b65c62d2c79887c64b7 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sat, 10 Jun 2023 09:44:20 -0700 Subject: [PATCH 24/43] Update anomalies_melter.dm --- code/game/objects/effects/anomalies/anomalies_melter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm index 0a5493ffbc7c..763c1f334610 100644 --- a/code/game/objects/effects/anomalies/anomalies_melter.dm +++ b/code/game/objects/effects/anomalies/anomalies_melter.dm @@ -1,6 +1,6 @@ /obj/effect/anomaly/melter name = "melter" - icon_state = "inferno" + icon_state = "melter" desc = "A mysterious anomaly. Everburning green flames with a horrid sizzle, melting what's near" effectrange = 2 pulse_delay = 10 SECONDS From 72e49c95d555330586242b8554b3e762917fdd69 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sat, 10 Jun 2023 15:15:50 -0700 Subject: [PATCH 25/43] update --- code/game/objects/effects/anomalies/anomalies_gravity.dm | 2 +- code/game/objects/effects/spawners/lootdrop.dm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index ed9918c703a6..25c9afb62f02 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -91,7 +91,7 @@ INVOKE_ASYNC(src, .proc/setup_grav_field) /obj/effect/anomaly/grav/high/proc/setup_grav_field() - grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = effectrange, "host" = src, "gravity_value" = rand(0,3))) + grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = effectrange, "host" = src, "gravity_value" = 2)) /obj/effect/anomaly/grav/high/Destroy() QDEL_NULL(grav_field) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 7ab9e2561c5c..6350c0ddcff3 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -945,7 +945,6 @@ /obj/effect/spawner/lootdrop/anomaly/waste name = "Waste anomaly spawner" loot = list( - /obj/effect/anomaly/bluespace/planetary, /obj/effect/anomaly/grav/planetary, /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/vortex/planetary, From 6c5e7129a10da4903514d4ed6c78031e78f915c9 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Thu, 15 Jun 2023 17:18:22 -0700 Subject: [PATCH 26/43] Update curse.dm --- code/modules/projectiles/projectile/special/curse.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 3f770f571196..1993176de157 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -60,6 +60,7 @@ . = ..() if (. == BULLET_ACT_HIT) finale() + /obj/projectile/curse_hand/phantom name = "phantom hand" damage = 15 From ce9e5bf203583e668867cc06d6340affc953c903 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sat, 17 Jun 2023 09:23:52 -0700 Subject: [PATCH 27/43] update --- .../mapgen/planetary/JungleGenerator.dm | 2 +- code/datums/mapgen/planetary/LavaGenerator.dm | 2 +- code/datums/mapgen/planetary/RockGenerator.dm | 8 ++++---- code/datums/mapgen/planetary/SandGenerator.dm | 2 +- code/datums/mapgen/planetary/SnowGenerator.dm | 18 +++++++++--------- .../datums/mapgen/planetary/WasteGenerator.dm | 4 ++-- .../effects/anomalies/anomalies_heartbeat.dm | 8 ++++---- sound/health/fastbeat2.ogg | Bin 0 -> 13404 bytes sound/health/slowbeat2.ogg | Bin 0 -> 15474 bytes 9 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 sound/health/fastbeat2.ogg create mode 100644 sound/health/slowbeat2.ogg diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index 86c40769cd11..c27c1dfed5ec 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -181,7 +181,7 @@ feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, /obj/structure/spawner/ice_moon = 1, - /obj/effect/spawner/lootdrop/anomaly/jungle = 1 + /obj/effect/spawner/lootdrop/anomaly/jungle = 0.5 ) /datum/biome/cave/jungle/dirt diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index 2427a2f75a39..f0f28a271b8d 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -99,7 +99,7 @@ /obj/structure/flora/rock/hell = 5, /obj/structure/elite_tumor = 1, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/lava = 1, + /obj/effect/spawner/lootdrop/anomaly/lava = 0.5 ) mob_spawn_chance = 4 diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index 831eec309810..e9689fd54de5 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -87,8 +87,8 @@ feature_spawn_list = list( /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, - /obj/effect/spawner/lootdrop/anomaly/rock = 5, - /obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker + /obj/effect/spawner/lootdrop/anomaly/rock = 1, + /obj/effect/spawner/lootdrop/anomaly/big = 0.1 //get out of here stalker ) flora_spawn_chance = 5 @@ -150,8 +150,8 @@ /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, /obj/structure/spawner/ice_moon/rockplanet = 4, - /obj/effect/spawner/lootdrop/anomaly/rock = 3, - /obj/effect/spawner/lootdrop/anomaly/big = 1, + /obj/effect/spawner/lootdrop/anomaly/rock = 1, + /obj/effect/spawner/lootdrop/anomaly/big = 0.3, ) mob_spawn_chance = 6 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index f40184789d5b..1e6253d906a2 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -93,7 +93,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 4, /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly/sand = 4, + /obj/effect/spawner/lootdrop/anomaly/sand = 2, ) mob_spawn_chance = 4 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index 4cfe3926fee6..d3aaadb0e29e 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -115,7 +115,7 @@ /obj/structure/spawner/ice_moon/demonic_portal = 1, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, - /obj/effect/spawner/lootdrop/anomaly/ice = 1 + /obj/effect/spawner/lootdrop/anomaly/ice = 0.2 ) /datum/biome/snow/lush @@ -207,7 +207,7 @@ feature_spawn_chance = 0.3 feature_spawn_list = list( /obj/effect/spawner/lootdrop/anomaly/ice = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.1, + /obj/effect/spawner/lootdrop/anomaly/big = 0.01, /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13, @@ -259,12 +259,12 @@ ) feature_spawn_chance = 0.2 feature_spawn_list = list( - /obj/structure/spawner/ice_moon/demonic_portal = 1, - /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, - /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, - /obj/structure/spawner/ice_moon = 1, - /obj/structure/spawner/ice_moon/polarbear = 1, - /obj/effect/spawner/lootdrop/anomaly/ice = 1 + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 3, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 5, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.2, + /obj/structure/spawner/ice_moon = 3, + /obj/structure/spawner/ice_moon/polarbear = 3, + /obj/effect/spawner/lootdrop/anomaly/ice = 0.5 ) /datum/biome/cave/snow/thawed @@ -314,7 +314,7 @@ /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly/ice = 1 + /obj/effect/spawner/lootdrop/anomaly/ice = 0.5 ) /datum/biome/cave/volcanic/lava diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index e21da27d1a52..8e28aafb661a 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -132,7 +132,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/waste = 3 + /obj/effect/spawner/lootdrop/anomaly/waste = 1 ) mob_spawn_list = list( @@ -315,7 +315,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/waste = 3 + /obj/effect/spawner/lootdrop/anomaly/waste = 1 ) mob_spawn_list = list( /mob/living/simple_animal/hostile/hivebot/strong/rockplanet = 70, diff --git a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm index 715e17216207..006aec55f0d6 100644 --- a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm +++ b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm @@ -15,7 +15,7 @@ return COOLDOWN_START(src, pulse_cooldown, pulse_delay) - playsound(src, 'sound/health/slowbeat.ogg', 100) + playsound(src, 'sound/health/slowbeat2.ogg', 100) radiation_pulse(src, 500, 2) @@ -24,17 +24,17 @@ COOLDOWN_START(src, pulse_secondary_cooldown, pulse_delay*4) var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) - playsound(spot, 'sound/health/slowbeat.ogg', 100) + playsound(spot, 'sound/health/slowbeat2.ogg', 100) radiation_pulse(spot, 200, effectrange) /obj/effect/anomaly/heartbeat/Bumped(atom/movable/AM) var/turf/spot = locate(rand(src.x-effectrange, src.x+effectrange), rand(src.y-effectrange, src.y+effectrange), src.z) - playsound(spot, 'sound/health/slowbeat.ogg', 100) + playsound(spot, 'sound/health/slowbeat2.ogg', 100) radiation_pulse(spot, 200, effectrange) /obj/effect/anomaly/heartbeat/detonate() radiation_pulse(src, 5000, 2) - playsound(src, 'sound/health/fastbeat.ogg', 300) + playsound(src, 'sound/health/fastbeat2.ogg', 300) . = ..() /obj/effect/anomaly/heartbeat/planetary diff --git a/sound/health/fastbeat2.ogg b/sound/health/fastbeat2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..93f26c2195b856c7b6dc7ab7a6d843cddcf17cf6 GIT binary patch literal 13404 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 literal 0 HcmV?d00001 diff --git a/sound/health/slowbeat2.ogg b/sound/health/slowbeat2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..91143884aea90c47ecf57fc3a023db8915eab417 GIT binary patch literal 15474 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≫31vy4=O225|kr)?OwqMmceHEZ5={l?7m}(_{>IC>8BCH z9bKFDY#0O@3AnnI^(CtVPz5sj5*srM;@)p|hYpy96P0#GFcS>qdg9^?wXItq%Gl}? z@At^{AC@m~ZE~b5WD4iD)-1%B_d$AYq z=l=ES$D^k|x}W#GE*R1ou`^@$p2r2@2Y9D`!f*wg-FE_ZGFEH5$X4%Xg8e^nsQRO- z2amfu^L~LUt!y7S)11?53`XET6v%*9n%=<5*(Bx*vAJt*<8O8Qp0?Z-O`N|yHqcyK zYXS8Qfcu+bYSKI!BG(_<)tXu=P8&V?>(SKP(;F`cyi0z1@JWAik(R!m$X<)QA59`c z1HWdzecG@uTJzld)-Q`110Ni^6vTS#=PZ{N8w~DOCe-RY8PEmFJU^l{C*Ms4kb5IP zUfb9Z={sFBGcyxxRC9j!j+uy=!C&VdD7*dqYWn2ii>XGBQ$rPcy7xW=#caJVe)x61 zIUlRzJ>F*b@WZCbtEYTjc6`zH-o-NlzhBg*wW-Ax@l)#J&#f&u$30ezBY(w@6(nL$ zsJ?su{y~!}v2HEvDZBhByTAu7fjhv{mCuqES1S#4GA05rUz%`30jPkMz}s|J5OC$zck$YuR~QtxvLx;ysJKB^ZPeyg>k zf827b>lwYt?w;8@t)$jGe*05R4qG2wf`2!Qf2lQW)6NZ8yurR%_NbzGDdUV&{DoLC z>myC4D^q2BRqD$M2R2#uc~j%Q&CN@Nu>(U%_@BPl zo;_aqvdf^Riy9F)-SB$TN&8y^MPc`RaveV?PgokgW)ojt?DcFyU=s()SGmwa_vNB6_E`KzM_d~GGJ+?J7%Vligp3(|K5 zFq^Ut&aZw}B`OzgyeWUQWiLpvWz@E#M)q7_id#k(f^+Gco1Xkq$ho9sWfgYd$I=n& zIPo9TtA*Om+1cxDJ1eHzo4({=qVW?CSrubP9L%{xtVt z5hJUxf}cy#;!XCwf(x8Hy0_)n4(YAlfKpM*iMp_`(_^r_U7I4F)nT#MP{1yfC zs%)7dFNE72Xo072ZF4}`*>fI0lVD>{6Ie2kNj=;%Ex4T2CN`gM{~3K9K}m!f-enVn z@2GP#p)P9^KtBV$2>?!@y3<((5FCp$xA1(JwtvJ4Zyb-rn9;UU~5kPAv5-KniRv$I7I4LZk zCDW^260toqVqxF!BeT!LPC<-4Bg{Rh$LP{{!tRPL;U4Z<3FeWBXn=Chg3H|CHwSOG z%gcw)bIlBpHI4UtTY7M+lOY{5AysLsE+YcatOw%`rgFBM3lo&(EJ;f6UDEjgqpxA| z*;7k|hT(i?XX^sumoKA4ja5^(p6#4w@0f8=4|K=3aA*}(s02)x}%I9DGBSAy8 z0~9$t9)7C%)Zjg+e|m2NOQ7Y~70Kjz0co&r6y~vIh7d`~B>Wh57P|a9jE%sb#i4%@ zN*IbAszL!a6sEVq2nH1g%Xrfb$lP3v8QQR3VPFz36?nYt_L5(_PWao8{2|r+?HKUp zP2Ks6`vW&?JueOICFH6iAoQmMxO?R7%f{zl561SK1A(2YA3lWsEPZrv{UIjy)Wo=@ zOyO<*bK9s6WY&e%(iE4JvFzKoCL-5h$m{thLf%LUb=whQTuf+P&D;y(EcpT*f_-=P z3QubIz&0+S#1+D!>oKHMMq3*W&mb1q5P1k9*`UzVUDQjCn3;~Sg-BR7fr4RZbc1e4 z77XAd2G#2`743Y0O*5BNH_%#bD8i24_JmcCz#TMxC$1CBw;xTo`$0TiB>V#qKo{zW_N=KQY$Xq`+IzxHADWhg~*Sv zI(k1`JXFV4qH7AoDZFK(nCJ|IOBHBnnYrVPMFbD%;V=!-WHc!w-#aS?<3~q2p+J=i*jl?i#{*N9ZurfI!4ax(@$|~kBx4+$!`O{c73lE?NdZE z_l=*JxyZMc;70|aC%k<-861SnzVz{{fS|6f(Vb{4Tjm2>pugO!S-QK7-AePDO%0#% zw2XFt!1Me}_qNi2Ks5;?R*n`nJYObRb>m2tc&X`x50!-AjhK#3kJ#5;?+rn?H@RS5 z?wx1IqvM%`1m;_cF?On{DhY?o+UC*1m|97fk?>r9=PV+>(?cg^U!dyQ_5}rFj;MP+ zzb{&CcqjqHZU+h!IShiABvPSUqpN^m2nkgC`?g? zF`L*#z9)s{^k0}NQ~C9Tb*lZeSh0Q}L~uvsKpKHWQE+Bwi#P$|O8CJH5r<;NkO?{% zV8({lU_#-NgWhvPs}LVXmE4tz&B@8(l05@o83>_Ji#XpgWl|QWB4yVfWn>esrY80+ zea`OFZ9imGWM8chvl9)OnPZhw``=smc4iqV0Pr@Ji}E)5J5_1n` z$(uEny5O`-xt(xQO_ATG?skPp@;Eggm|>P%-^p63=pjTWJW6D?cr~1P?Z~hA`50O( z?wunjE-N>8ATQ8xGR~;lMT2-&l_yyEE}gY`T~@~$5gt@A(J*VAK9I(g*(HUYAR`2K z=h&VU0=AQ$mOFL(EudNhMNIn4#^Ap0!TP2R>rXPG$XzNcX94{ zFetKMcw!?k=@JCFbX&RZ`PtoLxO{QK)KtF8PcPMfnjV|jcN zS2nIuNIQE`#Vr5h8&5p5(Lcd&5CV&;@BUatqqMF8suGU8I;DzPo70s8muEdRJpn;r}F^-2XTRp0V$to4`eqgtCW) zlTCmw6P$T=W?1OU_n9y+!+^;pu*CCuiMX_SSMuXU6*Wo>k4x>qU74Az;uyuv3oC6{ z2cq<+3qD19N_~~LeAJRt6aZlj`Z@O5mp#GTTz&<>k3~jJ-U4qL3v6+%>sue%Ven2Y zL^xQK>+3}pFLh*H;Qo!5Q%q?q`VyP`g92u$rIWtRM)uo`6U+sggyLy*`NO?k+?IVp z=Oru5uB>ur11G-=&StI=(k)Yu!%6Z&1Pa$4aUsV%k9o?So9CL904WzwNd&4?UeKSG z3KxIEJgBKJ++%>Ia+8c>5efh%Ih-$;u#jMO4l<$%MDdoaw4*ta8n{$b|Aqumjo~br zf4Ysc1)d5%+NN*tf5%b58O+@(&8$ao>V&PA;*4#&E+j;!>ZCZZ$x^ zepNLcxK`qaIp-X8UfHCRH;8$$yojiAz#HpGm5cvOb;xz&J-N@D3ndD+epE|ma=Q$Q z$G>7Ktt!drz8Kg?us<2Je(w=kg{;6j;|-LB)pBaFNtRq-kaRoDm#EeS+}&S*AW7tG zndy4Ikt+IDUcmHs?#SAJ9l@djMt~88poNe;B@9IrDn1W-;L*b{4ZVz^ z_-HW643xO=3{1SSEpB-~B@4%CYT}ZC>HW-IsfVX7`EA~D`Wu;(?cX~b+P!xut;M<{ zh2fAjc{cr7nNE8vU?Mms{9NvgksX{kL!4J*7J}H_8lu={@ar%~>_= z_NH5|33uPzY}6Kz*w-ocJeUQ>v&BIC`%7dVT3hDiSo`Nja(u(Y4%7L|4T*c^*QeKV zjWjym6F*+Nb+=MW_MO-db3fxy_NtXM#qnINCl?xoi^a)^BrG0aPT@THvDH>de#k%c_O14sFnIt*V5iO zXS4&LpJepj4@_RUpx%a^LD*q{&ly|_e8u0o?b5&u+P5O*z4iH8GM-h*0(2Q1!pVD8cu&Wu26kfNa>Ls0E7x|Lb-pV zJ=ih*`3cUR5Wyi?pclnG9Q%1Ykgi9$VIBnLgm!WA>U>V!)A-%h$^tNqDSD(%{$o1| zVEi$8h&hw5m17%1e&ddnZj%bUcK@3nTa5-LU@Z832)^Tz75Okku%6Y*oAxfXFGY2} z=v@_c#&j@>czN;d0X%_WrfJ_XQ1j;W?B~`7T!J0x?JY86DFp&802TS{N#RGV{6aZ z&Scs}v$rh}sV?{Q0 zg!2WtRSFMS&mm7+5spf6_StauhyV_K5Ke<#g^LF5!s4GEu^1oCygx5#|2pSA>kl)I z2@p|SIDMTzsJcSog2?h7h=JXEf!50rXQ%dwh3DA!%q_Cv;oT@^WB%re&n$*p` zi0zWMl~}s5Gv0A4n#u1|gCY`(DCS}>r2dir9e?K?pX}6hHy4^< z0Anv$IdR}}c})BgPC@MC!3{MfMpV4_#amar1H3H7T&zFqInC#}IN2x-?bS1wD?Pb} zdBu7%F#Jf?J{BpPnljQ(GBTmJsP;Y1v=dFbr#;90v!{G5C_)%MU%liy2AVrmOES>7ep`n#4M$a9lge1o0OZno{PB=elUj0L2X zk&nBdjjmES{S{Z}84#DBuJ7~KEiXgeE;2IupqY}dKecKkyQeMX(yKV8jclD`4c<_9 zzn6n=#*HIZk+S4x3%}h7Q5kK{7Lkii!^Kj0TMw*L$#)l>49*KaJT#0uYr9jyl;^VA z!z-Q4jGz7tK+@I0(|*a^Ey7~?ygAz*fVVRu#4v{2G63j~yVjWsb)1RQc&yotfomn$ zo`oZ2O&~;=PyiI*4CP%7Y*6^A6fU%YH#G554#{%Z!yCvphaMaMKD9ej2wH*R$4`pq z(|^vN^-JHRb8gjjNVW+N*1XUXKG5#2`elz4{o-eX@3wnWd%I4YxOM!cfX+>g)r|7d zn!(34tw%%OcC~364=w6HNN=hxBy}8wh+0T?7K%_W%y(mPKSF1GX1J zWDu~>0Yjrtgp6XjApCFz%J~kAu*d{Xb}>`q9sY1x)p+9Km33Sn1fpQRq;5WY*gc9b zNaapa?HWaMxHN4E^NW#+4nF??H^U=e%{({v^!UcKNy64opMFKk!7QuD zJ(EZ$j6~4%*>QbR{gWNyXWun(TdwnGIkD4SKU!(HUT;R75q$Kk8ncx- zX!$GrxpLmhg!>Qj!L@Zm5n>Kb)|2>y%(^{O-&Zwh=v%$I7W3QBUE`yV<87d5U>`21 zKY_pFdMdzOV!}&C|7FYGo0P5li%Ji!nyxjd%8aQSjLeY%toom|rKPtX`fdF3!%}e+ zHyUwg)Lwk(-kOaW+?g=|*sE53s~^fwj@bWo(}eceYwn;6H07ITwXzG0wAaU;PH-rs MzI3qUnoR=#1ApDE(EtDd literal 0 HcmV?d00001 From 6559138d5754b8eebe52c37e59e0035836eb3bfe Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 18 Jun 2023 09:41:20 -0700 Subject: [PATCH 28/43] reduces spawn chances More --- .../mapgen/planetary/JungleGenerator.dm | 2 +- code/datums/mapgen/planetary/RockGenerator.dm | 7 +- code/datums/mapgen/planetary/SandGenerator.dm | 13 +++- code/datums/mapgen/planetary/SnowGenerator.dm | 13 ++-- .../datums/mapgen/planetary/WasteGenerator.dm | 4 +- .../game/objects/effects/spawners/lootdrop.dm | 78 +++++++++++++++++++ 6 files changed, 101 insertions(+), 16 deletions(-) diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index c27c1dfed5ec..b54bd9b173d2 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -181,7 +181,7 @@ feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, /obj/structure/spawner/ice_moon = 1, - /obj/effect/spawner/lootdrop/anomaly/jungle = 0.5 + /obj/effect/spawner/lootdrop/anomaly/jungle = 0.1 ) /datum/biome/cave/jungle/dirt diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index e9689fd54de5..8b699122e138 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -87,8 +87,8 @@ feature_spawn_list = list( /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, - /obj/effect/spawner/lootdrop/anomaly/rock = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.1 //get out of here stalker + /obj/effect/spawner/lootdrop/anomaly/rock = 0.3, + /obj/effect/spawner/lootdrop/anomaly/big = 0.01 //get out of here stalker ) flora_spawn_chance = 5 @@ -150,8 +150,7 @@ /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, /obj/structure/spawner/ice_moon/rockplanet = 4, - /obj/effect/spawner/lootdrop/anomaly/rock = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.3, + /obj/effect/spawner/lootdrop/anomaly/rock/cave = 0.1, ) mob_spawn_chance = 6 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index 1e6253d906a2..11d91d4e457c 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -93,7 +93,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 4, /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly/sand = 2, + /obj/effect/spawner/lootdrop/anomaly/sand = 0.5, ) mob_spawn_chance = 4 mob_spawn_list = list( @@ -174,7 +174,10 @@ /datum/biome/cave/sand closed_turf_types = list(/turf/closed/mineral/random/whitesands = 1) - open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands = 5, /turf/open/floor/plating/asteroid/whitesands/dried = 1) + open_turf_types = list( + /turf/open/floor/plating/asteroid/whitesands = 5, + /turf/open/floor/plating/asteroid/whitesands/dried = 1 + ) flora_spawn_chance = 4 flora_spawn_list = list( /obj/structure/flora/rock = 4, @@ -182,7 +185,11 @@ /obj/structure/flora/ash/fern = 2, /obj/structure/flora/ash/puce = 1, ) - feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/structure/elite_tumor = 2) + feature_spawn_list = list( + /obj/structure/geyser/random = 1, + /obj/structure/elite_tumor = 2 + /obj/effect/spawner/lootdrop/anomaly/sand/cave = 0.1 + ) mob_spawn_chance = 4 mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index d3aaadb0e29e..09737427fe62 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -112,10 +112,11 @@ ) feature_spawn_chance = 0.1 feature_spawn_list = list( - /obj/structure/spawner/ice_moon/demonic_portal = 1, - /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, - /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, - /obj/effect/spawner/lootdrop/anomaly/ice = 0.2 + /obj/effect/spawner/lootdrop/anomaly/ice = 1, + /obj/effect/spawner/lootdrop/anomaly/big = 0.01, + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13 ) /datum/biome/snow/lush @@ -264,7 +265,7 @@ /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.2, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly/ice = 0.5 + /obj/effect/spawner/lootdrop/anomaly/ice/cave = 0.5 ) /datum/biome/cave/snow/thawed @@ -314,7 +315,7 @@ /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly/ice = 0.5 + /obj/effect/spawner/lootdrop/anomaly/ice/cave = 0.5 ) /datum/biome/cave/volcanic/lava diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index 8e28aafb661a..8b6553d489cb 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -132,7 +132,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/waste = 1 + /obj/effect/spawner/lootdrop/anomaly/waste = 0.5 ) mob_spawn_list = list( @@ -315,7 +315,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/waste = 1 + /obj/effect/spawner/lootdrop/anomaly/waste/cave = 0.5 ) mob_spawn_list = list( /mob/living/simple_animal/hostile/hivebot/strong/rockplanet = 70, diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 6350c0ddcff3..61be0dfd2696 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -861,6 +861,7 @@ ) //handpicked lists relevant to the planets they're on +// /cave lists are made for spawning in cave biomes. Not every anomaly goes well there. We don't have enough anomalies to really populate them all though /obj/effect/spawner/lootdrop/anomaly/jungle name = "Jungle Anomaly Spawner" @@ -874,6 +875,19 @@ /obj/effect/anomaly/phantom/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/jungle/cave + loot = list( + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + +//beaches don't currently have anomalies, but I don't see a reason why they couldn't have *some* + /obj/effect/spawner/lootdrop/anomaly/beach name = "Beach anomaly spawner" loot = list( @@ -883,6 +897,14 @@ /obj/effect/anomaly/phantom/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/beach/cave + loot = list( + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + /obj/effect/spawner/lootdrop/anomaly/sand name = "Sand anomaly spawner" loot = list( @@ -898,6 +920,19 @@ /obj/effect/anomaly/melter/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/sand/cave + loot = list( + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/tvstatic/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + /obj/effect/anomaly/melter/planetary, + ) + /obj/effect/spawner/lootdrop/anomaly/rock name = "Rock anomaly spawner" loot = list( @@ -917,6 +952,21 @@ /obj/effect/anomaly/melter/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/rock + loot = list( + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/sparkler/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + /obj/effect/anomaly/melter/planetary, + ) + /obj/effect/spawner/lootdrop/anomaly/lava name = "Lava anomaly spawner" loot = list( @@ -930,6 +980,16 @@ /obj/effect/anomaly/plasmasoul/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/lava/cave + loot = list( + /obj/effect/anomaly/flux/planetary, + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/pyro/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + ) + /obj/effect/spawner/lootdrop/anomaly/ice name = "Ice anomaly spawner" loot = list( @@ -942,6 +1002,15 @@ /obj/effect/anomaly/phantom/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/ice/cave + loot = list( + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/grav/high/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/phantom/planetary, + ) + /obj/effect/spawner/lootdrop/anomaly/waste name = "Waste anomaly spawner" loot = list( @@ -954,6 +1023,15 @@ /obj/effect/anomaly/melter/planetary, ) +/obj/effect/spawner/lootdrop/anomaly/waste/cave + loot = list( + /obj/effect/anomaly/grav/planetary, + /obj/effect/anomaly/hallucination/planetary, + /obj/effect/anomaly/heartbeat/planetary, + /obj/effect/anomaly/veins/planetary, + /obj/effect/anomaly/plasmasoul/planetary, + /obj/effect/anomaly/melter/planetary, + ) //wasteplanet things /obj/effect/spawner/lootdrop/waste/grille_or_trash From 4d07c56d6a46f3f90514867493b91a50e1619121 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 18 Jun 2023 10:15:03 -0700 Subject: [PATCH 29/43] Update SandGenerator.dm --- code/datums/mapgen/planetary/SandGenerator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index 11d91d4e457c..f630a907a47f 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -187,7 +187,7 @@ ) feature_spawn_list = list( /obj/structure/geyser/random = 1, - /obj/structure/elite_tumor = 2 + /obj/structure/elite_tumor = 2, /obj/effect/spawner/lootdrop/anomaly/sand/cave = 0.1 ) mob_spawn_chance = 4 From 88d18e3c1be6c5dfa0d316d7b7116de3f204aab8 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 18 Jun 2023 10:18:01 -0700 Subject: [PATCH 30/43] Update lootdrop.dm --- code/game/objects/effects/spawners/lootdrop.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 61be0dfd2696..e91ecc8e746e 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -952,7 +952,7 @@ /obj/effect/anomaly/melter/planetary, ) -/obj/effect/spawner/lootdrop/anomaly/rock +/obj/effect/spawner/lootdrop/anomaly/rock/cave loot = list( /obj/effect/anomaly/flux/planetary, /obj/effect/anomaly/grav/planetary, From 369e168d0c75d9ea815b0902bbc0e755a448e95d Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 18 Jun 2023 17:59:52 -0700 Subject: [PATCH 31/43] Update lootdrop.dm --- code/game/objects/effects/spawners/lootdrop.dm | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index e91ecc8e746e..ad355b32af3d 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -867,7 +867,6 @@ name = "Jungle Anomaly Spawner" loot = list( /obj/effect/anomaly/flux/planetary, - /obj/effect/anomaly/grav/planetary, /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/heartbeat/planetary, /obj/effect/anomaly/tvstatic/planetary, @@ -878,7 +877,6 @@ /obj/effect/spawner/lootdrop/anomaly/jungle/cave loot = list( /obj/effect/anomaly/flux/planetary, - /obj/effect/anomaly/grav/planetary, /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/heartbeat/planetary, /obj/effect/anomaly/tvstatic/planetary, @@ -910,12 +908,9 @@ loot = list( /obj/effect/anomaly/bluespace/planetary, /obj/effect/anomaly/flux/planetary, - /obj/effect/anomaly/grav/planetary, - /obj/effect/anomaly/pyro/planetary, /obj/effect/anomaly/sparkler/planetary, /obj/effect/anomaly/tvstatic/planetary, /obj/effect/anomaly/veins/planetary, - /obj/effect/anomaly/plasmasoul/planetary, /obj/effect/anomaly/phantom/planetary, /obj/effect/anomaly/melter/planetary, ) @@ -923,12 +918,10 @@ /obj/effect/spawner/lootdrop/anomaly/sand/cave loot = list( /obj/effect/anomaly/flux/planetary, - /obj/effect/anomaly/grav/planetary, /obj/effect/anomaly/pyro/planetary, /obj/effect/anomaly/sparkler/planetary, /obj/effect/anomaly/tvstatic/planetary, /obj/effect/anomaly/veins/planetary, - /obj/effect/anomaly/plasmasoul/planetary, /obj/effect/anomaly/phantom/planetary, /obj/effect/anomaly/melter/planetary, ) @@ -976,17 +969,14 @@ /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/pyro/planetary, /obj/effect/anomaly/vortex/planetary, - /obj/effect/anomaly/grav/high/planetary, /obj/effect/anomaly/plasmasoul/planetary, ) /obj/effect/spawner/lootdrop/anomaly/lava/cave loot = list( /obj/effect/anomaly/flux/planetary, - /obj/effect/anomaly/grav/planetary, /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/pyro/planetary, - /obj/effect/anomaly/grav/high/planetary, /obj/effect/anomaly/plasmasoul/planetary, ) @@ -1004,7 +994,6 @@ /obj/effect/spawner/lootdrop/anomaly/ice/cave loot = list( - /obj/effect/anomaly/grav/planetary, /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/grav/high/planetary, /obj/effect/anomaly/plasmasoul/planetary, @@ -1014,8 +1003,6 @@ /obj/effect/spawner/lootdrop/anomaly/waste name = "Waste anomaly spawner" loot = list( - /obj/effect/anomaly/grav/planetary, - /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/vortex/planetary, /obj/effect/anomaly/heartbeat/planetary, /obj/effect/anomaly/veins/planetary, @@ -1025,8 +1012,6 @@ /obj/effect/spawner/lootdrop/anomaly/waste/cave loot = list( - /obj/effect/anomaly/grav/planetary, - /obj/effect/anomaly/hallucination/planetary, /obj/effect/anomaly/heartbeat/planetary, /obj/effect/anomaly/veins/planetary, /obj/effect/anomaly/plasmasoul/planetary, From 8c916173468e71f86432eafbbc5b0c4d0a1ecb7d Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:33:03 -0700 Subject: [PATCH 32/43] more updates pulse timing is now a range. Research goggles can tell you how much science is in an anomaly --- .../objects/effects/anomalies/_anomalies.dm | 15 ++++++++-- .../effects/anomalies/anomalies_gravity.dm | 2 +- .../effects/anomalies/anomalies_static.dm | 30 ++++++++----------- code/modules/mob/mob_defines.dm | 2 +- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 6a0c1f773973..593ba8469dbb 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -43,6 +43,7 @@ return INITIALIZE_HINT_QDEL research_value = rand(500,4000) + pulse_delay = rand(pulse_delay*0.5, pulse_delay*1.5) src.drops_core = drops_core if(aSignal) @@ -131,9 +132,17 @@ /obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) - to_chat(user, span_notice("Analyzing... [src]'s field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code]. It's likely that pulsing it would cause it to stabilize!")) - if(bSignal) - to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is higly unstable." )) + to_chat(user, span_notice("Analyzing...")) + if(do_after(user, 20, TRUE, src)) + to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + if(bSignal) + to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is highly unstable." )) return TRUE return ..() + + +/obj/effect/anomaly/tvstatic/examine(mob/user) + . = ..() + if(user.research_scanner == TRUE) + to_chat(user, span_notice("If harvested, this anomaly would be worth [research_value] research points.")) diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index 25c9afb62f02..b5668732f52b 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -9,7 +9,7 @@ /obj/effect/anomaly/grav name = "throngler" icon_state = "gravity" - desc = "A mysterious anomaly that sucks things towards it with a gravitational field, as you get closer, it gets more intense." + desc = "A mysterious anomaly that sucks things towards it with a gravitational field, ending in what has been termed a 'throngling'." density = FALSE aSignal = /obj/item/assembly/signaler/anomaly/grav bSignal = null diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm index 8641ce9aeed1..31c2a2db5c47 100644 --- a/code/game/objects/effects/anomalies/anomalies_static.dm +++ b/code/game/objects/effects/anomalies/anomalies_static.dm @@ -12,7 +12,7 @@ . = ..() if(!iscarbon(user)) return - if(iscarbon(user)) + if(iscarbon(user) && !user.research_scanner) //this'll probably cause some weirdness when I start using research scanner in more places / on more items. Oh well. var/mob/living/carbon/bah = user to_chat(bah, span_userdanger("Your head aches as you stare into the [src]!")) bah.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 100) @@ -31,18 +31,18 @@ for(var/mob/living/carbon/looking in range(effectrange, src)) playsound(src, 'sound/effects/walkietalkie.ogg', 100) - if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD) + if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD || !looking.research_scanner && looking.stat != DEAD) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4, 200) playsound(src, 'sound/effects/stall.ogg', 100) - if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150 && looking.stat != DEAD) - if(prob(20)) - var/mob/living/carbon/victim = looking - var/obj/effect/anomaly/tvstatic/planetary/expansion - expansion = new(get_turf(victim)) - visible_message(" The static overtakes [victim], [expansion] taking their place!") - victim.death() - expansion.stored_mob = victim - victim.forceMove(expansion) + if(looking.getOrganLoss(ORGAN_SLOT_BRAIN) >= 150 && looking.stat != DEAD) + if(prob(20)) + var/mob/living/carbon/victim = looking + var/obj/effect/anomaly/tvstatic/planetary/expansion + expansion = new(get_turf(victim)) + visible_message(" The static overtakes [victim], [expansion] taking their place!") + victim.death() + expansion.stored_mob = victim + victim.forceMove(expansion) return @@ -51,7 +51,7 @@ /obj/effect/anomaly/tvstatic/detonate() for(var/mob/living/carbon/looking in range(effectrange, src)) - visible_message(" The static lashes out!") + visible_message(" The static lashes out, agony filling your mind as its tendrils scrape your thoughts!") if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD) looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200) playsound(src, 'sound/effects/stall.ogg', 100) @@ -88,9 +88,3 @@ playsound(src, "walkietalkie", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) QDEL_IN(src, 20) - flick(icon_state, src) - playsound(src, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - var/turf/T = loc - if(isturf(T)) - T.hotspot_expose(1000,100) - QDEL_IN(src, 20) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index fcb257149d8b..03916f94be9d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -136,7 +136,7 @@ var/datum/component/storage/active_storage /// Active hud var/datum/hud/hud_used = null - /// I have no idea tbh + /// It allows for scientific knowledge to be imparted (e.g. blob strain, if an object has research value, if it boosts a technode) var/research_scanner = FALSE /// Is the mob throw intent on From 0ac3f045200050e2d93866be88244bd4f43b1698 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Wed, 21 Jun 2023 09:32:40 -0700 Subject: [PATCH 33/43] trying more changes --- .../mapgen/planetary/JungleGenerator.dm | 2 +- code/datums/mapgen/planetary/RockGenerator.dm | 6 +++--- code/datums/mapgen/planetary/SandGenerator.dm | 4 ++-- code/datums/mapgen/planetary/SnowGenerator.dm | 21 +++++++------------ 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index b54bd9b173d2..c27c1dfed5ec 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -181,7 +181,7 @@ feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, /obj/structure/spawner/ice_moon = 1, - /obj/effect/spawner/lootdrop/anomaly/jungle = 0.1 + /obj/effect/spawner/lootdrop/anomaly/jungle = 0.5 ) /datum/biome/cave/jungle/dirt diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index 8b699122e138..eef0174b75bc 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -87,8 +87,8 @@ feature_spawn_list = list( /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, - /obj/effect/spawner/lootdrop/anomaly/rock = 0.3, - /obj/effect/spawner/lootdrop/anomaly/big = 0.01 //get out of here stalker + /obj/effect/spawner/lootdrop/anomaly/rock = 0.5, + /obj/effect/spawner/lootdrop/anomaly/big = 0.1 //get out of here stalker ) flora_spawn_chance = 5 @@ -150,7 +150,7 @@ /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, /obj/structure/spawner/ice_moon/rockplanet = 4, - /obj/effect/spawner/lootdrop/anomaly/rock/cave = 0.1, + /obj/effect/spawner/lootdrop/anomaly/rock/cave = 0.5, ) mob_spawn_chance = 6 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index f630a907a47f..60151e420af3 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -93,7 +93,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 4, /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly/sand = 0.5, + /obj/effect/spawner/lootdrop/anomaly/sand = 0.7, ) mob_spawn_chance = 4 mob_spawn_list = list( @@ -188,7 +188,7 @@ feature_spawn_list = list( /obj/structure/geyser/random = 1, /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly/sand/cave = 0.1 + /obj/effect/spawner/lootdrop/anomaly/sand/cave = 0.5 ) mob_spawn_chance = 4 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index 09737427fe62..f694a0dad972 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -209,10 +209,10 @@ feature_spawn_list = list( /obj/effect/spawner/lootdrop/anomaly/ice = 1, /obj/effect/spawner/lootdrop/anomaly/big = 0.01, - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13, - /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 12 + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 3, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 5, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.5, + /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 0.01 ) @@ -262,10 +262,11 @@ feature_spawn_list = list( /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 3, /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 5, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.2, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.6, + /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 0.2, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly/ice/cave = 0.5 + /obj/effect/spawner/lootdrop/anomaly/ice/cave = 1 ) /datum/biome/cave/snow/thawed @@ -309,14 +310,6 @@ /obj/structure/flora/ash/stem_shroom = 1, ) feature_spawn_chance = 0.2 - feature_spawn_list = list( - /obj/structure/spawner/ice_moon/demonic_portal = 1, - /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 1, - /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 1, - /obj/structure/spawner/ice_moon = 3, - /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly/ice/cave = 0.5 - ) /datum/biome/cave/volcanic/lava open_turf_types = list( From 8e8a8fce7d465e214005ea52f74a91cee758a573 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 25 Jun 2023 11:22:56 -0700 Subject: [PATCH 34/43] cleans the code up more --- code/__DEFINES/anomalies.dm | 8 -------- code/__DEFINES/mobs.dm | 2 -- code/game/objects/effects/anomalies/_anomalies.dm | 2 +- code/game/objects/items/body_egg.dm | 2 +- .../antagonists/abductor/equipment/glands/electric.dm | 4 ++-- .../antagonists/abductor/equipment/glands/slime.dm | 2 +- code/modules/antagonists/slaughter/slaughter.dm | 2 +- code/modules/mob/living/brain/brain_item.dm | 4 ++-- code/modules/mob/living/carbon/alien/organs.dm | 6 +++--- .../mob/living/carbon/human/species_types/shadowpeople.dm | 4 ++-- code/modules/surgery/organs/appendix.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 2 +- code/modules/surgery/organs/augments_internal.dm | 2 +- code/modules/surgery/organs/heart.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 4 ---- code/modules/surgery/organs/tongue.dm | 2 +- code/modules/zombie/organs.dm | 2 +- 17 files changed, 19 insertions(+), 33 deletions(-) diff --git a/code/__DEFINES/anomalies.dm b/code/__DEFINES/anomalies.dm index e5689e74e50c..5214c38f93c8 100644 --- a/code/__DEFINES/anomalies.dm +++ b/code/__DEFINES/anomalies.dm @@ -1,11 +1,3 @@ -// Max amounts of cores you can make with core implosion. Like we'll ever use that. -#define MAX_CORES_BLUESPACE 8 -#define MAX_CORES_GRAVITATIONAL 8 -#define MAX_CORES_FLUX 8 -#define MAX_CORES_VORTEX 8 -#define MAX_CORES_PYRO 8 -#define MAX_CORES_HALLUCINATION 8 - ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EXPLOSION 0 #define FLUX_EXPLOSIVE 1 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a9fafe9dc5ab..b561c8394c5b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -73,8 +73,6 @@ //Bodypart change blocking flags #define BP_BLOCK_CHANGE_SPECIES (1<<0) -#define BODYTYPE_BIOSCRAMBLE_COMPATIBLE (BODYTYPE_HUMANOID) -#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_ROBOTIC) && (bodytype & BODYTYPE_BIOSCRAMBLE_COMPATIBLE)) //Defines for Species IDs #define SPECIES_ABDUCTOR "abductor" diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 593ba8469dbb..df1e8c650af1 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -142,7 +142,7 @@ return ..() -/obj/effect/anomaly/tvstatic/examine(mob/user) +/obj/effect/anomaly/examine(mob/user) . = ..() if(user.research_scanner == TRUE) to_chat(user, span_notice("If harvested, this anomaly would be worth [research_value] research points.")) diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index a02604db9680..cc4fd287c8b7 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -14,7 +14,7 @@ if(iscarbon(loc)) Insert(loc) -/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = 0) ..() ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune") diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index da2a3172b44a..7f18d09d8e90 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -7,11 +7,11 @@ mind_control_uses = 2 mind_control_duration = 900 -/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) ..() ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") -/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0 ) REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 2857c1ab5e99..30a13107595e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -7,7 +7,7 @@ mind_control_uses = 1 mind_control_duration = 2400 -/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) ..() owner.faction |= "slime" owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 2929b2f2d865..3751279f095e 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -100,7 +100,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E -/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) ..() if(M.mind) M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 2fe7e281557a..7dd5d1ed4740 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -26,7 +26,7 @@ var/list/datum/brain_trauma/traumas = list() -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE, drop_if_replaced) +/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) ..() name = "brain" @@ -254,7 +254,7 @@ QDEL_NULL(stored_mmi) return ..() -/obj/item/organ/brain/mmi_holder/Insert(mob/living/carbon/C, special = 0, no_id_transfer = FALSE, drop_if_replaced) +/obj/item/organ/brain/mmi_holder/Insert(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) if(special) return ..() if(!stored_mmi) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 1b2e85bc999b..33e8cb7ab708 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -14,7 +14,7 @@ QDEL_LIST(alien_powers) return ..() -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) ..() for(var/obj/effect/proc_holder/alien/P in alien_powers) M.AddAbility(P) @@ -83,7 +83,7 @@ else owner.adjustPlasma(plasma_rate * 0.1) -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) ..() if(isalien(M)) var/mob/living/carbon/alien/A = M @@ -106,7 +106,7 @@ var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active. alien_powers = list(/obj/effect/proc_holder/alien/whisper) -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) ..() M.faction |= ROLE_ALIEN ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune") diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index d8df69779970..eb2663309517 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -78,7 +78,7 @@ icon_state = "brain-x-d" var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk -/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0) ..() if(M.dna.species.id != "nightmare") M.set_species(/datum/species/shadow/nightmare) @@ -124,7 +124,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0) ..() if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 7a542ff565b3..8945bac15073 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -38,7 +38,7 @@ update_icon() ..() -/obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0) ..() if(inflamed) M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 58a35593f8cb..ac97a692be41 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -129,7 +129,7 @@ var/on = FALSE var/datum/effect_system/trail_follow/ion/ion_trail -/obj/item/organ/cyberimp/chest/thrusters/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/cyberimp/chest/thrusters/Insert(mob/living/carbon/M, special = 0) . = ..() if(!ion_trail) ion_trail = new diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 6658a8aa6ec7..ea0ac2272139 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -113,7 +113,7 @@ . = ..() UnregisterSignal(M, signalCache) -/obj/item/organ/cyberimp/brain/anti_stun/Insert(special = 0, drop_if_replaced) +/obj/item/organ/cyberimp/brain/anti_stun/Insert(special = 0) . = ..() RegisterSignal(owner, signalCache, .proc/on_signal) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 7195484cd1e9..2c7a1a508605 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -136,7 +136,7 @@ else last_pump = world.time //lets be extra fair *sigh* -/obj/item/organ/heart/cursed/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/cursed/Insert(mob/living/carbon/M, special = 0) ..() if(owner) to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!") diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index c0ac47d0302b..6d84a9b31c16 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -230,7 +230,3 @@ */ /obj/item/organ/proc/get_availability(datum/species/S) return TRUE - -/// Tries to replace the existing organ on the passed mob with this one, with special handling for replacing a brain without ghosting target -/obj/item/organ/proc/replace_into(mob/living/carbon/new_owner) - Insert(new_owner, special = TRUE, drop_if_replaced = FALSE) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 92e0fcdc36e1..4d502eac9f90 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -31,7 +31,7 @@ /obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) -/obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0) ..() if (modifies_speech) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 3e1b46cc2e05..34397a98c888 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -23,7 +23,7 @@ GLOB.zombie_infection_list -= src . = ..() -/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0) . = ..() START_PROCESSING(SSobj, src) From a5bbb389234498440c3c4b523cbb71e2b5b74353 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Sun, 25 Jun 2023 11:38:12 -0700 Subject: [PATCH 35/43] final adjustment --- .../mapgen/planetary/JungleGenerator.dm | 2 +- code/datums/mapgen/planetary/LavaGenerator.dm | 4 ++-- code/datums/mapgen/planetary/RockGenerator.dm | 8 ++++---- code/datums/mapgen/planetary/SandGenerator.dm | 20 ++++++++++++------- code/datums/mapgen/planetary/SnowGenerator.dm | 4 ++-- .../datums/mapgen/planetary/WasteGenerator.dm | 4 ++-- .../antagonists/abductor/equipment/gland.dm | 2 +- .../abductor/equipment/glands/electric.dm | 2 +- .../surgery/organs/augments_internal.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 2 -- code/modules/surgery/organs/stomach.dm | 2 +- 11 files changed, 28 insertions(+), 24 deletions(-) diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index c27c1dfed5ec..86c40769cd11 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -181,7 +181,7 @@ feature_spawn_list = list( /obj/item/pickaxe/rusted = 1, /obj/structure/spawner/ice_moon = 1, - /obj/effect/spawner/lootdrop/anomaly/jungle = 0.5 + /obj/effect/spawner/lootdrop/anomaly/jungle = 1 ) /datum/biome/cave/jungle/dirt diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index f0f28a271b8d..d154063bdc17 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -160,8 +160,8 @@ feature_spawn_chance = 5 feature_spawn_list = list( /obj/structure/flora/tree/dead/barren = 50, - /obj/structure/flora/tree/dead/tall/grey = 49, - /obj/effect/spawner/lootdrop/anomaly/lava = 1 + /obj/structure/flora/tree/dead/tall/grey = 45, + /obj/effect/spawner/lootdrop/anomaly/lava = 5 ) /datum/biome/lavaland/plains/dense/mixed diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index eef0174b75bc..5496984db43a 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -85,9 +85,9 @@ feature_spawn_chance = 0.25 feature_spawn_list = list( - /obj/structure/geyser/random = 2, - /obj/structure/elite_tumor = 1, - /obj/effect/spawner/lootdrop/anomaly/rock = 0.5, + /obj/structure/geyser/random = 8, + /obj/structure/elite_tumor = 4, + /obj/effect/spawner/lootdrop/anomaly/rock = 1, /obj/effect/spawner/lootdrop/anomaly/big = 0.1 //get out of here stalker ) @@ -150,7 +150,7 @@ /obj/structure/geyser/random = 2, /obj/structure/elite_tumor = 1, /obj/structure/spawner/ice_moon/rockplanet = 4, - /obj/effect/spawner/lootdrop/anomaly/rock/cave = 0.5, + /obj/effect/spawner/lootdrop/anomaly/rock/cave = 1, ) mob_spawn_chance = 6 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index 60151e420af3..e50223744a7c 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -91,9 +91,9 @@ ) feature_spawn_chance = 0.1 feature_spawn_list = list( - /obj/structure/geyser/random = 4, - /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly/sand = 0.7, + /obj/structure/geyser/random = 8, + /obj/structure/elite_tumor = 4, + /obj/effect/spawner/lootdrop/anomaly/sand = 1, ) mob_spawn_chance = 4 mob_spawn_list = list( @@ -104,7 +104,13 @@ ) /datum/biome/sand/wasteland - open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands/lit = 50, /turf/open/floor/plating/asteroid/whitesands/dried/lit = 40, /turf/closed/mineral/random/whitesands = 20, /turf/closed/wall/mineral/titanium/survival/pod = 1, /turf/closed/wall/rust = 1) + open_turf_types = list( + /turf/open/floor/plating/asteroid/whitesands/lit = 50, + /turf/open/floor/plating/asteroid/whitesands/dried/lit = 40, + /turf/closed/mineral/random/whitesands = 20, + /turf/closed/wall/mineral/titanium/survival/pod = 1, + /turf/closed/wall/rust = 1 + ) flora_spawn_chance = 20 flora_spawn_list = list( /obj/structure/flora/ash/leaf_shroom = 4, @@ -186,9 +192,9 @@ /obj/structure/flora/ash/puce = 1, ) feature_spawn_list = list( - /obj/structure/geyser/random = 1, - /obj/structure/elite_tumor = 2, - /obj/effect/spawner/lootdrop/anomaly/sand/cave = 0.5 + /obj/structure/geyser/random = 4, + /obj/structure/elite_tumor = 4, + /obj/effect/spawner/lootdrop/anomaly/sand/cave = 1 ) mob_spawn_chance = 4 mob_spawn_list = list( diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index f694a0dad972..c021ecfce9bf 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -112,8 +112,8 @@ ) feature_spawn_chance = 0.1 feature_spawn_list = list( - /obj/effect/spawner/lootdrop/anomaly/ice = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.01, + /obj/effect/spawner/lootdrop/anomaly/ice = 12, + /obj/effect/spawner/lootdrop/anomaly/big = 1, /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25, /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13 diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index 8b6553d489cb..a660e3d35321 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -132,7 +132,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/waste = 0.5 + /obj/effect/spawner/lootdrop/anomaly/waste = 1 ) mob_spawn_list = list( @@ -315,7 +315,7 @@ /obj/effect/radiation/waste = 30, /obj/effect/radiation/waste/intense = 10, /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/waste/cave = 0.5 + /obj/effect/spawner/lootdrop/anomaly/waste/cave = 1 ) mob_spawn_list = list( /mob/living/simple_animal/hostile/hivebot/strong/rockplanet = 70, diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 13827e03912c..067d3d563ed7 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -82,7 +82,7 @@ clear_mind_control() ..() -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0) ..() if(special != 2 && uses) // Special 2 means abductor surgery Start() diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index 7f18d09d8e90..41a545b851a7 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -11,7 +11,7 @@ ..() ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") -/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0 ) +/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") ..() diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index ea0ac2272139..a7a383927b0e 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -113,7 +113,7 @@ . = ..() UnregisterSignal(M, signalCache) -/obj/item/organ/cyberimp/brain/anti_stun/Insert(special = 0) +/obj/item/organ/cyberimp/brain/anti_stun/Insert() . = ..() RegisterSignal(owner, signalCache, .proc/on_signal) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 6d84a9b31c16..637b48283c18 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -45,8 +45,6 @@ ///When you take a bite you cant jam it in for surgery anymore. /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) - SHOULD_CALL_PARENT(TRUE) - if(!iscarbon(M) || owner == M) return diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 37e117fcea09..615428d962b5 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -107,7 +107,7 @@ ..() adjust_charge(-ETHEREAL_CHARGE_FACTOR) -/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0, drop_if_replaced) +/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0) ..() RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute) From 9acc158a9435bcbe2d27181094cdf317a79cd469 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:21:28 -0700 Subject: [PATCH 36/43] Apply suggestions from code review Co-authored-by: Mark Suckerberg Signed-off-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- code/modules/research/rdconsole.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 80182d07273d..2115a3c6aba4 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -136,7 +136,7 @@ Nothing else in the console has ID requirements. return else playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("[user] inserts [E] into a slot on the [src], producting [E.research] points from the extract's chemical makeup!") + visible_message("[user] inserts [E] into a slot on the [src]!", "You insert [E] into a slot on the [src], producting [E.research] points from the extract's chemical makeup!") stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = E.research)) slime_already_researched[E.type] = TRUE qdel(D) @@ -155,7 +155,7 @@ Nothing else in the console has ID requirements. return else playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("[user] inserts [E] into a slot on the [src], producting [E.research] points from the plant's genetic makeup!") + visible_message("[user] inserts [E] into a slot on the [src]!", "You insert [E] into a slot on the [src], producting [E.research] points from the plant's genetic makeup!") stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = E.research)) plant_already_researched[E.type] = TRUE qdel(D) @@ -172,7 +172,7 @@ Nothing else in the console has ID requirements. return playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("[user] inserts [anomaly] into a slot on the [src], producting [anomaly.research] points!") + visible_message("[user] inserts [anomaly] into a slot on the [src]!", "You insert [anomaly] into a slot on the [src], producting [anomaly.research] points!") stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = anomaly.research)) qdel(anomaly) return From a9f17f1c4018dd922b162664e8b9995f8e9913af Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:23:20 -0700 Subject: [PATCH 37/43] Update code/modules/mob/living/carbon/status_procs.dm Co-authored-by: Mark Suckerberg Signed-off-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- code/modules/mob/living/carbon/status_procs.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index b9de8a68ba2a..1f8021859431 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -96,6 +96,5 @@ B.break_bone() /mob/living/carbon/proc/break_random_bone() //this might work - var/obj/item/bodypart/B = get_bodypart() - for(B in bodyparts) - B.break_bone() + var/obj/item/bodypart/limb = pick(bodyparts) + limb.break_bone From 1c22c7d49b0f0558177090bb55d1c315cfa4d245 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:23:28 -0700 Subject: [PATCH 38/43] Update code/game/objects/effects/anomalies/anomalies_bluespace.dm Co-authored-by: Mark Suckerberg Signed-off-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- code/game/objects/effects/anomalies/anomalies_bluespace.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index 247770156dd8..58267030960e 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -86,7 +86,7 @@ blueeffect.plane = FULLSCREEN_PLANE blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT M.client.screen += blueeffect - sleep(20) + stoplag(20) M.client.screen -= blueeffect qdel(blueeffect) From 938e7e6e7289856545b44c92e7326aeeaf23f1e2 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:30:35 -0700 Subject: [PATCH 39/43] Update code/game/objects/effects/anomalies/anomalies_vortex.dm Co-authored-by: Mark Suckerberg Signed-off-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- code/game/objects/effects/anomalies/anomalies_vortex.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm index c2e6cfd01b40..16a30cbaa9c6 100644 --- a/code/game/objects/effects/anomalies/anomalies_vortex.dm +++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm @@ -26,7 +26,7 @@ SSexplosions.medobj += O /obj/effect/anomaly/vortex/proc/grav(r, ex_act_force, pull_chance, turf_removal_chance) - for(var/t = -r, t < r, t++) + for(var/t in -r to r) affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) From 142ffb83e7531dbee6c99fa4330ece87db1b7d74 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:33:09 -0700 Subject: [PATCH 40/43] Update anomalies_hallucination.dm --- .../game/objects/effects/anomalies/anomalies_hallucination.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 10f580273d86..74ead14d263d 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -27,8 +27,8 @@ /obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, effectrange) for(var/mob/living/carbon/human/near in view(location, effectrange)) - // If they are immune to hallucinations. - if (HAS_TRAIT(near, SEE_TURFS) || (near.mind && HAS_TRAIT(near.mind, SEE_TURFS))) + // If they are immune to the anomaly + if (iscarbon(user) && !user.research_scanner) continue // Blind people don't get hallucinations. From 0fc9b3009342b8653f3bbf3081643313b8151d2b Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:38:32 -0700 Subject: [PATCH 41/43] changes --- code/game/objects/effects/anomalies/anomalies_hallucination.dm | 2 +- code/modules/mob/living/carbon/status_procs.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 74ead14d263d..6cfd44cd1c48 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -26,7 +26,7 @@ . = ..() /obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, effectrange) - for(var/mob/living/carbon/human/near in view(location, effectrange)) + for(var/mob/living/carbon/human/user in view(location, effectrange)) // If they are immune to the anomaly if (iscarbon(user) && !user.research_scanner) continue diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 1f8021859431..cc15c12d836e 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -97,4 +97,4 @@ /mob/living/carbon/proc/break_random_bone() //this might work var/obj/item/bodypart/limb = pick(bodyparts) - limb.break_bone + limb.break_bone() From 2cbc9be07e89a7446d29fcab6c5a8808b85c8aa8 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:48:09 -0700 Subject: [PATCH 42/43] Update anomalies_hallucination.dm --- .../effects/anomalies/anomalies_hallucination.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index 6cfd44cd1c48..fc7e4e3c9859 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -32,20 +32,20 @@ continue // Blind people don't get hallucinations. - if (near.is_blind()) + if (user.is_blind()) continue // Everyone else gets hallucinations. - var/dist = sqrt(1 / max(1, get_dist(near, location))) - near.hallucination += 50 * dist - near.hallucination = clamp(near.hallucination, 0, 150) + var/dist = sqrt(1 / max(1, get_dist(user, location))) + user.hallucination += 50 * dist + user.hallucination = clamp(user.hallucination, 0, 150) var/list/messages = list( "You feel your conscious mind fall apart!", "Reality warps around you!", "Something's wispering around you!", "You are going insane!", ) - to_chat(near, span_warning(pick(messages))) + to_chat(user, span_warning(pick(messages))) /obj/effect/anomaly/hallucination/planetary immortal = TRUE From 6b03aaba8127400cae7ef55437d87f5f2f0e8a7b Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Mon, 26 Jun 2023 22:19:57 -0700 Subject: [PATCH 43/43] Update _anomalies.dm --- code/game/objects/effects/anomalies/_anomalies.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index df1e8c650af1..6d1c3ad7f082 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -132,7 +132,7 @@ /obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) - to_chat(user, span_notice("Analyzing...")) + to_chat(user, span_notice("You start analyzing [src].")) if(do_after(user, 20, TRUE, src)) to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) if(bSignal)