From e0758794a6a578356f2041212cf35db6bc45c66a Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Fri, 13 May 2022 14:09:30 +0100 Subject: [PATCH] Removes shadowlings. Does not add anything else to compensate. (#17467) --- code/__DEFINES/gamemode.dm | 2 - code/__DEFINES/mobs.dm | 2 - code/__DEFINES/role_preferences.dm | 2 - code/__DEFINES/rolebans.dm | 1 - .../sections/gamemode_configuration.dm | 3 - code/controllers/subsystem/afk.dm | 3 +- code/controllers/subsystem/ticker.dm | 2 +- code/datums/mind.dm | 51 -- .../shadowling/ascendant_shadowling.dm | 56 -- code/game/gamemodes/shadowling/shadowling.dm | 337 ------- .../shadowling/shadowling_abilities.dm | 867 ------------------ .../gamemodes/shadowling/shadowling_items.dm | 85 -- .../special_shadowling_abilities.dm | 195 ---- code/game/jobs/job_exp.dm | 1 - code/game/machinery/cloning.dm | 2 - .../objects/items/weapons/holy_weapons.dm | 22 - .../weapons/implants/implant_mindshield.dm | 5 - code/game/objects/structures/aliens.dm | 5 - code/modules/admin/admin.dm | 6 +- code/modules/admin/player_panel.dm | 6 - code/modules/client/preference/preferences.dm | 1 - code/modules/mob/dead/observer/orbit.dm | 2 - code/modules/mob/dead/observer/spells.dm | 6 +- code/modules/mob/language.dm | 16 - .../mob/living/carbon/human/examine.dm | 3 - .../living/carbon/human/species/shadowling.dm | 75 -- code/modules/mob/living/silicon/login.dm | 2 - .../living/simple_animal/posessed_object.dm | 4 +- code/modules/mob/mob_helpers.dm | 2 - code/modules/surgery/organs/organ_internal.dm | 30 - code/modules/surgery/other.dm | 100 -- config/example/config.toml | 3 - goon/browserassets/css/browserOutput-dark.css | 1 - goon/browserassets/css/browserOutput.css | 1 - icons/mob/hud.dmi | Bin 15924 -> 15920 bytes icons/mob/human_races/r_shadowling.dmi | Bin 1723 -> 0 bytes icons/obj/surgery.dmi | Bin 40723 -> 40420 bytes paradise.dme | 6 - 38 files changed, 8 insertions(+), 1897 deletions(-) delete mode 100644 code/game/gamemodes/shadowling/ascendant_shadowling.dm delete mode 100644 code/game/gamemodes/shadowling/shadowling.dm delete mode 100644 code/game/gamemodes/shadowling/shadowling_abilities.dm delete mode 100644 code/game/gamemodes/shadowling/shadowling_items.dm delete mode 100644 code/game/gamemodes/shadowling/special_shadowling_abilities.dm delete mode 100644 code/modules/mob/living/carbon/human/species/shadowling.dm delete mode 100644 icons/mob/human_races/r_shadowling.dmi diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index 02fc864d292..a8d014371e1 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -38,8 +38,6 @@ #define SPECIAL_ROLE_NUKEOPS "Syndicate" #define SPECIAL_ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime" #define SPECIAL_ROLE_REVENANT "Revenant" -#define SPECIAL_ROLE_SHADOWLING "Shadowling" -#define SPECIAL_ROLE_SHADOWLING_THRALL "Shadowling Thrall" #define SPECIAL_ROLE_SLAUGHTER_DEMON "Slaughter Demon" #define SPECIAL_ROLE_SUPER "Super" #define SPECIAL_ROLE_SYNDICATE_DEATHSQUAD "Syndicate Commando" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 21edc27d6db..18e795f0f06 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -209,8 +209,6 @@ #define UNHEALING_EAR_DAMAGE 100 //Human sub-species -#define isshadowling(A) (is_species(A, /datum/species/shadow/ling)) -#define isshadowlinglesser(A) (is_species(A, /datum/species/shadow/ling/lesser)) #define isabductor(A) (is_species(A, /datum/species/abductor)) #define isgolem(A) (is_species(A, /datum/species/golem)) #define ismonkeybasic(A) (is_species(A, /datum/species/monkey)) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index d6597343e46..cb804dbbb18 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -21,7 +21,6 @@ #define ROLE_NINJA "space ninja" #define ROLE_MONKEY "monkey" #define ROLE_GANG "gangster" -#define ROLE_SHADOWLING "shadowling" #define ROLE_ABDUCTOR "abductor" #define ROLE_REVENANT "revenant" #define ROLE_HOG_GOD "hand of god: god" // We're prolly gonna port this one day or another @@ -66,7 +65,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_REVENANT, // Revenant ROLE_REV = /datum/game_mode/revolution, // Revolutionary ROLE_SENTIENT, // Sentient animal - ROLE_SHADOWLING = /datum/game_mode/shadowling, // Shadowling ROLE_DEMON, // Slaguther demon ROLE_NINJA, // Space ninja ROLE_TRADER, // Trader diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm index 20f5e758dc1..8fe08b0afcb 100644 --- a/code/__DEFINES/rolebans.dm +++ b/code/__DEFINES/rolebans.dm @@ -9,7 +9,6 @@ GLOBAL_LIST_INIT(antag_roles, list( ROLE_CULTIST, ROLE_BLOB, ROLE_NINJA, - ROLE_SHADOWLING, ROLE_VAMPIRE, ROLE_BORER, ROLE_DEMON, diff --git a/code/controllers/configuration/sections/gamemode_configuration.dm b/code/controllers/configuration/sections/gamemode_configuration.dm index d09e02b5c29..4f427a2488b 100644 --- a/code/controllers/configuration/sections/gamemode_configuration.dm +++ b/code/controllers/configuration/sections/gamemode_configuration.dm @@ -10,8 +10,6 @@ var/list/votable_modes = list() /// Should antags be restricted based on account age? var/antag_account_age_restriction = FALSE - /// Max age (in SSmobs cycles, [2 seconds]) before a shadowling starts to take damage if they have not hatched - var/shadowling_max_age = 600 // 20 mins /// Scale amount of traitors with population var/traitor_scaling = TRUE /// Prevent mindshield roles getting antagonist status @@ -55,7 +53,6 @@ CONFIG_LOAD_BOOL(enable_gamemode_player_limit, data["enable_gamemode_player_limit"]) CONFIG_LOAD_NUM(traitor_objectives_amount, data["traitor_objective_amount"]) - CONFIG_LOAD_NUM(shadowling_max_age, data["shadowling_max_age"]) // Load gamemode probabilities if(islist(data["gamemode_probabilities"])) diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm index c7042513e49..c9cf44a48d2 100644 --- a/code/controllers/subsystem/afk.dm +++ b/code/controllers/subsystem/afk.dm @@ -16,8 +16,7 @@ SUBSYSTEM_DEF(afk) if(GLOB.configuration.afk.warning_minutes <= 0 || GLOB.configuration.afk.auto_cryo_minutes <= 0 || GLOB.configuration.afk.auto_despawn_minutes <= 0) flags |= SS_NO_FIRE else - non_cryo_antags = list(SPECIAL_ROLE_ABDUCTOR_AGENT, SPECIAL_ROLE_ABDUCTOR_SCIENTIST, \ - SPECIAL_ROLE_SHADOWLING, SPECIAL_ROLE_WIZARD, SPECIAL_ROLE_WIZARD_APPRENTICE, SPECIAL_ROLE_NUKEOPS) + non_cryo_antags = list(SPECIAL_ROLE_ABDUCTOR_AGENT, SPECIAL_ROLE_ABDUCTOR_SCIENTIST, SPECIAL_ROLE_WIZARD, SPECIAL_ROLE_WIZARD_APPRENTICE, SPECIAL_ROLE_NUKEOPS) return ..() /datum/controller/subsystem/afk/fire() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 30f804868e1..21b5c44dd20 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -57,7 +57,7 @@ SUBSYSTEM_DEF(ticker) var/round_end_announced = FALSE /// Is the ticker currently processing? If FALSE, roundstart is delayed var/ticker_going = TRUE - /// Gamemode result (For things like shadowlings or nukies which can end multiple ways) + /// Gamemode result (For things like cult or nukies which can end multiple ways) var/mode_result = "undefined" /// Server end state (Did we end properly or reboot or nuke or what) var/end_state = "undefined" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b902f712153..1464d037a32 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -323,17 +323,6 @@ . += _memory_edit_role_enabled(ROLE_OPERATIVE) -/datum/mind/proc/memory_edit_shadowling(mob/living/carbon/human/H) - . = _memory_edit_header("shadowling") - if(src in SSticker.mode.shadows) - . += "SHADOWLING|thrall|no" - else if(src in SSticker.mode.shadowling_thralls) - . += "Shadowling|THRALL|no" - else - . += "shadowling|thrall|NO" - - . += _memory_edit_role_enabled(ROLE_SHADOWLING) - /datum/mind/proc/memory_edit_abductor(mob/living/carbon/human/H) . = _memory_edit_header("abductor") if(src in SSticker.mode.abductors) @@ -472,8 +461,6 @@ sections["vampire"] = memory_edit_vampire(H) /** NUCLEAR ***/ sections["nuclear"] = memory_edit_nuclear(H) - /** SHADOWLING **/ - sections["shadowling"] = memory_edit_shadowling(H) /** Abductors **/ sections["abductor"] = memory_edit_abductor(H) sections["eventmisc"] = memory_edit_eventmisc(H) @@ -1339,44 +1326,6 @@ log_admin("[key_name(usr)] has de-mindslaved [key_name(current)]") message_admins("[key_name_admin(usr)] has de-mindslaved [key_name_admin(current)]") - else if(href_list["shadowling"]) - switch(href_list["shadowling"]) - if("clear") - SSticker.mode.update_shadow_icons_removed(src) - if(src in SSticker.mode.shadows) - SSticker.mode.shadows -= src - special_role = null - to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") - message_admins("[key_name_admin(usr)] has de-shadowlinged [current].") - log_admin("[key_name(usr)] has de-shadowlinged [current].") - current.spellremove(current) - current.remove_language("Shadowling Hivemind") - else if(src in SSticker.mode.shadowling_thralls) - SSticker.mode.remove_thrall(src,0) - message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") - log_admin("[key_name(usr)] has de-thralled [key_name(current)]") - message_admins("[key_name_admin(usr)] has de-thralled [key_name_admin(current)]") - if("shadowling") - if(!ishuman(current)) - to_chat(usr, "This only works on humans!") - return - SSticker.mode.shadows += src - special_role = SPECIAL_ROLE_SHADOWLING - to_chat(current, "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ - time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ - ") - SSticker.mode.finalize_shadowling(src) - SSticker.mode.update_shadow_icons_added(src) - log_admin("[key_name(usr)] has shadowlinged [key_name(current)]") - message_admins("[key_name_admin(usr)] has shadowlinged [key_name_admin(current)]") - if("thrall") - if(!ishuman(current)) - to_chat(usr, "This only works on humans!") - return - SSticker.mode.add_thrall(src) - message_admins("[key_name_admin(usr)] has thralled [current].") - log_admin("[key_name(usr)] has thralled [current].") - else if(href_list["abductor"]) switch(href_list["abductor"]) if("clear") diff --git a/code/game/gamemodes/shadowling/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm deleted file mode 100644 index e4f6f7de4ab..00000000000 --- a/code/game/gamemodes/shadowling/ascendant_shadowling.dm +++ /dev/null @@ -1,56 +0,0 @@ -/mob/living/simple_animal/ascendant_shadowling - name = "ascendant shadowling" - desc = "A large, floating eldritch horror. It has pulsing markings all about its body and large horns. It seems to be floating without any form of support." - icon = 'icons/mob/mob.dmi' - icon_state = "shadowling_ascended" - icon_living = "shadowling_ascended" - speak = list("Azima'dox", "Mahz'kavek", "N'ildzak", "Kaz'vadosh") - speak_emote = list("telepathically thunders", "telepathically booms") - force_threshold = INFINITY //Can't die by normal means - health = 100000 - maxHealth = 100000 - speed = 0 - var/phasing = 0 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - - universal_speak = 1 - - response_help = "stares at" - response_disarm = "flails at" - response_harm = "flails at" - - harm_intent_damage = 0 - melee_damage_lower = 60 //Was 35, buffed - melee_damage_upper = 60 - attacktext = "rends" - attack_sound = 'sound/weapons/slash.ogg' - - minbodytemp = 0 - maxbodytemp = INFINITY - environment_smash = ENVIRONMENT_SMASH_RWALLS - - faction = list("faithless") - -/mob/living/simple_animal/ascendant_shadowling/New() - ..() - if(prob(35)) - icon_state = "NurnKal" - icon_living = "NurnKal" - -/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(movement_dir = 0) - return 1 //copypasta from carp code - -/mob/living/simple_animal/ascendant_shadowling/ex_act(severity) - return //You think an ascendant can be hurt by bombs? HA - -/mob/living/simple_animal/ascendant_shadowling/singularity_act() - return 0 //Well hi, fellow god! How are you today? - -/mob/living/simple_animal/ascendant_shadowling/proc/announce(text, size = 4, new_sound = null) - var/message = "\"[text]\"" - for(var/mob/M in GLOB.player_list) - if(!isnewplayer(M) && M.client) - to_chat(M, message) - if(new_sound) - M << new_sound diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm deleted file mode 100644 index 82931a5bce6..00000000000 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ /dev/null @@ -1,337 +0,0 @@ -#define LIGHT_DAM_THRESHOLD 4 -#define LIGHT_HEAL_THRESHOLD 2 -#define LIGHT_DAMAGE_TAKEN 7 - -/* - -SHADOWLING: A gamemode based on previously-run events - -Aliens called shadowlings are on the station. -These shadowlings can 'enthrall' crew members and enslave them. -They also burn in the light but heal rapidly whilst in the dark. -The game will end under two conditions: - 1. The shadowlings die - 2. The emergency shuttle docks at CentCom - -Shadowling strengths: - - The dark - - Hard vacuum (They are not affected by it) - - Their thralls who are not harmed by the light - - Stealth - -Shadowling weaknesses: - - The light - - Fire - - Enemy numbers - - Lasers (Lasers are concentrated light and do more damage) - - Flashbangs (High stun and high burn damage; if the light stuns humans, you bet your ass it'll hurt the shadowling very much!) - -Shadowlings start off disguised as normal crew members, and they only have two abilities: Hatch and Enthrall. -They can still enthrall and perhaps complete their objectives in this form. -Hatch will, after a short time, cast off the human disguise and assume the shadowling's true identity. -They will then assume the normal shadowling form and gain their abilities. - -The shadowling will seem OP, and that's because it kinda is. Being restricted to the dark while being alone most of the time is extremely difficult and as such the shadowling needs powerful abilities. -Made by Xhuis - -*/ - - - -/* - GAMEMODE -*/ - - -/datum/game_mode - var/list/datum/mind/shadows = list() - var/list/datum/mind/shadowling_thralls = list() - var/list/shadow_objectives = list() - var/required_thralls = 15 //How many thralls are needed (hardcoded for now) - var/shadowling_ascended = 0 //If at least one shadowling has ascended - var/shadowling_dead = 0 //is shadowling kill - var/objective_explanation - var/warning_threshold - var/victory_warning_announced = FALSE - var/thrall_ratio = 1 - -/proc/is_thrall(mob/living/M) - return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadowling_thralls) - - -/proc/is_shadow_or_thrall(mob/living/M) - return istype(M) && M.mind && SSticker && SSticker.mode && ((M.mind in SSticker.mode.shadowling_thralls) || (M.mind in SSticker.mode.shadows)) - - -/proc/is_shadow(mob/living/M) - return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadows) - - -/datum/game_mode/shadowling - name = "shadowling" - config_tag = "shadowling" - required_players = 30 - required_enemies = 2 - recommended_enemies = 2 - restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Magistrate", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General") - -/datum/game_mode/shadowling/announce() - to_chat(world, "The current game mode is - Shadowling!") - to_chat(world, "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding.") - -/datum/game_mode/shadowling/pre_setup() - if(GLOB.configuration.gamemode.prevent_mindshield_antags) - restricted_jobs += protected_jobs - - var/list/datum/mind/possible_shadowlings = get_players_for_role(ROLE_SHADOWLING) - - if(!possible_shadowlings.len) - return 0 - - var/shadowlings = max(3, round(num_players()/14)) - - while(shadowlings) - var/datum/mind/shadow = pick(possible_shadowlings) - shadows += shadow - possible_shadowlings -= shadow - modePlayer += shadow - shadow.special_role = SPECIAL_ROLE_SHADOWLING - shadow.restricted_roles = restricted_jobs - shadowlings-- - - var/thrall_scaling = round(num_players() / 3) - required_thralls = clamp(thrall_scaling, 15, 25) - thrall_ratio = required_thralls / 15 - - warning_threshold = round(0.66 * required_thralls) - - ..() - return 1 - - -/datum/game_mode/shadowling/post_setup() - for(var/datum/mind/shadow in shadows) - log_game("[key_name(shadow)] has been selected as a Shadowling.") - spawn(rand(10,100)) - to_chat(shadow.current, "
") - to_chat(shadow.current, "You are a shadowling!") - greet_shadow(shadow) - finalize_shadowling(shadow) - process_shadow_objectives(shadow) - //give_shadowling_abilities(shadow) - ..() - -/datum/game_mode/proc/greet_shadow(datum/mind/shadow) - to_chat(shadow.current, "Currently, you are disguised as an employee aboard [station_name()].") - to_chat(shadow.current, "In your limited state, you have two abilities: Hatch and Shadowling Hivemind (:8).") - to_chat(shadow.current, "Any other shadowlings are your allies. You must assist them as they shall assist you.") - to_chat(shadow.current, "For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Shadowling)") - - -/datum/game_mode/proc/process_shadow_objectives(datum/mind/shadow_mind) - var/objective = "enthrall" //may be devour later, but for now it seems murderbone-y - - if(objective == "enthrall") - objective_explanation = "Ascend to your true form by use of the Ascendance ability. This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." - shadow_objectives += "enthrall" - shadow_mind.memory += "Objective #1: [objective_explanation]" - to_chat(shadow_mind.current, "Objective #1: [objective_explanation]
") - - -/datum/game_mode/proc/finalize_shadowling(datum/mind/shadow_mind) - var/mob/living/carbon/human/S = shadow_mind.current - shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/shadowling_hatch(null)) - spawn(0) - shadow_mind.current.add_language("Shadowling Hivemind") - update_shadow_icons_added(shadow_mind) - if(shadow_mind.assigned_role == "Clown") - to_chat(S, "Your alien nature has allowed you to overcome your clownishness.") - S.dna.SetSEState(GLOB.clumsyblock, FALSE) - singlemutcheck(S, GLOB.clumsyblock, MUTCHK_FORCED) - -/datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) - if(!istype(new_thrall_mind)) - return 0 - if(!(new_thrall_mind in shadowling_thralls)) - shadowling_thralls += new_thrall_mind - new_thrall_mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL - update_shadow_icons_added(new_thrall_mind) - new_thrall_mind.current.create_attack_log("Became a thrall") - new_thrall_mind.current.create_log(CONVERSION_LOG, "Became a thrall") - new_thrall_mind.current.add_language("Shadowling Hivemind") - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/lesser_shadow_walk(null)) - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/shadow_vision(null)) - to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been.") - to_chat(new_thrall_mind.current, "The shadowlings are your masters. Serve them above all else and ensure they complete their goals.") - to_chat(new_thrall_mind.current, "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.") - to_chat(new_thrall_mind.current, "Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask.") - to_chat(new_thrall_mind.current, "Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab.") - to_chat(new_thrall_mind.current, "You may communicate with your allies by speaking in the Shadowling Hivemind (:8).") - to_chat(new_thrall_mind.current, "For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Shadowling)") - if(jobban_isbanned(new_thrall_mind.current, ROLE_SHADOWLING) || jobban_isbanned(new_thrall_mind.current, ROLE_SYNDICATE)) - replace_jobbanned_player(new_thrall_mind.current, ROLE_SHADOWLING) - if(!victory_warning_announced && (length(shadowling_thralls) >= warning_threshold))//are the slings very close to winning? - victory_warning_announced = TRUE //then let's give the station a warning - GLOB.command_announcement.Announce("Hostile bluespace entities are attempting to transcend existence aboard [station_name()]. Disrupt the ascension at all costs, before the station is destroyed! Space law and SOP are suspended. The entire crew must kill shadowlings and their thralls on sight.", "Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg') - return 1 - -/datum/game_mode/proc/remove_thrall(datum/mind/thrall_mind, kill = 0) - if(!istype(thrall_mind) || !(thrall_mind in shadowling_thralls) || !isliving(thrall_mind.current)) - return 0 //If there is no mind, the mind isn't a thrall, or the mind's mob isn't alive, return - shadowling_thralls.Remove(thrall_mind) - thrall_mind.current.create_attack_log("Dethralled") - thrall_mind.current.create_log(CONVERSION_LOG, "Dethralled") - thrall_mind.special_role = null - update_shadow_icons_removed(thrall_mind) - for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list) - thrall_mind.RemoveSpell(S) - thrall_mind.current.remove_language("Shadowling Hivemind") - if(kill && ishuman(thrall_mind.current)) //If dethrallization surgery fails, kill the mob as well as dethralling them - var/mob/living/carbon/human/H = thrall_mind.current - H.visible_message("[H] jerks violently and falls still.", \ - "A piercing white light floods your mind, banishing your memories as a thrall and--") - H.death() - return 1 - var/mob/living/M = thrall_mind.current - if(issilicon(M)) - M.audible_message("[M] lets out a short blip.") - to_chat(M, "You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...") - else - M.visible_message("[M] looks like [M.p_their()] mind is [M.p_their()] own again!", \ - "A piercing white light floods your eyes. Your mind is your own again! Though you try, you cannot remember anything about the shadowlings or your time \ - under their command...") - return 1 - - -/* - GAME FINISH CHECKS -*/ - -/datum/game_mode/shadowling/check_finished() - var/shadows_alive = 0 //and then shadowling was kill - for(var/datum/mind/shadow in shadows) //but what if shadowling was not kill? - if(!ishuman(shadow.current) && !istype(shadow.current,/mob/living/simple_animal/ascendant_shadowling)) - continue - if(shadow.current.stat == DEAD) - continue - shadows_alive++ - if(shadow.special_role == SPECIAL_ROLE_SHADOWLING && GLOB.configuration.gamemode.shadowling_max_age) - if(ishuman(shadow.current)) - var/mob/living/carbon/human/H = shadow.current - if(!isshadowling(H)) - for(var/obj/effect/proc_holder/spell/shadowling_hatch/hatch_ability in shadow.spell_list) - hatch_ability.cycles_unused++ - if(!H.stunned && prob(20) && hatch_ability.cycles_unused > GLOB.configuration.gamemode.shadowling_max_age) - var/shadow_nag_messages = list("You can barely hold yourself in this lesser form!", "The urge to become something greater is overwhelming!", "You feel a burning passion to hatch free of this shell and assume godhood!") - H.take_overall_damage(0, 3) - to_chat(H, "[pick(shadow_nag_messages)]") - SEND_SOUND(H, sound('sound/weapons/sear.ogg')) - - if(shadows_alive) - return ..() - else - shadowling_dead = 1 //but shadowling was kill :( - return 1 - -/datum/game_mode/proc/remove_shadowling(datum/mind/ling_mind) - if(!istype(ling_mind) || !(ling_mind in shadows)) return 0 - update_shadow_icons_removed(ling_mind) - shadows.Remove(ling_mind) - ling_mind.current.create_attack_log("Deshadowlinged") - ling_mind.current.create_log(CONVERSION_LOG, "Deshadowlinged") - ling_mind.special_role = null - for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list) - ling_mind.RemoveSpell(S) - var/mob/living/M = ling_mind.current - if(issilicon(M)) - M.audible_message("[M] lets out a short blip.") - to_chat(M, "You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...") - else - M.visible_message("[M] screams and contorts!", \ - "THE LIGHT-- YOUR MIND-- BURNS--") - spawn(30) - if(!M || QDELETED(M)) - return - M.visible_message("[M] suddenly bloats and explodes!", \ - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA----") - playsound(M, 'sound/magic/disintegrate.ogg', 100, 1) - M.gib() - -/datum/game_mode/shadowling/proc/check_shadow_victory() - var/success = 0 //Did they win? - if(shadow_objectives.Find("enthrall")) - success = shadowling_ascended - return success - - -/datum/game_mode/shadowling/declare_completion() - if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X - SSticker.mode_result = "shadowling win - shadowling ascension" - to_chat(world, "Shadowling Victory") - to_chat(world, "The shadowlings have ascended and taken over the station!") - else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round - SSticker.mode_result = "shadowling loss - shadowling killed" - to_chat(world, "Crew Major Victory") - to_chat(world, "The shadowlings have been killed by the crew!") - else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) - SSticker.mode_result = "shadowling loss - crew escaped" - to_chat(world, "Crew Minor Victory") - to_chat(world, "The crew escaped the station before the shadowlings could ascend!") - else - SSticker.mode_result = "shadowling loss - generic failure" - to_chat(world, "Crew Major Victory") - to_chat(world, "The shadowlings have failed!") - ..() - return 1 - - -/datum/game_mode/proc/auto_declare_completion_shadowling() - var/text = "" - if(shadows.len) - text += "
The shadowlings were:" - for(var/datum/mind/shadow in shadows) - text += "
[shadow.key] was [shadow.name] (" - if(shadow.current) - if(shadow.current.stat == DEAD) - text += "died" - else - text += "survived" - if(shadow.current.real_name != shadow.name) - text += " as [shadow.current.real_name]" - else - text += "body destroyed" - text += ")" - text += "
" - if(shadowling_thralls.len) - text += "
The thralls were:" - for(var/datum/mind/thrall in shadowling_thralls) - text += "
[thrall.key] was [thrall.name] (" - if(thrall.current) - if(thrall.current.stat == DEAD) - text += "died" - else - text += "survived" - if(thrall.current.real_name != thrall.name) - text += " as [thrall.current.real_name]" - else - text += "body destroyed" - text += ")" - text += "
" - to_chat(world, text) - - -/* - MISCELLANEOUS -*/ - -/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind) - var/datum/atom_hud/antag/shadow_hud = GLOB.huds[ANTAG_HUD_SHADOW] - shadow_hud.join_hud(shadow_mind.current) - set_antag_hud(shadow_mind.current, ((shadow_mind in shadows) ? "hudshadowling" : "hudshadowlingthrall")) - - -/datum/game_mode/proc/update_shadow_icons_removed(datum/mind/shadow_mind) //This should never actually occur, but it's here anyway. - var/datum/atom_hud/antag/shadow_hud = GLOB.huds[ANTAG_HUD_SHADOW] - shadow_hud.leave_hud(shadow_mind.current) - set_antag_hud(shadow_mind.current, null) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm deleted file mode 100644 index 4b1ee7344ad..00000000000 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ /dev/null @@ -1,867 +0,0 @@ -#define EMPOWERED_THRALL_LIMIT 5 - -/obj/effect/proc_holder/spell/proc/shadowling_check(mob/living/carbon/human/H) - if(!H || !istype(H)) - return - if(H.incorporeal_move == 1) - to_chat(H, "You can't use abilities affecting others while you are traversing between worlds!") - return FALSE - if(isshadowling(H) && is_shadow(H)) - return 1 - if(isshadowlinglesser(H) && is_thrall(H)) - return 1 - if(!is_shadow_or_thrall(H)) - to_chat(H, "You can't wrap your head around how to do this.") - else if(is_thrall(H)) - to_chat(H, "You aren't powerful enough to do this.") - else if(is_shadow(H)) - to_chat(H, "Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first.") - return 0 - - -/obj/effect/proc_holder/spell/glare //Stuns and mutes a human target, depending on the distance relative to the shadowling - name = "Glare" - desc = "Stuns and mutes a target for a decent duration. Duration depends on the proximity to the target." - panel = "Shadowling Abilities" - charge_max = 300 - clothes_req = FALSE - action_icon_state = "glare" - - selection_activated_message = "Your prepare to your eyes for a stunning glare! Left-click to cast at a target!" - selection_deactivated_message = "Your eyes relax... for now." - -/obj/effect/proc_holder/spell/glare/create_new_targeting() - var/datum/spell_targeting/click/T = new() - T.range = 10 - return T - -/obj/effect/proc_holder/spell/glare/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/glare/valid_target(mob/living/carbon/human/target, user) - return !target.stat && !is_shadow_or_thrall(target) - -/obj/effect/proc_holder/spell/glare/cast(list/targets, mob/user = usr) - var/mob/living/carbon/human/H = targets[1] - - user.visible_message("[user]'s eyes flash a blinding red!") - var/distance = get_dist(H, user) - if (distance <= 1) //Melee glare - H.visible_message("[H] freezes in place, [H.p_their()] eyes glazing over...", \ - "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by [user.p_their()] heavenly beauty...") - H.Stun(10) - H.AdjustSilence(10) - else //Distant glare - var/loss = 10 - distance - var/duration = 10 - loss - if(loss <= 0) - to_chat(user, "Your glare had no effect over a such long distance!") - return - H.slowed = duration - H.AdjustSilence(10) - to_chat(H, "A red light flashes across your vision, and your mind tries to resist them.. you are exhausted.. you are not able to speak..") - addtimer(CALLBACK(src, .proc/do_stun, H, user, loss), duration SECONDS) - -/obj/effect/proc_holder/spell/glare/proc/do_stun(mob/living/carbon/human/target, user, stun_time) - if(!istype(target) || target.stat) - return - target.Stun(stun_time) - target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...",\ - "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") - -/obj/effect/proc_holder/spell/aoe_turf/veil - name = "Veil" - desc = "Extinguishes most nearby light sources." - panel = "Shadowling Abilities" - charge_max = 150 //Short cooldown because people can just turn the lights back on - clothes_req = 0 - var/blacklisted_lights = list(/obj/item/flashlight/flare, /obj/item/flashlight/slime) - action_icon_state = "veil" - -/obj/effect/proc_holder/spell/aoe_turf/veil/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - T.range = 5 - return T - -/obj/effect/proc_holder/spell/aoe_turf/veil/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets, mob/user = usr) - to_chat(user, "You silently disable all nearby lights.") - for(var/obj/structure/glowshroom/G in orange(2, user)) //Why the fuck was this in the loop below? - G.visible_message("[G] withers away!") - qdel(G) - for(var/turf/T in targets) - T.extinguish_light() - for(var/atom/A in T.contents) - A.extinguish_light() - -/obj/effect/proc_holder/spell/shadow_walk - name = "Shadow Walk" - desc = "Phases you into the space between worlds for a short time, allowing movement through walls and invisbility." - panel = "Shadowling Abilities" - charge_max = 300 //Used to be twice this, buffed - clothes_req = 0 - action_icon_state = "shadow_walk" - -/obj/effect/proc_holder/spell/shadow_walk/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadow_walk/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/shadow_walk/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) - target.visible_message("[target] vanishes in a puff of black mist!", "You enter the space between worlds as a passageway.") - target.SetStunned(0) - target.SetWeakened(0) - target.incorporeal_move = 1 - target.alpha = 0 - target.ExtinguishMob() - var/turf/T = get_turf(target) - target.forceMove(T) //to properly move the mob out of a potential container - if(target.pulledby) - target.pulledby.stop_pulling() - target.stop_pulling() - sleep(40) //4 seconds - target.visible_message("[target] suddenly manifests!", "The pressure becomes too much and you vacate the interdimensional darkness.") - target.incorporeal_move = 0 - target.alpha = 255 - target.forceMove(user.loc) - -/obj/effect/proc_holder/spell/lesser_shadow_walk - name = "Guise" - desc = "Wraps your form in shadows, making you harder to see." - panel = "Thrall Abilities" - charge_max = 1200 - clothes_req = 0 - action_icon_state = "shadow_walk" - -/obj/effect/proc_holder/spell/lesser_shadow_walk/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/lesser_shadow_walk/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - target.visible_message("[target] suddenly fades away!", "You veil yourself in darkness, making you harder to see.") - target.alpha = 10 - sleep(40) - target.visible_message("[target] appears from nowhere!", "Your shadowy guise slips away.") - target.alpha = initial(target.alpha) - - -/obj/effect/proc_holder/spell/shadow_vision - name = "Thrall Darksight" - desc = "Gives you night vision." - panel = "Thrall Abilities" - charge_max = 0 - clothes_req = 0 - action_icon_state = "darksight" - -/obj/effect/proc_holder/spell/shadow_vision/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadow_vision/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - if(!istype(target) || !ishuman(target)) - return - var/mob/living/carbon/human/H = target - if(!H.vision_type) - to_chat(H, "You shift the nerves in your eyes, allowing you to see in the dark.") - H.set_sight(/datum/vision_override/nightvision) - else - to_chat(H, "You return your vision to normal.") - H.set_sight(null) - -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze - name = "Icy Veins" - desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage." - panel = "Shadowling Abilities" - charge_max = 250 - clothes_req = 0 - action_icon_state = "icy_veins" - -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - T.range = 5 - return T - -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets, mob/user = usr) - to_chat(user, "You freeze the nearby air.") - playsound(user.loc, 'sound/effects/ghost2.ogg', 50, 1) - - for(var/turf/T in targets) - for(var/mob/living/carbon/M in T.contents) - if(is_shadow_or_thrall(M)) - if(M == user) //No message for the user, of course - continue - else - to_chat(M, "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!") - continue - to_chat(M, "A wave of shockingly cold air engulfs you!") - M.Stun(2) - M.apply_damage(10, BURN) - if(M.bodytemperature) - M.bodytemperature -= 200 //Extreme amount of initial cold - if(M.reagents) - M.reagents.add_reagent("frostoil", 15) //Half of a cryosting - - -/obj/effect/proc_holder/spell/enthrall //Turns a target into the shadowling's slave. This overrides all previous loyalties - name = "Enthrall" - desc = "Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast." - panel = "Shadowling Abilities" - charge_max = 0 - clothes_req = FALSE - var/enthralling = FALSE - action_icon_state = "enthrall" - - selection_activated_message = "Your prepare your mind to entrall a mortal. Left-click to cast at a target!" - selection_deactivated_message = "Your mind relaxes." - -/obj/effect/proc_holder/spell/enthrall/create_new_targeting() - var/datum/spell_targeting/click/T = new() - T.range = 1 - T.click_radius = -1 - return T - -/obj/effect/proc_holder/spell/enthrall/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(enthralling) - to_chat(user, "You're already enthralling someone!") - return FALSE - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/enthrall/valid_target(mob/living/carbon/human/target, user) - return target.key && target.mind && !target.stat && !is_shadow_or_thrall(target) && target.client - -/obj/effect/proc_holder/spell/enthrall/cast(list/targets, mob/user = usr) - var/mob/living/carbon/human/ling = user - listclearnulls(SSticker.mode.shadowling_thralls) - if(!(ling.mind in SSticker.mode.shadows)) - return - var/mob/living/carbon/human/target = targets[1] - if(ismindshielded(target)) - to_chat(user, "This target has a mindshield, blocking your powers! You cannot thrall it!") - return - enthralling = TRUE - to_chat(user, "This target is valid. You begin the enthralling.") - to_chat(target, "[user] stares at you. You feel your head begin to pulse.") - - for(var/progress = 0, progress <= 3, progress++) - switch(progress) - if(1) - to_chat(user, "You place your hands to [target]'s head...") - user.visible_message("[user] places [user.p_their()] hands onto the sides of [target]'s head!") - if(2) - to_chat(user, "You begin preparing [target]'s mind as a blank slate...") - user.visible_message("[user]'s palms flare a bright red against [target]'s temples!") - to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away.") - target.Weaken(12) - if(3) - to_chat(user, "You begin planting the tumor that will control the new thrall...") - user.visible_message("A strange energy passes from [user]'s hands into [target]'s head!") - to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind.") - if(!do_mob(user, target, 7.7 SECONDS)) //around 23 seconds total for enthralling - to_chat(user, "The enthralling has been interrupted - your target's mind returns to its previous state.") - to_chat(target, "You wrest yourself away from [user]'s hands and compose yourself") - enthralling = FALSE - return - - enthralling = FALSE - to_chat(user, "You have enthralled [target]!") - target.visible_message("[target] looks to have experienced a revelation!", \ - "False faces all dark not real not real not--") - target.setOxyLoss(0) //In case the shadowling was choking them out - SSticker.mode.add_thrall(target.mind) - target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL - -/obj/effect/proc_holder/spell/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor - name = "Rapid Re-Hatch" - desc = "Re-forms protective chitin that may be lost during cloning or similar processes." - panel = "Shadowling Abilities" - charge_max = 600 - clothes_req = 0 - action_icon_state = "regen_armor" - -/obj/effect/proc_holder/spell/shadowling_regenarmor/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadowling_regenarmor/cast(list/targets, mob/user = usr) - if(!is_shadow(user)) - to_chat(user, "You must be a shadowling to do this!") - charge_counter = charge_max - return - for(var/mob/living/target in targets) - if(!istype(target) || !ishuman(target)) - return - var/mob/living/carbon/human/H = target - H.visible_message("[H]'s skin suddenly bubbles and shifts around [H.p_their()] body!", \ - "You regenerate your protective armor and cleanse your form of defects.") - H.set_species(/datum/species/shadow/ling) - H.adjustCloneLoss(-target.getCloneLoss()) - H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(H), slot_glasses) - -/obj/effect/proc_holder/spell/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount - name = "Collective Hivemind" - desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities." - panel = "Shadowling Abilities" - charge_max = 300 //30 second cooldown to prevent spam - clothes_req = 0 - var/blind_smoke_acquired - var/screech_acquired - var/nullChargeAcquired - var/reviveThrallAcquired - action_icon_state = "collective_mind" - -/obj/effect/proc_holder/spell/collective_mind/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/collective_mind/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/collective_mind/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - var/thralls = 0 - var/victory_threshold = SSticker.mode.required_thralls - var/mob/M - - to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") - - for(M in GLOB.alive_mob_list) - if(is_thrall(M)) - thralls++ - to_chat(M, "You feel hooks sink into your mind and pull.") - - if(!do_after(target, 30, target = target)) - to_chat(target, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") - return - - if(thralls >= CEILING(3 * SSticker.mode.thrall_ratio, 1) && !screech_acquired) - screech_acquired = 1 - to_chat(target, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") - target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) - - if(thralls >= CEILING(5 * SSticker.mode.thrall_ratio, 1) && !blind_smoke_acquired) - blind_smoke_acquired = 1 - to_chat(target, "The power of your thralls has granted you the Blinding Smoke ability. \ - It will create a choking cloud that will blind any non-thralls who enter.") - target.mind.AddSpell(new /obj/effect/proc_holder/spell/blindness_smoke(null)) - - if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !nullChargeAcquired) - nullChargeAcquired = 1 - to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \ - or sending power until repaired.") - target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/null_charge(null)) - - if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) - reviveThrallAcquired = 1 - to_chat(target, "The power of your thralls has granted you the Black Recuperation ability. \ - This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") - target.mind.AddSpell(new /obj/effect/proc_holder/spell/reviveThrall(null)) - - if(thralls < victory_threshold) - to_chat(target, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.") - - else if(thralls >= victory_threshold) - to_chat(target, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls.") - to_chat(target, "You may find Ascendance in the Shadowling Evolution tab.") - for(M in GLOB.alive_mob_list) - if(is_shadow(M)) - var/obj/effect/proc_holder/spell/collective_mind/CM - if(CM in M.mind.spell_list) - M.mind.spell_list -= CM - qdel(CM) - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/shadowling_hatch) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/shadowling_ascend(null)) - if(M == user) - to_chat(M, "You project this power to the rest of the shadowlings.") - else - to_chat(M, "[target.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)")//Tells all the other shadowlings - - - - -/obj/effect/proc_holder/spell/blindness_smoke - name = "Blindness Smoke" - desc = "Spews a cloud of smoke which will blind enemies." - panel = "Shadowling Abilities" - charge_max = 600 - clothes_req = 0 - action_icon_state = "black_smoke" - -/obj/effect/proc_holder/spell/blindness_smoke/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/blindness_smoke/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/blindness_smoke/cast(list/targets, mob/user = usr) //Extremely hacky - for(var/mob/living/target in targets) - target.visible_message("[target] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") - to_chat(target, "You regurgitate a vast cloud of blinding smoke.") - playsound(target, 'sound/effects/bamf.ogg', 50, 1) - var/obj/item/reagent_containers/glass/beaker/large/B = new /obj/item/reagent_containers/glass/beaker/large(target.loc) - B.reagents.clear_reagents() //Just in case! - B.icon_state = null //Invisible - B.reagents.add_reagent("blindness_smoke", 10) - var/datum/effect_system/smoke_spread/chem/S = new - if(S) - S.set_up(B.reagents, B.loc, TRUE) - S.start(4) - qdel(B) - -/datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls - name = "Odd black liquid" - id = "blindness_smoke" - description = "<::ERROR::> CANNOT ANALYZE REAGENT <::ERROR::>" - color = "#000000" //Complete black (RGB: 0, 0, 0) - metabolization_rate = 100 //lel - -/datum/reagent/shadowling_blindness_smoke/on_mob_life(mob/living/M) - var/update_flags = STATUS_UPDATE_NONE - if(!is_shadow_or_thrall(M)) - to_chat(M, "You breathe in the black smoke, and your eyes burn horribly!") - update_flags |= M.EyeBlind(5, FALSE) - if(prob(25)) - M.visible_message("[M] claws at [M.p_their()] eyes!") - M.Stun(3) - else - to_chat(M, "You breathe in the black smoke, and you feel revitalized!") - update_flags |= M.heal_organ_damage(2, 2, updating_health = FALSE) - update_flags |= M.adjustOxyLoss(-2, FALSE) - update_flags |= M.adjustToxLoss(-2, FALSE) - return ..() | update_flags - -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech - name = "Sonic Screech" - desc = "Deafens, stuns, and confuses nearby people. Also shatters windows." - panel = "Shadowling Abilities" - charge_max = 300 - clothes_req = 0 - action_icon_state = "screech" - -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - return T - -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets, mob/user = usr) - user.audible_message("[user] lets out a horrible scream!") - playsound(user.loc, 'sound/effects/screech.ogg', 100, 1) - - for(var/turf/T in targets) - for(var/mob/target in T.contents) - if(is_shadow_or_thrall(target)) - if(target == user) //No message for the user, of course - continue - else - continue - if(iscarbon(target)) - var/mob/living/carbon/M = target - to_chat(M, "A spike of pain drives into your head and scrambles your thoughts!") - M.AdjustConfused(10) - M.AdjustEarDamage(3) - else if(issilicon(target)) - var/mob/living/silicon/S = target - to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#") - SEND_SOUND(S, sound('sound/misc/interference.ogg')) - playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) - do_sparks(5, 1, S) - S.Weaken(6) - for(var/obj/structure/window/W in T.contents) - W.take_damage(rand(80, 100)) - -/obj/effect/proc_holder/spell/aoe_turf/null_charge - name = "Null Charge" - desc = "Empties an APC, preventing it from recharging until fixed." - panel = "Shadowling Abilities" - charge_max = 600 - clothes_req = FALSE - action_icon_state = "null_charge" - -/obj/effect/proc_holder/spell/aoe_turf/null_charge/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - return T - -/obj/effect/proc_holder/spell/aoe_turf/null_charge/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/aoe_turf/null_charge/cast(mob/user = usr) - var/list/local_objs = view(1, user) - var/obj/machinery/power/apc/target_apc - for(var/object in local_objs) - if(istype(object, /obj/machinery/power/apc)) - target_apc = object - break - - if(!target_apc) - to_chat(user, "You must stand next to an APC to drain it!") - charge_counter = charge_max - return - - if(target_apc.cell?.charge == 0) - to_chat(user, "APC must have a power to drain!") - charge_counter = charge_max - return - - target_apc.operating = 0 - target_apc.update() - target_apc.update_icon() - target_apc.visible_message("[target_apc] flickers and begins to grow dark.") - - to_chat(user, "You dim the APC's screen and carefully begin siphoning its power into the void.") - if(!do_after(user, 200, target=target_apc)) - //Whoops! The APC's powers back on - to_chat(user, "Your concentration breaks and the APC suddenly repowers!") - target_apc.operating = 1 - target_apc.update() - target_apc.update_icon() - target_apc.visible_message("[target_apc] begins glowing brightly!") - else - //We did it! - to_chat(user, "You sent the APC's power to the void while overloading all it's lights!") - target_apc.cell?.charge = 0 //Sent to the shadow realm - target_apc.chargemode = 0 //Won't recharge either until an someone hits the button - target_apc.charging = 0 - target_apc.null_charge() - target_apc.update_icon() - - - -/obj/effect/proc_holder/spell/reviveThrall - name = "Black Recuperation" - desc = "Revives or empowers a thrall." - panel = "Shadowling Abilities" - charge_max = 600 - clothes_req = FALSE - action_icon_state = "revive_thrall" - selection_activated_message = "You start focusing your powers on mending wounds of allies. Left-click to cast at a target!" - selection_deactivated_message = "Your mind relaxes." - -/obj/effect/proc_holder/spell/reviveThrall/create_new_targeting() - var/datum/spell_targeting/click/T = new() - T.click_radius = -1 - T.range = 1 - return T - -/obj/effect/proc_holder/spell/reviveThrall/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/reviveThrall/valid_target(mob/living/carbon/human/target, user) - return is_thrall(target) - -/obj/effect/proc_holder/spell/reviveThrall/cast(list/targets, mob/user = usr) - var/mob/living/carbon/human/thrallToRevive = targets[1] - if(thrallToRevive.stat == CONSCIOUS) - if(isshadowlinglesser(thrallToRevive)) - to_chat(user, "[thrallToRevive] is already empowered.") - revert_cast(user) - return - var/empowered_thralls = 0 - for(var/datum/mind/M in SSticker.mode.shadowling_thralls) - if(!ishuman(M.current)) - return - var/mob/living/carbon/human/H = M.current - if(isshadowlinglesser(H)) - empowered_thralls++ - if(empowered_thralls >= EMPOWERED_THRALL_LIMIT) - to_chat(user, "You cannot spare this much energy. There are too many empowered thralls.") - revert_cast(user) - return - user.visible_message("[user] places [user.p_their()] hands over [thrallToRevive]'s face, red light shining from beneath.", \ - "You place your hands on [thrallToRevive]'s face and begin gathering energy...") - to_chat(thrallToRevive, "[user] places [user.p_their()] hands over your face. You feel energy gathering. Stand still...") - if(!do_mob(user, thrallToRevive, 80)) - to_chat(user, "Your concentration snaps. The flow of energy ebbs.") - revert_cast(user) - return - to_chat(user, "You release a massive surge of power into [thrallToRevive]!") - user.visible_message("Red lightning surges into [thrallToRevive]'s face!") - playsound(thrallToRevive, 'sound/weapons/egloves.ogg', 50, 1) - playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) - user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) - thrallToRevive.Weaken(5) - thrallToRevive.visible_message("[thrallToRevive] collapses, [thrallToRevive.p_their()] skin and face distorting!", \ - "AAAAAAAAAAAAAAAAAAAGH-") - sleep(20) - thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \ - "You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \ - darkness but wither slowly in light. In addition, you now have glare and true shadow walk.") - thrallToRevive.set_species(/datum/species/shadow/ling/lesser) - thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/lesser_shadow_walk) - thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/glare(null)) - thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/shadow_walk(null)) - else if(thrallToRevive.stat == DEAD) - user.visible_message("[user] kneels over [thrallToRevive], placing [user.p_their()] hands on [thrallToRevive.p_their()] chest.", \ - "You crouch over the body of your thrall and begin gathering energy...") - thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive) - if(!do_mob(user, thrallToRevive, 30)) - to_chat(user, "Your concentration snaps. The flow of energy ebbs.") - revert_cast(user) - return - to_chat(user, "You release a massive surge of power into [thrallToRevive]!") - user.visible_message("Red lightning surges from [user]'s hands into [thrallToRevive]'s chest!") - playsound(thrallToRevive, 'sound/weapons/egloves.ogg', 50, 1) - playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) - user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) - sleep(10) - if(thrallToRevive.revive()) - thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in [thrallToRevive.p_their()] eyes.", \ - "You have returned. One of your masters has brought you from the darkness beyond.") - thrallToRevive.Weaken(4) - thrallToRevive.emote("gasp") - playsound(thrallToRevive, "bodyfall", 50, 1) - else - to_chat(user, "The target must be awake to empower or dead to revive.") - revert_cast(user) - -/obj/effect/proc_holder/spell/shadowling_extend_shuttle - name = "Destroy Engines" - desc = "Extends the time of the emergency shuttle's arrival by ten minutes using a life force of our enemy. Shuttle will be unable to be recalled. This can only be used once." - panel = "Shadowling Abilities" - clothes_req = FALSE - charge_max = 600 - selection_activated_message = "You start gathering destructive powers to delay the shuttle. Left-click to cast at a target!" - selection_deactivated_message = "Your mind relaxes." - action_icon_state = "extend_shuttle" - var/global/extendlimit = 0 - -/obj/effect/proc_holder/spell/shadowling_extend_shuttle/create_new_targeting() - var/datum/spell_targeting/click/T = new() - T.click_radius = -1 - T.range = 1 - return T - -/obj/effect/proc_holder/spell/shadowling_extend_shuttle/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/shadowling_extend_shuttle/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) - if(extendlimit == 1) - if(show_message) - to_chat(user, "Shuttle was already delayed.") - return FALSE - if(SSshuttle.emergency.mode != SHUTTLE_CALL) - if(show_message) - to_chat(user, "The shuttle must be inbound only to the station.") - return FALSE - return ..() - -/obj/effect/proc_holder/spell/shadowling_extend_shuttle/valid_target(mob/living/carbon/human/target, user) - return !target.stat && !is_shadow_or_thrall(target) - - -/obj/effect/proc_holder/spell/shadowling_extend_shuttle/cast(list/targets, mob/user = usr) - var/mob/living/carbon/human/target = targets[1] - - user.visible_message("[user]'s eyes flash a bright red!", \ - "You begin to draw [target]'s life force.") - target.visible_message("[target]'s face falls slack, [target.p_their()] jaw slightly distending.", \ - "You are suddenly transported... far, far away...") - extendlimit = 1 - if(!do_after(user, 150, target = target)) - extendlimit = 0 - to_chat(target, "You are snapped back to reality, your haze dissipating!") - to_chat(user, "You have been interrupted. The draw has failed.") - return - to_chat(user, "You project [target]'s life force toward the approaching shuttle, extending its arrival duration!") - target.visible_message("[target]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.", \ - "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") - target.death() - if(SSshuttle.emergency.mode == SHUTTLE_CALL) - var/more_minutes = 6000 - var/timer = SSshuttle.emergency.timeLeft(1) + more_minutes - GLOB.event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 10 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg') - SSshuttle.emergency.setTimer(timer) - SSshuttle.emergency.canRecall = FALSE - user.mind.spell_list.Remove(src) //Can only be used once! - qdel(src) - -// ASCENDANT ABILITIES BEYOND THIS POINT // - -/obj/effect/proc_holder/spell/annihilate - name = "Annihilate" - desc = "Gibs someone instantly." - panel = "Ascendant" - charge_max = FALSE - clothes_req = FALSE - action_icon_state = "annihilate" - selection_activated_message = "You start thinking about gibs. Left-click to cast at a target!" - selection_deactivated_message = "Your mind relaxes." - -/obj/effect/proc_holder/spell/annihilate/create_new_targeting() - var/datum/spell_targeting/click/T = new() - return T - -/obj/effect/proc_holder/spell/annihilate/cast(list/targets, mob/user = usr) - var/mob/living/simple_animal/ascendant_shadowling/SHA = user - if(SHA.phasing) - to_chat(user, "You are not in the same plane of existence. Unphase first.") - charge_counter = charge_max - return - - playsound(user.loc, 'sound/magic/staff_chaos.ogg', 100, 1) - for(var/mob/living/boom in targets) - if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. - to_chat(user, "Making an ally explode seems unwise.") - charge_counter = charge_max - return - user.visible_message("[user]'s markings flare as [user.p_they()] gesture[user.p_s()] at [boom]!", \ - "You direct a lance of telekinetic energy at [boom].") - sleep(4) - if(iscarbon(boom)) - playsound(boom, 'sound/magic/disintegrate.ogg', 100, 1) - boom.visible_message("[boom] explodes!") - boom.gib() - - - -/obj/effect/proc_holder/spell/hypnosis - name = "Hypnosis" - desc = "Instantly enthralls a human." - panel = "Ascendant" - charge_max = FALSE - clothes_req = FALSE - action_icon_state = "enthrall" - - selection_activated_message = "You start preparing to mindwash over a mortal mind. Left-click to cast at a target!" - selection_deactivated_message = "Your mind relaxes." - -/obj/effect/proc_holder/spell/hypnosis/create_new_targeting() - var/datum/spell_targeting/click/T = new() - T.click_radius = -1 - return T - -/obj/effect/proc_holder/spell/hypnosis/can_cast(mob/living/simple_animal/ascendant_shadowling/user = usr, charge_check = TRUE, show_message = FALSE) - if(!istype(user)) - return FALSE - if(user.phasing) - if(show_message) - to_chat(user, "You are not in the same plane of existence. Unphase first.") - return FALSE - return ..() - -/obj/effect/proc_holder/spell/hypnosis/valid_target(mob/living/carbon/human/target, user) - return !is_shadow_or_thrall(target) && target.ckey && target.mind && !target.stat - -/obj/effect/proc_holder/spell/hypnosis/cast(list/targets, mob/user = usr) - var/mob/living/carbon/human/target = targets[1] - - to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing [target.p_them()] into a thrall.") - to_chat(target, "An agonizing spike of pain drives into your mind, and--") - SSticker.mode.add_thrall(target.mind) - target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL - target.add_language("Shadowling Hivemind") - - - -/obj/effect/proc_holder/spell/shadowling_phase_shift - name = "Phase Shift" - desc = "Phases you into the space between worlds at will, allowing you to move through walls and become invisible." - panel = "Ascendant" - charge_max = 15 - clothes_req = 0 - action_icon_state = "shadow_walk" - -/obj/effect/proc_holder/spell/shadowling_phase_shift/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadowling_phase_shift/cast(list/targets, mob/user = usr) - var/mob/living/simple_animal/ascendant_shadowling/SHA = user - for(SHA in targets) - SHA.phasing = !SHA.phasing - if(SHA.phasing) - SHA.visible_message("[SHA] suddenly vanishes!", \ - "You begin phasing through planes of existence. Use the ability again to return.") - SHA.incorporeal_move = 1 - SHA.alpha = 0 - else - SHA.visible_message("[SHA] suddenly appears from nowhere!", \ - "You return from the space between worlds.") - SHA.incorporeal_move = 0 - SHA.alpha = 255 - - - -/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm - name = "Lightning Storm" - desc = "Shocks everyone nearby." - panel = "Ascendant" - charge_max = 100 - clothes_req = 0 - action_icon_state = "lightning_storm" - -/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - T.range = 6 - return T - -/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets, mob/user = usr) - var/mob/living/simple_animal/ascendant_shadowling/SHA = user - if(SHA.phasing) - to_chat(user, "You are not in the same plane of existence. Unphase first.") - charge_counter = charge_max - return - - user.visible_message("A massive ball of lightning appears in [user]'s hands and flares out!", \ - "You conjure a ball of lightning and release it.") - playsound(user.loc, 'sound/magic/lightningbolt.ogg', 100, 1) - for(var/turf/T in targets) - for(var/mob/living/carbon/human/target in T.contents) - if(is_shadow_or_thrall(target)) - continue - to_chat(target, "You are struck by a bolt of lightning!") - playsound(target, 'sound/magic/lightningshock.ogg', 50, 1) - target.Weaken(8) - target.take_organ_damage(0,50) - user.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) - -/obj/effect/proc_holder/spell/shadowlingAscendantTransmit - name = "Ascendant Broadcast" - desc = "Sends a message to the whole wide world." - panel = "Ascendant" - charge_max = 200 - clothes_req = 0 - action_icon_state = "transmit" - -/obj/effect/proc_holder/spell/shadowlingAscendantTransmit/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadowlingAscendantTransmit/cast(list/targets, mob/user = usr) - for(var/mob/living/simple_animal/ascendant_shadowling/target in targets) - var/text = stripped_input(target, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "") - if(!text) - return - target.announce(text) diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm deleted file mode 100644 index 8a86715a907..00000000000 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/clothing/under/shadowling - name = "blackened flesh" - desc = "Black, chitinous skin." - item_state = "golem" - origin_tech = null - icon_state = "golem" - item_color = "golem" - flags = ABSTRACT | NODROP - has_sensor = 0 - displays_id = 0 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - - -/obj/item/clothing/suit/space/shadowling - name = "chitin shell" - desc = "Dark, semi-transparent shell. Protects against vacuum, but not against the light of the stars." //Still takes damage from spacewalking but is immune to space itself - icon_state = "golem" - item_state = "golem" - body_parts_covered = FULL_BODY //Shadowlings are immune to space - cold_protection = FULL_BODY - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT - slowdown = 0 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - heat_protection = null //You didn't expect a light-sensitive creature to have heat resistance, did you? - max_heat_protection_temperature = null - armor = list(melee = 25, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 100, fire = 100, acid = 100) - flags = ABSTRACT | NODROP | THICKMATERIAL | STOPSPRESSUREDMAGE - - -/obj/item/clothing/shoes/shadowling - name = "chitin feet" - desc = "Charred-looking feet. They have minature hooks that latch onto flooring." - icon_state = "golem" - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flags = NOSLIP | ABSTRACT | NODROP - - -/obj/item/clothing/mask/gas/shadowling - name = "chitin mask" - desc = "A mask-like formation with slots for facial features. A red film covers the eyes." - icon_state = "golem" - item_state = "golem" - origin_tech = null - siemens_coefficient = 0 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flags = ABSTRACT | NODROP - - -/obj/item/clothing/gloves/shadowling - name = "chitin hands" - desc = "An electricity-resistant covering of the hands." - icon_state = "golem" - item_state = null - origin_tech = null - siemens_coefficient = 0 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flags = ABSTRACT | NODROP - - -/obj/item/clothing/head/shadowling - name = "chitin helm" - desc = "A helmet-like enclosure of the head." - icon_state = "golem" - item_state = null - cold_protection = HEAD - min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT - heat_protection = HEAD - max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT - origin_tech = null - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flags = ABSTRACT | NODROP | STOPSPRESSUREDMAGE - -/obj/item/clothing/glasses/shadowling - name = "crimson eyes" - desc = "A shadowling's eyes. Very light-sensitive and can detect body heat through walls." - icon = null - icon_state = null - item_state = null - origin_tech = null - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flash_protect = -1 - vision_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - flags = ABSTRACT | NODROP diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm deleted file mode 100644 index c6840601cc9..00000000000 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ /dev/null @@ -1,195 +0,0 @@ -//In here: Hatch and Ascendance -GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-uae", "Noaey'gief", "Mii`mahza", "Amerziox", "Gyrg-mylin", "Kanet'pruunance", "Vigistaezian")) //Unpronouncable 2: electric boogalo) -/obj/effect/proc_holder/spell/shadowling_hatch - name = "Hatch" - desc = "Casts off your disguise." - panel = "Shadowling Evolution" - charge_max = 3000 - clothes_req = 0 - action_icon_state = "hatch" - var/cycles_unused = 0 - -/obj/effect/proc_holder/spell/shadowling_hatch/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadowling_hatch/cast(list/targets, mob/user = usr) - if(user.stat || !ishuman(user) || !user || !is_shadow(user || isinspace(user))) - return - if(!isturf(user.loc)) - revert_cast(user) - to_chat(user, "You must be standing on a floor to hatch!") - return - for(var/mob/living/carbon/human/H in targets) - var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") - switch(hatch_or_no) - if("No") - to_chat(H, "You decide against hatching for now.") - charge_counter = charge_max - return - if("Yes") - H.Stun(INFINITY) //This is bad but notransform won't work. - H.visible_message("[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!", \ - "You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.") - - for(var/obj/item/I in H.contents) - H.unEquip(I) - - sleep(50) - var/turf/simulated/floor/F - var/turf/shadowturf = get_turf(user) - for(F in orange(1, user)) - new /obj/structure/alien/resin/wall/shadowling(F) - for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky - qdel(R) - new /obj/structure/alien/weeds/node(shadowturf) //Dim lighting in the chrysalis -- removes itself afterwards - var/temp_flags = H.status_flags - H.status_flags |= GODMODE //Can't die while hatching - - H.visible_message("A chrysalis forms around [H], sealing [H.p_them()] inside.", \ - "You create your chrysalis and begin to contort within.") - - sleep(100) - H.visible_message("The skin on [H]'s back begins to split apart. Black spines slowly emerge from the divide.", \ - "Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.") - - sleep(90) - H.visible_message("[H], skin shifting, begins tearing at the walls around [H.p_them()].", \ - "Your false skin slips away. You begin tearing at the fragile membrane protecting you.") - - sleep(80) - playsound(H.loc, 'sound/weapons/slash.ogg', 25, 1) - to_chat(H, "You rip and slice.") - sleep(10) - playsound(H.loc, 'sound/weapons/slashmiss.ogg', 25, 1) - to_chat(H, "The chrysalis falls like water before you.") - sleep(10) - playsound(H.loc, 'sound/weapons/slice.ogg', 25, 1) - to_chat(H, "You are free!") - H.status_flags = temp_flags - sleep(10) - playsound(H.loc, 'sound/effects/ghost.ogg', 50, TRUE) - var/newNameId = pick(GLOB.possibleShadowlingNames) - GLOB.possibleShadowlingNames.Remove(newNameId) - H.real_name = newNameId - H.name = user.real_name - H.SetStunned(0) - to_chat(H, "YOU LIVE!!!") - - for(var/obj/structure/alien/resin/wall/shadowling/W in orange(H, 1)) - playsound(W, 'sound/effects/splat.ogg', 50, 1) - qdel(W) - for(var/obj/structure/alien/weeds/node/N in shadowturf) - qdel(N) - H.visible_message("The chrysalis explodes in a shower of purple flesh and fluid!") - H.underwear = "None" - H.undershirt = "None" - H.socks = "None" - H.faction |= "faithless" - - H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling - H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(user), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(user), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), slot_head) - H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses) - - H.mind.RemoveSpell(src) - - sleep(10) - to_chat(H, "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.") - H.ExtinguishMob() - H.mind.AddSpell(new /obj/effect/proc_holder/spell/enthrall(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/glare(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/veil(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/shadow_walk(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/collective_mind(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/shadowling_regenarmor(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/shadowling_extend_shuttle(null)) - - QDEL_NULL(H.hud_used) - H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) - H.hud_used.show_hud(H.hud_used.hud_version) - -/obj/effect/proc_holder/spell/shadowling_ascend - name = "Ascend" - desc = "Enters your true form." - panel = "Shadowling Evolution" - charge_max = 3000 - clothes_req = 0 - action_icon_state = "ascend" - -/obj/effect/proc_holder/spell/shadowling_ascend/create_new_targeting() - return new /datum/spell_targeting/self - -/obj/effect/proc_holder/spell/shadowling_ascend/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/living/user = usr) - if(!shadowling_check(user)) - return FALSE - return ..() - -/obj/effect/proc_holder/spell/shadowling_ascend/cast(list/targets, mob/user = usr) - var/mob/living/carbon/human/H = user - for(H in targets) - var/hatch_or_no = alert(H,"It is time to ascend. Are you sure about this?",,"Yes","No") - switch(hatch_or_no) - if("No") - to_chat(H, "You decide against ascending for now.") - charge_counter = charge_max - return - if("Yes") - H.notransform = 1 - H.visible_message("[H] gently rises into the air, red light glowing in its eyes.", \ - "You rise into the air and get ready for your transformation.") - - sleep(50) - - H.visible_message("[H]'s skin begins to crack and harden.", \ - "Your flesh begins creating a shield around yourself.") - - sleep(100) - H.visible_message("The small horns on [H]'s head slowly grow and elongate.", \ - "Your body continues to mutate. Your telepathic abilities grow.") //y-your horns are so big, senpai...!~ - - sleep(90) - H.visible_message("[H]'s body begins to violently stretch and contort.", \ - "You begin to rend apart the final barriers to godhood.") - - sleep(40) - to_chat(H, "Yes!") - sleep(10) - to_chat(H, "YES!!") - sleep(10) - to_chat(H, "YE--") - sleep(1) - for(var/mob/living/M in orange(7, H)) - M.Weaken(10) - to_chat(M, "An immense pressure slams you onto the ground!") - for(var/thing in GLOB.apcs) - var/obj/machinery/power/apc/A = thing - INVOKE_ASYNC(A, /obj/machinery/power/apc.proc/overload_lighting) - var/mob/living/simple_animal/ascendant_shadowling/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc) - A.announce("VYSHA NERADA YEKHEZET U'RUU!!", 5, 'sound/hallucinations/veryfar_noise.ogg') - for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list) - if(S == src) continue - H.mind.RemoveSpell(S) - H.mind.transfer_to(A) - A.name = H.real_name - A.languages = H.languages - A.mind.AddSpell(new /obj/effect/proc_holder/spell/annihilate(null)) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/hypnosis(null)) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/shadowling_phase_shift(null)) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/ascendant_storm(null)) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/shadowlingAscendantTransmit(null)) - if(A.real_name) - A.real_name = H.real_name - H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly - H.loc = A - sleep(50) - if(!SSticker.mode.shadowling_ascended) - SSshuttle.emergency.request(null, 0.3) - SSshuttle.emergency.canRecall = FALSE - SSticker.mode.shadowling_ascended = 1 - A.mind.RemoveSpell(src) - qdel(H) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index fc9401a0588..7b7040f8740 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -28,7 +28,6 @@ GLOBAL_LIST_INIT(role_playtime_requirements, list( // TEAM ANTAGS // Higher numbers here, because they require more experience to be played correctly - ROLE_SHADOWLING = 20, ROLE_REV = 10, ROLE_OPERATIVE = 20, ROLE_CULTIST = 20, diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 39eb2a982d2..7a496683f8b 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -446,8 +446,6 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ SSticker.mode.ascend(H) if(H.mind in SSticker.mode.changelings) SSticker.mode.update_change_icons_added(H.mind) - if((H.mind in SSticker.mode.shadowling_thralls) || (H.mind in SSticker.mode.shadows)) - SSticker.mode.update_shadow_icons_added(H.mind) //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(message) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index fa53459f055..fe32267ae20 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -325,28 +325,6 @@ sharp = TRUE attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "honked") -/obj/item/nullrod/whip - name = "holy whip" - desc = "A whip, blessed with the power to banish evil shadowy creatures. What a terrible night to be in spess." - icon_state = "chain" - item_state = "chain" - slot_flags = SLOT_BELT - attack_verb = list("whipped", "lashed") - hitsound = 'sound/weapons/slash.ogg' - -/obj/item/nullrod/whip/New() - ..() - desc = "What a terrible night to be on the [station_name()]." - -/obj/item/nullrod/whip/afterattack(atom/movable/AM, mob/user, proximity) - if(!proximity) - return - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(is_shadow(H)) - var/phrase = pick("Die monster! You don't belong in this world!!!", "You steal men's souls and make them your slaves!!!", "Your words are as empty as your soul!!!", "Mankind ill needs a savior such as you!!!") - user.say("[phrase]") - H.adjustBruteLoss(12) //Bonus damage /obj/item/nullrod/fedora name = "binary fedora" diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm index 8fff9eaee77..f1c61dae3d3 100644 --- a/code/game/objects/items/weapons/implants/implant_mindshield.dm +++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm @@ -19,11 +19,6 @@ /obj/item/implant/mindshield/implant(mob/target) if(..()) - if(target.mind in SSticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) - target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") - removed(target, 1) - qdel(src) - return -1 if(target.mind in SSticker.mode.revolutionaries) SSticker.mode.remove_revolutionary(target.mind) if(target.mind in SSticker.mode.cult) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 2ef27067573..9fd2793a41d 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -82,11 +82,6 @@ /obj/structure/alien/resin/wall/BlockSuperconductivity() return 1 -/obj/structure/alien/resin/wall/shadowling //For chrysalis - name = "chrysalis wall" - desc = "Some sort of purple substance in an egglike shape. It pulses and throbs from within and seems impenetrable." - max_integrity = INFINITY - /obj/structure/alien/resin/membrane name = "resin membrane" desc = "Resin just thin enough to let light pass through." diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f60fa5a266a..db6910a7bde 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -390,7 +390,7 @@ GLOBAL_VAR_INIT(nologevent, 0) /datum/admins/proc/end_round() set category = "Server" set name = "End Round" - set desc = "Instantly ends the round and brings up the scoreboard, like shadowlings or wizards dying." + set desc = "Instantly ends the round and brings up the scoreboard, in the same way that wizards dying do." if(!check_rights(R_SERVER)) return var/input = sanitize(copytext(input(usr, "What text should players see announcing the round end? Input nothing to cancel.", "Specify Announcement Text", "Shift Has Ended!"), 1, MAX_MESSAGE_LEN)) @@ -655,10 +655,6 @@ GLOBAL_VAR_INIT(nologevent, 0) antag_list += "Vampire" if(M.mind.has_antag_datum(/datum/antagonist/mindslave/thrall)) antag_list += "Vampire Thrall" - if(M.mind in SSticker.mode.shadows) - antag_list += "Shadowling" - if(M.mind in SSticker.mode.shadowling_thralls) - antag_list += "Shadowling Thrall" if(M.mind.has_antag_datum(/datum/antagonist/traitor)) antag_list += "Traitor" if(M.mind.has_antag_datum(/datum/antagonist/mindslave, FALSE)) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 608427116cd..55d711abcb7 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -473,12 +473,6 @@ if(SSticker.mode.implanted.len) dat += check_role_table("Mindslaves", SSticker.mode.implanted) - if(SSticker.mode.shadows.len) - dat += check_role_table("Shadowlings", SSticker.mode.shadows) - - if(SSticker.mode.shadowling_thralls.len) - dat += check_role_table("Shadowling Thralls", SSticker.mode.shadowling_thralls) - if(SSticker.mode.abductors.len) dat += check_role_table("Abductors", SSticker.mode.abductors) diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 05edcd89c1c..d39220bbcaf 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -4,7 +4,6 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts ROLE_GUARDIAN = 0, ROLE_TRAITOR = 7, ROLE_CHANGELING = 14, - ROLE_SHADOWLING = 14, ROLE_WIZARD = 14, ROLE_REV = 14, ROLE_VAMPIRE = 14, diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 6a6534cca94..b1865ba8621 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -104,8 +104,6 @@ "Wizard" = (mind in SSticker.mode.wizards), "Wizard's Apprentice" = (mind in SSticker.mode.apprentices), "Nuclear Operative" = (mind in SSticker.mode.syndicates), - "Shadowling" = (mind in SSticker.mode.shadows), - "Shadowling Thrall" = (mind in SSticker.mode.shadowling_thralls), "Abductor" = (mind in SSticker.mode.abductors), "Revolutionary" = (mind in SSticker.mode.revolutionaries), "Head Revolutionary" = (mind in SSticker.mode.head_revolutionaries) diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index be911ef1a65..9d3e0734739 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -12,8 +12,8 @@ GLOBAL_LIST_INIT(boo_phrases, list( /obj/effect/proc_holder/spell/boo name = "Boo!" desc = "Fuck with the living." - selection_deactivated_message = "Your presence will not be known. For now." - selection_activated_message = "You prepare to reach across the veil. Left-click to influence a target!" + selection_deactivated_message = "Your presence will not be known. For now." + selection_activated_message = "You prepare to reach across the veil. Left-click to influence a target!" ghost = TRUE @@ -42,7 +42,7 @@ GLOBAL_LIST_INIT(boo_phrases, list( if(target.get_spooked()) var/area/spook_zone = get_area(target) if (spook_zone.is_haunted == TRUE) - to_chat(usr, "The veil is weak in [spook_zone], it took less effort to influence [target].") + to_chat(usr, "The veil is weak in [spook_zone], it took less effort to influence [target].") charge_counter = charge_max / 2 return diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index f99d3e8e604..e1facc156e9 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -537,22 +537,6 @@ else ..(speaker,message) -/datum/language/shadowling - name = "Shadowling Hivemind" - desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind." - speech_verb = "says" - colour = "shadowling" - key = "8" - flags = RESTRICTED | HIVEMIND | NOBABEL - follow = TRUE - -/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask) - if(speaker.mind && speaker.mind.special_role == SPECIAL_ROLE_SHADOWLING) - ..(speaker,"[message]", "([speaker.mind.special_role]) [speaker]") - else if(speaker.mind && speaker.mind.special_role) - ..(speaker, message, "([speaker.mind.special_role]) [speaker]") - else - ..(speaker, message) /datum/language/abductor name = "Abductor Mindlink" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index a9389bde25c..a601e55bc9e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -274,9 +274,6 @@ else if(!client) msg += "[p_they(TRUE)] [p_have()] suddenly fallen asleep, suffering from Space Sleep Disorder. [p_they(TRUE)] may wake up soon.\n" - if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src)) - msg += "Their features seem unnaturally tight and drawn.\n" - if(decaylevel == 1) msg += "[p_they(TRUE)] [p_are()] starting to smell.\n" if(decaylevel == 2) diff --git a/code/modules/mob/living/carbon/human/species/shadowling.dm b/code/modules/mob/living/carbon/human/species/shadowling.dm deleted file mode 100644 index 6619692cf66..00000000000 --- a/code/modules/mob/living/carbon/human/species/shadowling.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/species/shadow/ling - //Normal shadowpeople but with enhanced effects - name = "Shadowling" - - icobase = 'icons/mob/human_races/r_shadowling.dmi' - blacklisted = TRUE - - blood_color = "#555555" - flesh_color = "#222222" - - species_traits = list(NO_BLOOD) //Can't use guns due to muzzle flash - inherent_traits = list(TRAIT_CHUNKYFINGERS, TRAIT_NOHUNGER, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOEXAMINE) - burn_mod = 1.5 //1.5x burn damage, 2x is excessive - heatmod = 1.5 - - has_organ = list( - "brain" = /obj/item/organ/internal/brain, - "eyes" = /obj/item/organ/internal/eyes/night_vision/nightmare) - -/datum/species/shadow/ling/handle_life(mob/living/carbon/human/H) - var/light_amount = 0 - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes - H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) - H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) - if(H.stat != DEAD) - to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" - SEND_SOUND(H, sound('sound/weapons/sear.ogg')) - else if(light_amount < LIGHT_HEAL_THRESHOLD) - H.clear_alert("lightexposure") - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - if(istype(E)) - E.receive_damage(-1) - H.heal_overall_damage(5, 5) - H.adjustToxLoss(-5) - H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!" - H.AdjustEyeBlurry(-1) - H.cure_nearsighted() - H.cure_blind() - H.adjustCloneLoss(-1) - H.SetWeakened(0) - H.SetStunned(0) - ..() - - -/datum/species/shadow/ling/lesser //Empowered thralls. Obvious, but powerful - name = "Lesser Shadowling" - - icobase = 'icons/mob/human_races/r_lshadowling.dmi' - - blood_color = "#CCCCCC" - flesh_color = "#AAAAAA" - - species_traits = list(NO_BLOOD) - inherent_traits = list(TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_NOHUNGER, TRAIT_NOEXAMINE) - burn_mod = 1.1 - heatmod = 1.1 - -/datum/species/shadow/ling/lesser/handle_life(mob/living/carbon/human/H) - var/light_amount = 0 - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) - H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) - H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2) - else if(light_amount < LIGHT_HEAL_THRESHOLD) - H.clear_alert("lightexposure") - H.heal_overall_damage(2,2) - H.adjustToxLoss(-5) - H.adjustBrainLoss(-25) - H.adjustCloneLoss(-1) - ..() diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index d5d0cfe7086..ff84d950b20 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -6,7 +6,5 @@ SSticker.mode.remove_wizard(mind) SSticker.mode.remove_changeling(mind) mind.remove_antag_datum(/datum/antagonist/vampire) - SSticker.mode.remove_thrall(mind, 0) - SSticker.mode.remove_shadowling(mind) SSticker.mode.remove_abductor(mind) ..() diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm index 16e3a4ada8d..5d9d2910b45 100644 --- a/code/modules/mob/living/simple_animal/posessed_object.dm +++ b/code/modules/mob/living/simple_animal/posessed_object.dm @@ -76,7 +76,7 @@ /mob/living/simple_animal/possessed_object/Login() ..() - to_chat(src, "Your spirit has entered [src] and possessed it.
You are able to do most things a humanoid would be able to do with a [src] in their hands.
If you want to end your ghostly possession, use the 'ghost' verb, it won't penalize your ability to respawn.
") + to_chat(src, "Your spirit has entered [src] and possessed it.
You are able to do most things a humanoid would be able to do with a [src] in their hands.
If you want to end your ghostly possession, use the 'ghost' verb, it won't penalize your ability to respawn.
") /mob/living/simple_animal/possessed_object/New(atom/loc as obj) @@ -99,7 +99,7 @@ update_icon(1) - visible_message("[src] rises into the air and begins to float!") // Inform those around us that shit's gettin' spooky. + visible_message("[src] rises into the air and begins to float!") // Inform those around us that shit's gettin' spooky. animate_ghostly_presence(src, -1, 20, 1) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 20f5f8ee717..59a77402920 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -74,8 +74,6 @@ SPECIAL_ROLE_ERT, SPECIAL_ROLE_HEAD_REV, SPECIAL_ROLE_REV, - SPECIAL_ROLE_SHADOWLING, - SPECIAL_ROLE_SHADOWLING_THRALL, SPECIAL_ROLE_TRAITOR, SPECIAL_ROLE_VAMPIRE, SPECIAL_ROLE_VAMPIRE_THRALL diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 05fd2102aee..9cc889df792 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -192,36 +192,6 @@ S.reagents.add_reagent("????", 5) return S -//shadowling tumor -/obj/item/organ/internal/shadowtumor - name = "black tumor" - desc = "A tiny black mass with red tendrils trailing from it. It seems to shrivel in the light." - icon_state = "blacktumor" - origin_tech = "biotech=5" - w_class = WEIGHT_CLASS_TINY - parent_organ = "head" - slot = "brain_tumor" - max_integrity = 3 - -/obj/item/organ/internal/shadowtumor/New() - ..() - START_PROCESSING(SSobj, src) - -/obj/item/organ/internal/shadowtumor/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/organ/internal/shadowtumor/process() - if(isturf(loc)) - var/turf/T = loc - var/light_count = T.get_lumcount()*10 - if(light_count > 4 && obj_integrity > 0) //Die in the light - obj_integrity-- - else if(light_count < 2 && obj_integrity < max_integrity) //Heal in the dark - obj_integrity++ - if(obj_integrity <= 0) - visible_message("[src] collapses in on itself!") - qdel(src) //debug and adminbus.... diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 8e49fc94ba6..39e010e4d85 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -235,103 +235,3 @@ " Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!") //no damage or anything, just wastes medicine - - -////////////////////////////////////////////////////////////////// -// Dethrall Shadowling // -////////////////////////////////////////////////////////////////// -/datum/surgery/remove_thrall - name = "Remove Shadow Tumor" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/dethrall, /datum/surgery_step/generic/cauterize) - possible_locs = list("head", "chest", "groin") - -/datum/surgery/remove_thrall/synth - name = "Debug Shadow Tumor" - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/internal/dethrall,/datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("head", "chest", "groin") - requires_organic_bodypart = 0 - -/datum/surgery/remove_thrall/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - if(!is_thrall(target)) - return 0 - var/obj/item/organ/internal/brain/B = target.get_int_organ(/obj/item/organ/internal/brain) - var/obj/item/organ/external/affected = target.get_organ(user.zone_selected) - if(!B) - // No brain to remove the tumor from - return 0 - if(affected.is_robotic()) - return 0 - if(!(B in affected.internal_organs)) - return 0 - return 1 - -/datum/surgery/remove_thrall/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - if(!is_thrall(target)) - return 0 - var/obj/item/organ/internal/brain/B = target.get_int_organ(/obj/item/organ/internal/brain) - var/obj/item/organ/external/affected = target.get_organ(user.zone_selected) - if(!B) - // No brain to remove the tumor from - return 0 - if(!affected.is_robotic()) - return 0 - if(!(B in affected.internal_organs)) - return 0 - return 1 - - -/datum/surgery_step/internal/dethrall - name = "cleanse contamination" - allowed_tools = list(/obj/item/flash = 100, /obj/item/flashlight/pen = 80, /obj/item/flashlight = 40) - blood_level = 0 - time = 30 - -/datum/surgery_step/internal/dethrall/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - if(!..()) - return 0 - if(!is_thrall(target)) - return 0 - return 1 - -/datum/surgery_step/internal/dethrall/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/braincase = target.named_organ_parent("brain") - user.visible_message("[user] reaches into [target]'s head with [tool].", "You begin aligning [tool]'s light to the tumor on [target]'s brain...") - to_chat(target, "A small part of your [braincase] pulses with agony as the light impacts it.") - ..() - -/datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - if(isshadowlinglesser(target)) //Empowered thralls cannot be deconverted - to_chat(target, "NOT LIKE THIS!") - user.visible_message("[target] suddenly slams upward and knocks down [user]!", \ - "[target] suddenly bolts up and slams you with tremendous force!") - user.StopResting() //Remove all stuns - user.SetSleeping(0) - user.SetStunned(0) - user.SetWeakened(0) - user.SetParalysis(0) - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.Weaken(6) - C.apply_damage(20, BRUTE, "chest") - else if(issilicon(user)) - var/mob/living/silicon/S = user - S.Weaken(8) - S.apply_damage(20, BRUTE) - playsound(S, 'sound/effects/bang.ogg', 50, 1) - return 0 - var/obj/item/organ/internal/brain/B = target.get_int_organ(/obj/item/organ/internal/brain) - var/obj/item/organ/external/E = target.get_organ(check_zone(B.parent_organ)) - user.visible_message("[user] shines light onto the tumor in [target]'s [E]!", "You cleanse the contamination from [target]'s brain!") - if(target.vision_type) //Turns off their darksight if it's still active. - to_chat(target, "Your eyes are suddenly wrought with immense pain as your darksight is forcibly dismissed!") - target.set_sight(null) - SSticker.mode.remove_thrall(target.mind, 0) - target.visible_message("A strange black mass falls from [target]'s [E]!") - var/obj/item/organ/thing = new /obj/item/organ/internal/shadowtumor(get_turf(target)) - thing.set_dna(target.dna) - user.put_in_hands(thing) - return 1 diff --git a/config/example/config.toml b/config/example/config.toml index 5b197e47bf1..3765b1fceeb 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -238,15 +238,12 @@ gamemode_probabilities = [ {gamemode = "nuclear", probability = 2}, {gamemode = "raginmages", probability = 0}, {gamemode = "revolution", probability = 0}, - {gamemode = "shadowling", probability = 1}, {gamemode = "traitor", probability = 2}, {gamemode = "traitorchan", probability = 3}, {gamemode = "traitorvamp", probability = 3}, {gamemode = "vampire", probability = 3}, {gamemode = "wizard", probability = 2}, ] -# Maximum cycles (2s) before a shadowling starts to take damage if they dont hatch -shadowling_max_age = 600 # 20 minutes # Do we want the amount of traitors to scale with population? traitor_scaling = true # Protect mindshielded roles from being antagonists diff --git a/goon/browserassets/css/browserOutput-dark.css b/goon/browserassets/css/browserOutput-dark.css index ee110da7704..eac7d278bef 100644 --- a/goon/browserassets/css/browserOutput-dark.css +++ b/goon/browserassets/css/browserOutput-dark.css @@ -348,7 +348,6 @@ h1.alert, h2.alert {color: #FFF;} .drask {color: #a3d4eb; font-family: "Arial Black";} .moth {color: #869b29; font-family: "Copperplate";} .clown {color: #ff0000;} -.shadowling {color: #Cb2799;} .vulpkanin {color: #B97A57;} .abductor {color: #800080; font-style: italic;} .mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 3411927c4aa..2977d41fe9f 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -345,7 +345,6 @@ h1.alert, h2.alert {color: #000000;} .drask {color: #a3d4eb; font-family: "Arial Black";} .moth {color: #869b29; font-family: "Copperplate";} .clown {color: #ff0000;} -.shadowling {color: #3b2769;} .vulpkanin {color: #B97A57;} .abductor {color: #800080; font-style: italic;} .mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index e09f573a687b4f88421b9858432d80d251433885..bf7401ed53ac1ab60fb428a97beff37d19ed79f4 100644 GIT binary patch literal 15920 zcmbVzcR&;0w(igbQKX2{L_!mgAE1Z=3WO#QdI#x>NRuMH2M|S+Ca5UA_uhLb0@9@` zE%Xw42_+%P8$9RSdv1B>-uM2PkPI_>c3Jyd-}=^?FimwuDoSQb005|9O7hwOKnwv7 zfZ_sprh$9nHUN-u_~;tC$y>Qvy4X6q**ZA_fLCIYQLiJ5IE{p{`CX;rp0=1RF5g|N zj}{;0ju?V(mRo0ERgbl;zBw?lBXfP}7jwa_-EQe?p_|3UD{@W=a47uzbkeEyP6uQz}_e7}p!k2*EcIa4lU7geH<%AQp&V7N)63tIc9+yo{ixza~ zS&O(hY$u=>Zo8!axns8RdG?v~ItSX(`#1)rFdu3I#kPM6K}*=9AC>CosiP=rx$S>T zXI3cCBr3rzTBs&u#2!;5CF$O-7Umo>tq!AylB<}%4ZSTxLFtmZzy%q_Y~Hxgp=gbc zPWv{Ih-rLtfmO*@J$BMJNbsWRd<*M4me$QTGPRalkC}8#7(*I9W{@h^ZEyuve)9au z%z2e-=*N;Au1;oXpw+6EqSo3f4p4Bmcwfi=@_xa7h;dSe?iH4+aA~H_sl*3@Pr5a= z_lbg)gKr6C>PAg z_c5^L0gLW2XK0Wv@!JSG-i{kBkVs+KOFF}w3ZKVn84dJ#DwTB)AF;QX{F>9c#1wI( ztd_n!kxuT4rmCHOU!k%;#p`I6-0TzKn= zhqS3@F&3!Qn!In?d#yq$`e{x5DSgC!+G_7fD>;?2Xydnjk7(*U@(Ts$!UE}7s&xii zCi5a#a(~|py!_Y|G9~PFK|)%F#p6L~r03F0xOw}}D6vD5EB;Y(JI-qYSDISW>~GY! zr6GQ$;sPC~L#|b=bKdCPrH$Y|eb>3~CvTZ2m0tFeZOE`K%I2?CMUgK@oXovvv=O(E z2WIpvli)`}#cC7p^~;04T7UH6$-~d}pE;Exw|AAKLW5C^>ev0rom5cjxC+v((2${j`Ajcs2yE#nEskNk%ujW?=?US#yfsNw*i;FHzCPKyGp6PoXkdIxLrB+{@ z+>bxzwra1RfFSu)&lp!1ohH37o-f|1L@CZ$JdOP+TK^+S^*IXnI||piO?P@|-w|p} zVuHBw`YO5T`g2tBUKk@%2q`rCAccS(^}}GS_Mq!)*2lNviw^++0>I>DbiER{X8aTB z$C7sToGx+*T{kTudi?k%9gUk`U${bl&!@nUIXV6Bq!$w`goEn#h^Q=hch4WkhRAY zQ6F#DttOZLJhCro8egg-v_&yr8Ye)_nVxAAg8BnmF$Pp>UG{|cWP>5T%;UKR9X1_K z@TQZgGd%V1r}a13TQC)d=a`yVp)<)<@&`Ci+!?g&xlb!TD(^|Om%k92=y@z#wR?<{ zlX+PG4heFfkB)X#VOc>_M5o3HIsM@ zG$~^dQ7*Dav)}RpdSjHp2pirkdn8;_fQ7}xS2yWh=V?7M5kZgd{l`x{=rM9;zNBlSZU@6?+Y^R)S$&v(~Qij8YZ z$303hHTt3A1m?o^gr!{yN^d!hWmVf%n8BS z$JH>uuaP2pd@E(&p1Xj_kCnOS{_~{}iwR)^u{f53( z@*=NaX9)?)ykYtYQ1$&bF%2g;2y_U1wyI@NYr5YD-}coD zSN9`R4Y8_~X2N1$U6q3|iy!$&R$;Kex1jKskDuI_Bbt-Gu~1JWE&d@is>pcU{s-(c zvx~OXfE1v_NlX!4%IoY_Nd*jt0K{CIv7fseAvj+g3+8#&XwKlC_!I!? zr+@?o?f9)eLQT~~aoMg8c#3RS7>GO40=16;BD(R~GP9~G=rKc;3IFzzO!$_F+CL#*W|;}{G3XmRk)

N8)|x$Vlua;YIttS3dZ}` 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 literal 15924 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 diff --git a/icons/mob/human_races/r_shadowling.dmi b/icons/mob/human_races/r_shadowling.dmi deleted file mode 100644 index f61e63c222e1eb1bba3c0a0f9267ab40c6cff93b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1723 zcmXw43slng7yt1v(J5F|n)xhK&unT3XQ)%mblN1}rY#KLgnt!$Oc^F(%xpQta@sK; z%*vi-=+ZJ@1eR=4ZTMHfe5SKJ3J50Q10AjHoO|x;e7^Vlx##=6=l&QL5@>8_ZU_K? z@v$KP2mk=-To3?-=u8W)Jz8gWg<+!tw&)CGA!=KjewS!vWvkU=)^^2-*#9 zGI5DzBogMl^Ea7Y4E!d!0ylQIVElqAe0jTTEat+!#}?&v$4>;JT;3uH+tLYdI)1pl zPna~9yih1a5AEiwF8;bZ8Zn4lG$IO*>08=<9d1eW5;VLUy-{YxaCq;2MecFOHSXx; zY|-r_$V9tTUm~y3DR^?#&+H3qmlMqkQ{;WiN7T(<#=DtDN49Le|I7~5Z##OBrt3xT z!ZH6NQItAaeZuAIXrq!tYS6i9VEYS@XEDSMUQm3eXY1r{RMjsI@AA4Q?$_V{^TWNW zY9T~q%=2scJRp4Mzp@&=Bpyo5G^E{nboX7Go}^>Ez|7TNp5T0?p5BpBlk&{D3C_9Zc=4lbG%T%edd^#H z2(bB6;H3A3`N2$&r71=~$Y4{bXQ3&`M4PLv1oZ`G?B6Zy!Jynqc#KKddUD!sPm>By zs2@EPMs~Xe#ad6XcbLRix-UZA$U+4C((KGy4^WnBEY0#(gq-B(pYhQ1c|D%)k_+}~g`PwCFs(AL$qwGeaRKH0X9e}Fulm!Zz z$uyS+#Lj`3m6>w2gwZpoP_FuBb$>b=fq2UQ={GE7?5K49wf<(4vP#)g+9i4R!yZ;m zf82eC#8l$hl-o~1wSPe}^;syJUgEaXFHV@@hl|ZyD4i_Ds+GsSvHfXOAN>e({BYzM zSMDp&qB9q0v^5Dc!%Oq*eIBHqpx$;|ce2qKTqixV?iRzE+2WWffMf!#_ zGkAj|nSpLg|NqS>k#42$$i(;hH;@t4NrIw24c~2SI6vQA5v9A}1L&r^Ohxz!Vp2DQ z2C_gU%0c!EdI9H#7?(9ZZqW7$zAO__{(E}7h){K1>LcR^Z@eUuf(8&;DJA%G^?ADN zxli1Xxs&~2hkQr+0YiH?5=^4{EBOea*xI6X3#Yw zpS0#}&Nh^VPY4$w-6-lI{n$=TM}(x8R!x4r)`DXr<@zpKE0|<%OQt*;+~>W&ZPOC8 zDcvxIyhm05ZoMQj{JSG87$Yc${;LCL8@wrBZc;%ZJOReT9;qD?D zLxwbL&Z@0r+fJHWJF#2sa^NVma8Mz2mQH*IN>PT}=H07-)jkV}J&e<9zWPNut6dU* zs+kv;XRvUNVT$MRG6V*Ghp6fNC(2J+x8x(K%Ew8`%2fDSe+Uu)E2;>f7R~3!6!A{p^E#&kAgP<2Pw%l zhF-)~fkYDqnp^9}o=+NqguPoeu`J*UQeZko;^^2jF$YHWJMN6<8;`hDbX>2*v3y~$ z1LAAnX+g1lzN6vvSe9?yxe6R&sQ@HKHREkE#OzrrROJ*C)Cg% z``9*<9A!#n=cxxK5l!$BFQF;9vu<_myr_J^Qa<7|OT9ao%h~tl)P|lUUVhQ!VGc#N PUw~r)A^t6X@#p>qV$DD@ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 7af3800e5d4c4b33f98001edb89e5f37382d8455..68c0d2cee7cba1b3b68fa90fefee714a173cd8e5 100644 GIT binary patch delta 21733 zcmb4rbyQVh*XNF!b*q`TwN-OTa*zL~XV zX02Ik{$QQ^oO?LWX6JA3XK!L#5Z4$0stgf%nK_qqiwPSfud<@?bDWV7 z>mtb-9Y%`0)r%mpTYc^XCiUxznfH0VK_U8XS1&f^^Ha!6Dg>)_;&0ac$bN z$>^=W%_}}VJoQ3u)u-E*lV@rzp9`lRZ&?diPM+o3Z(*yMTQ@rO7`t_KuEcbt4e#7- zE*L~B<>IBUGNwzX_pP?lYh3j&4PRcKVCwAogyP2{_Xws7v4sr%1##`Ie(;h8yH1bt z?&t=#3p;Q%wj%w0&xm`%*nb~+WUYIj$V#}qJsv`@pl_*QWrE|dVfcsVZNM|Kk6yh@ zSO`oSlqjOX**Q(2j5V=OQr`X9f4)KTjf#@zZHlIEH>V|?YWr);r*9FbXmm!dC0qK| zoF!%RSv7cV%C3$$qQ?ui{@KWQc!pq4uJ275>v(zd94-=-1@C$Mmn(B`P<;SEsqX zUMZHf3m&Qlwt*_XAv0`7?i6pae6wM^V6x6K|F8=Q#ab$+uWtQb$d{(*dJ!=kjbsV; zBKG^lEgI*fevtHfN7mQl=c0ga<++9P_qS!ANbPx;LG=iQ{tE8uie);&EO+<7$wHD0 zs-}ZzF0Q5hf{+nMWPw2zR#Q{jL$tok%Np(-q`6UET9f3YizgANDM9E$_n$pFqjP-B zzBMhDpKMQ%n)3Nkn$bp`KKLvtlQAUUyrM{m7_c!n{qf!*JRChv|66)6l`ao%{KXG> zI}%Pd%^#`TS&VDBgpr_X7pJlbkER+Cb~wn4AL@KK@%A9Axx}yatG&2>H~g~pUV$Ap zOfaWjv{PAuWcUsgVJ~!gTuVc$z{B^a`D(*lXU3n+$}Mv^q1^wWe{3M_ebPJO%`w~d z;=kVpcpGz)k{285-&hyqNSW6wC1s|6|Js*HgNalj-YOovQ=jk7M@Ni${AfFuYL8kkeetlckN}sc9TeaQJfBK>XRRf)dhfjoAMABB zzT;PHULc|dn_dI3-;%p6HeY#VpXJzNTHR6u#Y~f?%d|XK3OyU2UARsP>78kicqHB2 zY6K!8Bl(hp@mw80xpN6NVan|-N$Ra-8_EP)uCU)Iy16X&y7bp zLr)s?e@5JcTZ^{`<5od|G%sGDu!!9$dK`C?YT4SdRa8{qQ&Hh^aBy%XS5@)n8QlaO zw$PoyL2)D)%3(8>I?J+?FKyMV@)_Kn6qo7_1t>S`pYj?X7{LA^=se3h*fdYsywo!g zl`>fGyw&AtU9EjLG^a};rK4eKS*`u~;hJQ?fRhSDpzumRi;wl%5pvn~#}m{1ogGw8 zf6mR#t@YtUc%6udi0<9P>9BYhic^t#N%*c)r}ac3v9Yl+L|o+E9sTy=y}3uE7Y1*m zIKlYM&84OKO>Ds5O5v8zhj;wnHqmXSK8-}s+JTkq)FpHX+u<)>Hso2d=C(K^&7O9$ zTULWFJZ@9DJj@P5Jiw7K*VD?;$GIw5-H(F$l?_PTpP^X}=2jTqNIw4Q)L6^>b;QLz$j92(wcU8~!W>lIcKeXc%ne~6~>+1u6 z^{p*KdkH+3cT-d1Q)`>%Im6e!y<%?OON}uV_crSr8@wY&mso9)sY^UpzBXx^KLk@S zfYrFuKZ|%VBc7~7X=PJFLf&jbE#PPSfOBDOgFk2QVn67sq=6|NK$}jEf34h$$j-|%8U87{`ea0uys)YGNyeJG$@l;*+0E{*S36RXlGvlS zZmS#d@ow!6qJZ&h>fd32;JKgI+De$kVDby!Epr~H^|wEST>or8z!#evukKGa`j=zo zBke(nX}^i-MQ8K_F~zc_9dO-%F-=gX_THf2_91V$H_>ZvM*w&mG09jsEcn=7D(La_ zbgmYT{P4TMszX8oMaW_Z^RSS$~VfgztCUkt$;4e2n`mvkK- z0`%JYVOeJso#iIsCAkdU>vJ@rUUkQ2=H{zI!iO#xYusI<3OZc5hafxB#M*@YAS!HK zy0hz`;0w3g5CTkfkOGTUOG8c$bFLL^^&ncK)kOyOw9oktQZJGd?T%ON%TKb*5c%7L zd>lPj!&C2UbPG2lZf@*^;Ybp98oM)}eRs(s7BAR!>!RgTg^1a7YLHC^*00NL=lG8A zj*pKCw%qHrrqq25!QHv-$F!;Pt&mUi;>L_5O{X<>x2?)ybHlY74U0xw!BjCSX?ZD> z*>h;m3|gj4NjD&?=J6DD;I^K5g}t&uQ0Jy+F$%+{-7!$o@^7e#w2P9R7;Yvx17u%^Pkn;ef&2n4n%Rr1=sK1 zy&F{{iXh|49CfZ90uX$Nmb)f4IzJ&*sTy!_5Yi*VYy)bC&_=Sar(dTcIGtUz*R<=< z*0wyc^Uu{(DgJfynNw=+NT!WUo;+RGfe0HNYl4E@h{Y6U-XR~29qqvT{N*%YGcc^h z#VG|y?2`3@Pp%@XcI zvJ_(FS&)&0e)$s9jQ`x{a?+j8lvhIPw10Rw4`BnDmY$SD-&A2Qamw)FW~FTHXr+@( zboNZ;{$1MH0*+Rp#I;H1&E=uOrYvLRicK*v5~RR5oIBn&Z5KI&0*<1)@k`kG5)cpo z63`QWHV0E?&UVJTmt>=;x>q_wenDox$@jAEcOTYg{^*v~8euoZmz1%z_W>Jg5J(`m>Hg)8uaJ9=EJgeyQEFDSuRYOCFYy?)@oTV_@Fq7jG}JH` zdqj_}EsT_dFCS6e>Gs`{>p4ewTK_>AcKf_dFQ@gTb$1zqH+-%exV{o|-#((_ZP7WL zzKC;~p$?JpMeMWjS6*v8kF@2+J|msj={NtcC1`6;zCBzr?w*K24o6o@r%^v|4&F(u|ap6w2Z_5o|7z zn!n}B6DhVss3&XrGc$BSQh2@+B}FejlRxx{J_N(*bghR}+9YL%Cj~TL&adcxv8(r7yCPefDPOjF>OG${*y29fNYE zrDBHmqrAGV?rvIkc3eny)8$4;-&wWj)IH^Tuj?DGBlOeax&{xOHl6;eQ}%8QY>*vk zYko6QwUqT4y^|?ZNNyV(mH_>YRKfpwry(pQ&F?`kSSf?va;h}d;p)h!SihNkf3})v ze)KL|)F}4bwA{2b-?0&!d5}U@Z1%?aULGtU0KHMvz40s>Z`029 zG5OQ$ry`Bw7N+d9sK(eWG6Le^mSX__{#-vZ1bUW`=&ynXhJK2MWk`k4v9MqP4$Ex_ zkY&|ZT9uuasF z8M(w+b!tBR7?$T`U_h&{uh%R$^y^QemL5)0sK$X%?gd%soUSO$fP9?T~u ziGLLS;kA#QX1STK1q0Y^m zr4B5F)jKrm&-i)`E|R{!Ezc^}MSgt7dneI+jPNG{sd#*fyG6)Hx(8u$2maI`wS{%l zqV)LP_(T#-WtHBDE}JtK>))TAn@KWQv||iDvb&8$IM^d2XW0{JK>7R@PN4J!Yzo`} z`UZe7bcY{8mb|s*Jn1%B;Bf(7W;yeY;Q!%z)$hh4)`?e@n9; z_kOrJ`(wk&u`k|sReIS5?kco_WB9_nH7h)9I9A^tyX0DXd&omCUKH`k zZ?mXZTfH_oMnAkdUXzh8=ek z-Q*anu*MJKW*3_DX1OmmWd(2xFc8gg0)X@|D#$0ynJOrD4xx?VB1afmNt$VvNZ({H zQJyV4izQh82X3{yww7`^fg|;Tc)?}o4$Bg5_Qp*`2H#C4*#_UX>W0@Vp` zi1S>M>N}~Ez0_C5B2W#n5s^7Lu_*-Dz_&6vQ~-KB!j zWsPd`WFPW;v_j%3_sf0KbF*1r_ny5ekk;`ZO0wnT@uyi26i2n~{!08>S(%WVr%i*0 z92EU8^I?(XiMB4yKdQTg{2>!$(Fmdp$zoo}T7ZDQuFxJ=n5 zA*ju-FivF(-&%C$@$Dd;z0!5$!Gh!J9_6eJJl-G;LUH_RexYT$I5| zWYH)M?T22L`fe$evk@nnhB7F})~lul0&pu-{}ZFB`9W~*|H5kjpd0xAfO0cYuj$b{ z>O-RxObZHrv!8Rqy1L#R6BzvdJ!mnfUaI>WFuXb28GNbmW?WMQzvVJ92OEe4&qbbD z`dgZt7EWYJzOmt9caCsc3kwf_vbC|fiRjQoPzoh_^2t0HjqZm%Iq$)QKIByNF#5Lr zMd`PVKZ5vwqhq`#ArG5ZFVXJ43iyVDfr;56LB=m;5s7LNm=sR26#kUE%l7Su52l0d zcP|xwhC@)HeSDlK_N9EspLmw1N$Jjpj>sNHce-w%8TzKaaIjLN#<=85%8ovxs9(0i zkMN2us4Q?(*s|)Q*L@APx3{le!l%koexL!8NW-B^z0$&Y*XKBiosr*%_>yl}lTUfs z&lOXHKpuwaNuDDgld@cGGX+5bnnpJ$L)@Yk^>T@v7b=ZZYnC`H!zRd6R(YsA>R?&#_eXLma=qDaJ=)p(u;9(!1UBueKH7~@2*aY(4|3>N#~_?53{`2%s2%a{8T4haQK)E)Ze$`=e3GXBQBy~@z9yZ+E+)u|;sCF7fC*bWt% z!~>(M_2-!xi*vErZ*-0=HQDIUHSS5=Y&MvXoXq;1!6vZ43dS2Vujjt-0$L&4WgZ{b zB+*7~e~<>p%$(kUU%q_#FWDnM#IQT_ILZ2U>bF`t&2$7|X*F5Xuf1eqpy2zY=>~Zc z3sQF7?U7}R_3~cLd4QKrSh`)CsHy?;$w(4yHA;h6)6rILFV2X=pV9A6euLI;@46B; z8P@(1Xz}7)BFO4wg4}%(!&LjRL-UT^KOF+Ni+6cyK8T9H?D_tb+@BIT7=?$EPH=_5 z!DN#m;%aX~Fl1m@Ab20v6CQ~d<3Q};%D^u!LF#BfTlM7y0|N&@&+X<`GkAf?alj46Cu7qvPTt`2G8Loy!j4?k1bYA7oiv@9^V`$HG$g%)2S- za@#Es#l|aG=l(gFw~X%?y2a)|5*e3q;P0wqW@3P5XU-l0P!PL*{_^9GP{?$QSG&Gk zolhA!Zl$`@@$wQwNvFqg5UB$Xo4mqWs{3MlEBJVC@0c2Yyf8QkvP$GVp1Ixbymzc> z;kx=wOhy6=SCKvY{#4zEx&6kqsQWG-QEG2&bMgtKy-HX#Ybu2Ctqg_^9`)@{JL3oN zfb3`b|M1p~O6~`OTAPhO@t+2hd9gf%>Q6X*@2l^~V5zuf%0RW14=+sZ%m)l3O8OQ#f&|jxnVfrr1>T-XMft-3PQutsb#cd}u z?5&XNE;3N(woi_Gg(`XU_x$p@x`HyswIAkndb=ZM6zjQAYft?%*ymhO{0!Z`fiuKUm)uN#^iO>TeG?II}P^CN@Kg&F8kK zX>`6jQJkHP93^tn_vytfQ2%>lYYTLStc>9L`kD!#`T;5a{1{HOzH?1DhFcv1qR=T4 ztkJGjkEb1t$^+;rw1}nhkl-)j?#OwcU@Wut{W$>80Po&NstzP_UF{ZuWk-GVQ8bWj ze*OA&bUPc%noOPaTR54B8*nrWyT4iY1?Tyz)&Ii)!1; z7#q1z8&dv*!X zvq)$t{P_87R2Hj_3!JPTW~vY;Vb>Kv1a@a1;-Yyd-eEK>jBWf&p9B2;5kKFbPu2O}3sqEBW=vQ+uJ;k>HoDm$&?CG|G~PLTaj%eC$L@3+*w+3YA_I(#mg0Vmy1*3T}2r;)%qxljHiLeQ^Kk zD5G4x7U(e{!?$-HCVz4AkG(X!9|V)2Yq?Qpu$i2?cXCJKjFywF_5wzae$&-z*oWDJ z^P3-n)93e>_=Saj$>iyUm}-mqSG|zV3ki{zXjl7}m2ngn6~)BH2H4|Zk3Pv2@>A_` zw+Nm{(*bY9^Ap8J%5PMxd~{;er5h@^7zu0%H)(y|B(o$_r&A-48y9wlDZiZlQJ#ZY zrA1D|!1)}RiHYgzs1q-U)ZlZB>;5b;0s;a$9$rX70;#o)%`xO8W>ljoxFwh_t1yGy zcbR6+{CegdA6!o=fbEM|-5cbU4`gE0fAtFAV1T#dtc4Ow|69o!fa=7IP#rb;+c&yg zVdu>c0gtm;N3D5k`C6%l>tl~ozx(|K|9xUWw|H&s>w~n(X`+^iY=ny&1t8r2OjrI_ z!IsAKP!W~%JY%R8>m5P%Jd^!bjY@;$3OmkAWqi8uwinSUjz=8yr$K+Ml^pS}-i06d zP4isnIdsS0!L1L#fIid)Vn_d5zW@JTI*>!>3vJNP$a=sUMhE4#k|k78dlt56(6*Q? z40O*voHglpSc8m+&(S+}$nckNR|sxb4qLxuN_JQ$ci#ef2s=8X2wpY<87A;q6xP#2 zT|mNR>#YcnBVQ`1o8gEA-sh9wc#0?&s1AwU-E6t{a+=uEFgL^h4trM&6)LJoQqSk3 zN^D5WF-(GK8=RkK3dC0Q;Rg$Pv+<|T;_%m(ylL1v=TYZ6R%Rs@mlBKv}MXhaVnA3hUx3)w%`w4R=b^f;1>c`jSuYu`yG5uSX~ngdb4#s-hC z=2s)>`h9~}TK1x|4VDfIvnb)Sh$U+~d1>ZhOU+mt8ybpQI3Be}FtkRa1lK4JXNuFv zueO}6uY_@;815*V=RDwfkC!QKyezVCVXXRoW|*d-N#@sx_il#BjBKIFpj1_s%ir$W z$39;i2&vFM=RktUq=7ElN!4kIoIwZ@?i|h zc=Uf~^Xm2fo3DfofISJ{R}a2o0upsHCJD}~721OxyyQmnS$GvE%)>J0KF!wU$Nl!m z57ge<&Q!ivMi+Amouj#7us_ypa@8?cw`HtXXkAEvsx@!eJ=xoc8eMnIj@yC9$zA|3 z1Mf6`9D;C@qsXt_Th0utkBhoRmubC34-1B(2E`s|zM}!4BfWE!fRD(^64~*la4{E= zQ&mg-=X>c_rz4j};a<;`Vk#^ke&NWe&{~w>&3-7x-aIX2EbU!Vzu(62g*c{cW*X-roNyS3ouD2Luxf>`{suf^HM8h5|exN5stlV zU!Cl_KZTPVkmrguVf|gZcF3bTnRxPEcA*TUU@w{|<_1bkpMAG}Z$%L^tmsV;av|R) z9}^_tvM%u8ScGX*LU(kk5RdPGzE9PHSRzB8jTjoGQTbQ(lsDu>)9_sb9#RowPlSr_ zdHCjOJ<-aP4;gf?6XJO0+3B;0QuwL=O1|9$@dS!RSHb2U&S;>AP{C8J?6j6VNAUh< z0NW&g2;1X(bAZ!p9-s1h19|me7X?qj;O}HySU+$*=x~^QimpFNV7u$vn>$k@R)nLd zjUTjbCZVHjs`IhC`A=e2+NZ&*4*_SN^^KJ7TSA);#YT}! zX7I*D?(Xj|8CjX7E&IPSHhB?eu<01T*Av=l;&Z*3w5~n6<6x<8!3$Rd)6Faetc(0u z5^NN8wF6*nj4r#skZOCYJ0d99qJ8g>MYLVILe)}Z3X|BnEDE3IA{G>oOO_~eM@+u5 zwG&IOJXb4xyxi0t4FuAA4|44ce{u;Wq~ND>^A?>i*{%jZV!_Yle;Ex5v%bpYeK>Cu z6{vb-yuoWio0u@mFJY1eFLFMKyt*&~BwW?FYVJ6aep~ssgKo$`cK7Z82aZG)4!m+2 z@LaL?AU#l{15*-scB7Ni2tA{%W!=8MR#hcUz1}bjRda+5AtUIiS|0i*rKB+{w#t>% zy}gVf&(eKcyVqO{7&A@BkJx;LqoO|Qeyjyzm=(S8`YL*(50HPEY^+(6M zk|^0`jr=mfQ`I1*zg6bToRy(H7^2dAoDsR`0<)*~^>M@BPhwI`Fb6l7k5y@IQ;wjr zzLKz-NcnsB`s7u#&6a;(oEyYyD3nZu-K`G=xa1?Hhe=eukVePA=CW>cqKJVq+QK&c zH_|)o{^y6=oBety%)G6~_Up8aZ!DUC==<6qe{fEJ{mWiD3rgS{n`nPE%&f60T$(|C zobWJNzZ|W+uCw`h#5*KK<>(;b5kMk3>)MI!1w8nYNDHj8Apu|~ic-{F>R*h?tM%18 zNtNN)L2kSwUnwiGOatdwn%%lm^*rPQsdB*A}n$}#XVVs8N?oOUHPo@}i zQCpUnP1OWa0wytW+t6WNdCRXP5FPvEwW}@G`i5FZXBOeLr`FZJC8L-gMc~MY;z0jE zAiLZH)$y_Q%WN%sU%=t~&arB5TIaBq>w~O+4}E#hq*;7R!P}8H$d;uoTz~pmqEk|W zF81N_{Dro0mR^fuYy=Y|eJybj9YsNmMeH?ly_6oq!x65XG@te{tR0d2KrDl1TxwUf zD7iO4)1ZR2h?6?#v^F>-#zG#+gNP{^JPofbgr_bmeW85Whvoes3?=Ho2}RnImPh`k ziH7!9IdkB~$ot{7O;x0HP5!+M8mt&DcYaRp^u@jGxbN|qs)Q&f8&lQsZ--B-Zmc+w z-1Z4k6E)4JnWS;~e6J(GcR1egC=Z9~=mvZ8)8kVK&w6S*Om@`eh}}ZFE0=v=K*Gp~ zHa8?FV-s;oH8C(qe1)4fyBKr`FV7YR!Z&gsyR#cW{Z_%Lk(vufC+LYo+ zk+ZYpRrVk^yPi-;k+cQ@qPTrgh~*Sk)9 z9xG(3$9!$q0+5q&mSM)K7?8WlxP2uo5^k1r+05fMh0??6X6wkczMnOpA5V7mWO00A zq!MJoc4qrGRfmyn4P4$(_{T^m!wX6(ZCD>oFCBl611K~zMw^6P*V7*(X*^xfFaYoU z7wvVtbq{rqzk;0W$E1mmYKA|=t;HEp}tEcXU)cqo-u3CftiSBPSKzE?|(;(E# zr)D3(Ng2q>7Prnr(}_z1bh+^rf`_wfZbZOm<&cY-j{9fGk9JjX4Lb}sH?AKh8>u;!XJlgu(NF^lo8%mwx7@DahhcS2zsR@^ z^bVeEHG&KJA=%j&av;TcRV{*?@XsT3d>EN$^6nAcy#WL(5;!GW9zBuwFy~AK))8Q2 z2%F}2;bRrbF7^BRqsX-fw$ov!8DA<+w{m*?Z&tyKGSjz2A4)4r^FPc=+PiT6v1fQ$%qCQ8Z^s*Sk(D z;Gb^eJRWh0TxP|bm?FKt*``EmYG)TTLLG;7Zi9G<8|-0;-%>^IA!x*`@Jig@fo<=C zFLYCrQ>f!kH=}Tz?9exsA@bT;&8w!gfEzkt+ML3RqCxLabNE8KI@|bXoZN#rgXwf_ zb31&LI?tfahuUtQat8`M?ykpA#DhgaVGMtVXSyAL-{w<4@(#2yVS3Rf-MKreWC0z> zWZ%?M`5Zy=J{~WTr6%u@z-RwD-ilu8!p=HH11E&^rkK<#gcxnd9jOdbnn) zh}ldl{Z|hJhN;6v(7z-wPs$qkc=t_@c;rAVVYc-*6qC7~{C)QepN|Uuv``B7cH%h} ztQ6Q>T0pV$SLTj8!0X){s!vD%_p99t15xz6k~wy$x}&;Gh%T?cEu{>j;%wuUfh24W z$73&kh$aMW>C34W)6hWu4ff%4G9qoja&4S_inOopQ>n_>?n?bTec0I73f_k zc7cHviPrQyXgQBll;zU^w=y>vgG!@P;uK0ySNTv>XHUC-p@g z3ti%K>zo+}@;j(UBc`7>|I5PZ^kE^o6G7^(T!dd%f0AKY=Lj%3 zQsn5Abu|Fv(nyd2&_5pr(+Ob|=+0WFu_oyremH2u@cnWIVo?OkH#q z|0+W=&GpTYHnpfvj#7atw1=#bs!nznp2Wu@^?$3;YPjJG94uMEv*D2Wz{3Y#bRe2g z900eZ?37ho3k&7!_0`nkb!yeQ>AB z#aG>Q(djflLQ0QXpDbcd`TN6crijNCK>q22Gj@KK!o%(Tt(TUe&F2v~R_QA^k=^B( zbp;oSI(Ep|b63TB3eG*5=nlFS>d_=uR=+NWA~$ZVfF7p5PrDOalxKnEiA`Q;w(?AQzk;AxrWH;KC<{pRU`IACIfcU~v ze#3%Nnqo6-XMKflq8!Tkq2|mLfkh8j zJ|v)wL>~YQ#HpKJZSi)0{hpJ_Npx5u8Qwp=f9lmq9=$IlQ=N9nZC-s)jxEM+h zrA2xU6|I!xypRG*CW;3~?*Ol7gpl)lPa|tT(nBRiBR{U%lALvoU<&?oiXXrH+H(BE z`@BOfL`RXBQ4-%RPq2!h;nmP9stUo4ZnCr2y8bkKU#q6_suJ>b&8O$Fw7iYrw>Ol( zqLObNGyb`_Mx#SoyoeR{PTCK)d4fvmjq{Y6SpQnXJ_Z&1vOLh77Cyxf+ywq}Cx9>t znZCGpCKBl>4fvm4vJuYzcx1N!&`mQ>_)6lRgZ|Hww2e4zOcLLTJ`7>3dt1};k>$Pf z^wMWC3Fkg6Ndc@U2!!TRK}C_94b<6q>~^J|&qFr@-;>ek?Va}t;)Y;qJR3SPG_)WO zlg5wiU`Or4lHMUAk7K0yK-@Ff?BHY$4tR=wZCrU{{6)!Mbet`M z()M60j6HTdjwhMqjw}h|zp4>tW`PL3(2L+gFr2<5Gp-2cc1eNTvLBJU<@6&B?3uLk zXu>(&w0_>opLYKMSJ>-{F_?Crd+7bn_R%fH$?&=gS)IkBjRMg+5p7cRl+xRIcN}-= zq4s6Lj85!d+~JU%X;WC_9=@c~$F;gf$=?xzw-bxE`r3o`ANnUE@BrvF=JX+pVd)aY zcb|Pm3#8D_qQbgQhhGTjt=JHQi1=+}HB;)V?&<+R&&Z$gUuCX7Hs6xFt5N7w8xC;? z!-F)m>szqY$Ol!De&E+no?$c1tY@*x9W=AKYF=Newh5Fr=#2KhNBTyx&lQH z#!+hogwR9x#{QJ$JO%O2*JKXF*e$^4j9aP>mwt26>ukEY;VjXIFNz4D)|B5x`;dh{ z$&wIRBYu1&A9nTp#2q>OD!t1A{r$t*EprCefiH&8-KfNth<4J`zs79g<%elC=N2(of;^H-y!zNN3_Fv;-el%Zg zAz7^03ZS4$=N4g_M+Q9`_{GMj&wr>G+;&j2-FtVAo1hok++r~=A-smwQaAdpA+nTA zhZZL9=NDY7tclnBop%-DbE_fLs7u`cVx(5SA|l9}GUnV}>(+0@JeCsHRD_SI?P-mm43kN| zQG@Nl+6*F+MoHYcfb%IgkJ!gs!&Hn-8-&Ibg9#a8#3t|!8+?DJIzCPI4OGzvXgJmN z#((9OpH0lJkrIt|z!h94dL+rq9JQS%;c=+jk%<(Jf(`toPc*)W#Pv+l;*>r)f0{XA z4Kc2We|TyNB!&9Z@Dby`0QJW>`PXOHq|DdL$s28Aks&2!NF08v zfGg!Fe<4WY!DMZ4dsf_4oZ_2uwL5B6ydQCqx#M~<8DEv!EHzrz&|Lgdzalv>mz& z&74Q9t1~gk>D-a~2Jry@W<<_524vn1wLT&jJBNZAO?4lDtj;=z6Tj^bMr>lOJJx)* zL}ME5wf1u3HO#$hA%EcUsnk}VJq&=I6mo;r8ghySCqV{pI5iV72j++vO9I_(v6jDn zZ_n#idarKf$f3BSXYX9MW{>L`jb($WVba^3?DKb;i|_MUYBk&ug;Hr_54ZDK_{#qZ zfq2>_LoQX?Y)($6(clIqb3e}dLZ&r!4$DfZ`Cq)jaPVe z%cjkKGnY`IO;i5Fn3*4_6EyVD{S=`{PGM?$aO~dOq0O!TWj2F}BUYUQTpV7235?NZ4FB^4?dg!Yy#+gTZAI zfTs}0EbedrbBo_74mDN8cc6~-tt(%x5t!48xAduggZaLh{ z^1J>$aXXIhx&uR=Q>9oUk zZy?kA(&I%vb__mG#wKCZ)#2a2-jx6n*X=82WV$`P`Q$NYQAJ@(W00?pKcRP!g=nr z+Il~C%aOS(0)KU>Hn$jaWKjTHp());u%&10oR?F=8B_T^CXj=P)p>_dN>QyjCaPcH zv;46+z_y-hFK4iorQ~pk2d(ooUSvNve1eW`1%;&1_)GD1;lQKT-O%7+--`uRrnT5i zrHJNiko{qmKwa%r6q!@CLYC(tYE!e4y;4VMkZC!t0Y7ETVWOk$+dVwg$FOjJWc2zQ zMb6;TkxUs^AEjOx)&%iU0IXE(A-}Ys{pTO2u0Q#gJr?9f`PuiwF+B{@L{}bsFbHpf z@F^1|{>&bBmwGgml(9-)93um4@8E{r2mU6IgpvS3$2c(12EQFS&dbZN?WDV7YCO&4 zCsjrB=*O;6a|VWp3q)R0m3`m4M%^I)A`MqLT5kIX0Vl;KmdntWXIiHNm3!t299U(0*T?DoYa@zvr?lT`P+Er7EzS%C`38zvVNb?rqU3H3zJWC`3 zw|dQysy5WvF8;nif5D|TQS|rPzA!bu6l1FQJwCoRKkBO+60bBrw&|wJ^S1(s zDz*-h9wNzS{Caq$@^uzirfM1)q%eHwxbAfgiK-yQ<_;o5GLZ{Aq1@^-m9Xg;p|wV{ zSu~e}8JOOhMUGI8qMsCgVB@Q+nH<#za0a9C3=xHqnI1x5Kd>7A0W>ICCOV1AgdikM zsQLf9-5=v=I+layERPoj0Kv|g%7e%P+7d&kq4N@R zEX~88qA~HQ5en*MZqqf?jVB>l+0v_PYJ1fh!*mw)sJ1`VgoT8^Dnm07B&?dSnMwQ`o=k+~@WJ6iD#Y{{d|+iY?3~_ES{lviZGr;ez|!`frt|fXLAZzU9TU4iklN zq68E))J*9xuOODO<*xW7e$S=OZ9iA>j1 zR3oOHQ~_<{!X1fh?Z!x|9d{39t_r%%m25n>xRRnrxLG@17YAX)?={k;{x;V+8!`fI zMbcQRY8pr*{Bi~Fw5@|HErv{i=-33b$MndTEo%bqV)Y!9} z>Ld+rV&3*E4`PZDF!)M`9qGf{w}!w-nSuD#ttw{iiLa(Kyg08kBS$R*J1Z-JLL{AU^a(VK< zyPC~rSxanfn;M;poL)Q~eD?>+f|s;u2*;r;m0-RUs={&Bx{Nk&l-9~yxiY4P!HHiJ)=RC+8$cwQNiP*R5X_J+4d z6%_RK52K}rBiN<=N=3oOI|5+rA&ry15T`PAWav+=U-rBa|5{m_b_~G&aqW_$!QlH{ zS8tJ~b)h-{%Lx)3fWw=kWk9g?@tEt%N#`BJMHcm9d_qD(&4$C%L?^frHU%H{9iqW6 z<5Wxk6#heVYuDnsz5C0h-u)sC6RY8$%kc8Nr{pY_z%4Ofw!#gN{&B!G#Q;YNnp^v2 z+%5F{`G+=W^s?Myn5yY$`|VLa-iUO-`6;~c0N5br_1LYqa4_1ht=rGRFn;4s z>kYNzQ50{7K7`xX9-!LGQa<#nf2tpBa_fhtcPc>~^1%Co0ssb{?F5u9>86h_lv;7# z%chA8L+g4Za( zh!7p(qQ1Tdq`l^UkS&_-Ug?~*qamhgXEJQOJs{}X4=vgs-&IeYG0Ut`DAI}X9Wzskc;G{wQ#}U@josH{ zhm#KXH?F2;7Het8kY-M8fkV8WPJ51e>Fd{sW8>qFYdvO;RF6Xmj#uDy!}{{sj_wb!RFGwAH-&fpGt`USC(>7v z%EUw}?6S)|M9pak2wi(_r;h(~i7*5tLsp;MqzxODfwWdiZi}YK>(d1IAY>cQF7{@! z_<2cF=-LK5gAt&Alb}^;KC^yeGkGVQDB{W7xId|%c?~s)82~UUQSVh#FQJD2b5c_B>*t-M;}xbyRc5eF9+9z5hJgW9Ed(;jG_Z089v@W z1ieZ08eIs+NfP3=H?C#0p5EQvA5Z-<@j7K-)emyzkVgWbWNlBo%=pwGdXidiN z5_#dVpF_a?L8K>&qBpbA%@!Z!dJ3S+LvEJ57u+8u`5cKXFyWU#Rjj8Dts-|V|*WMp&@DTw%; z!>70bd}IV@{DCwfidtO%-&~f-2lrI*<1QlqU*~;(S@N)yG9*OKW)T79rP01>@P3p$ zf(+pVy%zEa+e@wDLksz~BdF7@AUFw)!M+_oJ)fo*cit44OUHD991CB`c%gneQ0}nu znuOo!xl<&iWUbx8(EeO)S!~I_iH_GkP&3IIJZ$Oo1OOf_7s!b>HtGsiIm(4)Xdg%H z&C3oWuU5!LTJvUXVH4K8pm&S6`&oXGiFndaTs1=)#DDx;0x9mJjJ6VfG>K%Le&Ur# zZ}}gUTxV2MO}9QFlt`!|U5Y4R1(9YDl7JM&&{T>b1Vrh*83=F!(q2JOLBN+1ng~dh zCPj)!RhlRu5IO{;h=eL7_wd~xcipw_pZjChSuuQh+Kc!ad>41{!NXO8zh;m54 z!75jaGg49#D3l;nGV>nAI*SA61*M(=?hU(ksW^kkB(g5KDD*vqy4i5BaVS z_dfXB6zeI~ZE(=x&ISa81u@u;@bdBkq#w?Mh&xgScJGD?xutN)O^5w&Il-PZOq{;R zH30>83K!w*9?@TMZL``TLEmQc+6X%-7xMtUpCRvyktk<8GHjl4Lat z>ci4@|7=9~u-z?>-3|h}>25qg+OAME`oj71Ldj&)Xuki@3_d&QUw;}My`sbx+VW2Q z$&)8q@WR4EM)FWm@yOOIly_L0N=I^Z8NyI#O0jaxBqvu|3pBqpVy0rMm6qJ8(Alq% zYu>$V+^zXH$6cmP0&Cym1ZVV->S!Dt*uM&`@Tl_s?+t}IMGJ*bvqnyXv|Ni9ALd)M z^|&0y_G4_$|DE**Nay0E<+1$iBemUw4+NOBAFn)}SzJVLaAZ}3uzjKxhi5E z841f>VwdeewffK)hF-hP}_xEu3(Ac&zjiS z*P!Z~&$)UjCnn0q7-0&R8|N97)g2YjDq{cwco?|Vm5TD~+)IgT>;x2?T;_Aicw6#% z*OVb}UUPK}K-II$yl>t6Fqdd?(k?i4u~!vr0Te7~@EGBYiqp7i8B1$fxC@7XiRa5* zZblnqcN>6$HVIMU%D2pUDlX;-fl!Ks*Vk$N=<}?vjE$e7PqlGFsA72G(p$=V8d9BW zEBmMFF>MtN_xNo28HNu9yRce0us5;_X6PQcItYspM~r$B7>DHyyL;LOIkBL0;q|{( zSW_hol<_4_c^oCK#SuEzKZK`__?Mr4{vRpf(Eptw{(p3RGy)s$Hy^cs_0P$kt4tFC z(^*2r6IzueLU*+_&jzpP^n&XK#FBx0_O(~0R-O*9!kpmFU;c#;H&y3pbF6+czZrVw zEJ@k8wX!*}Qe_#f(lW~RwKmB)Sw?7{N52OZU7+?An$OX1nPk__an>fZJTlHcJbu;w z=-HUsv*h}F^I9dW7Ag6TS_bB9Vgk+-(feoak25hAFubVWER8(<-?JCf=EbSMac5S$ zwRbbWi3-`BUa4b_t>_-^cDSAO+u;I1XI&v*Rf74=XLPm@#?j092^FmF4l9}X1}W=tPXIHvOKKef$^?PHI63drRTrDnw32-J0%s4wy9 zJN89Ws*(<%{NnZdW?RSf8~-XDwewyyBd?2={i;CijRf!nKSVJqeg1L1>%#jqZwOG#B-A!?S9l3l324JkZ4ywDzkuVNVu2jDYlV8D|1TbXR^j-ODcJy)d|V5KKSV4sS~wP5GXjti8#e zG^)`>mR8-NI(c61**9hef#i+e=F0d()Q3c!a91lrZ{c|uF;lIISr&gS6M);> zkUsiFBe=hYCY1I>u*n>w%3w+DR_}AI#{RIs(o>HXD?rC{`;1;%P;uvg-fEN;41fBh z!B^!kU+d!>S=ybl5CN7Y2mqg9{a#`5NiqYBT0hNXYO;D?dP*5(DpF z+n{ZNu5t~dc+1(&f%UU-I)42$^1i%x z&)aGNi;{eYvT)SvX>LO&9NY0LSDp*;JlTn1^Ym}y-@kQG4+R^1LPAbMY2H&~fDN7HD%-Uh^eaeU zT{gaz`lXJfJxJzK5zUMg7+ z9~e>wC1dG!U)P5JYz&BU2Jd^WyK$`HMpwWZ;?MTZ-=c zI;0P|Dk1`~o*7g`Kx3_7!2?vjoLt`hDmLIUVa>YLCnX*Y+?BDIHw*#-lxKC9E|eWW zhpV8N4l!F-p&8PT&Qf00&ibsQUH&ndd-Z07sW(XiKtG~pmpvu7ZvJucznr2>UR!o{ zPv?3w793K#$hw54x&lTGq@^Ce?JF*TaJ|~xYV+Pm7N5oMEzlA+S%%lA?y@@kgZI`g zL!(PCL*`_ow`lgAnJ`^rD(Bs{boI~Jy8xPLp;_ejWPy+QAD@rAN}j<%h3I&2sd7>b-J7T?@Z@pmR2rV3 zkf&DFHhvonSiWCwa#qFTh5{wK<_%%8rv1oZNIfyp949~ZC_3{N9p4IGMG-LDsV`r4 zGrKj!et-N>G~wGJq=CUo3tTqDCDb8JfaN?z*(1}#y(~q8_umuBN+14t5K;~IqSblr zzE7S{F@6Uu#JIcLNwsvsC&fI|UsZ73%`3`>flVa7A6#MLB&Me8hMBX!eB~&EbwNlN zP6u+M6CU`&hDtUycPAKN_X^G@XkGH?_w+|CTA%aJx@lEn74daTx*8FR@YAKJomx&f z+!I$NrCzHeixKT$STRmWN@!N@!^bez{Au;8J7)C4DC%j9Msk7VgF4C?p-eT}0GR8o zaGUcaKQZ+D4`f0$ESFsj37O5+kG_e;LVimZ^ZqUrU|+ewXRp?Bxp6QrI|S*Rrfz}$ z>k7^jXja}ibAan@#EtHfUdqAqq@ZI#tE-XwG=A4_ct{6khs*aB#fm<)c+Raqk~==z zro5a^&#=cu85EW_qNVA&XbI3<3jn%q`G`Dl zTjB|sh@F$DvUr@6*1$X|1Y}%KF;C-W*jed1S2qU(ybgOl!!7J>M&4qk9Nf;uHlR<4 zq!V?^3feh()xwcqtTZ8i9MzUW`x(8kHg@Of!YxnDN(=9AVyc8vtGdSP8?eYZ_0<*X z3-SpuyzvvCvHii|3Q%Y})*sOxjE+J--fk%)b58Ht&?|1CmM2#E5-h)4&Oqve0i5Fl z!V`t&;c?1tpL@u`1qStxDjmWM;)EmBqxmgzUZJRW;udxd5{a$6#&-{emf^iu5{#3? zcZz?p0`~IMz>#+{izfh$O);C$NaZFcr1*|W^Xa$3#inWC#>TOATi+%55jkdn@tL-* zNiN}4x^_HsrAk$Q#g+>q(L`N0yB>;)#G$O+Yrs3670(*;bJ3dW%?~O4WDXK4+D1JzdzY`%@@JOz2bdDWOZRpU) z?_2szayq11!&!=gdb!Iy5mo82rX_k&~+c zC~+#)#UMn_m!9XXcW*R@P|lr+2*S3A3gc%#(D_(J z|7$BV<+`qDfh`6KVnL<3qXY6g;SiF!;+S(zQ4NjHS89UT!0P`KBV{QHX^o2BoY>qX zi)|U$EcU3e0rl|xjYQ+banfUw*!f%T3*AXA`&U(2$7-A!1So1(U4=Z>fmi^m9npXq ziTb{bGrU9~1Pp?M32+=~k_lm4oB2;@v1ds|Std7$i8~`Z15uj(ol1V>I*Ki1Jy=P0 z8&-FCcjL2P-OZRS$bE!W3=H*U>J=sHk0d%ETcivgLYsjV{el~@oINTl+5YXtwlC}9 z-trfyo=2G^|!i=d>^)}Qv)f4CuLV6cZil|LYW2qEY%IghO*xZa^DGad{rG*3 zUqLizh-JK!o#NSHZ$vU01{zGQ&BxcKHl}-DCgrZC~~-1jIgb^1sl(2EWUL?5%n8@c`SP zQvg5y=Bqo&R2`mBB~A5YH#FUWIT6FctXBvVAZPQQaK$8xrR#4*5lx;RxZV)E#xtKe zO0OBclr;$>lWYKi1Z#8m1OHY04l@FWagTF0p#@64o6%`iR6o|T*6-)yLw?}^JoSLX z1#W2ia}O~}E`MtO)&r9fW-o%BrG??EwLKmE*#$VP&8>XOzT#dZu>VR4&s~Vm?<@8X zV2#neXSsyHczUhG`pN{J%4$8~l29@P6W_^K@YgH$jUY$eyZD68*N9-YZoA2)y~u`^ zkiat8+!bn0Vq_NQ=AOGPb;$8gRMc5VHmrn1m*juOj>DfvMS1-LyP>IBvw?il8)ZKq TX`2gOW(wTY($_53unzq%Z>VlC delta 22039 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