From 06adae406b51ed573c398d08195f2f1cf3effb1d Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 5 Mar 2025 03:49:53 +0700 Subject: [PATCH 001/120] Update aliens.dm --- code/game/objects/structures/aliens.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index cbf41498729..e80f6591f93 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -245,7 +245,10 @@ qdel(src) /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return exposed_temperature > 300 + // FLUFFY FRONTIER EDIT START - xenomorph_rebalance + // ORIGINAL LINE: return exposed_temperature > 300 + return exposed_temperature > 345 // Подимаем температуру, при которой начинает наноситься урон до ~75 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину + // FLUFFY FRONTIER EDIT END /obj/structure/alien/weeds/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(5, BURN, 0, 0) From f37122e38d67ffa1205793152918edfa4c48c165 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 8 Mar 2025 03:41:13 +0700 Subject: [PATCH 002/120] =?UTF-8?q?queen=20s=D1=81reech?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Завтра перепроверю... Вроде нормально, а вроде силли код какой-то) Как минимум нужно убедиться, что он работает на хуманов в мехах --- .../tgmc_xenos/code/xeno_types/queen.dm | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 4830659f5f2..6094b8eb15b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -75,10 +75,24 @@ queenie.create_shriekwave() shake_camera(owner, 2, 2) - for(var/mob/living/carbon/human/screech_target in get_hearers_in_view(7, get_turf(queenie))) - screech_target.soundbang_act(intensity = 5, stun_pwr = 50, damage_pwr = 10, deafen_pwr = 30) //Only being deaf will save you from the screech - shake_camera(screech_target, 4, 3) - to_chat(screech_target, span_doyourjobidiot("[queenie] lets out a deafening screech!")) + owner.visible_message(span_doyourjobidiot("[queenie] lets out a deafening screech!"), self_message = span_revenbignotice("You emits an ear-splitting guttural roar!")) + + for(var/mob/living/carbon/screech_target in get_hearers_in_range(9, get_turf(queenie))) + + if(isalien(screech_target)) + shake_camera(screech_target, 10, 1) + continue + else + shake_camera(screech_target, 30, 1) + + var/distance_to_target = get_dist(queenie, screech_target) + if(distance_to_target <= 4) + to_chat(src, SPAN_DANGER("An ear-splitting guttural roar shakes the ground beneath your feet!")) + screech_target.AdjustStun(40) + screech_target.AdjustKnockdown(20) + else if(distance_to_target >= 5 && distance_to_target < 7) + to_chat(src, SPAN_DANGER("The roar shakes your body to the core, freezing you in place!")) + screech_target.AdjustStun(20) return TRUE From e6b71cce8c9b39915e0e5bc12514a5708683e902 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 8 Mar 2025 21:57:59 +0700 Subject: [PATCH 003/120] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Действительно, накосячил))) --- tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 6094b8eb15b..37a9e49ee6a 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -87,11 +87,11 @@ var/distance_to_target = get_dist(queenie, screech_target) if(distance_to_target <= 4) - to_chat(src, SPAN_DANGER("An ear-splitting guttural roar shakes the ground beneath your feet!")) + to_chat(src, span_danger("An ear-splitting guttural roar shakes the ground beneath your feet!")) screech_target.AdjustStun(40) screech_target.AdjustKnockdown(20) else if(distance_to_target >= 5 && distance_to_target < 7) - to_chat(src, SPAN_DANGER("The roar shakes your body to the core, freezing you in place!")) + to_chat(src, span_danger("The roar shakes your body to the core, freezing you in place!")) screech_target.AdjustStun(20) return TRUE From ce640f825aa04034ed7037565e6dc081028ad9bd Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 8 Mar 2025 22:04:11 +0700 Subject: [PATCH 004/120] remove NOVA one more time --- .../tgmc_xenos/code/{base_nova_xeno.dm => base_alien.dm} | 0 tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename tff_modular/modules/tgmc_xenos/code/{base_nova_xeno.dm => base_alien.dm} (100%) diff --git a/tff_modular/modules/tgmc_xenos/code/base_nova_xeno.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/base_nova_xeno.dm rename to tff_modular/modules/tgmc_xenos/code/base_alien.dm diff --git a/tgstation.dme b/tgstation.dme index bf362b3d612..b55ac343788 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9083,7 +9083,7 @@ #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" #include "tff_modular\modules\tgmc_xenos\code\alien_egg.dm" -#include "tff_modular\modules\tgmc_xenos\code\base_nova_xeno.dm" +#include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" From 28a8ea8b7aa0f1ede4cbc04fcf30afc11ebe3c5a Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 00:30:55 +0700 Subject: [PATCH 005/120] =?UTF-8?q?=D0=AF=20=D0=B7=D0=B0=D1=87=D0=B5=D0=BC?= =?UTF-8?q?-=D1=82=D0=BE=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D0=B8=20=D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B...=20=D0=97=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BC=3F=20=D0=A5=D1=83=20=D0=BD=D0=BE=D1=83=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tgmc_xenos/code/alien_egg.dm | 3 - .../modules/tgmc_xenos/code/alien_powers.dm | 491 ++++++++++++++++++ tff_modular/modules/tgmc_xenos/code/organs.dm | 38 ++ .../modules/tgmc_xenos/code/projectiles.dm | 26 + .../tgmc_xenos/code/xeno_types/defender.dm | 85 --- .../tgmc_xenos/code/xeno_types/drone.dm | 40 -- .../tgmc_xenos/code/xeno_types/praetorian.dm | 88 ---- .../tgmc_xenos/code/xeno_types/queen.dm | 11 - .../tgmc_xenos/code/xeno_types/ravager.dm | 78 --- .../tgmc_xenos/code/xeno_types/rouny.dm | 55 -- .../tgmc_xenos/code/xeno_types/sentinel.dm | 122 ----- .../tgmc_xenos/code/xeno_types/warrior.dm | 50 -- tgstation.dme | 4 + 13 files changed, 559 insertions(+), 532 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/alien_powers.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/organs.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/projectiles.dm diff --git a/tff_modular/modules/tgmc_xenos/code/alien_egg.dm b/tff_modular/modules/tgmc_xenos/code/alien_egg.dm index 10e15b9ba39..c28eec1ff45 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_egg.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_egg.dm @@ -1,6 +1,3 @@ -/obj/item/organ/alien/eggsac/tgmc - actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg/tgmc) - /datum/action/cooldown/alien/make_structure/lay_egg/tgmc made_structure_type = /obj/structure/alien/egg/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm new file mode 100644 index 00000000000..4fe6d5a4e24 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -0,0 +1,491 @@ +// + +#define RAVAGER_OUTLINE_EFFECT "ravager_endure_outline" +#define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 +#define RUNNER_BLUR_EFFECT "runner_evasion" + +// Наши личные нейротоксичные гланды, большую часть мехаана которых по хорошему бы на ТГ перенести, ведь у этих куда большая возможность настройки без боли +/datum/action/cooldown/alien/acid/tgmc + name = "Spit Neurotoxin" + desc = "Spits neurotoxin at someone, exhausting them." + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "neurospit_0" + plasma_cost = 40 + /// A singular projectile? Use this one and leave acid_casing null + var/acid_projectile = /obj/projectile/neurotoxin/tgmc + /// You want it to be more like a shotgun style attack? Use this one and make acid_projectile null + var/acid_casing + /// Used in to_chat messages to the owner + var/projectile_name = "neurotoxin" + /// The base icon for the ability, so a red box can be put on it using _0 or _1 + var/button_base_icon = "neurospit" + /// The sound that should be played when the xeno actually spits + var/spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid.ogg' + shared_cooldown = MOB_SHARED_COOLDOWN_3 + cooldown_time = 5 SECONDS + +/datum/action/cooldown/alien/acid/tgmc/IsAvailable(feedback = FALSE) + return ..() && isturf(owner.loc) + +/datum/action/cooldown/alien/acid/tgmc/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_notice("You prepare your [projectile_name] gland. Left-click to fire at a target!")) + + button_icon_state = "[button_base_icon]_1" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/tgmc/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + if(refund_cooldown) + to_chat(on_who, span_notice("You empty your [projectile_name] gland.")) + + button_icon_state = "[button_base_icon]_0" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/tgmc/InterceptClickOn(mob/living/clicker, params, atom/target) + . = ..() + if(!.) + unset_click_ability(clicker, refund_cooldown = FALSE) + return FALSE + + var/turf/user_turf = clicker.loc + var/turf/target_turf = get_step(clicker, target.dir) + if(!isturf(target_turf)) + return FALSE + + var/modifiers = params2list(params) + clicker.visible_message( + span_danger("[clicker] spits [projectile_name]!"), + span_alertalien("You spit [projectile_name]."), + ) + + if(acid_projectile) + var/obj/projectile/spit_projectile = new acid_projectile(clicker.loc) + spit_projectile.aim_projectile(target, clicker, modifiers) + spit_projectile.firer = clicker + spit_projectile.fire() + playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) + clicker.newtonian_move(get_dir(target_turf, user_turf)) + return TRUE + + if(acid_casing) + var/obj/item/ammo_casing/casing = new acid_casing(clicker.loc) + playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) + casing.fire_casing(target, clicker, null, null, null, ran_zone(), 0, clicker) + clicker.newtonian_move(get_dir(target_turf, user_turf)) + return TRUE + + CRASH("Neither acid_projectile or acid_casing are set on [clicker]'s spit attack!") + +/datum/action/cooldown/alien/acid/tgmc/Activate(atom/target) + return TRUE + + +// Летальная версия плевка +/datum/action/cooldown/alien/acid/tgmc/lethal + name = "Spit Acid" + desc = "Spits neurotoxin at someone, burning them." + acid_projectile = /obj/projectile/neurotoxin/tgmc/acid + button_icon_state = "acidspit_0" + projectile_name = "acid" + button_base_icon = "acidspit" + + +// Версия плевка, котоырй работает как дробовик +/datum/action/cooldown/alien/acid/tgmc/spread + name = "Spit Neurotoxin Spread" + desc = "Spits a spread neurotoxin at someone, exhausting them." + plasma_cost = 50 + acid_projectile = null + acid_casing = /obj/item/ammo_casing/xenospit + spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid2.ogg' + cooldown_time = 10 SECONDS + +// Немного хренового кода, но блин, какой же прошлый кодер крутой, что нашел такой забавный способ) +/obj/item/ammo_casing/xenospit //This is probably really bad, however I couldn't find any other nice way to do this + name = "big glob of neurotoxin" + projectile_type = /obj/projectile/neurotoxin/tgmc/spitter_spread + pellets = 3 + variance = 20 + +/obj/item/ammo_casing/xenospit/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/xenospit/tk_firing(mob/living/user, atom/fired_from) + return FALSE + + +// Летальная версия дробовик-плевка +/datum/action/cooldown/alien/acid/tgmc/spread/lethal + name = "Spit Acid Spread" + desc = "Spits a spread of acid at someone, burning them." + acid_projectile = null + acid_casing = /obj/item/ammo_casing/xenospit/spread/lethal + button_icon_state = "acidspit_0" + projectile_name = "acid" + button_base_icon = "acidspit" + +/obj/item/ammo_casing/xenospit/spread/lethal + name = "big glob of acid" + projectile_type = /obj/projectile/neurotoxin/tgmc/acid/spitter_spread + pellets = 4 + variance = 30 + + +// Взмах хвоста дефендера + является базовым для взмахов хвоста королевы и равагера +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep + name = "Crushing Tail Sweep" + desc = "Throw back attackers with a sweep of your tail, likely breaking some bones in the process." + + cooldown_time = 60 SECONDS + + aoe_radius = 1 + + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "crush_tail" + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/defender + + /// The sound that the tail sweep will make upon hitting something + var/impact_sound = 'sound/effects/clang.ogg' + /// How long mobs hit by the tailsweep should be knocked down for + var/knockdown_time = 4 SECONDS + /// How much damage tail sweep impacts should do to a mob + var/impact_damage = 30 + /// What wound bonus should the tai sweep impact have + var/impact_wound_bonus = 20 + /// What type of sharpness should this tail sweep have + var/impact_sharpness = FALSE + /// What type of damage should the tail sweep do + var/impact_damage_type = BRUTE + +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + var/mob/living/carbon/alien/adult/tgmc/owner_alien = owner + if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) + return FALSE + +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) + if(!isliving(victim)) + return + + if(isalien(victim)) + return + + var/turf/throwtarget = get_edge_target_turf(caster, get_dir(caster, get_step_away(victim, caster))) + var/dist_from_caster = get_dist(victim, caster) + var/mob/living/victim_living = victim + + if(dist_from_caster <= 0) + victim_living.Knockdown(knockdown_time) + if(sparkle_path) + new sparkle_path(get_turf(victim_living), get_dir(caster, victim_living)) + + else + victim_living.Knockdown(knockdown_time * 2) //They are on the same turf as us, or... somewhere else, I'm not sure how but they are getting smacked down + + victim_living.apply_damage(impact_damage, impact_damage_type, BODY_ZONE_CHEST, wound_bonus = impact_wound_bonus, sharpness = impact_sharpness) + shake_camera(victim_living, 4, 3) + playsound(victim_living, impact_sound, 100, TRUE, 8, 0.9) + to_chat(victim_living, span_userdanger("[caster]'s tail slams into you, throwing you back!")) + + victim_living.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) + +/obj/effect/temp_visual/dir_setting/tailsweep/defender + icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + icon_state = "crush_tail_anim" + + +// Взмах хвоста преторианца +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/hard_throwing + name = "Flinging Tail Sweep" + desc = "Throw back attackers with a sweep of your tail that is much stronger than other aliens." + + aoe_radius = 2 + repulse_force = MOVE_FORCE_OVERPOWERING //Fuck everyone who gets hit by this tail in particular + + button_icon_state = "throw_tail" + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/praetorian + + impact_sound = 'sound/items/weapons/slap.ogg' + impact_damage = 20 + impact_wound_bonus = 10 + +/obj/effect/temp_visual/dir_setting/tailsweep/praetorian + icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + icon_state = "throw_tail_anim" + + +// Взмах хвоста равагера +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/slicing + name = "Slicing Tail Sweep" + desc = "Throw back attackers with a swipe of your tail, slicing them with its sharpened tip." + + aoe_radius = 2 + + button_icon_state = "slice_tail" + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/ravager + + sound = 'tff_modular/modules/tgmc_xenos/sound/alien_tail_swipe.ogg' //The defender's tail sound isn't changed because its big and heavy, this isn't + + impact_sound = 'modular_nova/master_files/sound/weapons/bloodyslice.ogg' + impact_damage = 40 + impact_sharpness = SHARP_EDGED + +/obj/effect/temp_visual/dir_setting/tailsweep/ravager + icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + icon_state = "slice_tail_anim" + + +// Хил-аура дрона +/datum/action/cooldown/alien/tgmc/heal_aura + name = "Healing Aura" + desc = "Friendly xenomorphs in a short range around yourself will receive passive healing." + button_icon_state = "healaura" + plasma_cost = 100 + cooldown_time = 90 SECONDS + /// Is the healing aura currently active or not + var/aura_active = FALSE + /// How long the healing aura should last + var/aura_duration = 30 SECONDS + /// How far away the healing aura should reach + var/aura_range = 5 + /// How much brute/burn individually the healing aura should heal each time it fires + var/aura_healing_amount = 5 + /// What color should the + particles caused by the healing aura be + var/aura_healing_color = COLOR_BLUE_LIGHT + /// The healing aura component itself that the ability uses + var/datum/component/aura_healing/aura_healing_component + +/datum/action/cooldown/alien/tgmc/heal_aura/Activate() + . = ..() + if(aura_active) + owner.balloon_alert(owner, "already healing") + return FALSE + owner.balloon_alert(owner, "healing aura started") + to_chat(owner, span_danger("We emit pheromones that encourage sisters near us to heal themselves for the next [aura_duration / 10] seconds.")) + addtimer(CALLBACK(src, PROC_REF(aura_deactivate)), aura_duration) + aura_active = TRUE + aura_healing_component = owner.AddComponent(/datum/component/aura_healing, range = aura_range, requires_visibility = TRUE, brute_heal = aura_healing_amount, burn_heal = aura_healing_amount, limit_to_trait = TRAIT_XENO_HEAL_AURA, healing_color = aura_healing_color) + return TRUE + +/datum/action/cooldown/alien/tgmc/heal_aura/proc/aura_deactivate() + if(!aura_active) + return + aura_active = FALSE + QDEL_NULL(aura_healing_component) + owner.balloon_alert(owner, "healing aura ended") + + +// Чуть более сильная хил-аура преторианца +/datum/action/cooldown/alien/tgmc/heal_aura/juiced + name = "Strong Healing Aura" + desc = "Friendly xenomorphs in a longer range around yourself will receive passive healing." + button_icon_state = "healaura_juiced" + plasma_cost = 100 + cooldown_time = 90 SECONDS + aura_range = 7 + aura_healing_amount = 10 + aura_healing_color = COLOR_RED_LIGHT + + +// Все сказано в названии подтипа. Только равагер имеет такое +/datum/action/cooldown/alien/tgmc/literally_too_angry_to_die + name = "Endure" + desc = "Imbue your body with unimaginable amounts of rage (and plasma) to allow yourself to ignore all pain for a short time." + button_icon_state = "literally_too_angry" + plasma_cost = 250 //This requires full plasma to do, so there can be some time between armstrong moments + /// If the endure ability is currently active or not + var/endure_active = FALSE + /// How long the endure ability should last when activated + var/endure_duration = 20 SECONDS + +/datum/action/cooldown/alien/tgmc/literally_too_angry_to_die/Activate() + . = ..() + if(endure_active) + owner.balloon_alert(owner, "already enduring") + return FALSE + owner.balloon_alert(owner, "endure began") + playsound(owner, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) + to_chat(owner, span_danger("We numb our ability to feel pain, allowing us to fight until the very last for the next [endure_duration/10] seconds.")) + addtimer(CALLBACK(src, PROC_REF(endure_deactivate)), endure_duration) + owner.add_filter(RAVAGER_OUTLINE_EFFECT, 4, outline_filter(1, COLOR_RED_LIGHT)) + ADD_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_XENO_ABILITY_GIVEN) + ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAIT_XENO_ABILITY_GIVEN) + ADD_TRAIT(owner, TRAIT_NOHARDCRIT, TRAIT_XENO_ABILITY_GIVEN) + endure_active = TRUE + return TRUE + +/datum/action/cooldown/alien/tgmc/literally_too_angry_to_die/proc/endure_deactivate() + endure_active = FALSE + owner.balloon_alert(owner, "endure ended") + owner.remove_filter(RAVAGER_OUTLINE_EFFECT) + REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_XENO_ABILITY_GIVEN) + REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAIT_XENO_ABILITY_GIVEN) + REMOVE_TRAIT(owner, TRAIT_NOHARDCRIT, TRAIT_XENO_ABILITY_GIVEN) + + +// Забавный код для руни +/datum/action/cooldown/alien/tgmc/evade + name = "Evade" + desc = "Allows you to evade any projectile that would hit you for a few seconds." + button_icon_state = "evade" + plasma_cost = 50 + cooldown_time = 60 SECONDS + /// If the evade ability is currently active or not + var/evade_active = FALSE + /// How long evasion should last + var/evasion_duration = 10 SECONDS + +/datum/action/cooldown/alien/tgmc/evade/Activate() + . = ..() + if(evade_active) //Can't evade while we're already evading. + owner.balloon_alert(owner, "already evading") + return FALSE + + owner.balloon_alert(owner, "evasive movements began") + playsound(owner, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) + to_chat(owner, span_danger("We take evasive action, making us impossible to hit with projectiles for the next [evasion_duration / 10] seconds.")) + addtimer(CALLBACK(src, PROC_REF(evasion_deactivate)), evasion_duration) + evade_active = TRUE + RegisterSignal(owner, COMSIG_PROJECTILE_ON_HIT, PROC_REF(on_projectile_hit)) + REMOVE_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + addtimer(CALLBACK(src, PROC_REF(give_back_ventcrawl)), (cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE)) //They cannot ventcrawl until the defined percent of the cooldown has passed + to_chat(owner, span_warning("We will be unable to crawl through vents for the next [(cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE) / 10] seconds.")) + return TRUE + +/// Handles deactivation of the xeno evasion ability, mainly unregistering the signal and giving a balloon alert +/datum/action/cooldown/alien/tgmc/evade/proc/evasion_deactivate() + evade_active = FALSE + owner.balloon_alert(owner, "evasion ended") + UnregisterSignal(owner, COMSIG_PROJECTILE_ON_HIT) + +/datum/action/cooldown/alien/tgmc/evade/proc/give_back_ventcrawl() + ADD_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + to_chat(owner, span_notice("We are rested enough to crawl through vents again.")) + +/// Handles if either BULLET_ACT_HIT or BULLET_ACT_FORCE_PIERCE happens to something using the xeno evade ability +/datum/action/cooldown/alien/tgmc/evade/proc/on_projectile_hit() + if(owner.build_incapacitated(INCAPABLE_GRAB) || !isturf(owner.loc) || !evade_active) + return BULLET_ACT_HIT + + owner.visible_message(span_danger("[owner] effortlessly dodges the projectile!"), span_userdanger("You dodge the projectile!")) + playsound(get_turf(owner), pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) + owner.add_filter(RUNNER_BLUR_EFFECT, 2, gauss_blur_filter(5)) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/datum, remove_filter), RUNNER_BLUR_EFFECT), 0.5 SECONDS) + return BULLET_ACT_FORCE_PIERCE + + +// Одиночный чардж дефендера и вариора +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender + name = "Charge Attack" + desc = "Allows you to charge at a position, trampling anything in your path." + cooldown_time = 15 SECONDS + charge_delay = 0.3 SECONDS + charge_distance = 5 + destroy_objects = FALSE + charge_damage = 50 + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "defender_charge" + unset_after_click = TRUE + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/do_charge_indicator(atom/charger, atom/charge_target) + . = ..() + playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/Activate(atom/target_atom) + . = ..() + return TRUE + + +// Тройной чардж равагера +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager + name = "Triple Charge Attack" + desc = "Allows you to charge thrice at a location, trampling any in your path." + cooldown_time = 30 SECONDS + charge_delay = 0.3 SECONDS + charge_distance = 7 + charge_past = 3 + destroy_objects = FALSE + charge_damage = 25 + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "ravager_charge" + unset_after_click = TRUE + +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/do_charge_indicator(atom/charger, atom/charge_target) + playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) + +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/Activate(atom/target_atom) + . = ..() + return TRUE + + +/// Способность вариора делать *что-то* +/datum/action/cooldown/alien/tgmc/warrior_agility + name = "Agility Mode" + desc = "Drop onto all fours, increasing your speed at the cost of damage and being unable to use most abilities." + button_icon_state = "the_speed_is_alot" + cooldown_time = 1 SECONDS + can_be_used_always = TRUE + /// Is the warrior currently running around on all fours? + var/being_agile = FALSE + +/datum/action/cooldown/alien/tgmc/warrior_agility/Activate() + . = ..() + if(!being_agile) + begin_agility() + return TRUE + if(being_agile) + end_agility() + return TRUE + +/// Handles the visual indication and code activation of the warrior agility ability (say that five times fast) +/datum/action/cooldown/alien/tgmc/warrior_agility/proc/begin_agility() + var/mob/living/carbon/alien/adult/tgmc/agility_target = owner + agility_target.balloon_alert(agility_target, "agility active") + to_chat(agility_target, span_danger("We drop onto all fours, allowing us to move at much greater speed at expense of being able to use most abilities.")) + playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) + agility_target.icon_state = "alien[agility_target.caste]_mobility" + + being_agile = TRUE + agility_target.add_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) + agility_target.unable_to_use_abilities = TRUE + + agility_target.melee_damage_lower = 15 + agility_target.melee_damage_upper = 20 + +/// Handles the visual indicators and code side of deactivating the agility ability +/datum/action/cooldown/alien/tgmc/warrior_agility/proc/end_agility() + var/mob/living/carbon/alien/adult/tgmc/agility_target = owner + agility_target.balloon_alert(agility_target, "agility ended") + playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) //Warrior runs up on all fours, stands upright, screams at you + agility_target.icon_state = "alien[agility_target.caste]" + + being_agile = FALSE + agility_target.remove_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) + agility_target.unable_to_use_abilities = FALSE + + agility_target.melee_damage_lower = initial(agility_target.melee_damage_lower) + agility_target.melee_damage_upper = initial(agility_target.melee_damage_upper) + +/datum/movespeed_modifier/warrior_agility + multiplicative_slowdown = -2 + + +#undef RAVAGER_OUTLINE_EFFECT +#undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE +#undef RUNNER_BLUR_EFFECT diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/organs.dm new file mode 100644 index 00000000000..8f20184d542 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/organs.dm @@ -0,0 +1,38 @@ +// Яйцеклад королевы +/obj/item/organ/alien/eggsac/tgmc + actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg/tgmc) + +// Плевалка нейротоксина сентинела +/obj/item/organ/alien/neurotoxin/sentinel + name = "neurotoxin gland" + icon_state = "neurotox" + zone = BODY_ZONE_PRECISE_MOUTH + slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND + actions_types = list( + /datum/action/cooldown/alien/acid/tgmc, + /datum/action/cooldown/alien/acid/tgmc/lethal, + ) + +// Плевалка нейротоксина у спиттера и претора +/obj/item/organ/alien/neurotoxin/spitter + name = "large neurotoxin gland" + icon_state = "neurotox" + zone = BODY_ZONE_PRECISE_MOUTH + slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND + actions_types = list( + /datum/action/cooldown/alien/acid/tgmc/spread, + /datum/action/cooldown/alien/acid/tgmc/spread/lethal, + /datum/action/cooldown/alien/acid/corrosion, + ) + +// Личная плевалка нейротоксина королевы +/obj/item/organ/alien/neurotoxin/queen + name = "neurotoxin gland" + icon_state = "neurotox" + zone = BODY_ZONE_PRECISE_MOUTH + slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND + actions_types = list( + /datum/action/cooldown/alien/acid/tgmc, + /datum/action/cooldown/alien/acid/tgmc/lethal, + /datum/action/cooldown/alien/acid/corrosion, + ) diff --git a/tff_modular/modules/tgmc_xenos/code/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/projectiles.dm new file mode 100644 index 00000000000..a0f7ac48c91 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/projectiles.dm @@ -0,0 +1,26 @@ +/obj/projectile/neurotoxin/tgmc + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 30 + paralyze = 0 + damage_type = STAMINA + armor_flag = BIO + +/obj/projectile/neurotoxin/tgmc/acid + name = "acid spit" + icon_state = "toxin" + damage = 20 + paralyze = 0 + damage_type = BURN + armor_flag = ACID + +/obj/projectile/neurotoxin/tgmc/spitter_spread //Slightly nerfed because its a shotgun spread of these + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 25 + +/obj/projectile/neurotoxin/tgmc/acid/spitter_spread + name = "acid spit" + icon_state = "toxin" + damage = 15 + damage_type = BURN diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 42212974232..27a07d1a614 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -27,88 +27,3 @@ REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep - name = "Crushing Tail Sweep" - desc = "Throw back attackers with a sweep of your tail, likely breaking some bones in the process." - - cooldown_time = 60 SECONDS - - aoe_radius = 1 - - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "crush_tail" - - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/defender - - /// The sound that the tail sweep will make upon hitting something - var/impact_sound = 'sound/effects/clang.ogg' - /// How long mobs hit by the tailsweep should be knocked down for - var/knockdown_time = 4 SECONDS - /// How much damage tail sweep impacts should do to a mob - var/impact_damage = 30 - /// What wound bonus should the tai sweep impact have - var/impact_wound_bonus = 20 - /// What type of sharpness should this tail sweep have - var/impact_sharpness = FALSE - /// What type of damage should the tail sweep do - var/impact_damage_type = BRUTE - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - - var/mob/living/carbon/alien/adult/tgmc/owner_alien = owner - if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) - return FALSE - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) - if(!isliving(victim)) - return - - if(isalien(victim)) - return - - var/turf/throwtarget = get_edge_target_turf(caster, get_dir(caster, get_step_away(victim, caster))) - var/dist_from_caster = get_dist(victim, caster) - var/mob/living/victim_living = victim - - if(dist_from_caster <= 0) - victim_living.Knockdown(knockdown_time) - if(sparkle_path) - new sparkle_path(get_turf(victim_living), get_dir(caster, victim_living)) - - else - victim_living.Knockdown(knockdown_time * 2) //They are on the same turf as us, or... somewhere else, I'm not sure how but they are getting smacked down - - victim_living.apply_damage(impact_damage, impact_damage_type, BODY_ZONE_CHEST, wound_bonus = impact_wound_bonus, sharpness = impact_sharpness) - shake_camera(victim_living, 4, 3) - playsound(victim_living, impact_sound, 100, TRUE, 8, 0.9) - to_chat(victim_living, span_userdanger("[caster]'s tail slams into you, throwing you back!")) - - victim_living.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) - -/obj/effect/temp_visual/dir_setting/tailsweep/defender - icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - icon_state = "crush_tail_anim" - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender - name = "Charge Attack" - desc = "Allows you to charge at a position, trampling anything in your path." - cooldown_time = 15 SECONDS - charge_delay = 0.3 SECONDS - charge_distance = 5 - destroy_objects = FALSE - charge_damage = 50 - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "defender_charge" - unset_after_click = TRUE - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/do_charge_indicator(atom/charger, atom/charge_target) - . = ..() - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/Activate(atom/target_atom) - . = ..() - return TRUE diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 865293f9682..5209a83c9b0 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -20,43 +20,3 @@ /mob/living/carbon/alien/adult/tgmc/drone/Initialize(mapload) . = ..() GRANT_ACTION(/datum/action/cooldown/alien/tgmc/heal_aura) - -/datum/action/cooldown/alien/tgmc/heal_aura - name = "Healing Aura" - desc = "Friendly xenomorphs in a short range around yourself will receive passive healing." - button_icon_state = "healaura" - plasma_cost = 100 - cooldown_time = 90 SECONDS - /// Is the healing aura currently active or not - var/aura_active = FALSE - /// How long the healing aura should last - var/aura_duration = 30 SECONDS - /// How far away the healing aura should reach - var/aura_range = 5 - /// How much brute/burn individually the healing aura should heal each time it fires - var/aura_healing_amount = 5 - /// What color should the + particles caused by the healing aura be - var/aura_healing_color = COLOR_BLUE_LIGHT - /// The healing aura component itself that the ability uses - var/datum/component/aura_healing/aura_healing_component - -/datum/action/cooldown/alien/tgmc/heal_aura/Activate() - . = ..() - if(aura_active) - owner.balloon_alert(owner, "already healing") - return FALSE - owner.balloon_alert(owner, "healing aura started") - to_chat(owner, span_danger("We emit pheromones that encourage sisters near us to heal themselves for the next [aura_duration / 10] seconds.")) - addtimer(CALLBACK(src, PROC_REF(aura_deactivate)), aura_duration) - aura_active = TRUE - aura_healing_component = owner.AddComponent(/datum/component/aura_healing, range = aura_range, requires_visibility = TRUE, brute_heal = aura_healing_amount, burn_heal = aura_healing_amount, limit_to_trait = TRAIT_XENO_HEAL_AURA, healing_color = aura_healing_color) - return TRUE - -/datum/action/cooldown/alien/tgmc/heal_aura/proc/aura_deactivate() - if(!aura_active) - return - aura_active = FALSE - QDEL_NULL(aura_healing_component) - owner.balloon_alert(owner, "healing aura ended") - - diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 949b6eb54af..f07cb76808e 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -30,91 +30,3 @@ REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) add_movespeed_modifier(/datum/movespeed_modifier/alien_big) - -/datum/action/cooldown/alien/tgmc/heal_aura/juiced - name = "Strong Healing Aura" - desc = "Friendly xenomorphs in a longer range around yourself will receive passive healing." - button_icon_state = "healaura_juiced" - plasma_cost = 100 - cooldown_time = 90 SECONDS - aura_range = 7 - aura_healing_amount = 10 - aura_healing_color = COLOR_RED_LIGHT - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/hard_throwing - name = "Flinging Tail Sweep" - desc = "Throw back attackers with a sweep of your tail that is much stronger than other aliens." - - aoe_radius = 2 - repulse_force = MOVE_FORCE_OVERPOWERING //Fuck everyone who gets hit by this tail in particular - - button_icon_state = "throw_tail" - - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/praetorian - - impact_sound = 'sound/items/weapons/slap.ogg' - impact_damage = 20 - impact_wound_bonus = 10 - -/obj/effect/temp_visual/dir_setting/tailsweep/praetorian - icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - icon_state = "throw_tail_anim" - -/datum/action/cooldown/alien/acid/tgmc/spread - name = "Spit Neurotoxin Spread" - desc = "Spits a spread neurotoxin at someone, exhausting them." - plasma_cost = 50 - acid_projectile = null - acid_casing = /obj/item/ammo_casing/xenospit - spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid2.ogg' - cooldown_time = 10 SECONDS - -/obj/item/ammo_casing/xenospit //This is probably really bad, however I couldn't find any other nice way to do this - name = "big glob of neurotoxin" - projectile_type = /obj/projectile/neurotoxin/tgmc/spitter_spread - pellets = 3 - variance = 20 - -/obj/item/ammo_casing/xenospit/Initialize(mapload) - . = ..() - AddElement(/datum/element/caseless) - -/obj/item/ammo_casing/xenospit/tk_firing(mob/living/user, atom/fired_from) - return FALSE - -/obj/projectile/neurotoxin/tgmc/spitter_spread //Slightly nerfed because its a shotgun spread of these - name = "neurotoxin spit" - icon_state = "neurotoxin" - damage = 25 - -/datum/action/cooldown/alien/acid/tgmc/spread/lethal - name = "Spit Acid Spread" - desc = "Spits a spread of acid at someone, burning them." - acid_projectile = null - acid_casing = /obj/item/ammo_casing/xenospit/spread/lethal - button_icon_state = "acidspit_0" - projectile_name = "acid" - button_base_icon = "acidspit" - -/obj/item/ammo_casing/xenospit/spread/lethal - name = "big glob of acid" - projectile_type = /obj/projectile/neurotoxin/tgmc/acid/spitter_spread - pellets = 4 - variance = 30 - -/obj/projectile/neurotoxin/tgmc/acid/spitter_spread - name = "acid spit" - icon_state = "toxin" - damage = 15 - damage_type = BURN - -/obj/item/organ/alien/neurotoxin/spitter - name = "large neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND - actions_types = list( - /datum/action/cooldown/alien/acid/tgmc/spread, - /datum/action/cooldown/alien/acid/tgmc/spread/lethal, - /datum/action/cooldown/alien/acid/corrosion, - ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 37a9e49ee6a..17e53ffc736 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -36,17 +36,6 @@ /mob/living/carbon/alien/adult/tgmc/queen/alien_talk(message, shown_name = name) ..(message, shown_name, TRUE) -/obj/item/organ/alien/neurotoxin/queen - name = "neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND - actions_types = list( - /datum/action/cooldown/alien/acid/tgmc, - /datum/action/cooldown/alien/acid/tgmc/lethal, - /datum/action/cooldown/alien/acid/corrosion, - ) - /mob/living/carbon/alien/adult/tgmc/queen/death(gibbed) if(stat == DEAD) return diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 041048c52fd..9db3a0e0e53 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -1,7 +1,5 @@ /// TGMC_XENOS (old nova sector xenos) -#define RAVAGER_OUTLINE_EFFECT "ravager_endure_outline" - /mob/living/carbon/alien/adult/tgmc/ravager name = "alien ravager" desc = "An alien with angry red chitin, with equally intimidating looking blade-like claws in place of normal hands. That sharp tail looks like it'd probably hurt." @@ -27,79 +25,3 @@ grant_actions_by_list(innate_actions) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager - name = "Triple Charge Attack" - desc = "Allows you to charge thrice at a location, trampling any in your path." - cooldown_time = 30 SECONDS - charge_delay = 0.3 SECONDS - charge_distance = 7 - charge_past = 3 - destroy_objects = FALSE - charge_damage = 25 - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "ravager_charge" - unset_after_click = TRUE - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/do_charge_indicator(atom/charger, atom/charge_target) - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/Activate(atom/target_atom) - . = ..() - return TRUE - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/slicing - name = "Slicing Tail Sweep" - desc = "Throw back attackers with a swipe of your tail, slicing them with its sharpened tip." - - aoe_radius = 2 - - button_icon_state = "slice_tail" - - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/ravager - - sound = 'tff_modular/modules/tgmc_xenos/sound/alien_tail_swipe.ogg' //The defender's tail sound isn't changed because its big and heavy, this isn't - - impact_sound = 'modular_nova/master_files/sound/weapons/bloodyslice.ogg' - impact_damage = 40 - impact_sharpness = SHARP_EDGED - -/obj/effect/temp_visual/dir_setting/tailsweep/ravager - icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - icon_state = "slice_tail_anim" - -/datum/action/cooldown/alien/tgmc/literally_too_angry_to_die - name = "Endure" - desc = "Imbue your body with unimaginable amounts of rage (and plasma) to allow yourself to ignore all pain for a short time." - button_icon_state = "literally_too_angry" - plasma_cost = 250 //This requires full plasma to do, so there can be some time between armstrong moments - /// If the endure ability is currently active or not - var/endure_active = FALSE - /// How long the endure ability should last when activated - var/endure_duration = 20 SECONDS - -/datum/action/cooldown/alien/tgmc/literally_too_angry_to_die/Activate() - . = ..() - if(endure_active) - owner.balloon_alert(owner, "already enduring") - return FALSE - owner.balloon_alert(owner, "endure began") - playsound(owner, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) - to_chat(owner, span_danger("We numb our ability to feel pain, allowing us to fight until the very last for the next [endure_duration/10] seconds.")) - addtimer(CALLBACK(src, PROC_REF(endure_deactivate)), endure_duration) - owner.add_filter(RAVAGER_OUTLINE_EFFECT, 4, outline_filter(1, COLOR_RED_LIGHT)) - ADD_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_XENO_ABILITY_GIVEN) - ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAIT_XENO_ABILITY_GIVEN) - ADD_TRAIT(owner, TRAIT_NOHARDCRIT, TRAIT_XENO_ABILITY_GIVEN) - endure_active = TRUE - return TRUE - -/datum/action/cooldown/alien/tgmc/literally_too_angry_to_die/proc/endure_deactivate() - endure_active = FALSE - owner.balloon_alert(owner, "endure ended") - owner.remove_filter(RAVAGER_OUTLINE_EFFECT) - REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_XENO_ABILITY_GIVEN) - REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAIT_XENO_ABILITY_GIVEN) - REMOVE_TRAIT(owner, TRAIT_NOHARDCRIT, TRAIT_XENO_ABILITY_GIVEN) - -#undef RAVAGER_OUTLINE_EFFECT diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 8be26c1037a..e4f1f40e554 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -1,8 +1,5 @@ /// TGMC_XENOS (old nova sector xenos) -#define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 -#define RUNNER_BLUR_EFFECT "runner_evasion" - /mob/living/carbon/alien/adult/tgmc/runner name = "alien runner" desc = "A short alien with sleek red chitin, clearly abiding by the 'red ones go faster' theorem and almost always running on all fours." @@ -29,61 +26,9 @@ add_movespeed_modifier(/datum/movespeed_modifier/alien_quick) -/datum/action/cooldown/alien/tgmc/evade - name = "Evade" - desc = "Allows you to evade any projectile that would hit you for a few seconds." - button_icon_state = "evade" - plasma_cost = 50 - cooldown_time = 60 SECONDS - /// If the evade ability is currently active or not - var/evade_active = FALSE - /// How long evasion should last - var/evasion_duration = 10 SECONDS - -/datum/action/cooldown/alien/tgmc/evade/Activate() - . = ..() - if(evade_active) //Can't evade while we're already evading. - owner.balloon_alert(owner, "already evading") - return FALSE - - owner.balloon_alert(owner, "evasive movements began") - playsound(owner, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) - to_chat(owner, span_danger("We take evasive action, making us impossible to hit with projectiles for the next [evasion_duration / 10] seconds.")) - addtimer(CALLBACK(src, PROC_REF(evasion_deactivate)), evasion_duration) - evade_active = TRUE - RegisterSignal(owner, COMSIG_PROJECTILE_ON_HIT, PROC_REF(on_projectile_hit)) - REMOVE_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - addtimer(CALLBACK(src, PROC_REF(give_back_ventcrawl)), (cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE)) //They cannot ventcrawl until the defined percent of the cooldown has passed - to_chat(owner, span_warning("We will be unable to crawl through vents for the next [(cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE) / 10] seconds.")) - return TRUE - -/// Handles deactivation of the xeno evasion ability, mainly unregistering the signal and giving a balloon alert -/datum/action/cooldown/alien/tgmc/evade/proc/evasion_deactivate() - evade_active = FALSE - owner.balloon_alert(owner, "evasion ended") - UnregisterSignal(owner, COMSIG_PROJECTILE_ON_HIT) - -/datum/action/cooldown/alien/tgmc/evade/proc/give_back_ventcrawl() - ADD_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - to_chat(owner, span_notice("We are rested enough to crawl through vents again.")) - -/// Handles if either BULLET_ACT_HIT or BULLET_ACT_FORCE_PIERCE happens to something using the xeno evade ability -/datum/action/cooldown/alien/tgmc/evade/proc/on_projectile_hit() - if(owner.build_incapacitated(INCAPABLE_GRAB) || !isturf(owner.loc) || !evade_active) - return BULLET_ACT_HIT - - owner.visible_message(span_danger("[owner] effortlessly dodges the projectile!"), span_userdanger("You dodge the projectile!")) - playsound(get_turf(owner), pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) - owner.add_filter(RUNNER_BLUR_EFFECT, 2, gauss_blur_filter(5)) - addtimer(CALLBACK(owner, TYPE_PROC_REF(/datum, remove_filter), RUNNER_BLUR_EFFECT), 0.5 SECONDS) - return BULLET_ACT_FORCE_PIERCE - /mob/living/carbon/alien/adult/tgmc/runner/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) if(evade_ability) var/evade_result = evade_ability.on_projectile_hit() if(!(evade_result == BULLET_ACT_HIT)) return evade_result return ..() - -#undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE -#undef RUNNER_BLUR_EFFECT diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 92853ece5ae..f7148564f08 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -19,126 +19,4 @@ /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) . = ..() - add_movespeed_modifier(/datum/movespeed_modifier/alien_slow) - -/datum/action/cooldown/alien/acid/tgmc - name = "Spit Neurotoxin" - desc = "Spits neurotoxin at someone, exhausting them." - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "neurospit_0" - plasma_cost = 40 - /// A singular projectile? Use this one and leave acid_casing null - var/acid_projectile = /obj/projectile/neurotoxin/tgmc - /// You want it to be more like a shotgun style attack? Use this one and make acid_projectile null - var/acid_casing - /// Used in to_chat messages to the owner - var/projectile_name = "neurotoxin" - /// The base icon for the ability, so a red box can be put on it using _0 or _1 - var/button_base_icon = "neurospit" - /// The sound that should be played when the xeno actually spits - var/spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid.ogg' - shared_cooldown = MOB_SHARED_COOLDOWN_3 - cooldown_time = 5 SECONDS - -/datum/action/cooldown/alien/acid/tgmc/IsAvailable(feedback = FALSE) - return ..() && isturf(owner.loc) - -/datum/action/cooldown/alien/acid/tgmc/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - - to_chat(on_who, span_notice("You prepare your [projectile_name] gland. Left-click to fire at a target!")) - - button_icon_state = "[button_base_icon]_1" - build_all_button_icons() - on_who.update_icons() - -/datum/action/cooldown/alien/acid/tgmc/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - if(refund_cooldown) - to_chat(on_who, span_notice("You empty your [projectile_name] gland.")) - - button_icon_state = "[button_base_icon]_0" - build_all_button_icons() - on_who.update_icons() - -/datum/action/cooldown/alien/acid/tgmc/InterceptClickOn(mob/living/clicker, params, atom/target) - . = ..() - if(!.) - unset_click_ability(clicker, refund_cooldown = FALSE) - return FALSE - - var/turf/user_turf = clicker.loc - var/turf/target_turf = get_step(clicker, target.dir) - if(!isturf(target_turf)) - return FALSE - - var/modifiers = params2list(params) - clicker.visible_message( - span_danger("[clicker] spits [projectile_name]!"), - span_alertalien("You spit [projectile_name]."), - ) - - if(acid_projectile) - var/obj/projectile/spit_projectile = new acid_projectile(clicker.loc) - spit_projectile.aim_projectile(target, clicker, modifiers) - spit_projectile.firer = clicker - spit_projectile.fire() - playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) - clicker.newtonian_move(get_dir(target_turf, user_turf)) - return TRUE - - if(acid_casing) - var/obj/item/ammo_casing/casing = new acid_casing(clicker.loc) - playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) - casing.fire_casing(target, clicker, null, null, null, ran_zone(), 0, clicker) - clicker.newtonian_move(get_dir(target_turf, user_turf)) - return TRUE - - CRASH("Neither acid_projectile or acid_casing are set on [clicker]'s spit attack!") - -/datum/action/cooldown/alien/acid/tgmc/Activate(atom/target) - return TRUE - -/obj/projectile/neurotoxin/tgmc - name = "neurotoxin spit" - icon_state = "neurotoxin" - damage = 30 - paralyze = 0 - damage_type = STAMINA - armor_flag = BIO - -/obj/projectile/neurotoxin/on_hit(atom/target, blocked = 0, pierce_hit) - if(isalien(target)) - damage = 0 - return ..() - -/datum/action/cooldown/alien/acid/tgmc/lethal - name = "Spit Acid" - desc = "Spits neurotoxin at someone, burning them." - acid_projectile = /obj/projectile/neurotoxin/tgmc/acid - button_icon_state = "acidspit_0" - projectile_name = "acid" - button_base_icon = "acidspit" - -/obj/projectile/neurotoxin/tgmc/acid - name = "acid spit" - icon_state = "toxin" - damage = 20 - paralyze = 0 - damage_type = BURN - -/obj/item/organ/alien/neurotoxin/sentinel - name = "neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND - actions_types = list( - /datum/action/cooldown/alien/acid/tgmc, - /datum/action/cooldown/alien/acid/tgmc/lethal, - ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm index 754651165e9..2fb552e0557 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm @@ -27,53 +27,3 @@ REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) add_movespeed_modifier(/datum/movespeed_modifier/alien_big) - -/datum/action/cooldown/alien/tgmc/warrior_agility - name = "Agility Mode" - desc = "Drop onto all fours, increasing your speed at the cost of damage and being unable to use most abilities." - button_icon_state = "the_speed_is_alot" - cooldown_time = 1 SECONDS - can_be_used_always = TRUE - /// Is the warrior currently running around on all fours? - var/being_agile = FALSE - -/datum/action/cooldown/alien/tgmc/warrior_agility/Activate() - . = ..() - if(!being_agile) - begin_agility() - return TRUE - if(being_agile) - end_agility() - return TRUE - -/// Handles the visual indication and code activation of the warrior agility ability (say that five times fast) -/datum/action/cooldown/alien/tgmc/warrior_agility/proc/begin_agility() - var/mob/living/carbon/alien/adult/tgmc/agility_target = owner - agility_target.balloon_alert(agility_target, "agility active") - to_chat(agility_target, span_danger("We drop onto all fours, allowing us to move at much greater speed at expense of being able to use most abilities.")) - playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) - agility_target.icon_state = "alien[agility_target.caste]_mobility" - - being_agile = TRUE - agility_target.add_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) - agility_target.unable_to_use_abilities = TRUE - - agility_target.melee_damage_lower = 15 - agility_target.melee_damage_upper = 20 - -/// Handles the visual indicators and code side of deactivating the agility ability -/datum/action/cooldown/alien/tgmc/warrior_agility/proc/end_agility() - var/mob/living/carbon/alien/adult/tgmc/agility_target = owner - agility_target.balloon_alert(agility_target, "agility ended") - playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) //Warrior runs up on all fours, stands upright, screams at you - agility_target.icon_state = "alien[agility_target.caste]" - - being_agile = FALSE - agility_target.remove_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) - agility_target.unable_to_use_abilities = FALSE - - agility_target.melee_damage_lower = initial(agility_target.melee_damage_lower) - agility_target.melee_damage_upper = initial(agility_target.melee_damage_upper) - -/datum/movespeed_modifier/warrior_agility - multiplicative_slowdown = -2 diff --git a/tgstation.dme b/tgstation.dme index b55ac343788..a26ce88de6c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9083,9 +9083,13 @@ #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" #include "tff_modular\modules\tgmc_xenos\code\alien_egg.dm" +#include "tff_modular\modules\tgmc_xenos\code\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\larva.dm" +#include "tff_modular\modules\tgmc_xenos\code\mech_defense.dm" +#include "tff_modular\modules\tgmc_xenos\code\organs.dm" +#include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" #include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\drone.dm" From c4a49fa87b7d55d61ebffab43f5e07625059d581 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 00:43:40 +0700 Subject: [PATCH 006/120] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B8=20+=20=D1=87=D1=83=D1=82=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D1=80=D0=B0=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tff_modular/modules/tgmc_xenos/code/alien_egg.dm | 11 ----------- tff_modular/modules/tgmc_xenos/code/alien_powers.dm | 2 +- .../tgmc_xenos/code/{ => defense}/human_defense.dm | 1 + tff_modular/modules/tgmc_xenos/code/larva.dm | 10 ++++++++++ tff_modular/modules/tgmc_xenos/code/organs.dm | 5 +++++ tff_modular/modules/tgmc_xenos/code/projectiles.dm | 2 ++ .../tgmc_xenos/code/structures/alien_structures.dm | 4 ++++ .../modules/tgmc_xenos/code/tgmc_alien_event.dm | 3 +++ tgstation.dme | 6 +++--- 9 files changed, 29 insertions(+), 15 deletions(-) delete mode 100644 tff_modular/modules/tgmc_xenos/code/alien_egg.dm rename tff_modular/modules/tgmc_xenos/code/{ => defense}/human_defense.dm (96%) create mode 100644 tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm diff --git a/tff_modular/modules/tgmc_xenos/code/alien_egg.dm b/tff_modular/modules/tgmc_xenos/code/alien_egg.dm deleted file mode 100644 index c28eec1ff45..00000000000 --- a/tff_modular/modules/tgmc_xenos/code/alien_egg.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/action/cooldown/alien/make_structure/lay_egg/tgmc - made_structure_type = /obj/structure/alien/egg/tgmc - -/obj/structure/alien/egg/tgmc - child_path = /obj/item/clothing/mask/facehugger/tgmc - -/obj/item/clothing/mask/facehugger/tgmc - embryo_path = /obj/item/organ/body_egg/alien_embryo/tgmc - -/obj/item/organ/body_egg/alien_embryo/tgmc - larva_path = /mob/living/carbon/alien/larva/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 4fe6d5a4e24..7f4ab24afc3 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -1,4 +1,4 @@ -// +/// TGMC_XENOS (old nova sector xenos) #define RAVAGER_OUTLINE_EFFECT "ravager_endure_outline" #define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 diff --git a/tff_modular/modules/tgmc_xenos/code/human_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm similarity index 96% rename from tff_modular/modules/tgmc_xenos/code/human_defense.dm rename to tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm index bedf7587e99..655242dad0a 100644 --- a/tff_modular/modules/tgmc_xenos/code/human_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm @@ -1,5 +1,6 @@ /// TGMC_XENOS (old nova sector xenos) +// Переопредление прока из 'code\modules\mob\living\carbon\human\human_defense.dm' /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) . = ..() if(!.) diff --git a/tff_modular/modules/tgmc_xenos/code/larva.dm b/tff_modular/modules/tgmc_xenos/code/larva.dm index 2ae9fa2ff0b..f5203769165 100644 --- a/tff_modular/modules/tgmc_xenos/code/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/larva.dm @@ -1,5 +1,15 @@ /// TGMC_XENOS (old nova sector xenos) +// Подтип фейсхаггера, просто чтобы мы могли сделать то, что могли +/obj/item/clothing/mask/facehugger/tgmc + embryo_path = /obj/item/organ/body_egg/alien_embryo/tgmc + +// То же самое, но для эмбриона ларвочки +/obj/item/organ/body_egg/alien_embryo/tgmc + larva_path = /mob/living/carbon/alien/larva/tgmc + + +// Наша собственная ларвочка. Крутая! /mob/living/carbon/alien/larva/tgmc /mob/living/carbon/alien/larva/tgmc/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/organs.dm index 8f20184d542..a87cd191077 100644 --- a/tff_modular/modules/tgmc_xenos/code/organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/organs.dm @@ -1,7 +1,12 @@ +/// TGMC_XENOS (old nova sector xenos) + // Яйцеклад королевы /obj/item/organ/alien/eggsac/tgmc actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg/tgmc) +/datum/action/cooldown/alien/make_structure/lay_egg/tgmc + made_structure_type = /obj/structure/alien/egg/tgmc + // Плевалка нейротоксина сентинела /obj/item/organ/alien/neurotoxin/sentinel name = "neurotoxin gland" diff --git a/tff_modular/modules/tgmc_xenos/code/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/projectiles.dm index a0f7ac48c91..149b06be6c0 100644 --- a/tff_modular/modules/tgmc_xenos/code/projectiles.dm +++ b/tff_modular/modules/tgmc_xenos/code/projectiles.dm @@ -1,3 +1,5 @@ +/// TGMC_XENOS (old nova sector xenos) + /obj/projectile/neurotoxin/tgmc name = "neurotoxin spit" icon_state = "neurotoxin" diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm new file mode 100644 index 00000000000..df031057ef1 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -0,0 +1,4 @@ +/// TGMC_XENOS (old nova sector xenos) + +/obj/structure/alien/egg/tgmc + child_path = /obj/item/clothing/mask/facehugger/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/tgmc_alien_event.dm b/tff_modular/modules/tgmc_xenos/code/tgmc_alien_event.dm index 472037fd53d..15a8d2fd745 100644 --- a/tff_modular/modules/tgmc_xenos/code/tgmc_alien_event.dm +++ b/tff_modular/modules/tgmc_xenos/code/tgmc_alien_event.dm @@ -1,3 +1,5 @@ +/// TGMC_XENOS (old nova sector xenos) + /datum/round_event_control/alien_infestation/tgmc name = "TGMC Alien Infestation" typepath = /datum/round_event/ghost_role/alien_infestation/tgmc @@ -7,6 +9,7 @@ /datum/round_event/ghost_role/alien_infestation/tgmc role_name = "alien larva (TGMC)" +// По суути просто полностью скопированный прок, хотя по хорошему бы это переделать /datum/round_event/ghost_role/alien_infestation/tgmc/spawn_role() var/list/vents = list() for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump)) diff --git a/tgstation.dme b/tgstation.dme index a26ce88de6c..12ec7f59641 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9082,15 +9082,15 @@ #include "tff_modular\modules\smites\femboyfication.dm" #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" -#include "tff_modular\modules\tgmc_xenos\code\alien_egg.dm" #include "tff_modular\modules\tgmc_xenos\code\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" -#include "tff_modular\modules\tgmc_xenos\code\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\larva.dm" -#include "tff_modular\modules\tgmc_xenos\code\mech_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\organs.dm" #include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" #include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" +#include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" +#include "tff_modular\modules\tgmc_xenos\code\defense\mech_defense.dm" +#include "tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\drone.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\praetorian.dm" From ce6f79408e0c35d7ab1fb79b5d0f5b0711a07fed Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 00:44:10 +0700 Subject: [PATCH 007/120] =?UTF-8?q?=D0=98=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=B2=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=83=D1=80=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 4 ++++ .../modules/tgmc_xenos/code/defense/mech_defense.dm | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 13e92086158..c16da084f63 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -37,6 +37,10 @@ /// Все дополнительные органы, что должны находиться в телах ксеносов var/list/additional_organ_types_by_slot + /// Изменяемый урон по мехам + var/mech_damage_lower + var/mech_damage_upper + /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm new file mode 100644 index 00000000000..393cd61c5e2 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm @@ -0,0 +1,11 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Переопределяем прока атаки у меха, ведь мехи по сути неубиваемые для ксеносов +/obj/vehicle/sealed/mecha/attack_alien(mob/living/user, list/modifiers) + // Если это обычный ксенос - выполняется обычный прок, если нет - наш + if(!istype(user, /mob/living/carbon/alien/adult/tgmc)) + return ..() + + log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") + playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) + attack_generic(user, rand(user.mech_damage_lower, user.mech_damage_upper), BRUTE, MELEE, 0) From ec7c3202d0dacb095b70cc9d78929581e78290f3 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 00:48:59 +0700 Subject: [PATCH 008/120] Oops, i forgor this --- tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/larva.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm index 393cd61c5e2..da904e01a83 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm @@ -1,9 +1,9 @@ /// TGMC_XENOS (old nova sector xenos) // Переопределяем прока атаки у меха, ведь мехи по сути неубиваемые для ксеносов -/obj/vehicle/sealed/mecha/attack_alien(mob/living/user, list/modifiers) +/obj/vehicle/sealed/mecha/attack_alien(mob/living/carbon/alien/adult/tgmc/user, list/modifiers) // Если это обычный ксенос - выполняется обычный прок, если нет - наш - if(!istype(user, /mob/living/carbon/alien/adult/tgmc)) + if(!istype(user)) return ..() log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") diff --git a/tff_modular/modules/tgmc_xenos/code/larva.dm b/tff_modular/modules/tgmc_xenos/code/larva.dm index f5203769165..ed3a1ead5b8 100644 --- a/tff_modular/modules/tgmc_xenos/code/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/larva.dm @@ -26,7 +26,7 @@ return - +// Наш способ эволюционировать. Там прошлый кодер говорит, что стоит сделать отдельные для каждой эволюции... Но я не уверен, что это действительно нужно. Его способ достаточно крутой /datum/action/cooldown/alien/larva_evolve/tgmc/Activate(atom/target) var/static/list/caste_options if(!caste_options) From e35f031fb2a04d908851415e087bc2c023fe078c Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 02:37:39 +0700 Subject: [PATCH 009/120] =?UTF-8?q?=D0=95=D1=89=D0=B5=20=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B5=20=D0=B3=D0=BB=D1=83=D0=BF=D1=8B=D0=B9=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BD=20=D0=BF=D0=BE=20=D0=BC=D0=B5=D1=85=D0=B0?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Все же урон сильно повышать явно не стоит. Но и оставлять старый - тоже --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 5 ++--- tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index c16da084f63..52f417604c3 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -37,9 +37,8 @@ /// Все дополнительные органы, что должны находиться в телах ксеносов var/list/additional_organ_types_by_slot - /// Изменяемый урон по мехам - var/mech_damage_lower - var/mech_damage_upper + /// Изменяем урон по мехам + var/mech_damage_multiplier = 1.5 /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm index da904e01a83..f1a38c81c36 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm @@ -8,4 +8,5 @@ log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) - attack_generic(user, rand(user.mech_damage_lower, user.mech_damage_upper), BRUTE, MELEE, 0) + var/damage = round(rand(user.melee_damage_lower, user.melee_damage_upper) * mech_damage_multiplier) + attack_generic(user, damage, BRUTE, MELEE, 0) From ccb2422dc3cb95fd7a97d6c19023bd998ae47e60 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 04:05:21 +0700 Subject: [PATCH 010/120] silly me --- tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm index f1a38c81c36..be848175c93 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm @@ -8,5 +8,5 @@ log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) - var/damage = round(rand(user.melee_damage_lower, user.melee_damage_upper) * mech_damage_multiplier) + var/damage = round(rand(user.melee_damage_lower, user.melee_damage_upper) * user.mech_damage_multiplier) attack_generic(user, damage, BRUTE, MELEE, 0) From 475476608170cf9e515cdce069f5517cc04fa806 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 16:05:48 +0700 Subject: [PATCH 011/120] acid and neurotox gland redo --- .../modules/tgmc_xenos/code/alien_powers.dm | 28 ++++++++++++++- tff_modular/modules/tgmc_xenos/code/organs.dm | 35 +++++++++++-------- .../modules/tgmc_xenos/code/projectiles.dm | 10 ++++-- .../tgmc_xenos/code/xeno_types/praetorian.dm | 4 +-- .../tgmc_xenos/code/xeno_types/queen.dm | 4 +-- .../tgmc_xenos/code/xeno_types/sentinel.dm | 4 +-- .../tgmc_xenos/code/xeno_types/spitter.dm | 3 +- 7 files changed, 64 insertions(+), 24 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 7f4ab24afc3..e6a96eed835 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -99,7 +99,15 @@ button_base_icon = "acidspit" -// Версия плевка, котоырй работает как дробовик +// Королевские версии плевков нейротоксина +/datum/action/cooldown/alien/acid/tgmc/queen + acid_projectile = /obj/projectile/neurotoxin/tgmc/queen + +/datum/action/cooldown/alien/acid/tgmc/lethal/queen + acid_projectile = /obj/projectile/neurotoxin/tgmc/acid/queen + + +// Версия плевка нейротоксина, который работает как дробовик /datum/action/cooldown/alien/acid/tgmc/spread name = "Spit Neurotoxin Spread" desc = "Spits a spread neurotoxin at someone, exhausting them." @@ -141,6 +149,24 @@ variance = 30 +// Плевок кислоты +/datum/action/cooldown/alien/acid/corrosion/tgmc + name = "Corrosive Acid (150)" + desc = "Drench an object in acid, destroying it over time." + button_icon_state = "alien_acid" + plasma_cost = 150 + corrosion_acid_power = 100 + corrosion_acid_volume = 500 + +/datum/action/cooldown/alien/acid/corrosion/tgmc/strong + name = "Corrosive Acid (200)" + desc = "Drench an object in acid, destroying it over time." + button_icon_state = "alien_acid" + plasma_cost = 200 + corrosion_acid_power = 400 + corrosion_acid_volume = 1000 + + // Взмах хвоста дефендера + является базовым для взмахов хвоста королевы и равагера /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep name = "Crushing Tail Sweep" diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/organs.dm index a87cd191077..44ec5b98a58 100644 --- a/tff_modular/modules/tgmc_xenos/code/organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/organs.dm @@ -7,8 +7,9 @@ /datum/action/cooldown/alien/make_structure/lay_egg/tgmc made_structure_type = /obj/structure/alien/egg/tgmc + // Плевалка нейротоксина сентинела -/obj/item/organ/alien/neurotoxin/sentinel +/obj/item/organ/alien/neurotoxin/tgmc name = "neurotoxin gland" icon_state = "neurotox" zone = BODY_ZONE_PRECISE_MOUTH @@ -19,25 +20,31 @@ ) // Плевалка нейротоксина у спиттера и претора -/obj/item/organ/alien/neurotoxin/spitter +/obj/item/organ/alien/neurotoxin/tgmc/large name = "large neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND actions_types = list( /datum/action/cooldown/alien/acid/tgmc/spread, /datum/action/cooldown/alien/acid/tgmc/spread/lethal, - /datum/action/cooldown/alien/acid/corrosion, ) // Личная плевалка нейротоксина королевы -/obj/item/organ/alien/neurotoxin/queen - name = "neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = ORGAN_SLOT_XENO_NEUROTOXINGLAND +/obj/item/organ/alien/neurotoxin/tgmc/queen + name = "abnormal neurotoxin gland" actions_types = list( - /datum/action/cooldown/alien/acid/tgmc, - /datum/action/cooldown/alien/acid/tgmc/lethal, - /datum/action/cooldown/alien/acid/corrosion, + /datum/action/cooldown/alien/acid/tgmc/queen, + /datum/action/cooldown/alien/acid/tgmc/lethal/queen, ) + + +// Плевалка кислоты сентинела +/obj/item/organ/alien/acid/tgmc + name = "acid gland" + icon_state = "acid" + zone = BODY_ZONE_PRECISE_MOUTH + slot = ORGAN_SLOT_XENO_ACIDGLAND + actions_types = list(/datum/action/cooldown/alien/acid/corrosion/tgmc) + +// Плевалка кислоты у спиттера, королевы и претора +/obj/item/organ/alien/acid/tgmc/large + name = "large acid gland" + actions_types = list(/datum/action/cooldown/alien/acid/corrosion/tgmc/strong) diff --git a/tff_modular/modules/tgmc_xenos/code/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/projectiles.dm index 149b06be6c0..fe9a549dd69 100644 --- a/tff_modular/modules/tgmc_xenos/code/projectiles.dm +++ b/tff_modular/modules/tgmc_xenos/code/projectiles.dm @@ -3,19 +3,25 @@ /obj/projectile/neurotoxin/tgmc name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 30 + damage = 25 paralyze = 0 damage_type = STAMINA armor_flag = BIO +/obj/projectile/neurotoxin/tgmc/queen + damage = 40 + /obj/projectile/neurotoxin/tgmc/acid name = "acid spit" icon_state = "toxin" - damage = 20 + damage = 15 paralyze = 0 damage_type = BURN armor_flag = ACID +/obj/projectile/neurotoxin/tgmc/acid/queen + damage = 25 + /obj/projectile/neurotoxin/tgmc/spitter_spread //Slightly nerfed because its a shotgun spread of these name = "neurotoxin spit" icon_state = "neurotoxin" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index f07cb76808e..c1694028bd8 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -15,8 +15,8 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, - ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, - ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/spitter, + ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) /mob/living/carbon/alien/adult/tgmc/praetorian/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 17e53ffc736..798dabfbb2d 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -14,8 +14,8 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large/queen, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, - ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, - ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/queen, + ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/queen, ORGAN_SLOT_XENO_EGGSAC = /obj/item/organ/alien/eggsac/tgmc, ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index f7148564f08..d118377900f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -13,8 +13,8 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, - ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, - ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/sentinel, + ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc, ) /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 84f7a086e04..a4a995c2b08 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -13,7 +13,8 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, - ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/spitter, + ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) From 0e7475933dd61a7a9a9e66d559e971ae321dace7 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 16:24:01 +0700 Subject: [PATCH 012/120] new multiplier for burn damage --- code/modules/surgery/bodyparts/_bodyparts.dm | 8 +++++++- tff_modular/modules/tgmc_xenos/code/projectiles.dm | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 614481e1537..06bc20649fa 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -504,7 +504,13 @@ burn *= wound_damage_multiplier if(bodytype & (BODYTYPE_ALIEN|BODYTYPE_LARVA_PLACEHOLDER)) //aliens take double burn //nothing can burn with so much snowflake code around - burn *= 2 + // FLUFFY FRONTIER EDIT START - TGMC_XENOS + // ORIGINAL LINE: burn *= 2 + if(istype(owner, /mob/living/carbon/alien/adult/tgmc)) + burn *= 1.5 // Множитель чуть поменьше. Чисто для наших ксеносов + else + burn *= 2 + // FLUFFY FRONTIER EDIT END /* // START WOUND HANDLING diff --git a/tff_modular/modules/tgmc_xenos/code/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/projectiles.dm index fe9a549dd69..f1c66dfc0db 100644 --- a/tff_modular/modules/tgmc_xenos/code/projectiles.dm +++ b/tff_modular/modules/tgmc_xenos/code/projectiles.dm @@ -14,7 +14,7 @@ /obj/projectile/neurotoxin/tgmc/acid name = "acid spit" icon_state = "toxin" - damage = 15 + damage = 20 paralyze = 0 damage_type = BURN armor_flag = ACID From 101bdc4f0d0eabd6fd1b577850377ee09ac775d0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 9 Mar 2025 19:09:13 +0700 Subject: [PATCH 013/120] small resin heal balance --- code/game/objects/structures/aliens.dm | 2 +- code/modules/mob/living/carbon/alien/organs.dm | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index e80f6591f93..b1d4ce0d6bd 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -245,7 +245,7 @@ qdel(src) /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - // FLUFFY FRONTIER EDIT START - xenomorph_rebalance + // FLUFFY FRONTIER EDIT START - TGMC_XENOS // ORIGINAL LINE: return exposed_temperature > 300 return exposed_temperature > 345 // Подимаем температуру, при которой начинает наноситься урон до ~75 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину // FLUFFY FRONTIER EDIT END diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 1c6c35b506b..6cb54c6735b 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -61,6 +61,12 @@ var/heal_amt = heal_rate if(!isalien(owner)) heal_amt *= 0.2 + // FLUFFY FRONTIER ADDITION START - TGMC_XENOC + if(!owner.resting) + heal_amt *= 0.75 + else + heal_amt *= 1.25 + // FLUFFY FRONTIER ADDITION END owner.adjustPlasma(0.5 * plasma_rate * delta_time_capped) owner.adjustBruteLoss(-heal_amt * delta_time_capped) owner.adjustFireLoss(-heal_amt * delta_time_capped) From 913782baa6d1b7c0030433f45aca0589acb262cf Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 12 Mar 2025 20:11:00 +0700 Subject: [PATCH 014/120] charge redo --- .../modules/tgmc_xenos/code/alien_powers.dm | 91 ++++++++++++++++++- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index e6a96eed835..ac0ba646f98 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -429,14 +429,74 @@ button_icon_state = "defender_charge" unset_after_click = TRUE -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/do_charge_indicator(atom/charger, atom/charge_target) - . = ..() - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) + recoil_duration = 0.6 SECONDS + knockdown_duration = 0.6 SECONDS + + //Количество урона, которое наносится владельцу при столкновении с мехом + var/recoil_damage = 40 + // Время стана операторов меха + var/mech_occupant_stun_duration = 1.2 SECONDS + // Острый ли удар при столкновении + var/impact_sharpness = FALSE + // Количество урона по живности при ударе + var/living_damage = 20 + // Количество урона по меху при ударе + var/mech_damage = 40 /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/Activate(atom/target_atom) . = ..() return TRUE +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/do_charge_indicator(atom/charger, atom/charge_target) + . = ..() + playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) + +// Не убивайте за этот код. У меня полностью ломается голова, когда я прикасаюсь к этому коду. Он работает и меня это устраивает +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/hit_target(atom/movable/source, atom/target, damage_dealt) + if(ismecha(target)) + var/obj/vehicle/sealed/mecha/target_mecha = target + var/list/mob/occupants = target_mecha.return_occupants() + + for(var/mob/living/occupant in occupants) + to_chat(occupant, span_userdanger("[source] smashes into you!"), MESSAGE_TYPE_LOCALCHAT) + if(!isliving(occupant)) + continue + occupant.Stun(mech_occupant_stun_duration) + + source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]"), ignored_mobs = occupants) + + target_mecha.take_damage(mech_damage, BRUTE) + give_drawback(source, take_damage = TRUE) + return TRUE + + if(isliving(target)) + var/mob/living/living_target = target + if(ishuman(living_target)) + var/mob/living/carbon/human/human_target = living_target + if(human_target.check_block(source, 0, "\the [source]", attack_type = LEAP_ATTACK)) + source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]")) + give_drawback(source, FALSE) + + living_target.visible_message(span_danger("[source] tramples [living_target] into the ground!"), span_userdanger("[source] tramples you into the ground!")) + living_target.apply_damage(living_damage, BRUTE, sharpness = impact_sharpness) + living_target.Knockdown(knockdown_duration) + return + + source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]")) + give_drawback(source) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/proc/give_drawback(mob/living/source, take_damage = FALSE, stop_moving = TRUE) + if(!istype(source)) + return FALSE + + if(stop_moving) + GLOB.move_manager.stop_looping(source) + + if(took_damage) + source.apply_damage(recoil_damage, BRUTE) + + source.Stun(recoil_duration, ignore_canstun = TRUE) + // Тройной чардж равагера /datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager @@ -452,13 +512,34 @@ button_icon_state = "ravager_charge" unset_after_click = TRUE -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/do_charge_indicator(atom/charger, atom/charge_target) - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) + // Количество урона по меху при ударе + var/mech_damage = 15 + // Острый ли удар при столкновении + var/impact_sharpness = TRUE /datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/Activate(atom/target_atom) . = ..() return TRUE +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/do_charge_indicator(atom/charger, atom/charge_target) + playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) + +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/can_hit_target(atom/movable/source, atom/target) + return isliving(target) || ismecha(target) + +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/hit_target(atom/movable/source, atom/target, damage_dealt) + if(isliving(target)) + var/mob/living/victim = target + victim.visible_message(span_danger("[source] slams into [target]!"), span_userdanger("[source] tramples you into the ground!")) + victim.apply_damage(damage_dealt, BRUTE, wound_bonus = CANT_WOUND, sharpness = impact_sharpness) + else if(ismecha(target)) + var/obj/vehicle/sealed/mecha/victim = target + source.visible_message(span_danger("[source] smashes into [target]!"), span_danger("You smashes into [target]!")) + victim.take_damage(mech_damage, BRTUE) + playsound(get_turf(target), 'sound/effects/meteorimpact.ogg', 100, TRUE) + shake_camera(target, 4, 3) + shake_camera(source, 2, 3) + /// Способность вариора делать *что-то* /datum/action/cooldown/alien/tgmc/warrior_agility From 8f313f4fdaeab1562c504ab5e1b27f676c56ef4f Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 12 Mar 2025 20:11:30 +0700 Subject: [PATCH 015/120] remove damage mult --- .../tgmc_xenos/code/defense/mech_defense.dm | 16 ++++++++-------- .../modules/tgmc_xenos/code/xeno_types/queen.dm | 3 +-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm index be848175c93..7b208d25da2 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm @@ -1,12 +1,12 @@ /// TGMC_XENOS (old nova sector xenos) // Переопределяем прока атаки у меха, ведь мехи по сути неубиваемые для ксеносов -/obj/vehicle/sealed/mecha/attack_alien(mob/living/carbon/alien/adult/tgmc/user, list/modifiers) - // Если это обычный ксенос - выполняется обычный прок, если нет - наш - if(!istype(user)) - return ..() +// /obj/vehicle/sealed/mecha/attack_alien(mob/living/carbon/alien/adult/tgmc/user, list/modifiers) +// // Если это обычный ксенос - выполняется обычный прок, если нет - наш +// if(!istype(user)) +// return ..() - log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") - playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) - var/damage = round(rand(user.melee_damage_lower, user.melee_damage_upper) * user.mech_damage_multiplier) - attack_generic(user, damage, BRUTE, MELEE, 0) +// log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") +// playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) +// var/damage = round(rand(user.melee_damage_lower, user.melee_damage_upper) * user.mech_damage_multiplier) +// attack_generic(user, damage, BRUTE, MELEE, 0) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 798dabfbb2d..5c6bcf057af 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -77,8 +77,7 @@ var/distance_to_target = get_dist(queenie, screech_target) if(distance_to_target <= 4) to_chat(src, span_danger("An ear-splitting guttural roar shakes the ground beneath your feet!")) - screech_target.AdjustStun(40) - screech_target.AdjustKnockdown(20) + screech_target.AdjustKnockdown(40) else if(distance_to_target >= 5 && distance_to_target < 7) to_chat(src, span_danger("The roar shakes your body to the core, freezing you in place!")) screech_target.AdjustStun(20) From da68742d147c871981f99922fb13447bf8314261 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 12 Mar 2025 20:22:49 +0700 Subject: [PATCH 016/120] Update alien_powers.dm --- tff_modular/modules/tgmc_xenos/code/alien_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index ac0ba646f98..63eef4a6a55 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -492,7 +492,7 @@ if(stop_moving) GLOB.move_manager.stop_looping(source) - if(took_damage) + if(take_damage) source.apply_damage(recoil_damage, BRUTE) source.Stun(recoil_duration, ignore_canstun = TRUE) @@ -535,7 +535,7 @@ else if(ismecha(target)) var/obj/vehicle/sealed/mecha/victim = target source.visible_message(span_danger("[source] smashes into [target]!"), span_danger("You smashes into [target]!")) - victim.take_damage(mech_damage, BRTUE) + victim.take_damage(mech_damage, BRUTE) playsound(get_turf(target), 'sound/effects/meteorimpact.ogg', 100, TRUE) shake_camera(target, 4, 3) shake_camera(source, 2, 3) From 75759e366af6aaf5115e2d1ee282b922e4d9192e Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 01:52:01 +0700 Subject: [PATCH 017/120] restig balance + ravager charge balance --- .../modules/tgmc_xenos/code/alien_powers.dm | 80 +++++++++++++++++-- .../modules/tgmc_xenos/code/base_alien.dm | 77 +++--------------- .../tgmc_xenos/code/xeno_types/queen.dm | 5 +- 3 files changed, 88 insertions(+), 74 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 63eef4a6a55..908bc48ec6d 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -4,6 +4,75 @@ #define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 #define RUNNER_BLUR_EFFECT "runner_evasion" +// Способность эволюционировать +/datum/action/cooldown/alien/tgmc + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + /// Some xeno abilities block other abilities from being used, this allows them to get around that in cases where it is needed + var/can_be_used_always = FALSE + +/datum/action/cooldown/alien/tgmc/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + if(can_be_used_always) + return TRUE + + var/mob/living/carbon/alien/adult/tgmc/owner_alien = owner + if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) + return FALSE + +/datum/action/cooldown/alien/tgmc/generic_evolve + name = "Evolve" + desc = "Allows us to evolve to a higher caste of our type, if there is not one already." + button_icon_state = "evolution" + /// What type this ability will turn the owner into upon completion + var/type_to_evolve_into + +/datum/action/cooldown/alien/tgmc/generic_evolve/Grant(mob/grant_to) + . = ..() + if(!isalien(owner)) + return + var/mob/living/carbon/alien/target_alien = owner + plasma_cost = target_alien.get_max_plasma() //This ability should always require that a xeno be at their max plasma capacity to use + +/datum/action/cooldown/alien/tgmc/generic_evolve/Activate() + var/mob/living/carbon/alien/adult/tgmc/evolver = owner + + if(!istype(evolver)) + to_chat(owner, span_warning("You aren't an alien, you can't evolve!")) + return FALSE + + type_to_evolve_into = evolver.next_evolution + if(!type_to_evolve_into) + to_chat(evolver, span_bolddanger("Something is wrong... We can't evolve into anything? (This is broken report it on GitHub)")) + CRASH("Couldn't find an evolution for [owner] ([owner.type]).") + + if(!isturf(evolver.loc)) + return FALSE + + if(get_alien_type(type_to_evolve_into)) + evolver.balloon_alert(evolver, "too many of our evolution already") + return FALSE + + var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode) + if(!node) + to_chat(evolver, span_bolddanger("We can't sense our node's connection to the hive... We can't evolve!")) + return FALSE + + if(node.recent_queen_death) + to_chat(evolver, span_bolddanger("The death of our queen... We can't seem to gather the mental energy required to evolve...")) + return FALSE + + if(evolver.has_evolved_recently) + evolver.balloon_alert(evolver, "can evolve in 1.5 minutes") //Make that 1.5 variable later, but it keeps fucking up for me :( + return FALSE + + var/new_beno = new type_to_evolve_into(evolver.loc) + evolver.alien_evolve(new_beno) + return TRUE + + // Наши личные нейротоксичные гланды, большую часть мехаана которых по хорошему бы на ТГ перенести, ведь у этих куда большая возможность настройки без боли /datum/action/cooldown/alien/acid/tgmc name = "Spit Neurotoxin" @@ -171,14 +240,11 @@ /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep name = "Crushing Tail Sweep" desc = "Throw back attackers with a sweep of your tail, likely breaking some bones in the process." - + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING cooldown_time = 60 SECONDS - aoe_radius = 1 - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' button_icon_state = "crush_tail" - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/defender /// The sound that the tail sweep will make upon hitting something @@ -420,6 +486,7 @@ /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender name = "Charge Attack" desc = "Allows you to charge at a position, trampling anything in your path." + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING cooldown_time = 15 SECONDS charge_delay = 0.3 SECONDS charge_distance = 5 @@ -464,7 +531,6 @@ occupant.Stun(mech_occupant_stun_duration) source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]"), ignored_mobs = occupants) - target_mecha.take_damage(mech_damage, BRUTE) give_drawback(source, take_damage = TRUE) return TRUE @@ -502,6 +568,7 @@ /datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager name = "Triple Charge Attack" desc = "Allows you to charge thrice at a location, trampling any in your path." + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING cooldown_time = 30 SECONDS charge_delay = 0.3 SECONDS charge_distance = 7 @@ -513,7 +580,7 @@ unset_after_click = TRUE // Количество урона по меху при ударе - var/mech_damage = 15 + var/mech_damage = 10 // Острый ли удар при столкновении var/impact_sharpness = TRUE @@ -533,6 +600,7 @@ victim.visible_message(span_danger("[source] slams into [target]!"), span_userdanger("[source] tramples you into the ground!")) victim.apply_damage(damage_dealt, BRUTE, wound_bonus = CANT_WOUND, sharpness = impact_sharpness) else if(ismecha(target)) + GLOB.move_manager.stop_looping(source) var/obj/vehicle/sealed/mecha/victim = target source.visible_message(span_danger("[source] smashes into [target]!"), span_danger("You smashes into [target]!")) victim.take_damage(mech_damage, BRUTE) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 52f417604c3..dc50b9b08d3 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -42,14 +42,13 @@ /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() + real_name = "alien [caste]" + pixel_x = -16 if(next_evolution) GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) - pixel_x = -16 - ADD_TRAIT(src, TRAIT_XENO_HEAL_AURA, TRAIT_XENO_INNATE) - real_name = "alien [caste]" /mob/living/carbon/alien/adult/tgmc/create_internal_organs() if(additional_organ_types_by_slot) @@ -69,72 +68,15 @@ return has_evolved_recently = FALSE -/datum/action/cooldown/alien/tgmc - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - /// Some xeno abilities block other abilities from being used, this allows them to get around that in cases where it is needed - var/can_be_used_always = FALSE - -/datum/action/cooldown/alien/tgmc/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - - if(can_be_used_always) - return TRUE - - var/mob/living/carbon/alien/adult/tgmc/owner_alien = owner - if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) - return FALSE - -/datum/action/cooldown/alien/tgmc/generic_evolve - name = "Evolve" - desc = "Allows us to evolve to a higher caste of our type, if there is not one already." - button_icon_state = "evolution" - /// What type this ability will turn the owner into upon completion - var/type_to_evolve_into - -/datum/action/cooldown/alien/tgmc/generic_evolve/Grant(mob/grant_to) - . = ..() - if(!isalien(owner)) - return - var/mob/living/carbon/alien/target_alien = owner - plasma_cost = target_alien.get_max_plasma() //This ability should always require that a xeno be at their max plasma capacity to use - -/datum/action/cooldown/alien/tgmc/generic_evolve/Activate() - var/mob/living/carbon/alien/adult/tgmc/evolver = owner - - if(!istype(evolver)) - to_chat(owner, span_warning("You aren't an alien, you can't evolve!")) - return FALSE - - type_to_evolve_into = evolver.next_evolution - if(!type_to_evolve_into) - to_chat(evolver, span_bolddanger("Something is wrong... We can't evolve into anything? (This is broken report it on GitHub)")) - CRASH("Couldn't find an evolution for [owner] ([owner.type]).") - - if(!isturf(evolver.loc)) - return FALSE - - if(get_alien_type(type_to_evolve_into)) - evolver.balloon_alert(evolver, "too many of our evolution already") - return FALSE - - var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode) - if(!node) - to_chat(evolver, span_bolddanger("We can't sense our node's connection to the hive... We can't evolve!")) - return FALSE - - if(node.recent_queen_death) - to_chat(evolver, span_bolddanger("The death of our queen... We can't seem to gather the mental energy required to evolve...")) +/mob/living/carbon/alien/adult/tgmc/Move(atom/newloc, direct = 0) + if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакого передвижения во время отдыха return FALSE + return ..() - if(evolver.has_evolved_recently) - evolver.balloon_alert(evolver, "can evolve in 1.5 minutes") //Make that 1.5 variable later, but it keeps fucking up for me :( +/mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха return FALSE - - var/new_beno = new type_to_evolve_into(evolver.loc) - evolver.alien_evolve(new_beno) - return TRUE + return ..() /datum/movespeed_modifier/alien_quick multiplicative_slowdown = -0.5 @@ -207,7 +149,8 @@ return GLOB.fire_appearances[fire_icon] -/mob/living/carbon/alien/adult/tgmc/findQueen() //Yes we really do need to do this whole thing to let the queen finder work +//Yes we really do need to do this whole thing to let the queen finder work +/mob/living/carbon/alien/adult/tgmc/findQueen() if(hud_used) hud_used.alien_queen_finder.cut_overlays() var/mob/queen = get_alien_type(/mob/living/carbon/alien/adult/tgmc/queen) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 5c6bcf057af..618f97703e3 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -77,7 +77,10 @@ var/distance_to_target = get_dist(queenie, screech_target) if(distance_to_target <= 4) to_chat(src, span_danger("An ear-splitting guttural roar shakes the ground beneath your feet!")) - screech_target.AdjustKnockdown(40) + if(istype(screech_target.loc, /obj/vehicle/sealed/mecha)) + screech_target.AdjustStun(40) + else + screech_target.AdjustKnockdown(40) else if(distance_to_target >= 5 && distance_to_target < 7) to_chat(src, span_danger("The roar shakes your body to the core, freezing you in place!")) screech_target.AdjustStun(20) From 01e4293197ae778cede52f3f0a582199917d79a8 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 06:20:09 +0700 Subject: [PATCH 018/120] hud change --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 11 +++++++++-- .../modules/tgmc_xenos/code/xeno_types/drone.dm | 2 ++ .../modules/tgmc_xenos/code/xeno_types/rouny.dm | 2 ++ .../modules/tgmc_xenos/code/xeno_types/sentinel.dm | 2 ++ .../modules/tgmc_xenos/code/xeno_types/spitter.dm | 2 ++ .../modules/tgmc_xenos/code/xeno_types/warrior.dm | 2 ++ 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index dc50b9b08d3..07719c4ccd0 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -37,8 +37,15 @@ /// Все дополнительные органы, что должны находиться в телах ксеносов var/list/additional_organ_types_by_slot - /// Изменяем урон по мехам - var/mech_damage_multiplier = 1.5 + // Оффсет для худ-ов, чтобы они лучше соответствовали размерам ксеноса + var/hud_offset_x = 32 + var/hud_offset_y = 0 + + // /// Изменяем урон по мехам + // var/mech_damage_multiplier = 1.5 + +/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) + return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 5209a83c9b0..5b0a91f0aed 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -17,6 +17,8 @@ ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, ) + hud_offset_y = -16 + /mob/living/carbon/alien/adult/tgmc/drone/Initialize(mapload) . = ..() GRANT_ACTION(/datum/action/cooldown/alien/tgmc/heal_aura) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index e4f1f40e554..b1cd5ee1431 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -18,6 +18,8 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small/tiny, ) + hud_offset_y = -32 + /mob/living/carbon/alien/adult/tgmc/runner/Initialize(mapload) . = ..() AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 7, min_distance = 0) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index d118377900f..1e63a6b3848 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -17,6 +17,8 @@ ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc, ) + hud_offset_y = -16 + /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) . = ..() add_movespeed_modifier(/datum/movespeed_modifier/alien_slow) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index a4a995c2b08..35bb93075e7 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -17,6 +17,8 @@ ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) + hud_offset_y = -16 + /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm index 2fb552e0557..44fee2b0b9c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm @@ -15,6 +15,8 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel ) + hud_offset_y = -16 + /mob/living/carbon/alien/adult/tgmc/warrior/Initialize(mapload) . = ..() var/static/list/innate_actions = list( From 95baccca5cc79677759120ce6d42e56437aa48b5 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 19:13:16 +0700 Subject: [PATCH 019/120] code readability things --- tff_modular/modules/tgmc_xenos/code/alien_powers.dm | 10 +++++++++- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 6 +++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 908bc48ec6d..3092627a454 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -372,7 +372,15 @@ to_chat(owner, span_danger("We emit pheromones that encourage sisters near us to heal themselves for the next [aura_duration / 10] seconds.")) addtimer(CALLBACK(src, PROC_REF(aura_deactivate)), aura_duration) aura_active = TRUE - aura_healing_component = owner.AddComponent(/datum/component/aura_healing, range = aura_range, requires_visibility = TRUE, brute_heal = aura_healing_amount, burn_heal = aura_healing_amount, limit_to_trait = TRAIT_XENO_HEAL_AURA, healing_color = aura_healing_color) + aura_healing_component = owner.AddComponent( \ + /datum/component/aura_healing, \ + range = aura_range, \ + requires_visibility = TRUE, \ + brute_heal = aura_healing_amount, \ + burn_heal = aura_healing_amount, \ + limit_to_trait = TRAIT_XENO_HEAL_AURA, \ + healing_color = aura_healing_color, \ + ) return TRUE /datum/action/cooldown/alien/tgmc/heal_aura/proc/aura_deactivate() diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 07719c4ccd0..be983dfa6d0 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -44,9 +44,6 @@ // /// Изменяем урон по мехам // var/mech_damage_multiplier = 1.5 -/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) - return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) - /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() real_name = "alien [caste]" @@ -179,3 +176,6 @@ finder_icon = "finder_far" var/image/finder_eye = image('icons/hud/screen_alien.dmi', finder_icon, dir = Qdir) hud_used.alien_queen_finder.add_overlay(finder_eye) + +/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) + return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) From a44d59334ab85b1d569069ffa971c63076178ce3 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 20:57:00 +0700 Subject: [PATCH 020/120] comments change --- code/game/objects/structures/aliens.dm | 5 +---- code/modules/mob/living/carbon/human/human_defense.dm | 2 +- .../modules/tgmc_xenos/code/structures/alien_structures.dm | 4 ++++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index b1d4ce0d6bd..cbf41498729 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -245,10 +245,7 @@ qdel(src) /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - // FLUFFY FRONTIER EDIT START - TGMC_XENOS - // ORIGINAL LINE: return exposed_temperature > 300 - return exposed_temperature > 345 // Подимаем температуру, при которой начинает наноситься урон до ~75 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину - // FLUFFY FRONTIER EDIT END + return exposed_temperature > 300 /obj/structure/alien/weeds/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(5, BURN, 0, 0) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f20f41a1fd2..9fc285b0f7e 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -194,7 +194,7 @@ apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE)) return TRUE -// FLUFFY FRONTIER EDIT BEGIN: TGMC_XENOS - moved to: tff_modular\modules\tgmc_xenos\code\human_defense.dm +// FLUFFY FRONTIER EDIT BEGIN: TGMC_XENOS - moved to: tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm /* /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index df031057ef1..c71a9bdd6da 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -2,3 +2,7 @@ /obj/structure/alien/egg/tgmc child_path = /obj/item/clothing/mask/facehugger/tgmc + +/obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + // Мы подняли температуру, при которой начинает наноситься урон до ~75 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину + return exposed_temperature > 345 From e368bd36a8a9c3382545fa5db01d59c8b82ea432 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 20:57:38 +0700 Subject: [PATCH 021/120] xenos cant touch dead people now --- code/modules/mob/living/living_defense.dm | 5 +++++ tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index eac264028cf..ae7a8ae9a25 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -532,6 +532,11 @@ return FALSE if(check_block(user, user.melee_damage_upper, "[user]'s slash", UNARMED_ATTACK, 0, BRUTE)) return FALSE + // FLUFFY FRONTIER ADIITION START - TGMC_XENOS + if(stat == DEAD) + to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) + return FALSE + // FLUFFY FRONTIER ADIITION END user.do_attack_animation(src) return TRUE diff --git a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm index 655242dad0a..bfab6118be5 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm @@ -1,5 +1,10 @@ /// TGMC_XENOS (old nova sector xenos) +// Если хуман мертв, то ксенос не сможешь его перетаскивать +/mob/living/carbon/human/can_be_pulled(user, force) + return ..() && !(isalien(user) && (stat == DEAD)) + + // Переопредление прока из 'code\modules\mob\living\carbon\human\human_defense.dm' /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) . = ..() From b832932b1eb90273ad1172600e150b79249bdd9f Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 20:58:01 +0700 Subject: [PATCH 022/120] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=20=D0=B3=D1=80=D1=8F=D0=B4?= =?UTF-8?q?=D1=83=D1=89=D0=B5=D0=BC=D1=83=20=D0=BC=D0=B5=D1=80=D0=B4=D0=B6?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/modules/surgery/bodyparts/_bodyparts.dm | 4 +- .../modules/tgmc_xenos/code/base_alien.dm | 9 +++++ .../modules/tgmc_xenos/code/bodyparts.dm | 39 +++++++++++++++++++ tgstation.dme | 1 + 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/bodyparts.dm diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index c05050a588b..3e8a0f98558 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -509,9 +509,7 @@ if(bodytype & (BODYTYPE_ALIEN|BODYTYPE_LARVA_PLACEHOLDER)) //aliens take double burn //nothing can burn with so much snowflake code around // FLUFFY FRONTIER EDIT START - TGMC_XENOS // ORIGINAL LINE: burn *= 2 - if(istype(owner, /mob/living/carbon/alien/adult/tgmc)) - burn *= 1.5 // Множитель чуть поменьше. Чисто для наших ксеносов - else + if(!istype(owner, /mob/living/carbon/alien/adult/tgmc)) burn *= 2 // FLUFFY FRONTIER EDIT END diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index be983dfa6d0..21ee88687bb 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -10,6 +10,15 @@ maptext_width = 64 pressure_resistance = 200 + bodyparts = list( + /obj/item/bodypart/chest/alien/tgmc, + /obj/item/bodypart/head/alien/tgmc, + /obj/item/bodypart/arm/left/alien/tgmc, + /obj/item/bodypart/arm/right/alien/tgmc, + /obj/item/bodypart/leg/right/alien/tgmc, + /obj/item/bodypart/leg/left/alien/tgmc, + ) + default_organ_types_by_slot = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain/alien, ORGAN_SLOT_XENO_HIVENODE = /obj/item/organ/alien/hivenode, diff --git a/tff_modular/modules/tgmc_xenos/code/bodyparts.dm b/tff_modular/modules/tgmc_xenos/code/bodyparts.dm new file mode 100644 index 00000000000..1945af9fdac --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/bodyparts.dm @@ -0,0 +1,39 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Множитель берн урона чуть поменьше. Чисто для этих ксеносов +/obj/item/bodypart/head/alien/tgmc + burn_modifier = 1.5 + +/obj/item/bodypart/chest/alien/tgmc + burn_modifier = 1.5 + +/obj/item/bodypart/arm/left/alien/tgmc + burn_modifier = 1.5 + +/obj/item/bodypart/arm/right/alien/tgmc + burn_modifier = 1.5 + +/obj/item/bodypart/leg/left/alien/tgmc + burn_modifier = 1.5 + +/obj/item/bodypart/leg/right/alien/tgmc + burn_modifier = 1.5 + + +/mob/living/carbon/alien/adult/tgmc/newBodyPart(zone) + var/obj/item/bodypart/new_bodypart + switch(zone) + if(BODY_ZONE_L_ARM) + new_bodypart = new /obj/item/bodypart/arm/left/alien/tgmc() + if(BODY_ZONE_R_ARM) + new_bodypart = new /obj/item/bodypart/arm/right/alien/tgmc() + if(BODY_ZONE_HEAD) + new_bodypart = new /obj/item/bodypart/head/alien/tgmc() + if(BODY_ZONE_L_LEG) + new_bodypart = new /obj/item/bodypart/leg/left/alien/tgmc() + if(BODY_ZONE_R_LEG) + new_bodypart = new /obj/item/bodypart/leg/right/alien/tgmc() + if(BODY_ZONE_CHEST) + new_bodypart = new /obj/item/bodypart/chest/alien/tgmc() + if(new_bodypart) + new_bodypart.update_limb(is_creating = TRUE) diff --git a/tgstation.dme b/tgstation.dme index 1a5d4ff7f41..6a927d24681 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9092,6 +9092,7 @@ #include "tff_modular\modules\streletz\code\clothing.dm" #include "tff_modular\modules\tgmc_xenos\code\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" +#include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" #include "tff_modular\modules\tgmc_xenos\code\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\organs.dm" #include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" From a1acb08aefac6e71b266b17e8776aafead12a3d9 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 13 Mar 2025 21:04:57 +0700 Subject: [PATCH 023/120] remove unused thing --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 3 --- .../modules/tgmc_xenos/code/defense/mech_defense.dm | 12 ------------ tgstation.dme | 1 - 3 files changed, 16 deletions(-) delete mode 100644 tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 21ee88687bb..c3b53f00535 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -50,9 +50,6 @@ var/hud_offset_x = 32 var/hud_offset_y = 0 - // /// Изменяем урон по мехам - // var/mech_damage_multiplier = 1.5 - /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() real_name = "alien [caste]" diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm deleted file mode 100644 index 7b208d25da2..00000000000 --- a/tff_modular/modules/tgmc_xenos/code/defense/mech_defense.dm +++ /dev/null @@ -1,12 +0,0 @@ -/// TGMC_XENOS (old nova sector xenos) - -// Переопределяем прока атаки у меха, ведь мехи по сути неубиваемые для ксеносов -// /obj/vehicle/sealed/mecha/attack_alien(mob/living/carbon/alien/adult/tgmc/user, list/modifiers) -// // Если это обычный ксенос - выполняется обычный прок, если нет - наш -// if(!istype(user)) -// return ..() - -// log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") -// playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) -// var/damage = round(rand(user.melee_damage_lower, user.melee_damage_upper) * user.mech_damage_multiplier) -// attack_generic(user, damage, BRUTE, MELEE, 0) diff --git a/tgstation.dme b/tgstation.dme index 6a927d24681..48ed678b328 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9098,7 +9098,6 @@ #include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" #include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" -#include "tff_modular\modules\tgmc_xenos\code\defense\mech_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\drone.dm" From 2b6ce17c2dd27f280abb615f162482345df96a32 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 15 Mar 2025 11:25:08 +0700 Subject: [PATCH 024/120] tails can damage mecha --- .../modules/tgmc_xenos/code/alien_powers.dm | 70 +++++++++++++------ .../code/structures/alien_structures.dm | 2 +- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 3092627a454..f60386c23ac 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -259,6 +259,12 @@ var/impact_sharpness = FALSE /// What type of damage should the tail sweep do var/impact_damage_type = BRUTE + // Урон по мехам + var/mecha_damage = 20 + // Время стана оператора меха + var/mecha_occupant_stun_duration + // Можем ли откнуить мех ударом хвоста + var/mecha_throwing = TRUE /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) . = ..() @@ -270,7 +276,7 @@ return FALSE /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) - if(!isliving(victim)) + if(!isliving(victim) && !ismecha(victim)) return if(isalien(victim)) @@ -278,22 +284,40 @@ var/turf/throwtarget = get_edge_target_turf(caster, get_dir(caster, get_step_away(victim, caster))) var/dist_from_caster = get_dist(victim, caster) - var/mob/living/victim_living = victim + if(isliving(victim)) + var/mob/living/victim_living = victim + if(dist_from_caster <= 0) + victim_living.Knockdown(knockdown_time) + if(sparkle_path) + new sparkle_path(get_turf(victim_living), get_dir(caster, victim_living)) + else + victim_living.Knockdown(knockdown_time * 2) //They are on the same turf as us, or... somewhere else, I'm not sure how but they are getting smacked down + + victim_living.apply_damage(impact_damage, impact_damage_type, BODY_ZONE_CHEST, wound_bonus = impact_wound_bonus, sharpness = impact_sharpness) + shake_camera(victim_living, 4, 3) + playsound(victim_living, impact_sound, 100, TRUE, 8, 0.9) + victim.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) + + victim_living.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) + + else if(ismecha(victim)) + var/obj/vehicle/sealed/mecha/victim_mecha = victim + var/list/mob/occupants = victim_mecha.return_occupants() - if(dist_from_caster <= 0) - victim_living.Knockdown(knockdown_time) - if(sparkle_path) - new sparkle_path(get_turf(victim_living), get_dir(caster, victim_living)) - - else - victim_living.Knockdown(knockdown_time * 2) //They are on the same turf as us, or... somewhere else, I'm not sure how but they are getting smacked down + for(var/mob/living/occupant in occupants) + if(!isliving(occupant)) + continue + if(!isnull(mecha_occupant_stun_duration)) + occupant.Stun(mecha_occupant_stun_duration) + shake_camera(occupant, 4, 3) + playsound(occupant, impact_sound, 100, TRUE, 8, 0.9) - victim_living.apply_damage(impact_damage, impact_damage_type, BODY_ZONE_CHEST, wound_bonus = impact_wound_bonus, sharpness = impact_sharpness) - shake_camera(victim_living, 4, 3) - playsound(victim_living, impact_sound, 100, TRUE, 8, 0.9) - to_chat(victim_living, span_userdanger("[caster]'s tail slams into you, throwing you back!")) + victim_mecha.take_damage(mecha_damage, impact_damage_type) + victim_mecha.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) - victim_living.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) + if(mecha_throwing) + if((victim_mecha.max_integrity < 400) && (dist_from_caster <= 1)) + victim_mecha.safe_throw_at(throwtarget, 1, 1, caster, spin = FALSE, force = repulse_force) /obj/effect/temp_visual/dir_setting/tailsweep/defender icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' @@ -316,6 +340,8 @@ impact_damage = 20 impact_wound_bonus = 10 + mecha_occupant_stun_duration = 1.2 SECONDS + /obj/effect/temp_visual/dir_setting/tailsweep/praetorian icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' icon_state = "throw_tail_anim" @@ -338,6 +364,10 @@ impact_damage = 40 impact_sharpness = SHARP_EDGED + mecha_damage = 10 + mecha_occupant_stun_duration = null + mecha_throwing = FALSE + /obj/effect/temp_visual/dir_setting/tailsweep/ravager icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' icon_state = "slice_tail_anim" @@ -510,13 +540,13 @@ //Количество урона, которое наносится владельцу при столкновении с мехом var/recoil_damage = 40 // Время стана операторов меха - var/mech_occupant_stun_duration = 1.2 SECONDS + var/mecha_occupant_stun_duration = 1.2 SECONDS // Острый ли удар при столкновении var/impact_sharpness = FALSE // Количество урона по живности при ударе var/living_damage = 20 // Количество урона по меху при ударе - var/mech_damage = 40 + var/mecha_damage = 40 /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/Activate(atom/target_atom) . = ..() @@ -536,10 +566,10 @@ to_chat(occupant, span_userdanger("[source] smashes into you!"), MESSAGE_TYPE_LOCALCHAT) if(!isliving(occupant)) continue - occupant.Stun(mech_occupant_stun_duration) + occupant.Stun(mecha_occupant_stun_duration) source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]"), ignored_mobs = occupants) - target_mecha.take_damage(mech_damage, BRUTE) + target_mecha.take_damage(mecha_damage, BRUTE) give_drawback(source, take_damage = TRUE) return TRUE @@ -588,7 +618,7 @@ unset_after_click = TRUE // Количество урона по меху при ударе - var/mech_damage = 10 + var/mecha_damage = 10 // Острый ли удар при столкновении var/impact_sharpness = TRUE @@ -611,7 +641,7 @@ GLOB.move_manager.stop_looping(source) var/obj/vehicle/sealed/mecha/victim = target source.visible_message(span_danger("[source] smashes into [target]!"), span_danger("You smashes into [target]!")) - victim.take_damage(mech_damage, BRUTE) + victim.take_damage(mecha_damage, BRUTE) playsound(get_turf(target), 'sound/effects/meteorimpact.ogg', 100, TRUE) shake_camera(target, 4, 3) shake_camera(source, 2, 3) diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index c71a9bdd6da..5e2509c55e8 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -4,5 +4,5 @@ child_path = /obj/item/clothing/mask/facehugger/tgmc /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - // Мы подняли температуру, при которой начинает наноситься урон до ~75 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину + // Мы подняли температуру, при которой начинает наноситься урон до ~72 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину return exposed_temperature > 345 From 464bdc16c28dccbcc1b28c1d4603b40466e778d0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 20 Mar 2025 15:15:56 +0700 Subject: [PATCH 025/120] some changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - убран чардж у дефендера в угоду будущему фортифаю - переделан чардж и выдан крашеру - добавлена новая каста ксеносов - крашер - добавлена возможность изменять урон по мехам - т2 ксеносы + королева теперь могут выстоять удар дюранда в ближнем бою - добавлен урон от кислотных плевков (очень глупым и плохим способом) - исправлен баг с невозможностью перетаскивать лежачих ксеносов (ксеносы теперь могут передвигаться, но на них накладывается большой дебафф к скорости перемещения) --- code/__HELPERS/~ff_helpers/is_helpers.dm | 15 ++ code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- code/modules/vehicles/mecha/_mecha.dm | 9 + .../modules/tgmc_xenos/code/alien_powers.dm | 249 ++++++++++-------- .../modules/tgmc_xenos/code/base_alien.dm | 25 +- .../tgmc_xenos/code/defense/mecha_defense.dm | 25 ++ .../tgmc_xenos/code/xeno_types/crusher.dm | 34 +++ .../tgmc_xenos/code/xeno_types/defender.dm | 4 +- .../tgmc_xenos/code/xeno_types/drone.dm | 2 + .../tgmc_xenos/code/xeno_types/praetorian.dm | 3 + .../tgmc_xenos/code/xeno_types/queen.dm | 3 + .../tgmc_xenos/code/xeno_types/ravager.dm | 3 + .../tgmc_xenos/code/xeno_types/rouny.dm | 2 + .../tgmc_xenos/code/xeno_types/sentinel.dm | 2 + .../tgmc_xenos/code/xeno_types/spitter.dm | 3 + .../tgmc_xenos/code/xeno_types/warrior.dm | 57 +++- .../modules/tgmc_xenos/icons/big_xenos.dmi | Bin 56507 -> 64165 bytes .../modules/tgmc_xenos/icons/xeno_actions.dmi | Bin 9183 -> 10532 bytes tgstation.dme | 2 + 19 files changed, 315 insertions(+), 125 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm diff --git a/code/__HELPERS/~ff_helpers/is_helpers.dm b/code/__HELPERS/~ff_helpers/is_helpers.dm index aa2af5931b1..defadd96efc 100644 --- a/code/__HELPERS/~ff_helpers/is_helpers.dm +++ b/code/__HELPERS/~ff_helpers/is_helpers.dm @@ -1 +1,16 @@ #define isnabber(A) (is_species(A, /datum/species/nabber)) + +// TGMC Xenomorph +#define istgmcalien(A) (istype(A, /mob/living/carbon/alien/adult/tgmc)) + +#define istgmcalienqueen(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/queen)) + +#define istgmcalienpraetorian(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/praetorian)) + +#define istgmcalienravager(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/ravager)) + +#define istgmcaliencrusher(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/warrior)) + +#define istgmcalienspitter(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/spitter)) + +#define istgmcalientier2(A) (istgmcalienpraetorian(A) || istgmcalienravager(A) || istgmcaliencrusher(A) || istgmcalienspitter(A)) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 3e8a0f98558..9e8ca953fe2 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -509,7 +509,7 @@ if(bodytype & (BODYTYPE_ALIEN|BODYTYPE_LARVA_PLACEHOLDER)) //aliens take double burn //nothing can burn with so much snowflake code around // FLUFFY FRONTIER EDIT START - TGMC_XENOS // ORIGINAL LINE: burn *= 2 - if(!istype(owner, /mob/living/carbon/alien/adult/tgmc)) + if(!istgmcalien(owner)) // Записка для мейнтейнра - если будет мердж конфликт в этом месте, то просто убирай полностью весь этот FLUFFY FRONTIER EDIT. Ничего не сломается burn *= 2 // FLUFFY FRONTIER EDIT END diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index e4330bb3b90..210babfe7b3 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -920,6 +920,15 @@ /obj/vehicle/sealed/mecha/proc/melee_attack_effect(mob/living/victim, heavy) if(heavy) + // FLUFFY FRONTIER ADDITION START - TGMC_XENOS + if(istgmcalien(victim)) + var/mob/living/carbon/alien/adult/tgmc/tgmc_alien + if(tgmc_alien.resist_heavy_hits) + if(health_percentage(victim) >= 35) + return + if(!prob(50)) + return + // FLUFFY FRONTIER ADDITION END victim.Unconscious(2 SECONDS) else victim.Knockdown(4 SECONDS) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index f60386c23ac..57d2f5e39bb 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -260,11 +260,11 @@ /// What type of damage should the tail sweep do var/impact_damage_type = BRUTE // Урон по мехам - var/mecha_damage = 20 + var/vehicle_damage = 20 // Время стана оператора меха var/mecha_occupant_stun_duration - // Можем ли откнуить мех ударом хвоста - var/mecha_throwing = TRUE + // Можем ли откинуть мех ударом хвоста + var/vehicle_throwing = TRUE /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) . = ..() @@ -312,10 +312,10 @@ shake_camera(occupant, 4, 3) playsound(occupant, impact_sound, 100, TRUE, 8, 0.9) - victim_mecha.take_damage(mecha_damage, impact_damage_type) + victim_mecha.take_damage(vehicle_damage, impact_damage_type) victim_mecha.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) - if(mecha_throwing) + if(vehicle_throwing) if((victim_mecha.max_integrity < 400) && (dist_from_caster <= 1)) victim_mecha.safe_throw_at(throwtarget, 1, 1, caster, spin = FALSE, force = repulse_force) @@ -364,9 +364,9 @@ impact_damage = 40 impact_sharpness = SHARP_EDGED - mecha_damage = 10 + vehicle_damage = 10 mecha_occupant_stun_duration = null - mecha_throwing = FALSE + vehicle_throwing = FALSE /obj/effect/temp_visual/dir_setting/tailsweep/ravager icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' @@ -379,7 +379,7 @@ desc = "Friendly xenomorphs in a short range around yourself will receive passive healing." button_icon_state = "healaura" plasma_cost = 100 - cooldown_time = 90 SECONDS + cooldown_time = 60 SECONDS /// Is the healing aura currently active or not var/aura_active = FALSE /// How long the healing aura should last @@ -427,7 +427,6 @@ desc = "Friendly xenomorphs in a longer range around yourself will receive passive healing." button_icon_state = "healaura_juiced" plasma_cost = 100 - cooldown_time = 90 SECONDS aura_range = 7 aura_healing_amount = 10 aura_healing_color = COLOR_RED_LIGHT @@ -520,86 +519,135 @@ return BULLET_ACT_FORCE_PIERCE -// Одиночный чардж дефендера и вариора -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender +// Чардж крашера +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge name = "Charge Attack" desc = "Allows you to charge at a position, trampling anything in your path." check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING cooldown_time = 15 SECONDS charge_delay = 0.3 SECONDS - charge_distance = 5 + charge_distance = 7 destroy_objects = FALSE - charge_damage = 50 button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "defender_charge" + button_icon_state = "crusher_charge" unset_after_click = TRUE - recoil_duration = 0.6 SECONDS - knockdown_duration = 0.6 SECONDS + var/living_damage = 40 + var/living_knockdown_time = 5 SECONDS + var/living_daze_amount = 3 SECONDS + var/sharpness = FALSE - //Количество урона, которое наносится владельцу при столкновении с мехом - var/recoil_damage = 40 - // Время стана операторов меха - var/mecha_occupant_stun_duration = 1.2 SECONDS - // Острый ли удар при столкновении - var/impact_sharpness = FALSE - // Количество урона по живности при ударе - var/living_damage = 20 - // Количество урона по меху при ударе - var/mecha_damage = 40 + var/obj_damage = 50 + var/mecha_damage = 50 + var/mecha_occupants_stun_time = 5 SECONDS + var/throw_mecha = TRUE -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/Activate(atom/target_atom) - . = ..() - return TRUE + var/crush_walls = TRUE -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/do_charge_indicator(atom/charger, atom/charge_target) +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/do_charge_indicator(atom/charger, atom/charge_target) . = ..() playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) -// Не убивайте за этот код. У меня полностью ломается голова, когда я прикасаюсь к этому коду. Он работает и меня это устраивает -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/hit_target(atom/movable/source, atom/target, damage_dealt) - if(ismecha(target)) - var/obj/vehicle/sealed/mecha/target_mecha = target - var/list/mob/occupants = target_mecha.return_occupants() +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/hit_target(atom/movable/source, atom/target, damage_dealt) + var/mob/living/carbon/alien/adult/tgmc/charger = owner - for(var/mob/living/occupant in occupants) - to_chat(occupant, span_userdanger("[source] smashes into you!"), MESSAGE_TYPE_LOCALCHAT) - if(!isliving(occupant)) - continue - occupant.Stun(mecha_occupant_stun_duration) + // Столокновение с существами + if(isliving(target)) + var/mob/living/target_living = target + if(target_living.buckled) + target_living.buckled.unbuckle_mob(target_living) - source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]"), ignored_mobs = occupants) - target_mecha.take_damage(mecha_damage, BRUTE) - give_drawback(source, take_damage = TRUE) - return TRUE + log_combat(charger, target_living, "xeno charged") + var/damage = living_damage + target_living.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, sharpness = sharpness) - if(isliving(target)) - var/mob/living/living_target = target - if(ishuman(living_target)) - var/mob/living/carbon/human/human_target = living_target - if(human_target.check_block(source, 0, "\the [source]", attack_type = LEAP_ATTACK)) - source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]")) - give_drawback(source, FALSE) - - living_target.visible_message(span_danger("[source] tramples [living_target] into the ground!"), span_userdanger("[source] tramples you into the ground!")) - living_target.apply_damage(living_damage, BRUTE, sharpness = impact_sharpness) - living_target.Knockdown(knockdown_duration) + if(target_living.density && (target_living.mob_size >= charger.mob_size)) + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() return - source.visible_message(span_danger("[source] smashes into [target]!"), span_userdanger("You smashes into [target]")) - give_drawback(source) + var/fling_dir = pick((charger.dir & (NORTH|SOUTH)) ? list(WEST, EAST, charger.dir|WEST, charger.dir|EAST) : list(NORTH, SOUTH, charger.dir|NORTH, charger.dir|SOUTH)) + var/fling_dist = rand(1, 3) + var/turf/destination = target_living.loc + var/turf/temp -/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender/proc/give_drawback(mob/living/source, take_damage = FALSE, stop_moving = TRUE) - if(!istype(source)) - return FALSE + for(var/i in 1 to fling_dist) + temp = get_step(destination, fling_dir) + if(!temp) + break + destination = temp - if(stop_moving) - GLOB.move_manager.stop_looping(source) + if(destination != target_living.loc) + target_living.throw_at(destination, fling_dist, 1, charger, TRUE) + + target_living.Knockdown(living_knockdown_time, daze_amount = living_daze_amount) + charger.visible_message(span_danger("[charger] rams [target]!"), span_alertalien("We ram [target]!")) + return + + // Столокновение с объектами + if(isobj(target)) + var/obj/target_obj = target + if(istype(target_obj, /obj/structure/alien)) + return + + var/damage = obj_damage + if(ismecha(target)) + damage = mecha_damage + else if(istype(target, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/target_airlock = target + damage = ceil(target_airlock.normal_integrity / 3) + else if(istype(target, /obj/structure/window)) + damage = 70 + + target_obj.take_damage(damage, BRUTE) + if(QDELETED(target_obj)) + charger.visible_message(span_danger("[charger] crushes [target]!"), span_alertalien("We crush [target]!")) + return + + if(ismecha(target)) + var/obj/vehicle/sealed/mecha/target_mecha = target - if(take_damage) - source.apply_damage(recoil_damage, BRUTE) + for(var/mob/living/occupant in target_mecha.occupants) + occupant.Stun(mecha_occupants_stun_time) - source.Stun(recoil_duration, ignore_canstun = TRUE) + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() + + var/turf/throwtarget = get_edge_target_turf(source, get_dir(source, get_step_away(target, source))) + var/dist_from_source = get_dist(target, source) + if(throw_mecha && (target.max_integrity < 400) && (dist_from_source <= 1)) + target_mecha.safe_throw_at(throwtarget, 1, 1, source, spin = FALSE, force = MOVE_FORCE_EXTREMELY_STRONG) + + return + + if(target_obj.anchored) + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() + + charger.visible_message("[span_warning("[charger] knocks [target] aside.")]!", span_alertalien("We knock [target] aside.")) + return + + // Столокновение с турфами + if(isturf(target)) + if(crush_walls) + if(!isclosedturf(target) || isindestructiblewall(target) || istype(target, /turf/closed/wall/r_wall)) + return + + target.AddComponent(/datum/component/torn_wall) + if(!QDELETED(target)) + target.AddComponent(/datum/component/torn_wall) + + if(QDELETED(target)) + charger.visible_message(span_danger("[charger] plows straight through [target]!"), span_alertalien("We plow straight through [target]!")) + return + + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() + return + +// Останавливает движение чарджера +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/proc/do_stop() + GLOB.move_manager.stop_looping(owner) // Тройной чардж равагера @@ -612,13 +660,13 @@ charge_distance = 7 charge_past = 3 destroy_objects = FALSE - charge_damage = 25 + charge_damage = 40 button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' button_icon_state = "ravager_charge" unset_after_click = TRUE // Количество урона по меху при ударе - var/mecha_damage = 10 + var/vehicle_damage = 30 // Острый ли удар при столкновении var/impact_sharpness = TRUE @@ -636,68 +684,35 @@ if(isliving(target)) var/mob/living/victim = target victim.visible_message(span_danger("[source] slams into [target]!"), span_userdanger("[source] tramples you into the ground!")) - victim.apply_damage(damage_dealt, BRUTE, wound_bonus = CANT_WOUND, sharpness = impact_sharpness) + victim.apply_damage(charge_damage, BRUTE, sharpness = impact_sharpness) else if(ismecha(target)) GLOB.move_manager.stop_looping(source) var/obj/vehicle/sealed/mecha/victim = target source.visible_message(span_danger("[source] smashes into [target]!"), span_danger("You smashes into [target]!")) - victim.take_damage(mecha_damage, BRUTE) + victim.take_damage(vehicle_damage, BRUTE) playsound(get_turf(target), 'sound/effects/meteorimpact.ogg', 100, TRUE) shake_camera(target, 4, 3) shake_camera(source, 2, 3) -/// Способность вариора делать *что-то* -/datum/action/cooldown/alien/tgmc/warrior_agility - name = "Agility Mode" - desc = "Drop onto all fours, increasing your speed at the cost of damage and being unable to use most abilities." - button_icon_state = "the_speed_is_alot" - cooldown_time = 1 SECONDS - can_be_used_always = TRUE - /// Is the warrior currently running around on all fours? - var/being_agile = FALSE - -/datum/action/cooldown/alien/tgmc/warrior_agility/Activate() - . = ..() - if(!being_agile) - begin_agility() - return TRUE - if(being_agile) - end_agility() - return TRUE - -/// Handles the visual indication and code activation of the warrior agility ability (say that five times fast) -/datum/action/cooldown/alien/tgmc/warrior_agility/proc/begin_agility() - var/mob/living/carbon/alien/adult/tgmc/agility_target = owner - agility_target.balloon_alert(agility_target, "agility active") - to_chat(agility_target, span_danger("We drop onto all fours, allowing us to move at much greater speed at expense of being able to use most abilities.")) - playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) - agility_target.icon_state = "alien[agility_target.caste]_mobility" - - being_agile = TRUE - agility_target.add_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) - agility_target.unable_to_use_abilities = TRUE - - agility_target.melee_damage_lower = 15 - agility_target.melee_damage_upper = 20 - -/// Handles the visual indicators and code side of deactivating the agility ability -/datum/action/cooldown/alien/tgmc/warrior_agility/proc/end_agility() - var/mob/living/carbon/alien/adult/tgmc/agility_target = owner - agility_target.balloon_alert(agility_target, "agility ended") - playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) //Warrior runs up on all fours, stands upright, screams at you - agility_target.icon_state = "alien[agility_target.caste]" - - being_agile = FALSE - agility_target.remove_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) - agility_target.unable_to_use_abilities = FALSE +// Способность дефендера становиться настоящей крепостью +// /datum/action/cooldown/alien/fortify +// name = "Fortify" +// desc = "Plant yourself for a large defensive boost." +// cooldown_time = 1 SECONDS +// button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' +// button_icon_state = "fortify" - agility_target.melee_damage_lower = initial(agility_target.melee_damage_lower) - agility_target.melee_damage_upper = initial(agility_target.melee_damage_upper) +// var/is_fortify = FALSE -/datum/movespeed_modifier/warrior_agility - multiplicative_slowdown = -2 +// /datum/action/cooldown/alien/fortify/Activate(atom/target) +// . = ..() +// if(is_fortify) +// set_fortify(FALSE) +// /datum/action/cooldown/alien/fortify/proc/set_fortify(on) +// if(on) +// ADD_TRAIT(xeno_owner, TRAIT_IMMOBILE, FORTIFY_TRAIT) #undef RAVAGER_OUTLINE_EFFECT #undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index c3b53f00535..3f73f300116 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -50,6 +50,10 @@ var/hud_offset_x = 32 var/hud_offset_y = 0 + // Урон по тяжелым транспортным штукам (типа мехов) + var/melee_vehicle_damage + var/resist_heavy_hits = FALSE + /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() real_name = "alien [caste]" @@ -59,6 +63,11 @@ GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) ADD_TRAIT(src, TRAIT_XENO_HEAL_AURA, TRAIT_XENO_INNATE) + RegisterSignal(src, COMSIG_LIVING_UPDATED_RESTING, PROC_REF(on_rest)) + +/mob/living/carbon/alien/adult/tgmc/Destroy() + . = ..() + UnregisterSignal(src, COMSIG_LIVING_UPDATED_RESTING) /mob/living/carbon/alien/adult/tgmc/create_internal_organs() if(additional_organ_types_by_slot) @@ -78,11 +87,6 @@ return has_evolved_recently = FALSE -/mob/living/carbon/alien/adult/tgmc/Move(atom/newloc, direct = 0) - if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакого передвижения во время отдыха - return FALSE - return ..() - /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха return FALSE @@ -185,3 +189,14 @@ /mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) + +/mob/living/carbon/alien/adult/tgmc/proc/on_rest() + SIGNAL_HANDLER + + if(resting) + add_movespeed_modifier(/datum/movespeed_modifier/alien_rest) + else + remove_movespeed_modifier(/datum/movespeed_modifier/alien_rest) + +/datum/movespeed_modifier/alien_rest + multiplicative_slowdown = 5 diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm new file mode 100644 index 00000000000..865ea95f7a7 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm @@ -0,0 +1,25 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Переопределяем прока атаки у меха, ведь мехи по сути неубиваемые для ксеносов +/obj/vehicle/sealed/mecha/attack_alien(mob/living/carbon/alien/adult/tgmc/user, list/modifiers) + // Если это обычный ксенос - выполняется обычный прок, если нет - наш + if(!istype(user)) + return ..() + + log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") + playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) + var/damage = user.melee_vehicle_damage + attack_generic(user, damage, BRUTE, MELEE, 0) + +// Так как плевки не могут наносить урон мехам из-за их брони к кислоте, то мы просто будем переопределять armor_flag этих самых плевков с кислоты на лазер +/obj/vehicle/sealed/mecha/bullet_act(obj/projectile/source, def_zone, mode) + if(istype(source, /obj/projectile/neurotoxin/tgmc/acid)) + source.armor_flag = LASER + source.damage /= 2 + return ..() + +/obj/durand_shield/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = null) + if(istype(hitting_projectile, /obj/projectile/neurotoxin/tgmc/acid)) + hitting_projectile.armor_flag = LASER + hitting_projectile.damage /= 2 + return ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm new file mode 100644 index 00000000000..3eacda6df62 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -0,0 +1,34 @@ +/// TGMC_XENOS (old nova sector xenos) + +/mob/living/carbon/alien/adult/tgmc/crusher + name = "alien crusher" + desc = "A huge alien with an enormous armored crest." + caste = "crusher" + maxHealth = 700 + health = 700 + icon_state = "aliencrusher" + mob_size = MOB_SIZE_LARGE + melee_damage_lower = 30 + melee_damage_upper = 35 + + additional_organ_types_by_slot = list( + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel + ) + + hud_offset_y = -16 + + melee_vehicle_damage = 40 + resist_heavy_hits = TRUE + + move_resist = MOVE_FORCE_STRONG + +/mob/living/carbon/alien/adult/tgmc/crusher/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge, + ) + grant_actions_by_list(innate_actions) + + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + add_movespeed_modifier(/datum/movespeed_modifier/alien_big) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 27a07d1a614..6a2679439e2 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -16,11 +16,13 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small, ) + melee_vehicle_damage = 30 + armor_type = /datum/armor/mod_theme_administrative + /mob/living/carbon/alien/adult/tgmc/defender/Initialize(mapload) . = ..() var/static/list/innate_actions = list( /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep, - /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender, ) grant_actions_by_list(innate_actions) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 5b0a91f0aed..499773fcc9e 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -19,6 +19,8 @@ hud_offset_y = -16 + melee_vehicle_damage = 20 + /mob/living/carbon/alien/adult/tgmc/drone/Initialize(mapload) . = ..() GRANT_ACTION(/datum/action/cooldown/alien/tgmc/heal_aura) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index c1694028bd8..7fb2789e679 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -19,6 +19,9 @@ ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) + melee_vehicle_damage = 30 + resist_heavy_hits = TRUE + /mob/living/carbon/alien/adult/tgmc/praetorian/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 618f97703e3..ee66eb0fbc2 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -19,6 +19,9 @@ ORGAN_SLOT_XENO_EGGSAC = /obj/item/organ/alien/eggsac/tgmc, ) + melee_vehicle_damage = 35 + resist_heavy_hits = TRUE + /mob/living/carbon/alien/adult/tgmc/queen/Initialize(mapload) . = ..() AddComponent(/datum/component/seethrough_mob) // Люркеров у нас нету (слава богу), но выдать такую штуку кому-то хочется... Будет у королевы, как на обычном ТГ diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 9db3a0e0e53..98c2d7b23e8 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -15,6 +15,9 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel ) + melee_vehicle_damage = 35 + resist_heavy_hits = TRUE + /mob/living/carbon/alien/adult/tgmc/ravager/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index b1cd5ee1431..f6a41fb4c2b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -20,6 +20,8 @@ hud_offset_y = -32 + melee_vehicle_damage = 20 + /mob/living/carbon/alien/adult/tgmc/runner/Initialize(mapload) . = ..() AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 7, min_distance = 0) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 1e63a6b3848..293f0b729e2 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -19,6 +19,8 @@ hud_offset_y = -16 + melee_vehicle_damage = 15 + /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) . = ..() add_movespeed_modifier(/datum/movespeed_modifier/alien_slow) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 35bb93075e7..93b7bb03651 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -19,6 +19,9 @@ hud_offset_y = -16 + melee_vehicle_damage = 20 + resist_heavy_hits = TRUE + /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm index 44fee2b0b9c..ad3c2204f97 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm @@ -1,5 +1,6 @@ /// TGMC_XENOS (old nova sector xenos) +// На данный момент не используется, остался как рудимент /mob/living/carbon/alien/adult/tgmc/warrior name = "alien warrior" desc = "If there are aliens to call walking tanks, this would be one of them, with both the heavy armor and strong arms to back that claim up." @@ -17,11 +18,12 @@ hud_offset_y = -16 + melee_vehicle_damage = 35 + /mob/living/carbon/alien/adult/tgmc/warrior/Initialize(mapload) . = ..() var/static/list/innate_actions = list( /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep, - /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender, /datum/action/cooldown/alien/tgmc/warrior_agility, ) grant_actions_by_list(innate_actions) @@ -29,3 +31,56 @@ REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + + + +/// Способность вариора делать *что-то* +/datum/action/cooldown/alien/tgmc/warrior_agility + name = "Agility Mode" + desc = "Drop onto all fours, increasing your speed at the cost of damage and being unable to use most abilities." + button_icon_state = "the_speed_is_alot" + cooldown_time = 1 SECONDS + can_be_used_always = TRUE + /// Is the warrior currently running around on all fours? + var/being_agile = FALSE + +/datum/action/cooldown/alien/tgmc/warrior_agility/Activate() + . = ..() + if(!being_agile) + begin_agility() + return TRUE + if(being_agile) + end_agility() + return TRUE + +/// Handles the visual indication and code activation of the warrior agility ability (say that five times fast) +/datum/action/cooldown/alien/tgmc/warrior_agility/proc/begin_agility() + var/mob/living/carbon/alien/adult/tgmc/agility_target = owner + agility_target.balloon_alert(agility_target, "agility active") + to_chat(agility_target, span_danger("We drop onto all fours, allowing us to move at much greater speed at expense of being able to use most abilities.")) + playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) + agility_target.icon_state = "alien[agility_target.caste]_mobility" + + being_agile = TRUE + agility_target.add_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) + agility_target.unable_to_use_abilities = TRUE + + agility_target.melee_damage_lower = 15 + agility_target.melee_damage_upper = 20 + +/// Handles the visual indicators and code side of deactivating the agility ability +/datum/action/cooldown/alien/tgmc/warrior_agility/proc/end_agility() + var/mob/living/carbon/alien/adult/tgmc/agility_target = owner + agility_target.balloon_alert(agility_target, "agility ended") + playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) //Warrior runs up on all fours, stands upright, screams at you + agility_target.icon_state = "alien[agility_target.caste]" + + being_agile = FALSE + agility_target.remove_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) + agility_target.unable_to_use_abilities = FALSE + + agility_target.melee_damage_lower = initial(agility_target.melee_damage_lower) + agility_target.melee_damage_upper = initial(agility_target.melee_damage_upper) + +/datum/movespeed_modifier/warrior_agility + multiplicative_slowdown = -2 diff --git a/tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi b/tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi index 2f1c5bb00228a4c3775b676f357e4dc5c0f30fed..7c72e7757898398c1e83bd7b7a25d871713256d8 100644 GIT binary patch literal 64165 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 O8jv@Qbt<$TME)N~{b9-g literal 56507 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%0AhcK3p>g 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 gSUYPA?p{G~K9QJ+Za;wJ`iz>6#$EMysQ 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

@_+`#KV7cG`&n1O~0@ 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 diff --git a/tgstation.dme b/tgstation.dme index 531127ab458..18546ed3aab 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9105,7 +9105,9 @@ #include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" #include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" +#include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm" +#include "tff_modular\modules\tgmc_xenos\code\xeno_types\crusher.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\drone.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\praetorian.dm" From cfa25cbeda902c71da7cf0028fa36ae1ec0e78a0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 23 Mar 2025 22:14:52 +0700 Subject: [PATCH 026/120] more changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - снижено время перезарядки крика королевы с 5 минут до 3 - все "большие" ксеносы получили move_resist = MOVE_FORCE_STRONG - добавлено умение fortify для дефендера - увеличена скорость ксенов, если они ходят по резине --- .../modules/tgmc_xenos/code/_xeno_defines.dm | 11 +++ .../modules/tgmc_xenos/code/alien_powers.dm | 72 +++++++++++++----- .../modules/tgmc_xenos/code/base_alien.dm | 40 +++++++++- .../modules/tgmc_xenos/code/resin_walker.dm | 30 ++++++++ .../tgmc_xenos/code/xeno_types/crusher.dm | 3 +- .../tgmc_xenos/code/xeno_types/defender.dm | 15 +++- .../tgmc_xenos/code/xeno_types/praetorian.dm | 1 + .../tgmc_xenos/code/xeno_types/queen.dm | 3 +- .../tgmc_xenos/code/xeno_types/ravager.dm | 1 + .../modules/tgmc_xenos/icons/big_xenos.dmi | Bin 64165 -> 144685 bytes tgstation.dme | 2 + 11 files changed, 154 insertions(+), 24 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/resin_walker.dm diff --git a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm new file mode 100644 index 00000000000..c73344bbb4b --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm @@ -0,0 +1,11 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Traits +/// Defender fortify ability +#define TRAIT_XENO_FORTIFY "xeno_fortify" +/// Trait source for xeno innate abilities +#define TRAIT_XENO_INNATE "xeno_innate" +/// Trait source for something added BY a xeno ability +#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" +/// Determines if something can receive healing from a xeno +#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 57d2f5e39bb..938c67772ce 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -696,23 +696,61 @@ // Способность дефендера становиться настоящей крепостью -// /datum/action/cooldown/alien/fortify -// name = "Fortify" -// desc = "Plant yourself for a large defensive boost." -// cooldown_time = 1 SECONDS -// button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' -// button_icon_state = "fortify" - -// var/is_fortify = FALSE - -// /datum/action/cooldown/alien/fortify/Activate(atom/target) -// . = ..() -// if(is_fortify) -// set_fortify(FALSE) - -// /datum/action/cooldown/alien/fortify/proc/set_fortify(on) -// if(on) -// ADD_TRAIT(xeno_owner, TRAIT_IMMOBILE, FORTIFY_TRAIT) +/datum/action/cooldown/alien/fortify + name = "Fortify" + desc = "Plant yourself for a large defensive boost." + cooldown_time = 2 SECONDS + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "fortify" + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + + var/mob/living/carbon/alien/adult/tgmc/xeno_owner + var/datum/armor/fortify_armor_type = /datum/armor/fortify_armor + +/datum/armor/fortify_armor + bomb = 30 + bullet = 50 + laser = 50 + fire = 50 + melee = 30 + +/datum/action/cooldown/alien/fortify/Destroy() + set_fortify(FALSE) + return ..() + +/datum/action/cooldown/alien/fortify/Grant(mob/granted_to) + . = ..() + xeno_owner = owner + +/datum/action/cooldown/alien/fortify/Activate(atom/target) + . = ..() + if(xeno_owner.fortify) + set_fortify(FALSE) + return + + set_fortify(TRUE) + +/datum/action/cooldown/alien/fortify/proc/set_fortify(on) + if(xeno_owner.fortify == on) + return + if(xeno_owner.body_position == LYING_DOWN) + xeno_owner.get_up(TRUE) + + if(on) + ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) + to_chat(xeno_owner, span_alertalien("We tuck ourselves into a defensive stance.")) + xeno_owner.set_armor(xeno_owner.get_armor().add_other_armor(fortify_armor_type)) + else + REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) + to_chat(xeno_owner, span_alertalien("We resume our normal stance.")) + xeno_owner.set_armor(xeno_owner.get_armor().subtract_other_armor(fortify_armor_type)) + + xeno_owner.anchored = on + xeno_owner.fortify = on + xeno_owner.resist_heavy_hits = on + playsound(xeno_owner, 'sound/effects/stonedoor_openclose.ogg', 30, TRUE) + xeno_owner.update_icons() + #undef RAVAGER_OUTLINE_EFFECT #undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 3f73f300116..22051afa6d2 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -10,6 +10,8 @@ maptext_width = 64 pressure_resistance = 200 + armor_type = /datum/armor/tgmc_alien + bodyparts = list( /obj/item/bodypart/chest/alien/tgmc, /obj/item/bodypart/head/alien/tgmc, @@ -54,15 +56,21 @@ var/melee_vehicle_damage var/resist_heavy_hits = FALSE + // Включен ли в данный момент фортифай + var/fortify = FALSE + /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() real_name = "alien [caste]" pixel_x = -16 + set_armor(armor_type) + if(next_evolution) GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) ADD_TRAIT(src, TRAIT_XENO_HEAL_AURA, TRAIT_XENO_INNATE) + AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) RegisterSignal(src, COMSIG_LIVING_UPDATED_RESTING, PROC_REF(on_rest)) /mob/living/carbon/alien/adult/tgmc/Destroy() @@ -90,8 +98,28 @@ /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха return FALSE + if(fortify) + return FALSE return ..() +/mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) + return get_armor_rating(type) + +/datum/armor/tgmc_alien + acid = 0 + bio = 0 + bomb = 0 + bullet = 0 + consume = 0 + energy = 0 + laser = 0 + fire = 0 + melee = 0 + wound = 0 + +/datum/movespeed_modifier/resin_speedup + multiplicative_slowdown = -0.5 + /datum/movespeed_modifier/alien_quick multiplicative_slowdown = -0.5 @@ -194,9 +222,17 @@ SIGNAL_HANDLER if(resting) - add_movespeed_modifier(/datum/movespeed_modifier/alien_rest) + // add_movespeed_modifier(/datum/movespeed_modifier/alien_rest) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) else - remove_movespeed_modifier(/datum/movespeed_modifier/alien_rest) + // remove_movespeed_modifier(/datum/movespeed_modifier/alien_rest) + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + +/mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) + if(fortify) + balloon_alert(src, "Cannot while fortified") + return FALSE + return ..() /datum/movespeed_modifier/alien_rest multiplicative_slowdown = 5 diff --git a/tff_modular/modules/tgmc_xenos/code/resin_walker.dm b/tff_modular/modules/tgmc_xenos/code/resin_walker.dm new file mode 100644 index 00000000000..ac1f7509437 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/resin_walker.dm @@ -0,0 +1,30 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Полная копирка с /datum/element/web_walker +/datum/element/resin_walker + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// Move speed modifier to apply when not stood on webs + var/datum/movespeed_modifier/on_resin_modifier + +/datum/element/resin_walker/Attach(datum/target, datum/movespeed_modifier/on_resin_modifier) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + src.on_resin_modifier = on_resin_modifier + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + +/datum/element/resin_walker/Detach(datum/source) + . = ..() + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/// When we move, check if we're still on a web +/datum/element/resin_walker/proc/on_moved(mob/living/source) + SIGNAL_HANDLER + + var/obj/structure/alien/weeds/resin = locate() in get_turf(source) + if(resin) + source.add_movespeed_modifier(on_resin_modifier) + else + source.remove_movespeed_modifier(on_resin_modifier) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 3eacda6df62..dfbace19156 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 + move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel @@ -20,8 +21,6 @@ melee_vehicle_damage = 40 resist_heavy_hits = TRUE - move_resist = MOVE_FORCE_STRONG - /mob/living/carbon/alien/adult/tgmc/crusher/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 6a2679439e2..3589bc3706d 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -10,22 +10,33 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 - next_evolution = /mob/living/carbon/alien/adult/tgmc/warrior + next_evolution = /mob/living/carbon/alien/adult/tgmc/crusher additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small, ) melee_vehicle_damage = 30 - armor_type = /datum/armor/mod_theme_administrative /mob/living/carbon/alien/adult/tgmc/defender/Initialize(mapload) . = ..() var/static/list/innate_actions = list( /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep, + /datum/action/cooldown/alien/fortify, ) grant_actions_by_list(innate_actions) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) + +/mob/living/carbon/alien/adult/tgmc/defender/update_icons() + . = ..() + if(fortify) + icon_state = "alien[caste]_fortify" + +/mob/living/carbon/alien/adult/tgmc/defender/set_stat() + . = ..() + if(. == CONSCIOUS && fortify) + var/datum/action/cooldown/alien/fortify/fortify_action = locate() in actions + fortify_action.set_fortify(FALSE) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 7fb2789e679..8060bdd5b25 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 + move_resist = MOVE_FORCE_STRONG next_evolution = /mob/living/carbon/alien/adult/tgmc/queen additional_organ_types_by_slot = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index ee66eb0fbc2..df2fe19d0c1 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 + move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large/queen, @@ -58,7 +59,7 @@ name = "Deafening Screech" desc = "Let out a screech so deafeningly loud that anything with the ability to hear around you will likely be incapacitated for a short time." button_icon_state = "screech" - cooldown_time = 5 MINUTES + cooldown_time = 3 MINUTES /datum/action/cooldown/alien/tgmc/queen_screech/Activate() . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 98c2d7b23e8..64d2565f265 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 + move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel diff --git a/tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi b/tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi index 7c72e7757898398c1e83bd7b7a25d871713256d8..3c7145742f5877fcc49047b851d5b1dd97a87178 100644 GIT binary patch literal 144685 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%0DkTqk190I&by%Uh#X^(DPAD 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

y8Uoj%oTwKF

nFuHaB%t z97Q(;y$M^ZUUnKU%SB&mqIp(akWwYZbB>w%=$|c8|1>iUQ9ohWK0yX|K=J02j21C~ zT~{vpUXgc%fN=xg9Nd<8zI{37-))Rwp5Of^V|Nc~JDi#8=V{wqFAUPWH9O{LS$pv>Pj4eEzW=^OCH+)k2HTs{>T214<{HN=SfMJ z@YdJ#$9XKd^=a7AK8|C7dVT!M$u|+=6Hx-|&-iYKy;P|XI*A*8r87Dr{GI{qSt8$;a5fTO(tdg zom5{0B4&}VrqHeuXaI0%wu9qn{yL(!UZ0$zYRp5oUD|4R=%8S(^malg)X~hS4O{n! z5O5*Q^I4u3OaKO_1~NrZRoB_E?dk{OtE>baqk5LQ72mQ9U?fX>geW=7VH}yip-w}p z&dDDQZt!(!Etk3b95E5F@EetAi-uhKl?PGMN4+kil2S=bY(bb7&}_1YdKkWp-Sy-3 zA;m1-KV{kflb1~GoqrO_M_vpV19&vN82+Pk#Ps4DSf`r{bsFCR7CXQGDJs9sjd9Z% z3+x`)mpIyrHbP2P|B)~M?8e<3-h{f&tMjvs>Uc{Sh=5!-{)r--LqY>Rs6<7XmVknf z{`2{N z|K~<*T&kkll;r+^^o+<7NbvY)dqV9{d+RGXO$WXVEXwM9`{Oo<<}MXMkz+l%*_w7R z_M-GV_S71q!s!2Fu7T@~gn4TAtM!l7|2B(2O)zDiN6!&Dv-D>`dKj6K&aZ!h$x`Sw z1De zuV7@!=t!9sH(|#^x~;J0ZNj<|h)mA)^4O8h58#PT#=F@3$ zsO`Rn@B&ErG@D9F4bO>kS;aZxz{A34EfD0rmhp!rRt{pN5_DJjhW=0 zhQFdOj)jihkKVl|-iS)aT?J7|4Z1tR$~jSm*&QeUNI}o7n4u{QtFmeD@X%)&wlGl2 z>w7=_4>kg|+Vm(vLGWS_96_wimX=t+F8Ly{fD}N$x8~e=huWQMhiIaADx^RI$7-C| z;WvX!A=(<~qH%NVFJh1KeR6*nhx92Rh-E%Y*PDG(e(kqyYMlGm=c{YHv7hU9=0>vn zGKxF*s(Nf-KvP5r05a-v?bPM%CfWK&NR8EbxJBV z43g8Umft?OniR@6ZCNu|vF^J^XZ~$*RP_gmN^KxDrDiTaWGi3)ZvENlfcuZSp^Dga z`PO&C$RPOc+KF^O@0c$S@*<)Xeu)RM@i_IK=TTq}2IQrmf4Tc75^a@|tR1=?I}*$K zMGjk-(ts-Z2kkLIRQi9Gk`s6R{GE2%hEe)W!H0P57*5XKfbV2k2bvlBqM0%3VBRb5 zZ>)eku*mZgNPMxY%#Cz!Rv+3zADjKLWPFQcxU8|qa7!%c@TyU9Zg*^@QOE|Oy-I!? zC=R_D4&5xxgJ(wkT-AcZn2WK_s&XWA5^{{v*DSwKDY*PoZRouK82_yKa!Yc+g}_%Z z#wz$R@=wDHg@5k*Q=ACH=FsELujn}MF*PArbbM3c*QmP{79b>bKYYa2_Cl<@m>m z{_Bvl7yH@mFAuYla3lvDtRBC%3TF(tXZdfXG`s01v@Dxwbo|3W9j*ZU!41I2sGQs zbV>h{(Y{q`E;YF0xAFMhCq}?h?Hq6_*vgZ*POu43AP*%}c%dK$Zz#pT_!1 zpLH0nzF?Psbwbf*YhuLdRC)jEG|bY?;XetIeFyON>qb;GixMRs4jy+&-NGo(1DXd> zoW`9A=GeWY;TYYMRqR~Nk~yrLuR{|kD9Oc$9i~mdvP#j$FMh#nkU)p`` z-Akbm&MyF0Zesew6#IB$KJ9=_iE{(Es4K%|SI0ajk|3ctiRnL6^?lI5i{$y0IPYB| za0w^7g?*-@?pG+Jc#(6YfW2r!?9mQ(bxcJ{>Qj*H39UVyDE~MwYldwl&oXT_@0dyU zzaM8>Nzm?6F!NS8x)o}NBwP_eGe%?uiLW{Z@Dw7kG`;k)Q|(GQ+lw4%&Zb{~I}FDD zN&(ys1wW7E&d(Zio5gU;_W`#er2LnZSQO3t9_-Iuswhz5(!tclTJ%SY9=6)7y6?Z(@<1v5N*UZ_3+%m16f zGxId>TobZ-z>x^-DtrTzzN5OJIFPNjV%ebB;zk-)K%KL$+tV4!P3Fma{grh)QDNS$ zP;Y}4$Vz(fgRyQop!n;zi`!l*XeZ}lh?#xOr_Qld#5Q>HKGIh9(+E4b#j8*t^h0`_zapVDwxyK)pXb3TDG<=;o^+l@WIgk63Lim)CN$vABQ6 z%ChKm>dfz{=-RH@F~+Ec)F2y5Fh!TOz=O_<4er1_wT6 z@*s;KE__ylaUVbbkMqI{WIs~QXpamYnb7AeH|&Yfbju$tVPvsXFL68rL<3K4UWQQQ z=J&wKbR9srFo`Y+BIgwYv9Gvk#Xb-3cNTTU#lVZ)G1+s;h`y%q0Ofa7(#Ysuo>?qi z3Y6|L-;inBEKS35d_hH0`EJm1@mI$D=cKuWhmRLTc*y$JBaVFtN(o-lPhND@6&XxE)X8g+rP8|_&8jbgm~ z1ox8bhfIrkNQDeOeEFv`>3#Lw^d%@>c5=qdS&zW*&RB5UI zd}2ErOD`^{QCJv(`s>DyGDr#tCt!JQr-XV!%kk2fE#a(6|I|W^~ z2j0``X*Fc&ucatIn7=Yqu`X)48^J@o^?lDff%Z{{cV$l1hYm50h*WZIaxUF@$$5}0 zA}{Nf_9{tWD;(Ec|5CnT7MhXK$N9-cK94Ju$8xtmy-gXAJj^C2$9AB-Zf5fZNp!!Q ziG&8B1x_BJVN&1`eM7@ThooO%L7s?Jt~h=kPp zxKcB%?lU4U(}L|kxyr{Ya;i(XyAxqi?CYtYn~%l#9c=8y+d=0ze;R?4ou5+ z+ur&<2~!KW+hF~NC^$_+VZs<;#>xe{KSk23{DUjahH3l5J6Ni6kCbA!zEt07T5&*F zvl3otvj{Pajelm9Tp|G$@ARedH!}{7BI-QSC$SQv4r{w?x}wf|lsIG~koFRg$OjTy zOCj`wp&;abw0&tEXNV=Y&m|rFvsZrw63?1&v71_L_%=PkvL#FAU=G+M7dRwj%Uu+R9ecANRdKHU=q6M7py*+0P4EKyd;O>| zs3^}08#z0MLB0m-JMh$!uk0GnfBH)xiS+7Px73(~`8F?I$y2EM;wyoUY6>3CxIO#y0Ot;Q`<=&N>IHd> z{d)4NCl|r?4~ksFQ6GeaBdK?LLCW7PagEjXFb4wfa8{|93WZVhet3bkJw4C0)D$c7 z#Pa7UZ}SHIN*wn8In+w)WkA|{^#LeHcbM;9otX$1`NU!U zlZL!{+3pgm8YQRVgu`H6lMBtf4VIwsi;_KIe5N;dPba`d*T+)m7k9^e1G}2HaymVp zkrc-CJ1$5?;_+9YbhydiqRH}>r^cV`o05`7EInU&``gF(A_1YdisQLM%la&7YWY2s zdRY=|R)};^#^Mh`(a@sP@$Ss1&dC;-ZKW`7>J@gg3G|=al)3&r-7%vz;rBQ$nTLjO zG2(>&uyqW<)b*g_WeT`T8?!(neWmy>sjhElKKKDkouE@(XmtT3V)UmPuS6aLBx3TD>AK0pRGcHWT* z>jtb~tUOMfAh+(rmS9#iEB3^}uZq%HbQGzSy18O+*T`ue9;hyJ*PTlQ z0}}^NS904vAubGnaNt|g-Z(!+y4UnW1&uh5f$<|f7Gww~`NtsxKMhYuKZ#A>KKihY zk%y9Hiu^&{(P=zJ@^8AnQ0}0Vg9n)2|Ah!g{;3scaJ5x9o?3i7ELO6uT%7I|?DgW1 zX-{yM%77jDZp15go#f1UcQM4XH^ALDuJHvh^yJ+{LwbF|kTJN^qs%K|<0gMEp(GF< z>JWudcfIeZzC_Z!ld9k+fbcjYEu^dVqJR|Entjl;w&&zR;OrW`C91s%?_uh|Sc!oQJkI3&dyhw$rJRO5 zhw)Km?|Sw(Y!$ot1c6axxca3A6i0&jP2e_CHeB>FTp7a*GW>=61qY*&RwlVs%P(k& zfYR_sX5MNhji{M4dDQe3jyQA36DNZf_8lp#Uz{8Mn|F3;EZ3-M;i*AYJ=TrwRTin0wQD#m&pD^y-q=uCtrD z-51J$*ooJn!RnNT20{iHzKVEX>SXOgQ(oX6TYig}4j}AlTAA`IS6pZecM6V40^lFS z@b)DAv>>81i-lgYq1!^kLghl``l$cDg#O|Lbb@Lq*cf`Q2#|Hh(!7)L?4-)IpvJNg zV4lU&Y*;dfOSpt{<=yv`7&+$3E$RVJQ#7mJHjgwHvp}U|+{nk9o;yna0x7u z?hb7ej<7>T-a%bZ7cNS@#It^c5m3<0-^x+aqTDbbTzrdS6`IyE_+uLT%Ak9y@s6NKm``i(~f7 z@i1RVex9#16u?6m>42CI;`>T#FUj!GP!slzgZ7fyeXbRp_sKJUKKgvqg?xu}-+3G}cA={u^1k2#+J0G!^?2|BA?7KxWtkG+iX?E;uqE zSBPIpu{P8tMPtW}RSr^f>Q=gA6|p z9dV)dk-_d)`qM!zv3;G1BMP>|$8S-(e)nu~Gqc~2^B+H_mC?%nylLapvvNHTRL?yY zAM1#<0H1G>g^?2azW8EYmp?upHSqpKo0S*fC`!*hq^@(sNZCsLAD#eFu?{m_!fUwq zt0CM#XHB9#;MD2$MRWl7r$<>`LT_S)&A9*l@R8!Rd1ZRU^)5wUI2sK(!}|qye|d-h zaqx>TGIAwkfh4tjZ$!)SVj+?BA6$$HRR?pxq_Vhz6>EE|t~Ad+rGx2N~e)_!IRI~xT^F*tdHvIm_J<)!v%$yXNF>FSu$&t*XwPE`JAJH2D$IB6us-!lF zG*7-O%@3<40#~1oxfw$~7oFqXCMN!Sp%%KoQ0Bfo=NT`~Vq9#yV`50#^u#*fO6Y*& z@=t@o{NLii3jZUiqp@zYQ%0pE+H!|q9i&U$Eq$WG?^eiswl_djEi4>*Mb zg?}VoI7IU+h9OR(9w=5h(%b(xYwO{bnH^Ig0QoJ~}33-`$zqttwYHscV|4Z;_cT zn@hpr7UhNGAb`OQ6A<=v%Eu0s?JmGu6LsQTAM~@vm45YkinwZT$;5hb&~9Vpi+d%s z-&#=rHPgU`cC^$$B&9UhHQhV()6PVrCk1>LtARSg+EHa2-3=QnxpNN{6;fG=4AR`9 z(|)i;Yw1VP_O8B2lS!?6Klw=GTzewhNR7y9Bk>UL_%Q>FvW(B(spYJoQg3F08Z}{Q zWs`3fnFM}baL_)6a;ta@|Nbn79=}5}9RND2?vaWcj;>CW;dn74q)($rqjtPvz9>&l z9WTjBXRBkV1&pn#d`zRbm-o~lf9d-n$V!^{9&wQ@k72wt!s^h1=Lp+L{xILQq-sga z;MeQSe@2!K|Vl|kgOw$C}m0F zCUT_+e2)9%fa21y!<>~yszmW_yOPSpb`nJn@n(#`M&v{BI={(ACXAM&1_6)n+tc+Z0Uig7a07C!sQBI$A%+(9g6wVQpY4?T;q&Ih46`4K6H)cic@Ce?O*LwG`Daq+ zm%$(r-H@Uggr)F!H%pI-T76qh^i!fakk@9;r zphOyn{0@{vtj$EDetn_rMdhN9$6g};mVJ~b9`zj&kaM#;HDJs}=81Ss*!VKKysqrV2dvOq~Y*GK&#< zpLnI)TMA~eeEv=vp--+)2C$h@jCi7~_rT-vzrzgR5KDCYbop7+N>|ePh}t<%qG7on ziD2f%utwfvGPWiZRMSAcUK%bmAT10+u=nxO&X69wjZ^kX12b1>#8P&EDCynle(JPg z$OM68y4}qff{W_N@XR`%wXdjo`r3Q?<+Lwi$n&6$ z>)Dc5I*X|LCgfLMz#Q=iAN#=&f)}zIv_a*d;P3bB#-kEb%&r(aC`7$QqI?I|@1A6D zV2Xr$g}>4es_Lrc5=Y_)p?C&Uoh>hM0YF4Y*CS-acATL0P9msh7W)b+isqIFdcw;)BJgURPCy_X^~M|7=KE z`}_6sj|W3X;^u!$T?(y86s*dLGb!h1TAD;MI=*($DTjfXJ+A5?8niLF)8PK>A8QTZ z+MW@Li%n@4=IC-tBgI6iikAWzaumYWY3s{tHDd9RATW@;s+*oH-MrR8EIF8Mks#ux zq1U98lVL>~LPhXmNoiNB|A=j!mu);s&}%s$gk?r_?h$RoqvY=RvIXl?4T7ix!}htS z^J7noD~j^pX^ibk{wY82z(vgr3Z7K{`^M96rm;|no8gsTKOM}Gu8cgs$M3EAO^K$x zl=W{`soHAV58Uzoe_fl&l$o$!*a!d<{Fo21nzkEyxM@N=#_wUF`tG#o;h(GJA2WM{ z@U`s)49tAr_aa`!$GYR^0Bd>te4m*@hjZ`WHdUoowg#@A{(L=QYo_3~@i zL_IF)X&%>@AD_u?AfzyRd~oHi$@f! zR?2cdd#uxo7xRSr%pRA?zJ02aiWNv5y|SEV3#)jQPMvwR<3BQ~({fY0?k+*=2n77n zZ%d}n;yf6;Sz0npA8HGI_7ra}G2Bi;a6qgvrt&I2p+jq5(tMxTclW@yeaPtaTOYq> zfglJj3coL{Ola)xH>Q{WPJC(e#^A@|_0Pt8PJ)T)Q*Qmgw`aD!)tx_+>-O#GkyG_$ z7c38ODjr9e?Y4}mn~P6BPj6le5UhOZK2*YpPS;buG!YM~y|*N$_h-A7bo9CT8BG^& zhPt!T57&2%kBUE@y*P}MUI_bb z{l?iW5O(=nEB~oY?UgxC-?skp$B%2D z5+o_VDzF4JMfV^4J03kxMRuR$n{s;C)Ll3_{%=7@f33P23)MnM$=Fy2d-J<|7N3WF z^D25kU@AMZUfmUS($%&RHC17BuZXtTj*u0<=s|erE3QJuJ?aDl!PR_~sM{rbb<7w) zJka=*eL+pe&t+pCSGZJj5Nwnf;;taX*fIA?;-dIp-zn;|f_%aHX=*Q2r^F@IGWq6z znl`;D+YLD`zBA|YH=y1O=?l{13c$^*k0cD=b>&a)$!!1JW^qY0!c!HJ_5XMefxl&> zek)nRF>BBBOPfWQPW`JSUgN6@Y8?f$e4cDtlNQW5~2+;E$s0zf#*7KJRw$ zt)1ibIJgN9p%{Ihe#O#g`}sg;TENZ0xJk2i9rargbVWSr+9I9Yr4 z9-=e=kp(Gi`BEY4Z2!S$d*%aKe(_{?V3(i3{MDfpL<#&txRG>^F??5l2G7eh(lYtf~kVMwVQZE01Ts@lK{(3zZQ6BYl{z@)*-NDE5 zKjV7l2oVAFKKH-X?rl?z=-*^avNl#-ILwF)i|eG#8b`XJqd=nvNLa?6$KUAf5W0#W zihQY$N8e;e2^{`wX50rQEk*u+BhvqGA6eYo_bTVdH@ov>#AbG$%2@aX{D^P%^$WO~ z%)R2XWu8k)tNW>pQxTd*8Hjd`?BCrB>Bo)a|#2=Esygy0S|r9 za_chNdD^g%k}RHMSYbA3{S1SPBK&Tg#ie4Eo3TPO4hVES(Dr|A!z93f7(n=Lm6QAj z<54Z({8!Kx+iJ|M>5a+^y(s4Le5}IuG+{7XoWpwG`za=5k-|Jv2EKtUGx&5l)*~yD z;b8GMQs}>T3OTU<6$j<~!kwiHX8m>Zc#dOi907T*3*V(%OpH2lpwH+nLo~mKi;Qee zOSuf}!J=D&HVu`xHsLs#kl3v|J06PTE{t>MABslbh@-LBH@)0>n(&KWt;2vu`R2=s zir1##0n_p@KIIpr@r{dO70e$!>W3ek-uNtEcZmhxkj^eYh6!MVa9urcj$1j6r|&t> z&jq*OTyj+;c)5T^<=OL{s3~l~ZUc8fG7!|^fJ5YL`z6RMY0y~49c+pcKR)iS4Ruln z`N-@o4GQsODlQ>DyfMQ4BcgK(4BC|UpGihy>@ z0J{+dXkaU?pjmRM@14Im@JGWpQKfaLA^>@r{plu94f`A(vcCp6X<<1I=~x@w8Tum4 zeyipA{eZH_8yj+1h@nw?H5-ySC^7X0`DaU+ zfYbA3)n81TjP;xO`#xU#TXzVHhlX67xQt(3J*p$MZDe{5}0);Dp zsF#gTot?@@c?p+pfiFjb;&VBk$fWZFoS3fk5i6bzDz4pPt*x(Wp*TQ#NKCYw5(+lPHul4q;K2FCyOMMDB* zDDJ_7|LsaYje&&dmi_2PH~PQicPiP*Z~pJ?9mfj@&20XP!<|a}UMf~Cey_Z^!NDzt z&LMwSsyw?7@7bSqbL&3;{dc~zN^eZ|%MSKdW@o0QCcMo6s&+i2x$i`spvnNdZ?cDb zX|>WA6*ad*970%jXLF-~wJl3={D*-C@qV*vf_owr`2-5t3LU$l7*vdYejL8qP6hGAj0|v+CNMthRHI830_x#wa8X!LM?>zviXAZC)Pa%imGbNaA-jz3s3?$WNj=B82y4%{S8L@d>>DOxLZPf$LVn7kIHam7e#7&d?!< zFLr?ndO&as<5rXEGJZdS&>*`zjdGm9t!*Tb9HpekmD-a4_MQ(Emf&b< zCY6;|i4`LMp}_P+k6)2LZcdvW>H23B_HhbA@gL#&`EFxg1YSTnE0&kpzgDfz01am* zA=1YlNF1pbCYuJ9CXic#na zDUTjK_i3MiJhA`t@y~{VL?`XXEPauC*m#94OCKv9^kw2%mq@_gyWo@0lO+`|&cvI} z;9?%iUz^%3q5i4k$qi-%;Wz7*nK`l$HuQEF@S`s2j2-Y^HqjvWVnx>D50>B*j>YB~ z@tTayBMCSR`{N<}d3Yr{rhECJO0oO*JqmN-T8ugA3R%0C`_>=sTKNxe@jLUopR|+U zbkTdNQ*TqG;Sa2FmluqE&9*=@5&ZXXI4{RBRU~PQPZm3W9xm8D4sm zoUvDD&LC5WGg`Iz5@>_c&b<1rLbci22ynj2hx=2$+kWd$kBB#ahbSiMUbnIkCZ^ox z(EQD_Z#n|Y@pz)3jf%M{qz*eQo)0^}zWp8^hMHmNUQG@7JGtX_#V~l3*?qa_PFvF-P-I3W957!Hze-r9K(=L1BhDIc-t#7A!=9WAxC%0PZII0GSk`r9_Ozn8 z4gur65??r^xwB&vWbE_mnz=K?F}NeCH|xC%gRuw} zVj(j;Qb44nDu4#f=m(j~<&{@87#+0CztO1Q7{`YAdK=u@T}EfmL}jFL3C$!%GAKTq z^+eg)sV0s5D4=Ch1eWKpfQyEk$U9TZ`h35`8QkgKEA-DHzYqLS0jzGla3~5ME_=ZtgmNVz{S6sSwJHu}~hp%K|XxB3wmTvYioH8}t$emSqz)Oecn5wZ- zCp~g#Uo{?i-l)6L25kIdOzblrwmPx!x}`?$|on z<5r`0K9~jUlo(4_nK>rfP3o|7)qXb1VHBq@97ftPa4oxHp@AgS42n5AyD>~!#31~L z^RTdRSfq{!3i+B@__)mCZ{~0NfBy6}s%CyOW7}h7B;^{Vjh`hG%OHVWD9n}2kg8UV zJcAJ0V{<0Dz+|m?VH3+6Q{rs^W@_H=T!*LsuA$tJ#-0-GyyD^%-}yNceyY2vRQMBj zoPA_h)(o}%jGfnyvR~WH{D_@4-#*{5!CGy~@P1PSuJP+^32CcM^B@LJm;sTA8&pRg zE#En0Fdgr@-|Xv-TiX z(Z${d}YMmcUkQcCXpc{|Fn8G6jWcmD0TMfPgam=JM|;90n&;eU2_yq*DER|0JJ zI;hInrMrumd?TAzgD8OMoC6>Kek!-d_2tpMxu?IMo7Ekw1u0zT4@C~5Kb_;VT6TLRpBVM#nUEgFHPR5tETs7Z7r zil^%5aAreoC8gKM!4fR&3@5IIX)USzBM1ur2@T#K9}}2A>W+S6{EvszQJ=QpQp#~l z)0_zCCy@EhV%+ksw=fh&Xt0C7B^{m7bd=**GsP+Z)w299sO{U za!zF@Wn=TDN@IolJ`vI~V}p6V|NNoouv$Iy@nlK^pA(D5bowNJzdb?!OWI-OY37a> zp?=2+CtWYD&pU0*`{CE!i)7_6TVGe|MYDDp8+|1pa!Y+)-op1XeniiXAQ)_&aYN$r zedIFmxxY&J zd7B^HX{W&ckVLNmE}65~`fldH?+o*Hj?&+j$wOk{B#G*8FFV=VZ(Fe>+BokO>$jR` z(nSZ@g?4!Gc?aYvKm3RAz1&aD!y%E>?*5K*RgwYDidNXM+OTk8C_WHY)#_X?p{6p^gjW0SW+>DQzXTJ{oxBF4$xp$ELLido1 z@8G8ra30oe0y{G|H1BjVf|!<8o#$^aqpT-gPe?KynwgmG{Q`upd-c~Oft8y*XOLWCK+E^{T4CP>BN4o%CZwePoFWB*7ox=QsO&S}-F zYU8sdA)uk5q@<`&DC$FgVPU?m%ZHrjdnyj!4yXL%ew)>F|0elF;?OklN=HtkQl0`N z_JNLo9SRbl!N(7a1eV9*WWueS?SR{w^zc6x>uxuN?t*j`NU|!t*hNLXDxBul;u+^h17f$@kk$_QxgG z-W&h?hY8URTyCM>J7+#0B$}ba9(5E-+|W~ueIK|$i=%6!DhILOdHGK63uBy@Wh zo!^(XOwKl(x@S1=3;gVf_q*3Od-nh}!Z9(N@)(z~DM zo*3orOyy#ZKlTPi5Y~af`|g%Z;Rr&vf@i|#U39XAYWN+~#);gEC>zKAlfw69_y@>! zB(+Aj{Uj}C9K?~ODZ}X3|MZ!-Ta^G#@lFO;$neQ2!^`s8pX3r_$sDI2R>}C%;V5jGGhw_~pf!nmqus438vgQ^KhoON0JB$*s zovbBiA!_Ao6`69DpXZD%Ga_ib;4UbhPMtfSOn6~{Q7zWqHjoywIIvDCRrn0V4=h#8 zcXK>+^8DOw=I-m(b26{lD|#hCj06cd2koz=j?<+^>W8aHVG<3jrgvJ@7u`QA+>w0m zds^P|gv{V7jX-f7ZWhvdk+dIXRN%mjM>uz0r7`oJ_~zjAyV2_*?E6z&CLN+0+|2-@ z!GoL3fE#5>zwPW?gT~#dJj%f!hFu>12-&lD@&RBP@(TXZbim*B0;Nly`>4#QPQ)R_9s|16Z#bV!& z^0&{{XEg7iTZ{V*FQ0!1btMg8$a3S3aA<_fE5!+yRro2df2D5Zowc!T-VAz|#&t&2`@z)?--#x~297(5HZYAb(5Q$&fe(tI>?O-4&djrO`6N{tb-s6X(@ zsW#=(;s9wDR+2OZK?skPh(FBD@u!B_2!|u(wWQg`#nU;+RTpCWZC2J;VdOM%6AJ8@ z_P0Y0{ba?7w4$$v=XdIu%mLjCZF`a_yaG2UZf(mpYeyw#7KhQ zN~x`S@&?AK@dOoF_0(LNTo1U&UC0%5l?r*nRj(JMqM%{5hV@URm8EM_Dn}ok%9%{S zqk2CyZ6OEf3;(jCsgRvGGhY#3_=@tt8Qk0Ra==8JMPg@Bylc=n_~LE&7Bs>+W|MV9 zPyP&jK5Ow@%J!@-n*bS)BFf$f{iM1L5?-I{c;94{=bC zEORV>H{0K^W?`9iL9;Bhe7mC1z7;s0QgzMo(-1nlQBElQPxLi;=)T-8FfuVU^tf+= zw#-iGwE?~DcOv%0xxev7g9;mgW7J}D-8177x3#k13B&6=k8PDmg8#dZPSJ@b=_Bjq*xctIRDP*4X8%HSazPP;{X!vlj zpIyy&Vxzrv!`!smp^u>UV<~V6juwm1`g@ujO^Uywy|8n>E_-NbFTi0yY$uR|=Ie98 zBi~7GeG?F>N*K#ZL0V;(WYeZHkm@V>4-bWOrqJ@f&)dMAweOLy zU4}B%2$>An2z^xpMq&itM)jA!XnRrz<-M;QnkB0WT{UZy>A=r`t$J?XOddm!igD6) zB$9B{*<|({I0V~K-7;#V)kPUy<_-;YR{{{fnOk~o6$~VkMKPiz^btB61enS5P8ec% z!R2=cxQnM#bxkU&o2Rbr5|T5fdfHPZ9m{$5=qyk3f)S`J1W-#U!!0okqT~RoPRx5T zl-SH{&KU3Q>xg#0ai7(rh0Ek_!sX+sqL%F8;8m?fBXBEtq$X_VXuBpO^(1dNm2aQY z{&&dgQT{7UDa^VN3bGX+F$Bl`3IK6!HAsgZ_3q)#ol|?nA2t8r^NZrC>o(pi z!#pi3$CEejS!HXB+`-cVqRfOpO1sWV#m$?*E23;47}ab~C2P%m(n+Bcq(-aG1;3dI z`%4K%qoBe9G%`TVskPc{XMTak>+6CI4Q{BZ_M!qlF{YgY(d8jhlZ(?(eIb91_A+p7 z;}7?Me9F^aRM|I{gk^T`1DlZ#fNVVlGzu0#9$>;0celK2Qk~LW7bkwLJF9bm1Sh(; zsXeJdb&4ciA8ki~E&lf&0a@d>uxF zu&&hPc@}-$nbn$vP27?jnrblU5wI^V2^Xp@Ixi4!!&NK5SmEC`=g1XY;(v#Rs)m(# zm-e`+OsxF=lVVkwfd!VlLjTQ$-*ks4mo?&8`WO|%kn$KI_fo4 zw@TYgCPLbE>2eE!^oXe>Zq@3W<=zozERFu|Z14|dY`kn7Bs>`E+rz>^t+p6=cxC%X z{N~?Hv}>3lX^jWfb^oNGMte*rb(lo>M%$hmtJrrEs`&GQefl|94r_pN5hYwPQKUJz zi|~M;LwAWp`N-f?dV(ofGi#DqS%{SY-20K!S>_+tuWvagR-^+Tj^X}+s@JWk#3hnk zcxZRz?~Y}qa6mX7KHfIWP=cbLh7LGPCoi968cA}R9H1RqOT;CxDuLdck@f6T-mb=d z&0@S()94h;aUOyEhlrV%NILk`qf@msM~OQ@lM+2eQ72R4S62TxFJCt49FVr*LIi$e zGtHtKC7Jf5T`*RBlw*W*{3g|3srneS`*}R9DIYiPm9Pnc9`Ac50p&OQ!R~AXjDjRl z!9CRq9!-lsg`ScLcdx6z1t;7mBwQWNR4?_XQg#)#?Y@f94m(i65@CuH0~3=O5+0-5 zGezXg2*Gc_5#SndDwRv}!Oov(H;!Y{r$6@XsMsQrJP^`_n|Te6ub(*`K+RizOqr#@ zk^6)%IAC}AhCJl+I2yoEARd@QnkaMK4AfLohE><@%em>6z6X+fdjdJ&94*88##0tz z-;r9B4HpFf3WUgG*qB~@a)6Rhr?g;0D8>SZ<&8vyrs=oBMowEh62<1?BHGDBf7We< zS`_Y+o{I3XBUTK$oAXC(qh6{`;jLZ|=d6+!q0-z7?b^PAqNpjoe~EZpavdmGTsvfe zqWdVq9ROhnk5vGkv_j^T!2Q95t8x&(r)jxJIX@^zd5Gf1mTA87X?2jI8y{=-qXXj| z#|IT>9H&pZ^|4&Ooy)J7^zM%FMC#|fEl%Q7AFv(H-k5)J^dlJ`lwlYaaF-6{LaOWfG^oKIh&kaP|TR(vpNH+ZsUw0oou z;_IOj(mc2h#mkKOV6i`n&77B0wt8^HOUDXSu(C2X?Bb3F3+0ls=1@z!0t*0I)XfUe z&F&c&GPqy(Q?6>wkjblp%2+cvu!1oP@Z`L?IRx|Y(rF`O^ty-7@@t&vz=$~rDXFh)PlWucl^Xh!17RUJe_LtcVVF^y>^EsM^Q1(U zpx7(xSunod$vbF{#{5t1d*9@o;xH3pUv|a?Yq>^vdGPpH_brrhPBL;kc9=x1G$zNrcIc_;$`CA0_t2Y^clkj*5NGE7*14@iOr zrD`JtNU#sJY?6zEHuQvrX@w|e0SX&w)E&PM{u|Uax84Aqy7y`c@yW(BJ z19~F^q0hwVS3e_qP=2zUfvS`!GhmKgEH@{nal?FQ{-tJ?#}g$vD7hUp?2EY-&2o{0 ze)o`q+xgS=hh~iE{*e$*Q}udsM}---*9nd0<1Puj?Xm4~3!@GUhNs5uuYavVe~RAL zyeO&Ds0sB!vBl5Q&gmi`bsnqO*00H~1(H4WZ(0k4Xrl0X6ci<4M&@ZY5(4f0^MNaR zY8J`3`xvI62?(apj~Kasy!<8G1lYYmdPAJASK-TyOuW;2Vcn_#KPM#18Q64@C;l@;O-+xjdr0>s0r)();gGt2Q>`LZ%^y94? z+!3><59m)u;Tf>2Ry#n?2*WIC5kjX2FA=Tv$A?@Adp6+y4T7d883&)NKZIHUNbw{5 z-z2bQ1&9vJds%KxF2=CFS%bORU$gXeQq8Ts>7h*~NhE8!Fx=2SzGG>Q`4=FXlYP%{ z4#LM49~!o3&Jb4^nOBxs_`Y6;&=T&ev%*dq9)Y{SbOZS2{pn1-VRq_@XsyN^q=uIf zz7cY~u;2rvCHjQ5SynOs1IH(4lOpGOl@9(k>tT;;*UT&h4Qe0`lCK=#b$N-Lcmuu! zDInNEikbX`kzT7O15>&N^IBtq*s_DO;v&%rF3VeIqkL6qOQ(;I0NS z*GqIT_RAQv-?K{t85ILnc4h)f5BEBrMJGDMhWWr=5`{7dpN{YS@CPF`MWkMZzwlRw z{Mj27oa{F#bGgVE`{%V6jUrIqoyIx|llK|GAa{*|M)J@RPd5?oL-C{$(Ms2$;2U-v z21d;k2a>fu?-E})1SJwxak$X%d_m9l#wy{cBp*sJ1VjJ$_$iE22#3=K?9b|%V+K33}&6gdUg->Yy zr5I`M!frx*)fO2!3D%>`D+T4xb3LD|R00*u(t32?TYo%pukSmdQ7YgG)_)ft953$| zKAnk;^4^yT>LdD^$zM##)Y_LYG8GbJioiX26ZCR6Br-|*uB|r4wR);Y%UuH7&?8xkUs<-)&c0q-uYG?mnl`0MOx_I;3ma% za|o3a(#`}@wi84)C<>h@A(JWO_*_2S7{o$g)apzy6%-*o8T7HZ&CDO#|8TOxkAQG6 zt{j9yyP=uM!2ZZjNhD-U@T-;iM~A_Ra)@@+++kM|bM2%XofQX%D!WG72&Dg1zV6Vf zGvz&q`;hPM1G$TF8KfNxG8+`YF2gJGLT}(t9M#(E$uUOKZ z&G>eF;DmkRn_3~ZrIVvORrtY0$TP0gBa}Xp!*U3#BkUxsYWf%OgShI@yc2kTWZ>ME z^@@}a!%UR4alldNiVrdaqK<aphS^>Sv-df$>#*li(-7T>HHDF=3Rth0JpmyQ zy?SCL)8$#DX@X;t_V)>mam!;cl2Sjtjcc8FsoVT!ha|34_Ii2Ls}ICzwXZ6{rb&>j zuoQ!C<--{Qk3Y3*M%MKo(&72pl6F!{YgzS9nF6yY`7p6GC3o)+swW8(Yc_yWv}h<5 zq&0;0!7R-gG=mZ!M4cbJ`Bc@Ww`0zYX2B*rh5fRb1Qb##!xkwUF)G9A#qJ7BQ{I;7 zhG6~EI+k@0zRnxkLf!OM(bK$rM)y$7V(jvIy|3qP?sL)M8;?P^gje|G9vYJ+Gq`ZgW@^#ct=lz7>4J8;pN2Akz^=t)TP4;pUxdeze~exaeJgZG za9b0xB5+cAX_dp}C>rtqZbUd`s#rCe;5scZp4rT9&mWKB3C1lo%nY2YKQB*t2&C9) z#**q2I|)!M-geKxK)x;j@9>GX+e%!}y!NF`w1hHwmm1*^H6fa=AMQ-pmrs%wl(zWb zfPll?#TV%}>zQ*91n3f-XG=+CYDcj~{(`phsPSk{yzH8Z^yX$G*^A$=4QW5<&N#S7 z48h<+NghumVPTG}e4)c_bVmsms)yo7jE$EMgXrbB`)GAa6*4xzUlf%m&fml_ zzLEMg3F4Sp4cL2QBNB_GCAM%k4f6v{L{IFD#(DDMgNme$d+k2pRzI@w;HF9!`b!Xe z%$W@MWm>tO@(m$Tl(glsh%-8&T{%;9Zt#?!Eo?X?GbSn)b08znypC^4#g?EhGN_2# zdfxkO!%}Ml`4=D5<&cHsbL5R;7l$w`(1nf+kRPV?WC@QQ>n>G;ap>YI_XVH zk*pCTpmy%7v_Y)j{$aHCem}Rg{#~yr0VOxX-&qIVw$<8x)_grq9xS-!DCVXNTm*=7r)-iA*pmXn( z-Dlq9rXo0ZZf6rU^3R96b{`WH%P$6%muL9F%=5qJ{q3tanqKewSQA%1F8l;A9N$GA7>6DTb zqy&`i?vfN~rMtUJKtiNrq(O3M7-r^d@8^ErbN+zye&Gwuu=m<)uXU~8^^3ihgtjo$ z*Y-oH!&F4Y3sM$D_%}~iE8XKIP?}0WXcrrX}=(qpxX)Pmte`BHyW-Zs3|w7)5ycV2@!YsA;I!~Q3NjL zzS;F9lStGx_UV4S(0;cza$zB&SgCxqBUuNpaiuh6b^Fg&LA~9N*R1i{@UI^d7s#lP zr~l!jDa=LT>4(N_kOcQvawAKXU|ZHEj&L+mx{gbhKoQIwMl{T5S1VS=I3LeWf8suQY&|X2Z7swuvK~ znF;;EHmc;JTtA(M!Kd8#ru328ME=E_1>a|{(M#ipU<%N=*!gN7TwJV>!URpeTTRE zsQ;Esb!9Z{qKF|p$`1a4;(j8|Ebs@mECo!jdxMy zOju30nSFz22$+4Gnx$h{reXU@2@cwaehheV7}dVEDE^1aqfLLM(@j*YaD9-3 zav)iyb|kMpYE?xl(b4c2CE>ajXcYJ5hoQ6TT%Q~G9zn??C$Ko4r zct`82MxW)ov=}fPBx5C~oqjiecW64oKYS8R2ewoz`=X)W_DVdUYTS+RcKM_}c1tl` zYkun5Al+XNHaV)6ze*}=_2bYRakV-=?NNF2&-B^ufzJUIV`rVd2=q%G#epSI!Kx?O z2vc7v6~Ej7P2R;w17J$KiLz`dHKum0*i|SwWux#rxsEV{+-mqDp&CEB&D=Gyav}EE z%IMxp4@>a?k3!a^%R$iut_)6L9b>!6?@6vo`%0rr+IInePb0Ui5{z5S0L&Ps9=C;@ z>x$Nk3#H(Sonrk+6MuQ>G2u0Aa5Yh>oPL{XkGktgrG!RFEdF-G2Zj(fMK+Dfa~x*z zh=yNv{Noeh!R23TUCwGVVJ6By_MW`GjO+>OH!eWM^_o6L8{utmIr~XC?1ss~J zrzerdOqOtZ`en3^f*FaC-aQ$X4&SYM63f1a zRXje0+cYRO;{VZG_}JMU+kCs0HDKq<9Xxh~X~Q(yyL$bYd?!nxw5EBLc#v*HC>heR z`*IH0qv1+hfdE4jA15lrQz1Evm03EefJ5Sc6r;N1ahkr16zwu)BeM25N;sJDdsSh0 z62uc%tt<=Wna^Gm!z?L1SgMP!n`tLLQcF2XHouxMR-(Gk+x4N1P+8m88wo$zCRtrQ zzN?@I2H1>&Kr59a;yeBk8uLe!4V^va_nlQA0=>l1qFiSzf6KNL8qJ z?EtXf8rv_wk!>2wfz3TNVS%@f4R7Nuha4*0;XJF)r;4u$TVQs-%0@q{CII;8F&e{*Eq|sk(q{UHic(>N`*U0U!0iBh&c>CTL!rS?i zql#R&=>3p-+xQ$fi<(MKYdTAyYdYT@9c_>_~{MUjw3x zNTUV~Qe*N{uAE3Sf2g(Sc4B(4US6l^Jmfi;IN*We`uqL5 zqD#Y1iJd+*k%SQ)>a7UIaC*#*wbafEZ8;RguumSkT>twxJd>17mXQ)QFL>m~YW@D-FwZ^9QMa|0 z5IEOS3F660m!S3jT+JTU+N~Ci+jZi6Gh*l(nZwLITr5XR&ZMR<&Ra&JR?PdwNUhc6 zga1m2)aXto?h_q41|O3H&P|^1ZnnpW={cHQ=?5gxS3Fk|HC5uiD%Aa}s;Nsc*&}`` z?flSt2cgX#9)j!#c>g#lL?nJV-43u63*Jm*9bCA)dCz3wME)#b?FUm54bUmAoWFkmAA91Ft5Ejd*Ff`Q%A%{`ZZ^I0^CFr#0aNwweWP)`oek>t z*<#b@GY;m#SrSBgp`>Xa-Ig{gMomFQT$DQ>Bl)sw+ND-P5J@^UNiIdEVr#-u@E&Q} zdxUk}XLKu$c9AsA(32cyxf8{}NS8i}F<9|urW!ZDJ&xDnYOaV+r@=N&?W6J=nQL{d zmM>zQ2$q79td7=OIH&F&D8H{h<@`JSe{c%NjCG0cZYcYR|Huxs3LC1iDeIleGe*}a z+{CL#bC6xXU065hY{#}4ZZQuvl3uq`4(pVzha)O?P6}4}u}dcI4RH+PMSrq3=C?^+ zYF~tEEw7aCF~-0szax~VpInFZiYAr%ANxYRF8F;?p`SxWuwg<~YdPWg4=c`^wfjRrnv2Z>yt|WcCpSBI zO03$hEA-y;9D2$vWC?zDqlw@H&8f~Dyrkv)_kk-sX(M319pbK&IV)*n{ELGB_g4L1 z{IRlkj-E*4H($>~LG@7_b8Lw|ikjaVHhmuiQ$71q4?h#i!S6u*KbMe=y@hpI?X~JM z^EzATf6Z)1vgqw#CpR2+4di1Q;wO5OfP4C@T4Ra0`!FDt?(0RN?mJVYU&s^CfA51* z?i}UcP-Y*a%G|wz{)XpC9eCnnuUZ*E+bK5Aw|5KcqN3v=4QC~I zSG}jZ_1bicHE+tLOP!G>Zr9n6tXXrJ_5W3{10TtHg@9dHC4~|2JOkz`(??#Y@Fveu zMy<-_;iN?a!D{*3VS(2VE6R@z314g zNIJruJx-qW1MzqWFvZu#@c3x@(J=^jlp)9sB?x`+SFa79M^R@Of%gD75|CpXRIdo) zSUaAz*WXQT(P$PD_ z-8Cp1W^Z62`zQh&oLF4JHCX-kz1M&Ju$CGQ|38C>c7AFUc=GeddBWy10k$j41^LRe z*K#WOKG`^%JgX#)qgk|FwvC}NBc0Y z&a*8%2XmcN-|P@~QQhRCsP(yD@l-&OkP#fcqiN>Fe$W(oweDBEjo3ylx@V^o)1S92 z;U*vVAAy@B*B zz_;OgBKkhw7xvmK1-s~13$)WylAa-o`jU$%BysYZnUE>1#hEu7apu2Nl=3&I6d;fc zU9{RR&ek;?&E2SMjU=v~Wnm;joGw%f*^m7AcTV>> zOufsvlsu{r>|NPoD*N|#9&!RRoC3HMrHbRayLXJ_6A;(3;NW`iKdP=f*8IsmjdxK2 zeln*RF@jCkiBJzm=-|$uC(tJ7(cKqYMYo-~8;%$4rz1EJMzktppH-zr;dz5P8yL~wi+q>V}MBad>o>n@fSJOnM5B7dgcK$BYt&na2@2IW977a76%P1 znZ{;_W@{vK)}c0y*Fdrkj{iJkZ|S{7q=5|fE$DgKzg38M#>dKrIa!xZLVRScdu}58 zBQCGhQHQzm=8$ego){1pnNuoiDUdHmnZmUm#Cky$cLnfiJk}8(d??&^CLY zz7~FP`Auu*_hh?o>6_adQxZRFfA0=E^G{B|KEMzy_r;qNAUJp&c{sQ)O!;;#b(Fyu z2!SpjJvPSV4`kg|%~4#gmw8r(HTIeIq^n*?IgV2?Yr(IeXi_uas8@w7a0Y4r`9t&U zukM5&o~>)EQB%QEV3nsvI#NFW6GFCK2BT1>7>w3^wevHMF1J(v!SA+|ht1`F_shb4DX&^P?}4-> zH?Fg`Hy(V|HtPQMzpUhID2gn8Kc`LF1J6eS>zYgyF{H`#YUS=dd9fCmu_dp`)bh*% z>@2VeDm($BL7+)qqWoi$ZQ%v^4J?UEyPwWf>I@EHX^8kcoyn7v&B4o2MLM-QomWY837oqXOV5Y#_7L9MM*$yMBrDMn}q(6+x} zAuK<@6F0<7J0E|({0Rwj$)SAa-B{b}Gf3cDIqjO~C-)%Xa=wLAbjF0C$HyUO(ui>F zy*v#c7JNuzRq2Eq+GbgX!v?MwA8m?v{~~EuPv?x1L~rAA2k-Yg?B|2}C84`?8{gV4 zy4T;se}fAT|29{?ItzduBaNV!zISn8e7k(OD`1ew_vOU3;%X8-94mnKj_<(lQ~Y7{ z$kQ;KMWk%&XqIe$xAkvD^uR$f=}C1g>*Od2qC0xe^YfaRX|DV!CC2(Q3NeW#hVZnX z_j%Wt>kF0u(U<7w+vGejbg4;IZlR2#WDvvk+y_r8*7c&Y@0|6kH3U7+#D1V{_-?m# zs_8b+?_2AG?*xIe)a`IWuPtww1ey$5MNOyW6`D4Zj*a$(;4Jbbr|YXCtho&FsaNJS z^+-S3uAuF+3d97SO=+&@b1|M|w!j&n&?!78i=pdl-+olC|2B7t%t%^Tpv*v^7b!09 zS7x}RNLd68UJnOUp1!(l>w4d5K0C+3D{&4h?De1!kdQfkaJA!~+eGxcWZU?hm z`p~JYqQ>usrv*?Y4<=BoVkcgEv}rI!Qr|boQ+)@+*uxLJfzV);t1R}#54AGbuT>=l zc#EQbv^hSBk>EoRN`QSm4{sAU<7PW;pv;E?BhLQYkaOJf&wfDTbtw#pl|W_UC5@&H zw&&~7aGN7tESdH}Qkm0#x&X3z#(4W*szGp^L)nbLzBBnQxj}AQ`CM$Lre5mxcX5NH zQod`B`K_}J=oTMT+-`&ySZBAFm8Cnq=YLGAdPp^XJzHJY6h4eWDQeBTL1aCD7RDz) za|*LJ=`xr1H^wg6J;+!Tg(z4Y3c%9XepR<5 za_H6l3GDY)ZlFS}! z`TSCMgz)lTN!7P=7Mu{A%%?D5Np(t>4YuD=w{n zrA|rZ*we4Ps2gcVKLfH43Wri8P%bcOwh6>Rzp z-fmyo!#k=X_K=jA^C6(|>o~<{hwYDO=wBRBDX0_(CG2aA+>PG|P1;IXuUe;ChyTeM zl^t@VDtebCp_m4Gv-mmQHvWC$_v>Is0(oyOYdxO9F9@ZfqfQ9_gFQ> z4VTldVVO^=Dk17g9m|9}r+t-SI;|G>Ypr(h3FFTA+=tO5AqmMM5JO6sR#sAw=jB#) zZEpbC23^{it#K_;f!uUO-wt*CZP8WIk6*i-QCk?4|2AgU_-ykse+P~1*^29JbO_r( zjw5CNbrkHQ^jw(#$B;dNiE9+o=97>@|BEUakPL+khOu^)gI)xP3L~O>Bw=D@ z5V7J1V$oB&8i|}`@3$IU{XJDV%=VkvJfCV~%~ga9f^_-Wy^X1ovXV+w83PTPJ!Ol< z*;3|Djk_O4r{Ln=aGz!psU;#3!-Pwtk^=mSu}a05DB;dt?}5AK!RDw>91+@pc{-`JQ5314nf=C~$+dHaD_aVfDF2)6d(R=8k zWd|1BF0;^8^SfRk{(HX_OvqgX%bP;hMQH1+7^Itn_|6eBYce~1c;RONOCOLi)c0@<0oA7U zS)t1>VN?t!>@1f}T+umV2xGj%PqsB=(Z1YrP8D^)^dOCEyVCMyNb8IQb}zu-DaBer z*YvfXh|=qMC;1OaqWisi9N16g^ia7IsIAq<8?DNuuck9k>|HtaDYX8FiBXFoEza91 z1hY^RBf#>1OVyG9`-KoC8{Js~6hUmiWw)YMxVKqwg|75n&q~F87;NH$hQKT%A)=VH zK>~|j1&?I$+_bXs)oPXFTEFi}t1lX_h|NCNJvgsZpxRPrNjL<r+&l^$XI3lMAB4WC@Q@ zER0c}&it!XrPCxBi?7wWkcAc2CT?GI0=;SalFk4fTt`Jg;MYqj1WXp=%{-Ip2OjNH zf{0#h00;K0GuOA8Gmd+IwoNDi(l8R9CM8NakfoReV>E*_-k+He;VorNw_|0@DjoskM

Y8sz=SZR$2taAEh7G9SVh(CfK=cXk`;$KnE!_dP`&kbfSD|Dv;-AulxqRju94lKxdcz|4C?KKZ`ev9K{??V(O63poq!eSm zj!|VHmXWhjsH0)^EdL6zbkIu|@rp5#p|Sl=6tG;d+ng(%J!=oJz9S+UVyeZ( zSLw;5FL$$=x+eAr`G6mePr0uT_&P^n01~5tcYxzbg^yF*O6kqG{XXn~84bt*R<<^y zeHO1zq%<<>vLtUq63f7MIgu|?y_rW>3w@Ip{t7puJ$S^x`or0m)i^V+mFoI4i7t7x z&!>cLFt)&}2}cefHl`>Nu(&)?b+(nnH>r7IrpaD9c=r%btjcYi3B*cBukr%@1CM@6 z2(=2fg1Y~6#ixLCY2TmO{%;>B7UY-uD&>7-52TM6t=6E8=?-R6t$%wt#%GYS>HY9W zzZz$6clywCsyuKY32}Geg;aWO(5^`NU!*Ln)GrYvZ`mc}h4^uoJmdZ0!*z3yB0+N7 z*K6AR`QDx@1(cLAXbAB$I={_JNAkTq<$$J5)L(JdU$UbnxHNf~lHF_n2;4q9rGIqZ z{GAnp4}$sKhtxT9zQPtyzcnQoKjiG%EBy}wv+$9uyx%b zRbv1+4bdo+U6Ag(N5Or1>7beE?d^0{h3)dM{N7(w>?ag~6Gh##qlTxef4{Q#DmPk> z-jx6R8|IEa)Dt?ucvb(=Xv)?8}*zL1w9hAs^I$&9EW`){Md2%*C_M1S$nvL#~LMy$|`q8DSLaXeMC z%FnTD7!&+@Q|<~7qqy8Vmjz#5UCksL5y6ruLKl^8BYtkq7W2N4kpAO{MC@(tp5+Q}KE8T<3$H-LJwBenRyuuG4^``sr!c^+ zM}S8^jJ|322i`50ke`z$H2t#2`0LI0q*7opo4VDD5=FcmCAr+6KAV8oyrTsJC!~Vz zLuZS>^YoMWm^`Qw7&hRXL#%%ff$Vic_872BcrH6YNdERq49L@BZv97rR3qF$gjUf) zrSEM&d{?aLjmbM29p}OQu6yZBn<%8{oKW6$2Q`^7Owj{hJ|4S|Ld8<{6DlgBj*sY- zlGy<2y$(3CxQ-js;7Us81=$TfA<$T#NDF$>L<1X>H{0UdJ(0;tOOo@Ew-;Zn$h~?! z;<^Dy?1r=WJdX{xMb+h^hX|rW34x}~CHlvWyUA;sr{eIR)YdPUldJY4v>g^d#y_mO zM2OILutBg!Gl2wc;mz5w*NfdNQ=*xK)XNOvZmJkF&7k4b2BHS1&kBW5H{aDLjqEyS zb&^#c&lQK#5eSjAUPgvZ88(&L8;&p6(y`1xA2bgpzz;l7d0VG;p+g`9~ILjntXXC=+4$8rb$Wv;i^5n~UTCtju46q|5#`EN3XdTygVU3d&*}zb&GE;#H)5I9UsQ(0#g|* zTa-WJOcbjTxqr=C+U_oja#W9~W8y!?^u45+KmZa04}Iz%lzOBT`uq0#A!6iGGMlVw zkLAKSUCqCJy|q4U_>3*yf;=3s##@E_%10RK&zj9_sMKC<^?9b9W8pqG{5?N zj;%jyEkU%Xk|0(ha|)v`=NMigm#6eiOwTxq4Za{PN63#`HEgQE4`QTpVxm#G1st5% zpxGmabe5W=R{X&0kb0jVSmx4}(r=XSHJJi;ij2pf2(&oJKcXyHreZTd!+LRk9NGm< zL~ruo)`kKne3vQqMeHLbLWRWu+C9){_{qK0Ek?luHe@zPE)i1}KS-NFCwdFZdFWNx z8f_JoVsZt-k!G*@LGyl9_S#|#>%glDMtJb(hR6m<-8+xr?FgK8x744;(w#uqQt-Tk z&i%^%B84@28?PRbi-%NklVNh-T{klj0-t42TG z(m2M_w7i)C$%1r!XQ%R*WPjG9T6g@A4!8&{^g;^h4gybSoH7DNmxpIq{bm6qus|kE z=4dz%xv4hQ$0KZOYpIEUMGLxJc-U4N0^nwK80A8E8AS%r!;(PKhMl(FI`c`*OF=y8 zY9J;gtq`98{ymViAjIyb$01%}KBw2b@$GDl^{j}4ex%6rP>O;s=w68Q^Wo3{HBd_Z zdFM+Q8E2f|uXYPR$kRh^4lvp`HF_^oNSn}m*cz`AHfg*C5nk-Y-{%z6PI0IVNr_LD z7BRiteSF4dl!jDjshMGVbO&BUuWoYgauX{rTCbiI+i7dx+LR@+L4Fiyn$v9usO)zm z%IIJ(EuD@gp1nvVeB%@N(Ya)efphVj=!o_F!wDEFpGOXrIN}x_p&EVDRARp)WYk>2 zLNVWEGqPx+BUsVLM$dtx+dR$oMG@E@NBVwVGZo-9YEi5#*P4R)3{_tQjxnliH!8!| z6t|@#U$S|Pr8?HQR<&B~Vosw3;)y3&&^OZMn&A1BMOm_wSb=N@t=U&hAN$0^K@>R8 ziz<-gH0}VpBD7HXS9+B4%=Jx;R#xDxG&$>5`@;SH7nR%opTbq-XJ@YW2ccVGwJ%~9 z>7WGVf~QX`O!cdb0B@t`HAyeT#aRQ zF(JX?Uh9=1Nx^2Y`Li&9PRrxcdDyabx_bH=5dRWHhr|J7_CJmItre|DT!tD1lHXhe z{2I4HqUanY&WUg2+U2FJ|47b!2neczo^!f}2lA0Zp;DnBv$ z;A$gNlT3)Rx)3Kc41y7v+ml4Ab3sDr@1L_ULWsrh_i(}fP4hG%Q6_FU-U{t70bwn{MX*W}=*r@UmOg4p zAl>^NO8Rd~q6#{x^MmhcS+DD|d*bM38(Dq1UX%2`pE#U2hB}kYFUp?x9fig6PHG0& zI#(&3JR0`jThzTZ|B_+eCCCjMI&6#sz(igDqZ}`?%e`aiz|#y;*TDUvtpY|`_Kn-U zPs9pD5(=K{pOUs3m@|cjl3nI5IsUbMCFdU+iKZM zhbeqF;k(Ng_z7uVI2|OYwyjTU7rXMx6Z{;A6HYTk5Ye`i?oL52d2qv6Lp4p{gQu?a z_{UOu`Z9!&bI_t5@zt6Z!S|f^S(eIkw&^5_me3C%dF3>l6z5_->TY$bool3nWSoRS9S9;BkD$ZnwVJ)5VC=Jg^19z1p^6Jen72^)GI$wOnnb0 zpW@r^Sbos|qhI)!SiQ+)zfs+^A6sF^vWA+j$zp?w2y>ZWAcSb3Vp@MIilb*oRD~Di z$croa=c6<5 zq|4fI$v0$@LEtm#+u)@j1<>8NMJ@Y{f8Ys3wM#ZD68b0{_JNe67pz|0;qdy)*d;2R z@7dsRYtOw*ht#Q=m+P0y>|Jd7VC;(?WPlpc>nX|GwKVGVui$R%uzIZjcz<``MowQi zIs&f{(|6&AYa{!Jps_!@ezfR5B170>?!Dd5HyOj^w!${9{l&-UTZGCe_Z!>6koy0b{%^zb~N{+ZEo@4#~*L{X4ruVtH(p_dl5c;rCJ zr_6IbzCv1t{u~$yk;kW>l`Jvfe(OR(LMv6`fNa(ll#dY1w zvOh;hWP)AFB72|ekzLL%^b~r{ilM4kJu@OZF+|0kkH@}>NzH$~C^SbXlF%{IifCW( zQ)(tx)KvqOhe$@3?M}Hii~rc5t^C2O>Vzzr!<9DQt%vgCGf!8Ik*~=Vq_5U1*2?5G z-k70x%Z0KXJXkc`HGOm;Rnm7{ElIen{L72$N34dz0r(tQ+KiK8w3k&}W@qA`GXL!z z&{t8471lqN9^p}W)cQm*6bFSFSzGuZ@ADAbvPCv!lgzPt*V2)jSI;j#?d<0xD!EmM z)Gc|aB;-CKT%TD6egKreY#QRQok*0T%gK9X{QCoP0v_{+#G<<^*bCK(sLjV#^nE1d z^iuDVZS9KW@eP&m8Y|EMuJ`wO032i&yDf9JDlLperK%mP8ez2JCHF}9L@!s*r&Cc? z1!K>NW;5iiYnkbP>@Ed5&V#8TYZtuHtXSbQR)Nba%wm4O-^tUOkW?`|;1{(O? z*;p|c{;c#-AD+cfLh1Flu!pEgIQGkD;_p0@-TDN=h5av*EpyG|L%O7_dMg&b_eSFq z$$Sjt8?%m9ru=JBm0H-4qOGniI?c_G8t%5xTnyi_W#khq`LbO^8XtloMkB2GAv-DJ zfdR@mos+U38(fi^=f-tj6CGnmDDyF~Vg>T!o{UJ^%3<-*i@mUp9z{@YWjw}Gpu_O3 zius2TVXA#15{{IX{)3@%d3IjfeO$hsTmk2PxUPi@7q3H zIeNiWsuvmKov-7ta@5-`zy0Vj^(pZ_$Gr_3+Exds1bN77^t)q+hJz@9_!;vN0`)MH{)7AlE@W7?*20_ zy9g9OST-sj$wyE{kw(!i(KpVPF!EC2EZZCxd~$3t(i^Xf?}dTa+&Zp;>hnZKfKY){ zcFXfZBW06r7;7P2Wd6ue_TcL%Q|Wunydy?jxpB&ZK!X@MeE{<;q8NR(!F2trUre}q zr0}!HGe8h@dMBpo20NfE42)JZHqSaBEIDI306&)Jd#ln1R+;n^rTh_$E$$e-V%&5f zk(LQHd+c^U-F9V?MtF=()5rj{Yy%ELdvias$6>r9hD;fp6dIuym_mP>xNO@>Gk3WC4*A1&s&7K?* zCrTC{6(hx~>)|LJrwuDX?T-?+Ps%%NaJT~DH{7A5YP)IL&)7QGw>A_VAp*b#HECbe z+FubWmlbX5w~g*Dm5D+$j1gb>7?Rm8!CNG(#Do8qvQuKsAc8`L36;`@e+wjLb$~x( z=M(uYmf-pmbLfukTU#xHHz?ZfCRz>3+AnWr1yF2`D{$3a@b$V+(ou@2>1@$td+|dW zzH$+-K{zEW?_T)EtDuBr$q+UL=;s5}N;A!1w{;G^_YG*#sl6F7bnib;*3n+D1GZ@Os0s{SFoSsQV-#NZ=y^ za=m{U$C!8DV0Ac+?7Vw~xJuL5tGot+l-J-*22Syy3l$Siy=@{i{eFLZ%M$QNnm8o(SF zys;zSLxX9SJxiJJI{gmlCo!aaN1Sg6N+{%ky+0=7g@46#*PgOozXVYf3LikL-`5UU z6wp{3S#zLbFp59FKWTa$BepG?#0T{Wx`Zpy<3bh8iD&&v@@c`7#jHu=`QzwJEsBdS z{*Bzzw3M=-(URrnj5EWnO)_Z z!VOPBKA|8?fk}8KN+^~JNw8ugqW7`;QcV$rWB+JC!ZK&HUyes*H5O~}nk1~(?IBl^ z7}gm>l%YgGa1oF^w+#nE455dbf&4#1K9CQXrm;0oa@tf@?~xrXLZmHeGEO=*PaqTD zd)vyEj_a3Iv6tOoG@}N!X6p-g_}Ae7kkYTB=h^iZ8keaoBZw6Yt(f*j%J!uG3-exoS?clktn)Nn_ zuiQmnMQhSwuBMJ`m{VKx{c?tKnuKf-ieAPfAA>eAVR#q#@8>{^dIgtWcMMgOm@N~| z3u<Imr^OEXwi+sHPEC*= zs7&O+6Eb(f`;uo_N@cMMBbL@Uyd8?>Bhjm~e zSErY2>S_Oors4tX@K)fHRY}{-?m5USp6)iI&eOai8p0vl|AceRePSbzgK}!ir=xj$ z4@IXIGB(k!mi?~MS~g8*vNeeZ#WQ4B;#($Hj4KMS8_Ks zQuM`OwV{d~PMBl!bo98~%_@wMHqN?|=AY8++B`g_J&A#wcg^}oGTa(z5B7nmU3?) zzN@%i41fIhktjcuTk?@~k8kBp;^73dKU}}BN_^@qZEZGhL{vJx2*p*^UOki^h&p(O zB;?JyGnwynPx`JxA|3d+&8+z1{Y;Qq>-{|v;U&bGb$%61JOPr*8U#-Vb%J%k>Jr!4 zet@5qFW5!_a17uYYQbxLy{fwNHkU0BWozuUm&IyUP4DKzR>^8+>0vaG?i-4m2d-W@ z;BWg6bxEw^K!@6UTj{&N1koQ5hhdY1_y7@X8O>^ORJY)(dZ;ddApwU3sM>t ze(AGO9c{PPzevr3A7Jt^L^>&uaHOuhnKtY*{Z6=jk;SD?OHsr%)s@Ml`2{NaUFR~& zF?~1whiTz>UyQz$w=SiJzs$0aYqMsd1WB&b9G=cbb}}()(X2&_ln0InkjA43fAe&c z=R(BlSV#1CQOBe+hbz^P)RZ<+MZ+Tr(Gz`JroAQm2n-4zQxa0r_Y6(xLUT9hnqpOK zaxtr2a5vf%FQVc}5le55-`Lu_tE8~wmmH#Bq9i`L(^z3xZ}3SKoR^LSe1Cz)R+Z#2 za*YDVy)Tzzepk8z6!!WN0QAW*Xlekt0nP%wXK>9Tb+{o5VOtfFNE{@Mfu@uVo_6&o z0m_VXMDkromK&r3mZ}^z^bCix*`MaNH1NWVNcObsBd$;V++ zyza@ISzG{~TXz-WAx5bnLXoSLdwVW5bGJvY=tG)eP{>oSqr`PvHeD|*`tyNRn>|B& zK?-XZmsVcViv68^Ms(A-xaz(XU88q=Mcro#TwQ|*7ILX8*bx(!N>7!(IrTdFg~CYg zKz+Jyl&Fs)c#rJx9X382feLG(;XTFp5o?B0;?TK>7WO(y0)zw&eH{H)0-{pF<=KGB zF%qE5aJqDCt%O`z zw3lP~@VNRt|2*Neh*-ps|Ka4cFimA4t;&CPE;0&fZx1b0%wkl&?bB6*m+>_Rd(^~* z7g}sQAX?mV%;J-R`9V5@Z1^Oe7Uqa=V`|;cG9npoY#04?>xLl=!0HVZQ(!xb_1=*s zu&g7lD?ni~PTNksRm_l&AYyGgUFBmknu@<;C9d)ehlP40-%Macmjeo4T{?D=Kf_mn zKs@a$du0`;1-tZ%A&`8T(*mutz&xZd@l_C0aFd_(0Sl3g9%}gPs&4^{Q?%pR-P7_*|2-7YNR=0uFam*9}9b;!QWkJ0y_$hTds3Yz6V zyk`X~vvdq-y_0F389G}_hQ14YNAf}4c&39$`l8B_xuIEw$>b7Z=P2x#i0GqIpLKL5 z-}sMjR>)9y*e`D#ISDH~{=>R0aeND+>3NGVIyv#?CMk(ejq2d*Qpz*>J%B^&?HxEe zGGCC&2Ho{g-0%1nmD_5@5S8*0)L5dGbK!M1F%ht&&;$5KdsYzoTVr(xn8Fy_m_=aPZ{%Z;Fmtgz#2l zT)XO{%shO3D)^ z`;sJ0QJdZbcfa`eNJ54hE|*tmGvFyCFLrQlsJGkP`XY-fzQWU?r$p%)&?P$p;UNMQ zTE@>H>7rXK9Bso|*B7B}_%;7%@g2AXu@ow~v2-(sLbKO&XGyY=y}{!-Bc{)CWxk_o z9YQQIA`Ca5_y!etHMk9EgTFs6RI64tYkFBQY z&IjEnm#v?y zX!SxL14$CzzNYAn*86$tgWWWa+TU(_tS9skUz?wTziG*I7DOT|NFTTsxVWy$RL*cF zt*W6~=ew+LSPH0w@EHZ*kD5=yV~je4h$2!wMfR~EUz>Lt@Zw%p0=(Xw-cQgi`6Q}U zubciuituSY8rFAA2+NoMIcpVsbCXyK!EZG!82c;~YsAu;EgUso+@khN6q{+1O+6H$ zQpQgF(!IECJ(gimjtg&<14~7{4ErRn(>vb#wW9B*r#o9wQ{Op+nsRQL^7cK|sJ-}W z!Wa@?GaAa#M2zaetG~7EbZS#15V16x1~E2$)aht7OiNEBYa-tkW@&R;*su#-DS#O( zZXjRM>!A~(L#HbZJ{i7wwGt9jR;^bGpYzUf|M zk~&G5TiX9Gg44=E|}dDWzzkDEpM!73tWitT7P@R-291Y~<02 z+WN2M)W2`3Hl8uB&06ROvpd!zUL09)ZkEpR(O`-}Q-2H-(YrArTp|x|pSIKEuUE7P z;I<(JI*}(}OZhy?YK&xqBh(FA%@sQrx5-BHuL{YPJl!4MSM`w6vws$Qi6eeW`PBdR zw~qwvm9J3xgFl0UH+^>|o^ii;SiJnK&0~Go%-Ss)1NMoLm3;fGb2gLsNisiFoeMJ(8qHG!#dS!7?m#MG7& zx;C>2d>WqG=k>E8r&N%Zw`zkEt%_q*T8EdZm_2*7ufBM{(gypa;iKFd@Ag_22SdKpj zc;F`v^N9*Mmk}MZviH#?AYn$$=3=g)GcOe!P-QtWgfyen}eDfFqfZv(~PEjP9<{T;P?Gop?)t~SRo?-IgdUL2Em~%ExGtTh5tD_j$pGj?h#yKCeB{2svV?74#R z*ax3Zw7s&~mid%|pi^?z@v z1ahT_l0qI9|LH%XlEth$uCOvGBWQF7*1CJy2O(E5nh36EOF($ax9 z8C{PIIwxNT6atX`|6KWG!9h-Ggq-MUkM(OJX(_jdW2=4*k63^>$tiWU5fuk?skH!( zUw`~93ca2UB;e+C(a5}X7sLO<+grXx9c}N!l#;>>t;7u70@68jHz-J#0@B?*bXy=2 zQW7d5-6`E6(%s!L^&36kbDsa;xh`Jt0`_O`wb!n-?sebzcn7ZS5Hdd*?TV|KO^h>E+pzX+wP;TlD6(! zt~Ru@Ce~w8@qWUlsK|E^u(vgb-mZVXHmoKpCy=eQs=ANvgjfXKLvr8u6g=ZE)W91U z=xcnwtD)iYMD|doKLEuQI%U70uD#rH`&$I0vI0V7+QgfLH1@8?{NMCugipSsMHl#+ zGy1Gzo_|1PcO-CS1=P9(><66Y?6%PeTRAe_!Ax=X7bwcSR~;FRO{_VIDso z87|$KO6HCgCm0CTNq+`}z6zr93{v=GC;6}sXa37|&y_>KHoi&Co1-xl#U%fqW9@yyAng{BnK8#mAwd%-qnRTN z+R|092=X%GRCN5{oqdx#7KkAKvYc)Om!yK6Py^$(DJ=;K6Bm85R23!8lC}s8Oj1E( z7Nw*Edm8j-pvj%+17@6ZzVLeD_n&L_>jQJI1kithp=%bFs*jiL1tOVUU{Z2KfRtjs5qNd${N-pSh4xABSWs4MzQ_day^< z*&x^Z2M{WZrCGgpt7w+xh8in9w&Tv0+Td~Jv1S;a!RXRW5atV+n2Qy^Y-)G z`U_uk9n;e!Hp;))(6g)!SKj68P#2Dzz{8ImhPYS{4}fL=O4X3%5r5fT?>;-v;liwQ z4?o+uaVHN{)k5ZbR{rCX^e|E>C2r{dddMbq@m=&@OgUw(wdzC~#w!09`xCTSrX-<7 zHcS$DCP8HDA6kh}M0rlsoMQ|;3WbKVYw%Gf%4g|&N2zg<0>hkdTXytsoS@k)mr1o* zU_VFrQnLuh@%@q6-UTXPChk|A#Ibo090XbR;@19q6+bo!RzGuH5n~HpUW=0`d|S`i zn1D`7_-`Ivbl%b@crI9f8T?7v&@6i>i5X8t(E2brbN6T~~rM24i> z@JiVzs_mfH=;8zOx$7xRf2k4!rxBBU%HI4C>>SE3Zs2WFh>_tt1)QFgDD9W2El>N4 zyLyb?_IM46dB*>!%QVTlK%nd5Ni6?ME~O6JqNYu-QG@p{D43vY26DsN-YkhyUK9MU z8(jD2z1gWB?Lde_B}Q!`%NDuq(Uq38U9Y+GR|9yx)fld6d+Uz?j{@#BA)cGE;p`nZ z%rPvGK@|M{cwJ08XXP}<61J4v_J#j-Ix5JaYG*l+DuGfe?{;o1B>NiJm*j32vYwFa zFa(qDC&XdEu_mUx+Ntc$G5v0O*KGakeCt=I98 zr&77^a64{q)Q-imcCbXDGuZ^s!)cOCdKDZy*5+SH|<&KkTK#5aJDA^2C^C1RWV0k7L5 zVk{KQRU>K7jpXrmC`#nu3iFh@qhAWO0MS}|y7whzq&&TTNqFRrR+WLF`9!4d@S|gl z+}-_QsRa#eBL!vkW++`75_|}0_qRH;P)B|H=}f(kJJZVeG0Qi^efX@eXp7X>VE(4< zxlkm?286lR5^6E|CuR_{?`KD?vv49!4psZ@uU>kVw7(Yx$1(qA&HZ(oh1V;dPG~}Y za*l(@!CN)%P8)@i{KT&C^833MnNs-roYbko8a$ zTMP;z(u+dgMCJ$+oG}GR!!Pr5S%EmbVHOp}x-Hi{73^(@4=0q`<_&h|NbsesHAXc5 z!6RcF|FgWlBs0IeyXxhT$>v_-#f{kYKy_rR0bJ&?0j=|9$KPkqwy69;4G)O63&h1=y zZ7HpuZdwG**rBm`mtSR-t=xCRgT^O@JyuTQzi4re1@nq+3;miA;pJ)b+TO9-TfFj+ zG-lZHG;+o0P6mNTG;Gn-2xtct$lg1Zpl5E2$@tXo)!>@gZ*Z!E|dQ~_WolfeLPc65_CWmV^*#-9KBf>!itirbJ&;uoM; zK@Ds4&bIR}<*_mFJ$uh@%Rm2N`aJLIKu;RrPki`uHo|%&^N~3bcRDU+FW-WzvD5se zQS0`-qYFpKMF-+nnMH-u{$1w^TiX`Jud$~_9~ID8XspP#k_7rMRk9eVczQ~tfZwjS z!$v=-a|J@4+ryh#pfzQ~jN0UW9%eP{>Ta3n5(Jee-@;lPjB@#tzB#Oa;2vGI536$B+!#bcN?fYBS`>IK5p75 z5BCqVv^;5>nTj|0ZDF|QK8|kZ&x;L4SK_>?vU3bf{Ktp#R($ERQVd^)37J=XehQL7 z=n3Q=n1e|xtOJMY-r?d!D3L?*aq(c|f3$kZ3bQ?Dx%_VLinYyGaY0jLmn0jN%~YAk z9d{vPxEA{{V4L{0cGTTU=#+Xi;$CFw7kZr}mj{Fakc>9;?@RQ1??10JmfVg9f~Zm7 zUd%wRe2nY$&wjWri%HM4q4ud>XsH}FPK`_P8;Xs--OG6NnCqKlgV!doPt^vPo&2eIqNFcCj?Xhe_Nu=LIzcW@%BPYBl z@#i2U>CB`ypS2Jk)a^S#R!CIWTGZge9mlq@z!Ys-dp+1@D&MC2$vmIg{jZP&N!H1k z!}ti_Yj*1E|ICH$pNh~av%hn(`{uD}q8Cn>_svSZZZfXSVuvI8s)U0f$-=jazCg55 z`6)?mJciX%s7*KnAbc6XXK0WlbJ}KlEpzr4=d!wYDq)=!e4uf^G_YWdw})%|O#P2f z;E+Q=m*cI;6k)FKCAI!Sc16L_I{J#HNMo-KtwX2A_dnm4wSY(=`C+6JeriV6-yeJW zM;mO5lD#XxjXjB}QwT=sED{+7UAm*rj zvINwHNT`5pp`OPSov&Fc6xc%q#j9ng<0$@g3q&)b#m<>fBpvLd1MghsXM={6sLQe9 zT1i8{a7pou02P*~}f!(Q0x{-H( zu>@T!!wcEOlBXSlX>1XtPIMouEm)Dq$|%0~1E`7Q;*Q0DcI}{%xYFQkKPqqpUnxo> z5qD_X?s}-uTgbs_y~#Z*|Fmaie*5o(!6c9Gdv}xjLPNWsxnL>pJge5evZ+W;;8hVB zNp9nnkA3@5PKD2yvq-;LdmF0ikqzX~#p<=+nMv-RY71LWpdvDxU*MB&EnNHz4i#6H&*go5{)hR9O{p^+5aw*fC0$)X;A_RGRJs@E)n;H zkbN0lvipobAZ(JB-s~K+x|P~Xf{tAiN3!89llnz$#_67IqlIFY8IyvObFq7!g147C z0+{oDNfe@aWh+Ms6XyMA>LP+sO*yH8(XAz!+U7}0_}bqjA)7qU=G25ZQx=|P=PbB{ zH?Jp12OV=y!$ew-)T5r83%sO-Nl2~bbVQEMw!^RAE2ITRube*?NYickHz1zBOXJ5` zJ1R173xg@d31Zj09^38Md#G8@o16NFoKG(I=g{(=1eCbvQKIkTGpHQ^D^E;e4IEEr zkTij;l@!?ze6Wl;Ccc`n{?qZ}`)JiusUe$NLNC%6;ls3qntSx26@pth4djMG1MakGK3L2v-a&{L5teGOuc{O; ztdEI2B5ERAq%+a*;*yyf;tf6Uj1PyH#GL%>0csMGx#N!EKOwmAn1{+IhN zOhz<^_@aT3O<6sP`3b^&!|)dIeC2SWJ)2}m`C8{>`AtkuN_PFq55Gxa&jc8~`G-|e0FwRsU=T!25^@WMX}|N9kDum^5O6#6DHgm5E%Deieb zk9xO=F_vVFG)F@utP%GxnuSetY7HREh@h0=`}+L1@XnWj*kqz(EjbI~kn=oMcxoOm zKoN=)#tC>RXpW$iDvLdG*zRP&RN1uoQq_1qo9;_az$8n+uvL~?t+2V{mHOQBzrj1A z=(-1~FSg8>sCzcg!?e!*6O;sGV!tu zr>^mk2?snvG|fI^f5i*ar8+7+1rm}HaaU3m?*FpvB!0pWlfjG3J6A7WV0>NKdfjQt z;_~hHtgx}gf<`ObQ32^U&YMis$W8V~z2~3)P=Nv#p_3Iq>IRBSufB(R&0ial8re)c zgnFBojhYk}#s8&W`x_Y2;LU8qSHATdgd_BRPH9QXD46p=B^jZe@BKa9zBg9;a$hgm zt$h5T8K5a3@BeHW`y2y!N4NV4Q-LIT zz%Se$bmkm16JkWa@>~1buUqZX!+y5e>e&Jjwm@mce$$M5D|r=nFN z3DCTq_4WUKO4^9$m11Dw0S#WszW;+x;ye(0@;9kd_4-N*Er0ctd-SeTWPy~E&*?Kh z4fhUg&k5rl{5>)auQq*w=*hg=XPXb{=1%_&oAuVHt7GDPT=F>L{_u6_ilh1KT?Ab{ z*R_=84Hj=IZ*E9H5gQ)EBc~xB+~W{8f;bM7l&zq#fbSNy%k2524Pb0gO3drv@AI!S zT4nOtV&*kKnYEwzcfI}>js2=GP9V?;i@e+ZjOLf|yAA)<#U?G}AAWj`>>3*5U82Im z%b|;urtsp`!*~nL_@L zy2s3<9yy3anLg-x$|w(iZ5d!T-_Pp$GT+NdzFjbS{9?vCOtCbMW`b?1WD% zy7XShV{CWgOHbvd?u6vEH+rrJ&`+{L(%$>FGTv;L|5=5Ig_Pf5uE5O3EE?$rl;v9= zBJ#(Vf|C5Yv#o!O^U9gSQTuSrw(fsZ@>NZ{i;&O$gMb3y;gnW?uR$H1&>#`&1tM!$ zxYc@k!S(;v(Ch7S0Ziz5W180BeA(jD;p|qM%mtNyV%-00>%YtGuLq-YTkFH$RewKe zt+0f?d}%AfZ7Tw{^#=;02>?_oX+OvQR@zVxkao_EolluA=Dp4Ooqk=@Mtc=oS1jk8 z%Ot%+s|it-m9CSr7JBkSZt`O$*a{!`=h693%y)+mh36hn`gZh7-rQu~Ed`FW-VBc( zjvfvlBHKe;?6z}YTlW?>t@6lr7|NPD8m*lD|Km?@i<|Y$C$W!iOPN!nV-60}4clrQ zG?RxyMBRKuHb~L(32Z*}uav?SExSKy2}dm_?=}PuYBdXb?S~ZYH(NhQ#vYEA)wZll|tNS#Is<8Nzg5hWAey+y}8ktq#*0r?a$Y{kwO zL1P2Q-&uwhtBZ3t%=b)>+gg2jK7|ziX4yNGmN>tCtJY>h)Uy8b%EkJo)tuZk zeN1zSjjCmQJ1R;?!(NFw=upDt&EeYBRhROmZ>8kVyNMt5f|k&KW;DWyMO#ysiaCVa z!u>5O2!5(xy5JzSP=%0-$I*R{O_&_?VD?JEi$y-+ zB>jz#bU%mwnjo>)1_(yCsWgKBizMe1d(`S#SNIr=aVKpRP-had_iLhAol1c@wkJiI zBxTd^z2D|4(?fzZ{&=X7QyMtdvb!9dO83M=iYs6V8#g&XmWUsd7!=Se)d~~ljSy59 zjLnxeZ`v+1+O^3l!1aNZd|m7RSWLJ;KZg2Y^gAQ`$=~6u@niO&`%*#^`y^#6Il#`1 z748$uQk*M5!t{-IswV}@0ZWH^uH!mE6-Sm^wCXg+fIZwT%+hWBt+F)(TK42_VR`N5 zW%YuP0bX2GiuzPkN-<%Cmi;@%>_4Ob8KWiEKYNLAQb59v{XH# z3IY6%_gD4_Bd?j;0>4*cF>HRPXdR_RApfNZFZWLc0$POid_=FFK!Fb#M0_+pmMvPz1Y_`}_%weT1Ibrm%vO z0%-zg*%^F!;sRR5Km5;DEou>R?&MSA={g(o%#P3wxvJo&e6F!z1?;F>_B^~}8bwNu zK}K@+oaNw!EJZ+1O5y2RA7zs24sjoub?MW;vo(>$9l>q$*Yn%bu)i7O;n9$axp7*! z&jp|ez8gLvS_tf`k2A>`rNjaEkT|t(o1L6h1l3WNPWi9x+M3IVB52!dECQ-5Mgtcl ztgB?Pa3-i@N%6?J@hF{&ca!Ei+Grzf_8PJxJyqf3)PJ-#ru-gD2>;tXCQOY8694+W zAwZ-B;NdqZ5hMDR3^)4(xt6<}LUen=OYL)fr$ka0T^J`?ob8MpI9#1Yd~Pd=+bMsKcWg8X@F#X+$sOdhY|CDh$4RY7WAo zMf>9tiR14Vi{kZzgcvlufiWvCdEzJqz#&(xREm;TivmL~vO1Pj&%%G=l^FEFpR*;J zbQN|vqc4@azQ>5RcBBJVSBGC)e<>6I#XIIY25swe7=H1h_T78lCc3Y|sKOpnvK*u1 zXq`>S97NPG@YA}_z%PH?)qSG;E8eSO*49atOS{^L1qQ7c8~W* z&8m(GX5IG_mR5q#PL7s^5-DYg%kv?ZUgp|=C>~%Ds=`&&!#f>_310{3ZZ_=gkrF!4 zPg=ToLEe+essWW^z|nlgO);Y7;zUssN?VMwZ`W~e3X_5K=?4@_fy3lm=remnMvvX4p>oHa}c#>Ov{y1V`9^jcqro*q{0_;0f#*GwD>mZUD zC&V5u7AG}YyqvcL=s(_9t~`-TB9=KFzxv2d`8A_N%3~5)Q$w9s0$8$Bh%{h~cuxwM zE>htzc5rygh~~;dlKdh$e7jnF#Txe4MSI~tVyDnH4fH^SRewAG%-*N^qU8_SbX!-7#`MzIVP5?z6^&G7rjn&6w zS)gfPL$lTi=f*v*D*Le24qt_E=nbjLrcUPI5jH{^OF`~|t{@(n)sXRVb4=US$TS`R zDti3u^bf6m-(;28*U`uH5-qMQVbC_23QU_^=M34P1|<&Z zzWe9tng{fZMq@XzAg>rq3olRLDwAy1P~+ApAr5CUClH4@qz9&O1K@E5f=4+EOHL6o zH7VMW?(dN1Hi#yQZ|ewv=pc%n*jhZq3=RzO7_xX1WIkXu+dR?OydyO` zS?aw8_{^E`nq3^IQpYj$J>w5n6(eQEQ>irC*vD4ncoDkPh)ynD#j+~7H)+R>6`^~) z3ES88D>rtHry)2;-)#2ipPK=*O>A_ZP(e4$zY9U=8#nYDJvzUs8!6rWTzlA}F`}O;P(M(` zXsO3f3V5q~0me7)U*N0%h3^Oo6oL5nIY(3Z3X}wGu%XWtBNKEiM}adq zYdQE)DS$WLm2{qLXV_JY8oibyNU?+`$g#}`-9hM`1Aghn_Dx)gj z^qz`aD0()wiQ5@fu(rfJ=Bjm8*}y*uJ>Dt2ofwo`(EvxBzR^n5<#J2ZG%)$|=OmgR z^k?LiAXKpL$3da~Vz;*R>Pl|lKG))|fbt-{{JL@m>y&+Q1yFF|9qO+4&{YezwYk1} zHaK-(`4MaH>2$lwZ)ZyrbTWg~+=K%QYsaXLeK4|#z6_PO`?0c>XJvz#3C>(^5xX8U zj=*eEW~KzwL%WpyKpavkK#;ZcgVfV%f+E&FY66CziV@28H*ypZq5^s&+cYcc+K#3U zYN3L+#S>0bQy><6a@b)gHp10NTob zy&cG%)N$x)4hz2QI}du_*R31_$67u!IbM{`GBWO>7kR$=*4gb%O6Xc?L+x&*tdnfsroFL8$)w#@ z=`d)9!-EN}a%r{?wPRp=k;mr`3eaJjyr0crzH7 zMKOH1cm%Oe?tFgAD=O-|yCHU9_C=n8;Nl~`9uj$;rN31;3^IhcjWZ?9{djoMhYw}Z zPv$W$8s;#o&*jx`qPS}u6K~NH5N&p-+X~>1L%b)wrfbOdYweI$mg8Wu5EH@#4F1=e z>_OvI4*-x`_*65<3pX0%Zg-irVUFCtFtfOXD5P4<-3sh1uN=__u0r!|SbmX6H%H#7 z0Po#img= z=`DqP+=F?;tjz+!<@M$FTr3eK!nhMGW)pR^pax!5n+Y+Bk)Fm{P0_aC&J1}I<}#Jr zRK#(|M1G^g)xjb`vKrSKU8(DZ!Q9K~NC7s_s!pL~bdgvAV*@Xb@i*^E;fCJt9SriZ zGH$z~SHD>5<#A+b(`3@frDKt|`*rY}yxR#_*%X{>z0c35M>z=`;?`Dpo2IZ+MwM4E zL~A>5_B4y+<5n>*Z?h}QPD$Yh2d1o*apb7JgbmCel+?$Y@C*6N4`C-a0rD_+CjttS zZ-E(b`ce(0QNQdUd%`Y@hfIoY0C!QKHhV-I(}7~@ZUZeZ`IF0#w)xn7$u(-hr>RLE z(eh^-(_6elDUCX~%t4RZ?E=~7;=1u{Mr#Z`PIw({K2)yv_?_hp|iI+uUg{l6Cg$1_D6 zj9%6%?Ty}O(O=&H53v3Wi!o0_J-bb#JPn(EddAFj$Ig=7$tK`1E+ z*KRtIN+yJ4GKpnr@~mq%@Bxd4x@#xe2aL~-=%lfj$(aHC%U3YxGp-<*<6Y?OhA1fy zmORA2D=FppY`uTE`zccT@!rJT)L!~&U{;s0M6_ygx?vo|k=J}j7`}ag)~3r9+fVPt zC4rqmwfGlKjR&iEYRzG9Liuw?UG*;66{H)|TQ*sqN~|sJ*<~L;#Km1wq%zy2I^2Qj zkXzB1f2*~Cy+K(9%O6@K&bAwG-nL&(euK+(>MH=Ux@^zXq)~Uu(tC8;;$K$%)~SDz zR5*Yix^eeJ>rj`ZcT>|FMrnzK`W;s?;q`}8Y11P=@w#!A&@rHII&!0)8SxYGtHVt8 zYl}81jI8UsxasZ4d+ug`hv zMQe-X&MGg{q+CxAmtH_T_=%mU3x4>|M<(6vm~*35!F2EK%QFPF%kLk%n)^ukS>me~ z^jXzBEqw9mT_a!B3a(8XKW5i7su<)LY7*O zzoODmeJh&+yyq3D9Y-?hbDP;#iN(5;rTqtwdQwo=GpfG7xpF*FZC9^KZ7iGl?iJRR zc@7EbmIaH`$3&ZkWp4>QLLP%AI1>{d=*IMabdy#SYxVFGOS#^nrG1C^RH0UY|Hdj* z?{ZZ@u5T<9d6928H|7%@9PDy9z<+(A9va$iQvF&pEmn6h1fM?Y;yzdmx6c-JR~K4k zhMLRYC7~5%qzTIGO6Xl8Y(G4Wc&G>g61=qzZ-B$$EBAKN@Z61lJfJkfu#9LY%`<^| zEkWzI5st1I30>}myZPvtXyxADI~p>JR7voKlU77`A~s^YzU?uUykiOhm(u4`yP$o@r+Fn^-hf|s zzkI~nRV#Vpw&UM}6sw^N13ue2E7eE4ZRgGrJMmBwMhO7ZV(DnH4_FB!A|_w@^2q|| zDCRZ|2gnq6*dDrz$?L{k&!v!b>$w|P_sUG_<>74TQ|KOzKiidxDZ9r~JO{1-xlmZ~ zsc3Xd8TD83;4o-Pc)=Z_gl27)X9yCkoM;KFe9>>3y4yJws7U8VpX30(Pdc|&+?2E- z1ajlioFT(wnfm4=&L^t=h92N`%c?$XeMfGeKk=;>EyBzC_iXY`&${%HX=nyBh1^r~ z(>~s51+kGW6sv(Y)As~^zT+SqEp}SETxuIp;brC7p$gb&>k6;KXDHCwWYDE2KL1#u zZ|lUSU0Zfx$q>K|fY>`o?!})xh~xg*Nkt@`mBQ*@13tDtrZ-v6=9=aII_dZvEqQIdThGV#v5A08dg!7utI>}1o7ZsED@)9ulHFwtdGF7qYD(4et z{DdrY{JKlL{Qwgh%iwLOdXTE8D)rtt4zpS+T>-3T8XF;pq1#F}XZl83#@kCUJ#(Q3 zCUf(pT(^L*G+K+0hvBZCAnltW>Nq`1Okl=F>r2)68h!iS(8-13`>W4+S3kT?>gWBa z1Sl~lBLvGx#FH7;d!j8?HgjXiKDHk$19?Nj^vt_%VrjgfR%dd3Z5+iUXOXiL5xYPF zc1Yl*AbJ;@yr^|YE0*nhyDUK9-%xPS%G`0=X?<<=S$x8*^5_Y+qE^Me_;iFVv%0R= zkSrBdz>MQ=|N8Acu^6UkyVvZU1B&zJ-~`^N&2yjbn!Ao%=MuZwIeEEmfx0~!Yx4Y< z{oHFz(&Mtq0W$d$mBt2QCzT>!(j|PGMq{N$)b)^2r6I@LVTBO=F!lHnS_xS`hQ4}y zvpDfRln(Ud#~|`o0Kzfc_%|z^GHtalVlVXkN}4@j@ZbovccV*2LgK;^sBx`H29e2K zNY2S*V#KbJ12TF>T}tfUJ6rZEk>qx;Exz4*;h zgG8bjUbGc-SA^j{=`{Clq{=Hl0?@@^l~S4d4Hvh|80j-4!ZBz&97AAs)otnBY$&Tu zH8t|?#GP?|8CZ-qO6YaAGRLDeeIy?zIA{=*tax86t~b`}*hn=N3N zO_zdsy}S&P=um|LsR4jDuR^I2c{SANf9A1zuPg==68^FCXPScH6)Vq{(zSA3uT9tv z396+KaS@DQn{PV^IoqXp)Qr4h9PwA6)~V7re~|n+AN+O#%&8{!?&60hDMtjJ?l$U>Swp?%I32gj>_UL*IcOLmqouDr1) zqS$wZa`r}NgvfhHH33JJR0+FC@xY+lDTU>XiMG9mgaC`{=L0qTCu=PZPrFr8J#1V) zssO}09 zKOrdWwlfe)GNY1_)lVMBnuphM#u5*|X@Bey=##w~(DYMr9hU=B^^9rc>~m6*C`%>vPSm^qj4Ci_bl#)@-NDfvtkRU#{5swaU|Ftj>B7Id# z(m<8l>N)Rw;g2{_oILxmiw>9o#Jdz8mZ;bYt;guxtMaUhT0MH}!6&`quvsn<)I{v; zEJRFeRNGhtLsKF~;H7~N3%YX9H*_Kc#*h*jw&W&82y;j!i8_a}DHcWqMi&MaW*=JA zdL+?Er36gD(qi$(odmkB%+fbSy~7y7XP7B6$|D=w_&h+PG{0oN_%WmGW$$Z5$)$jD55bm~2jl53-NMno8N!@GdkbY&~LbK4(8yIRU{doAI+${xCGlfV& z-RDP}q5{GNVlx<&E3)Ljdg0|`Y%-JL>#1(ao@do2W9SlS)Y^35D-kg;La~a;yNMu7 z0Z>KDDcVCN=}wXY{MYetJjaaw@=w?JkQl6t?W9=T+PbJu$))_ByzVEv-cNzx8Ty3a z>9yEh`eVC%;fC#a+wj6$etiSnK7%9LBMS#+m1=UOzX`#_*PVYAkL0wI2?4xkuu>L>+B8hn7=!*hmL|modvl+a)}aOXa?)o6?J0qW z4+TrXb?JP%;*q{=DKHPQ)su2pgC=#fj;>3)oyZv|oae2QkJ6u!HiZ2w33lOtIR+y{ z%q~o(@+IUNq)l9qRa6jwY|qN_xyQ{^Rqn|By(g;WO}EkW+4h{%OK~TEW8zx*>_;B= zZW)e`G4tz+J}7|kXwC8^{jA5h@@39Fe`0IBMcZ@M^aTNriTfbMz%w$@6K*^ZcOLjl ze~J#gggh&_NM}S5Uh=Doy7_pg5}T-Q&}F1sqfhUf8CpwsV^pE`=EvXAJNHBM`cIgM zmEIMNRPbH&^xb67nckqQ;}_x;O3@hL;a zh=yIy@LSO5_MrO=R~ni+KFzv|?4QA$iup%{7WcEkHy1l%ALap*b4w8P-gtnd$+va}eCx9N&n|)k)*r$_hSEOCJRr!rj<3~=wM%HqO z*R$dm&E%O`dw=}<=0hEOPG@0sH#L%iY zdlRABb#cq56I74W)y3nZgp1S}mH7=fX`6z`Rg4K99mvb^Lyv&6If$L?<2|;AOQ9&5 zqE@daLi&0jOVr}<_oQ_aCOACYaY~*ZjRStDV2xl1a zCE7}2-%KKPzLLZDpLVlU zHFFdUx2oT3S&46(+dD?4Q~g?CsX!G=!!UiPl)sjv;wd2RhHZC3=3aM;xyYKsE65HH z({WnG*Gvo>6Y?)2Z9irOU~&cSy4jbGus2T8lX+}}o7&QKK1=y;8_1qlxuI4-ooL$NQG zTo?&1!T@@zX@-zKDK=PRlk3U5T2RBk6@#ULj*%$9M5A zT;%Tsx7(hl=}WG9kYWm()r$G-?^vTM%$o94a7w3#q(HwK}5*}K0SMLi$I|@6;saHpXk>h;;S#L@c{_T zyP6D8dJFR8{_up{4265o@$*jLW)$M%4qMclMWvmH-t_vWY=)f9?CkH`GCjF1{@qy6 zR^(8+o~R~dB>_?eEPeS<`0%^fQ4p#bNV)Vq^0A`!+JzAP$F1q(`a@}oLQu~H7N+Ph zLR+vRQvDH0c}fq_%H6N$zgZ1+L8MIvsBUHa5B8rHIIRKDS+hFm59bfa^&@4xxMN>v zst052F=TdPdk4QtXW_tjxF8Ol%8Qj6?;oWnGe|3>34j->@|W zEyeWV((}x-YJ`6JhRDMsefx2plyL&8m_{S6ltI8`Wov6+mV;Z$TclEr%6er-;jBM) zfUaIa<-oR&SI&TsQE+YEYhC)2KiBQW+3KZy1!G=Kkoh3yc{UKm`P^seRq69`P_cO^ zKI_^Q>QJ+NW7&Og`i!d)d4<#Gq$~)LF6xweE-V*TywImyA(6~wvC7Z;(;m0YBY@k>av9J2z`St(oEk0RQ`dQur~rlpYwYc>EBk^r6I7!hRtsB!G-rWMiAE7Xzaag+Aqs+$T&@_oXNR!Z}) z_cYxaB?t~6Ky3}bed9S0L#IsiYn`T&l-sZ^PcomHJe0UD{tN3YVZNmocah5~4)&2w zEy?JK#*x-eH?opYIib1Y;NLpj zx!1?JVp|ZmYeCXdb;{3%&NwdbE!T%QI-%^^rCF{^#>=2&1eL!fuyDE}GCi=S^kiO7 zo!8AV$UP|j@D%*z7#&!_TUf=LVtKe5_BI8B17xMA{dP9-07$^#QMu<+AY8FEnPPp` z-RK|}m;8y6XKMdOR_ycJY_}lh*deNM9+rrnJ@W?)3Ou>p2VJn514EOcf1ncYDm*{| zqZ{1q+^xaE=HS@dpLuA z!@SBpudf!U(fD!{n{?Gwu;&eKPz_$hfQYZe%^AvHt?jsf*1~++ObHy+5flpo#GEvr zbMP6T(ACci`o7`RGDAK?iAx9F)SRHR49J1*y&L5M9dXjxlmoJ_J~}bh$_!BjrVCba zpdx6B9yd;LtLYO1cH`5syE8eJI2FK5LE35Ib<3J}+O4jtLGr&{SqZ%>b1Iec93SH@ z9o!4|9K?;YvnT)>`QfJxu;Cquz(MG+$Kiprd!*~H1Of3Jx{A0{hOQ?7)j_fLftyT_ zxAaS&$!ET!O`hwBLGN|y`vJ1@o9EM*dtNRUA=&vdmSx@Q#o8(OQSZm`wGT3$ky$-T zW%jHJJy~u=%dD5~lI)(G_&Wan9!Ho>nM@a2LChPJD>-U) zHzDszQcs#jb3~}jLKR4EICk_M>DvSB7X7!M(}WyGB|Dano{WhrkY@0%F%`abA)kMp zHzUx&v2=$3HE=Co_WoR82&v32E;w6~SQn=NdNjx;*YX+#WPR3!%PjgIR>iD)JIso3 zkaFXk$ulbgmSe72q5zCC8P$41vVTM}J$XIc9=)}WS>_tqT`QQWB^CaAm5xfr2P-}A zA7H|Y!~^J=YDt|H9S_*$jusU)w4ml8r2`OK^&W;CPB8U{dI>#xWQ%FKd7xeXYy`3vA|BG{2cB?H7>#PfWzRri=LEWlp%< zzXOA=fpM!^<+FTL%+t5KGTecO_5;p>DAR(P12Pwze`pr+YmlXyspabIp0{dH(w>w~SacSZwE4Nm&I?IhvNNXd zbh>f++1qf|(ytPlMz&-vQ;^G!x9Esr8sWl5*{Z`2I@Ierh*JuUQnW$PDM1D=%%YZo z*Yd9BLzp0}bmMGqMPhxjJd`~MPcgXVY>CY;rgjcWA~mPQ_3<&K4>XFJB@D42fHlBa z(xQj=fwGuzAms1`&E_X3lM)BMnLkA^1tERP$yUq10~(1?45O}ocxEl=*@N03214Iw zRHfyK@~{q6YbQ|!D}nvjKV>&gX*J13sA%P@-Xe=r4o6zySqY|6Jt=QEw&2mkyeo$D z`8PJX_d0O%9IA`gs=a$zqDxvM!kWEti@xW<)M}{dD-}J;_ns3YB=X3vM*{vvV@vB+ZbKxB-g*% zucI3fwye%9*7idn8E;Rbp!+JPs*`GK6E=Emj-tmz*U|!Q5fU$E(YIT|mvUk|;(Hi< zbjo`3#UIHqyYSNWcGS=TL6W|e!(0fACCJqC$`S5ptZth28ZrS&{XI#Usf(dnC!^^Z zM!|uxH6K>T=;1V^=m!NdIxwnok(n=i%6~$sr@r}V9>P}oI_K{})SV%94Kga&e((9_ z-Fr2bFJJNG;^&vt3{<&lj0yFc{0m*)d4 z8WUfll6){j{1Wdv28~kaVg$-ttIS_%s|Tufxo7I);V*po=(*qJ6&J-GHq7i~&}8-v zs4V<__bTm?z#J6;uFf=lqfGTkie3xYxkUh9Y-SV4e^{PHBC=&=Hzha{g~3(Xb0`!K^lF#ff4z--uxD?==J;GSgWaJDRsMAdCm zHFz&>d1IA?=#mQm;k?pG6-+_os#Q+~&^OQ9`o}B;Ikc!;fpTr!3`vsl3EJ*P%`M%n zjxF{a2QD2c!-{KzwakYK5r1Z@IY9_3G{6l#mT4+j%6BXB3=WEjlkSKQwef0rDc=mU z*6LdkM@U4_Ofw(M(X~DP?MLjh0zFvwMiiFvx#S3A$Ug}3!EckrUUWp_Km!PvPoBj+ zMh_+p9B->*(5In`G2^nL1_ct=lUz!~FP}>T1mQkw2;eC00%P)$|12G{S?##^4%}k5 zc0N>o`TwYU%b+;AE^HSK7Tk5P1PC5n2loV*5ZpaD1RLC4g1aX{gKN+Mf&_xQyW0Q* z%$YoSzpv{2KYvaY)x}ItcXjXXEo<%TzV}Hi@jy~XxNR`Tk_Oq`&9_;->;JBA6qy9k zj0|;pRV)9OED{mbOcwE0N$#gRC7-a>2~sQ2$w`e&B^tI`RlM~4-j=#)1c-K1({ z_pSopj>Thk>(E>EJ6elezJ~>V6ht+3*+;{i$*u}e@BO7s>}Q3PQZK*0#dv7UnHy34#o{uR5k4kO|+{04}E^wr)RPLXs1|>+g)>W z-{riu=Q<2&6b3sCn%{E1huR~mwttSUDNXk8J+aOfpJE#w{1RpXqELjA)K`_(3jH0N z{_XORhS5XebI|x1PccgY|9$mu$N$&cieSR_iO~b?Gg3k;*k;ojobLM3@Q-8vdl`&{ zS4;bKyhuMlrVHIoog#DT2eCk0EAVo4RMIPKs;Q3Pr;WWHmD#w2cuorFH&baZ<7%kh z!5PfSy|(b`cD1@I8I;1HoV&z7HGeVI?-EB7_+Kr7=hWA)^Ex})C;M#3tYE$MaHG+) zsbTL8Hw_}a3KQ$H&bb>R5{I>I9|L(^a8YeH1s-s=?NO{gpwulpz~Axlc~QXPk#(t- z*UW)!LywHoeA;(#HL^}S z5BP3CJf>c=un|LXn>ahe7X}*6+iiLgDHaF}4EEo|=K0Zc9hQ-A{IHX6;V;$uyV_xiP+aTI0r z!!V@Uv7vn16V&2rcp3xsYKVP0pXSVaLva@9wi*S_H1_CCJ?GOrB$OiO;SnWRVOsdU zB(zAqA|mayulLbNRCv8({`b>);#QX(tBk?4@Qq9o)e3mq{M0@4%HQkZ8g2Kh=I!q@%%Xv3v%%4tzmlZdx8L=A3za;l@E^b zCAEeepjegbr$aa2C#cIRPy330E8Gw``fh&9$Kb3r_adV{>$6F4joXq-vh}K@ds$I2K8&0{CjM%WufJ;zKHNgsK?5;Ww`#sm}}!QP2w87 zzFq(VS?xu2u)TqPJb1XeZl~%54|evoID#`kJ8niqERuA&1={GEzRA}XSHWoTr2b1! z+&yESg=zoleLMJqFjSYnS#)`kaYW-q)wu<_+c?3jOJS2ZN+6|Z=13_SEn3F!UVYUJ zZK?_)ra@_$PTjS6==d@iO_t9ejAK&C;An;5Yw#{rPK?{(V}VOuUR^!Axhm#ICA8jM z=e&#*=Xl0|(5qDb3AfVH-su0`P1rkqZ1kLUxZW|%*9YQQ4U0k}z3w*tV;4vp{Qbj^ z!5awV%0+!X-}6Zx_t+DR3!F)XAmC8pY|VI)0)ud=fq50s>+oZ>M@Eo$Z>t#L0Mzf{ z5?hFBTt^A9CqO1UVXd{Qcs=cu!D1{XAu7PJ8OZ8g7_yK-*y z8QJ#=A+{Gk8UD4T=5$ia%TpWVqdnL_cIaGvDfayl;@x>(8wEdo=?J)MfY^T%1i%eUFP*2|4Z zP=VaJljYojqp0(iqH`Kwe96It8$m_nOo!K5#hc8DT{bkIgnmEb)9(CC>VA%lK@G%4 zyFB{TVI#{Hs(`0v_tN$)0r1h9lUb!rKK~DeBaj4?Fkfq1#B_UD^FibkE48Wh@QHq&B=&>!=6mUsA`Dm)Z!C#Rp{lup1QlNb;Ca z{;%zw)DLx3`@D%837E(W7%z%O3WDCQ?!b{qqs!!Uwy(^1zi*hR%l3*oPlq77{5v4Pr$0bMx_q|?sPtD^ z8#hEC0o}*llD{x$nP~j_^mjDbJHa zBo#eE*kwo7h6fZ+y8j_q^2uj;L`VQSNQo*fqh= zVcl!^R%82eesz-_k-jua;~xzqRf&7&j(JwNHqlgkNe46F$1$LrS?4V zJQY%1kbMo(S9J8VHQ;fvRmLB&;t-={vSTvW&Xdm5-wdDY5KX1%(f#&={Zdh(td~VO z@Ws%im+aOkZ+E)W?+V?j1g*m;v&i5j+-b!4VP$5oh7VuNSZ{%_ywL<1!d(<=({N7r z9qX_B2mYr{>TD7XZOF*_zmPjO83X3xTY($io^!&5m zKWJJ2kDw0^Rt@l-Z*;!vZ4^uD_rT{UVeA61`ELHB8}KlrM_*h#lxc-P9FKo{Srcv# zku2CAd@{c}hhnRKfm{o)CX2NC(CPY>0b`s8YcpaM>$qGF^D6iW>%${01^PzF&LWoZ zQ?Op3THrau1+rwY0%p-0PYb!n2l;%FZJh+KmU!gP>U2b}Q{$yDUxF99)&^{umVIqk zO!dm4$&L#V{z5Mp2XNPyV}t6rUJnkEk+Ygx9e>{wobUHtU};Y|ao(dOl=xqtkacxD zw57a#yoq9bRSgjo>cPduX{BaBUM1()8M+jkL>BCk0TEG)=&v0Q1w_%N8!YQuz_!dM zzBJ~aMcu*;F&-E~Z^qtN)xcs@?=Pq8vhN-k%+4)D|Ey99T~muc1Zj~jc5hNuizUW= z+})(DcAAI*6wK+o$o3+R&cb>3^1%kJh|sx6djg3m10oZ0E|zOzQyR^a>rmLHCb4Zw zcN1oVi-L#}qQmqin8*O+q|;t;QCx6{QozZRu>CBqJ$U_*0JX?t z*gre2w(7((-EjA`)vNXmbk5i($@gv}Vyl`f5+D;~WB6?zn0^GhZk=eiWb*qt2UBBD zwCZ{m-FR&nRK6`S7OK6#FEGn@tfTrperY|KzkumD+dx$u)5NUg;JA`RCU|Ug!T0=g8#|PvT7j*;rx8ACuc=+5h z(_E@==)Vb5;$ae^6PFC6GGzJ`Y2|1zCXnZ)KQO+rh!HC}a5lC-{_0lT`xB`U)i(nW zU4`T&>1j4(JAU{iVDg`u^Y5s71)TxWsr~b}V!_>3|4yD$`4zOBbvURK#emrRrDBW< z6^}qJc-dplFn+TlZC-T+_js+#_Y)NcK~ukD7&BhQzzu95Y3+tyVbTTueq5zy7o}R~ z*Y<)=sT{B3j}F~LmOuGj4&0b_kPoWR3Axf zj2uhBjdP4Ra_2bp&=;HFyZ#o=V@h_C zs&mPgGLb#9Or0_qcHiW*`%GP8X8*4zeGE-P5UlyDK~+E~LO_rgYON9ugiCCv44bTq zRZ9bJl{q~laK*L~CS&mtY~jkLNYV*_?_})lH)NIT1w-eDO7XN8@RhU-y!L<7fns%j zfcWR~D{wVT;$g$Wu-42Ppa=16d*y9G!&_N+N+LZtui#gd7TvGfS5BAz)@=MPkdT;r zIqf1zsv%=6Z^PiM#SJ;LLoHOH06kGdR;F+BYvjw4%E*S^dee;$>qawOYNw)YAQ4P; zs#r=oMmO5EfOHo~?Cu}S+RwV_R|jwB3xxFA>*ppf$qQ8+J^H>3-4yM7;`lexD!#|~ znEkcol{%sf+D}x@ZR(An3%|VtZR-0)Tt$48a$R;Ee3>jhYz;(#ZJJ8eG(oFiV$B~jH=P94& zy@)0MeORM!IlY*Uahgl_1qd|izXdYfyIuZr6JNF%PC)$D+d9F^{i7jDVJZ7K#{oWp zp!4}>kh0Z~@Awl`OGEJRC4HAPM4KOl<~kde z8Z8(7=7=%j6m%+~1T9OjGboKP4NsD>UzxYM{4v-=db@XoxEXe*2B#nRH_E(`7 zWAr-LqzJho{^WCl=JI!(bCschejF6+pU-J~?)OFI@FIjZ{@uwu6^(>Gy8F<58yDe^ zIcoUyG5g`+$hM7YIk$MlsV}YbbZc#yxIDBZC`1XW)?#^3OG$HZH6Z=Dz6%6<4qwv7 z9z|3~5IjD-4K98uy0PYNTC?<9YazEN@21{ z1SNk-lpfC}Ix{4?z#+W0s`I=>uBD}`&EVaJNk=v0dnOjcd{~A z!8GP_k7{Cg{eU1x2Oc<;qKEyT@|`R8g>?3Bxdc;w+G#FN{jAsBF*$cRBu(b(yl9Rp zQ7?WL?kIxxA4j-fG+_Y2dvR38^oSIOXh_*MF3QSF+g`S}tXU!aP4nRek|pxY0SaV@ z@ZVv<0bxn_uPnr?fzDMi<4cTl#-S^0T4#Z^&y)cfq;D&}6(A)C^Wx=5wQ!3ZLq4{5 z_jy?4E-iO0ilnjXRy#zkp)RhxMeABQvvCI{KpuPm^D6F$1I9r_cyJl+trb?OVWI$&i0GgC- zmfpzh=_s4S`{W;Cr(ChrloGZg^O04BcRdDNOjqmy62HFL{WpFktHQytxMTc?Piss4 zHVZrN@LM%<`~h4E>GBZ#^J2!D9zns<8y>?wD*~4eqd){*A-`FS<~m1!H@ZX;#YYk* z-G@H3D#suT-uK4%=zxb~23mM14iE643b;+${qpbw)KG+eT*&}#3Yin-<`63(H@Xio zHcdyI;QaC>(Mhx-(nxQK$01Mbht2Ym=Ezm^&(@^!`3mUtG@ECbs>Ap)Hn}3AlO0L4 z=ztFTMKuT`RkPY2>7l6_grU6~Od6@Zh{b#(D=Q98-#t?LP2pAOJ{UAgo=H{77O00% zpXnP!Uxpwrh)b{QSBK5%O5qOh6LpenPupKW0Ix0bwmyqTcu3^wTXeS84Fr&H z3?Sr%%f|!hG4Tl^F(~D(DhW%}d4H?mHrZ`lEna|$a1Q@JMp3K?SZf#Bl-btiH1YMZX7B%x=RK5aSf{AW2DgZ z!a9xVMWdR5xNBrlIY7+3lapD=0>zeV?aA2KIeV?Ka+@3f^&vU_+dmiNl;#%SV>9c_ zk(*2iO^S~PJa-F{PU1;Jvu3}Gx`NAH_YCeavf%=JtFWhVvccZaeVmzFbP;m{j~lt> zowAy{@`Y%G4O<9Y+8r>w7Idx`$H?X!CC!$7U6NOR?e|(3!P)fyp$PIOS~2@$j?wKF zw3Z*`eM9^hw@VWpF?Ja{RvqlIrwm2a*k|I=_D2>0l1Y8SPi)fU@Q+IcW zk3y)2UGxQX%PpvG6BMD{2q_uD@?vfuZrq(S$8PrSWMX)iZg3fZT9CfEM(6w6atIZ9 zq)7X3OwYOfp$7BXXM41>DBuq9ItApb*jdUV>@p$|@4GNJvrgR&PI4r`~Elavcm zi*kb=ElUhby1Cu`ShNz&xKqaAJk(An1AR`gT*qfJbovgoF5hdDfN_QV;rG|~Lj)+r zh8#z4i>0w%6EMD0`{{J(&z#Kc!~{JwYQ7rJb$L)0n${q<64A9^YTqK%p8B#-&S@AB z=H|5r%j>gY?*HE4BG48dB^x-M^#9VM_UVzWQ!&{yDy*a5&&CJM;}Z$O=wu>8mBru@ z`}7zx+6?If+qAXBqgtv&^0_T=Y3p$lg$I}DXTK?2+#bA(zNc%8HzqL^FthjfHwwwW z1DfO?B~T>sdIC^VYE9lKut`3uQK&E!+=8!a7B`muNL3yIJ0SG=y}cgTt(VRDw>1P( zN`|2R1gqBPuHUxX@Nqe=o#uA~zMH48^t*U~;7Q=!Mw{?5JE5=N16ptdiTID_<3Htx zA?s|HMAR3d!C&XBd@dX5i^7O7is7 zpQy>NdeQM2+MVpLjv`~>SBCOV)l)PtBnZuI60#-k&n&`C0BTO`aiTZ*8~NJXCBErh zc3%_PZbwn)e6d0MPE_J<-S@EE;qJ=bV6VpL?Kfe%f66YGQ8g`m3bZwzf00f0Qp~X~1THH^V=hAJ)ylp{xwOVU z!Wsw*LDUe!k6Bb~X{eoBc)l2>8Yg zY8ZL?G)fb|b9b^XP%>%G9cxvT27>kOqY1enS>rpCrFckOYf&dp(wQa=TLrq9XH)4q zeA$XlVU-s+xQpqF$h&~55eDm0eH5B7ML|eH621S_eZBcWsf{|HAVCL>x=VDHtimPc zWw(SCN=H13PouCjG~L`XF-Sxb!L>!pZWC4A>MXR|EQjX5#(?p2=FQc>xhw@7kI#~i z5^NY}3(cK-Sw&k-BRBHy1zl(yEC+x{8vPePKEN=~M4t$ZAyTpce3iS{yGeED!%D2F zrM!gHL^nk*vVyqNCTepdl#R|r&BY;-I(KLFT-;_LVGK#MMGua!?>e3`%EcrAa@$fT zBJ977mj4P4LEJLg1%@G2PNUM@$kGNk_*j$CdqsXl-(%etSbZ{uDM8nd5@PQgzTUw0 z)H%5r9j)_(UR=pT7YZXH9;JxD5y1QBui!!P<8NEeDu&s%z4E*yoWEtv&0}M=*%K_K zBaa7ei_pKm_?--E859!yKRR-Dp@6;&EKe9^c%7c@%vyJ?I7%a?x6k`A6b!nOR(No{ zE1B^oa0~2}bk%_Z=6S@iCSXc(r1*e_0tQyUQzuI}-uWTyAG-A=gK!p(@1y4!HK{gr zTZ(8frs`ibd3^I*#A6|NQWc#ix@FL()j^pPIlU%u0LXuWYi6~0P@oIq3(sFp6q3~K z#==OA_D{QE0c-CD$F{l;T5%QqC4WmG&<(umc&6>ys;L&IIs*#}UOuHg3wIsW1e`+l z+*pl3R1&i6==1{D-)S;~;fmTjiTNQJ`zTuSk(bbE{8IGLaZ7#d7gH8Gs=TW3g`0g) z-?InHW{Ei{i{XV5OpJU7B}7UQDZAn*7izs6m(HGnS5YNXoD4!Lkn9jGiNYgd6fm%A z?y1k?)V%wiJ3roa;Lr%t=(V1bO$DQ5pFoBb(x>intR=TkF<0ViER}pdYqGc}08DnX)UdqSk0gZmE_fPr(E!*h`@24E0}4V4!VQ) zEs6Pnz)Sq@N85r9hWIPn1J0GMko%^l2|)JYVzP=d#>aJ~b%{}gTa0GhkDDXUCA3m) zqm#u4Rpv+7^vf(YuBUCl;kIg?0D*ejhZ~^pnXFR`v<~_w+jy(%K0)`+Lp~qsH_2V} zZGWx#@J7{5=1k~qqBP3F^PSgb|{85C7}y?yKwfq)(jXI?bX% z#_gVsFb-(xiPOZhp>ol{NhVtM8_TRdpXX$Q)1Cw1*xAY9ucX%@>yjq~Qy;`T+a~<| z%zl#!QfHH0dc3Y6<^Ch&`BZeC{T9EorjVWI;$Xs$7jlshV5QStRp>V1+mA~Hq7T%u zdfPRwtm<3CN%5;KX*BYe1&`Bu<*?o(UTHt>`t#yrQ005>NZJtS*BHEHwO&DdU<=xZ zYS=dERCB^0fm{g}e4*Rrr3IDQ<|}GnyU|YZhipCSr!ZXWwv}xbYNJPU4kFsYKFO&5^U$ova_VpO9E*hp%eL zPV9F}^41^G+E5mN5-wt?0+#@1=k-@TM#)E0j_pUx(m&`LuPNdd7Y^aVJR25E;K2K+ zLt00xu`Iqih2W=1T19Budj^F}Ti()YAVe@sbqxyl^3h|#N}^|rMv)|=dnit;0TECM zVrB$DvT&j0w{S7GP&b>;+wq6-N&fCo)OU@Xo8ZTf>SFDu0OR04IVk11!ZbwFj6Pw^ zUoLtKjUEeRxsDEql1nBHrR<_|{A6pdo4oGmn`K_C2v6?TJ1xhUz{BR{!wVcvs@keg zr0uMnzE$0JnhU8+W9g^at)s?#U^A6iY_h+Z%=tj}`A|oA*fbw|(iuj?HKr)GbXPW+ zj88j8V>oH2YM)IFit8TJw45V&Z_;Ud3tg*VH`ubVz2?y{l{{Unu#ua#n1pD_BQ2C+$zJfzlJuH{A5t_!wgmY)kHf^jx-~ z&8_kY*(*0^tu}VqI-SoYSbqDs0T>*P$SW3`MICTg>o@`mL2(TlyvqjWa?psrEq zW0-IMOQyNsX0RMWOZC!AmKA4wIhfyqf9pG#n;d#LiSr3-lFiZ3anfGi;;6uFVyAhM z>iRCY_kK;JbZqoBL8yys)tgQMeGViU*q!abestqrev-NEwV*z++jo8Fv%ts?ya2%Q zr|Al&v1@3#Sw1?zloxHBx)Si6X$pB#su4dKAJFmD3Q4sc-t7X8gh=v*jxU0OMTpARxnO_AAeO|iH6Xl5Es8UkTA3XJ7>u~g{SrX zqY>0;seGZ1&Ew^Yd}tRT`b-TdFNEhU7Tf*XmpL7dFB)mXiy_}5#!kMiJe2xZ4)CL1 zjV)K`$aZEP2v4Bgi2J?E7}DuSm@;S~jSNITfDf2O%I_dVb8$^)92yedr6lrI zzw6wOl}wN43#7W|!{g{6M7zO4rcU#DtyzvP({^WZUkD{q^{4h-M#BwpY4m#G|B+QG zv#!D9J|9DRxJLe{bc4{T1kI*J(HZ!)nvv1s+Qe25a>)0%$IOfUKsn3RF z%#vXD>gzXw2gu)9HEevK6qLn4=?QnC2B{ROy^^r^8)iOcC{8GL6eW=aap^JB=63zB zOS9qGs%M&PFKBCXE5x*E4uBs@Us>h;G-uQ$Tt0+b`ntr4R0t+`Ng2SJPm#zXdM1Z* zFm}5=kTB{@byDj{|8e^COZh^hyTxAi28jGJ%xI2O<6}5ar&9uJ1AGhOB@qDm6|oYXA`$N-30 ziAS-EB;Xb)6pfLI7zyf*MCj&oH^lHJD)3}9h}8G}MEXms_}*!<3V!yoEZ^cCltek; zO(tvAbLgB6TU7vD6;rqNqK{dX=ka;tj^110PU0uJEN0`81@)S8&d&=?b+ssfgK{cb zJWWj`%`sT~J63KF?*&8b1A173PYfV%o*ofxe=rD}O%R-7owqs1gOg)6xO{tu-z^T8 zbB-k(E0v8P@OK`m!cvx8|L9UI-oLU1uIO37x5qn>q`@u@9Gte*FV6i~$~6=_ZEs#Z9w{|dyG}97-|Pc) z4|ZPR`uJ0X(o5>$0jEh)PnxlBybBSuG)K2+t63I86xM%qeutMnLP8NaN;lh^(KpE9zj0Rl#NUPxK0>6=IwVB{|LV_gV?fD$@ zvXj0#v%i^;CR2tcpKOMu8`9pKJI5j+%)Re9=sMAMr+;gOepm_5Ro~I<{e&JR%*RE0b6|8&L#IB`6-kZK7kBn1s)S%)ghF zc||eG7{Jv8e>U#L7r6%U?;G1niES^V#I|VJgSp?5#zLdOG?#0(OSSvoWN3)HwdhoO z9@V_I%eo&xTg())rlU-7a68iqSY?v}cc?M};!_fdylP{x1QS z-(fY5(zK#51+mw_>Iud1KCO+;t;wS}EU)KtbbtOcW0|{|B;_Hy*nniqm6G|ct1BqF zKx&?bHOfIHZWW&weCZy-Yz5g&e|j>iBx&@@a<((Ply5>?boW6d%^)ghoo zfMGhErI|6E3*3jQ)>;Qh|X+W4B+^|8+RY2-a5;*;Ld!{F5>;tdaD;=Lo!{dAHm z1O*9|Is%W)?gJpq+(jjxU7Z6v?wz^i@%;KxhKva%zZomPxriHHulPnz7`+)^5^dTl z9^jH0@;p0@ET?S4~1CSf*I)Bpp=}4h!$8%^{ccz zdpwGu(_5S~Fk*jeie6A4{RMJ7ZnVrBBor+HNfv&dC;&R(h6v~^Nc>cEh1C1f7O&)l zizDyhYD5!sC{eqQ(M|u++Xo#`NSz+61%A(^f^w)>aMPO48}M-_t}{H-Jy! zB%LiHMeow~hVYUd2GDxnX(jHbRp1^5)-v}pD7ZzP=$4?Zy*kkq!!MH3QVoS4+IPRV z^sH|Pdgjm?YWPqCT0`|0Cq|OTls|t0bo5}083^-*eJRMEa6W~TZ5<&A^O6)QA8%({ zs!`+V*3avl{M`L8!XzW)FF~*mbL8dSp@ydVLGjf%KqHidLMbkUO6<(E&xOdoJM%T8 z?qK?)!yq-PS&=~~k1SX@Gh1mARqnsDPvmF!I(HQ> z{J~P&$oQN}xCbg!A^u>T_ZYx8c}fWZ6YPUaOxZr7h_G zW;hvGyE0eEqvURT453B-nVSB(ENRP>>4}ZpWt1IqBGk&UrqyI+%;wnV0hmt<_ycl9WYv zXv+CPYmw4C37TpV7I=e?CE!jAML=V&0@nm5^-^LFH;!CHQQkQseECn9qknmV_P6LM z?|4p^DSrN1_HW=>#fQd--C}pEWTek?RnsQZqgExO+<>a$i>- zn$%Dn^m6?8uyL-H^KlsL3V6y6(rA~%F`g}ti~I=N)X7(xipJ|q5|YqO$oc3IV1$DH zvBhakHM(D6``Bv5yMbmSvLSs5K*j7@@T4sf--lxt$;WHYF5`m=IA_i_0! z&E746hAMJ^7X_oVbNUC*`;B>_TuoWisL_JBD{SNC&FZK12OBEtfYDQv3;+0v8>V)z z*3*l4`bj1rsU{3tTWfkeCBomjiP{@lpUTi{%L-hCWdV*|OP@BpB zR%R80r*`A$Vk!L-xJ|qm>M_hZ}78{$thGWq(bh5RfReoYg=DtnYhu4zA z(t3T8;8$(5$En3bL0lt)fNC|7uyJ*WX8|tTUd5`-W8P16 z$23}JM+t87OZs^-n$s?RYu>UT>%RcwnY3e9JI46>Lh+V3=JrjEFAqb)QD7+ErRoau zdixRZ9`)?yZQCr71Rl=|8ktAE%@^`z%}ti?1q{8T+Pi>2T%fS)5W7%Q|0m%2dPxF8 zf&ZzBLJ8UF;ZWSkuRH#}HSZDa6)A15y%|h^OeNmH7MO5h#!W7P(o++k)5+aV1ik`5 zkOD7>;o7SCmXp7H%@UuumO@NsJ!KtShRA=f&xnkR+doNXM<}v%%KHNmKXi6b%9bV8 zg{>YE&KckCVL#Wp1iNXMh2FO@os2uiJ5W(jUpgjU9lXnxwdKl^-gl-JKP)c)2F9i# zGq1lq3Te&5FqFSlROb5usu(A%+8-hd=Z3*89pF4xB%nhnRPC3(+Jn?~#)IQ_;(@=A zAWadPY8%ELcv904HU66qgQy|X4y{TO{?#i#^g)>{WLXYNCKgOn%C*`GdqFf;yFSly zN!|ehY9NuX5(XgHjVGdGR^&l)i(xE`zP#`WohXuU=NM8XCpoItzLa^)`N}U+Zr*tK zhN(W}wxOiCf>5LN2(~Cdb6W#^=y6T=e3FD9fCDaAj6J>lo=QC$^CMB#q8MClDp%Ai zrK?hj+w#>W%&M~8o8LFUdB+fCasT`9<(ntq8v=>mt@^V(^N@==9nKTCEyAsUHT^{$ zRp;oab@U@&iTwt1lM5sTKDU}Jq&-}Q_g0IlXVwfk`yF4s zxLqCkbDi%(r_C+Lhqir|eEr|W`Z7Ococ5ed`NLqP>cv2ku*KA1&tOk)Gk%S3`dtZJv+;22_0Mv!z8Wp(bcm1rY|f5}sMq zIa{qe6RoGE_iHGaUv=Doj0wc?QMxe*nM|XF+%Jm>j^S-`7Fv!b3XX;`0+VWdxO;oWi9+=}>b;EDGY;y4S7 zShNjdlpq@vvv9QVss_^aVkCNXh&{*EF71#Z<7ms+Mma7cZJy}zyx>>eb62No*@=c* zEp!hEvdVf2yJ#ge6z^pi3y3aACLkmznz?Ya11=@ge~P;yKWIXpe4w%VH4`xm4hOJ}orOP&wu!&V04X~6IF0B`NdWySOw*k(~TyTjzX zlq4MykoWnXM6!1XH#FggyrF2`(X;Ct3gxZd*VR`1I#gv2`53#dj69phx{dN6<%!br z937E>L974l#o^2iW;DVip+k;PP8V+k(I#)8r6#>Xr7&GUdoY4?&*@S}h=Lt!4>cJ@#LEvdIDOODqA|lDRxdB||K@Mr$!x54NF=`qoJJ{vBFBv942jBU9HA1m@ zp+H*HV*9Cy$qA+(ZO^&yK6g5{2K<^H6p8ng4~+M%ZgT^L95sT%pz3LJ*t_(MwDSh| zLi-{=BoCD_1us*SnO4-UAzW{{Hy4F{{Nu>=VW%$CvdI$6!Tm&by|kjDKF$FeFr~r@ zTwqzqz*TMo;DdEz%(3|FuBS)q{O#~@Nq)-rUu}$3AzEZzx-!2V6mymTfh`QwIeK6I zlOofLDLF$~Awf(=!md__Qq|FY zKl9nQPe|!h7kkF2`TRl4m!rp{NK^6Eo|VXyi6B5$xOF_cZEpA3c}EzQG?E&zurYbLgHk8lo~ry}f@(e|E*d!bez)uO<@?KkML5 zs9=p791$eGP*Y@#K3nB}Oie&hLkU#oyxG)3sNJx{Oc0od*S=*JZg|FNPMtH8qdgL)*{<9RjbwdvGdWI|;q$Bn2x}b^Kn18YMpFYM5Jz7_ACTmIV*B{ELfD zb}$1InIO&?euNa0fFp3McwA&Hl!c2x(#pJB25()kgL4{*#U9ujVN>!ne3Vcj?->7= zIW&ap?v|OvFFrT#>;k~hI)8<41~7hkmq8c#i@^m!{jTu=w-i}3v>}(&V!e?}2Q8Oh z`tV@UwCLsTuDD+MVAKb2ivr3mh~qskhIB|s2^=8DK^0qFn}U5=Mk2D z#iL~vj7eEpiJD=#cv#(ITT;AVJ(g4;N=>HS*xhD*`QBcIf&QdlAvaf9rar0pf8n3B zDB5HWm%ylc7CO=>yW6M%&)(>hL(Tt4JN58}>lCFt3FVf%?4wUA?>=X;c)U_cQ*Xnn zMD7w%p}TpdP?bU2s}-T-fT#FTubc?I6q5yRsL2Nwwl2NWQMI$}W-a-7u3yV%q(2<6 zl3rrRa`MWcmnZ}N-UynNSe-XymTKTLE_0|5GpE-lE<4dpze#*2_|=~CcxZAX+&!Yf zQBNU;R%!ds%0Lpr%&5o#zNykXKB%_H9)-Z|MYN-BCFiope7Ipr;CI%NR(FGWb(h1q zT}8--fu^UOtRP7#g0@{kGfNiou9+d7Sh$c`^^}HLuh49cZg$?6j@j2?|B#kc+OdP^ z7{f0MdvKlGT|;Iok^QzH=wd;&4G0@z@<)kWj1E`r*()ZqnlI93|2$LQocz=$WC4(E ztUz@pXw=bec)2v@!LcW015~Fh`8hfekWMP%XHBMImR!-uv0~Y<@+>cx-TQq0pz2|r ziL+vOcY2rqo%PUQ`pq0bK4-Qpw;F6ISH76?CFVUk_0Mx#x4V9EN6;-+v#N5j4WF}? ztxKCvN8iZ-8Rx>GmZRH@r}vFExz|7tzt_p?K~?adTitKkrE^+;+Ps_Con5+o+kF1= zxm!2C86wI~YK9VKIE=~CHk;fr;DS&CC%-mMtF{OV$;BrlTf6w%S5KA2oqf&m;bN1b zmDJ9zzC{wedmTDgUT^0-!T)HenCRM{m6%22L>L+|$>WuKAKUU@V&HPLO)43_5 z5}!FUKI%p<({nV6T53=c+O~5;#EB%5 z4ULuP(8kK;*=P}Eq$FS6Mwo@RZE$&k?rzhJ))lhdO5cphJ^prS$lvXr=2QC`;qWHS zuJ~d?_D&%?-O6*>o_o9mub1izf#e+rk)#ra&ITWL&5gsL^?z?^9kXII{xH*g9F4J9 zk~GDv6LYga3sXz756;ZAa;AJVO5%VOXz?Z;y*GI|pm3fOU;4!MgH|)WA3%7+XF{VA z0Z-ULF!0LKSnOv2y`XoRiJFsd6UIRDc~ocqFDYJ(8gzOB+P?#AzuY7t!KRH?_vezK zLgoTB1Vs_R8tbKb^^JkP>?2+yMNM@Gz2uZ#uni>!Z5zL$3u8ywkIH{*sf3%hRKgwQ zLWZx&97%?XtALE=cQ&3ryh00AWBo@7fpHhx?!C8lug8@?(BtM?8P97pAUl8zJ ze>jr{bH*xFlrWd)`6xf?F(aWTQ4(;DIC9p}5lQI*qUl`iZj6#h8oj^PT-m_QVT-cc zW?gH4MNv4kSE~KigwC0%#Jod5920XJ&iQhPQ*8elUj`JjXndq^iSw`X%=)5+f{`B@ zfs-qq?o(r~O`jS%ZdRNZ`AcUeNFfFZBX=!xib{$}uaU9BYpOrqS)Cd$odA^}8Zfgs z;j(s>2jQ)Hig|h{pAlx>IcL$Ak@~4JPCDMv7RttmSOSCTQ;QVtH0ipd#n6lQo_))N zwsNIktvkDo?f7LQy!GuB(z5%&w^wb!ro8u7;va=N@M48|5pKu0)I8dXWn>fcjJme# z84F+kWFK#94)rB~BFpoo(C4Ez-PWaq_q+2o)4tTCBOdvcOmG-rzujy3z7OQQcYD*e zg>@t?pFS>-6`{cua62g~wl;S%u3tZTvcGoNzHHEBWxjk;HmpYwCnn(RKDERt1=Y>_ zvqJ;$<@bR&42Oi?%AY9`yMXgRgJM2+ADYkBalCpC%Hj4;vonbcweXch8*>?EYur!2 zAg4JhTPHSFx7Qk%FLi;wFK+M=yStM+!CjBS;cEInAn4RS)rpI}?rqyfl%jynK05vG zH+!(bxb$4|_oGoq&rYY3T)r(g8s+*^#UGxWiqS6{$(VA3_^m}&^1i$I5>T5akM8=t z6H59Yhbgg-pj3j_fH~9F0BIl@xGx?km%*h{ppw=H9r`yqS|6b{O=Vr*=cO=2`1e=x zz42z^r>N1t9_O8PO=62{`au+%Iol9P0(WcV#siYHJ;mHV=whl?y$by9kplPmGUsV> zdxB36Ii=gX!SjGl(11O7#8_*&_p?0KqU|pmMCs!_L)zeBkST*HyV@J-q0@!p z5fH1jG(d+!W2+Coc*WujQ!jxHsY5h!yd%-JQnu1QtKVPM#R8y zeVOpr5sa;@AFk(bs1!g7yv>TPt_}1^QdL2E&bK+9))B&&JjATMGI%m$LzEppG6_zf z8|>&Ke^`$#tfu7Sv_|I9?w}J(s>_Bkl;Dc_l=w^n)+_9CGyYwYloe0p!~TaY;?v_S zp7nm*(2I2B_@(RZty57vEoY;g?&Pg1UOWyTQi#G_R><4srm-kMfmc!Kwp$!0jSG&m zuj>$T^1u`GG%91X#E`3p#M@0Y6#Pi^wT>fCmT6+9m#kdtepzpChMp2yQ1>|YI>OX0 zq-#R#Hy3r_I@!mcoj+S$J~@jovo7;2x7!i2%EtZgx{4$UzvPz+Mx=@AR@t~i-Ao72 z1@H7?Fe)oz$MlWBtejyj?g$s&71E?`di$8%RI3{ z)4q{IVnOFKG1mQ^?A_8Fw41EwFU5Wa}o-wcB*HvWN zxM5^m$0`UOI$a6J`Beh%TR#|~6a{g>vusG24{jjuYk^M3cZbsgdCVZ!UtV`KjG??l zkB3Q_R+(#gac|-0E4ey0wz!=$!HakIjlhL@rPWCE6XiG(}j8 zf57?LYr2bIcJKfDyfuiQon0n)3(t)QUmO+5QfbGfyd{do)4;IOg!=-=A;6vqrQRUI zw{Lv|?fF_o*T1t>S37=GlofZq3iJ`UB2X@RxJBXxi*ng}5iQGyA% ziAukhX0omt3mL9TP84qWMZvcvp@6v+p_=5rUuN%T#;FQm2Zn4dO6bE_KqmA||MN9I zx)Qv{99qWRm$>K}AFJ;Vu6xUh-TFx-UVxHD7xNM?Y|DE;hkH_gU)8h6m{FHf5Wgdr z96An#HDS=*uUn(gUA$-%O(&lxKhZ}YDMJfj+)o#rN=6|4}W z?(Cvp_lmTgg`wV=157l)EtQy+^G{W~zhPCa47WSrX8Dl}lO@YT)Z+Nzf3f6GES`K+ zYnXaw9Fc5`-+xtY**_mVeD}=c-s{FNH=)pFDF*0q4TFkn1hVZh%w>?b+?PSQpOni6 zqq&3JOZ4 zAth{%i0+gnuGiTL0hWmCd`hCEwkb(ND~4YKSc2~FN)W@MF*RH)Z;sWkxw^Qy>nd}; zjHvCGmup3ogb#Q&Sh3_D$L6E&oiw+P)5Ak)RCU5~St5q0&Yryi8(EWo=M}@6T z76A@DOC+Td+TkoRJ_f^&#<_x5Vt5+jADUhQOv-@&C+(jBD_Z^=3M`LawYL83S6^Jk zw=S=9F@OJ-Kn?hxBMtwsL%~X4kA}#;EO|b6g$5oUCJU)?1dhL*;w>zz=uLu@GSaL3 zcREIl!DYqVcZlKQ+;e`M=P(1n|7n`Ljhjhp$->s;__~>xD(HM@|7e=yD_yZ?uTLvv zEX>pEn@`TV-&zxRf-u({bl}U+6E0Ptu}N?KcWPO91=Dly$>DaOWnG>cnEm(3 zLQ>o=qmz}~GAL1BS7{slLd(0#=Lb}x6*sK-NW|Olew|fRcE@)yy0J;<- z??K>czzZA<_a^Y#f=%)8tK{2E6+TIHc50PHmBOe@rH~>Ua?1Y_O{Z&OlUWZb8K_Fs zLp_dG`ALP}m%eW_pLehXG@um{Zs>5+F&lq8Z}gml#gz0T`N@@lKA(3o9;%n{F^CBXB zewd9%vi@)H;rkxvZ{3#Rk4Vui2rvI1X}+kgui#J1-t|o43UYmgc3L6np~5FlT^K+R zu5jz{!15eeHLky~adni~)Zzz1*>e82$<0E7|K%vdW9ievW?HxJFX?Bbr3KWy%`FKn zh2bTQz{7&}kgO%FMnjlA_trtQ4>Mbmw++?XJ|EtiF(*|CAUsT|7DYBUDd-=PK;i>$Ol{X87dY~p}X!QKy1yzF>N)GZe zsIqK9aerX^qGJaM3Ht^7#ny+<>uEE`5Y7od0xqx^J>I)Y@m_Rqi3h}m|-Na`09q)*t~-0o1v;aGAqKyk}jPo20tP5AFW`QE!OxciVsumfyKub63kGInkAeDZ9wQ=%U2Ps%p=>F_h z`t2#~TS+OYQo7C8tMU(#qSKZ4Jmk?6QvqV_#ECXJB0>qbFy69Q=#y~ld8lq*omhJH z&y4dv`7l77yZqKM1@=^@weRswxySKVdj_AZ?L;xF_B?;(Iffs8H5hGDvh3(8%9U}_^$9a zpg)Eg=?=70`*bEFFbEJVE)MRoPXt1RK5Swmb%?e2*^UW{x(_``^nyf^ z;^^8|Lk!+z(P9@a=Ce(wk2xXcM%PtNW<|VK)Te250}+^CU_NzhP9m{y|qy zHjbe~-%6-FjxSd~ICCyHA+XiTiQR{^OPkS7t5Ir}n$WSvS(qf4pjw5w1Em@^2^t+1 z1he3ArldMi?bgri@s}Obzhv-rL(rwIC#-k=lE%sM&ukM6XnH1JeA{RbI{A4srEoO# z7VZ6TCrMZJeg@MJ1CEg2HT|0SCa&k6>+e6V&7B6}1Csx0;==t~1QE&GqYmB- z=mUMnO#7J4S2~%7f8MCvAYV`%4F1JY!%fN!H6Ue}tI?FyE?)3(esTKYJsFqGoystm zA9#OVC*s|7rIT21Ea%U8{(n5E6GlMFmB#n(C~A|+E!u@g1yJvjstsOc{tR>pc|TwK zddRbMXw_^cNu!s*H58C{%Jpjd!AsH)w!TY}G@wz&&6josP@h1l9>VMgJPM(j!Pbx1H3cfQKr8PsEi}RIPH;uS3sI?^RUq6wc;FSCdE+SHh~nG+1$?)N>E{# zu5Rb&H?a^i$!3D(w&lylBrw-6W>ruJtCP@e8mPz3VVjW{mu2(D8yq|Hj;XPG$3{a^ zzwz;%%KJ8&G6iSQzvk!@%64N~qes8unlMH4GGV2@Q;W-N-8~38wNI^V@Sl8lIi5rD zO6W!z;5}n@d+0d)j4>GHLoi}9)G_}m`i>me zfTm68tE4@T9n3z4d>?lAlxn5VA-(mBB78qh(LKQhx@KUAI%x6TH6-0$hB`Pa=Q6(b@pa{;z*P8I1eV}%c^9`7;6I4xrC zZ{R)@Rh_2mB$g33!f@Rv$nv;g$!Y$*=^d4vg$&uS$t#0VwF0GNf`U;9)c6vak7e{1 zTkbdIrd3ah{1!@t$Slqm01H609a$O7w^W%0`Dj6y6=pUH57F$gdUxVR>Cbtq`Trpp zO0T!gvg?Q9uP=nU=q9E5ISSxL1OMnYK8#paKuv4CsShV1&AcVnmG%J^zg!b=;ylyr zTc+ejidmJz0aXiB9#(FrrK5L~@p}HgJU&lXq3N3bDl0Z0w5R`*Rt=GX&9rq5NsiS* zXyJXs-Ux;Qofx7IK73rih*ZIk~<=VRlW z1Ry=p?8h?IR#sM}lSOao=4x8HWxJ=Nrhez}Y+m~L4}0&#eNx9e0BU)l<5$Ps+30&e z920LI78De8S4>q{q@S464@lvH`Tf!qas2)_<}VP(6>%4rB>gNzD3#4`eDN8YAp%fL z7Gfnj0Z?Oh$nzOZQu>@1X}|BJqV18Cg0c-e140W7biu-K$Jsd4M(s*;lTz)Yge;fsI3N{uuo9NT%m1V09zTJCA-+-o~ux_!!g z2M1OTtz5l@qje0s?xW6t9{nZ}6{;^6=~*uKzfOf1+xx``}m3 z_d5mPtQ-NJZg(8zmc@NIT5u6c?6|rgoOIJVGRdk2_K%0a5Oxm8u88FtEpZZ z#woY8EwmON;dVCk2V`*;REj$sIP1o{Z|Bl{T==Mto@Fo+<*RB{W6PALj?*8}VsCwg zyGE?W?Nzg^P)|O0=Y~Fs!|GLsRRiY6m8J{XExLLVy)=@SW$BUHB?~F~ATm1T+G(e0 z*&{1?riYiL?o-1OLhw!OV7&Nn7t=ol&TQfhZWxR@;FFjddWKvuei`LzM;B zGdZVR1zg#Z58`tozn==P2Mzo3gz4jJbs^`1U$7UP)BY3hO@6Pv(r?~)gQo%KQI#PZ zPFlkB0>)}zeW%ei)RU(3L9EY$20Q}|~AF)dwyREAt zm_a2}6TT^Kmag6D>3kf`5a841#!gq?!S{FT(~6y~tN|#XwC;_f;5eqQz)r$={eZ;X zCr;_FtyU54VgW-v)9MfOCAeg$D2v!_cK!QKU&7@m>wAII)HN%8BVt}FTFl{dBp*>w z>yUr}TICMY_KS&fpA4D2qak0|SoSs+UBFt5C=uk0d$4oPnj+=*xTavq+$90jF2dEA<3bboam%DL9V?66qY$ z(|ZLNhR0jUUpj&)U3+ZtO5i+N1)(ukxEpwXr+8ZG8!{6jWbe3r4MgRZ^?^IYx8km|j+S0nAb7QIL!47Zm5k6;^JbN>C4HU%KOG5qSfzKgGF{~qQt zfElqDv+jO=;Xu zj)&5Nl5*YJ9L(haY^~#E?*?0OhmTJcOzA-#H6G+6mcFkq7Z2L>+Rz93jeZ3l(i6b= z7sqOC0^p6If={HoovZTuExik3K0=+VDiQtn_eK~Z4bZ_uDfLF1L7k$v+907Al$C|G zU9~{DSMLPp@xk?d(`oZL;-~v2lT8Sb*SA-qI4fxA^<4w4g4?rRe3d26`SNV(Xuv@J z*eulBrZS8iQbeyR;w|djH5{${+8n+J)3Ci6f%nUe(5kKw;l6$jf3F!TfCQP%WqWk> zYNO^RK(gMWgDrgu-i}Fe^rMbRZeJhsk`B|{u~zP(AY}qe7|?-A#m~P5aIx-<&P{Ag zHgVrY#Sbe-Pz)*K;bYeL->+RZiuL68YEvu4aY(ALGtW)aBdj(!yMU?@R-14(YM-9q zzp&MlG$eKcuO(oUl=1cOI+=10l?2IPTtpkYDx^e!RW1<`Ju(+uH_1VXqWirc#W*(P z2f^@h&(D6s@a4zv!!3%jf(fzTN{GgMiwh-R4k;A7jw7sgTwdtW>=LYMVK)Q25T~JU zEg~uKos=2BV~Da4E^O~gr8A$PC_vY4f)}rTtWIGLOhWtcN0g6pU^%&<5In-lVuRk! z_)x8{>R<=r99X)dCGKr#%bpf{)S+fUaiC7hMTGadBrsW345-B~w=Zp;tfRhWDi!I6k z1n*c+^X_9F1hlk1gs7sH&&OjP(r}w9QeF=;gb;Klfoe9oq#1ycsssl>Qaf$k8X8q* z3XYA~4g>k_&oo9)?af;gZ4Rws<%dQwR9iCgKrkl%=)3waCM+XtR(w_}t%FD_S? z$_EX<20j`afSRk_^Nu^_Z9!%14RA3{q-3+bEUcBwFW?h=EAU}F4*cTDX{Z?DSWmC0 zvr$z1kPd2;IZR+oIl3X_qe5SUE+hTm*0`h}4)xDyjDciMe%RfN+?QR4?Sxui9kQYn z6X9Q0f3HxF_+U0KUF716JM-l4UsF$}|87yg5a`c!*uBIw3h9J>G@;yVy<|O=tFC}e z(2Tn{0sBL(!RIfeE37_}2frWVxIdtBEj2ihGyAoBexhXc)-68D-dMv&D3siC~8Hqbp#H_vVmpYq45fs!UU z&}ch+e`d4&YAu_(RbPe2{K<1p9paG2nqr#MVyF?=To^;a6Cm3#nvgOb>FRbqItpYw)2f?7B<3;3>f%S zC3ht)LEsn-(U2$FGB4n8{Yu6DjzQ@-=r;X`QP`0^8CQKJQnS|aIF|h*E&Ykll94k! z72LT>ap#FB59T16UTeM$WJ-JWUK@3v2RFw%5uF=S_&rzL_XQ6Zt#$AbbZXegXLuZ) z(vvzJrkxTqK-QqCu02NZtfbXDz!Eet6Q}iav_^V^vM-;{J+xdK%y)megO!HMxxKzm z18SlkW{*t6+8lAxE5py1o;GWP%e&Wcx^Y@-eRg{jnIStvD=)-1^k@31$0ntOPq;S? zws-t2s!b~Wejz`AY0I0y@dSo*2qHr@@?5=p(Sp*>-N_Pyv`w)T(Qk#-F9q)U2zHM8 z*-0+w9bdq=QyEl4H6t8T4Kp?k?S&T*c3)0Zr%!yY0dFxM0&An6s*dK9OYyaF2`IrzO1a?nH+g zrUHymukcMQR6)qOrO8gxxJ3ik9-@6=@&sq0G#3BOz~Q$Apg<$8zV%kdo+Ne)4E92* z2^EOwOQ&799iFIC6#Kv-Tuj;j66=578x1xRUp`wn3u`a}aq)KHam<#IyG$7n!f2|& z{*tM$8aXhZ$Un})?2jdCqK_m^a0JU!Au{a?Ulkua-_P9VQ9EG{&=2Y=!OGUk>U5!U5JQlaWi?eSCtw8MndL)Pi2Ac##Q^x-qxL8Jf}(pxjB7&G8HD_B zm5gu5=xV=WA<~YRaKgAvlJY|ZvvC?K?qQ-%!eN=m;ob>uZxV%k_q=R6%^;g4;fY8F z?1b`kC(&wjMKxKZgA||kK^Cg-N03MP?Jk`f={s-y%53`RUtVR=JdyeQhK{}-Rk5+10k0i3+TGkwf5+%9U0=j6}CvDbf240{29l&OAx+M zJ>%0Yc=3gxGNsJKL+O_29_@qQoqPb2NElpOsw3Sc0^s5<>%{i!jp|{zq=e@gUSZ>& z8!`bw$M?P$ed;)m9GeTaSEc>x_MQLjt?yYhcwFKgmHpzu7S@oIq4##+&NxnKS1qHwJE3O`Q1Mp5dno0f6Jtqo8ca4y#7UO|q z<*QGLH+<<-XzkR7&#mx)0dHZiY`bU$pRNUWiph1}_)ZwF%dNp}n_g-@0r;97?g~4> z{BWk^>~P7S-TA{PCs?WS)4HzL0pZ-wAD`Agk%E7r(Q3a>($pRuCDk$}yIiHH9(~NB zlBcon`;_R-ZvX!NqC1Bzxybuh)LZ~|`RXWAyur;jUfPT3r><@9HE)<9O_pM^{K2ih zY~A%J;&u}1%|ihst%qpclgMH~r0jYtIZx_B?J)Aw$rgR1BJxmk zWFtqH4Q}jHX7%_*^T!y?D}tD6XGUBWwg>BtO2H+(+@?7lY5xn+Pn@}yo<|hsz?Vp6 z+V{RL4F8Bc8^vTw&!FQB(>cOn==K-ZNj^7EjTALMYg$6b_w7HyK)#OYrrNjlGz==R z&_hBekwEnBVF4794BCU$I;Oxt6T8=0FySkGFYAeZ|NIoP+e7U!G}`XBbEj2t>v70t z_|d|p+NIgJcm3}5pm8zxOqVNMp7(qVzYKgVx`;K$`nTMdm!+ow1iOM4@K816Wbzn< zVMlr5nS1wpjI2RK| zQDs`C?12v;jE>D82tw<}>&h6a?KKdPR_DN6Ntj(iQi;G>1a`eixTbaur58qJK{l8O zW!%#W#Z7KG{GAHD0h9lO)(~>tZ1U}qhdW0DBh9)Qh zOl$S`+_mR6zI1eRPy2&O-sdG638byKQd;nCnWf&`&i7>}eziJm^AL}a4Yu?sGzrYC zXWK6*Z(CU#U)~z&RU!$i6jiF1kDpa;48HZ!%6iysU;8VpeI$lc`vnkrnej=6ZwWh) zJJ>gjtz?s_p8Bdxo~e3i5SxP=gEy(XW^es=K=5(-6~)>}RfP^n+wnA6CD4*=W@L$T zn1}qXGl*oeqdw&8XxF&%)AgzI8&;-0&2rW}{MJwLP4yskC|199I;f?+NUcNi)di_y{wvr#N)?nvZhL|LP;62gXaeyzFCgYWB9Z%lRVMqnLF(Qm%r6W2Z)s9 z_piQlHrd8r%;e9V&p@@0e=On7406Omzq*wc);6d2K$zG3Vff<@&sbl|gi&=UUG3h}1Vit8Ave@O!?YCdbt)B%!Z} zH%8>bFXEo3Hh(fE7e0&d4I`VYVqJc`;glqwpcBK{SiJX=Aeu9=opDfuoTRcKQp=E& zunWk21HxOFZrP>gA*kLK9IL2wASM1Vp2aTuTD8XBcY5x+xmZr~+WORUvP9juo)x*1 zOaBNlISRsqoyd|oCW7r&gQp@X2mH`NTh3JR+%#6asZDDsE_Cyv z_~lA;4#rxM-r6M(VBt-80@YKh@77PcyHuv#CT3h1_Umw7I52xT9~74sHRE=Wq)B%7 zCl6G0qdD`JDW|Ho;IG@^$umHlh*o;+eVu3C`tR?EoAg1$yvdCLVLW9g%94ERDZzn3 zz`_kFvU9JHI7)u41vF$@fAL7K30tMS@s>vl_3XaAPXd!?_12>9Nx-Y~mFQkgC&w>y z_!2#?ra=22U6H>hs^Ak#93YHU)76KY7(;6Ny`L@%M*%arE?1+)jJ`_70O-yfPElcd zopS^joBbZ}VO#2G{!;nq3)Vdl%pcH#`ECBSeUCY8!y$(AEbaQRu$)Uv^^RaWpF1;{ z*x(k!g50vo6KD0Fi|_{;AS9bm=rpRTbHgK^E0NxC=!2yyQSwlLx%trj-XzNf%kpW$ z-BpNCl)4G&0AJ9Wvmo0O|7k4ncI&BZMCuzqM()49P;rOPg14CJPGmQjRDMlMzBy)+ zX#=#M@mxShZA-M{YUZ@okDFJDNs2VO&hX(;DI;(z=^)I5eOV)(@pB>0aACV@TBW9_I8Q_cgiQ%=xa~`D7I4!>;Ke;dnQ^w)I+82q~*$bes>v zkTOd7TQmBZQgAGtGWchho6S)!MY{BZtaIw(o2l&Qz-R`&{FzFwE2Zb|1q6Q~R8PI= z8mk94J+!&d5F%oiIT{j2Iqf=E>U#gLT6}E3EH@&ViGeB_fZaIRKHIQlJV?Y$j?5g- zXl}oAi&)pUbNZGhdzHo>BB9!3@3Ue*14G&i>Sddmt^WiwnXL~UgXmt-NsP~P(>d`! zcl0vgU8UryvzeKv;zx7<+n(zsx$03i!*G3kuU5PSykBZ8zQ^`U&%Ay-@@l>pdguP| ztB+$lr?`{c^Avy%3|6Ide?o{=b#CG+U`hNfRxVT}%R)VPdXrlHxnlwa5e+1hn2r&M znj$pBcgPIucCu^9WYf#*AHwD0Mvyn>+V1O_wOiSbNlcwMe7P}>ofgG+jC!pcV&i

jwqY# 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ö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

YzEhXAEWpUpb*-@Ys#ewVo#s32*V_xD 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 b2?rR?O3Rz%<;tw!@MvbTq%0DE2PK>(y*L`O=Qfg81 z<_<>S^otwrnY%~g@9pT5YdOB>1L&u2W*gTd4Ep3OC_!*V^)At03VorI%;)9&kDe;l1Zbk4| z`}vq(viGx+2jz>cgqcBqw5Nz{S9?foS;tl5B;j1DUgHA4tJQS1`O(yD4tKnN5 z7Q|7oX?yc(@=X)rXGHYWdz}KU2dE-O(-Idp@{c$DcTgFxlO>$ZTeuvD@;6hp0B^q(YTvJXF(a2jcCqoV1& zlh(HBR*irrvOj3)liIYGRedQEf#eA2rDlA;WxrAT9io$=imbD7hpq~FW3za*5Ov71 zClY0>W54&h*P&U4PSmnu63Zn`ajX#}h&hqqnAc<0=2QOjqp~QN1#kT}3t@PJw4sXjCc>i)T z)Eda}kfqo)^#H=9EH7hMyyK$26YX0HO zz(!hfFOYoE-7Vl-b3XC^0N<)*EAQ*vxCp~QF=PP!Hu@z9tadiBDFkfb zIA83>o=IS=>KpvmRVy>x9bu<{kOnAJd3GR|TYBz4B$W%01YjF=lcH-XsNnlndsZ+n zO)I$Wp(%$vKjo`_i{*Zsi)#b9Sv4YhXs7MR{Hxw3cE)y6L6FNo|Nr_|PwdCiB)#t* zV9qEICEDrD^cEfXjvbton+V@O=fn5HfBkJJt@0$9J6{Qo-E!g@ef3fSF zMy@<@u6VJUYW1_Q_8>^&bf)?Fe6G3FC1WTThf&BK4ChBDrkunJU`5nB&X#<<(+{6Z z`8&0^q`=p#XLoC0e{F9L&`l@|@AW6mr3jhK9<1b^O;E6lb&UzoKLK6hhxgwcL|}HYMebWy2eRx=4_fl?JO|F0ecLFM-c$OE^O=j2)(M)>rcPB zCY0nyznXP}r8b>ho-*L_9{4>rH{Ulu?(XEvRf^NCrCIR#^J6u)HK{p zJqxzb05z7emVec?PnsFA9sMYL&0kFAt1_& zi>L9=B~8$Nukkr@u~s*$Mo#XC$}#O|#=M?nP_9=7H_TlGE5A&)KLSK)T%*QK9*zlr zG)#)WrEw{inw%8+dELHl7%;7{c+(;Zi_076`T4^TiNgBmcKK9D7Tyl0*B$twgdq&Gfq>O*mn2aLjZ8AUrVi`>zLZ+1K~E+tIVLS`We40^nBdy_(CuN)z=4KXv)3TMY_2!*z2teopR;&HIB+OxV(Qr>7s}{R8PYC zQNwJ`2Sm;_l1>lYo#FG5tnT0G-fnu^>?H}iD!=%#(%Z7RQSA(k%zZnfDt~K> z7>F&w=p^++f~5G4pK9h}?HZlX;S>a@`!lio`2CxcJ++jlCxgBnY-mT{&AcNr1_50v zXWsNmOG7u`vvdRbA8g~RuXPt(wgH@iK$!}L?|gJJMY{MFFNRectW8#cW6i$2JvbET zNnZ>Ng7_F-V~HD<`0&r3Rup!4r5XE5{S6a#=){O0eifL*tf3ygBF6@;PC$|H=>hg{ z_FmRwSAR{#{@0_rO8u7n{lq|0^Fknbs^7EIa)j*g=`@sL{^g6I6><)BGIYVWs9=Vb zU$SsHMvd46e8B5fHGjv=l)Pnx(MyK8Cm)Q&Ne zhCa#oj*9TY-JX|$^cR_JKT+++ zalu%8EEL)A`%V-GlkFkHhT6^uOJl)&0kJMmTm`Di(Lb#lGA)j@;J2)J?e=P31Hym!EEj zXR_P!>QaIo3OIjW%8a)V#OH7wCD6V`gi)6WrbCvHK~;}`w~ z58t)U#BN^RS8a5=0?*b;Nx-BGVhP%C&I1}+_mF}+!Xnt1%#1UtDkFNuKsq)dC63Ja zUgAGTe=f&<7)}h@+SL8QF8=BxKS4>JR?JHadETab%YMaKr22c|pS0Ny`u|ofDPK zaN%{v&~VkYshIsfY;-d9nq@juI{ z$wCFnn+gkJrV7eC3k^}XWSZoSBVsJM=ESxq4BYsA&?|>kHq=2nsAr)G)xY;sqR(At zPFuES)MJ@JvdJUyt5D<(iJRdeXUYSN&_$vp^cF zx{!XeCkO`yVBO>1u~CQ6oXFmoNQZ<4u?ag*?F6&=6w3iCjw;mV2d8mP81d~5i?bVW z*uyb}qpGNCEgjaYVFK5&L!0-vSjD3Lv%jwjVhi&lB)4_W9L~ylxcl*DEEva+Sh?J2oAB~OI1Pk$>|un+y0 z5?Nh?hkhQfbkql|+d?!dAsy%GY;Mm{c>V7XmyL6FL)zj8tE#-u=~;_mdC^R9&ql_S z1*6wZ0#s&1b zx7a+IM{71U!KW&A_zbz8+OX?SIdb?_L=N05{lHu|T_z>v_4Yd?YFtXMMnC&cjhNwK zP3Uw)9WhJ6aTH*c;U%`Yu38qH8K0xdQt2jYOdn#Np-(n&9@C}cBe3FcLsi2Ep>8`| z)Q8yRjh18ofbhhYP4+2W!Pa!p7m?RR!G@`NBfj@;Nr|5y{qVSsRas7wZZhWm`7rYl zwv?E=#&4;K!+++?+ftMt=&eEhCVVi_NPh?X#&}1DNfB_zZ~=y44ZqV}EvO$cTy84? z=?Xg3GoI{nHH-G{4mRw~ZxnQ*kM-x7A(T?ok^HCUo{DWGLdcK1!gx+wt2Qb!;UdP; z!_Cvup9C#}@!%M#iabZ$T^ibdXNQaKEsM(E_&TyjMc{s=*BO-!K91Bq`nQ_tM;;x- zL8Zd`sQmo*EAh}AzzdQjn9Ik9=Q?s)_|zb|6;B+dmc@_VH`1ftfRX+Kx{6z=SPBi~g_Z4`TjjAF91+j#7;MlTLLWP(-!?s2~~1X!$=1s9W9!|St0WG; z63l4{=An9(=ZzqtV@X0`SG%ETBcb4O(BR4*=fdjUQRjycgB`RY5nUz?giIP+Z#Vr{ zg1uy&@0udfRVy!`pGgp>xc28^zhdq!Ma*pC2Uw3 zriO7aTLsw|v#YM(UO+3;Qw~##k_jQbel0?sTN=-OakO9mTm5#H@7mGl!zLe*SAeTH zWBy7JX5qE<7UU|{NUYb(4vF9^#9Z-~Up*wvsl5y}JA&B7uO_wfSVh=K0r24ZbD*7$ zB`~neXt_;Vj>9#w7kBDk!8w1!G$Z7}VkYH~@JSURyLCody+XNA$?v~_7BD28p&fI0 zzXy*pQshP-7jV2@ID&Q0OO=)lTDW6q=>69L>Pt6^;SzADP*A8eZsFAbXFz7IF7;JJ z`fG?0&$xz4t?)1&U%9WnwN(t9;-ydjoBkAr z^Af#Dru8-G3Cao2NC!K%@}oh?V99hAEuU|2-J5M8lUJ0FX=w2-W|OU+Obxd=onA6C z(^?NpED!PTGNkWJG4Lv~R8#K`xO-ueK)U=iK_P9R1%?7l?PhYpts<(jAkg*wAxhzK zjgVrNh53^oU5jBKDdgKh;c+vV2g4%1$)lu70Lh|63I&?Ilzx#Uh5Dt*bJy8eobQbM zGxz_M`zYwy6Ce#2;|xC_A@Oh-l`kceuHNz4t>l)pkhcIUNP_cm_b&zVS6!Z7T`13z z`P9opW%6!l5GmtZ?{Km!OoCq?Qb3 zRXtir{TyVCtAvIMq8P+3WG&~D&&cK;bd#+=Tl-+QG6rYaZux%U9fGVmI=U^fl^2xd zEslx6t`9fhs@gi{F-2E7Rx}qB)~Xjf0Y`hTYcDV`!q(bsr&5;bv`khLBWb#eo>vW| zk34>5#G@VEtk&~CQ%IxQ6#9M)R!?Ce6vtG{7X|w&P4!ufq}=;}RwL;F=9x?!fZM&Z zR9Lbb1rD3(kPL|2ruI6c)5>3e;NS09^#TBo{&OD_^AGFmW}X^B?v1B@D1JS-;(1>A z6UT+fqLd0@-fnoJ{*rbQ<1l)qCFsO=m{N_vKIeYpZ(ulbRqQ-m0{$o1YhR)53fqBI$KLMV zhp_8si(yv&x{_Z%B{s8?=`itV2dHf5^joi6xE407Q6r1_C@VC6v0aE4^b+u^cE}6& zC)8%_q1lpM&kJ3;3)8}ah!6UrjnM{lR6U!fg>=z3#V5pJOg8`-sBp!vrB@hxpJQ%b zQGU?bLwY<+uqv4xfy&J3 z#B}xC>LvbIxh^8~h-W1I4i6R2Xe-$Ben<)U?5RA})!;&J&L_Q3l?S-%uD%-qkx}sxuEC&2sdxa*14|Tz^B;u zX`^tAS8mS1#6@<;cUSqm_f}k+q?p*&DC&bFo8)nsw`y{uadxw+BvWVEfTjRt(COzd zkkes?s8Pm~DXq=9ZXt7>V?%fYIz2SccC8QxL(+kqm3R+W%J5xXN8GH<_wTN4v~IrH){uUa6! z5%Tmhu%pen-)|o=lm4F|y&&f;aG>IN5J3zdw(*|<+i!ArpPrAv zM&@bmNXv@Ne6)t^>cECiEU#tUiG?Ca%jLp3eVn52Z+A3Zj}4F7Rv_$hf0WXPtg1W9 z&dBWVFT=JCwo{>)_Y0j$Ba2N^;>UaNjVP8`jlEL|tI1RJaJh!xTu}vbY%A~DgTv)LtmOj{}ny_Fw5clw5a8V1~g(PWQ<=^;1XK!f>e zQonXf13uMkBJ`f>?#AWDJy2SDcmxoZRUfsI&{bgoYb5t=nBr2sKs_@5TXY}@`aih_ z%mUaANQDd)#EHDpl&pDC2L*v_q=Ekn(0%kyqb)K?(tqe+<|yK#YEJ}`TexeCA#RJj*ZGmb#@&_KLOL*^bfwl`o2S^rO;2WT{e76KRHY?w1 z!uv3PEx(i$e6bxeI|0_5mM_CU6?M3g2@DDGy%_SQQruj+u6e2nCJ+Ae;YyIMUQlrb zq4z1Fw?)=>uZ5>X`RvFDXf79{e&H>tqk*`_N}#G>pP%|AkXMlM>*8}le=|7f-V6@7;1`dV$9<+TQVi2NLfHN(O8m)@MAI%&71{Tg9^t%3%s@q2O@RvkOUNP zfm(rVBJ7k%Zw!lZ`IJy0FS1Rt+@m*gM2H`j{xG5+&+6dEoftP`K2AjG9Xb9WCO6J` z%jKhfR(bibz!wkeYC{MY*yhGfD3`UxZWr6kJ`_FR&hN9jpm89J>DvT$N=@IZrrqvZBzR~0a4qr@d zSxc7L3#xg+H~Vhvm1oaBw}rjhlQSKQ3kB171E^!-6C;ovxux11&fvEvpu)hU`I~%V z|L)|_+sD5+7}37LXtv^X!c2fV;`~RIyN0{_4s=i-Nk^)X__ey#$n9A;uBYE=qPKw;PX52=N<*Law2MPJz9HWIjb{+sdx^=D z-py-c$7k+OEtgRJ5V0c3Ka#b^~D=UBj%lX0VH$t;a1P}>KxyO<3-^7IBmVs6e=J4S}-GS}BF z6B@F=r0Y2mvMt(4`Qc+h38y99&#y8sFES~1Plzeih=K- zTEmx4cObDX@0C6C0!bAA{Gh=|=q?cZs+I9K>R$n*H0k;eCwscvzD_SLSfE5%KG9EA zZ*d^J@V>?0M*G-Up=pbuBr`3bg8QD=HcVXzE{5|MEttCyRz*Irf6$)0G>xK-uJeNt zt+>ptkO9wt^PJYWMx&onTh#p?E}!DFIEUy78^teKXP9%>R;|}t+6?2eRi)ZSx3i;& zaQ~$9mkU1Mm3cz3$7g=0kTh(E7OwIGWXG7Eqk>@4)CpILu)fC2w!8;!Sx%kVydz=i zUPMPZ3p?+Ybl{M2FwyJzKL*IE$3MXEwnAJ;LXE?rvcB=QoAEj;tipm?q@9$GE(Db zEixPZzAfh?h_JbDPC8~MP~bJR=bY2$fxd^$k&-=0VVwo?`4|HCy6Gtq0W;j~gx1ju z|BWUqFGv53;#d)A>xg>vchJD~Nhx6q-I6#AI+*2@f~J(LL>(O`0iJ1AYJg*=S%eyJm`B zf7L?2Waht+z9t{06!&tfsT{s&*O}Lmv0;y|?UeXH+5ZDAU*okj0h|w*>b54(|4Y(+ z^o##se0}8x{?qwd24U^a^Lu!peQ%ew-vX;r92}8adTGt`>aKi_{4BRm5*Ed2@EzV? zOx7@B5D~;K>^!|n!eOVq-(HaoY&1@EZu_EL1#gO;FD)Ts&Cp(hq8rh515IS9L=~35 zDw>y0yGp3NemrTe4>z1P%&$gf1(c2Wr&{> zM!F1^nC=h=T8o+!`Sa?+9e5ty0~S5J)owvH2|r;Aoe{SNGz@5R_R%hlk^|^%z+73_ zAwXKc<)E)5l{r_;VOgxlLuT3yq6MS-YSUfzS*+^F`t9{T2~QhO4^Lqx+J6NvyNO<# zpIa7APV3R5;~QY00| ze5U9BcJ?-D=#QXF3oWiur2AEZ1d6*N-VP3z%G+D=G-<{MGWlpzI%VYDx6P zN8-j4b7R@qxA%cIOSwqf)4A*ZCDHKmN$_Ybly&2LhRyauL9CY(z$5 z)x0ANDEQEdO=+?r?^EB}=^Uw$e)wxK3`LYNvE)+zLN4+IIDG*~e)ivc{Wu!|ZaIGp zl#%HCHq*b*RYm5AYxF8Co!H)k3mqrdAX~_YL!Y!6lHCCkpL%(Bz%s5X-0e0dy9(!j zWuGF`(KibkvA9ZPO>=__w)`%pHHGt{o>N(WOlV(uhCEsDBr6oD9kzE6E@T znNrAism=d%_CDL)=d( z*E~LE_QH_`?9H>gRvOxTgxPy01XKe^guUSJA6@~P#4WJL`{x9Fz-$}-!k2%|tkHck zV+Wp20N^C_kgw6ALAR#kOA$Jtfmu~~Yh(rVxNJb+H}Q=E`fUQa*zJmD@UiD}y1C)# zPw=idj+dUeZ$lw^u9T|_JyfN9mW6wW8pKB{ib&A{_Ix;E!y6%X6^H<1g&``Bi6w<=*>?$91 zD@BgEptw#&fbQS@9GJOac*#25u$#gA6fyYb*ufV3gb6!GSnwN7J_@aKr@oW_H&xoX z_f!yA+D=)mj_l#C(}V4jcUV`_Rv6W0n)(q;NLJ zM?tMBZP^ehp2lFdlMM#sqHY@y$?l$zYnLDXus&@peG4x^!K13zVQo!X-3Bi#Gp%JxEp#v7Gbx9zA` zl{IRJ(sf>H@XzHUYynmvIK%MFbI;zw++^g;=6|cBke8&BpBaJG98z%fLXrIDC+?uT zA$^|70mFs?eMSPK_N8wm_nywJ#)t_p{&MG(dR63l?pAw|kBTR3McK#*ZD-4Ugf{_I zUq26(P-XtD-{@ET_O!UWQL!EZCC;75+O?slcO4byIK0 zFJ&VGFaesk4GF>_9kE-^i5OeWvOx*w@LldcY{3(=L96m>{eN%j;eGdHi#(GNz3?^@ z^pU!ZKFc>wj2QTa+FHw{<8@fmlppB>G)D@8z`T0qshT*|oPR}_{*^sEUV-07 z^z0kmD7~IhwU`B?-06Pl)h+qcx-Hrz^EvNndTUtFt#P6^7LcreKOkG*D|1U-oB-fk zR&KNf=>0Cqf=MrO%^dukGp>~qZ$ef5lZ$#rsQk-N4Hs7t0cvGgz?1K@Pf(sC*m2SCC6dZ=( zObyovdtkbzDdqpI7L#SV_l2aJ-H3(fKX&&{*HJ*O`Kl_5T0M!K?J8!;nVD^F=@*rp z;f;Kca72~%q5^c9CuMFa$)nMDKahKld4x{EDlmkIc1GW4P_=ep`LO&oR@UK%l|L)> z&toBH%wrk1!CA?I1g~`sbYvrOZdJ1tz}Yx>yW7~Syrgh$>;ko39+RICO5(}FW2?aL z_xtCGtDFC&V1%}Cd$z`Q7LuGM$|GScutE#4GX6W>!gqsMK-qo%z*RlzuoeQ5J0O#A z;i`=ZzfQTtOn;l_&Le&15nY}}vMf70h`Jo{Z7p4~t15EWc-2QqI~&r(zbiHJr8@-@ zlYM&?nE&89)dXwEl^4RHaypZH$UbcMLQ3*n)A{jy!-9q}a&M<^=Vy~^)F2wV&@o%n z-w1uXecHVRwKUq!6=y4LGyum@By?Kb?t0tDttcYqLq^CoOwXtJ@S?|SPx;WW9eOg4 zPTOCNXiyuJdA>{7fcF+K2+7)wv3^vw!g{XY?%VBJH2a;odAhTAzh}3OA96dSRnz~- za9C(CKJna-v`}<96&K*YaxiwK@wX>ZuWTR78u zW0DrI7Mk6rjFVt#3nt>uU&6TQx}}2N($D6c;_3OFjM7lKIt|3YgT7rPi2vgo^3mCk zPe{vG$TEobA5XqlYM0OC7u@1jYtDoHeGXDZe^4?vWQ6W`J)Y@?n#5f>CIs&JUh(_v zEq!ES*Qayur_v_-fwb%0E!l)t0q)v~D`|1(%imX;8RLZ-%8q9{M)Ba;I)z!MCeC_h zs26AUNdsv4QPj$#Oy&MJ@`YcYpFSAZ;SSJaky2GH7fALICQ<(8PXipIb>_LPE6adY2ts$gEkf zm2$6Mn8$6C^@Do25pRGTf6!>;4G(FeCJoi!Mj=MqbqvVzK81pG&@K64pRX~Mt$%H3 z*gqT$-fTTaRw?F-g~*$$OS`t{l#ISYZYb5=CWUJZ(=m_|fmXoxnh)9yQHoYCe`%D? z2n&;I8ciw1{#u9t&8;`F{{Fw^VaBLS1FD0EH6lJSL%)xTe!N?L<7Mlso>zT?y@Ol| zX?-!4hoyrZG)dTm^f7CJH=FKT9~lhd6&yu$pE12C=r&|{nhtr&+SjS5^;C&?3_sR# z?bat|bMmW8;6$30x>iMlvwKVrTO%NO+5!F?(4-do1I~k${a_X)hJYijSNaR0pDiKP zIAX3$O7{nK2#>ve}BRtb&F=b`P2;~F3QcJf%R)2p$< zAD)0#27SkHlgdvhUq_PCU#TmW+c&%>9@g0NjpQNTQ54P1ErYi_W&FzwzQf)gs&t?6 zz^6UrX^a43FCoIaxU=b3VQS>-VzCh4D}SH~fa2_jK#FdK=((SxYH`dT-eITeei4L! z9wiIHLrKFcPS8(I_fMn%Es7FVV^Y=pg}K5y*Ex3Wh2?KL8oE0NBC;iQ$5rnp%nZ7% z^_@glAT!-B@MNXxjIGAVYdZJzqXV(TW{^R;Mk%k@EA&`>j|Q3tx5E^8mX3}M;} zbkFOmxvxX?rv{(3TVU`~uVTUH`6C@)g<)bowu^I&k-uvsNUH_P`6dcYS)@-*OHnt< zpxw62DM#~tbanI4UcvabX!pIbUug1c@?o$UJ#4_0YxrOR7rg(HZ<1n;SbBE)4$ zPSn+2oS!BHFcf9AREatYylc5-e#(dd+=C^bH@@hP(fhfI<4OZit z!CtTW7Lvj!PZ_=Bx%hs+JD#bOSv-?8t(rY&Aou9VzvEWW%YX;N)>M7yf8v1PtWbQgv87Di`$ne)a>3}B|%brq!z&xPX^F)P44Z2pPzF8hQ9kp z(`ZQRVnj3>dhb)hn>fDl62Uvj_&>8_>>cVEAD6e+$emV>i{&Y;&ENTJO*4_0r!(*k zQ&NWMrdXg(HS1~-M+!kt}nQ!g)@HUEY)=NaFeREY%x4Ht$A9YnArXr714?sNl z!SV-Tll3Q4QO{>`;*Lt({gLgEKt8RqJlXpLsb+Y&*=lvpb9EOD#j6GB?B-$+t5uD4 zRVY!%*LOEgbVM{i;~v$O$UZ_|d;5PCbsdgua9_c_l!_qjB9%C=gm z3a?>}+|eS%{S!R{TjG?mU&&pI7*!&xZDzKss%`4y?}vx*9=E(LVQ%fwtOP2>)Bq;5 zI-^=vqgD#$?=a!zA?)3(;mA7rVl)5nZQ}gVx{1YrnP9+ZV5zQKY$mk|`v{t7Wy0{y z8ca*O=;)};C*5TPP1~Aa+gTNAPc)0=xC=Y%02d#3tpBp{xV56u`FCyEN!aTKk;)YP zq;mz=pjG%1!2qIT+g8&PvNSrrdw27=Fy?1%&83CXgo%c|_otC7bJ@R^3B;pj${$Qv z`{WwH$mwyHOINXHnL1rL6gBi=zemEWbr&eo?))MWw5eQjuT61_MmeYDVq!nUCk=V3 z1Ltnadi5&;z0EFufoG#sGJt20?YTSmUt)0&(p!xgr^3$0kGh`sn<;aNY1-eJhQVOY zkyPAgKCcnc{v!_9ags``KPZcT{h(!VIZN$>YP{}4(B-U0f z1j6fg+2dvTr?2M~nKWGzP}ASgPj2z;A&(Z?J9Uh;i~q5X>J8GHyN$giUkId@0fM!t z-ZHED@3`h)%{E*({1nL~Y`#S3G(k8Aso*6Vz|bo+!u`J|$I_RwvY{8q^k9 z>N$YHV*iWA>QaoH(tnZn7RCm!E|H1vHkX|Sj0#S@TnGZRKo=H(- zJYqTgoqLdjaz0&%Tp-4nv2|ID+huOnu0CscV>Po+2Ac@s>0hL4FxNanI+Jrv0 z7VO~acS>2FNGlQwTaMBj-p_qh!>nI~%4X|$BTJeBt}2^zC9ouCi;L=QY!#h~J6I2< z;O7AF=67nMadVf&$kk^B8sk9q^LdX&V3wvDYx%fiYB-LDIRR#QoR^fKIxsqjqF?;f z9QQ;ymW0$r8X#>=Ql_#_IVUb$dc>vK((cmzx+n)C?VY`{o87;+uKXA(ONc zjIXE1aSESySCikj2@?3hL*;$r7-4~p&G^h&%=E9!seCS4s*GE?9Vzq}PaJ|0FGCcV z`^s=u&Hf(C)9}?nSq+1gE3*jPx4rMZ*xYQhk4r1N(SMldu)k#<^9XCM)kPF}C@_pQ z!=!gq#ZI!4uk(=%x_a6!9YL4<@!=d>)1X!`O!HD&4?_<0yRC(;A%N)%X5TGa#t2RK zeekfcy-^6z_GuO1Mz=2dbhPU`+7dJ z$7t-P8}IMV{W=Rx<5N~)usI^Qo(UrmEALnIk`q{B8g%#f!((}c>_%LH&M#AJw|@A;mH4{mjj4 zxX%5>eja^Kz7nt7K6cX$K@aD4nl-@fOFpFMDBZ>3m^&-FPZmYBs3il^J-=OcUX*NP z%<;yFBG^;J&E#JQtnj1ByydM_Sja!Kr2(JYDWTArwg6fgzg4>S4NYY#K4eZ-R)zV# zJKoyS@eVN&VIXl!){)y|>yCbstJ3y=g6vDYC7QGtHGFaE+6_AQul{@T{<_A(QY&Sqn z#L|Vuyq?k>;aqjie&T7B06`HH_0E-5NQqrMd~P}+{r!X3oceFi#%FPgz(D{j_<*Y@ zUf{;I%t3DgtaL(jpYTy1+#@2ELI?MX@zHN)6=e|-DfHFzNHJX}ybNOoh^pI_>-Xb_ z_3Gz5JrIjY$8bH;tz%@uTa;Y2;P3@7?aALz>Tk!HD!RlU4y zuNuMbvU;oI-edMa(?;T&9KEexABTpZBJry;kdUu~)VVf-q?t(rsg%8V;NgE^in?P{_z{&8H2U1(qtU>tNIwE5n3S@KuZt4i`1-N2Rj*slr$BwTR7W?Y49 z?={;jvnt@UI~dpo_Rz3m1|_2)iX5EiW6eln!k?~cpvNJ z6kFw)>Oc5~5ijNcjb}qhBi0QgW+{1z8$qfA}3<$!iK!c%TI862J!9Ad>K7Uy8AXgAs^CRQHc3!QdR3+K- z=BM)F=`Q!x@c^I9SqJCF>%%%GLj_7xPp9!&;C0vcdYe<~ujI7M8V7@<6us&hKZx1) zXIg|`Y4s#@?1zu-N6UpLCGi=+LJsQWzYRzulERapiDdl~oCP+h<>z5gb~zPBIK+t| z2DM6$=8r8qm5m_{T75UtV2s(G0}*W~%wkXOT;CIXdPKQ1*rGY|$0&^*yy!iEw8I?bUSFr z+8t6ZmYm1j2k5zSDWu5_)pub34c@$NvqTLah^~UJwpPa`Yks&S|rQbBgwu)RqB z_#zU1)`PBBU`vwifWFm_>QXk(i#>+bG8sxI0k2Y?&#mR?H*UPq*8s7J!dSVaoGRlY zp0R3r?>Qcm>Rd&o8`XK(Yi~1JU*VjiLUE$ZmxL8x7D=xU*_pK@)K9D$DV*wS6r9$d zzBKSW>xp$4br+w$HdQ`Q-@Y2OdSd;)_uU$E^o3zrjqBu-FIJgmsDy-fN57o}mW_TD z_>P~)UXx?X11v||e9BhIBZYiJqXZO^RD@eUi|ZBHHQb%MH!ERr9-U=LY9F62Xw}VD z)8#XrBbFsXwaLF;{7~hy;H}WDEs{jU*)E1)3h4HZGwcV1yMGHUf9lN*BH386^sPl} z-Sy%XG(KSE$Hu_Jf@cKJ7(py)>D=I-=ouE&utLbGT!jMRQa(?(^TeCTWftUQ+sPyB z#NvDC=`gy>a&?x6elX5O*jF17$i(n~y-p;x3_-nlJQM9E3)2(h zOzKhWp;UKZ&vX7cvO$`0(6AhyfJw2wAk_}96v2yhpyb;|?y9#t(~+L_ z@T92LiaYnCGo)M1*EGUj*W?JO2?sc0D(}`Hzj*AL26uhz(yZ>ikcX`j=Rx#SgCFx1iKZbs+8Lib{H zV-l9e;ANUeED9POA|aSC($YY(Q5A4NU6GL9uYD_7_{YXs@UHM@bfB*8M$`W{NmQ7P zyLpR`l?X~*H*c8Shu4c0W+I44#n7o&O6VL)kkaI9+b?qO9S-kEKj>VFpwx7=+d)r* zn!kb4Pp&8JFW$w<`Ik?<-fs#0(K6&)2zaK16ft%L+1o0^zkI@0v@pUh3U%)gXHWcY?y7pz~oDR+X0l+$`>stHb|?F2hyw`Eqvo29m`QNNpq?Qj}ek zUCb4e!{$CVlEKuew(z)mz4&5Qu>vS=o$+IHGq->n*5L{?<65Q=3xh>|acL7pzu%U&r#CcG7)#h*NNOn+Lm8=K zp-p_jYxGKQ;fn3DAvgTno}8I>evsg(&Sqe#r!4wz3##GLKT`_Z|9YVAMYmfZeA%Tm zJ%7_=2oP&DSM+duO)<||C^Dmu5LCY?k>KEIUA%uF0H$$Qh#TylSBgK$mun*wTxGm2 zZA>hOXP3WQS7kP@L>0!m_nX>)JbV{Y6t3Q_lOht zpNhS~n*5@i9Jp$=9$HyUTU9P8V()}MvkgNk)mo2vV%OGDm9Gmc$es@COga;V_{{6Y zS;C(+V9(#kiPsctg9cd8H!J2;hAchm1jPE*ac}JpTZx^%KISjX{T__)yz7`vvlmQQ z+>56KCB8)Sc*M?|GK&}o&tqCTn;V`riZ}N^>1gU}WJ%>}eHL;^ZfNg6Qo8iR^9!UO zeyT=oYNo1X`6x${i<1||IL}x5MVblFK99hzBV6CoCQo<+5Xu@v4`QqYFz6D!EZh0{ zFwByS>4CrY#Q0%I{O&Gz{J)&+jh{VTb_n)}wzs2NOcNTcodq)N6Y}oVBE2Dv*vC06 zLCQ?_Mut{^QIi?xdx{x%EIJojI;-SrgW#K~9BiR49pL*JpKdrD`VL_wt_3sad**4s z%8=}Y`iMY3)#B}lw%8s7oci%fH5~PvzR>3sXR);eh^D;8c%TRxP|#}Vumu?v@(@I`v%5XY8wqb{o|6qWrJr5?YV7!(0+dT9-`8IJII(FWv|dssnW#+rajMmrOK!K z4m;MPSCK8W)i?0|%RW)Q*EQT>Z?T?ol^jEQa#x1W#vPXcXpoY0Iz!pS|4-HDs;wQCiUvhnui>{sL2d(5#R&dJ{5Tw$A5;&^#t&oD<0BW~a_S=`6Qqai;7C zbJ~&MMyt%_T!_Iu{Kt8Jn-Tx)g2Y{6uD3im1(^rqX;fFk<^`)1YYp+ZganF@MBD!z zg3sFmMx@s*yFbgc=b>z>$ySHHKZ;o?m>t)4bRyjA0gz5uOlHdekP!-*D2V#0@(T`p z)hld{u+pZH-~p5i@Wa!R$ZV}jkgC!X@gz>eH|`#^mVv?Lm9DWq4N>+db_~Xi#86#& z#sCf7QFqxZ`x<_bq`?S+75h2No4~d1R!QSSa%KB+{6b!{g>yPY&6ta*6lE}-$GT`Mv+TS0pT3#>$M|n9=f9kC~ z6xHHcn@lYyKZ>Rr{JD)`H$z2*yjy*p>r~T0&o`b(3Xa~nyrpV)pjilX#P6#VBx|s| z4OiD+9e$a{iW{KCMO>p=jk69Twh#8+qn!C4N#U+9ab9W?5;~n%&RL7?BY|mZ@v8tU zfdDSC>b*K1$`&xz|C-JnVc(k~EYB!L4-TI8UsC{`%OOrCYDf3u!(>_i%I6aI%p12A zHbSQsEZQJ#%Mhf~7N1>H*zk?h&++7lcE&dbbX&aqI{(TETap(gf#y`f^{STPcAKSV zpr&!?o zz5DGU0MLu%LiaDTp7QjPbo^JdL(0o1{VPWQ#M6KXPY|tBO_T0ynHX5=zk<1^{10or BNT~n- literal 64165 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 O8jv@Qbt<$TME)N~{b9-g diff --git a/tgstation.dme b/tgstation.dme index eef402dbe2d..4764e59fbba 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9113,12 +9113,14 @@ #include "tff_modular\modules\smites\femboyfication.dm" #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" +#include "tff_modular\modules\tgmc_xenos\code\_xeno_defines.dm" #include "tff_modular\modules\tgmc_xenos\code\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" #include "tff_modular\modules\tgmc_xenos\code\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\organs.dm" #include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" +#include "tff_modular\modules\tgmc_xenos\code\resin_walker.dm" #include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" From 77f39adaa643b61abf6deaf45006b5fdae0953b7 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Mon, 24 Mar 2025 00:08:40 +0700 Subject: [PATCH 027/120] Update _xeno_defines.dm --- tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm index c73344bbb4b..98728fe8ed4 100644 --- a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm +++ b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm @@ -3,9 +3,9 @@ // Traits /// Defender fortify ability #define TRAIT_XENO_FORTIFY "xeno_fortify" -/// Trait source for xeno innate abilities -#define TRAIT_XENO_INNATE "xeno_innate" -/// Trait source for something added BY a xeno ability -#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" -/// Determines if something can receive healing from a xeno -#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" +// /// Trait source for xeno innate abilities +// #define TRAIT_XENO_INNATE "xeno_innate" +// /// Trait source for something added BY a xeno ability +// #define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" +// /// Determines if something can receive healing from a xeno +// #define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" From 53af5bb495a2c9480a2d2b7115ee1cfa25e55628 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Tue, 25 Mar 2025 01:51:05 +0700 Subject: [PATCH 028/120] 80mm mortar on the station??? --- .../tgmc_xenos/mortar/_mortar_defines.dm | 14 + .../modules/tgmc_xenos/mortar/icons/items.dmi | Bin 0 -> 1301 bytes .../tgmc_xenos/mortar/icons/mortar.dmi | Bin 0 -> 24109 bytes .../mortar/icons/shells_lefthand.dmi | Bin 0 -> 3598 bytes .../mortar/icons/shells_righthand.dmi | Bin 0 -> 3611 bytes .../tgmc_xenos/mortar/mortar_shells.dm | 62 ++++ .../modules/tgmc_xenos/mortar/mortars.dm | 286 ++++++++++++++++++ .../modules/tgmc_xenos/mortar/rangefinder.dm | 70 +++++ .../mortar/sound/gun_flamethrower2.ogg | Bin 0 -> 28394 bytes .../mortar/sound/gun_mortar_fire.ogg | Bin 0 -> 9047 bytes .../mortar/sound/gun_mortar_reload.ogg | Bin 0 -> 6857 bytes .../mortar/sound/gun_mortar_travel.ogg | Bin 0 -> 16265 bytes .../mortar/sound/gun_mortar_unpack.ogg | Bin 0 -> 16844 bytes tgstation.dme | 4 + tgui/packages/tgui/interfaces/Mortar.tsx | 114 +++++++ 15 files changed, 550 insertions(+) create mode 100644 tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm create mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi create mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi create mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi create mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi create mode 100644 tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm create mode 100644 tff_modular/modules/tgmc_xenos/mortar/mortars.dm create mode 100644 tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm create mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg create mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg create mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg create mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg create mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg create mode 100644 tgui/packages/tgui/interfaces/Mortar.tsx diff --git a/tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm b/tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm new file mode 100644 index 00000000000..d2da9affb57 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm @@ -0,0 +1,14 @@ +GLOBAL_VAR_INIT(obfs_x, rand(-500, 500)) +GLOBAL_VAR_INIT(obfs_y, rand(-500, 500)) + +//Offuscate x for coord system +#define obfuscate_x(x) ((x) + GLOB.obfs_x) + +//Offuscate y for coord system +#define obfuscate_y(y) ((y) + GLOB.obfs_y) + +//Deoffuscate x for coord system +#define deobfuscate_x(x) ((x) - GLOB.obfs_x) + +//Deoffuscate y for coord system +#define deobfuscate_y(y) ((y) - GLOB.obfs_y) diff --git a/tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi b/tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bc13ff0e7c03562c90901db2ff34c7a15a7046c5 GIT binary patch literal 1301 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 literal 0 HcmV?d00001 diff --git a/tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi b/tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bbf908a5d817261c6b9b6357b6286a9f3d8fb494 GIT binary patch literal 3598 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�g&4qfXgiOYLI*Xa0j)P z<#;!)x39cTj#Nf``owQ&(+({j^p#cvxUoE{ij05~ePmsJyH4DCVpzUY_J)mzbDB8O z2cJl*l^`sx^hQv2uBqm|do`AvV8gy$0h%L!vjOs9*}(=4z=s!CiWwr&Afh?5h)BK1 zF|4~+bCx^SriaChMLxys-PRV{ZUrZfksNJrct;`{-xukz!r=4-IIU`yX~B92y55H) zl9eWu?entM1!(Z2hYU@KlC4-mUOYJpRlW!k{?kvs3kz3nlEfyU!YpxWJ%dXnpvQ;g zQv=!XHOcCuGGerYo&3-H?l*5r+j)7*%Sm{x=TMtQ&R3H!d0D@IZ`s7PQ87fVuD!q2 z0S7(P;}s+jqzgVtsoC!fV9O;E98{mHmi-~-qQOBeH7TiH22t19@83)y$M7F-j972U z!k&!p={iwjDS%TBHs6KIYA=el8mQs;>`Z*`lxng5-Rtokk3NUoQ3MX8miLr#-SKU2 zZTLbIpdtGx6-kN!9H0%p)7R`}Zkb*q_?Dni*R)LUR9i_&U7Zz&}1J|rkNIUZzPfMLeVH24||tnN`gdjx!QSC~*itv6_H zDt?SurB_XMXL5$ych3YdI$OX^TXrHj__O zfUN1@5cLcHip76{=6`WD>(0p_oST#6gfoSP2_G?YBw3lzA`${Sb{Soog~iM`wnd{i zwCKt)_p2gbwRV~sj0b-Y7)>eT;+{Tip|Zn>x=N7KlG<~~?XmnFunFX-M;uXmki!$O#7qQ*KI z6td$dTmB0i_+#9rrw8+TO^6jn8DlI!aF=;er!A{h(!hD_M0(Ab98e)K4gWK+j(bBG z&$w5SvCQ~Y6&Cf?dBS2p>d9E(86IIvTTaH|#pzkO!Yyf8kDcPtuT%qfOP%m8k+_rVmJC;Gs6!+*1@i#^p1WFCEep>q;e?W>>zy!Q?zu? zF$Fh70Q}s{&lBT;yv0R;MA!e53tIrGDYop{qU3(w(q{L3{gMW#?T*tWxKH90&CO-M zBaWN#D#K8V`ZyvQ=WrldaFCd+sLk`JX?|wk#M0IiWHjB9FG|#6<;XkG% z2)yjWEXC*3C0yWn+ITL1W+YF+pVYYZ!?Iq|*gBo(FzJI=a^TOFVQ$;&810t@m|wdy zT>ag=xcY=ZpNyz`!>Jz$@2qlJ;f2~?QCmjR(=sN2c?EZlR|zWDY!v_ zQ?ef}h=HWU9h^T|Jc8w-qK9elrA5wi7m=Tke;BSxy%7dk&VnU$jw5o*^_ zM5K`Vw`ej@gg;~6!x!hD4TVl7Nz+T7f3JXZ2x zu-n%ETOxbu{QbI9Q-A_T?tUIKpD5;1z_Pz6rl-YeIq+uNu3c0D&<8CZ5}8Ho%bLk$ zkf_7D`0Sz@q{}G!e`L$ZOKRZ<;VZ4}!<02~qB^wm!f#p>BX6hLK4^2@LQ64hJbUv! z{$Qd>Aen3dPutut;!B!EwQdvMx_#uEPjhg2EcJ zNy?j{70~SNtL%vb8&D3myy60&tSU+Z9%d!KWPBZSS&iLNKmG20wyrvj0}Bgye7sUY zhH;^MG!_E!rArh5m(;$sl_tawe>g^Z*WX|buv)v_{nL!snyIMn2f?V z`;J?6H}0jp>85CPKhj`Vi=b>zf)NF(bE%Z8LDEovZphL{pM9n2kx#3gB$|~C)Yy1q zt_H6V`&)o0O}p#{{R30 literal 0 HcmV?d00001 diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm new file mode 100644 index 00000000000..7c56c048cb4 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm @@ -0,0 +1,62 @@ +/obj/item/mortar_shell + name = "\improper 80mm mortar shell" + desc = "An unlabeled 80mm mortar shell, probably a casing." + icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi' + icon_state = "mortar_ammo_cas" + lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' + righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + + /// Who fier that shell + var/sender + /// is it currently on fire and about to explode? + var/burning = FALSE + +/obj/item/mortar_shell/proc/detonate(turf/T) + explosion_effect(T) + qdel(src) + +/obj/item/mortar_shell/proc/explosion_effect(turf/T) + forceMove(T) + + +/obj/item/mortar_shell/he + name = "\improper 80mm high explosive mortar shell" + desc = "An 80mm mortar shell, loaded with a high explosive charge." + icon_state = "mortar_ammo_he" + +/obj/item/mortar_shell/he/explosion_effect(turf/T) + explosion(T, 0, 3, 5, 7, explosion_cause = sender) + + +/obj/item/mortar_shell/frag + name = "\improper 80mm fragmentation mortar shell" + desc = "An 80mm mortar shell, loaded with a fragmentation charge." + icon_state = "mortar_ammo_frag" + + // dealing with creating a [/datum/component/pellet_cloud] on detonate + /// if set, will spew out projectiles of this type + var/shrapnel_type = /obj/item/shrapnel + /// the higher this number, the more projectiles are created as shrapnel + var/shrapnel_radius = 20 + +/obj/item/mortar_shell/frag/explosion_effect(turf/T) + AddComponent(/datum/component/pellet_cloud, projectile_type = shrapnel_type, magnitude = shrapnel_radius) + sleep(2) + explosion(T, 0, 1, 3, 4, explosion_cause = sender) + + +// /obj/item/mortar_shell/incendiary +// name = "\improper 80mm incendiary mortar shell" +// desc = "An 80mm mortar shell, loaded with a Type B napalm charge. Perfect for long-range area denial." +// icon_state = "mortar_ammo_inc" +// var/radius = 5 +// var/flame_level = BURN_TIME_TIER_5 + 5 //Type B standard, 50 base + 5 from chemfire code. +// var/burn_level = BURN_LEVEL_TIER_2 +// var/flameshape = FLAMESHAPE_DEFAULT +// var/fire_type = FIRE_VARIANT_TYPE_B //Armor Shredding Greenfire + +// /obj/item/mortar_shell/incendiary/detonate(turf/T) +// explosion(T, 0, 2, 4, 7, explosion_cause = sender) +// flame_radius(cause_data, radius, T, flame_level, burn_level, flameshape, null, fire_type) +// playsound(T, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg', 35, 1, 4) diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm new file mode 100644 index 00000000000..6d8b92d6b31 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm @@ -0,0 +1,286 @@ +/obj/structure/mortar + name = "\improper M402 mortar" + desc = "A manual, crew-operated mortar system intended to rain down 80mm goodness on anything it's aimed at. Uses an advanced targeting computer. Insert round to fire." + icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi' + icon_state = "mortar_m402" + anchored = TRUE + density = TRUE + + // Initial target coordinates + var/targ_x = 0 + var/targ_y = 0 + // Automatic offsets from target + var/offset_x = 0 + var/offset_y = 0 + /// Number of turfs to offset from target by 1 + var/offset_per_turfs = 20 + // Dial adjustments from target + var/dial_x = 0 + var/dial_y = 0 + /// Constant, assuming perfect parabolic trajectory. ONLY THE DELAY BEFORE INCOMING WARNING WHICH ADDS 45 TICKS + var/travel_time = 4.5 SECONDS + var/busy = FALSE + /// Used for deconstruction and aiming sanity + var/firing = FALSE + + var/camouflage + +/obj/structure/mortar/Initialize() + . = ..() + // Makes coords appear as 0 in UI + targ_x = deobfuscate_x(0) + targ_y = deobfuscate_y(0) + + var/new_icon_state + switch(camouflage) + if("classic") + new_icon_state = "c_" + initial(icon_state) + if("desert") + new_icon_state = "d_" + initial(icon_state) + if("snow") + new_icon_state = "s_" + initial(icon_state) + if("urban") + new_icon_state = "u_" + initial(icon_state) + else + new_icon_state = initial(icon_state) + + icon_state = new_icon_state + +/obj/structure/mortar/interact(mob/user) + if(busy) + to_chat(user, span_warning("Someone else is currently using [src].")) + return FALSE + if(firing) + to_chat(user, span_warning("[src]'s barrel is still steaming hot. Wait a few seconds and stop firing it.")) + return FALSE + + return ..() + +/obj/structure/mortar/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Mortar", "Mortar Interface") + ui.open() + +/obj/structure/mortar/ui_data(mob/user) + . = list() + + .["data_target_x"] = obfuscate_x(targ_x) + .["data_target_y"] = obfuscate_y(targ_y) + .["data_dial_x"] = dial_x + .["data_dial_y"] = dial_y + +/obj/structure/mortar/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + + switch(action) + if("set_target") + handle_target(usr, text2num(params["target_x"]), text2num(params["target_y"])) + return TRUE + + if("set_offset") + handle_dial(usr, text2num(params["dial_x"]), text2num(params["dial_y"])) + return TRUE + +/obj/structure/mortar/proc/handle_target(mob/user, temp_targ_x = 0, temp_targ_y = 0) + if(!can_fire_at(user, test_targ_x = deobfuscate_x(temp_targ_x), test_targ_y = deobfuscate_y(temp_targ_y))) + return + + user.visible_message(span_notice("[user] starts adjusting [src]'s firing angle and distance."), span_notice("You start adjusting [src]'s firing angle and distance to match the new coordinates.")) + busy = TRUE + + playsound(loc, 'sound/items/tools/ratchet.ogg', 25, 1) + + var/success = do_after(user, 3 SECONDS, src) + busy = FALSE + if(!success) + return + user.visible_message(span_notice("[user] finishes adjusting [src]'s firing angle and distance."), span_notice("You finish adjusting [src]'s firing angle and distance to match the new coordinates.")) + targ_x = deobfuscate_x(temp_targ_x) + targ_y = deobfuscate_y(temp_targ_y) + var/offset_x_max = floor(abs((targ_x) - x)/offset_per_turfs) //Offset of mortar shot, grows by 1 every 20 tiles travelled + var/offset_y_max = floor(abs((targ_y) - y)/offset_per_turfs) + offset_x = rand(-offset_x_max, offset_x_max) + offset_y = rand(-offset_y_max, offset_y_max) + +/obj/structure/mortar/proc/handle_dial(mob/user, temp_dial_x = 0, temp_dial_y = 0) + if(!can_fire_at(user, test_dial_x = temp_dial_x, test_dial_y = temp_dial_y)) + return + + user.visible_message(span_notice("[user] starts dialing [src]'s firing angle and distance."), span_notice("You start dialing [src]'s firing angle and distance to match the new coordinates.")) + busy = TRUE + + playsound(loc, 'sound/items/tools/ratchet.ogg', 25, 1) + + var/success = do_after(user, 1.5 SECONDS, src) + busy = FALSE + if(!success) + return + user.visible_message(span_notice("[user] finishes dialing [src]'s firing angle and distance."), span_notice("You finish dialing [src]'s firing angle and distance to match the new coordinates.")) + + dial_x = temp_dial_x + dial_y = temp_dial_y + +/obj/structure/mortar/attackby(obj/item/attacking_item, mob/living/user) + if(istype(attacking_item, /obj/item/mortar_shell)) + var/obj/item/mortar_shell/mortar_shell = attacking_item + var/turf/target_turf = locate(targ_x + dial_x + offset_x, targ_y + dial_y + offset_y, z) + if(busy) + to_chat(user, span_warning("Someone else is currently using [src].")) + return + + var/turf/deviation_turf = locate(target_turf.x + pick(-1,0,0,1), target_turf.y + pick(-1,0,0,1), target_turf.z) + if(deviation_turf) + target_turf = deviation_turf + + user.visible_message(span_notice("[user] starts loading \a [mortar_shell.name] into [src]."), span_notice("You start loading \a [mortar_shell.name] into [src].")) + playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg', 50, 1) + busy = TRUE + var/success = do_after(user, 1.5 SECONDS, src) + busy = FALSE + if(success) + user.visible_message(span_notice("[user] loads \a [mortar_shell.name] into [src]."), span_notice("You load \a [mortar_shell.name] into [src].")) + visible_message("[icon2html(src, viewers(src))] [span_danger("The [name] fires!")]") + user.transferItemToLoc(mortar_shell, src) + playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg', 50, 1) + busy = FALSE + firing = TRUE + flick(icon_state + "_fire", src) + mortar_shell.sender = user + mortar_shell.forceMove(src) + + for(var/mob/mob in range(7)) + shake_camera(mob, 3, 1) + + addtimer(CALLBACK(src, PROC_REF(handle_shell), target_turf, mortar_shell), travel_time) + + if(attacking_item.tool_behaviour == TOOL_WRENCH) + if(busy) + to_chat(user, span_warning("Someone else is currently using [src].")) + return FALSE + if(firing) + to_chat(user, span_warning("[src]'s barrel is still steaming hot. Wait a few seconds and stop firing it.")) + return FALSE + playsound(loc, 'sound/items/tools/ratchet.ogg', 25, 1) + user.visible_message(span_notice("[user] starts undeploying [src]."), span_notice("You start undeploying [src].")) + if(do_after(user, 4 SECONDS, src)) + user.visible_message(span_notice("[user] undeploys [src]."), span_notice("You undeploy [src].")) + playsound(loc, 'sound/items/Deconstruct.ogg', 25, 1) + var/obj/item/mortar_kit/mortar = new /obj/item/mortar_kit(loc) + mortar.name = src.name + qdel(src) + +/obj/structure/mortar/proc/handle_shell(turf/target, obj/item/mortar_shell/shell) + playsound(target, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg', 50, 1) + var/relative_dir + for(var/mob/mob in range(15, target)) + if(get_turf(mob) == target) + relative_dir = 0 + else + relative_dir = angle2dir(get_angle(get_turf(mob), get_turf(target))) + mob.show_message( \ + span_danger("A SHELL IS COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_VISUAL, \ + span_danger("YOU HEAR SOMETHING COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ + ) + sleep(2.5 SECONDS) + + for(var/mob/mob in range(10, target)) + if(get_turf(mob) == target) + relative_dir = 0 + else + relative_dir = angle2dir(get_angle(get_turf(mob), get_turf(target))) + mob.show_message( \ + span_userdanger("A SHELL IS ABOUT TO IMPACT [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_VISUAL, \ + span_userdanger("YOU HEAR SOMETHING VERY CLOSE COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ + ) + sleep(2 SECONDS) + shell.detonate(target) + qdel(shell) + firing = FALSE + + +/obj/structure/mortar/proc/can_fire_at(mob/user, test_targ_x = targ_x, test_targ_y = targ_y, test_dial_x, test_dial_y) + var/dialing = test_dial_x || test_dial_y + if(test_dial_x + test_targ_x > world.maxx || test_dial_x + test_targ_x < 0) + to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is outside of the area of operations.")) + return FALSE + if(test_dial_x < -10 || test_dial_x > 10 || test_dial_y < -10 || test_dial_y > 10) + to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is too far away from the original target.")) + return FALSE + if(test_dial_y + test_targ_y > world.maxy || test_dial_y + test_targ_y < 0) + to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is outside of the area of operations.")) + return FALSE + if(get_dist(src, locate(test_targ_x + test_dial_x, test_targ_y + test_dial_y, z)) < 10) + to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is too close to your mortar.")) + return FALSE + if(busy) + to_chat(user, span_warning("Someone else is currently using this mortar.")) + return FALSE + return TRUE + +///// +//The portable mortar item +/obj/item/mortar_kit + name = "\improper M402 mortar portable kit" + desc = "A manual, crew-operated mortar system intended to rain down 80mm goodness on anything it's aimed at. Needs to be set down first" + icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi' + icon_state = "mortar_m402_carry" + inhand_icon_state = "mortar_m402_carry" + lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' + righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' + w_class = WEIGHT_CLASS_HUGE + +/obj/item/mortar_kit/attack_self(mob/user) + . = ..() + var/turf/deploy_turf = get_turf(user) + if(!deploy_turf) + return + user.visible_message(span_notice("[user] starts deploying [src]."), span_notice("You start deploying [src].")) + playsound(deploy_turf, 'sound/items/Deconstruct.ogg', 25, 1) + if(do_after(user, 4 SECONDS, user)) + var/obj/structure/mortar/mortar = new /obj/structure/mortar(deploy_turf) + user.visible_message(span_notice("[user] deploys [src]."), span_notice("You deploy [src].")) + playsound(deploy_turf, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg', 25, 1) + mortar.name = src.name + mortar.setDir(user.dir) + qdel(src) + + +// Mortar crates +/obj/structure/closet/crate/secure/weapon/mortar_kit + name = "\improper M402 mortar kit" + desc = "A crate containing a basic set of a mortar and some shells, to get an engineer started." + +/obj/structure/closet/crate/secure/weapon/mortar_kit/PopulateContents() + . = ..() + new /obj/item/mortar_kit(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/binoculars/rangefinder(src) + new /obj/item/binoculars/rangefinder(src) + +/obj/structure/closet/crate/secure/weapon/mortar_ammo + name = "\improper M402 mortar ammo crate" + desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." + +/obj/structure/closet/crate/secure/weapon/mortar_kit/PopulateContents() + . = ..() + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/he(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/frag(src) + diff --git a/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm b/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm new file mode 100644 index 00000000000..30e0dd7ca88 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm @@ -0,0 +1,70 @@ +/obj/item/binoculars/rangefinder + name = "rangefinder" + desc = "A pair of binoculars with a rangefinding function. Ctrl + Click turf to acquire it's coordinates. Ctrl + Click rangefinder to stop lasing." + icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi' + icon_state = "rangefinder" + inhand_icon_state = "rangefinder" + lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' + righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' + + var/turf/targetturf + var/last_x = "UNKNOWN" + var/last_y = "UNKNOWN" + + var/debug = TRUE + +/obj/item/binoculars/rangefinder/Destroy(force) + . = ..() + targetturf = null + +/obj/item/binoculars/rangefinder/examine(mob/user) + . = ..() + . += span_notice(span_bold("The rangefinder reads: LONGITUDE [last_x], LATITUDE [last_y].")) + +/obj/item/binoculars/rangefinder/on_wield(obj/item/source, mob/user) + . = ..() + inhand_icon_state = "rangefinder_wielded" + +/obj/item/binoculars/rangefinder/on_unwield(obj/item/source, mob/user) + . = ..() + inhand_icon_state = "rangefinder" + +/obj/item/binoculars/rangefinder/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(LAZYACCESS(modifiers, CTRL_CLICK)) + if(user.stat != CONSCIOUS) + to_chat(user, span_warning("You cannot use [src] while incapacitated.")) + return FALSE + if(user.z != interacting_with.z) + to_chat(user, span_warning("You cannot get a direct laser from where you are.")) + return FALSE + acquire_target(interacting_with, user) + return TRUE + +/obj/item/binoculars/rangefinder/proc/acquire_target(atom/targeted_atom, mob/user) + var/turf/TU = get_turf(targeted_atom) + var/distance = get_dist(TU, get_turf(user)) + if(TU.z != user.z || distance == -1) + to_chat(user, span_warning("You can't focus properly through \the [src] while looking through something else.")) + return + + playsound(src, 'sound/items/night_vision_on.ogg', 35) + var/obj/effect/temp_visual/laser_target/LT = new(TU) + acquire_coordinates(targeted_atom, user) + +/obj/item/binoculars/rangefinder/proc/acquire_coordinates(atom/A, mob/user) + var/turf/TU = get_turf(A) + targetturf = TU + last_x = targetturf.x + last_y = targetturf.y + var/turf/current_turf = get_turf(src) + to_chat(user, span_notice("COORDINATES: LONGITUDE [last_x]. LATITUDE [last_y].")) + if(debug) + to_chat(user, span_notice("([deobfuscate_x(last_x)]:[deobfuscate_y(last_y)]) {([current_turf.x]:[current_turf.y])")) + + +/obj/effect/temp_visual/laser_target + name = "laser" + icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi' + icon_state = "laser_target_coordinate" + duration = 600 diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5be59bdc70f02964836b609a016e9e45258600a6 GIT binary patch literal 28394 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 WJ{Q+`kz=S|H9=OV`PI+z0{;)pEFH%H literal 0 HcmV?d00001 diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a3a5ee47543a83e4201c08bdae16d0fc8d2f3df8 GIT binary patch literal 6857 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 literal 0 HcmV?d00001 diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg new file mode 100644 index 0000000000000000000000000000000000000000..965e6ddbfa44182ccac60b4e5222a5e7011b2239 GIT binary patch literal 16265 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 Q^0Y3i%qBg9gs}1c4~#!ysQ>@~ literal 0 HcmV?d00001 diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg new file mode 100644 index 0000000000000000000000000000000000000000..32058c8e0acba2b2c41303ac1868c99ea0d0f779 GIT binary patch literal 16844 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 4764e59fbba..539b72c6ab8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9135,6 +9135,10 @@ #include "tff_modular\modules\tgmc_xenos\code\xeno_types\sentinel.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\spitter.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\warrior.dm" +#include "tff_modular\modules\tgmc_xenos\mortar\_mortar_defines.dm" +#include "tff_modular\modules\tgmc_xenos\mortar\mortar_shells.dm" +#include "tff_modular\modules\tgmc_xenos\mortar\mortars.dm" +#include "tff_modular\modules\tgmc_xenos\mortar\rangefinder.dm" #include "tff_modular\modules\timed_citations\crime.dm" #include "tff_modular\modules\toys\code\loadout_datum_toys.dm" #include "tff_modular\modules\toys\code\plushes.dm" diff --git a/tgui/packages/tgui/interfaces/Mortar.tsx b/tgui/packages/tgui/interfaces/Mortar.tsx new file mode 100644 index 00000000000..723fe31d6c9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Mortar.tsx @@ -0,0 +1,114 @@ +import { useState } from 'react'; +import { + Button, + LabeledList, + NumberInput, + Section, +} from 'tgui-core/components'; + +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type MortarData = { + data_target_x: number; + data_target_y: number; + data_dial_x: number; + data_dial_y: number; +}; + +export const Mortar = (props) => { + const { act, data } = useBackend(); + const { data_target_x, data_target_y, data_dial_x, data_dial_y } = data; + + const [target_x, setTargetX] = useState(data_target_x); + const [target_y, setTargetY] = useState(data_target_y); + const [dial_x, setDialX] = useState(data_dial_x); + const [dial_y, setDialY] = useState(data_dial_y); + + return ( + + +

+ + + setTargetX(value)} + /> + + + setTargetY(value)} + /> + + + +
+
+ + + setDialX(value)} + /> + + + setDialY(value)} + /> + + + +
+ + + ); +}; From 87d90b7b17fc5cdd0a0e7f5f5d10afccd1c78553 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Tue, 25 Mar 2025 02:38:02 +0700 Subject: [PATCH 029/120] Update rangefinder.dm --- .../modules/tgmc_xenos/mortar/rangefinder.dm | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm b/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm index 30e0dd7ca88..43a184bf21a 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm @@ -7,15 +7,10 @@ lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' - var/turf/targetturf var/last_x = "UNKNOWN" var/last_y = "UNKNOWN" - var/debug = TRUE - -/obj/item/binoculars/rangefinder/Destroy(force) - . = ..() - targetturf = null + var/debug = FALSE /obj/item/binoculars/rangefinder/examine(mob/user) . = ..() @@ -31,15 +26,20 @@ /obj/item/binoculars/rangefinder/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() - if(LAZYACCESS(modifiers, CTRL_CLICK)) - if(user.stat != CONSCIOUS) - to_chat(user, span_warning("You cannot use [src] while incapacitated.")) - return FALSE - if(user.z != interacting_with.z) - to_chat(user, span_warning("You cannot get a direct laser from where you are.")) - return FALSE - acquire_target(interacting_with, user) - return TRUE + if(user.stat != CONSCIOUS) + to_chat(user, span_warning("You cannot use [src] while incapacitated.")) + return FALSE + var/atom/target_atom + if(istype(interacting_with, /atom/movable/screen/fullscreen/cursor_catcher)) + var/atom/movable/screen/fullscreen/cursor_catcher/cursor_catcher = interacting_with + target_atom = cursor_catcher.given_turf + else + target_atom = interacting_with + if(user.z != target_atom.z) + to_chat(user, span_warning("You cannot get a direct laser from where you are.")) + return FALSE + acquire_target(target_atom, user) + return TRUE /obj/item/binoculars/rangefinder/proc/acquire_target(atom/targeted_atom, mob/user) var/turf/TU = get_turf(targeted_atom) @@ -49,17 +49,16 @@ return playsound(src, 'sound/items/night_vision_on.ogg', 35) - var/obj/effect/temp_visual/laser_target/LT = new(TU) + new /obj/effect/temp_visual/laser_target(TU) acquire_coordinates(targeted_atom, user) /obj/item/binoculars/rangefinder/proc/acquire_coordinates(atom/A, mob/user) var/turf/TU = get_turf(A) - targetturf = TU - last_x = targetturf.x - last_y = targetturf.y - var/turf/current_turf = get_turf(src) + last_x = obfuscate_x(TU.x) + last_y = obfuscate_y(TU.y) to_chat(user, span_notice("COORDINATES: LONGITUDE [last_x]. LATITUDE [last_y].")) if(debug) + var/turf/current_turf = get_turf(src) to_chat(user, span_notice("([deobfuscate_x(last_x)]:[deobfuscate_y(last_y)]) {([current_turf.x]:[current_turf.y])")) @@ -67,4 +66,4 @@ name = "laser" icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi' icon_state = "laser_target_coordinate" - duration = 600 + duration = 50 From 37ea3429827f8475a6c2fe49d2c9dffb4a208287 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Tue, 25 Mar 2025 23:59:23 +0700 Subject: [PATCH 030/120] changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлен ридми - добавлен подтип плазмавессела --- .../_globalvars/traits/declarations.dm | 2 + .../modules/mob/living/carbon/alien/organs.dm | 6 -- .../modules/tgmc_xenos/code/_xeno_defines.dm | 11 --- tff_modular/modules/tgmc_xenos/code/organs.dm | 68 +++++++++++++++++++ .../tgmc_xenos/code/xeno_types/crusher.dm | 2 +- .../tgmc_xenos/code/xeno_types/defender.dm | 2 +- .../tgmc_xenos/code/xeno_types/drone.dm | 2 +- .../tgmc_xenos/code/xeno_types/praetorian.dm | 2 +- .../tgmc_xenos/code/xeno_types/queen.dm | 2 +- .../tgmc_xenos/code/xeno_types/ravager.dm | 2 +- .../tgmc_xenos/code/xeno_types/rouny.dm | 2 +- .../tgmc_xenos/code/xeno_types/sentinel.dm | 2 +- .../tgmc_xenos/code/xeno_types/spitter.dm | 2 +- .../tgmc_xenos/code/xeno_types/warrior.dm | 2 +- tff_modular/modules/tgmc_xenos/readme.md | 32 +++++++++ 15 files changed, 112 insertions(+), 27 deletions(-) delete mode 100644 tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm create mode 100644 tff_modular/modules/tgmc_xenos/readme.md diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm index 9b3ae25f1ff..5769ce3ccd7 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm @@ -4,3 +4,5 @@ #define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" /// Determines if something can receive healing from a xeno #define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" +/// Defender fortify ability +#define TRAIT_XENO_FORTIFY "xeno_fortify" diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index a928fc0100b..21cb7d606de 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -61,12 +61,6 @@ var/heal_amt = heal_rate if(!isalien(owner)) heal_amt *= 0.2 - // FLUFFY FRONTIER ADDITION START - TGMC_XENOC - if(!owner.resting) - heal_amt *= 0.75 - else - heal_amt *= 1.25 - // FLUFFY FRONTIER ADDITION END owner.adjustPlasma(0.5 * plasma_rate * delta_time_capped) owner.adjustBruteLoss(-heal_amt * delta_time_capped) owner.adjustFireLoss(-heal_amt * delta_time_capped) diff --git a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm deleted file mode 100644 index 98728fe8ed4..00000000000 --- a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm +++ /dev/null @@ -1,11 +0,0 @@ -/// TGMC_XENOS (old nova sector xenos) - -// Traits -/// Defender fortify ability -#define TRAIT_XENO_FORTIFY "xeno_fortify" -// /// Trait source for xeno innate abilities -// #define TRAIT_XENO_INNATE "xeno_innate" -// /// Trait source for something added BY a xeno ability -// #define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" -// /// Determines if something can receive healing from a xeno -// #define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/organs.dm index 44ec5b98a58..1a7528763a8 100644 --- a/tff_modular/modules/tgmc_xenos/code/organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/organs.dm @@ -1,5 +1,73 @@ /// TGMC_XENOS (old nova sector xenos) +// Сосуды плазмы +/obj/item/organ/alien/plasmavessel/tgmc + name = "plasma vessel" + icon_state = "plasma" + w_class = WEIGHT_CLASS_NORMAL + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_XENO_PLASMAVESSEL + actions_types = list( + /datum/action/cooldown/alien/make_structure/plant_weeds, + /datum/action/cooldown/alien/transfer, + ) + + stored_plasma = 100 + max_plasma = 250 + heal_rate = 2.5 + plasma_rate = 5 + + var/resting_mult = 2 + +/obj/item/organ/alien/plasmavessel/tgmc/on_life(seconds_per_tick, times_fired) + var/delta_time = DELTA_WORLD_TIME(SSmobs) + //Instantly healing to max health in a single tick would be silly. If it takes 8 seconds to fire, then something's fucked. + var/delta_time_capped = min(delta_time, 8) + //If there are alien weeds on the ground then heal if needed or give some plasma + if(locate(/obj/structure/alien/weeds) in owner.loc) + if(owner.health >= owner.maxHealth) + owner.adjustPlasma(plasma_rate * delta_time) + else + var/heal_amt = heal_rate + if(!isalien(owner)) + heal_amt *= 0.2 + if(owner.resting) + heal_amt *= resting_mult + + owner.adjustPlasma(0.5 * plasma_rate * delta_time_capped) + owner.adjustBruteLoss(-heal_amt * delta_time_capped) + owner.adjustFireLoss(-heal_amt * delta_time_capped) + owner.adjustOxyLoss(-heal_amt * delta_time_capped) + else + owner.adjustPlasma(0.1 * plasma_rate * delta_time) + +/obj/item/organ/alien/plasmavessel/tgmc/large + name = "large plasma vessel" + icon_state = "plasma_large" + w_class = WEIGHT_CLASS_BULKY + stored_plasma = 200 + max_plasma = 500 + plasma_rate = 7.5 + +/obj/item/organ/alien/plasmavessel/tgmc/large/queen + plasma_rate = 10 + +/obj/item/organ/alien/plasmavessel/tgmc/small + name = "small plasma vessel" + icon_state = "plasma_small" + w_class = WEIGHT_CLASS_SMALL + stored_plasma = 100 + max_plasma = 150 + plasma_rate = 2.5 + +/obj/item/organ/alien/plasmavessel/tgmc/small/tiny + name = "tiny plasma vessel" + icon_state = "plasma_tiny" + w_class = WEIGHT_CLASS_TINY + max_plasma = 100 + actions_types = list(/datum/action/cooldown/alien/transfer) + + // Яйцеклад королевы /obj/item/organ/alien/eggsac/tgmc actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg/tgmc) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index dfbace19156..9acc289b26d 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -13,7 +13,7 @@ move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc ) hud_offset_y = -16 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 3589bc3706d..745578464fe 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -13,7 +13,7 @@ next_evolution = /mob/living/carbon/alien/adult/tgmc/crusher additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small, ) melee_vehicle_damage = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 499773fcc9e..8df8e2a10e5 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -12,7 +12,7 @@ next_evolution = /mob/living/carbon/alien/adult/tgmc/praetorian additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 8060bdd5b25..c3982e8f10c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -14,7 +14,7 @@ next_evolution = /mob/living/carbon/alien/adult/tgmc/queen additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index df2fe19d0c1..431d4c3702b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -13,7 +13,7 @@ move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large/queen, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large/queen, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/queen, diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 64d2565f265..9737b1e3c13 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -13,7 +13,7 @@ move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc ) melee_vehicle_damage = 35 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index f6a41fb4c2b..8ddf9bc6660 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -15,7 +15,7 @@ on_fire_pixel_y = 0 additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small/tiny, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small/tiny, ) hud_offset_y = -32 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 293f0b729e2..ee9cea26f9f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -12,7 +12,7 @@ next_evolution = /mob/living/carbon/alien/adult/tgmc/spitter additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc, ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc, ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 93b7bb03651..187997891b7 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -12,7 +12,7 @@ melee_damage_upper = 20 additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm index ad3c2204f97..8ac100f134f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm @@ -13,7 +13,7 @@ melee_damage_upper = 35 additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc ) hud_offset_y = -16 diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md new file mode 100644 index 00000000000..2788fe544b1 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -0,0 +1,32 @@ +# TGMC_ALIENS + +## Описание + +Модуль, добавляющий новых ксеноморфов. В прошлом эти ксеносы были на нове, до новы на скайрате, а те в свою очередь были портом ксеноморфов с ТГМС. + +## TG File Changes + +- MOVED: + code\modules\mob\living\carbon\human\human_defense.dm: `/mob/living/carbon/human/attack_alien` + TO: + tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm +- Hi!!! Hello!!! + +Additions: + +- code/modules/mob/living/living_defense.dm: `/mob/living/attack_alien` +- code/modules/vehicles/mecha/_mecha.dm: `/obj/vehicle/sealed/mecha/proc/melee_attack_effect` + +## Defines + +IN: code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm + +- TRAIT_XENO_INNATE +- TRAIT_XENO_ABILITY_GIVEN +- TRAIT_XENO_HEAL_AURA +- TRAIT_XENO_FORTIFY + +## Credits + +TGMC & CM - Where the sprites, sound, and ideas for caste abilities came from +Original developer of these xenos (apparently it's @Paxilmaniac) - Porting the xenos from TGMC and adopting their stuff to work with our code From db452c4a6c4b953e783f2c5a07656aeaf82b3af0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Tue, 25 Mar 2025 23:59:29 +0700 Subject: [PATCH 031/120] Update rangefinder.dm --- tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm b/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm index 43a184bf21a..0095f79cbbe 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm @@ -14,7 +14,7 @@ /obj/item/binoculars/rangefinder/examine(mob/user) . = ..() - . += span_notice(span_bold("The rangefinder reads: LONGITUDE [last_x], LATITUDE [last_y].")) + . += span_boldnotice("The rangefinder reads: LONGITUDE [last_x], LATITUDE [last_y].") /obj/item/binoculars/rangefinder/on_wield(obj/item/source, mob/user) . = ..() @@ -56,7 +56,7 @@ var/turf/TU = get_turf(A) last_x = obfuscate_x(TU.x) last_y = obfuscate_y(TU.y) - to_chat(user, span_notice("COORDINATES: LONGITUDE [last_x]. LATITUDE [last_y].")) + to_chat(user, span_boldnotice("COORDINATES: LONGITUDE [last_x]. LATITUDE [last_y].")) if(debug) var/turf/current_turf = get_turf(src) to_chat(user, span_notice("([deobfuscate_x(last_x)]:[deobfuscate_y(last_y)]) {([current_turf.x]:[current_turf.y])")) From e4c7cf8e29307f9cb0b55ff298ecd1e2b03f17eb Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 26 Mar 2025 00:08:03 +0700 Subject: [PATCH 032/120] Update tgstation.dme forgot commit that --- tgstation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index ef2837014b4..9986c6721fb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9136,7 +9136,6 @@ #include "tff_modular\modules\silicon_laws_tweaks\code\upload.dm" #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" -#include "tff_modular\modules\tgmc_xenos\code\_xeno_defines.dm" #include "tff_modular\modules\tgmc_xenos\code\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" From acdeaf0256d19b86e986d89a443af25db729f8f8 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 26 Mar 2025 20:33:14 +0700 Subject: [PATCH 033/120] Update alien_powers.dm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - стекла при чардже крашера ломаются за 1 удар - теперь крашер может ломать стены, требуется 3 удара, вместо 2 --- tff_modular/modules/tgmc_xenos/code/alien_powers.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index 938c67772ce..dae7d0defd1 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -543,11 +543,16 @@ var/throw_mecha = TRUE var/crush_walls = TRUE + var/crush_reinforced_walls = TRUE /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/do_charge_indicator(atom/charger, atom/charge_target) . = ..() playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/on_moved(atom/source) + SIGNAL_HANDLER + playsound(source, 'sound/effects/meteorimpact.ogg', 100, TRUE, 2, TRUE) + /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/hit_target(atom/movable/source, atom/target, damage_dealt) var/mob/living/carbon/alien/adult/tgmc/charger = owner @@ -597,7 +602,7 @@ var/obj/machinery/door/airlock/target_airlock = target damage = ceil(target_airlock.normal_integrity / 3) else if(istype(target, /obj/structure/window)) - damage = 70 + damage = 1000 // Нужно сломать за 1 раз target_obj.take_damage(damage, BRUTE) if(QDELETED(target_obj)) @@ -630,11 +635,13 @@ // Столокновение с турфами if(isturf(target)) if(crush_walls) - if(!isclosedturf(target) || isindestructiblewall(target) || istype(target, /turf/closed/wall/r_wall)) + if(!isclosedturf(target) || isindestructiblewall(target)) + return + if(!crush_reinforced_walls && istype(target, /turf/closed/wall/r_wall)) return target.AddComponent(/datum/component/torn_wall) - if(!QDELETED(target)) + if(!QDELETED(target) && !istype(target, /turf/closed/wall/r_wall)) target.AddComponent(/datum/component/torn_wall) if(QDELETED(target)) From 9cde8773f5a22d24454392c84fe1e0567466b310 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 26 Mar 2025 20:40:42 +0700 Subject: [PATCH 034/120] powers update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - крик королевы теперь станит правильно - чардж равагера понерфлен --- tff_modular/modules/tgmc_xenos/code/alien_powers.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index dae7d0defd1..d055229f86f 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -538,7 +538,7 @@ var/sharpness = FALSE var/obj_damage = 50 - var/mecha_damage = 50 + var/mecha_damage = 75 var/mecha_occupants_stun_time = 5 SECONDS var/throw_mecha = TRUE @@ -667,7 +667,7 @@ charge_distance = 7 charge_past = 3 destroy_objects = FALSE - charge_damage = 40 + charge_damage = 25 button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' button_icon_state = "ravager_charge" unset_after_click = TRUE diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 431d4c3702b..454eec7688d 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -82,12 +82,12 @@ if(distance_to_target <= 4) to_chat(src, span_danger("An ear-splitting guttural roar shakes the ground beneath your feet!")) if(istype(screech_target.loc, /obj/vehicle/sealed/mecha)) - screech_target.AdjustStun(40) + screech_target.AdjustStun(60) else - screech_target.AdjustKnockdown(40) + screech_target.AdjustKnockdown(60, 60) else if(distance_to_target >= 5 && distance_to_target < 7) to_chat(src, span_danger("The roar shakes your body to the core, freezing you in place!")) - screech_target.AdjustStun(20) + screech_target.AdjustStun(30) return TRUE From deb90c0fa3f3aadd334f11ec9ccfaea3744c0df4 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 26 Mar 2025 20:52:12 +0700 Subject: [PATCH 035/120] changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - хп королевы поднято до 750 - множитель лечения в лежачем положении увеличен до 3 - броня при фортифае увеличена (и исправлен баг) --- .../modules/tgmc_xenos/code/alien_powers.dm | 14 +++++++------- tff_modular/modules/tgmc_xenos/code/organs.dm | 2 +- .../modules/tgmc_xenos/code/xeno_types/queen.dm | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm index d055229f86f..9562be04575 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/alien_powers.dm @@ -715,11 +715,11 @@ var/datum/armor/fortify_armor_type = /datum/armor/fortify_armor /datum/armor/fortify_armor - bomb = 30 - bullet = 50 - laser = 50 - fire = 50 - melee = 30 + bomb = 40 + bullet = 75 + laser = 75 + fire = 75 + melee = 50 /datum/action/cooldown/alien/fortify/Destroy() set_fortify(FALSE) @@ -740,8 +740,8 @@ /datum/action/cooldown/alien/fortify/proc/set_fortify(on) if(xeno_owner.fortify == on) return - if(xeno_owner.body_position == LYING_DOWN) - xeno_owner.get_up(TRUE) + if(on && xeno_owner.body_position == LYING_DOWN) + xeno_owner.set_resting(FALSE, instant = TRUE) if(on) ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/organs.dm index 1a7528763a8..b6640bc2fc6 100644 --- a/tff_modular/modules/tgmc_xenos/code/organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/organs.dm @@ -17,7 +17,7 @@ heal_rate = 2.5 plasma_rate = 5 - var/resting_mult = 2 + var/resting_mult = 3 /obj/item/organ/alien/plasmavessel/tgmc/on_life(seconds_per_tick, times_fired) var/delta_time = DELTA_WORLD_TIME(SSmobs) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 454eec7688d..f5e1053809c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -4,8 +4,8 @@ name = "alien queen" desc = "A hulking beast of an alien, for some reason this one seems more important than the others, you should probably quit staring at it and do something." caste = "queen" - maxHealth = 500 - health = 500 + maxHealth = 750 + health = 750 icon_state = "alienqueen" mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 From bb0f4c6576a18348896a8893a530e5b175793c4b Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 26 Mar 2025 21:31:34 +0700 Subject: [PATCH 036/120] midule rearrangment --- .../modules/tgmc_xenos/code/{ => misc}/larva.dm | 0 .../modules/tgmc_xenos/code/{ => misc}/projectiles.dm | 0 .../tgmc_xenos/code/{ => misc}/tgmc_alien_event.dm | 0 .../tgmc_xenos/code/{ => powers}/alien_powers.dm | 1 - .../tgmc_xenos/code/{ => powers}/resin_walker.dm | 0 tgstation.dme | 10 +++++----- 6 files changed, 5 insertions(+), 6 deletions(-) rename tff_modular/modules/tgmc_xenos/code/{ => misc}/larva.dm (100%) rename tff_modular/modules/tgmc_xenos/code/{ => misc}/projectiles.dm (100%) rename tff_modular/modules/tgmc_xenos/code/{ => misc}/tgmc_alien_event.dm (100%) rename tff_modular/modules/tgmc_xenos/code/{ => powers}/alien_powers.dm (99%) rename tff_modular/modules/tgmc_xenos/code/{ => powers}/resin_walker.dm (100%) diff --git a/tff_modular/modules/tgmc_xenos/code/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/larva.dm rename to tff_modular/modules/tgmc_xenos/code/misc/larva.dm diff --git a/tff_modular/modules/tgmc_xenos/code/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/projectiles.dm rename to tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm diff --git a/tff_modular/modules/tgmc_xenos/code/tgmc_alien_event.dm b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/tgmc_alien_event.dm rename to tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm diff --git a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm similarity index 99% rename from tff_modular/modules/tgmc_xenos/code/alien_powers.dm rename to tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm index 9562be04575..38881465eaa 100644 --- a/tff_modular/modules/tgmc_xenos/code/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm @@ -550,7 +550,6 @@ playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/on_moved(atom/source) - SIGNAL_HANDLER playsound(source, 'sound/effects/meteorimpact.ogg', 100, TRUE, 2, TRUE) /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/hit_target(atom/movable/source, atom/target, damage_dealt) diff --git a/tff_modular/modules/tgmc_xenos/code/resin_walker.dm b/tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/resin_walker.dm rename to tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm diff --git a/tgstation.dme b/tgstation.dme index 9986c6721fb..43c5f4d6449 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9136,16 +9136,16 @@ #include "tff_modular\modules\silicon_laws_tweaks\code\upload.dm" #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" -#include "tff_modular\modules\tgmc_xenos\code\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" -#include "tff_modular\modules\tgmc_xenos\code\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\organs.dm" -#include "tff_modular\modules\tgmc_xenos\code\projectiles.dm" -#include "tff_modular\modules\tgmc_xenos\code\resin_walker.dm" -#include "tff_modular\modules\tgmc_xenos\code\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\larva.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\projectiles.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\alien_powers.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\resin_walker.dm" #include "tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\crusher.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" From c17cdbbb00a72efeefea052a3bfb67f9cecf122f Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 00:40:02 +0700 Subject: [PATCH 037/120] mortar things --- .../tgmc_xenos/mortar/icons/mortar.dmi | Bin 24109 -> 27659 bytes .../tgmc_xenos/mortar/misc/fire_spread.dm | 46 +++++++++++ .../mortar/{ => misc}/rangefinder.dm | 0 .../tgmc_xenos/mortar/mortar_shells.dm | 77 +++++++++++++----- .../modules/tgmc_xenos/mortar/mortars.dm | 46 ++++++----- tgstation.dme | 3 +- 6 files changed, 133 insertions(+), 39 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm rename tff_modular/modules/tgmc_xenos/mortar/{ => misc}/rangefinder.dm (100%) diff --git a/tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi b/tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi index 78da0ec70ec004ec6450d75dfa7dd462fb57dd4c..c6663db5b672194331c2537b4c489e0422c76faa 100644 GIT binary patch literal 27659 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 literal 24109 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 diff --git a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm new file mode 100644 index 00000000000..511de32f661 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm @@ -0,0 +1,46 @@ +/datum/effect_system/fluid_spread/smoke/fire + effect_type = /obj/effect/particle_effect/fluid/smoke/fire + +/obj/effect/particle_effect/fluid/smoke/fire + name = "fire" + icon = 'modular_nova/modules/liquids/icons/obj/effects/liquid.dmi' + icon_state = "fire_big" + pixel_x = 0 + pixel_y = 0 + opacity = FALSE + lifetime = 60 SECONDS + + light_range = 0 + light_power = 1 + light_color = LIGHT_COLOR_FIRE + +/obj/effect/particle_effect/fluid/smoke/fire/Initialize(mapload, datum/fluid_group/group, ...) + . = ..() + RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(movable_entered)) + addtimer(CALLBACK(src, PROC_REF(lower_fire)), lifetime / 3) + set_light_range(LIGHT_RANGE_FIRE + 1) + update_light() + +/obj/effect/particle_effect/fluid/smoke/fire/Destroy() + . = ..() + UnregisterSignal(loc, COMSIG_ATOM_ENTERED) + +/obj/effect/particle_effect/fluid/smoke/fire/proc/lower_fire() + switch(icon_state) + if("fire_big") + icon_state = "fire_medium" + set_light_range(LIGHT_RANGE_FIRE) + + addtimer(CALLBACK(src, PROC_REF(lower_fire)), lifetime / 3) + if("fire_medium") + icon_state = "fire_small" + set_light_range(LIGHT_RANGE_FIRE) + + update_light() + +/obj/effect/particle_effect/fluid/smoke/fire/proc/movable_entered(datum/source, atom/movable/target_atom) + SIGNAL_HANDLER + if(isobserver(target_atom)) + return + + target_atom.fire_act(5000, 1000) diff --git a/tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/rangefinder.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/mortar/rangefinder.dm rename to tff_modular/modules/tgmc_xenos/mortar/misc/rangefinder.dm diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm index 7c56c048cb4..25d967ddf3b 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm @@ -26,7 +26,14 @@ icon_state = "mortar_ammo_he" /obj/item/mortar_shell/he/explosion_effect(turf/T) - explosion(T, 0, 3, 5, 7, explosion_cause = sender) + explosion(T, 0, 0, 5, 7) + + +/obj/item/mortar_shell/he/high + desc = "An 80mm mortar shell, loaded with a super high explosive charge." + +/obj/item/mortar_shell/he/high/explosion_effect(turf/T) + explosion(T, 0, 3, 5, 7) /obj/item/mortar_shell/frag @@ -42,21 +49,53 @@ /obj/item/mortar_shell/frag/explosion_effect(turf/T) AddComponent(/datum/component/pellet_cloud, projectile_type = shrapnel_type, magnitude = shrapnel_radius) - sleep(2) - explosion(T, 0, 1, 3, 4, explosion_cause = sender) - - -// /obj/item/mortar_shell/incendiary -// name = "\improper 80mm incendiary mortar shell" -// desc = "An 80mm mortar shell, loaded with a Type B napalm charge. Perfect for long-range area denial." -// icon_state = "mortar_ammo_inc" -// var/radius = 5 -// var/flame_level = BURN_TIME_TIER_5 + 5 //Type B standard, 50 base + 5 from chemfire code. -// var/burn_level = BURN_LEVEL_TIER_2 -// var/flameshape = FLAMESHAPE_DEFAULT -// var/fire_type = FIRE_VARIANT_TYPE_B //Armor Shredding Greenfire - -// /obj/item/mortar_shell/incendiary/detonate(turf/T) -// explosion(T, 0, 2, 4, 7, explosion_cause = sender) -// flame_radius(cause_data, radius, T, flame_level, burn_level, flameshape, null, fire_type) -// playsound(T, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg', 35, 1, 4) + sleep(4) + explosion(T, 0, 0, 5, 2) + + +/obj/item/mortar_shell/incendiary + name = "\improper 80mm incendiary mortar shell" + desc = "An 80mm mortar shell, loaded with a Type B napalm charge. Perfect for long-range area denial." + icon_state = "mortar_ammo_inc" + var/range = 5 + var/fire_type = /datum/effect_system/fluid_spread/smoke/fire + +/obj/item/mortar_shell/incendiary/explosion_effect(turf/T) + explosion(T, 0, 0, 4, 2) + var/datum/effect_system/fluid_spread/smoke/fire/smoke = new fire_type(T) + smoke.set_up(range, holder = T, location = T) + smoke.start() + playsound(T, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg', 35, 1, 4) + + +/obj/item/mortar_shell/flashbang + name = "\improper 80mm flashbang mortar shell" + desc = "An 80mm mortar shell, loaded with a large clasterbang grenade." + icon_state = "mortar_ammo_flashbang" + + var/range = 4 + +/obj/item/mortar_shell/flashbang/explosion_effect(turf/T) + explosion(T, 0, 0, 1, 0) + var/obj/item/grenade/clusterbuster/flashbang = new /obj/item/grenade/clusterbuster/mortar(T) + sleep(0.5 SECONDS) + flashbang.detonate(sender) + +/obj/item/grenade/clusterbuster/mortar + min_spawned = 6 + max_spawned = 12 + + +/obj/item/mortar_shell/smoke + name = "\improper 80mm smoke mortar shell" + desc = "An 80mm mortar shell, loaded with smoke dispersal agents. Can be fired at marines more-or-less safely. Way slimmer than your typical 80mm." + icon_state = "mortar_ammo_smoke" + + var/range = 5 + +/obj/item/mortar_shell/smoke/explosion_effect(turf/T) + explosion(T, 0, 0, 1, 0) + playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) + var/datum/effect_system/fluid_spread/smoke/bad/smoke = new(T) + smoke.set_up(range, holder = src, location = src) + smoke.start() diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm index 6d8b92d6b31..a4f4a6cba99 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm @@ -134,7 +134,7 @@ target_turf = deviation_turf user.visible_message(span_notice("[user] starts loading \a [mortar_shell.name] into [src]."), span_notice("You start loading \a [mortar_shell.name] into [src].")) - playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg', 50, 1) + playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg', 75, 1) busy = TRUE var/success = do_after(user, 1.5 SECONDS, src) busy = FALSE @@ -142,7 +142,7 @@ user.visible_message(span_notice("[user] loads \a [mortar_shell.name] into [src]."), span_notice("You load \a [mortar_shell.name] into [src].")) visible_message("[icon2html(src, viewers(src))] [span_danger("The [name] fires!")]") user.transferItemToLoc(mortar_shell, src) - playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg', 50, 1) + playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg', 125, 1) busy = FALSE firing = TRUE flick(icon_state + "_fire", src) @@ -166,12 +166,11 @@ if(do_after(user, 4 SECONDS, src)) user.visible_message(span_notice("[user] undeploys [src]."), span_notice("You undeploy [src].")) playsound(loc, 'sound/items/Deconstruct.ogg', 25, 1) - var/obj/item/mortar_kit/mortar = new /obj/item/mortar_kit(loc) - mortar.name = src.name + new /obj/item/mortar_kit(loc) qdel(src) /obj/structure/mortar/proc/handle_shell(turf/target, obj/item/mortar_shell/shell) - playsound(target, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg', 50, 1) + playsound(target, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg', 75, 1) var/relative_dir for(var/mob/mob in range(15, target)) if(get_turf(mob) == target) @@ -182,7 +181,7 @@ span_danger("A SHELL IS COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_VISUAL, \ span_danger("YOU HEAR SOMETHING COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ ) - sleep(2.5 SECONDS) + sleep(2 SECONDS) for(var/mob/mob in range(10, target)) if(get_turf(mob) == target) @@ -193,12 +192,10 @@ span_userdanger("A SHELL IS ABOUT TO IMPACT [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_VISUAL, \ span_userdanger("YOU HEAR SOMETHING VERY CLOSE COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ ) - sleep(2 SECONDS) + sleep(2.5 SECONDS) shell.detonate(target) - qdel(shell) firing = FALSE - /obj/structure/mortar/proc/can_fire_at(mob/user, test_targ_x = targ_x, test_targ_y = targ_y, test_dial_x, test_dial_y) var/dialing = test_dial_x || test_dial_y if(test_dial_x + test_targ_x > world.maxx || test_dial_x + test_targ_x < 0) @@ -241,7 +238,6 @@ var/obj/structure/mortar/mortar = new /obj/structure/mortar(deploy_turf) user.visible_message(span_notice("[user] deploys [src]."), span_notice("You deploy [src].")) playsound(deploy_turf, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg', 25, 1) - mortar.name = src.name mortar.setDir(user.dir) qdel(src) @@ -256,12 +252,10 @@ new /obj/item/mortar_kit(src) new /obj/item/mortar_shell/he(src) new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/frag(src) new /obj/item/mortar_shell/frag(src) new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/incendiary(src) + new /obj/item/mortar_shell/incendiary(src) new /obj/item/binoculars/rangefinder(src) new /obj/item/binoculars/rangefinder(src) @@ -269,18 +263,32 @@ name = "\improper M402 mortar ammo crate" desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." -/obj/structure/closet/crate/secure/weapon/mortar_kit/PopulateContents() +/obj/structure/closet/crate/secure/weapon/mortar_ammo/PopulateContents() . = ..() new /obj/item/mortar_shell/he(src) new /obj/item/mortar_shell/he(src) new /obj/item/mortar_shell/he(src) new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/frag(src) new /obj/item/mortar_shell/frag(src) new /obj/item/mortar_shell/frag(src) new /obj/item/mortar_shell/frag(src) new /obj/item/mortar_shell/frag(src) + new /obj/item/mortar_shell/incendiary(src) + new /obj/item/mortar_shell/incendiary(src) + new /obj/item/mortar_shell/incendiary(src) + new /obj/item/mortar_shell/incendiary(src) + +/obj/structure/closet/crate/secure/weapon/mortar_special_ammo + name = "\improper M402 mortar special ammo crate" + desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." +/obj/structure/closet/crate/secure/weapon/mmortar_special_ammo/PopulateContents() + . = ..() + new /obj/item/mortar_shell/smoke(src) + new /obj/item/mortar_shell/smoke(src) + new /obj/item/mortar_shell/smoke(src) + new /obj/item/mortar_shell/smoke(src) + new /obj/item/mortar_shell/flashbang(src) + new /obj/item/mortar_shell/flashbang(src) + new /obj/item/mortar_shell/flashbang(src) + new /obj/item/mortar_shell/flashbang(src) diff --git a/tgstation.dme b/tgstation.dme index 43c5f4d6449..ee0ba754e56 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9160,7 +9160,8 @@ #include "tff_modular\modules\tgmc_xenos\mortar\_mortar_defines.dm" #include "tff_modular\modules\tgmc_xenos\mortar\mortar_shells.dm" #include "tff_modular\modules\tgmc_xenos\mortar\mortars.dm" -#include "tff_modular\modules\tgmc_xenos\mortar\rangefinder.dm" +#include "tff_modular\modules\tgmc_xenos\mortar\misc\fire_spread.dm" +#include "tff_modular\modules\tgmc_xenos\mortar\misc\rangefinder.dm" #include "tff_modular\modules\timed_citations\crime.dm" #include "tff_modular\modules\toys\code\loadout_datum_toys.dm" #include "tff_modular\modules\toys\code\plushes.dm" From 51db7aa4fad12e8676396b9145a2f1630bf30a47 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 03:17:25 +0700 Subject: [PATCH 038/120] mrt --- tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm | 9 +++++---- tff_modular/modules/tgmc_xenos/mortar/mortars.dm | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm index 25d967ddf3b..05a5aee61e0 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm @@ -13,6 +13,8 @@ var/burning = FALSE /obj/item/mortar_shell/proc/detonate(turf/T) + if(isnull(T)) + T = get_turf(src) explosion_effect(T) qdel(src) @@ -78,8 +80,7 @@ /obj/item/mortar_shell/flashbang/explosion_effect(turf/T) explosion(T, 0, 0, 1, 0) var/obj/item/grenade/clusterbuster/flashbang = new /obj/item/grenade/clusterbuster/mortar(T) - sleep(0.5 SECONDS) - flashbang.detonate(sender) + flashbang.arm_grenade(sender, 1 SECONDS) /obj/item/grenade/clusterbuster/mortar min_spawned = 6 @@ -95,7 +96,7 @@ /obj/item/mortar_shell/smoke/explosion_effect(turf/T) explosion(T, 0, 0, 1, 0) - playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) var/datum/effect_system/fluid_spread/smoke/bad/smoke = new(T) - smoke.set_up(range, holder = src, location = src) + smoke.set_up(range, holder = T, location = T) smoke.start() + playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm index a4f4a6cba99..4f1e5accdea 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm @@ -134,7 +134,7 @@ target_turf = deviation_turf user.visible_message(span_notice("[user] starts loading \a [mortar_shell.name] into [src]."), span_notice("You start loading \a [mortar_shell.name] into [src].")) - playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg', 75, 1) + playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg', 100, 1) busy = TRUE var/success = do_after(user, 1.5 SECONDS, src) busy = FALSE @@ -142,7 +142,7 @@ user.visible_message(span_notice("[user] loads \a [mortar_shell.name] into [src]."), span_notice("You load \a [mortar_shell.name] into [src].")) visible_message("[icon2html(src, viewers(src))] [span_danger("The [name] fires!")]") user.transferItemToLoc(mortar_shell, src) - playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg', 125, 1) + playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg', 200, 1) busy = FALSE firing = TRUE flick(icon_state + "_fire", src) @@ -170,7 +170,7 @@ qdel(src) /obj/structure/mortar/proc/handle_shell(turf/target, obj/item/mortar_shell/shell) - playsound(target, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg', 75, 1) + playsound(target, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg', 125, 1) var/relative_dir for(var/mob/mob in range(15, target)) if(get_turf(mob) == target) @@ -193,6 +193,8 @@ span_userdanger("YOU HEAR SOMETHING VERY CLOSE COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ ) sleep(2.5 SECONDS) + shell.alpha(0) + shell.forceMove(target) shell.detonate(target) firing = FALSE @@ -282,7 +284,7 @@ name = "\improper M402 mortar special ammo crate" desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." -/obj/structure/closet/crate/secure/weapon/mmortar_special_ammo/PopulateContents() +/obj/structure/closet/crate/secure/weapon/mortar_special_ammo/PopulateContents() . = ..() new /obj/item/mortar_shell/smoke(src) new /obj/item/mortar_shell/smoke(src) From e7dd8b5925b79b432c558c23d63030c402e45782 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 03:25:59 +0700 Subject: [PATCH 039/120] Update mortars.dm --- tff_modular/modules/tgmc_xenos/mortar/mortars.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm index 4f1e5accdea..5d0546a897e 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm @@ -193,7 +193,7 @@ span_userdanger("YOU HEAR SOMETHING VERY CLOSE COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ ) sleep(2.5 SECONDS) - shell.alpha(0) + shell.alpha = 0 shell.forceMove(target) shell.detonate(target) firing = FALSE From e7fce3f421e26dc18ee416120a09cf2b207d7e26 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 16:36:21 +0700 Subject: [PATCH 040/120] warrior removal --- .../tgmc_xenos/code/xeno_types/warrior.dm | 86 ------------------- tgstation.dme | 1 - 2 files changed, 87 deletions(-) delete mode 100644 tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm deleted file mode 100644 index 8ac100f134f..00000000000 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/warrior.dm +++ /dev/null @@ -1,86 +0,0 @@ -/// TGMC_XENOS (old nova sector xenos) - -// На данный момент не используется, остался как рудимент -/mob/living/carbon/alien/adult/tgmc/warrior - name = "alien warrior" - desc = "If there are aliens to call walking tanks, this would be one of them, with both the heavy armor and strong arms to back that claim up." - caste = "warrior" - maxHealth = 400 - health = 400 - icon_state = "alienwarrior" - mob_size = MOB_SIZE_LARGE - melee_damage_lower = 30 - melee_damage_upper = 35 - - additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc - ) - - hud_offset_y = -16 - - melee_vehicle_damage = 35 - -/mob/living/carbon/alien/adult/tgmc/warrior/Initialize(mapload) - . = ..() - var/static/list/innate_actions = list( - /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep, - /datum/action/cooldown/alien/tgmc/warrior_agility, - ) - grant_actions_by_list(innate_actions) - - REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) - - - -/// Способность вариора делать *что-то* -/datum/action/cooldown/alien/tgmc/warrior_agility - name = "Agility Mode" - desc = "Drop onto all fours, increasing your speed at the cost of damage and being unable to use most abilities." - button_icon_state = "the_speed_is_alot" - cooldown_time = 1 SECONDS - can_be_used_always = TRUE - /// Is the warrior currently running around on all fours? - var/being_agile = FALSE - -/datum/action/cooldown/alien/tgmc/warrior_agility/Activate() - . = ..() - if(!being_agile) - begin_agility() - return TRUE - if(being_agile) - end_agility() - return TRUE - -/// Handles the visual indication and code activation of the warrior agility ability (say that five times fast) -/datum/action/cooldown/alien/tgmc/warrior_agility/proc/begin_agility() - var/mob/living/carbon/alien/adult/tgmc/agility_target = owner - agility_target.balloon_alert(agility_target, "agility active") - to_chat(agility_target, span_danger("We drop onto all fours, allowing us to move at much greater speed at expense of being able to use most abilities.")) - playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_hiss.ogg', 100, TRUE, 8, 0.9) - agility_target.icon_state = "alien[agility_target.caste]_mobility" - - being_agile = TRUE - agility_target.add_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) - agility_target.unable_to_use_abilities = TRUE - - agility_target.melee_damage_lower = 15 - agility_target.melee_damage_upper = 20 - -/// Handles the visual indicators and code side of deactivating the agility ability -/datum/action/cooldown/alien/tgmc/warrior_agility/proc/end_agility() - var/mob/living/carbon/alien/adult/tgmc/agility_target = owner - agility_target.balloon_alert(agility_target, "agility ended") - playsound(agility_target, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) //Warrior runs up on all fours, stands upright, screams at you - agility_target.icon_state = "alien[agility_target.caste]" - - being_agile = FALSE - agility_target.remove_movespeed_modifier(/datum/movespeed_modifier/warrior_agility) - agility_target.unable_to_use_abilities = FALSE - - agility_target.melee_damage_lower = initial(agility_target.melee_damage_lower) - agility_target.melee_damage_upper = initial(agility_target.melee_damage_upper) - -/datum/movespeed_modifier/warrior_agility - multiplicative_slowdown = -2 diff --git a/tgstation.dme b/tgstation.dme index ee0ba754e56..2d9e453afb8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9156,7 +9156,6 @@ #include "tff_modular\modules\tgmc_xenos\code\xeno_types\rouny.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\sentinel.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\spitter.dm" -#include "tff_modular\modules\tgmc_xenos\code\xeno_types\warrior.dm" #include "tff_modular\modules\tgmc_xenos\mortar\_mortar_defines.dm" #include "tff_modular\modules\tgmc_xenos\mortar\mortar_shells.dm" #include "tff_modular\modules\tgmc_xenos\mortar\mortars.dm" From 30f561e83d70cc54769e7a5e86dbe3976a8979ce Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 16:37:16 +0700 Subject: [PATCH 041/120] fixes --- code/__HELPERS/~ff_helpers/is_helpers.dm | 2 +- .../modules/tgmc_xenos/code/powers/resin_walker.dm | 3 +-- .../modules/tgmc_xenos/code/xeno_types/crusher.dm | 1 - .../modules/tgmc_xenos/code/xeno_types/praetorian.dm | 1 - .../modules/tgmc_xenos/code/xeno_types/queen.dm | 6 +----- .../modules/tgmc_xenos/code/xeno_types/ravager.dm | 1 - tff_modular/modules/tgmc_xenos/readme.md | 12 ++++++++++++ 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/code/__HELPERS/~ff_helpers/is_helpers.dm b/code/__HELPERS/~ff_helpers/is_helpers.dm index defadd96efc..b958fd8b0c2 100644 --- a/code/__HELPERS/~ff_helpers/is_helpers.dm +++ b/code/__HELPERS/~ff_helpers/is_helpers.dm @@ -9,7 +9,7 @@ #define istgmcalienravager(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/ravager)) -#define istgmcaliencrusher(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/warrior)) +#define istgmcaliencrusher(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/crusher)) #define istgmcalienspitter(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/spitter)) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm b/tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm index ac1f7509437..1989f1e659f 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm @@ -4,7 +4,7 @@ /datum/element/resin_walker element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 - /// Move speed modifier to apply when not stood on webs + var/datum/movespeed_modifier/on_resin_modifier /datum/element/resin_walker/Attach(datum/target, datum/movespeed_modifier/on_resin_modifier) @@ -19,7 +19,6 @@ . = ..() UnregisterSignal(source, COMSIG_MOVABLE_MOVED) -/// When we move, check if we're still on a web /datum/element/resin_walker/proc/on_moved(mob/living/source) SIGNAL_HANDLER diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 9acc289b26d..74b6ccb11ff 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -10,7 +10,6 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 - move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index c3982e8f10c..59d863fe35a 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -10,7 +10,6 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 - move_resist = MOVE_FORCE_STRONG next_evolution = /mob/living/carbon/alien/adult/tgmc/queen additional_organ_types_by_slot = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index f5e1053809c..ed4127b746a 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -10,7 +10,6 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 - move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large/queen, @@ -81,10 +80,7 @@ var/distance_to_target = get_dist(queenie, screech_target) if(distance_to_target <= 4) to_chat(src, span_danger("An ear-splitting guttural roar shakes the ground beneath your feet!")) - if(istype(screech_target.loc, /obj/vehicle/sealed/mecha)) - screech_target.AdjustStun(60) - else - screech_target.AdjustKnockdown(60, 60) + screech_target.AdjustParalyzed(60) else if(distance_to_target >= 5 && distance_to_target < 7) to_chat(src, span_danger("The roar shakes your body to the core, freezing you in place!")) screech_target.AdjustStun(30) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 9737b1e3c13..f1118aac5eb 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -10,7 +10,6 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 - move_resist = MOVE_FORCE_STRONG additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index 2788fe544b1..19732282c6b 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -26,6 +26,18 @@ IN: code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm - TRAIT_XENO_HEAL_AURA - TRAIT_XENO_FORTIFY +## Helpers + +IN: code/__HELPERS/~ff_helpers/is_helpers.dm + +- istgmcalien +- istgmcalienqueen +- istgmcalienpraetorian +- istgmcalienravager +- istgmcaliencrusher +- istgmcalienspitter +- istgmcalientier2 + ## Credits TGMC & CM - Where the sprites, sound, and ideas for caste abilities came from From ed5575d4767ab2d3e2c98bb4f823fd3966d68ffd Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 16:45:21 +0700 Subject: [PATCH 042/120] Update readme.md --- tff_modular/modules/tgmc_xenos/readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index 19732282c6b..b9e44503b81 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -10,7 +10,9 @@ code\modules\mob\living\carbon\human\human_defense.dm: `/mob/living/carbon/human/attack_alien` TO: tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm -- Hi!!! Hello!!! +- OVERRIDE: code\game\objects\structures\aliens.dm: `/obj/structure/alien/weeds/should_atmos_process` + IN: + tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm Additions: @@ -41,4 +43,5 @@ IN: code/__HELPERS/~ff_helpers/is_helpers.dm ## Credits TGMC & CM - Where the sprites, sound, and ideas for caste abilities came from + Original developer of these xenos (apparently it's @Paxilmaniac) - Porting the xenos from TGMC and adopting their stuff to work with our code From d013aa86ad94d7b3cae8b3f96df1f0adaaa3afe0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 18:54:12 +0700 Subject: [PATCH 043/120] triple charge removal --- .../tgmc_xenos/code/powers/alien_powers.dm | 45 ------------------- .../tgmc_xenos/code/xeno_types/ravager.dm | 1 - 2 files changed, 46 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm index 38881465eaa..d4b7abdf6b2 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm @@ -656,51 +656,6 @@ GLOB.move_manager.stop_looping(owner) -// Тройной чардж равагера -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager - name = "Triple Charge Attack" - desc = "Allows you to charge thrice at a location, trampling any in your path." - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING - cooldown_time = 30 SECONDS - charge_delay = 0.3 SECONDS - charge_distance = 7 - charge_past = 3 - destroy_objects = FALSE - charge_damage = 25 - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "ravager_charge" - unset_after_click = TRUE - - // Количество урона по меху при ударе - var/vehicle_damage = 30 - // Острый ли удар при столкновении - var/impact_sharpness = TRUE - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/Activate(atom/target_atom) - . = ..() - return TRUE - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/do_charge_indicator(atom/charger, atom/charge_target) - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar2.ogg', 100, TRUE, 8, 0.9) - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/can_hit_target(atom/movable/source, atom/target) - return isliving(target) || ismecha(target) - -/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager/hit_target(atom/movable/source, atom/target, damage_dealt) - if(isliving(target)) - var/mob/living/victim = target - victim.visible_message(span_danger("[source] slams into [target]!"), span_userdanger("[source] tramples you into the ground!")) - victim.apply_damage(charge_damage, BRUTE, sharpness = impact_sharpness) - else if(ismecha(target)) - GLOB.move_manager.stop_looping(source) - var/obj/vehicle/sealed/mecha/victim = target - source.visible_message(span_danger("[source] smashes into [target]!"), span_danger("You smashes into [target]!")) - victim.take_damage(vehicle_damage, BRUTE) - playsound(get_turf(target), 'sound/effects/meteorimpact.ogg', 100, TRUE) - shake_camera(target, 4, 3) - shake_camera(source, 2, 3) - - // Способность дефендера становиться настоящей крепостью /datum/action/cooldown/alien/fortify name = "Fortify" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index f1118aac5eb..e925ac70354 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -23,7 +23,6 @@ var/static/list/innate_actions = list( /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/slicing, /datum/action/cooldown/alien/tgmc/literally_too_angry_to_die, - /datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager, ) grant_actions_by_list(innate_actions) From 7e8a3379fee00ec44bf02c9e954ef31f27503b83 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 19:57:37 +0700 Subject: [PATCH 044/120] changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - чардж крашера теперь тратит плазму, но имеет меньший откат способности - чардж наносит больше урона по аирлокам + изменены звуки --- .../tgmc_xenos/code/powers/alien_powers.dm | 30 +++++++++++++++--- .../sound/alien_footstep_charge1.ogg | Bin 0 -> 9897 bytes 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/sound/alien_footstep_charge1.ogg diff --git a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm index d4b7abdf6b2..6119ea6aedb 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm @@ -521,10 +521,10 @@ // Чардж крашера /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge - name = "Charge Attack" + name = "Charge Attack (125)" desc = "Allows you to charge at a position, trampling anything in your path." check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING - cooldown_time = 15 SECONDS + cooldown_time = 2 SECONDS charge_delay = 0.3 SECONDS charge_distance = 7 destroy_objects = FALSE @@ -545,12 +545,31 @@ var/crush_walls = TRUE var/crush_reinforced_walls = TRUE + var/plasma_cost = 125 + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/Activate(atom/target_atom) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.adjustPlasma(-plasma_cost) + return ..() + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!istgmcalien(owner)) + return FALSE + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.getPlasma() < plasma_cost) + return FALSE + + return TRUE + /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/do_charge_indicator(atom/charger, atom/charge_target) . = ..() - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 100, TRUE, 8, 0.9) + playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 75, TRUE, 8, 0.9) /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/on_moved(atom/source) - playsound(source, 'sound/effects/meteorimpact.ogg', 100, TRUE, 2, TRUE) + playsound(source, 'tff_modular/modules/tgmc_xenos/sound/alien_footstep_charge1.ogg', 100, TRUE, 2, TRUE) /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/hit_target(atom/movable/source, atom/target, damage_dealt) var/mob/living/carbon/alien/adult/tgmc/charger = owner @@ -599,7 +618,7 @@ damage = mecha_damage else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/target_airlock = target - damage = ceil(target_airlock.normal_integrity / 3) + damage = ceil(target_airlock.normal_integrity / 2) else if(istype(target, /obj/structure/window)) damage = 1000 // Нужно сломать за 1 раз @@ -627,6 +646,7 @@ if(target_obj.anchored) charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) do_stop() + return charger.visible_message("[span_warning("[charger] knocks [target] aside.")]!", span_alertalien("We knock [target] aside.")) return diff --git a/tff_modular/modules/tgmc_xenos/sound/alien_footstep_charge1.ogg b/tff_modular/modules/tgmc_xenos/sound/alien_footstep_charge1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e402b8bad46c94607b5f1f64f80e9bf74a48e814 GIT binary patch literal 9897 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 literal 0 HcmV?d00001 From d3f2ea0913a0b6f7ed030c436b2513785289a6fb Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 20:18:34 +0700 Subject: [PATCH 045/120] mortar things --- .../tgmc_xenos/mortar/misc/fire_spread.dm | 3 ++ .../tgmc_xenos/mortar/mortar_shells.dm | 32 +++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm index 511de32f661..0f717e57f6b 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm @@ -15,6 +15,9 @@ light_color = LIGHT_COLOR_FIRE /obj/effect/particle_effect/fluid/smoke/fire/Initialize(mapload, datum/fluid_group/group, ...) + if(isspaceturf(get_turf(src))) + qdel(src) + return . = ..() RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(movable_entered)) addtimer(CALLBACK(src, PROC_REF(lower_fire)), lifetime / 3) diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm index 05a5aee61e0..84b90c98b6a 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm @@ -19,7 +19,7 @@ qdel(src) /obj/item/mortar_shell/proc/explosion_effect(turf/T) - forceMove(T) + return /obj/item/mortar_shell/he @@ -43,16 +43,29 @@ desc = "An 80mm mortar shell, loaded with a fragmentation charge." icon_state = "mortar_ammo_frag" - // dealing with creating a [/datum/component/pellet_cloud] on detonate - /// if set, will spew out projectiles of this type - var/shrapnel_type = /obj/item/shrapnel - /// the higher this number, the more projectiles are created as shrapnel - var/shrapnel_radius = 20 + var/obj/item/grenade/grenade_type = /obj/item/grenade/mortar_thing /obj/item/mortar_shell/frag/explosion_effect(turf/T) - AddComponent(/datum/component/pellet_cloud, projectile_type = shrapnel_type, magnitude = shrapnel_radius) - sleep(4) explosion(T, 0, 0, 5, 2) + sleep(4) + var/obj/item/grenade/grenade = new grenade_type(T) + grenade.detonate(sender) + +/obj/item/grenade/mortar_thing + name = "ERROR" + desc = "You should not have to see this. Tell your nearest maintainer about it!" + + shrapnel_type = /obj/projectile/bullet/shrapnel/mortar + shrapnel_radius = 4 + +/obj/item/grenade/mortar_thing/detonate(mob/living/lanced_by) + . = ..() + qdel(src) + +/obj/projectile/bullet/shrapnel/mortar + damage = 25 + ricochet_chance = 20 + wound_bonus = 50 /obj/item/mortar_shell/incendiary @@ -76,10 +89,11 @@ icon_state = "mortar_ammo_flashbang" var/range = 4 + var/grenade_type = /obj/item/grenade/clusterbuster/mortar /obj/item/mortar_shell/flashbang/explosion_effect(turf/T) explosion(T, 0, 0, 1, 0) - var/obj/item/grenade/clusterbuster/flashbang = new /obj/item/grenade/clusterbuster/mortar(T) + var/obj/item/grenade/flashbang = new grenade_type(T) flashbang.arm_grenade(sender, 1 SECONDS) /obj/item/grenade/clusterbuster/mortar From f700ddb3a6dfb13e7a9a98aecd0da87f2f6d2887 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 27 Mar 2025 21:30:43 +0700 Subject: [PATCH 046/120] fix --- .../tgmc_xenos/mortar/misc/fire_spread.dm | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm index 0f717e57f6b..f3f0936acad 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm @@ -14,19 +14,50 @@ light_power = 1 light_color = LIGHT_COLOR_FIRE + var/static/loc_connections2 = list( + COMSIG_ATOM_ENTERED = PROC_REF(movable_entered) + ) + /obj/effect/particle_effect/fluid/smoke/fire/Initialize(mapload, datum/fluid_group/group, ...) - if(isspaceturf(get_turf(src))) - qdel(src) - return . = ..() - RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(movable_entered)) + AddElement(/datum/element/connect_loc, loc_connections2) addtimer(CALLBACK(src, PROC_REF(lower_fire)), lifetime / 3) set_light_range(LIGHT_RANGE_FIRE + 1) update_light() -/obj/effect/particle_effect/fluid/smoke/fire/Destroy() - . = ..() - UnregisterSignal(loc, COMSIG_ATOM_ENTERED) +/obj/effect/particle_effect/fluid/smoke/fire/spread(seconds_per_tick = 0.1 SECONDS) + if(group.total_size > group.target_size) + return + var/turf/t_loc = get_turf(src) + if(!t_loc) + return + + for(var/turf/spread_turf in t_loc.get_atmos_adjacent_turfs()) + if(group.total_size > group.target_size) + break + if(locate(type) in spread_turf) + continue // Don't spread smoke where there's already smoke! + if(isspaceturf(spread_turf)) + continue + for(var/mob/living/smoker in spread_turf) + smoke_mob(smoker, seconds_per_tick) + + var/obj/effect/particle_effect/fluid/smoke/spread_smoke = new type(spread_turf, group, src) + reagents.copy_to(spread_smoke, reagents.total_volume) + spread_smoke.add_atom_colour(color, FIXED_COLOUR_PRIORITY) + spread_smoke.lifetime = lifetime + + // the smoke spreads rapidly, but not instantly + SSsmoke.queue_spread(spread_smoke) + + if(isspaceturf(t_loc)) + qdel(src) + +/obj/effect/particle_effect/fluid/smoke/fire/process(seconds_per_tick) + if(isspaceturf(get_turf(src))) + qdel(src) + return FALSE + return ..() /obj/effect/particle_effect/fluid/smoke/fire/proc/lower_fire() switch(icon_state) From bd1f666725aab329bc3ba93fb9b4603abf979d74 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 30 Mar 2025 18:08:01 +0700 Subject: [PATCH 047/120] changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - сентинел получил способность становиться невидимым - регенерация от резины уменьшена, но увеличен множитель отдыха на резине - небольшие перестановки в модуле - исправлены некоторые баги --- .../modules/tgmc_xenos/code/base_alien.dm | 5 + tff_modular/modules/tgmc_xenos/code/organs.dm | 4 +- .../tgmc_xenos/code/powers/alien_powers.dm | 314 +----------------- .../modules/tgmc_xenos/code/powers/charge.dm | 157 +++++++++ .../tgmc_xenos/code/powers/tailsweep.dm | 137 ++++++++ .../tgmc_xenos/code/xeno_types/crusher.dm | 3 +- .../tgmc_xenos/code/xeno_types/defender.dm | 3 +- .../tgmc_xenos/code/xeno_types/drone.dm | 5 +- .../tgmc_xenos/code/xeno_types/praetorian.dm | 3 +- .../tgmc_xenos/code/xeno_types/queen.dm | 7 +- .../tgmc_xenos/code/xeno_types/rouny.dm | 7 +- .../tgmc_xenos/code/xeno_types/sentinel.dm | 5 + .../tgmc_xenos/code/xeno_types/spitter.dm | 2 - tgstation.dme | 4 +- 14 files changed, 333 insertions(+), 323 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/powers/charge.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 22051afa6d2..09e61888c95 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -236,3 +236,8 @@ /datum/movespeed_modifier/alien_rest multiplicative_slowdown = 5 + +/mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) + . = ..() + for(var/datum/action/cooldown/ability in actions) + ability.build_all_button_icons() diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/organs.dm index b6640bc2fc6..bb49d360487 100644 --- a/tff_modular/modules/tgmc_xenos/code/organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/organs.dm @@ -14,10 +14,10 @@ stored_plasma = 100 max_plasma = 250 - heal_rate = 2.5 + heal_rate = 1 plasma_rate = 5 - var/resting_mult = 3 + var/resting_mult = 8 /obj/item/organ/alien/plasmavessel/tgmc/on_life(seconds_per_tick, times_fired) var/delta_time = DELTA_WORLD_TIME(SSmobs) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm index 6119ea6aedb..f82f5534bd2 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm @@ -1,10 +1,5 @@ /// TGMC_XENOS (old nova sector xenos) -#define RAVAGER_OUTLINE_EFFECT "ravager_endure_outline" -#define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 -#define RUNNER_BLUR_EFFECT "runner_evasion" - -// Способность эволюционировать /datum/action/cooldown/alien/tgmc button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' /// Some xeno abilities block other abilities from being used, this allows them to get around that in cases where it is needed @@ -22,6 +17,8 @@ if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) return FALSE + +// Способность эволюционировать /datum/action/cooldown/alien/tgmc/generic_evolve name = "Evolve" desc = "Allows us to evolve to a higher caste of our type, if there is not one already." @@ -236,143 +233,6 @@ corrosion_acid_volume = 1000 -// Взмах хвоста дефендера + является базовым для взмахов хвоста королевы и равагера -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep - name = "Crushing Tail Sweep" - desc = "Throw back attackers with a sweep of your tail, likely breaking some bones in the process." - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING - cooldown_time = 60 SECONDS - aoe_radius = 1 - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "crush_tail" - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/defender - - /// The sound that the tail sweep will make upon hitting something - var/impact_sound = 'sound/effects/clang.ogg' - /// How long mobs hit by the tailsweep should be knocked down for - var/knockdown_time = 4 SECONDS - /// How much damage tail sweep impacts should do to a mob - var/impact_damage = 30 - /// What wound bonus should the tai sweep impact have - var/impact_wound_bonus = 20 - /// What type of sharpness should this tail sweep have - var/impact_sharpness = FALSE - /// What type of damage should the tail sweep do - var/impact_damage_type = BRUTE - // Урон по мехам - var/vehicle_damage = 20 - // Время стана оператора меха - var/mecha_occupant_stun_duration - // Можем ли откинуть мех ударом хвоста - var/vehicle_throwing = TRUE - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - - var/mob/living/carbon/alien/adult/tgmc/owner_alien = owner - if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) - return FALSE - -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) - if(!isliving(victim) && !ismecha(victim)) - return - - if(isalien(victim)) - return - - var/turf/throwtarget = get_edge_target_turf(caster, get_dir(caster, get_step_away(victim, caster))) - var/dist_from_caster = get_dist(victim, caster) - if(isliving(victim)) - var/mob/living/victim_living = victim - if(dist_from_caster <= 0) - victim_living.Knockdown(knockdown_time) - if(sparkle_path) - new sparkle_path(get_turf(victim_living), get_dir(caster, victim_living)) - else - victim_living.Knockdown(knockdown_time * 2) //They are on the same turf as us, or... somewhere else, I'm not sure how but they are getting smacked down - - victim_living.apply_damage(impact_damage, impact_damage_type, BODY_ZONE_CHEST, wound_bonus = impact_wound_bonus, sharpness = impact_sharpness) - shake_camera(victim_living, 4, 3) - playsound(victim_living, impact_sound, 100, TRUE, 8, 0.9) - victim.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) - - victim_living.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) - - else if(ismecha(victim)) - var/obj/vehicle/sealed/mecha/victim_mecha = victim - var/list/mob/occupants = victim_mecha.return_occupants() - - for(var/mob/living/occupant in occupants) - if(!isliving(occupant)) - continue - if(!isnull(mecha_occupant_stun_duration)) - occupant.Stun(mecha_occupant_stun_duration) - shake_camera(occupant, 4, 3) - playsound(occupant, impact_sound, 100, TRUE, 8, 0.9) - - victim_mecha.take_damage(vehicle_damage, impact_damage_type) - victim_mecha.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) - - if(vehicle_throwing) - if((victim_mecha.max_integrity < 400) && (dist_from_caster <= 1)) - victim_mecha.safe_throw_at(throwtarget, 1, 1, caster, spin = FALSE, force = repulse_force) - -/obj/effect/temp_visual/dir_setting/tailsweep/defender - icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - icon_state = "crush_tail_anim" - - -// Взмах хвоста преторианца -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/hard_throwing - name = "Flinging Tail Sweep" - desc = "Throw back attackers with a sweep of your tail that is much stronger than other aliens." - - aoe_radius = 2 - repulse_force = MOVE_FORCE_OVERPOWERING //Fuck everyone who gets hit by this tail in particular - - button_icon_state = "throw_tail" - - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/praetorian - - impact_sound = 'sound/items/weapons/slap.ogg' - impact_damage = 20 - impact_wound_bonus = 10 - - mecha_occupant_stun_duration = 1.2 SECONDS - -/obj/effect/temp_visual/dir_setting/tailsweep/praetorian - icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - icon_state = "throw_tail_anim" - - -// Взмах хвоста равагера -/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/slicing - name = "Slicing Tail Sweep" - desc = "Throw back attackers with a swipe of your tail, slicing them with its sharpened tip." - - aoe_radius = 2 - - button_icon_state = "slice_tail" - - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/ravager - - sound = 'tff_modular/modules/tgmc_xenos/sound/alien_tail_swipe.ogg' //The defender's tail sound isn't changed because its big and heavy, this isn't - - impact_sound = 'modular_nova/master_files/sound/weapons/bloodyslice.ogg' - impact_damage = 40 - impact_sharpness = SHARP_EDGED - - vehicle_damage = 10 - mecha_occupant_stun_duration = null - vehicle_throwing = FALSE - -/obj/effect/temp_visual/dir_setting/tailsweep/ravager - icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - icon_state = "slice_tail_anim" - - // Хил-аура дрона /datum/action/cooldown/alien/tgmc/heal_aura name = "Healing Aura" @@ -433,6 +293,8 @@ // Все сказано в названии подтипа. Только равагер имеет такое +#define RAVAGER_OUTLINE_EFFECT "ravager_endure_outline" + /datum/action/cooldown/alien/tgmc/literally_too_angry_to_die name = "Endure" desc = "Imbue your body with unimaginable amounts of rage (and plasma) to allow yourself to ignore all pain for a short time." @@ -467,8 +329,13 @@ REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAIT_XENO_ABILITY_GIVEN) REMOVE_TRAIT(owner, TRAIT_NOHARDCRIT, TRAIT_XENO_ABILITY_GIVEN) +#undef RAVAGER_OUTLINE_EFFECT + // Забавный код для руни +#define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 +#define RUNNER_BLUR_EFFECT "runner_evasion" + /datum/action/cooldown/alien/tgmc/evade name = "Evade" desc = "Allows you to evade any projectile that would hit you for a few seconds." @@ -518,162 +385,8 @@ addtimer(CALLBACK(owner, TYPE_PROC_REF(/datum, remove_filter), RUNNER_BLUR_EFFECT), 0.5 SECONDS) return BULLET_ACT_FORCE_PIERCE - -// Чардж крашера -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge - name = "Charge Attack (125)" - desc = "Allows you to charge at a position, trampling anything in your path." - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING - cooldown_time = 2 SECONDS - charge_delay = 0.3 SECONDS - charge_distance = 7 - destroy_objects = FALSE - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "crusher_charge" - unset_after_click = TRUE - - var/living_damage = 40 - var/living_knockdown_time = 5 SECONDS - var/living_daze_amount = 3 SECONDS - var/sharpness = FALSE - - var/obj_damage = 50 - var/mecha_damage = 75 - var/mecha_occupants_stun_time = 5 SECONDS - var/throw_mecha = TRUE - - var/crush_walls = TRUE - var/crush_reinforced_walls = TRUE - - var/plasma_cost = 125 - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/Activate(atom/target_atom) - var/mob/living/carbon/carbon_owner = owner - carbon_owner.adjustPlasma(-plasma_cost) - return ..() - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/IsAvailable(feedback) - . = ..() - if(!.) - return FALSE - if(!istgmcalien(owner)) - return FALSE - var/mob/living/carbon/carbon_owner = owner - if(carbon_owner.getPlasma() < plasma_cost) - return FALSE - - return TRUE - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/do_charge_indicator(atom/charger, atom/charge_target) - . = ..() - playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 75, TRUE, 8, 0.9) - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/on_moved(atom/source) - playsound(source, 'tff_modular/modules/tgmc_xenos/sound/alien_footstep_charge1.ogg', 100, TRUE, 2, TRUE) - -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/hit_target(atom/movable/source, atom/target, damage_dealt) - var/mob/living/carbon/alien/adult/tgmc/charger = owner - - // Столокновение с существами - if(isliving(target)) - var/mob/living/target_living = target - if(target_living.buckled) - target_living.buckled.unbuckle_mob(target_living) - - log_combat(charger, target_living, "xeno charged") - var/damage = living_damage - target_living.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, sharpness = sharpness) - - if(target_living.density && (target_living.mob_size >= charger.mob_size)) - charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) - do_stop() - return - - var/fling_dir = pick((charger.dir & (NORTH|SOUTH)) ? list(WEST, EAST, charger.dir|WEST, charger.dir|EAST) : list(NORTH, SOUTH, charger.dir|NORTH, charger.dir|SOUTH)) - var/fling_dist = rand(1, 3) - var/turf/destination = target_living.loc - var/turf/temp - - for(var/i in 1 to fling_dist) - temp = get_step(destination, fling_dir) - if(!temp) - break - destination = temp - - if(destination != target_living.loc) - target_living.throw_at(destination, fling_dist, 1, charger, TRUE) - - target_living.Knockdown(living_knockdown_time, daze_amount = living_daze_amount) - charger.visible_message(span_danger("[charger] rams [target]!"), span_alertalien("We ram [target]!")) - return - - // Столокновение с объектами - if(isobj(target)) - var/obj/target_obj = target - if(istype(target_obj, /obj/structure/alien)) - return - - var/damage = obj_damage - if(ismecha(target)) - damage = mecha_damage - else if(istype(target, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/target_airlock = target - damage = ceil(target_airlock.normal_integrity / 2) - else if(istype(target, /obj/structure/window)) - damage = 1000 // Нужно сломать за 1 раз - - target_obj.take_damage(damage, BRUTE) - if(QDELETED(target_obj)) - charger.visible_message(span_danger("[charger] crushes [target]!"), span_alertalien("We crush [target]!")) - return - - if(ismecha(target)) - var/obj/vehicle/sealed/mecha/target_mecha = target - - for(var/mob/living/occupant in target_mecha.occupants) - occupant.Stun(mecha_occupants_stun_time) - - charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) - do_stop() - - var/turf/throwtarget = get_edge_target_turf(source, get_dir(source, get_step_away(target, source))) - var/dist_from_source = get_dist(target, source) - if(throw_mecha && (target.max_integrity < 400) && (dist_from_source <= 1)) - target_mecha.safe_throw_at(throwtarget, 1, 1, source, spin = FALSE, force = MOVE_FORCE_EXTREMELY_STRONG) - - return - - if(target_obj.anchored) - charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) - do_stop() - return - - charger.visible_message("[span_warning("[charger] knocks [target] aside.")]!", span_alertalien("We knock [target] aside.")) - return - - // Столокновение с турфами - if(isturf(target)) - if(crush_walls) - if(!isclosedturf(target) || isindestructiblewall(target)) - return - if(!crush_reinforced_walls && istype(target, /turf/closed/wall/r_wall)) - return - - target.AddComponent(/datum/component/torn_wall) - if(!QDELETED(target) && !istype(target, /turf/closed/wall/r_wall)) - target.AddComponent(/datum/component/torn_wall) - - if(QDELETED(target)) - charger.visible_message(span_danger("[charger] plows straight through [target]!"), span_alertalien("We plow straight through [target]!")) - return - - charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) - do_stop() - return - -// Останавливает движение чарджера -/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/proc/do_stop() - GLOB.move_manager.stop_looping(owner) +#undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE +#undef RUNNER_BLUR_EFFECT // Способность дефендера становиться настоящей крепостью @@ -731,8 +444,3 @@ xeno_owner.resist_heavy_hits = on playsound(xeno_owner, 'sound/effects/stonedoor_openclose.ogg', 30, TRUE) xeno_owner.update_icons() - - -#undef RAVAGER_OUTLINE_EFFECT -#undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE -#undef RUNNER_BLUR_EFFECT diff --git a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm new file mode 100644 index 00000000000..5ef379af8f0 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm @@ -0,0 +1,157 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Чардж крашера +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge + name = "Charge Attack (125)" + desc = "Allows you to charge at a position, trampling anything in your path." + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING + cooldown_time = 2 SECONDS + charge_delay = 0.3 SECONDS + charge_distance = 7 + destroy_objects = FALSE + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "crusher_charge" + unset_after_click = TRUE + + var/living_damage = 40 + var/living_paralyze_time = 5 SECONDS + var/sharpness = FALSE + + var/obj_damage = 50 + var/mecha_damage = 75 + var/mecha_occupants_stun_time = 5 SECONDS + var/throw_mecha = TRUE + + var/crush_walls = TRUE + var/crush_reinforced_walls = TRUE + + var/plasma_cost = 125 + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/Activate(atom/target_atom) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.adjustPlasma(-plasma_cost) + return ..() + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!istgmcalien(owner)) + return FALSE + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.getPlasma() < plasma_cost) + return FALSE + + return TRUE + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/do_charge_indicator(atom/charger, atom/charge_target) + . = ..() + playsound(charger, 'tff_modular/modules/tgmc_xenos/sound/alien_roar1.ogg', 75, TRUE, 8, 0.9) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/on_moved(atom/source) + playsound(source, 'tff_modular/modules/tgmc_xenos/sound/alien_footstep_charge1.ogg', 100, TRUE, 2, TRUE) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/hit_target(atom/movable/source, atom/target, damage_dealt) + var/mob/living/carbon/alien/adult/tgmc/charger = owner + + // Столокновение с существами + if(isliving(target)) + var/mob/living/crushed_living = target + if(crushed_living.buckled) + crushed_living.buckled.unbuckle_mob(crushed_living) + + log_combat(charger, crushed_living, "xeno charged") + var/damage = living_damage + crushed_living.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, sharpness = sharpness) + + if(crushed_living.density && (crushed_living.mob_size >= charger.mob_size)) + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() + return + + var/fling_dir = pick((charger.dir & (NORTH|SOUTH)) ? list(WEST, EAST, charger.dir|WEST, charger.dir|EAST) : list(NORTH, SOUTH, charger.dir|NORTH, charger.dir|SOUTH)) + var/fling_dist = rand(1, 3) + var/turf/destination = crushed_living.loc + var/turf/temp + + for(var/i in 1 to fling_dist) + temp = get_step(destination, fling_dir) + if(!temp) + break + destination = temp + + if(destination != crushed_living.loc) + crushed_living.throw_at(destination, fling_dist, 1, charger, TRUE) + + crushed_living.Paralyze(living_paralyze_time) + charger.visible_message(span_danger("[charger] rams [target]!"), span_alertalien("We ram [target]!")) + return + + // Столокновение с объектами + else if(isobj(target)) + var/obj/crushed_obj = target + if(istype(crushed_obj, /obj/structure/alien)) + return + + var/damage = obj_damage + if(ismecha(target)) + damage = mecha_damage + else if(istype(target, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/target_airlock = target + damage = ceil(target_airlock.normal_integrity / 2) + else if(istype(target, /obj/structure/window)) + damage = 1000 // Нужно сломать за 1 раз + + crushed_obj.take_damage(damage, BRUTE) + if(QDELETED(crushed_obj)) + charger.visible_message(span_danger("[charger] crushes [target]!"), span_alertalien("We crush [target]!")) + return + + if(ismecha(target)) + var/obj/vehicle/sealed/mecha/target_mecha = target + + for(var/mob/living/occupant in target_mecha.occupants) + occupant.Stun(mecha_occupants_stun_time) + + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() + + var/turf/throwtarget = get_edge_target_turf(source, get_dir(source, get_step_away(target, source))) + var/dist_from_source = get_dist(target, source) + if(throw_mecha && (target.max_integrity < 400) && (dist_from_source <= 1)) + target_mecha.safe_throw_at(throwtarget, 1, 1, source, spin = FALSE, force = MOVE_FORCE_EXTREMELY_STRONG) + + return + + if(crushed_obj.anchored) + charger.visible_message(span_danger("[charger] rams into [target] and skids to a halt!"), span_alertalien("We ram into [target] and skid to a halt!")) + do_stop() + return + + charger.visible_message("[span_warning("[charger] knocks [target] aside.")]!", span_alertalien("We knock [target] aside.")) + return + + // Столокновение с турфами + else if(isturf(target)) + var/turf/crushed_turf + if(crush_walls) + if(!isclosedturf(crushed_turf) || isindestructiblewall(crushed_turf)) + return + if(!crush_reinforced_walls && istype(crushed_turf, /turf/closed/wall/r_wall)) + return + + crushed_turf.AddComponent(/datum/component/torn_wall) + if(!QDELETED(crushed_turf) && !istype(crushed_turf, /turf/closed/wall/r_wall)) + crushed_turf.AddComponent(/datum/component/torn_wall) + + if(QDELETED(crushed_turf)) + charger.visible_message(span_danger("[charger] plows straight through [crushed_turf]!"), span_alertalien("We plow straight through [crushed_turf]!")) + return + + charger.visible_message(span_danger("[charger] rams into [crushed_turf] and skids to a halt!"), span_alertalien("We ram into [crushed_turf] and skid to a halt!")) + do_stop() + return + +// Останавливает движение чарджера +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/proc/do_stop() + GLOB.move_manager.stop_looping(owner) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm b/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm new file mode 100644 index 00000000000..38bdc93f0a6 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm @@ -0,0 +1,137 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Взмах хвоста дефендера + является базовым для взмахов хвоста королевы и равагера +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep + name = "Crushing Tail Sweep" + desc = "Throw back attackers with a sweep of your tail, likely breaking some bones in the process." + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_LYING + cooldown_time = 60 SECONDS + aoe_radius = 1 + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "crush_tail" + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/defender + + /// The sound that the tail sweep will make upon hitting something + var/impact_sound = 'sound/effects/clang.ogg' + /// How long mobs hit by the tailsweep should be knocked down for + var/knockdown_time = 4 SECONDS + /// How much damage tail sweep impacts should do to a mob + var/impact_damage = 30 + /// What wound bonus should the tai sweep impact have + var/impact_wound_bonus = 20 + /// What type of sharpness should this tail sweep have + var/impact_sharpness = FALSE + /// What type of damage should the tail sweep do + var/impact_damage_type = BRUTE + // Урон по мехам + var/vehicle_damage = 20 + // Можем ли откинуть мех ударом хвоста + var/vehicle_throwing = TRUE + // Время стана оператора меха + var/mecha_occupant_stun_duration + +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + var/mob/living/carbon/alien/adult/tgmc/owner_alien = owner + if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) + return FALSE + +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) + if(!isliving(victim) && !ismecha(victim)) + return + + if(isalien(victim)) + return + + var/turf/throwtarget = get_edge_target_turf(caster, get_dir(caster, get_step_away(victim, caster))) + var/dist_from_caster = get_dist(victim, caster) + if(isliving(victim)) + var/mob/living/victim_living = victim + if(dist_from_caster <= 0) + victim_living.Knockdown(knockdown_time) + if(sparkle_path) + new sparkle_path(get_turf(victim_living), get_dir(caster, victim_living)) + else + victim_living.Knockdown(knockdown_time * 2) //They are on the same turf as us, or... somewhere else, I'm not sure how but they are getting smacked down + + victim_living.apply_damage(impact_damage, impact_damage_type, BODY_ZONE_CHEST, wound_bonus = impact_wound_bonus, sharpness = impact_sharpness) + shake_camera(victim_living, 4, 3) + playsound(victim_living, impact_sound, 100, TRUE, 8, 0.9) + victim.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) + + victim_living.safe_throw_at(throwtarget, ((clamp((max_throw - (clamp(dist_from_caster - 2, 0, dist_from_caster))), 3, max_throw))), 1, caster, force = repulse_force) + + else if(ismecha(victim)) + var/obj/vehicle/sealed/mecha/victim_mecha = victim + var/list/mob/occupants = victim_mecha.return_occupants() + + for(var/mob/living/occupant in occupants) + if(!isliving(occupant)) + continue + if(!isnull(mecha_occupant_stun_duration)) + occupant.Stun(mecha_occupant_stun_duration) + shake_camera(occupant, 4, 3) + playsound(occupant, impact_sound, 100, TRUE, 8, 0.9) + + victim_mecha.take_damage(vehicle_damage, impact_damage_type) + victim_mecha.visible_message(span_danger("[caster]'s tail slams into [victim], throwing them back!"), span_userdanger("[caster]'s tail slams into you, throwing you back!")) + + if(vehicle_throwing) + if((victim_mecha.max_integrity < 400) && (dist_from_caster <= 1)) + victim_mecha.safe_throw_at(throwtarget, 1, 1, caster, spin = FALSE, force = repulse_force) + +/obj/effect/temp_visual/dir_setting/tailsweep/defender + icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + icon_state = "crush_tail_anim" + + +// Взмах хвоста преторианца +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/hard_throwing + name = "Flinging Tail Sweep" + desc = "Throw back attackers with a sweep of your tail that is much stronger than other aliens." + + aoe_radius = 2 + repulse_force = MOVE_FORCE_OVERPOWERING //Fuck everyone who gets hit by this tail in particular + + button_icon_state = "throw_tail" + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/praetorian + + impact_sound = 'sound/items/weapons/slap.ogg' + impact_damage = 20 + impact_wound_bonus = 10 + + mecha_occupant_stun_duration = 1.2 SECONDS + +/obj/effect/temp_visual/dir_setting/tailsweep/praetorian + icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + icon_state = "throw_tail_anim" + + +// Взмах хвоста равагера +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/slicing + name = "Slicing Tail Sweep" + desc = "Throw back attackers with a swipe of your tail, slicing them with its sharpened tip." + + aoe_radius = 2 + + button_icon_state = "slice_tail" + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/ravager + + sound = 'tff_modular/modules/tgmc_xenos/sound/alien_tail_swipe.ogg' //The defender's tail sound isn't changed because its big and heavy, this isn't + + impact_sound = 'modular_nova/master_files/sound/weapons/bloodyslice.ogg' + impact_damage = 40 + impact_sharpness = SHARP_EDGED + + vehicle_damage = 10 + mecha_occupant_stun_duration = null + vehicle_throwing = FALSE + +/obj/effect/temp_visual/dir_setting/tailsweep/ravager + icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + icon_state = "slice_tail_anim" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 74b6ccb11ff..20ff4f0dbc2 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -27,6 +27,5 @@ ) grant_actions_by_list(innate_actions) - REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 745578464fe..523cd6b3d95 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -26,9 +26,8 @@ ) grant_actions_by_list(innate_actions) - REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /mob/living/carbon/alien/adult/tgmc/defender/update_icons() . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 8df8e2a10e5..ec68bca07d6 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -23,4 +23,7 @@ /mob/living/carbon/alien/adult/tgmc/drone/Initialize(mapload) . = ..() - GRANT_ACTION(/datum/action/cooldown/alien/tgmc/heal_aura) + var/static/list/innate_actions = list( + /datum/action/cooldown/alien/tgmc/heal_aura, + ) + grant_actions_by_list(innate_actions) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 59d863fe35a..9f04b10df68 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -30,6 +30,5 @@ ) grant_actions_by_list(innate_actions) - REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index ed4127b746a..0844c4b1dd6 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -24,20 +24,17 @@ /mob/living/carbon/alien/adult/tgmc/queen/Initialize(mapload) . = ..() - AddComponent(/datum/component/seethrough_mob) // Люркеров у нас нету (слава богу), но выдать такую штуку кому-то хочется... Будет у королевы, как на обычном ТГ - var/static/list/innate_actions = list( /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/hard_throwing, /datum/action/cooldown/alien/tgmc/queen_screech, ) grant_actions_by_list(innate_actions) - REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /mob/living/carbon/alien/adult/tgmc/queen/alien_talk(message, shown_name = name) - ..(message, shown_name, TRUE) + return ..(message, shown_name, TRUE) /mob/living/carbon/alien/adult/tgmc/queen/death(gibbed) if(stat == DEAD) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 8ddf9bc6660..6e732a52d0a 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -7,8 +7,6 @@ maxHealth = 150 health = 150 icon_state = "alienrunner" - /// Holds the evade ability to be granted to the runner later - var/datum/action/cooldown/alien/tgmc/evade/evade_ability melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/ravager @@ -22,13 +20,16 @@ melee_vehicle_damage = 20 + /// Holds the evade ability to be granted to the runner later + var/datum/action/cooldown/alien/tgmc/evade/evade_ability + /mob/living/carbon/alien/adult/tgmc/runner/Initialize(mapload) . = ..() - AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 7, min_distance = 0) evade_ability = new(src) evade_ability.Grant(src) add_movespeed_modifier(/datum/movespeed_modifier/alien_quick) + AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 7, min_distance = 0) /mob/living/carbon/alien/adult/tgmc/runner/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) if(evade_ability) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index ee9cea26f9f..c22407c8895 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -23,4 +23,9 @@ /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/sneak/alien, + ) + grant_actions_by_list(innate_actions) + add_movespeed_modifier(/datum/movespeed_modifier/alien_slow) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 187997891b7..be3dcf8547b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -24,7 +24,5 @@ /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() - add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) - REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/tgstation.dme b/tgstation.dme index 2d9e453afb8..000c50c06fd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9143,9 +9143,11 @@ #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\projectiles.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\resin_walker.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\alien_powers.dm" -#include "tff_modular\modules\tgmc_xenos\code\powers\resin_walker.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\charge.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\tailsweep.dm" #include "tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\crusher.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" From e3d8d7d3af5b1d8acc91e2162e31609e04c672a4 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 30 Mar 2025 18:28:57 +0700 Subject: [PATCH 048/120] weh --- .../modules/tgmc_xenos/code/{powers => misc}/resin_walker.dm | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tff_modular/modules/tgmc_xenos/code/{powers => misc}/resin_walker.dm (100%) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm b/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/powers/resin_walker.dm rename to tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm From 67bae0a206f59c03b33bae285f49a5d6e7ae6755 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Mon, 31 Mar 2025 19:05:24 +0700 Subject: [PATCH 049/120] changes --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 1 + tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm | 4 +++- tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm | 4 +++- tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm | 4 +++- tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm | 2 +- 10 files changed, 16 insertions(+), 9 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 09e61888c95..017a7255464 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -70,6 +70,7 @@ GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) ADD_TRAIT(src, TRAIT_XENO_HEAL_AURA, TRAIT_XENO_INNATE) + ADD_TRAIT(src, TRAIT_PIERCEIMMUNE, TRAIT_XENO_INNATE) AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) RegisterSignal(src, COMSIG_LIVING_UPDATED_RESTING, PROC_REF(on_rest)) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 20ff4f0dbc2..dd06c6c00e8 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/crusher name = "alien crusher" desc = "A huge alien with an enormous armored crest." + icon_state = "aliencrusher" caste = "crusher" maxHealth = 700 health = 700 - icon_state = "aliencrusher" mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 523cd6b3d95..5d4f8e02291 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/defender name = "alien defender" desc = "A heavy looking alien with a wrecking ball-like tail that'd probably hurt to get hit by." + icon_state = "aliendefender" caste = "defender" maxHealth = 300 health = 300 - icon_state = "aliendefender" mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index ec68bca07d6..b2af49af9ed 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/drone name = "alien drone" desc = "As plain looking as you could call an alien with armored black chitin and large claws." + icon_state = "aliendrone" caste = "drone" maxHealth = 200 health = 200 - icon_state = "aliendrone" melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/praetorian @@ -17,6 +17,8 @@ ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, ) + maptext_height = 32 + maptext_width = 32 hud_offset_y = -16 melee_vehicle_damage = 20 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 9f04b10df68..eafe6d5ffe0 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/praetorian name = "alien praetorian" desc = "An alien that looks like the awkward half-way point between a queen and a drone, in fact that's likely what it is." + icon_state = "alienpraetorian" caste = "praetorian" maxHealth = 400 health = 400 - icon_state = "alienpraetorian" mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 0844c4b1dd6..aa6f5da384f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/queen name = "alien queen" desc = "A hulking beast of an alien, for some reason this one seems more important than the others, you should probably quit staring at it and do something." + icon_state = "alienqueen" caste = "queen" maxHealth = 750 health = 750 - icon_state = "alienqueen" mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index e925ac70354..a7623a5d0c7 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/ravager name = "alien ravager" desc = "An alien with angry red chitin, with equally intimidating looking blade-like claws in place of normal hands. That sharp tail looks like it'd probably hurt." + icon_state = "alienravager" caste = "ravager" maxHealth = 350 health = 350 - icon_state = "alienravager" mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 6e732a52d0a..4c0a9e97f53 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/runner name = "alien runner" desc = "A short alien with sleek red chitin, clearly abiding by the 'red ones go faster' theorem and almost always running on all fours." + icon_state = "alienrunner" caste = "runner" maxHealth = 150 health = 150 - icon_state = "alienrunner" melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/ravager @@ -16,6 +16,8 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small/tiny, ) + maptext_height = 32 + maptext_width = 32 hud_offset_y = -32 melee_vehicle_damage = 20 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index c22407c8895..202a718d151 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/sentinel name = "alien sentinel" desc = "An alien that'd be unremarkable if not for the bright coloring and visible acid glands that cover it." + icon_state = "aliensentinel" caste = "sentinel" maxHealth = 200 health = 200 - icon_state = "aliensentinel" melee_damage_lower = 10 melee_damage_upper = 15 next_evolution = /mob/living/carbon/alien/adult/tgmc/spitter @@ -17,6 +17,8 @@ ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc, ) + maptext_height = 32 + maptext_width = 32 hud_offset_y = -16 melee_vehicle_damage = 15 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index be3dcf8547b..34253956d7f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -3,10 +3,10 @@ /mob/living/carbon/alien/adult/tgmc/spitter name = "alien spitter" desc = "A fairly heavy looking alien with prominent acid glands, it's mouth dripping with... some kind of toxin or acid." + icon_state = "alienspitter" caste = "spitter" maxHealth = 300 health = 300 - icon_state = "alienspitter" mob_size = MOB_SIZE_LARGE melee_damage_lower = 15 melee_damage_upper = 20 From c3b168b926507680ba43c38517945ec3a9cd0a3c Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Mon, 31 Mar 2025 19:05:34 +0700 Subject: [PATCH 050/120] Update fire_spread.dm --- .../tgmc_xenos/mortar/misc/fire_spread.dm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm index f3f0936acad..985fe6fab8e 100644 --- a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm +++ b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm @@ -15,13 +15,14 @@ light_color = LIGHT_COLOR_FIRE var/static/loc_connections2 = list( - COMSIG_ATOM_ENTERED = PROC_REF(movable_entered) + COMSIG_ATOM_ENTERED = PROC_REF(movable_entered), + COMSIG_ATOM_ATTACKBY = PROC_REF(alien_extinguish) ) /obj/effect/particle_effect/fluid/smoke/fire/Initialize(mapload, datum/fluid_group/group, ...) . = ..() AddElement(/datum/element/connect_loc, loc_connections2) - addtimer(CALLBACK(src, PROC_REF(lower_fire)), lifetime / 3) + addtimer(CALLBACK(src, PROC_REF(lower_fire)), initial(lifetime) / 3) set_light_range(LIGHT_RANGE_FIRE + 1) update_light() @@ -64,8 +65,7 @@ if("fire_big") icon_state = "fire_medium" set_light_range(LIGHT_RANGE_FIRE) - - addtimer(CALLBACK(src, PROC_REF(lower_fire)), lifetime / 3) + addtimer(CALLBACK(src, PROC_REF(lower_fire)), initial(lifetime) / 3) if("fire_medium") icon_state = "fire_small" set_light_range(LIGHT_RANGE_FIRE) @@ -78,3 +78,13 @@ return target_atom.fire_act(5000, 1000) + +/obj/effect/particle_effect/fluid/smoke/fire/extinguish() + . = ..() + lifetime -= initial(lifetime) / 2 + +/obj/effect/particle_effect/fluid/smoke/fire/proc/alien_extinguish(mob/living/carbon/alien/adult/user) + lifetime -= initial(lifetime) / 3 + var/obj/item/bodypart/arm/current_arm = user.get_active_hand() + user.apply_damage(5, BURN, current_arm.body_zone) + From 225c3fb6730d0e12609587c08a88c06ac020b164 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 12 Apr 2025 22:58:54 +0700 Subject: [PATCH 051/120] mortar remove --- .../tgmc_xenos/mortar/_mortar_defines.dm | 14 - .../modules/tgmc_xenos/mortar/icons/items.dmi | Bin 1301 -> 0 bytes .../tgmc_xenos/mortar/icons/mortar.dmi | Bin 27659 -> 0 bytes .../mortar/icons/shells_lefthand.dmi | Bin 3598 -> 0 bytes .../mortar/icons/shells_righthand.dmi | Bin 3611 -> 0 bytes .../tgmc_xenos/mortar/misc/fire_spread.dm | 90 ------ .../tgmc_xenos/mortar/misc/rangefinder.dm | 69 ---- .../tgmc_xenos/mortar/mortar_shells.dm | 116 ------- .../modules/tgmc_xenos/mortar/mortars.dm | 296 ------------------ .../mortar/sound/gun_flamethrower2.ogg | Bin 28394 -> 0 bytes .../mortar/sound/gun_mortar_fire.ogg | Bin 9047 -> 0 bytes .../mortar/sound/gun_mortar_reload.ogg | Bin 6857 -> 0 bytes .../mortar/sound/gun_mortar_travel.ogg | Bin 16265 -> 0 bytes .../mortar/sound/gun_mortar_unpack.ogg | Bin 16844 -> 0 bytes tgstation.dme | 5 - 15 files changed, 590 deletions(-) delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/misc/rangefinder.dm delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/mortars.dm delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg delete mode 100644 tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg diff --git a/tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm b/tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm deleted file mode 100644 index d2da9affb57..00000000000 --- a/tff_modular/modules/tgmc_xenos/mortar/_mortar_defines.dm +++ /dev/null @@ -1,14 +0,0 @@ -GLOBAL_VAR_INIT(obfs_x, rand(-500, 500)) -GLOBAL_VAR_INIT(obfs_y, rand(-500, 500)) - -//Offuscate x for coord system -#define obfuscate_x(x) ((x) + GLOB.obfs_x) - -//Offuscate y for coord system -#define obfuscate_y(y) ((y) + GLOB.obfs_y) - -//Deoffuscate x for coord system -#define deobfuscate_x(x) ((x) - GLOB.obfs_x) - -//Deoffuscate y for coord system -#define deobfuscate_y(y) ((y) - GLOB.obfs_y) diff --git a/tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi b/tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi deleted file mode 100644 index bc13ff0e7c03562c90901db2ff34c7a15a7046c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 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 diff --git a/tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi b/tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi deleted file mode 100644 index bbf908a5d817261c6b9b6357b6286a9f3d8fb494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3598 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�g&4qfXgiOYLI*Xa0j)P z<#;!)x39cTj#Nf``owQ&(+({j^p#cvxUoE{ij05~ePmsJyH4DCVpzUY_J)mzbDB8O z2cJl*l^`sx^hQv2uBqm|do`AvV8gy$0h%L!vjOs9*}(=4z=s!CiWwr&Afh?5h)BK1 zF|4~+bCx^SriaChMLxys-PRV{ZUrZfksNJrct;`{-xukz!r=4-IIU`yX~B92y55H) zl9eWu?entM1!(Z2hYU@KlC4-mUOYJpRlW!k{?kvs3kz3nlEfyU!YpxWJ%dXnpvQ;g zQv=!XHOcCuGGerYo&3-H?l*5r+j)7*%Sm{x=TMtQ&R3H!d0D@IZ`s7PQ87fVuD!q2 z0S7(P;}s+jqzgVtsoC!fV9O;E98{mHmi-~-qQOBeH7TiH22t19@83)y$M7F-j972U z!k&!p={iwjDS%TBHs6KIYA=el8mQs;>`Z*`lxng5-Rtokk3NUoQ3MX8miLr#-SKU2 zZTLbIpdtGx6-kN!9H0%p)7R`}Zkb*q_?Dni*R)LUR9i_&U7Zz&}1J|rkNIUZzPfMLeVH24||tnN`gdjx!QSC~*itv6_H zDt?SurB_XMXL5$ych3YdI$OX^TXrHj__O zfUN1@5cLcHip76{=6`WD>(0p_oST#6gfoSP2_G?YBw3lzA`${Sb{Soog~iM`wnd{i zwCKt)_p2gbwRV~sj0b-Y7)>eT;+{Tip|Zn>x=N7KlG<~~?XmnFunFX-M;uXmki!$O#7qQ*KI z6td$dTmB0i_+#9rrw8+TO^6jn8DlI!aF=;er!A{h(!hD_M0(Ab98e)K4gWK+j(bBG z&$w5SvCQ~Y6&Cf?dBS2p>d9E(86IIvTTaH|#pzkO!Yyf8kDcPtuT%qfOP%m8k+_rVmJC;Gs6!+*1@i#^p1WFCEep>q;e?W>>zy!Q?zu? zF$Fh70Q}s{&lBT;yv0R;MA!e53tIrGDYop{qU3(w(q{L3{gMW#?T*tWxKH90&CO-M zBaWN#D#K8V`ZyvQ=WrldaFCd+sLk`JX?|wk#M0IiWHjB9FG|#6<;XkG% z2)yjWEXC*3C0yWn+ITL1W+YF+pVYYZ!?Iq|*gBo(FzJI=a^TOFVQ$;&810t@m|wdy zT>ag=xcY=ZpNyz`!>Jz$@2qlJ;f2~?QCmjR(=sN2c?EZlR|zWDY!v_ zQ?ef}h=HWU9h^T|Jc8w-qK9elrA5wi7m=Tke;BSxy%7dk&VnU$jw5o*^_ zM5K`Vw`ej@gg;~6!x!hD4TVl7Nz+T7f3JXZ2x zu-n%ETOxbu{QbI9Q-A_T?tUIKpD5;1z_Pz6rl-YeIq+uNu3c0D&<8CZ5}8Ho%bLk$ zkf_7D`0Sz@q{}G!e`L$ZOKRZ<;VZ4}!<02~qB^wm!f#p>BX6hLK4^2@LQ64hJbUv! z{$Qd>Aen3dPutut;!B!EwQdvMx_#uEPjhg2EcJ zNy?j{70~SNtL%vb8&D3myy60&tSU+Z9%d!KWPBZSS&iLNKmG20wyrvj0}Bgye7sUY zhH;^MG!_E!rArh5m(;$sl_tawe>g^Z*WX|buv)v_{nL!snyIMn2f?V z`;J?6H}0jp>85CPKhj`Vi=b>zf)NF(bE%Z8LDEovZphL{pM9n2kx#3gB$|~C)Yy1q zt_H6V`&)o0O}p#{{R30 diff --git a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm deleted file mode 100644 index 985fe6fab8e..00000000000 --- a/tff_modular/modules/tgmc_xenos/mortar/misc/fire_spread.dm +++ /dev/null @@ -1,90 +0,0 @@ -/datum/effect_system/fluid_spread/smoke/fire - effect_type = /obj/effect/particle_effect/fluid/smoke/fire - -/obj/effect/particle_effect/fluid/smoke/fire - name = "fire" - icon = 'modular_nova/modules/liquids/icons/obj/effects/liquid.dmi' - icon_state = "fire_big" - pixel_x = 0 - pixel_y = 0 - opacity = FALSE - lifetime = 60 SECONDS - - light_range = 0 - light_power = 1 - light_color = LIGHT_COLOR_FIRE - - var/static/loc_connections2 = list( - COMSIG_ATOM_ENTERED = PROC_REF(movable_entered), - COMSIG_ATOM_ATTACKBY = PROC_REF(alien_extinguish) - ) - -/obj/effect/particle_effect/fluid/smoke/fire/Initialize(mapload, datum/fluid_group/group, ...) - . = ..() - AddElement(/datum/element/connect_loc, loc_connections2) - addtimer(CALLBACK(src, PROC_REF(lower_fire)), initial(lifetime) / 3) - set_light_range(LIGHT_RANGE_FIRE + 1) - update_light() - -/obj/effect/particle_effect/fluid/smoke/fire/spread(seconds_per_tick = 0.1 SECONDS) - if(group.total_size > group.target_size) - return - var/turf/t_loc = get_turf(src) - if(!t_loc) - return - - for(var/turf/spread_turf in t_loc.get_atmos_adjacent_turfs()) - if(group.total_size > group.target_size) - break - if(locate(type) in spread_turf) - continue // Don't spread smoke where there's already smoke! - if(isspaceturf(spread_turf)) - continue - for(var/mob/living/smoker in spread_turf) - smoke_mob(smoker, seconds_per_tick) - - var/obj/effect/particle_effect/fluid/smoke/spread_smoke = new type(spread_turf, group, src) - reagents.copy_to(spread_smoke, reagents.total_volume) - spread_smoke.add_atom_colour(color, FIXED_COLOUR_PRIORITY) - spread_smoke.lifetime = lifetime - - // the smoke spreads rapidly, but not instantly - SSsmoke.queue_spread(spread_smoke) - - if(isspaceturf(t_loc)) - qdel(src) - -/obj/effect/particle_effect/fluid/smoke/fire/process(seconds_per_tick) - if(isspaceturf(get_turf(src))) - qdel(src) - return FALSE - return ..() - -/obj/effect/particle_effect/fluid/smoke/fire/proc/lower_fire() - switch(icon_state) - if("fire_big") - icon_state = "fire_medium" - set_light_range(LIGHT_RANGE_FIRE) - addtimer(CALLBACK(src, PROC_REF(lower_fire)), initial(lifetime) / 3) - if("fire_medium") - icon_state = "fire_small" - set_light_range(LIGHT_RANGE_FIRE) - - update_light() - -/obj/effect/particle_effect/fluid/smoke/fire/proc/movable_entered(datum/source, atom/movable/target_atom) - SIGNAL_HANDLER - if(isobserver(target_atom)) - return - - target_atom.fire_act(5000, 1000) - -/obj/effect/particle_effect/fluid/smoke/fire/extinguish() - . = ..() - lifetime -= initial(lifetime) / 2 - -/obj/effect/particle_effect/fluid/smoke/fire/proc/alien_extinguish(mob/living/carbon/alien/adult/user) - lifetime -= initial(lifetime) / 3 - var/obj/item/bodypart/arm/current_arm = user.get_active_hand() - user.apply_damage(5, BURN, current_arm.body_zone) - diff --git a/tff_modular/modules/tgmc_xenos/mortar/misc/rangefinder.dm b/tff_modular/modules/tgmc_xenos/mortar/misc/rangefinder.dm deleted file mode 100644 index 0095f79cbbe..00000000000 --- a/tff_modular/modules/tgmc_xenos/mortar/misc/rangefinder.dm +++ /dev/null @@ -1,69 +0,0 @@ -/obj/item/binoculars/rangefinder - name = "rangefinder" - desc = "A pair of binoculars with a rangefinding function. Ctrl + Click turf to acquire it's coordinates. Ctrl + Click rangefinder to stop lasing." - icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi' - icon_state = "rangefinder" - inhand_icon_state = "rangefinder" - lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' - righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' - - var/last_x = "UNKNOWN" - var/last_y = "UNKNOWN" - - var/debug = FALSE - -/obj/item/binoculars/rangefinder/examine(mob/user) - . = ..() - . += span_boldnotice("The rangefinder reads: LONGITUDE [last_x], LATITUDE [last_y].") - -/obj/item/binoculars/rangefinder/on_wield(obj/item/source, mob/user) - . = ..() - inhand_icon_state = "rangefinder_wielded" - -/obj/item/binoculars/rangefinder/on_unwield(obj/item/source, mob/user) - . = ..() - inhand_icon_state = "rangefinder" - -/obj/item/binoculars/rangefinder/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - . = ..() - if(user.stat != CONSCIOUS) - to_chat(user, span_warning("You cannot use [src] while incapacitated.")) - return FALSE - var/atom/target_atom - if(istype(interacting_with, /atom/movable/screen/fullscreen/cursor_catcher)) - var/atom/movable/screen/fullscreen/cursor_catcher/cursor_catcher = interacting_with - target_atom = cursor_catcher.given_turf - else - target_atom = interacting_with - if(user.z != target_atom.z) - to_chat(user, span_warning("You cannot get a direct laser from where you are.")) - return FALSE - acquire_target(target_atom, user) - return TRUE - -/obj/item/binoculars/rangefinder/proc/acquire_target(atom/targeted_atom, mob/user) - var/turf/TU = get_turf(targeted_atom) - var/distance = get_dist(TU, get_turf(user)) - if(TU.z != user.z || distance == -1) - to_chat(user, span_warning("You can't focus properly through \the [src] while looking through something else.")) - return - - playsound(src, 'sound/items/night_vision_on.ogg', 35) - new /obj/effect/temp_visual/laser_target(TU) - acquire_coordinates(targeted_atom, user) - -/obj/item/binoculars/rangefinder/proc/acquire_coordinates(atom/A, mob/user) - var/turf/TU = get_turf(A) - last_x = obfuscate_x(TU.x) - last_y = obfuscate_y(TU.y) - to_chat(user, span_boldnotice("COORDINATES: LONGITUDE [last_x]. LATITUDE [last_y].")) - if(debug) - var/turf/current_turf = get_turf(src) - to_chat(user, span_notice("([deobfuscate_x(last_x)]:[deobfuscate_y(last_y)]) {([current_turf.x]:[current_turf.y])")) - - -/obj/effect/temp_visual/laser_target - name = "laser" - icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/items.dmi' - icon_state = "laser_target_coordinate" - duration = 50 diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm b/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm deleted file mode 100644 index 84b90c98b6a..00000000000 --- a/tff_modular/modules/tgmc_xenos/mortar/mortar_shells.dm +++ /dev/null @@ -1,116 +0,0 @@ -/obj/item/mortar_shell - name = "\improper 80mm mortar shell" - desc = "An unlabeled 80mm mortar shell, probably a casing." - icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi' - icon_state = "mortar_ammo_cas" - lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' - righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' - w_class = WEIGHT_CLASS_BULKY - - /// Who fier that shell - var/sender - /// is it currently on fire and about to explode? - var/burning = FALSE - -/obj/item/mortar_shell/proc/detonate(turf/T) - if(isnull(T)) - T = get_turf(src) - explosion_effect(T) - qdel(src) - -/obj/item/mortar_shell/proc/explosion_effect(turf/T) - return - - -/obj/item/mortar_shell/he - name = "\improper 80mm high explosive mortar shell" - desc = "An 80mm mortar shell, loaded with a high explosive charge." - icon_state = "mortar_ammo_he" - -/obj/item/mortar_shell/he/explosion_effect(turf/T) - explosion(T, 0, 0, 5, 7) - - -/obj/item/mortar_shell/he/high - desc = "An 80mm mortar shell, loaded with a super high explosive charge." - -/obj/item/mortar_shell/he/high/explosion_effect(turf/T) - explosion(T, 0, 3, 5, 7) - - -/obj/item/mortar_shell/frag - name = "\improper 80mm fragmentation mortar shell" - desc = "An 80mm mortar shell, loaded with a fragmentation charge." - icon_state = "mortar_ammo_frag" - - var/obj/item/grenade/grenade_type = /obj/item/grenade/mortar_thing - -/obj/item/mortar_shell/frag/explosion_effect(turf/T) - explosion(T, 0, 0, 5, 2) - sleep(4) - var/obj/item/grenade/grenade = new grenade_type(T) - grenade.detonate(sender) - -/obj/item/grenade/mortar_thing - name = "ERROR" - desc = "You should not have to see this. Tell your nearest maintainer about it!" - - shrapnel_type = /obj/projectile/bullet/shrapnel/mortar - shrapnel_radius = 4 - -/obj/item/grenade/mortar_thing/detonate(mob/living/lanced_by) - . = ..() - qdel(src) - -/obj/projectile/bullet/shrapnel/mortar - damage = 25 - ricochet_chance = 20 - wound_bonus = 50 - - -/obj/item/mortar_shell/incendiary - name = "\improper 80mm incendiary mortar shell" - desc = "An 80mm mortar shell, loaded with a Type B napalm charge. Perfect for long-range area denial." - icon_state = "mortar_ammo_inc" - var/range = 5 - var/fire_type = /datum/effect_system/fluid_spread/smoke/fire - -/obj/item/mortar_shell/incendiary/explosion_effect(turf/T) - explosion(T, 0, 0, 4, 2) - var/datum/effect_system/fluid_spread/smoke/fire/smoke = new fire_type(T) - smoke.set_up(range, holder = T, location = T) - smoke.start() - playsound(T, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg', 35, 1, 4) - - -/obj/item/mortar_shell/flashbang - name = "\improper 80mm flashbang mortar shell" - desc = "An 80mm mortar shell, loaded with a large clasterbang grenade." - icon_state = "mortar_ammo_flashbang" - - var/range = 4 - var/grenade_type = /obj/item/grenade/clusterbuster/mortar - -/obj/item/mortar_shell/flashbang/explosion_effect(turf/T) - explosion(T, 0, 0, 1, 0) - var/obj/item/grenade/flashbang = new grenade_type(T) - flashbang.arm_grenade(sender, 1 SECONDS) - -/obj/item/grenade/clusterbuster/mortar - min_spawned = 6 - max_spawned = 12 - - -/obj/item/mortar_shell/smoke - name = "\improper 80mm smoke mortar shell" - desc = "An 80mm mortar shell, loaded with smoke dispersal agents. Can be fired at marines more-or-less safely. Way slimmer than your typical 80mm." - icon_state = "mortar_ammo_smoke" - - var/range = 5 - -/obj/item/mortar_shell/smoke/explosion_effect(turf/T) - explosion(T, 0, 0, 1, 0) - var/datum/effect_system/fluid_spread/smoke/bad/smoke = new(T) - smoke.set_up(range, holder = T, location = T) - smoke.start() - playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) diff --git a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm b/tff_modular/modules/tgmc_xenos/mortar/mortars.dm deleted file mode 100644 index 5d0546a897e..00000000000 --- a/tff_modular/modules/tgmc_xenos/mortar/mortars.dm +++ /dev/null @@ -1,296 +0,0 @@ -/obj/structure/mortar - name = "\improper M402 mortar" - desc = "A manual, crew-operated mortar system intended to rain down 80mm goodness on anything it's aimed at. Uses an advanced targeting computer. Insert round to fire." - icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi' - icon_state = "mortar_m402" - anchored = TRUE - density = TRUE - - // Initial target coordinates - var/targ_x = 0 - var/targ_y = 0 - // Automatic offsets from target - var/offset_x = 0 - var/offset_y = 0 - /// Number of turfs to offset from target by 1 - var/offset_per_turfs = 20 - // Dial adjustments from target - var/dial_x = 0 - var/dial_y = 0 - /// Constant, assuming perfect parabolic trajectory. ONLY THE DELAY BEFORE INCOMING WARNING WHICH ADDS 45 TICKS - var/travel_time = 4.5 SECONDS - var/busy = FALSE - /// Used for deconstruction and aiming sanity - var/firing = FALSE - - var/camouflage - -/obj/structure/mortar/Initialize() - . = ..() - // Makes coords appear as 0 in UI - targ_x = deobfuscate_x(0) - targ_y = deobfuscate_y(0) - - var/new_icon_state - switch(camouflage) - if("classic") - new_icon_state = "c_" + initial(icon_state) - if("desert") - new_icon_state = "d_" + initial(icon_state) - if("snow") - new_icon_state = "s_" + initial(icon_state) - if("urban") - new_icon_state = "u_" + initial(icon_state) - else - new_icon_state = initial(icon_state) - - icon_state = new_icon_state - -/obj/structure/mortar/interact(mob/user) - if(busy) - to_chat(user, span_warning("Someone else is currently using [src].")) - return FALSE - if(firing) - to_chat(user, span_warning("[src]'s barrel is still steaming hot. Wait a few seconds and stop firing it.")) - return FALSE - - return ..() - -/obj/structure/mortar/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Mortar", "Mortar Interface") - ui.open() - -/obj/structure/mortar/ui_data(mob/user) - . = list() - - .["data_target_x"] = obfuscate_x(targ_x) - .["data_target_y"] = obfuscate_y(targ_y) - .["data_dial_x"] = dial_x - .["data_dial_y"] = dial_y - -/obj/structure/mortar/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - - switch(action) - if("set_target") - handle_target(usr, text2num(params["target_x"]), text2num(params["target_y"])) - return TRUE - - if("set_offset") - handle_dial(usr, text2num(params["dial_x"]), text2num(params["dial_y"])) - return TRUE - -/obj/structure/mortar/proc/handle_target(mob/user, temp_targ_x = 0, temp_targ_y = 0) - if(!can_fire_at(user, test_targ_x = deobfuscate_x(temp_targ_x), test_targ_y = deobfuscate_y(temp_targ_y))) - return - - user.visible_message(span_notice("[user] starts adjusting [src]'s firing angle and distance."), span_notice("You start adjusting [src]'s firing angle and distance to match the new coordinates.")) - busy = TRUE - - playsound(loc, 'sound/items/tools/ratchet.ogg', 25, 1) - - var/success = do_after(user, 3 SECONDS, src) - busy = FALSE - if(!success) - return - user.visible_message(span_notice("[user] finishes adjusting [src]'s firing angle and distance."), span_notice("You finish adjusting [src]'s firing angle and distance to match the new coordinates.")) - targ_x = deobfuscate_x(temp_targ_x) - targ_y = deobfuscate_y(temp_targ_y) - var/offset_x_max = floor(abs((targ_x) - x)/offset_per_turfs) //Offset of mortar shot, grows by 1 every 20 tiles travelled - var/offset_y_max = floor(abs((targ_y) - y)/offset_per_turfs) - offset_x = rand(-offset_x_max, offset_x_max) - offset_y = rand(-offset_y_max, offset_y_max) - -/obj/structure/mortar/proc/handle_dial(mob/user, temp_dial_x = 0, temp_dial_y = 0) - if(!can_fire_at(user, test_dial_x = temp_dial_x, test_dial_y = temp_dial_y)) - return - - user.visible_message(span_notice("[user] starts dialing [src]'s firing angle and distance."), span_notice("You start dialing [src]'s firing angle and distance to match the new coordinates.")) - busy = TRUE - - playsound(loc, 'sound/items/tools/ratchet.ogg', 25, 1) - - var/success = do_after(user, 1.5 SECONDS, src) - busy = FALSE - if(!success) - return - user.visible_message(span_notice("[user] finishes dialing [src]'s firing angle and distance."), span_notice("You finish dialing [src]'s firing angle and distance to match the new coordinates.")) - - dial_x = temp_dial_x - dial_y = temp_dial_y - -/obj/structure/mortar/attackby(obj/item/attacking_item, mob/living/user) - if(istype(attacking_item, /obj/item/mortar_shell)) - var/obj/item/mortar_shell/mortar_shell = attacking_item - var/turf/target_turf = locate(targ_x + dial_x + offset_x, targ_y + dial_y + offset_y, z) - if(busy) - to_chat(user, span_warning("Someone else is currently using [src].")) - return - - var/turf/deviation_turf = locate(target_turf.x + pick(-1,0,0,1), target_turf.y + pick(-1,0,0,1), target_turf.z) - if(deviation_turf) - target_turf = deviation_turf - - user.visible_message(span_notice("[user] starts loading \a [mortar_shell.name] into [src]."), span_notice("You start loading \a [mortar_shell.name] into [src].")) - playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg', 100, 1) - busy = TRUE - var/success = do_after(user, 1.5 SECONDS, src) - busy = FALSE - if(success) - user.visible_message(span_notice("[user] loads \a [mortar_shell.name] into [src]."), span_notice("You load \a [mortar_shell.name] into [src].")) - visible_message("[icon2html(src, viewers(src))] [span_danger("The [name] fires!")]") - user.transferItemToLoc(mortar_shell, src) - playsound(loc, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_fire.ogg', 200, 1) - busy = FALSE - firing = TRUE - flick(icon_state + "_fire", src) - mortar_shell.sender = user - mortar_shell.forceMove(src) - - for(var/mob/mob in range(7)) - shake_camera(mob, 3, 1) - - addtimer(CALLBACK(src, PROC_REF(handle_shell), target_turf, mortar_shell), travel_time) - - if(attacking_item.tool_behaviour == TOOL_WRENCH) - if(busy) - to_chat(user, span_warning("Someone else is currently using [src].")) - return FALSE - if(firing) - to_chat(user, span_warning("[src]'s barrel is still steaming hot. Wait a few seconds and stop firing it.")) - return FALSE - playsound(loc, 'sound/items/tools/ratchet.ogg', 25, 1) - user.visible_message(span_notice("[user] starts undeploying [src]."), span_notice("You start undeploying [src].")) - if(do_after(user, 4 SECONDS, src)) - user.visible_message(span_notice("[user] undeploys [src]."), span_notice("You undeploy [src].")) - playsound(loc, 'sound/items/Deconstruct.ogg', 25, 1) - new /obj/item/mortar_kit(loc) - qdel(src) - -/obj/structure/mortar/proc/handle_shell(turf/target, obj/item/mortar_shell/shell) - playsound(target, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg', 125, 1) - var/relative_dir - for(var/mob/mob in range(15, target)) - if(get_turf(mob) == target) - relative_dir = 0 - else - relative_dir = angle2dir(get_angle(get_turf(mob), get_turf(target))) - mob.show_message( \ - span_danger("A SHELL IS COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_VISUAL, \ - span_danger("YOU HEAR SOMETHING COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ - ) - sleep(2 SECONDS) - - for(var/mob/mob in range(10, target)) - if(get_turf(mob) == target) - relative_dir = 0 - else - relative_dir = angle2dir(get_angle(get_turf(mob), get_turf(target))) - mob.show_message( \ - span_userdanger("A SHELL IS ABOUT TO IMPACT [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_VISUAL, \ - span_userdanger("YOU HEAR SOMETHING VERY CLOSE COMING DOWN [relative_dir ? uppertext(("TO YOUR " + dir2text(relative_dir))) : uppertext("right above you")]!"), MSG_AUDIBLE \ - ) - sleep(2.5 SECONDS) - shell.alpha = 0 - shell.forceMove(target) - shell.detonate(target) - firing = FALSE - -/obj/structure/mortar/proc/can_fire_at(mob/user, test_targ_x = targ_x, test_targ_y = targ_y, test_dial_x, test_dial_y) - var/dialing = test_dial_x || test_dial_y - if(test_dial_x + test_targ_x > world.maxx || test_dial_x + test_targ_x < 0) - to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is outside of the area of operations.")) - return FALSE - if(test_dial_x < -10 || test_dial_x > 10 || test_dial_y < -10 || test_dial_y > 10) - to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is too far away from the original target.")) - return FALSE - if(test_dial_y + test_targ_y > world.maxy || test_dial_y + test_targ_y < 0) - to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is outside of the area of operations.")) - return FALSE - if(get_dist(src, locate(test_targ_x + test_dial_x, test_targ_y + test_dial_y, z)) < 10) - to_chat(user, span_warning("You cannot [dialing ? "dial to" : "aim at"] this coordinate, it is too close to your mortar.")) - return FALSE - if(busy) - to_chat(user, span_warning("Someone else is currently using this mortar.")) - return FALSE - return TRUE - -///// -//The portable mortar item -/obj/item/mortar_kit - name = "\improper M402 mortar portable kit" - desc = "A manual, crew-operated mortar system intended to rain down 80mm goodness on anything it's aimed at. Needs to be set down first" - icon = 'tff_modular/modules/tgmc_xenos/mortar/icons/mortar.dmi' - icon_state = "mortar_m402_carry" - inhand_icon_state = "mortar_m402_carry" - lefthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_lefthand.dmi' - righthand_file = 'tff_modular/modules/tgmc_xenos/mortar/icons/shells_righthand.dmi' - w_class = WEIGHT_CLASS_HUGE - -/obj/item/mortar_kit/attack_self(mob/user) - . = ..() - var/turf/deploy_turf = get_turf(user) - if(!deploy_turf) - return - user.visible_message(span_notice("[user] starts deploying [src]."), span_notice("You start deploying [src].")) - playsound(deploy_turf, 'sound/items/Deconstruct.ogg', 25, 1) - if(do_after(user, 4 SECONDS, user)) - var/obj/structure/mortar/mortar = new /obj/structure/mortar(deploy_turf) - user.visible_message(span_notice("[user] deploys [src]."), span_notice("You deploy [src].")) - playsound(deploy_turf, 'tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg', 25, 1) - mortar.setDir(user.dir) - qdel(src) - - -// Mortar crates -/obj/structure/closet/crate/secure/weapon/mortar_kit - name = "\improper M402 mortar kit" - desc = "A crate containing a basic set of a mortar and some shells, to get an engineer started." - -/obj/structure/closet/crate/secure/weapon/mortar_kit/PopulateContents() - . = ..() - new /obj/item/mortar_kit(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/incendiary(src) - new /obj/item/mortar_shell/incendiary(src) - new /obj/item/binoculars/rangefinder(src) - new /obj/item/binoculars/rangefinder(src) - -/obj/structure/closet/crate/secure/weapon/mortar_ammo - name = "\improper M402 mortar ammo crate" - desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." - -/obj/structure/closet/crate/secure/weapon/mortar_ammo/PopulateContents() - . = ..() - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/he(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/frag(src) - new /obj/item/mortar_shell/incendiary(src) - new /obj/item/mortar_shell/incendiary(src) - new /obj/item/mortar_shell/incendiary(src) - new /obj/item/mortar_shell/incendiary(src) - -/obj/structure/closet/crate/secure/weapon/mortar_special_ammo - name = "\improper M402 mortar special ammo crate" - desc = "A crate containing live mortar shells with various payloads. DO NOT DROP. KEEP AWAY FROM FIRE SOURCES." - -/obj/structure/closet/crate/secure/weapon/mortar_special_ammo/PopulateContents() - . = ..() - new /obj/item/mortar_shell/smoke(src) - new /obj/item/mortar_shell/smoke(src) - new /obj/item/mortar_shell/smoke(src) - new /obj/item/mortar_shell/smoke(src) - new /obj/item/mortar_shell/flashbang(src) - new /obj/item/mortar_shell/flashbang(src) - new /obj/item/mortar_shell/flashbang(src) - new /obj/item/mortar_shell/flashbang(src) diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_flamethrower2.ogg deleted file mode 100644 index 5be59bdc70f02964836b609a016e9e45258600a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28394 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 WJ{Q+`kz=S|H9=OV`PI+z0{;)pEFH%H diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_reload.ogg deleted file mode 100644 index a3a5ee47543a83e4201c08bdae16d0fc8d2f3df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6857 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

- - - setTargetX(value)} - /> - - - setTargetY(value)} - /> - - - -
-
- - - setDialX(value)} - /> - - - setDialY(value)} - /> - - - -
- - - ); -}; From 523ea314894332b693b914cb6d5dcaf71d88e3e0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 20 Apr 2025 01:15:53 +0700 Subject: [PATCH 069/120] code improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ха-ха. Улучшение кода))) Он все еще ужасен --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 3 ++- .../modules/tgmc_xenos/code/defense/human_defense.dm | 5 ----- tff_modular/modules/tgmc_xenos/code/misc/larva.dm | 12 +++--------- .../code/powers/{charge.dm => xeno_charge.dm} | 0 .../code/powers/{alien_powers.dm => xeno_powers.dm} | 0 .../code/powers/{tailsweep.dm => xeno_tailsweep.dm} | 0 tgstation.dme | 6 +++--- 7 files changed, 8 insertions(+), 18 deletions(-) rename tff_modular/modules/tgmc_xenos/code/powers/{charge.dm => xeno_charge.dm} (100%) rename tff_modular/modules/tgmc_xenos/code/powers/{alien_powers.dm => xeno_powers.dm} (100%) rename tff_modular/modules/tgmc_xenos/code/powers/{tailsweep.dm => xeno_tailsweep.dm} (100%) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index df0fd67688f..da3721cb0dc 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -214,4 +214,5 @@ /mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) . = ..() - SEND_SIGNAL(src, COMSIG_XENO_PLASMA_ADJUSTED, amount) + if(.) + SEND_SIGNAL(src, COMSIG_XENO_PLASMA_ADJUSTED, amount) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm index bfab6118be5..655242dad0a 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm @@ -1,10 +1,5 @@ /// TGMC_XENOS (old nova sector xenos) -// Если хуман мертв, то ксенос не сможешь его перетаскивать -/mob/living/carbon/human/can_be_pulled(user, force) - return ..() && !(isalien(user) && (stat == DEAD)) - - // Переопредление прока из 'code\modules\mob\living\carbon\human\human_defense.dm' /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index 4714a50eff5..aa4726704a1 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -1,6 +1,6 @@ /// TGMC_XENOS (old nova sector xenos) -// Подтип фейсхаггера, просто чтобы мы могли сделать то, что могли +// Подтип фейсхаггера /obj/item/clothing/mask/facehugger/tgmc embryo_path = /obj/item/organ/body_egg/alien_embryo/tgmc @@ -22,19 +22,13 @@ /mob/living/carbon/alien/larva/tgmc/Initialize(mapload) . = ..() - for(var/datum/action/cooldown/alien/larva_evolve/action in actions) if(istype(action)) action.Remove(src) - var/static/list/innate_actions = list( - /datum/action/cooldown/alien/larva_evolve/tgmc, - ) - grant_actions_by_list(innate_actions) - - return + GRANT_ACTION(/datum/action/cooldown/alien/larva_evolve/tgmc) -// Наш способ эволюционировать. Там прошлый кодер говорит, что стоит сделать отдельные для каждой эволюции... Но я не уверен, что это действительно нужно. Его способ достаточно крутой +// Способность, которая позволяет эволюционировать ларве в большого ксеноса /datum/action/cooldown/alien/larva_evolve/tgmc/Activate(atom/target) var/static/list/caste_options if(!caste_options) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/powers/charge.dm rename to tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm diff --git a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm rename to tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm diff --git a/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_tailsweep.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm rename to tff_modular/modules/tgmc_xenos/code/powers/xeno_tailsweep.dm diff --git a/tgstation.dme b/tgstation.dme index 384800f5223..9ed55750b4d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9238,9 +9238,9 @@ #include "tff_modular\modules\tgmc_xenos\code\misc\resin_walker.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" -#include "tff_modular\modules\tgmc_xenos\code\powers\alien_powers.dm" -#include "tff_modular\modules\tgmc_xenos\code\powers\charge.dm" -#include "tff_modular\modules\tgmc_xenos\code\powers\tailsweep.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\xeno_charge.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\xeno_powers.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\xeno_tailsweep.dm" #include "tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\crusher.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\defender.dm" From 4d14567dad49168056f4356250c79099d75f7e2d Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 18 Jun 2025 18:08:18 +0700 Subject: [PATCH 070/120] small --- .../modules/tgmc_xenos/code/misc/larva.dm | 70 ++++++++++--------- .../tgmc_xenos/code/misc/projectiles.dm | 4 +- .../tgmc_xenos/code/powers/xeno_charge.dm | 5 +- .../tgmc_xenos/code/powers/xeno_powers.dm | 3 +- .../modules/tgmc_xenos/code/xeno_bodyparts.dm | 1 - .../modules/tgmc_xenos/code/xeno_organs.dm | 5 +- 6 files changed, 47 insertions(+), 41 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index aa4726704a1..f645bcd8277 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -5,10 +5,10 @@ embryo_path = /obj/item/organ/body_egg/alien_embryo/tgmc /obj/item/clothing/mask/facehugger/tgmc/proc/ProximityLeap(range = 1) - for(var/mob/M in range(range, src)) - if(!CanHug(M)) + for(var/mob/victim in range(range, src)) + if(!CanHug(victim)) continue - Leap(M) + Leap(victim) return TRUE return FALSE @@ -33,44 +33,51 @@ var/static/list/caste_options if(!caste_options) caste_options = list() - - // This --can probably-- (will not) be genericized in the future. +. make_xeno_caste_entry( - caste_name = "Runner", - caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_runner"), - caste_info = span_info("Runners are the most agile caste, the short stature of running on all fours \ - gives them great speed, the ability to dodge projectiles, and allows them to tackle while holding throw and clicking. \ - Eventually, runners can evolve onwards into the fearsome ravager, should the hive permit it."), - caste_options = caste_options, + caste_name = "Runner", + caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_runner"), + caste_info = span_info( + "Runners are the most agile caste, the short stature of running on all fours \ + gives them great speed, the ability to dodge projectiles, and allows them to tackle while holding throw and clicking. \ + Eventually, runners can evolve onwards into the fearsome ravager, should the hive permit it." + ), + caste_options = caste_options, ) make_xeno_caste_entry( - caste_name = "Sentinel", - caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_sentinel"), - caste_info = span_info("Sentinels are a caste similar in shape to a drone, forfeiting the ability to \ - become royalty in exchange for spitting either acid, or a potent neurotoxin. They aren't as strong in close combat \ - as the other options, but can eventually evolve into a more dangerous form of acid spitter, should the hive have capacity."), - caste_options = caste_options, + caste_name = "Sentinel", + caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_sentinel"), + caste_info = span_info( + "Sentinels are a caste similar in shape to a drone, forfeiting the ability to \ + become royalty in exchange for spitting either acid, or a potent neurotoxin. They aren't as strong in close combat \ + as the other options, but can eventually evolve into a more dangerous form of acid spitter, should the hive have capacity." + ), + caste_options = caste_options, ) make_xeno_caste_entry( - caste_name = "Defender", - caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_defender"), - caste_info = span_info("Slow, tough, hard hitting, the defender is well and capable of what the name implies, \ - the defender's thick armor allows it to take a few more hits than other castes, which can be paired with a deadly tail club \ - and ability to make short charges to cause some real damage. Eventually, it will be able to evolve into the feared crusher, \ - destroyer of stationary objects should the hive have the capacity."), - caste_options = caste_options, + caste_name = "Defender", + caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_defender"), + caste_info = span_info( + "Slow, tough, hard hitting, the defender is well and capable of what the name implies, \ + the defender's thick armor allows it to take a few more hits than other castes, which can be paired with a deadly tail club \ + and ability to make short charges to cause some real damage. Eventually, it will be able to evolve into the feared crusher, \ + destroyer of stationary objects should the hive have the capacity." + ), + caste_options = caste_options, ) make_xeno_caste_entry( - caste_name = "Drone", - caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_drone"), - caste_info = span_info("Drones are a somewhat weak, although fairly quick caste that fills a mainly \ - support role in a hive, having a higher plasma capacity than most first evolutions, and the ability to \ - make a healing aura for nearby xenos. Drones are the only caste that can evolve into both praetorians and \ - queens, though only one queen and one praetorian may exist at any time."), - caste_options = caste_options, + caste_name = "Drone", + caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_drone"), + caste_info = span_info( + "Drones are a somewhat weak, although fairly quick caste that fills a mainly \ + support role in a hive, having a higher plasma capacity than most first evolutions, and the ability to \ + make a healing aura for nearby xenos. Drones are the only caste that can evolve into both praetorians and \ + queens, though only one queen and one praetorian may exist at any time." + ), + caste_options = caste_options, ) var/alien_caste = show_radial_menu(owner, owner, caste_options, radius = 38, require_near = TRUE, tooltips = TRUE) @@ -81,7 +88,6 @@ return TRUE -/// Generates a new entry to the /datum/action/cooldown/alien/larva_evolve/tgmc/proc/make_xeno_caste_entry(caste_name, caste_image, caste_info, list/caste_options) var/datum/radial_menu_choice/caste_option = new() diff --git a/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm index ee696327264..ecc9769b65b 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm @@ -3,13 +3,13 @@ /obj/projectile/neurotoxin/tgmc name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 80 + damage = 70 paralyze = 0 damage_type = STAMINA armor_flag = BIO /obj/projectile/neurotoxin/tgmc/queen - damage = 140 + damage = 100 /obj/projectile/neurotoxin/tgmc/acid name = "acid spit" diff --git a/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm index 9d60c039605..86839be76f2 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm @@ -114,9 +114,10 @@ damage /= 2 else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/target_airlock = target - damage = ceil(target_airlock.normal_integrity / 2) - else if(istype(target, /obj/structure/window)) damage = 1000 // Нужно сломать за 1 раз + do_stop() + else if(istype(target, /obj/structure/window)) + damage = 1000 // Так же нужно сломать за 1 раз crushed_obj.take_damage(damage, BRUTE) if(QDELETED(crushed_obj)) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm index 5b3c2f06ac1..c04bf3d6a53 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm @@ -55,7 +55,7 @@ burn_heal = aura_healing_amount, \ limit_to_trait = TRAIT_XENO_HEAL_AURA, \ healing_color = aura_healing_color, \ - ) + ) return TRUE /datum/action/cooldown/alien/tgmc/heal_aura/proc/aura_deactivate() @@ -117,7 +117,6 @@ #undef RAVAGER_OUTLINE_EFFECT -// Забавный код для руни #define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 #define RUNNER_BLUR_EFFECT "runner_evasion" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm b/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm index 1945af9fdac..f8a9cfcf6e4 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm @@ -1,6 +1,5 @@ /// TGMC_XENOS (old nova sector xenos) -// Множитель берн урона чуть поменьше. Чисто для этих ксеносов /obj/item/bodypart/head/alien/tgmc burn_modifier = 1.5 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index 8d0d0cdec92..6061cb2e865 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -1,10 +1,11 @@ /// TGMC_XENOS (old nova sector xenos) -// Глазки ксенусей. Нужно для того, чтобы они не получали шармы +// Глазки ксенусей /obj/item/organ/eyes/alien/tgmc /obj/item/organ/eyes/alien/tgmc/apply_scar(side) - return // Нам не нужны слепые ксеносы из-за глупого способа нанесения шрамов на глаза + // Нам не нужны слепые ксеносы из-за шрамов на глазах + return // Сосуды плазмы /obj/item/organ/alien/plasmavessel/tgmc From d778ef33a627d108eb0342c3e7584bc068832680 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 18 Jun 2025 18:09:57 +0700 Subject: [PATCH 071/120] Update larva.dm --- tff_modular/modules/tgmc_xenos/code/misc/larva.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index f645bcd8277..5d2f00aeb09 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -33,7 +33,7 @@ var/static/list/caste_options if(!caste_options) caste_options = list() -. + make_xeno_caste_entry( caste_name = "Runner", caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_runner"), From edb8822d07369ecc5f380ab1c047fdcd5552c05e Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 18 Jun 2025 18:17:17 +0700 Subject: [PATCH 072/120] Update base_alien.dm --- .../modules/tgmc_xenos/code/base_alien.dm | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index da3721cb0dc..9ce60e2597d 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -63,7 +63,7 @@ . = ..() real_name = "alien [caste]" - update_offsets() // Необходимо, чтобы base_pixel_w применился + update_offsets() // Необходимо, чтобы base_pixel_w применился set_armor(armor_type) if(next_evolution) @@ -126,37 +126,6 @@ melee = 0 wound = 100 -/mob/living/carbon/alien/adult/tgmc/update_held_items() - . = ..() - remove_overlay(HANDS_LAYER) - // Временное(ложь) решение, из-за сложностей с получением иконок для всех ксенов, а так же неопределенностью, связанной с icon_w, pixel_w и т.п - /* - var/list/hands = list() - - var/obj/item/l_hand = get_item_for_held_index(1) - if(l_hand) - var/itm_state = l_hand.inhand_icon_state - if(!itm_state) - itm_state = l_hand.icon_state - var/mutable_appearance/l_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) - if(l_hand.blocks_emissive) - l_hand_item.overlays += emissive_blocker(l_hand_item.icon, l_hand_item.icon_state, src, alpha = l_hand_item.alpha) - hands += l_hand_item - - var/obj/item/r_hand = get_item_for_held_index(2) - if(r_hand) - var/itm_state = r_hand.inhand_icon_state - if(!itm_state) - itm_state = r_hand.icon_state - var/mutable_appearance/r_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) - if(r_hand.blocks_emissive) - r_hand_item.overlays += emissive_blocker(r_hand_item.icon, r_hand_item.icon_state, src, alpha = r_hand_item.alpha) - hands += r_hand_item - - overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) - */ - /mob/living/carbon/alien/adult/tgmc/get_fire_overlay(stacks, on_fire) var/fire_icon = "generic_fire" From f3c341bdaaf7bc9126761964c8f6f62c91520180 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 18 Jun 2025 18:27:17 +0700 Subject: [PATCH 073/120] meow --- .../~ff_defines/_globalvars/traits/declarations.dm | 7 +------ tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm | 10 ++++++++-- .../modules/tgmc_xenos/code/powers/xeno_powers.dm | 4 ++-- tff_modular/modules/tgmc_xenos/readme.md | 2 +- tgstation.dme | 1 - 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm index 9b3ae25f1ff..8b137891791 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm @@ -1,6 +1 @@ -/// Trait source for xeno innate abilities -#define TRAIT_XENO_INNATE "xeno_innate" -/// Trait source for something added BY a xeno ability -#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" -/// Determines if something can receive healing from a xeno -#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" + diff --git a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm index b6fc4bc0a92..8aa66dafd82 100644 --- a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm +++ b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm @@ -1,5 +1,11 @@ -/// fortify ability trait source -#define XENO_FORTIFY_TRAIT "xeno_fortify" +/// Trait source for xeno innate abilities +#define TRAIT_XENO_INNATE "xeno_innate" +/// Trait source for something added BY a xeno ability +#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" +/// Determines if something can receive healing from a xeno +#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" +/// Trait source for traits added by fortify ability +#define TRAIT_XENO_FORTIFY "xeno_fortify" // on call adjustPlasma() proc #define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" diff --git a/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm index c04bf3d6a53..10be0adab2d 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/xeno_powers.dm @@ -221,11 +221,11 @@ xeno_owner.set_resting(FALSE, instant = TRUE) if(on) - ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, XENO_FORTIFY_TRAIT) + ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) to_chat(xeno_owner, span_alertalien("We tuck ourselves into a defensive stance.")) xeno_owner.set_armor(xeno_owner.get_armor().add_other_armor(fortify_armor_type)) else - REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, XENO_FORTIFY_TRAIT) + REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) to_chat(xeno_owner, span_alertalien("We resume our normal stance.")) xeno_owner.set_armor(xeno_owner.get_armor().subtract_other_armor(fortify_armor_type)) diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index 4b5db1021f6..37f39c0c992 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -28,7 +28,7 @@ IN: code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm - TRAIT_XENO_INNATE - TRAIT_XENO_ABILITY_GIVEN - TRAIT_XENO_HEAL_AURA -- XENO_FORTIFY_TRAIT +- TRAIT_XENO_FORTIFY ## Helpers diff --git a/tgstation.dme b/tgstation.dme index 31e4f47131f..e647f2bc8b9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9306,7 +9306,6 @@ #include "tff_modular\modules\spiderbuff\spidersecondstage_subtypes.dm" #include "tff_modular\modules\spiderbuff\spiderstages.dm" #include "tff_modular\modules\streletz\code\clothing.dm" -#include "tff_modular\modules\tgmc_xenos\code\_xeno_defines.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_bodyparts.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_evolve.dm" From 2be2b0f846d4eec92e8d0b29f30269a42b6d0cc7 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 18 Jun 2025 18:31:08 +0700 Subject: [PATCH 074/120] Update larva.dm --- .../modules/tgmc_xenos/code/misc/larva.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index 5d2f00aeb09..b830b9e5668 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -37,10 +37,10 @@ make_xeno_caste_entry( caste_name = "Runner", caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_runner"), - caste_info = span_info( + caste_info = span_info( \ "Runners are the most agile caste, the short stature of running on all fours \ gives them great speed, the ability to dodge projectiles, and allows them to tackle while holding throw and clicking. \ - Eventually, runners can evolve onwards into the fearsome ravager, should the hive permit it." + Eventually, runners can evolve onwards into the fearsome ravager, should the hive permit it." \ ), caste_options = caste_options, ) @@ -48,10 +48,10 @@ make_xeno_caste_entry( caste_name = "Sentinel", caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_sentinel"), - caste_info = span_info( + caste_info = span_info( \ "Sentinels are a caste similar in shape to a drone, forfeiting the ability to \ become royalty in exchange for spitting either acid, or a potent neurotoxin. They aren't as strong in close combat \ - as the other options, but can eventually evolve into a more dangerous form of acid spitter, should the hive have capacity." + as the other options, but can eventually evolve into a more dangerous form of acid spitter, should the hive have capacity." \ ), caste_options = caste_options, ) @@ -59,11 +59,11 @@ make_xeno_caste_entry( caste_name = "Defender", caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_defender"), - caste_info = span_info( + caste_info = span_info( \ "Slow, tough, hard hitting, the defender is well and capable of what the name implies, \ the defender's thick armor allows it to take a few more hits than other castes, which can be paired with a deadly tail club \ and ability to make short charges to cause some real damage. Eventually, it will be able to evolve into the feared crusher, \ - destroyer of stationary objects should the hive have the capacity." + destroyer of stationary objects should the hive have the capacity." \ ), caste_options = caste_options, ) @@ -71,11 +71,11 @@ make_xeno_caste_entry( caste_name = "Drone", caste_image = image(icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi', icon_state = "preview_drone"), - caste_info = span_info( + caste_info = span_info( \ "Drones are a somewhat weak, although fairly quick caste that fills a mainly \ support role in a hive, having a higher plasma capacity than most first evolutions, and the ability to \ make a healing aura for nearby xenos. Drones are the only caste that can evolve into both praetorians and \ - queens, though only one queen and one praetorian may exist at any time." + queens, though only one queen and one praetorian may exist at any time." \ ), caste_options = caste_options, ) From 3d3dc8a39b57b175c0af345bd75e63fc667a4612 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 18 Jun 2025 19:18:20 +0700 Subject: [PATCH 075/120] bweh --- .../~ff_defines/_globalvars/traits/declarations.dm | 10 ++++++++++ tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm | 11 ----------- .../modules/tgmc_xenos/code/powers/xeno_charge.dm | 1 - 3 files changed, 10 insertions(+), 12 deletions(-) delete mode 100644 tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm index 8b137891791..8aa66dafd82 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm @@ -1 +1,11 @@ +/// Trait source for xeno innate abilities +#define TRAIT_XENO_INNATE "xeno_innate" +/// Trait source for something added BY a xeno ability +#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" +/// Determines if something can receive healing from a xeno +#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" +/// Trait source for traits added by fortify ability +#define TRAIT_XENO_FORTIFY "xeno_fortify" +// on call adjustPlasma() proc +#define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" diff --git a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm deleted file mode 100644 index 8aa66dafd82..00000000000 --- a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm +++ /dev/null @@ -1,11 +0,0 @@ -/// Trait source for xeno innate abilities -#define TRAIT_XENO_INNATE "xeno_innate" -/// Trait source for something added BY a xeno ability -#define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" -/// Determines if something can receive healing from a xeno -#define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" -/// Trait source for traits added by fortify ability -#define TRAIT_XENO_FORTIFY "xeno_fortify" - -// on call adjustPlasma() proc -#define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" diff --git a/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm index 86839be76f2..b0bf6ef85ea 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/xeno_charge.dm @@ -113,7 +113,6 @@ if(target_mecha.defense_mode) damage /= 2 else if(istype(target, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/target_airlock = target damage = 1000 // Нужно сломать за 1 раз do_stop() else if(istype(target, /obj/structure/window)) From 767afcfd442fb2b7ccdc2175f38a62ebfebf31a4 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 14 Sep 2025 02:02:07 +0700 Subject: [PATCH 076/120] one step closer to the end --- .../_globalvars/traits/declarations.dm | 2 ++ .../modules/tgmc_xenos/code/base_alien.dm | 11 +++++++ .../code/structures/alien_structures.dm | 2 +- .../modules/tgmc_xenos/code/xeno_organs.dm | 4 +-- .../tgmc_xenos/code/xeno_types/crusher.dm | 2 +- tff_modular/modules/tgmc_xenos/readme.md | 32 +++++++++++-------- 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm index 8aa66dafd82..435b769ae0a 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm @@ -9,3 +9,5 @@ // on call adjustPlasma() proc #define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" + +GLOBAL_VAR_INIT(xeno_rounymode, FALSE) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 9ce60e2597d..ae5344f6475 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -1,5 +1,7 @@ /// TGMC_XENOS (old nova sector xenos) +#define ROUNY_ICON_FILE 'tff_modular/modules/tgmc_xenos/icons/rouny.dmi' + /mob/living/carbon/alien/adult/tgmc name = "rare bugged alien" icon = 'tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi' @@ -79,6 +81,13 @@ default_organ_types_by_slot[slot] = additional_organ_types_by_slot[slot] return ..() +/mob/living/carbon/alien/adult/tgmc/update_icon(updates) + if(GLOB.xeno_rounymode && icon_exists(ROUNY_ICON_FILE, icon_state)) + icon = ROUNY_ICON_FILE + else if(icon == ROUNY_ICON_FILE) + icon = initial(icon) + return ..() + /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха return FALSE @@ -185,3 +194,5 @@ . = ..() if(.) SEND_SIGNAL(src, COMSIG_XENO_PLASMA_ADJUSTED, amount) + +#undef ROUNY_ICON_FILE diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index 457262ad1e3..d3bcf56451a 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -44,5 +44,5 @@ /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - // Мы подняли температуру, при которой начинает наноситься урон до ~72 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину + // Мы подняли температуру, при которой начинает наноситься урон до ~72 градусов. Иначе на какой-нибудь серенити обычный атмос улицы будет убивать резину return exposed_temperature > 345 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index 6061cb2e865..62f0f1ab438 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -4,8 +4,8 @@ /obj/item/organ/eyes/alien/tgmc /obj/item/organ/eyes/alien/tgmc/apply_scar(side) - // Нам не нужны слепые ксеносы из-за шрамов на глазах - return + return // Нам не нужны слепые ксеносы из-за шрамов на глазах + // Сосуды плазмы /obj/item/organ/alien/plasmavessel/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 95e8e60af83..bbb6501c2cb 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -13,7 +13,7 @@ alien_speed = 1.5 additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ) hud_offset_y = -16 diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index 37f39c0c992..0f344ea2906 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -7,32 +7,38 @@ ## TG File Changes - MOVED: - code\modules\mob\living\carbon\human\human_defense.dm: `/mob/living/carbon/human/attack_alien` - TO: - tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm + code\modules\mob\living\carbon\human\human_defense.dm: `/mob/living/carbon/human/attack_alien` + TO: + tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm - OVERRIDE: code\game\objects\structures\aliens.dm: `/obj/structure/alien/weeds/should_atmos_process` - IN: - tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm + IN: + tff_modular\modules\tgmc_xenos\code\structures\alien_structures.dm Additions: - code\game\objects\structures\aliens.dm: `/obj/structure/alien/egg` && `/obj/structure/alien/egg/Initialize()` - code\modules\mob\living\carbon\alien\special\alien_embryo.dm: `/obj/item/organ/body_egg/alien_embryo` && `/obj/item/organ/body_egg/alien_embryo/proc/on_poll_concluded()` - code\modules\mob\living\carbon\alien\special\facehugger.dm: `/obj/item/clothing/mask/facehugger` && `/obj/item/clothing/mask/facehugger/proc/Impregnate()` -- code/modules/vehicles/mecha/_mecha.dm: `/obj/vehicle/sealed/mecha/proc/melee_attack_effect()` +- code/modules/vehicles/mecha/\_mecha.dm: `/obj/vehicle/sealed/mecha/proc/melee_attack_effect()` ## Defines -IN: code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +IN: code/\_\_DEFINES/~ff_defines/\_globalvars/traits/declarations.dm -- TRAIT_XENO_INNATE -- TRAIT_XENO_ABILITY_GIVEN -- TRAIT_XENO_HEAL_AURA -- TRAIT_XENO_FORTIFY +Traits: + +- `TRAIT_XENO_INNATE` +- `TRAIT_XENO_ABILITY_GIVEN` +- `TRAIT_XENO_HEAL_AURA` +- `TRAIT_XENO_FORTIFY` + +Global Vars: + +- `xeno_rounymode` ## Helpers -IN: code/__HELPERS/~ff_helpers/is_helpers.dm +IN: code/\_\_HELPERS/~ff_helpers/is_helpers.dm - istgmcalien - istgmcalienqueen @@ -46,4 +52,4 @@ IN: code/__HELPERS/~ff_helpers/is_helpers.dm TGMC & CM - Where the sprites, sound, and ideas for caste abilities came from -Original developer of these xenos (apparently it's @Paxilmaniac) - Porting the xenos from TGMC and adopting their stuff to work with our code +Original developer of these xenos (apparently it's @Paxilmaniac) - Porting the xenos from TGMC and adopting their stuff to work with tg-skyrat code From 17c21d6e669d3128339a0fb308f10f9c1e599004 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Wed, 17 Sep 2025 15:42:47 +0700 Subject: [PATCH 077/120] minor changes --- .../modules/tgmc_xenos/code/base_alien.dm | 35 ------------------- .../tgmc_xenos/code/misc/queen_finder.dm | 25 +++++++++++++ .../tgmc_xenos/code/misc/rouny_mode.dm | 12 +++++++ .../tgmc_xenos/code/misc/tgmc_alien_event.dm | 1 + .../modules/tgmc_xenos/code/xeno_bodyparts.dm | 18 ++++++---- tgstation.dme | 2 ++ 6 files changed, 52 insertions(+), 41 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/misc/queen_finder.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index ae5344f6475..bd92f0b8c26 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -1,7 +1,5 @@ /// TGMC_XENOS (old nova sector xenos) -#define ROUNY_ICON_FILE 'tff_modular/modules/tgmc_xenos/icons/rouny.dmi' - /mob/living/carbon/alien/adult/tgmc name = "rare bugged alien" icon = 'tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi' @@ -81,13 +79,6 @@ default_organ_types_by_slot[slot] = additional_organ_types_by_slot[slot] return ..() -/mob/living/carbon/alien/adult/tgmc/update_icon(updates) - if(GLOB.xeno_rounymode && icon_exists(ROUNY_ICON_FILE, icon_state)) - icon = ROUNY_ICON_FILE - else if(icon == ROUNY_ICON_FILE) - icon = initial(icon) - return ..() - /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха return FALSE @@ -160,30 +151,6 @@ /mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset, y_offset) return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) -//Yes we really do need to do this whole thing to let the queen finder work -/mob/living/carbon/alien/adult/tgmc/findQueen() - if(hud_used) - hud_used.alien_queen_finder.cut_overlays() - var/mob/queen = get_alien_type(/mob/living/carbon/alien/adult/tgmc/queen) - if(!queen) - return - var/turf/Q = get_turf(queen) - var/turf/A = get_turf(src) - if(Q.z != A.z) //The queen is on a different Z level, we cannot sense that far. - return - var/Qdir = get_dir(src, Q) - var/Qdist = get_dist(src, Q) - var/finder_icon = "finder_center" //Overlay showed when adjacent to or on top of the queen! - switch(Qdist) - if(2 to 7) - finder_icon = "finder_near" - if(8 to 20) - finder_icon = "finder_med" - if(21 to INFINITY) - finder_icon = "finder_far" - var/image/finder_eye = image('icons/hud/screen_alien.dmi', finder_icon, dir = Qdir) - hud_used.alien_queen_finder.add_overlay(finder_eye) - /mob/living/carbon/proc/get_max_plasma() var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) if(!vessel) @@ -194,5 +161,3 @@ . = ..() if(.) SEND_SIGNAL(src, COMSIG_XENO_PLASMA_ADJUSTED, amount) - -#undef ROUNY_ICON_FILE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/queen_finder.dm b/tff_modular/modules/tgmc_xenos/code/misc/queen_finder.dm new file mode 100644 index 00000000000..e752bfd2210 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/misc/queen_finder.dm @@ -0,0 +1,25 @@ +/// TGMC_XENOS (old nova sector xenos) + +//Yes we really do need to do this whole thing to let the queen finder work +/mob/living/carbon/alien/adult/tgmc/findQueen() + if(hud_used) + hud_used.alien_queen_finder.cut_overlays() + var/mob/queen = get_alien_type(/mob/living/carbon/alien/adult/tgmc/queen) + if(!queen) + return + var/turf/Q = get_turf(queen) + var/turf/A = get_turf(src) + if(Q.z != A.z) //The queen is on a different Z level, we cannot sense that far. + return + var/Qdir = get_dir(src, Q) + var/Qdist = get_dist(src, Q) + var/finder_icon = "finder_center" //Overlay showed when adjacent to or on top of the queen! + switch(Qdist) + if(2 to 7) + finder_icon = "finder_near" + if(8 to 20) + finder_icon = "finder_med" + if(21 to INFINITY) + finder_icon = "finder_far" + var/image/finder_eye = image('icons/hud/screen_alien.dmi', finder_icon, dir = Qdir) + hud_used.alien_queen_finder.add_overlay(finder_eye) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm b/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm new file mode 100644 index 00000000000..d555f38dc4c --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm @@ -0,0 +1,12 @@ +/// TGMC_XENOS (old nova sector xenos) + +#define ROUNY_ICON_FILE 'tff_modular/modules/tgmc_xenos/icons/rouny.dmi' + +/mob/living/carbon/alien/adult/tgmc/update_icon(updates) + if(GLOB.xeno_rounymode && icon_exists(ROUNY_ICON_FILE, icon_state)) + icon = ROUNY_ICON_FILE + else if(icon == ROUNY_ICON_FILE) + icon = initial(icon) + return ..() + +#undef ROUNY_ICON_FILE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm index 27057d90b2e..2bef74ee4cf 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm @@ -1,3 +1,4 @@ +/// TGMC_XENOS (old nova sector xenos) /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/tgmc name = "TGMC Alien Infestation" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm b/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm index f8a9cfcf6e4..2bfb32077ae 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm @@ -1,22 +1,25 @@ /// TGMC_XENOS (old nova sector xenos) +#define TGMC_ALIEN_BODYPART_BURN_MODIFIER 1.5 + + /obj/item/bodypart/head/alien/tgmc - burn_modifier = 1.5 + burn_modifier = TGMC_ALIEN_BODYPART_BURN_MODIFIER /obj/item/bodypart/chest/alien/tgmc - burn_modifier = 1.5 + burn_modifier = TGMC_ALIEN_BODYPART_BURN_MODIFIER /obj/item/bodypart/arm/left/alien/tgmc - burn_modifier = 1.5 + burn_modifier = TGMC_ALIEN_BODYPART_BURN_MODIFIER /obj/item/bodypart/arm/right/alien/tgmc - burn_modifier = 1.5 + burn_modifier = TGMC_ALIEN_BODYPART_BURN_MODIFIER /obj/item/bodypart/leg/left/alien/tgmc - burn_modifier = 1.5 + burn_modifier = TGMC_ALIEN_BODYPART_BURN_MODIFIER /obj/item/bodypart/leg/right/alien/tgmc - burn_modifier = 1.5 + burn_modifier = TGMC_ALIEN_BODYPART_BURN_MODIFIER /mob/living/carbon/alien/adult/tgmc/newBodyPart(zone) @@ -36,3 +39,6 @@ new_bodypart = new /obj/item/bodypart/chest/alien/tgmc() if(new_bodypart) new_bodypart.update_limb(is_creating = TRUE) + + +#undef TGMC_ALIEN_BODYPART_BURN_MODIFIER diff --git a/tgstation.dme b/tgstation.dme index d576d38046a..32713917e53 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9476,7 +9476,9 @@ #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\projectiles.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\queen_finder.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\resin_walker.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\rouny_mode.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_charge.dm" From 5a168992931e24b72c116311d12d8c2958c6aefd Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Tue, 7 Oct 2025 20:28:51 +0700 Subject: [PATCH 078/120] test --- code/modules/mob/living/carbon/alien/special/alien_embryo.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 7e47d91aec5..16e5647d8e1 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -76,7 +76,7 @@ if(HAS_TRAIT(owner, TRAIT_IMMUNODEFICIENCY) && !HAS_TRAIT(owner, TRAIT_VIRUS_RESISTANCE)) slowdown *= 0.5 //terrible immune system = doubled parasite growth - addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time*slowdown) + addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time*slowdown, TIMER_UNIQUE) // FLUFFY EDIT ORIGINAL: addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time) /obj/item/organ/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) @@ -116,7 +116,7 @@ if(isnull(ghost)) bursting = FALSE stage = 5 // If no ghosts sign up for the Larva, let's regress our growth by one minute, we will try again! - addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time) + addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time, TIMER_UNIQUE) // FLUFFY EDIT ORIGINAL: addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time) return var/mutable_appearance/overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "burst_lie") From 0d2664c3c2d9a2bf71d7d470b5935f874f8a7129 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Tue, 7 Oct 2025 22:19:29 +0700 Subject: [PATCH 079/120] add armor, reduce hp --- .../modules/tgmc_xenos/code/base_alien.dm | 4 ++-- .../tgmc_xenos/code/misc/projectiles.dm | 15 ++++++++------- .../tgmc_xenos/code/xeno_types/crusher.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/defender.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/drone.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/praetorian.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/queen.dm | 18 ++++++++++++++---- .../tgmc_xenos/code/xeno_types/ravager.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/rouny.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/sentinel.dm | 14 ++++++++++++-- .../tgmc_xenos/code/xeno_types/spitter.dm | 14 ++++++++++++-- 11 files changed, 120 insertions(+), 29 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index bd92f0b8c26..eade0dee35f 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -44,14 +44,14 @@ /// Все дополнительные органы, что должны находиться в телах ксеносов var/list/additional_organ_types_by_slot - // Оффсет для худ-ов, чтобы они лучше соответствовали размерам ксеноса + // Оффсет для худ-ов var/hud_offset_x = 32 var/hud_offset_y = 0 // Оффсет для огня var/fire_offset_x = 16 var/fire_offset_y = 0 - // Урон по тяжелым транспортным штукам (типа мехов) + // АП при атаке по мехам var/mecha_armor_penetration = 15 // Способность выдержать тяжелые удары мехов и не потерять сознание var/resist_heavy_hits = FALSE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm index ecc9769b65b..0179b43b087 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm @@ -3,13 +3,19 @@ /obj/projectile/neurotoxin/tgmc name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 70 + damage = 40 paralyze = 0 damage_type = STAMINA armor_flag = BIO /obj/projectile/neurotoxin/tgmc/queen - damage = 100 + damage = 80 + +/obj/projectile/neurotoxin/tgmc/spitter_spread //Slightly nerfed because its a shotgun spread of these + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 30 + /obj/projectile/neurotoxin/tgmc/acid name = "acid spit" @@ -22,11 +28,6 @@ /obj/projectile/neurotoxin/tgmc/acid/queen damage = 40 -/obj/projectile/neurotoxin/tgmc/spitter_spread //Slightly nerfed because its a shotgun spread of these - name = "neurotoxin spit" - icon_state = "neurotoxin" - damage = 40 - /obj/projectile/neurotoxin/tgmc/acid/spitter_spread name = "acid spit" icon_state = "toxin" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index bbb6501c2cb..948b02a6d94 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -5,13 +5,15 @@ desc = "A huge alien with an enormous armored crest." icon_state = "aliencrusher" caste = "crusher" - maxHealth = 700 - health = 700 + maxHealth = 300 + health = 300 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 alien_speed = 1.5 + armor_type = /datum/armor/tgmc_xeno/crusher + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ) @@ -29,3 +31,11 @@ grant_actions_by_list(innate_actions) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/datum/armor/tgmc_xeno/crusher + bomb = 20 + bullet = 75 + energy = 40 + laser = 40 + fire = 10 + melee = 90 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 6da915df195..f201a459ed7 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -5,14 +5,16 @@ desc = "A heavy looking alien with a wrecking ball-like tail that'd probably hurt to get hit by." icon_state = "aliendefender" caste = "defender" - maxHealth = 300 - health = 300 + maxHealth = 150 + health = 150 mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 alien_speed = 1 next_evolution = /mob/living/carbon/alien/adult/tgmc/crusher + armor_type = /datum/armor/tgmc_xeno/defender + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small, ) @@ -37,3 +39,11 @@ if(. == CONSCIOUS && fortify) var/datum/action/cooldown/alien/fortify/fortify_action = locate() in actions fortify_action.set_fortify(FALSE) + +/datum/armor/tgmc_xeno/defender + bomb = 30 + bullet = 45 + energy = 30 + laser = 30 + fire = 40 + melee = 45 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 8f36e170644..cbd0ca1e07e 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -5,12 +5,14 @@ desc = "As plain looking as you could call an alien with armored black chitin and large claws." icon_state = "aliendrone" caste = "drone" - maxHealth = 200 - health = 200 + maxHealth = 150 + health = 150 melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/praetorian + armor_type = /datum/armor/tgmc_xeno/ravager + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, @@ -27,3 +29,11 @@ /datum/action/cooldown/alien/tgmc/heal_aura, ) grant_actions_by_list(innate_actions) + +/datum/armor/tgmc_xeno/ravager + bomb = 10 + bullet = 30 + energy = 30 + laser = 30 + fire = 30 + melee = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 8e32a40be6d..31b7c4aabb3 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -5,14 +5,16 @@ desc = "An alien that looks like the awkward half-way point between a queen and a drone, in fact that's likely what it is." icon_state = "alienpraetorian" caste = "praetorian" - maxHealth = 400 - health = 400 + maxHealth = 225 + health = 225 mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 alien_speed = 2 next_evolution = /mob/living/carbon/alien/adult/tgmc/queen + armor_type = /datum/armor/tgmc_xeno/praetorian + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, @@ -32,3 +34,11 @@ grant_actions_by_list(innate_actions) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/datum/armor/tgmc_xeno/praetorian + bomb = 10 + bullet = 20 + energy = 50 + laser = 50 + fire = 50 + melee = 45 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index d1a794286b4..99999eecad9 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -5,13 +5,15 @@ desc = "A hulking beast of an alien, for some reason this one seems more important than the others, you should probably quit staring at it and do something." icon_state = "alienqueen" caste = "queen" - maxHealth = 750 - health = 750 + maxHealth = 350 + health = 350 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 alien_speed = 2 + armor_type = /datum/armor/tgmc_xeno/queen + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large/queen, ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, @@ -33,8 +35,16 @@ REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) -/mob/living/carbon/alien/adult/tgmc/queen/alien_talk(message, shown_name = name) - return ..(message, shown_name, TRUE) +/datum/armor/tgmc_xeno/queen + bomb = 30 + bullet = 40 + energy = 65 + laser = 65 + fire = 60 + melee = 60 + +/mob/living/carbon/alien/adult/tgmc/queen/alien_talk(message, list/spans = list(), list/message_mods = list(), shown_name = name, big_voice = TRUE) + ..(message, spans, message_mods, shown_name, TRUE) /mob/living/carbon/alien/adult/tgmc/queen/death(gibbed) if(stat == DEAD) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index d08b0bc65de..bb93e8fb576 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -5,13 +5,15 @@ desc = "An alien with angry red chitin, with equally intimidating looking blade-like claws in place of normal hands. That sharp tail looks like it'd probably hurt." icon_state = "alienravager" caste = "ravager" - maxHealth = 350 - health = 350 + maxHealth = 200 + health = 200 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 alien_speed = 0.5 + armor_type = /datum/armor/tgmc_xeno/ravager + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/no_weeds ) @@ -29,3 +31,11 @@ REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 0, range = 8, speed = 2, skill_mod = 9, min_distance = 0) + +/datum/armor/tgmc_xeno/ravager + bomb = 10 + bullet = 50 + energy = 50 + laser = 50 + fire = 30 + melee = 50 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 37d11641e69..9d64b0170ba 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -5,13 +5,15 @@ desc = "A short alien with sleek red chitin, clearly abiding by the 'red ones go faster' theorem and almost always running on all fours." icon_state = "alienrunner" caste = "runner" - maxHealth = 150 - health = 150 + maxHealth = 100 + health = 100 melee_damage_lower = 15 melee_damage_upper = 20 alien_speed = -0.5 next_evolution = /mob/living/carbon/alien/adult/tgmc/ravager + armor_type = /datum/armor/tgmc_xeno/rouny + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small/tiny, ) @@ -29,3 +31,11 @@ evade_ability.Grant(src) AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 4, min_distance = 0) + +/datum/armor/tgmc_xeno/rouny + bomb = 0 + bullet = 30 + energy = 30 + laser = 30 + fire = 20 + melee = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 18336e26d6b..8d26ada7942 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -5,13 +5,15 @@ desc = "An alien that'd be unremarkable if not for the bright coloring and visible acid glands that cover it." icon_state = "aliensentinel" caste = "sentinel" - maxHealth = 200 - health = 200 + maxHealth = 150 + health = 150 melee_damage_lower = 10 melee_damage_upper = 15 alien_speed = 0.5 next_evolution = /mob/living/carbon/alien/adult/tgmc/spitter + armor_type = /datum/armor/tgmc_xeno/sentinel + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc, @@ -28,3 +30,11 @@ /datum/action/cooldown/mob_cooldown/sneak/alien, ) grant_actions_by_list(innate_actions) + +/datum/armor/tgmc_xeno/sentinel + bomb = 10 + bullet = 30 + energy = 30 + laser = 30 + fire = 30 + melee = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 5c6b503dd7c..fd442036bcf 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -5,13 +5,15 @@ desc = "A fairly heavy looking alien with prominent acid glands, it's mouth dripping with... some kind of toxin or acid." icon_state = "alienspitter" caste = "spitter" - maxHealth = 300 - health = 300 + maxHealth = 200 + health = 200 mob_size = MOB_SIZE_LARGE melee_damage_lower = 15 melee_damage_upper = 20 alien_speed = 1 + armor_type = /datum/armor/tgmc_xeno/spitter + additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, @@ -25,3 +27,11 @@ /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/datum/armor/tgmc_xeno/spitter + bomb = 0 + bullet = 35 + energy = 35 + laser = 35 + fire = 35 + melee = 25 From bb45329d73914ba450afec66cae34907af3f480b Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 02:12:49 +0700 Subject: [PATCH 080/120] things MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - меньший радиус хагов - хагов теперь нельзя переносить (изменится) - багфиксы для яиц хагов - яйца хагов теперь дороже в 2 раза - больший урон от огня ксенам (дополнительные 4 единицы урона в секунду) - ставить траву теперь могут только дроны, преторы и королева --- .../modules/tgmc_xenos/code/base_alien.dm | 11 ++++++----- .../tgmc_xenos/code/defense/alien_defense.dm | 6 ++++++ .../modules/tgmc_xenos/code/misc/larva.dm | 18 ++++++++++++++++-- .../code/structures/alien_structures.dm | 8 ++++---- .../modules/tgmc_xenos/code/xeno_organs.dm | 6 +++++- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index eade0dee35f..48c6b70c628 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -59,6 +59,9 @@ // Включен ли в данный момент фортифай var/fortify = FALSE + // Может ли переносить хагов + var/can_hold_facehugger = FALSE + /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() real_name = "alien [caste]" @@ -84,11 +87,9 @@ return FALSE if(fortify) return FALSE - if(ishuman(attack_target)) - var/mob/living/carbon/human/target = attack_target - if(target.stat == DEAD) - to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) - return FALSE + if(ishuman(attack_target) && attack_target.stat == DEAD) + to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) + return FALSE return ..() /mob/living/carbon/alien/adult/tgmc/grab(mob/living/target) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm index 712e3950a5c..6870f54a8e8 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm @@ -1,5 +1,7 @@ /// TGMC_XENOS (old nova sector xenos) +#define TGMC_XENO_FIRESTACK_DAMAGE 4 + /mob/living/carbon/alien/adult/tgmc/attack_alien(mob/living/carbon/alien/user, list/modifiers) if(!user.combat_mode) if(user == src) @@ -22,3 +24,7 @@ AdjustSleeping(-10 SECONDS) return return ..() + +/mob/living/carbon/alien/adult/tgmc/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) + . = ..() + adjustFireLoss(seconds_per_tick * TGMC_XENO_FIRESTACK_DAMAGE) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index b830b9e5668..6fc223ed516 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -8,10 +8,24 @@ for(var/mob/victim in range(range, src)) if(!CanHug(victim)) continue - Leap(victim) - return TRUE + return Leap(victim) return FALSE +/obj/item/clothing/mask/facehugger/tgmc/attempt_pickup(mob/living/user, skip_grav) + if(istgmcalien(user)) + var/mob/living/carbon/alien/adult/tgmc/xeno = user + if(!xeno.can_hold_facehugger) + return TRUE + return ..() + +/obj/item/clothing/mask/facehugger/tgmc/can_be_pulled(user, force) + . = ..() + if(. && istgmcalien(user)) + var/mob/living/carbon/alien/adult/tgmc/xeno = user + if(!xeno.can_hold_facehugger) + return TRUE + + // То же самое, но для эмбриона ларвочки /obj/item/organ/body_egg/alien_embryo/tgmc larva_path = /mob/living/carbon/alien/larva/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index d3bcf56451a..20c35cda69f 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -3,7 +3,7 @@ /obj/structure/alien/egg/tgmc child_path = /obj/item/clothing/mask/facehugger/tgmc - var/leap_range = 3 + var/leap_range = 2 var/return_timer /obj/structure/alien/egg/tgmc/Grow() @@ -18,15 +18,15 @@ if(kill) child_hugger.Die() else - child_hugger.ProximityLeap(leap_range) - return_timer = addtimer(CALLBACK(src, PROC_REF(return_child)), 15 SECONDS, TIMER_UNIQUE|TIMER_DELETE_ME) + if(!child_hugger.ProximityLeap(leap_range)) + return_timer = addtimer(CALLBACK(src, PROC_REF(return_child)), 15 SECONDS, TIMER_UNIQUE|TIMER_DELETE_ME) return ..() /obj/structure/alien/egg/tgmc/proc/return_child(obj/item/clothing/mask/facehugger/hugger) if(isnull(hugger)) hugger = locate(child_path) in loc - if(!istype(hugger, child_path)) + if(isnull(hugger) || !istype(hugger, child_path)) return FALSE hugger.forceMove(src) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index 62f0f1ab438..ca0d9f5fc8f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -15,7 +15,6 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_XENO_PLASMAVESSEL actions_types = list( - /datum/action/cooldown/alien/make_structure/plant_weeds, /datum/action/cooldown/alien/transfer, ) @@ -59,6 +58,10 @@ name = "large plasma vessel" icon_state = "plasma_large" w_class = WEIGHT_CLASS_BULKY + actions_types = list( + /datum/action/cooldown/alien/make_structure/plant_weeds, + /datum/action/cooldown/alien/transfer, + ) stored_plasma = 200 max_plasma = 500 plasma_rate = 7.5 @@ -90,6 +93,7 @@ actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg/tgmc) /datum/action/cooldown/alien/make_structure/lay_egg/tgmc + plasma_cost = 150 made_structure_type = /obj/structure/alien/egg/tgmc From 638f929c3e21fd739065eda0f60bde3805bd3c96 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 02:13:41 +0700 Subject: [PATCH 081/120] Merge remote-tracking branch 'upstream/master' into xeno-rebalance From f7ef02260da9984f9595d91bea1f21749f05e31b Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 02:35:05 +0700 Subject: [PATCH 082/120] things 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - спиттер теперь не бесполезный, он единственный теперь может держать хагов - дрон и королев чуть менее живучие - такл чуть меньше --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 8 +++++--- tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm | 2 ++ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 48c6b70c628..c5382854510 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -87,9 +87,11 @@ return FALSE if(fortify) return FALSE - if(ishuman(attack_target) && attack_target.stat == DEAD) - to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) - return FALSE + if(ishuman(attack_target)) + var/mob/living/carbon/human/target = attack_target + if(target.stat == DEAD) + to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) + return FALSE return ..() /mob/living/carbon/alien/adult/tgmc/grab(mob/living/target) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index cbd0ca1e07e..316fa84ba92 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -5,8 +5,8 @@ desc = "As plain looking as you could call an alien with armored black chitin and large claws." icon_state = "aliendrone" caste = "drone" - maxHealth = 150 - health = 150 + maxHealth = 125 + health = 125 melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/praetorian diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index bb93e8fb576..c0cbec83776 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -30,7 +30,7 @@ grant_actions_by_list(innate_actions) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 0, range = 8, speed = 2, skill_mod = 9, min_distance = 0) + AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 0, range = 6, speed = 2, skill_mod = 9, min_distance = 0) /datum/armor/tgmc_xeno/ravager bomb = 10 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 9d64b0170ba..035f711a32e 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -30,7 +30,7 @@ evade_ability = new(src) evade_ability.Grant(src) - AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 4, min_distance = 0) + AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 8, speed = 2, skill_mod = 4, min_distance = 0) /datum/armor/tgmc_xeno/rouny bomb = 0 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index fd442036bcf..553ab83904c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -24,6 +24,8 @@ resist_heavy_hits = TRUE + can_hold_facehugger = TRUE + /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) From 73830bd3c00713ddd35524fbdbc6d854fe3e8213 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 02:35:29 +0700 Subject: [PATCH 083/120] Update queen.dm --- tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 99999eecad9..1d483da6093 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -5,8 +5,8 @@ desc = "A hulking beast of an alien, for some reason this one seems more important than the others, you should probably quit staring at it and do something." icon_state = "alienqueen" caste = "queen" - maxHealth = 350 - health = 350 + maxHealth = 300 + health = 300 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 From 7b276d5a560b513e371accbdb651bf8dadf6318c Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 02:55:11 +0700 Subject: [PATCH 084/120] Update tgmc_alien_event.dm --- tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm index 2bef74ee4cf..5932b85de88 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm @@ -2,9 +2,12 @@ /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/tgmc name = "TGMC Alien Infestation" - config_tag = "Xenomorph" + config_tag = "XenomorphTGMC" pref_flag = null preview_antag_datum = null /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/tgmc/create_ruleset_body() return new /mob/living/carbon/alien/larva/tgmc + +/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/tgmc/announce_xenos() + priority_announce("Unusual, highly active unidentified biological signatures detected boarding [station_name()]. All personnel must report irregular movement through maintenance corridors and environmental systems. Maintain vigilance and monitor for breaches.", "Lifesign Alert", ANNOUNCER_ALIENS) From 10cdae9ad9a3e0509322d68ea1e7ccaf3467952f Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 03:20:59 +0700 Subject: [PATCH 085/120] things 3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - меньше урона от огня ксенам - исправлена возможность перетаскивать мертвых хуманов --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 6 ------ .../modules/tgmc_xenos/code/defense/alien_defense.dm | 2 +- .../modules/tgmc_xenos/code/defense/human_defense.dm | 7 +++++++ tff_modular/modules/tgmc_xenos/readme.md | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index c5382854510..16ce6dee29e 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -94,12 +94,6 @@ return FALSE return ..() -/mob/living/carbon/alien/adult/tgmc/grab(mob/living/target) - if(ishuman(target) && target.stat == DEAD) - to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) - return FALSE - return ..() - /mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) if(fortify) balloon_alert(src, "Cannot while fortified") diff --git a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm index 6870f54a8e8..f339f103f93 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm @@ -1,6 +1,6 @@ /// TGMC_XENOS (old nova sector xenos) -#define TGMC_XENO_FIRESTACK_DAMAGE 4 +#define TGMC_XENO_FIRESTACK_DAMAGE 2 /mob/living/carbon/alien/adult/tgmc/attack_alien(mob/living/carbon/alien/user, list/modifiers) if(!user.combat_mode) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm index 655242dad0a..c9cea887525 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm @@ -60,3 +60,10 @@ return TRUE apply_damage(damage, BRUTE, affecting, armor_block) + +/mob/living/carbon/human/can_be_pulled(user, force) + . = ..() + if(.) + if(stat == DEAD && istgmcalien(user)) + to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) + return FALSE diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index 0f344ea2906..3be8b61a1f2 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -50,6 +50,6 @@ IN: code/\_\_HELPERS/~ff_helpers/is_helpers.dm ## Credits -TGMC & CM - Where the sprites, sound, and ideas for caste abilities came from +TGMC & CM - Where the sprites, sound, and ideas for abilities came from -Original developer of these xenos (apparently it's @Paxilmaniac) - Porting the xenos from TGMC and adopting their stuff to work with tg-skyrat code +Original developer of these xenos (apparently it's @Paxilmaniac) - Porting the xenos from TGMC and adopting their code to work with tg-skyrat build From 5581328c4f5396c7e43b6ce88adeded86ec466dc Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 20:13:10 +0700 Subject: [PATCH 086/120] q MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - подправлена скорость т3 - подправлена аномальная броня --- tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm | 6 +++--- .../modules/tgmc_xenos/code/xeno_types/praetorian.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm | 6 +++--- tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 948b02a6d94..6e2ac8120f9 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -5,12 +5,12 @@ desc = "A huge alien with an enormous armored crest." icon_state = "aliencrusher" caste = "crusher" - maxHealth = 300 - health = 300 + maxHealth = 275 + health = 275 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 - alien_speed = 1.5 + alien_speed = 2 armor_type = /datum/armor/tgmc_xeno/crusher diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index 31b7c4aabb3..b92bede9488 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -10,7 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 - alien_speed = 2 + alien_speed = 1.5 next_evolution = /mob/living/carbon/alien/adult/tgmc/queen armor_type = /datum/armor/tgmc_xeno/praetorian diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 1d483da6093..ffa4dfdf589 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -10,7 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 - alien_speed = 2 + alien_speed = 3 armor_type = /datum/armor/tgmc_xeno/queen diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index c0cbec83776..71742dd4cba 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -5,12 +5,12 @@ desc = "An alien with angry red chitin, with equally intimidating looking blade-like claws in place of normal hands. That sharp tail looks like it'd probably hurt." icon_state = "alienravager" caste = "ravager" - maxHealth = 200 - health = 200 + maxHealth = 175 + health = 175 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 - alien_speed = 0.5 + alien_speed = 1.5 armor_type = /datum/armor/tgmc_xeno/ravager diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 8d26ada7942..69c8ed567d6 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -5,8 +5,8 @@ desc = "An alien that'd be unremarkable if not for the bright coloring and visible acid glands that cover it." icon_state = "aliensentinel" caste = "sentinel" - maxHealth = 150 - health = 150 + maxHealth = 125 + health = 125 melee_damage_lower = 10 melee_damage_upper = 15 alien_speed = 0.5 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 553ab83904c..538a7e47bad 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -5,8 +5,8 @@ desc = "A fairly heavy looking alien with prominent acid glands, it's mouth dripping with... some kind of toxin or acid." icon_state = "alienspitter" caste = "spitter" - maxHealth = 200 - health = 200 + maxHealth = 175 + health = 175 mob_size = MOB_SIZE_LARGE melee_damage_lower = 15 melee_damage_upper = 20 From 5d80f74c6f5c14b71db2f033ca2e8fa10a404e53 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 17 Nov 2025 20:56:08 +0700 Subject: [PATCH 087/120] again things MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - строительство резины занимает время (1.5 секунды) --- tff_modular/modules/tgmc_xenos/code/xeno_organs.dm | 11 ++++++++--- .../modules/tgmc_xenos/code/xeno_types/defender.dm | 2 +- .../modules/tgmc_xenos/code/xeno_types/drone.dm | 2 +- .../modules/tgmc_xenos/code/xeno_types/praetorian.dm | 2 +- .../modules/tgmc_xenos/code/xeno_types/queen.dm | 2 +- .../modules/tgmc_xenos/code/xeno_types/ravager.dm | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index ca0d9f5fc8f..5f96744234e 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -84,9 +84,6 @@ max_plasma = 100 actions_types = list(/datum/action/cooldown/alien/transfer) -/obj/item/organ/alien/plasmavessel/tgmc/no_weeds - actions_types = list(/datum/action/cooldown/alien/transfer) - // Яйцеклад королевы /obj/item/organ/alien/eggsac/tgmc @@ -97,6 +94,14 @@ made_structure_type = /obj/structure/alien/egg/tgmc +// Ставилка резины +/obj/item/organ/alien/resinspinner/tgmc + actions_types = list(/datum/action/cooldown/alien/make_structure/resin/tgmc) + +/datum/action/cooldown/alien/make_structure/resin/tgmc + build_duration = 1.5 SECONDS + + // Плевалка нейротоксина сентинела /obj/item/organ/alien/neurotoxin/tgmc name = "neurotoxin gland" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index f201a459ed7..83658ab7a1c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -10,7 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 - alien_speed = 1 + alien_speed = 1.5 next_evolution = /mob/living/carbon/alien/adult/tgmc/crusher armor_type = /datum/armor/tgmc_xeno/defender diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 316fa84ba92..1d4d3e6b576 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -15,7 +15,7 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large, - ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid, ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index b92bede9488..a16ed6bc02b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -17,7 +17,7 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large, - ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index ffa4dfdf589..1fe62ff333a 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -16,7 +16,7 @@ additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large/queen, - ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner/tgmc, ORGAN_SLOT_XENO_ACIDGLAND = /obj/item/organ/alien/acid/tgmc/large, ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/queen, ORGAN_SLOT_XENO_EGGSAC = /obj/item/organ/alien/eggsac/tgmc, diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 71742dd4cba..4e973302cd0 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -15,7 +15,7 @@ armor_type = /datum/armor/tgmc_xeno/ravager additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/no_weeds + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ) mecha_armor_penetration = 35 From ab0a8a7147c871eb58a6c183a9032ca3fd3b202c Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:10:36 +0700 Subject: [PATCH 088/120] hud for xeno --- code/__DEFINES/atom_hud.dm | 4 +++ .../_globalvars/traits/declarations.dm | 3 ++ code/_globalvars/traits/admin_tooling.dm | 1 + code/datums/hud.dm | 2 ++ code/modules/admin/verbs/admingame.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 1 + tff_modular/modules/custom_huds/code/huds.dm | 12 ++++--- .../modules/tgmc_xenos/code/base_alien.dm | 5 ++- .../modules/tgmc_xenos/code/misc/xeno_hud.dm | 30 ++++++++++++++++++ .../modules/tgmc_xenos/icons/xeno_hud.dmi | Bin 0 -> 1684 bytes tgstation.dme | 2 ++ 11 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm create mode 100644 tff_modular/modules/tgmc_xenos/icons/xeno_hud.dmi diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 872478a5918..04f98f9472d 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -56,6 +56,9 @@ /// If they have the DNR trait #define DNR_HUD "27" // NOVA EDIT ADDITION END +// FLUFFY FRONTIER ADDITION START +#define XENO_HUD "30" +// FLUFFY FRONTIER ADDITION END //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -74,6 +77,7 @@ #define DATA_HUD_FAN 9 #define DATA_HUD_MALF_APC 10 #define DATA_HUD_PERMIT 11 //NOVA EDIT ADDITION +#define DATA_HUD_XENO 12 // FLUFFY FRONTIER ADDITION /// cooldown for being shown the images for any particular data hud #define ADD_HUD_TO_COOLDOWN 20 diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm index 435b769ae0a..2c52ce8823c 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm @@ -1,3 +1,6 @@ + +// xeno traits +#define TRAIT_XENO_HUD "xeno_hud" /// Trait source for xeno innate abilities #define TRAIT_XENO_INNATE "xeno_innate" /// Trait source for something added BY a xeno ability diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 92c23d133bc..232c51c4451 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -504,6 +504,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_XENO_ABILITY_GIVEN" = TRAIT_XENO_ABILITY_GIVEN, "TRAIT_XENO_HEAL_AURA" = TRAIT_XENO_HEAL_AURA, "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE, + "TRAIT_XENO_HUD" = TRAIT_XENO_HUD, ), // FLUFFY FRONTIER ADDITION END )) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 20a5b39404e..3a9828a0d22 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -19,6 +19,7 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_FAN = new /datum/atom_hud/data/human/fan_hud(), DATA_HUD_MALF_APC = new /datum/atom_hud/data/malf_apc(), DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), // NOVA EDIT ADDITION + DATA_HUD_XENO = new /datum/atom_hud/data/xeno(), // FLUFFY FRONTIER ADDITION )) /// Assoc list of traits to the huds they give. @@ -33,6 +34,7 @@ GLOBAL_LIST_INIT(trait_to_hud, list( TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED, TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC, TRAIT_PERMIT_HUD = DATA_HUD_PERMIT, // NOVA EDIT ADDITION + TRAIT_XENO_HUD = DATA_HUD_XENO, // FLUFFY FRONTIER ADDITION )) /// Assoc list of traits that block other traits' huds to list of hud (traits) that they block diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index 57d829d0f11..a677dfa6ab0 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -367,7 +367,7 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD. SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Combo HUD", "[user.combo_hud_enabled ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /// List of hud traits in the admin combo hud -#define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) +#define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD, TRAIT_XENO_HUD) // FLUFFY FRONTIER EDIT - ORIGINAL: #define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) /client/proc/enable_combo_hud() if (combo_hud_enabled) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index da18c9007e8..39137eb22e1 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -72,6 +72,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, + TRAIT_XENO_HUD, // FLUFFY FRONTIER ADDITION TRAIT_BOT_PATH_HUD ) diff --git a/tff_modular/modules/custom_huds/code/huds.dm b/tff_modular/modules/custom_huds/code/huds.dm index 4d620afc251..e07220f1ea6 100644 --- a/tff_modular/modules/custom_huds/code/huds.dm +++ b/tff_modular/modules/custom_huds/code/huds.dm @@ -1,9 +1,13 @@ GLOBAL_VAR_INIT(merged_huds, merge_huds()) /proc/merge_huds() - var/icon/huds = new('modular_nova/master_files/icons/mob/huds/hud.dmi') - var/icon/ff_huds = new('tff_modular/modules/custom_huds/icons/hud.dmi') + var/icon/huds = icon('modular_nova/master_files/icons/mob/huds/hud.dmi') + var/list/icon/additional_huds = list( + icon('tff_modular/modules/custom_huds/icons/hud.dmi'), + icon('tff_modular/modules/tgmc_xenos/icons/xeno_hud.dmi'), + ) - for(var/state in icon_states(ff_huds)) - huds.Insert(icon(ff_huds, state), state) + for(var/icon/hud in additional_huds) + for(var/state in icon_states(hud)) + huds.Insert(icon(hud, state), state) return huds diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 16ce6dee29e..a324d78d884 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -146,7 +146,10 @@ particle_holder.pixel_y = fire_offset_y /mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset, y_offset) - return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) + if(hud_type != XENO_HUD) + x_offset += hud_offset_x + y_offset += hud_offset_y + return ..(hud_type, hud_state, x_offset, y_offset) /mob/living/carbon/proc/get_max_plasma() var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm new file mode 100644 index 00000000000..e3fca481cfe --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm @@ -0,0 +1,30 @@ +/// TGMC_XENOS (old nova sector xenos) + +/mob/living/carbon/alien/adult/tgmc + hud_possible = list(ANTAG_HUD, XENO_HUD) + +/mob/living/carbon/alien/adult/tgmc/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_XENO_HUD, INNATE_TRAIT) + + var/datum/atom_hud/data/xeno/xeno_hud = GLOB.huds[DATA_HUD_XENO] + xeno_hud.add_atom_to_hud(src) + +/mob/living/carbon/alien/adult/tgmc/med_hud_set_health() + if(QDELETED(src)) + return + + var/amount = 0 + if(stat != DEAD) + amount = health > 0 ? round(health * 100 / maxHealth, 10) : CEILING(health, 10) + if(health < 0) + amount = round((health / (-maxHealth)) * -100, 10) + else + amount = CEILING((health / maxHealth) * 100, 10) + if(!amount) + amount = -1 //don't want the 'zero health' icon when we are crit + + set_hud_image_state(XENO_HUD, "xenohealth[amount]", 32, -32) + +/datum/atom_hud/data/xeno + hud_icons = list(XENO_HUD) diff --git a/tff_modular/modules/tgmc_xenos/icons/xeno_hud.dmi b/tff_modular/modules/tgmc_xenos/icons/xeno_hud.dmi new file mode 100644 index 0000000000000000000000000000000000000000..26a6bd3e5948d2bc2672314064497f2a7855d780 GIT binary patch literal 1684 zcmb7Fe>l^59RGZ`Hlj5hqD7;V$gi9o(PCKn5sM;RnAC;*48@6UaTKMaD8IK5`H^*( zNA3KW@}uZvqn#8+XNvr|-INx#+v?wYuBYdDe?G70^?E+t>1!D@The z{a%`$vB=_fC7su?N^4>qr;bt1&z*RXyXdg1cgbDD}5`lDg1REIyygZUG|>NtHi_-^yoIBwGQ80 z(_nt$(j;OWk#&~1l?Btv-X?s5=y^cC%pc_?yq(Z%kVqU6&-JyMSYrb)Gw>)fuJt9N zL5`~%l>K3*JsF4H#jEYM_AEcdCIuyP01*3Ki1uEIC3Bqa4lAi;^N(bTXIv_!M0M()X!MSC3%#9T3kK#6Zd=3q;|C{gypwG#0* zJ*F#5l%$pW z#&mo!;#Q*R{)O8e9q*?Q3%#07@c11h!`V5$B;{1{tjRb5!?0~Is8g{^j&FHM^%nT-s;5Bs)6`W_u%~4BC(jsN)XvIuYvThi~)5~I4!f%iXh7tv=u{u69<7ZO2ri( zN(;pV-GCgz07}IjZj2)spcqhj7%d&CcoV`AaHu;Ra05p}UZ{dLVs!G59Kgl3JHUS) z02rMjq;DwAU+xFKY>^c0k3DNMhoW9<yj zzS-0llDeBGvKaG19 zyHJQDR3}Mhnq$#Eo}Tn2=2y;IfxQ JY;Xul{TJ`d`j-Fz literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 26d3bcfc389..4eb69aef434 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -427,6 +427,7 @@ #include "code\__DEFINES\~ff_defines\_globalvars\lists\blooper.dm" #include "code\__DEFINES\~ff_defines\_globalvars\lists\hidden_verbs.dm" #include "code\__DEFINES\~ff_defines\_globalvars\traits\declarations.dm" +#include "code\__DEFINES\~ff_defines\traits\declarations.dm" #include "code\__DEFINES\~nova_defines\_organ_defines.dm" #include "code\__DEFINES\~nova_defines\access.dm" #include "code\__DEFINES\~nova_defines\actionspeed_modification.dm" @@ -9635,6 +9636,7 @@ #include "tff_modular\modules\tgmc_xenos\code\misc\resin_walker.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\rouny_mode.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\xeno_hud.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_charge.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_powers.dm" From e21600a7cfaeaee7b3f871eb7f031a77081bc977 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 01:16:09 +0700 Subject: [PATCH 089/120] Update tgstation.dme --- tgstation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 4eb69aef434..4575560c00e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -427,7 +427,6 @@ #include "code\__DEFINES\~ff_defines\_globalvars\lists\blooper.dm" #include "code\__DEFINES\~ff_defines\_globalvars\lists\hidden_verbs.dm" #include "code\__DEFINES\~ff_defines\_globalvars\traits\declarations.dm" -#include "code\__DEFINES\~ff_defines\traits\declarations.dm" #include "code\__DEFINES\~nova_defines\_organ_defines.dm" #include "code\__DEFINES\~nova_defines\access.dm" #include "code\__DEFINES\~nova_defines\actionspeed_modification.dm" From 30a1b7b5e249befb65c82a5c5d65eb915b089170 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 16:34:08 +0700 Subject: [PATCH 090/120] remove unused thing --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 9 --------- .../modules/tgmc_xenos/code/xeno_types/crusher.dm | 2 -- tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm | 1 - tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm | 1 - .../modules/tgmc_xenos/code/xeno_types/sentinel.dm | 1 - .../modules/tgmc_xenos/code/xeno_types/spitter.dm | 2 -- 6 files changed, 16 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index a324d78d884..9ea96f262c6 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -44,9 +44,6 @@ /// Все дополнительные органы, что должны находиться в телах ксеносов var/list/additional_organ_types_by_slot - // Оффсет для худ-ов - var/hud_offset_x = 32 - var/hud_offset_y = 0 // Оффсет для огня var/fire_offset_x = 16 var/fire_offset_y = 0 @@ -145,12 +142,6 @@ particle_holder.pixel_x = fire_offset_x particle_holder.pixel_y = fire_offset_y -/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset, y_offset) - if(hud_type != XENO_HUD) - x_offset += hud_offset_x - y_offset += hud_offset_y - return ..(hud_type, hud_state, x_offset, y_offset) - /mob/living/carbon/proc/get_max_plasma() var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) if(!vessel) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 6e2ac8120f9..31f69443ecb 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -18,8 +18,6 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, ) - hud_offset_y = -16 - mecha_armor_penetration = 35 resist_heavy_hits = TRUE diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index 1d4d3e6b576..c8af5428aa6 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -21,7 +21,6 @@ maptext_height = 32 maptext_width = 32 - hud_offset_y = -16 /mob/living/carbon/alien/adult/tgmc/drone/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 035f711a32e..cf04c27ca1c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -20,7 +20,6 @@ maptext_height = 32 maptext_width = 32 - hud_offset_y = -32 /// Holds the evade ability to be granted to the runner later var/datum/action/cooldown/alien/tgmc/evade/evade_ability diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 69c8ed567d6..f927d28e747 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -22,7 +22,6 @@ maptext_height = 32 maptext_width = 32 - hud_offset_y = -16 /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 538a7e47bad..91659d705a2 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -20,8 +20,6 @@ ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) - hud_offset_y = -16 - resist_heavy_hits = TRUE can_hold_facehugger = TRUE From 06947c3d87dd4e91d4aebbda77d97b33be3a6a6c Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 16:34:35 +0700 Subject: [PATCH 091/120] Update base_alien.dm --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 9ea96f262c6..80797075a03 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -144,8 +144,8 @@ /mob/living/carbon/proc/get_max_plasma() var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) - if(!vessel) - return -1 + if(isnull(vessel)) + return 0 return vessel.max_plasma /mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) From a7e9a2371f805ef404c58a70d8a751932a336663 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:49:46 +0700 Subject: [PATCH 092/120] again things 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - исправлена ошибка с претаскиванием хагов - исрпавлена ошибка у яиц хагов? - добавлен худ для отображения текущей плазмы - исправлен худ хп ксенов в крите --- code/__DEFINES/atom_hud.dm | 1 + code/_globalvars/traits/_traits.dm | 1 + .../modules/tgmc_xenos/code/base_alien.dm | 7 ++++- .../modules/tgmc_xenos/code/misc/larva.dm | 2 +- .../modules/tgmc_xenos/code/misc/xeno_hud.dm | 27 +++++++++++------- .../code/structures/alien_structures.dm | 2 +- .../modules/tgmc_xenos/icons/xeno_hud.dmi | Bin 1684 -> 2454 bytes 7 files changed, 27 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 04f98f9472d..5ca506297d9 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -58,6 +58,7 @@ // NOVA EDIT ADDITION END // FLUFFY FRONTIER ADDITION START #define XENO_HUD "30" +#define XENOPLASMA_HUD "31" // FLUFFY FRONTIER ADDITION END //by default everything in the hud_list of an atom is an image diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index b9f3035114a..4dd40dd23c4 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -911,6 +911,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_ABILITY_GIVEN" = TRAIT_XENO_ABILITY_GIVEN, "TRAIT_XENO_HEAL_AURA" = TRAIT_XENO_HEAL_AURA, "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE, + "TRAIT_XENO_HUD" = TRAIT_XENO_HUD, ), // FLUFFY FRONTIER ADDITION END )) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 80797075a03..e49431ea444 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -3,6 +3,7 @@ /mob/living/carbon/alien/adult/tgmc name = "rare bugged alien" icon = 'tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi' + hud_possible = list(ANTAG_HUD, XENO_HUD, XENOPLASMA_HUD) rotate_on_lying = FALSE base_pixel_w = -16 layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles @@ -66,10 +67,14 @@ update_offsets() // Необходимо, чтобы base_pixel_w применился set_armor(armor_type) + var/datum/atom_hud/data/xeno/xeno_hud = GLOB.huds[DATA_HUD_XENO] + xeno_hud.add_atom_to_hud(src) + xeno_hud_set_plasma() + if(next_evolution) GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) - add_traits(list(TRAIT_XENO_HEAL_AURA, TRAIT_PIERCEIMMUNE), TRAIT_XENO_INNATE) + add_traits(list(TRAIT_XENO_HEAL_AURA, TRAIT_PIERCEIMMUNE, TRAIT_XENO_HUD), TRAIT_XENO_INNATE) AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) AddComponent(/datum/component/seethrough_mob) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index 6fc223ed516..4c214a4b980 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -23,7 +23,7 @@ if(. && istgmcalien(user)) var/mob/living/carbon/alien/adult/tgmc/xeno = user if(!xeno.can_hold_facehugger) - return TRUE + return FALSE // То же самое, но для эмбриона ларвочки diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm index e3fca481cfe..9102cb9540a 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm @@ -1,16 +1,18 @@ /// TGMC_XENOS (old nova sector xenos) -/mob/living/carbon/alien/adult/tgmc - hud_possible = list(ANTAG_HUD, XENO_HUD) +/datum/atom_hud/data/xeno + hud_icons = list(XENO_HUD, XENOPLASMA_HUD) + + +/mob/living/carbon/alien/adult/tgmc/med_hud_set_health() + xeno_hud_set_health() -/mob/living/carbon/alien/adult/tgmc/Initialize(mapload) +/mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) . = ..() - ADD_TRAIT(src, TRAIT_XENO_HUD, INNATE_TRAIT) + xeno_hud_set_plasma() - var/datum/atom_hud/data/xeno/xeno_hud = GLOB.huds[DATA_HUD_XENO] - xeno_hud.add_atom_to_hud(src) -/mob/living/carbon/alien/adult/tgmc/med_hud_set_health() +/mob/living/carbon/alien/adult/tgmc/proc/xeno_hud_set_health() if(QDELETED(src)) return @@ -18,7 +20,7 @@ if(stat != DEAD) amount = health > 0 ? round(health * 100 / maxHealth, 10) : CEILING(health, 10) if(health < 0) - amount = round((health / (-maxHealth)) * -100, 10) + amount = round((health / (HEALTH_THRESHOLD_DEAD)) * -100, 10) else amount = CEILING((health / maxHealth) * 100, 10) if(!amount) @@ -26,5 +28,10 @@ set_hud_image_state(XENO_HUD, "xenohealth[amount]", 32, -32) -/datum/atom_hud/data/xeno - hud_icons = list(XENO_HUD) +/mob/living/carbon/alien/adult/tgmc/proc/xeno_hud_set_plasma() + var/amount + if(stat == DEAD || get_max_plasma() == 0) + amount = 0 + else + amount = round(getPlasma() * 100 / get_max_plasma(), 10) + set_hud_image_state(XENOPLASMA_HUD, "plasma[amount]", 32, -32) diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index 20c35cda69f..d9a4b91fb0d 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -19,7 +19,7 @@ child_hugger.Die() else if(!child_hugger.ProximityLeap(leap_range)) - return_timer = addtimer(CALLBACK(src, PROC_REF(return_child)), 15 SECONDS, TIMER_UNIQUE|TIMER_DELETE_ME) + return_timer = addtimer(CALLBACK(src, PROC_REF(return_child)), 15 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_DELETE_ME) return ..() /obj/structure/alien/egg/tgmc/proc/return_child(obj/item/clothing/mask/facehugger/hugger) diff --git a/tff_modular/modules/tgmc_xenos/icons/xeno_hud.dmi b/tff_modular/modules/tgmc_xenos/icons/xeno_hud.dmi index 26a6bd3e5948d2bc2672314064497f2a7855d780..cffa55a943c9b66c1dbcad031bd7082513746b41 100644 GIT binary patch literal 2454 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 JY;Xul{TJ`d`j-Fz From 24bc5b40a7edda4aec27e159bd541db1eb7b0b00 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:57:19 +0700 Subject: [PATCH 093/120] Revert "test" This reverts commit 5a168992931e24b72c116311d12d8c2958c6aefd. --- code/modules/mob/living/carbon/alien/special/alien_embryo.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 16e5647d8e1..7e47d91aec5 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -76,7 +76,7 @@ if(HAS_TRAIT(owner, TRAIT_IMMUNODEFICIENCY) && !HAS_TRAIT(owner, TRAIT_VIRUS_RESISTANCE)) slowdown *= 0.5 //terrible immune system = doubled parasite growth - addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time*slowdown, TIMER_UNIQUE) // FLUFFY EDIT ORIGINAL: addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time) + addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time*slowdown) /obj/item/organ/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) @@ -116,7 +116,7 @@ if(isnull(ghost)) bursting = FALSE stage = 5 // If no ghosts sign up for the Larva, let's regress our growth by one minute, we will try again! - addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time, TIMER_UNIQUE) // FLUFFY EDIT ORIGINAL: addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time) + addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time) return var/mutable_appearance/overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "burst_lie") From 0625a44342478dd89de250e92e277593dc6c568a Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:08:42 +0700 Subject: [PATCH 094/120] test version of modular huds --- code/__HELPERS/global_lists.dm | 1 + code/datums/hud.dm | 2 -- code/modules/admin/verbs/admingame.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 1 - tff_modular/modules/modular_hud/code.dm | 38 ++++++++++++++++++++++ tgstation.dme | 1 + 6 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 tff_modular/modules/modular_hud/code.dm diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1336b6aa9dc..d8c88161474 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -16,6 +16,7 @@ init_crafting_recipes() init_crafting_recipes_atoms() init_blooper_prefs() // FLUFFY FRONTIER ADDITION - Blooper + init_additional_huds() // FLUFFY FRONTIED ADDITION - modular huds /// Inits crafting recipe lists /proc/init_crafting_recipes(list/crafting_recipes) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 3a9828a0d22..20a5b39404e 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -19,7 +19,6 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_FAN = new /datum/atom_hud/data/human/fan_hud(), DATA_HUD_MALF_APC = new /datum/atom_hud/data/malf_apc(), DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), // NOVA EDIT ADDITION - DATA_HUD_XENO = new /datum/atom_hud/data/xeno(), // FLUFFY FRONTIER ADDITION )) /// Assoc list of traits to the huds they give. @@ -34,7 +33,6 @@ GLOBAL_LIST_INIT(trait_to_hud, list( TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED, TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC, TRAIT_PERMIT_HUD = DATA_HUD_PERMIT, // NOVA EDIT ADDITION - TRAIT_XENO_HUD = DATA_HUD_XENO, // FLUFFY FRONTIER ADDITION )) /// Assoc list of traits that block other traits' huds to list of hud (traits) that they block diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index a677dfa6ab0..57d829d0f11 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -367,7 +367,7 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD. SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Combo HUD", "[user.combo_hud_enabled ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /// List of hud traits in the admin combo hud -#define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD, TRAIT_XENO_HUD) // FLUFFY FRONTIER EDIT - ORIGINAL: #define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) +#define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) /client/proc/enable_combo_hud() if (combo_hud_enabled) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 39137eb22e1..da18c9007e8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -72,7 +72,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, - TRAIT_XENO_HUD, // FLUFFY FRONTIER ADDITION TRAIT_BOT_PATH_HUD ) diff --git a/tff_modular/modules/modular_hud/code.dm b/tff_modular/modules/modular_hud/code.dm new file mode 100644 index 00000000000..cd617105976 --- /dev/null +++ b/tff_modular/modules/modular_hud/code.dm @@ -0,0 +1,38 @@ +GLOBAL_LIST_INIT(additional_observer_huds, list()) +GLOBAL_LIST_INIT(additional_combo_huds, list()) + +/// Эта штука добавляет указанный худ в глобальные списки из `code\datums\hud.dm`. Так же дает возмоно добавить указанный трейт худа в список худов гостов/админов +/proc/register_new_hud(atom_hud_path, data_hud, trait, for_observer = FALSE, for_combohud = FALSE) + GLOB.huds.Insert(data_hud, new atom_hud_path()) + GLOB.trait_to_hud += list("[trait]" = data_hud) + + if(for_observer) + GLOB.additional_observer_huds += trait + if(for_combohud) + GLOB.additional_combo_huds += trait + +/proc/init_additional_huds() + register_new_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, TRUE, TRUE) + + +/client/enable_combo_hud() + if (combo_hud_enabled) + return + mob.add_traits(GLOB.additional_combo_huds, ADMIN_TRAIT) + return ..() + +/client/disable_combo_hud() + if (!combo_hud_enabled) + return + mob.remove_traits(GLOB.additional_combo_huds, ADMIN_TRAIT) + return ..() + + +/mob/dead/observer/show_data_huds() + . = ..() + add_traits(GLOB.additional_observer_huds, REF(src)) + +/mob/dead/observer/remove_data_huds() + . = ..() + remove_traits(GLOB.additional_observer_huds, REF(src)) + diff --git a/tgstation.dme b/tgstation.dme index 4575560c00e..b92425f9741 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9565,6 +9565,7 @@ #include "tff_modular\modules\martial\sleeping_carp.dm" #include "tff_modular\modules\modular_automapper\automapper.dm" #include "tff_modular\modules\modular_automapper\replacer.dm" +#include "tff_modular\modules\modular_hud\code.dm" #include "tff_modular\modules\nabbers\code\_nabbers.dm" #include "tff_modular\modules\nabbers\code\nabber_bodyparts.dm" #include "tff_modular\modules\nabbers\code\nabber_bolaimmunity.dm" From ee0f2b34516335e824f14f96a3f84c56b515150c Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:55:03 +0700 Subject: [PATCH 095/120] hud fixes --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index e49431ea444..9aefebc7ca3 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -69,7 +69,6 @@ var/datum/atom_hud/data/xeno/xeno_hud = GLOB.huds[DATA_HUD_XENO] xeno_hud.add_atom_to_hud(src) - xeno_hud_set_plasma() if(next_evolution) GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) @@ -110,6 +109,10 @@ . = ..() REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) +/mob/living/carbon/alien/adult/tgmc/death(gibbed) + . = ..() + xeno_hud_set_plasma() + /mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) return get_armor_rating(type) @@ -147,6 +150,10 @@ particle_holder.pixel_x = fire_offset_x particle_holder.pixel_y = fire_offset_y +/mob/living/carbon/alien/adult/tgmc/prepare_data_huds() + . = ..() + xeno_hud_set_plasma() + /mob/living/carbon/proc/get_max_plasma() var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) if(isnull(vessel)) From abec37083b50616b9f89495dec4a5512e9ea84e1 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Thu, 20 Nov 2025 23:15:11 +0700 Subject: [PATCH 096/120] t --- _maps/shuttles/fluffy/whiteship_xeno.dmm | 1469 +++++++++++++++++ .../modules/tgmc_xenos/code/base_alien.dm | 2 +- .../modules/tgmc_xenos/code/misc/larva.dm | 2 + .../tgmc_xenos/code/misc/rouny_mode.dm | 5 + .../tgmc_xenos/code/misc/xeno_shuttle.dm | 4 + tgstation.dme | 1 + 6 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 _maps/shuttles/fluffy/whiteship_xeno.dmm create mode 100644 tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm diff --git a/_maps/shuttles/fluffy/whiteship_xeno.dmm b/_maps/shuttles/fluffy/whiteship_xeno.dmm new file mode 100644 index 00000000000..71de82a9a5a --- /dev/null +++ b/_maps/shuttles/fluffy/whiteship_xeno.dmm @@ -0,0 +1,1469 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"bF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"cD" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"cM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"dP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/no_charge, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"eD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/valve, +/obj/effect/decal/cleanable/blood/gibs, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"eE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/mapping_helpers/apc/no_charge, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/shuttle/abandoned/bar) +"eT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/obj/item/storage/bag/trash{ + pixel_x = 6 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"fL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/closet/crate/bin, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/item/organ/stomach, +/obj/item/trash/syndi_cakes, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/shuttle/abandoned/bar) +"gk" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/bar) +"gA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/robot_debris/down, +/obj/item/bot_assembly/cleanbot, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"gL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/spawner/random/armory/e_gun, +/obj/structure/alien/weeds, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/crew) +"hN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/greenglow, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/plating, +/area/shuttle/abandoned/bar) +"id" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/crew) +"ie" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/belt/utility{ + pixel_y = 9 + }, +/obj/item/screwdriver, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/engine) +"ig" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/structure/cable, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/shuttle/abandoned/bar) +"ik" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/external/ruin{ + id_tag = "ntms_exterior"; + name = "NTMS-037 Mining Airlock" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "exterior_whiteship" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bar) +"iI" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "whiteship_bridge"; + name = "Cockpit Emergency Blast Door" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/bridge) +"jr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) +"jM" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 6 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/cafeteria{ + dir = 1 + }, +/area/shuttle/abandoned/bar) +"kq" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"ku" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "External Freight Airlock" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/docking_port/mobile{ + callTime = 250; + can_move_docking_ports = 1; + dir = 2; + shuttle_id = "whiteship"; + launch_status = 0; + movement_force = list("KNOCKDOWN"=0,"THROW"=0); + name = "Mining Shuttle"; + port_direction = 8; + preferred_direction = 4 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"kG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"kY" = ( +/obj/item/chair, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/bamboo, +/area/shuttle/abandoned/bar) +"lg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria{ + dir = 1 + }, +/area/shuttle/abandoned/bar) +"mt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/button/door/directional/east{ + id = "ntms_exterior"; + name = "NTMS-037 Mining Airlock Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/bar) +"mu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/vomit/old, +/obj/machinery/light/small/broken/directional/west, +/obj/structure/cable, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/mob_spawn/corpse/human/damaged, +/obj/structure/alien/weeds, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/crew) +"mH" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/decal/cleanable/glass, +/obj/structure/cable, +/obj/effect/mob_spawn/corpse/human/damaged, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) +"mX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) +"nt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"nN" = ( +/obj/machinery/door/airlock/command{ + name = "NTMS-037 Ship Control" + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/abandoned/bridge) +"oQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/shuttle_engine/propulsion/right{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/bar) +"pI" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/machinery/door/airlock/shuttle{ + name = "NTMS-037 Cargo Bay" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/engine) +"pV" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/engine) +"qu" = ( +/obj/effect/turf_decal/trimline/white/warning, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/item/paper/crumpled/bloody{ + default_raw_text = "We struck gold, literally. We found some good rocks out near Centurai-II rich with the stuff. Kae said he and Milos found something out while prospecting, some sort of glowing cube. It's jammed in there good, so we're anchoring until we sort this out..."; + pixel_x = 4; + pixel_y = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/bridge) +"qL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/robot_debris, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"ry" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle{ + name = "Exterior Window Blast Door" + }, +/obj/effect/mapping_helpers/damaged_window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "whiteship_windows" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"rC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/shuttle_engine/propulsion/right{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) +"rX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"sz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/bamboo, +/area/shuttle/abandoned/bar) +"sB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/alien/weeds/node, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"tf" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"tk" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/abandoned/engine) +"tz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/secure/weapon, +/obj/item/gun/energy/laser/retro, +/obj/structure/alien/weeds, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/cargo) +"uf" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 5 + }, +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light/small/blacklight/directional/east, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/bridge) +"uA" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/abandoned/crew) +"vk" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/abandoned/cargo) +"vM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/structure/alien/weeds, +/obj/structure/closet/crate/trashcart/filled, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"xh" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/cargo) +"yj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/trail, +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/alien/weeds/node, +/mob/living/carbon/alien/adult/tgmc/drone, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/crew) +"yG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"zl" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, +/obj/item/shard{ + icon_state = "medium" + }, +/obj/item/stack/cable_coil/cut, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/bridge) +"zu" = ( +/obj/machinery/cell_charger, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/stock_parts/power_store/cell/emproof/empty{ + pixel_y = 7; + pixel_x = 5 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/shuttle/abandoned/cargo) +"zJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"Am" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/machinery/space_heater, +/obj/structure/alien/weeds, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/cargo) +"Bk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/structure/alien/weeds/node, +/mob/living/carbon/alien/larva/tgmc, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"BL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"BS" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/abandoned/bar) +"CG" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/abandoned/engine) +"CQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/greenglow, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"Fr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"FW" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "whiteship_windows"; + name = "Exterior Window Blast Door" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/crew) +"Gj" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "whiteship_windows"; + name = "Exterior Window Blast Door" + }, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"Gu" = ( +/turf/template_noop, +/area/template_noop) +"Gz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot_white, +/obj/machinery/door/poddoor{ + id = "whiteship_port"; + name = "NTMS-037 Bay Blast Door" + }, +/obj/machinery/conveyor{ + id = "NTMSLoad2"; + name = "on ramp" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"GW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/shrink_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/crate/internals, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/tank/internals/emergency_oxygen/engi, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/engine) +"HD" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/clothing/wardrobe_closet_colored, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/structure/alien/weeds, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/crew) +"In" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/engineer, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/abandoned/engine) +"IX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 8; + name = "Dock to Air" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/terminal, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"Jd" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/gum/happiness, +/obj/item/stack/cable_coil/five, +/obj/effect/turf_decal/tile/brown, +/obj/structure/alien/weeds, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/shuttle/abandoned/cargo) +"JG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/greenglow, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"JL" = ( +/obj/structure/closet/secure_closet/freezer{ + locked = 0; + name = "fridge" + }, +/obj/item/food/sausage, +/obj/item/reagent_containers/cup/glass/bottle/beer, +/obj/item/food/sandwich, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 10 + }, +/obj/machinery/light/warm/no_nightlight/directional/north, +/obj/item/food/grown/potato, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/cafeteria{ + dir = 1 + }, +/area/shuttle/abandoned/bar) +"JX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/obj/effect/mapping_helpers/broken_machine, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"Kx" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "whiteship_windows"; + name = "Exterior Window Blast Door" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/bar) +"KS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/structure/sign/warning/vacuum/external/directional/north, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"Lj" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/external/ruin{ + name = "NTMS-037 Mining Airlock" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "exterior_whiteship" + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bar) +"LE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/crate/cardboard, +/obj/machinery/light/cold/no_nightlight/directional/north, +/obj/item/storage/box/lights/mixed{ + pixel_y = 5 + }, +/obj/effect/spawner/random/maintenance/three, +/obj/item/wirebrush, +/obj/item/stack/sheet/mineral/plasma/five, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"LK" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "whiteship_windows"; + name = "Exterior Window Blast Door" + }, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/plating, +/area/shuttle/abandoned/bar) +"Ml" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/suit_storage_unit/standard_unit{ + desc = "An industrial suit storage device carrying retro space suits. Neat!"; + helmet_type = /obj/item/clothing/head/helmet/space; + suit_type = /obj/item/clothing/suit/space + }, +/obj/machinery/light/warm/no_nightlight/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/engine) +"Mt" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/cable, +/mob/living/carbon/alien/adult/tgmc/drone, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/abandoned/engine) +"MI" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/engine) +"Nh" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/abandoned/engine) +"Nt" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"NV" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/bridge) +"Of" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/abandoned/bar) +"OS" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/cola{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/plate/small{ + pixel_x = -5 + }, +/obj/item/storage/box/donkpockets, +/turf/open/floor/bamboo, +/area/shuttle/abandoned/bar) +"OZ" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/bar) +"Pe" = ( +/obj/machinery/button/door/directional/north{ + id = "whiteship_port"; + name = "Cargo Bay Control" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/insectguts, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"Pz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/abandoned/bar) +"PR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/cable, +/obj/item/weldingtool/largetank, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/abandoned/engine) +"Qm" = ( +/obj/effect/turf_decal/stripes{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/structure/cable, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/abandoned/engine) +"QR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"Rr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot_white, +/obj/machinery/door/poddoor{ + id = "whiteship_port"; + name = "NTMS-037 Bay Blast Door" + }, +/obj/machinery/conveyor{ + dir = 1; + id = "NTMSLoad"; + name = "off ramp" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"RF" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/shuttle{ + name = "NTMS-037 Lockers" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/crew) +"RI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/oil, +/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"RN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/alien/weeds, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/crew) +"Ss" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/delivery/red, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"SL" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/abandoned/engine) +"SM" = ( +/obj/machinery/door/airlock/command{ + name = "NTMS-037 Ship Control" + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/mineral/titanium/tiled/white, +/area/shuttle/abandoned/bridge) +"Ta" = ( +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 1 + }, +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ + dir = 4; + view_range = 14; + y_offset = 5; + x_offset = 0 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door{ + id = "whiteship_windows"; + name = "NTMS-037 Windows Blast Door Control"; + pixel_x = -24; + pixel_y = 6 + }, +/obj/machinery/button/door{ + id = "whiteship_bridge"; + name = "NTMS-037 Bridge Blast Door Control"; + pixel_x = -24; + pixel_y = -6 + }, +/turf/open/floor/pod/light, +/area/shuttle/abandoned/bridge) +"Tf" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/brown/filled/shrink_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/effect/decal/cleanable/dirt, +/obj/item/megaphone{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/stockparts/basic{ + pixel_y = 6 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/pod/dark, +/area/shuttle/abandoned/engine) +"Tg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/splatter/xeno, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"TP" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/crew) +"VP" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/shuttle/abandoned/engine) +"Wj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/xeno, +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/shuttle/abandoned/cargo) +"Xe" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/shuttle/abandoned/bar) +"Xk" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/abandoned/bar) +"XL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/shuttle{ + name = "NTMS-037 Engine Room" + }, +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/welded, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/engine) +"XP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"Yh" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/bedsheet/captain{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/shuttle/abandoned/crew) +"YM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"YN" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "whiteship_windows"; + name = "Exterior Window Blast Door" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) +"YU" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/alien/weeds, +/turf/open/floor/wood/tile, +/area/shuttle/abandoned/crew) +"YV" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/ash, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/abandoned/bridge) +"ZW" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/alien/weeds, +/turf/open/floor/iron/freezer, +/area/shuttle/abandoned/crew) + +(1,1,1) = {" +Nh +jr +mX +rC +Nh +Gu +Gu +Gu +Gu +Gu +Gu +Gu +Gu +"} +(2,1,1) = {" +Nh +MI +MI +MI +CG +jr +mX +rC +Nh +Gu +Gu +Gu +Gu +"} +(3,1,1) = {" +CG +Ss +bl +eT +CG +MI +MI +MI +CG +Gu +Gu +Gu +Gu +"} +(4,1,1) = {" +SL +LE +cM +dP +SL +pV +tk +Ml +SL +Gu +Gu +Gu +Gu +"} +(5,1,1) = {" +SL +tf +YM +yG +XL +PR +In +Qm +Gj +Gu +Gu +Gu +Gu +"} +(6,1,1) = {" +SL +XP +IX +JX +SL +GW +ie +Mt +YN +Gu +Gu +Gu +Gu +"} +(7,1,1) = {" +SL +SL +pI +SL +SL +SL +Tf +VP +SL +Gu +Gu +Gu +Gu +"} +(8,1,1) = {" +xh +Pe +CQ +BL +kq +NV +NV +SM +NV +Pz +oQ +BS +Gu +"} +(9,1,1) = {" +Gz +nt +bF +eD +Nt +iI +Ta +mH +NV +OZ +OZ +Of +Gu +"} +(10,1,1) = {" +ku +Bk +vM +Wj +zu +iI +qu +YV +nN +lg +ig +gk +gk +"} +(11,1,1) = {" +Rr +JG +kG +RI +Jd +iI +uf +zl +NV +fL +zJ +sz +Kx +"} +(12,1,1) = {" +xh +KS +qL +gA +id +NV +NV +NV +NV +JL +Fr +OS +LK +"} +(13,1,1) = {" +vk +xh +tz +sB +id +YU +id +Yh +id +jM +QR +kY +Kx +"} +(14,1,1) = {" +Gu +xh +Am +Tg +RN +yj +mu +gL +RF +eE +rX +Xe +gk +"} +(15,1,1) = {" +Gu +vk +ry +cD +id +TP +ZW +HD +id +gk +Lj +gk +Xk +"} +(16,1,1) = {" +Gu +Gu +Gu +Gu +uA +FW +FW +FW +gk +hN +mt +gk +Gu +"} +(17,1,1) = {" +Gu +Gu +Gu +Gu +Gu +Gu +Gu +Gu +Xk +ik +gk +Xk +Gu +"} diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 9aefebc7ca3..7d42858a5c1 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -50,7 +50,7 @@ var/fire_offset_y = 0 // АП при атаке по мехам - var/mecha_armor_penetration = 15 + var/mecha_armor_penetration = 10 // Способность выдержать тяжелые удары мехов и не потерять сознание var/resist_heavy_hits = FALSE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index 4c214a4b980..38a97ecd2f7 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -15,6 +15,7 @@ if(istgmcalien(user)) var/mob/living/carbon/alien/adult/tgmc/xeno = user if(!xeno.can_hold_facehugger) + to_chat(user, span_alien("Your claws lack the dexterity to hold [src]")) return TRUE return ..() @@ -23,6 +24,7 @@ if(. && istgmcalien(user)) var/mob/living/carbon/alien/adult/tgmc/xeno = user if(!xeno.can_hold_facehugger) + to_chat(user, span_alien("Your claws lack the dexterity to hold [src]")) return FALSE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm b/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm index d555f38dc4c..1609f890ae7 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm @@ -9,4 +9,9 @@ icon = initial(icon) return ..() +/proc/toggle_rouny_mode() + GLOB.xeno_rounymode = !GLOB.xeno_rounymode + for(var/mob/living/carbon/alien/adult/tgmc/xeno in GLOB.alive_mob_list) + xeno.update_icon() + #undef ROUNY_ICON_FILE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm new file mode 100644 index 00000000000..f338e1f09e7 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm @@ -0,0 +1,4 @@ +/datum/map_template/shuttle/whiteship/xeno + name = "Abandoned Mining Shuttle" + prefix = "_maps/shuttles/fluffy/" + suffix = "xeno" diff --git a/tgstation.dme b/tgstation.dme index b92425f9741..d558be114ae 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9637,6 +9637,7 @@ #include "tff_modular\modules\tgmc_xenos\code\misc\rouny_mode.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\xeno_hud.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\xeno_shuttle.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_charge.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_powers.dm" From e7059eccffc610534f63709fb8f3c7e2aa996f23 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Fri, 21 Nov 2025 02:34:04 +0700 Subject: [PATCH 097/120] Update whiteship_xeno.dmm --- _maps/shuttles/fluffy/whiteship_xeno.dmm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_maps/shuttles/fluffy/whiteship_xeno.dmm b/_maps/shuttles/fluffy/whiteship_xeno.dmm index 71de82a9a5a..11c7be13d2a 100644 --- a/_maps/shuttles/fluffy/whiteship_xeno.dmm +++ b/_maps/shuttles/fluffy/whiteship_xeno.dmm @@ -20,6 +20,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/mob_spawn/corpse/human/damaged, +/obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "cD" = ( @@ -318,7 +321,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/decal/cleanable/glass, /obj/structure/cable, -/obj/effect/mob_spawn/corpse/human/damaged, /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) From 03b21d3b40c9e6e4fa8f64d49a29bc51af94e50e Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Fri, 21 Nov 2025 02:37:55 +0700 Subject: [PATCH 098/120] Update xeno_shuttle.dm --- tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm index f338e1f09e7..07e3938129c 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm @@ -2,3 +2,4 @@ name = "Abandoned Mining Shuttle" prefix = "_maps/shuttles/fluffy/" suffix = "xeno" + shuttle_id = "xenohijack" From ab30135b4fe87bba5e3c6c518ed5ae69a9353386 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Fri, 21 Nov 2025 21:48:07 +0700 Subject: [PATCH 099/120] t --- _maps/shuttles/fluffy/whiteship_xeno.dmm | 27 +++++++++---------- .../tgmc_xenos/code/misc/xeno_shuttle.dm | 1 - 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/_maps/shuttles/fluffy/whiteship_xeno.dmm b/_maps/shuttles/fluffy/whiteship_xeno.dmm index 11c7be13d2a..8c05ddb0f50 100644 --- a/_maps/shuttles/fluffy/whiteship_xeno.dmm +++ b/_maps/shuttles/fluffy/whiteship_xeno.dmm @@ -22,13 +22,13 @@ /obj/structure/alien/weeds, /obj/structure/bed/nest, /obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/mapping_helpers/mob_buckler, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "cD" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass/titanium, /obj/structure/alien/weeds, +/obj/structure/alien/resin/membrane, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "cM" = ( @@ -53,8 +53,8 @@ "eD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/valve, -/obj/effect/decal/cleanable/blood/gibs, /obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "eE" = ( @@ -115,7 +115,6 @@ /obj/machinery/light/cold/no_nightlight/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/gibs/robot_debris/down, -/obj/item/bot_assembly/cleanbot, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, @@ -245,7 +244,7 @@ callTime = 250; can_move_docking_ports = 1; dir = 2; - shuttle_id = "whiteship"; + shuttle_id = "xenohijack"; launch_status = 0; movement_force = list("KNOCKDOWN"=0,"THROW"=0); name = "Mining Shuttle"; @@ -257,8 +256,8 @@ "kG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, -/obj/structure/ore_box, /obj/structure/alien/weeds, +/obj/structure/ore_box, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "kY" = ( @@ -340,6 +339,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, /obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "nN" = ( @@ -442,7 +442,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/mapping_helpers/apc/no_charge, @@ -471,9 +470,9 @@ "tz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/secure/weapon, -/obj/item/gun/energy/laser/retro, /obj/structure/alien/weeds, +/obj/structure/closet/crate/trashcart/filled, +/obj/item/bikehorn/rubberducky, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/cargo) "uf" = ( @@ -505,8 +504,7 @@ /obj/effect/turf_decal/box/corners, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/alien/weeds, -/obj/structure/closet/crate/trashcart/filled, -/obj/item/bikehorn/rubberducky, +/obj/structure/bed/nest, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "xh" = ( @@ -581,9 +579,9 @@ "Am" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/large, -/obj/machinery/space_heater, /obj/structure/alien/weeds, +/obj/structure/closet/crate/secure/weapon, +/obj/item/gun/energy/laser/retro, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/cargo) "Bk" = ( @@ -1111,6 +1109,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/xeno, /obj/structure/alien/weeds, +/obj/item/clothing/mask/facehugger/impregnated, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "Xe" = ( @@ -1183,9 +1182,6 @@ /obj/structure/bed/pod{ dir = 1 }, -/obj/effect/spawner/random/bedsheet{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -1193,6 +1189,7 @@ }, /obj/effect/decal/cleanable/glass/titanium, /obj/structure/alien/weeds, +/obj/item/stack/sheet/cloth, /turf/open/floor/wood/tile, /area/shuttle/abandoned/crew) "YV" = ( diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm index 07e3938129c..f338e1f09e7 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_shuttle.dm @@ -2,4 +2,3 @@ name = "Abandoned Mining Shuttle" prefix = "_maps/shuttles/fluffy/" suffix = "xeno" - shuttle_id = "xenohijack" From 4e1b4356aa1418b5f8cdc2c3fb96d084d7df1504 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 30 Nov 2025 19:22:01 +0700 Subject: [PATCH 100/120] q --- tff_modular/modules/{ => tgmc_xenos/code}/modular_hud/code.dm | 0 tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename tff_modular/modules/{ => tgmc_xenos/code}/modular_hud/code.dm (100%) diff --git a/tff_modular/modules/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm similarity index 100% rename from tff_modular/modules/modular_hud/code.dm rename to tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm diff --git a/tgstation.dme b/tgstation.dme index d558be114ae..ee6e41b9213 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9565,7 +9565,6 @@ #include "tff_modular\modules\martial\sleeping_carp.dm" #include "tff_modular\modules\modular_automapper\automapper.dm" #include "tff_modular\modules\modular_automapper\replacer.dm" -#include "tff_modular\modules\modular_hud\code.dm" #include "tff_modular\modules\nabbers\code\_nabbers.dm" #include "tff_modular\modules\nabbers\code\nabber_bodyparts.dm" #include "tff_modular\modules\nabbers\code\nabber_bolaimmunity.dm" @@ -9638,6 +9637,7 @@ #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\xeno_hud.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\xeno_shuttle.dm" +#include "tff_modular\modules\tgmc_xenos\code\modular_hud\code.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_charge.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_powers.dm" From cff74eb8475966b20c77df85b58e2c9b942cf784 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:00:10 +0700 Subject: [PATCH 101/120] last thing --- tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm | 2 ++ tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm | 4 ++-- tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm | 4 ++-- 9 files changed, 18 insertions(+), 16 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 31f69443ecb..df4137f78f1 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -5,8 +5,8 @@ desc = "A huge alien with an enormous armored crest." icon_state = "aliencrusher" caste = "crusher" - maxHealth = 275 - health = 275 + maxHealth = 300 + health = 300 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 83658ab7a1c..4bc8edd593b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -5,8 +5,8 @@ desc = "A heavy looking alien with a wrecking ball-like tail that'd probably hurt to get hit by." icon_state = "aliendefender" caste = "defender" - maxHealth = 150 - health = 150 + maxHealth = 200 + health = 200 mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index c8af5428aa6..df5ae317a3f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -5,8 +5,8 @@ desc = "As plain looking as you could call an alien with armored black chitin and large claws." icon_state = "aliendrone" caste = "drone" - maxHealth = 125 - health = 125 + maxHealth = 150 + health = 150 melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/praetorian diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index a16ed6bc02b..d080271696a 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -5,8 +5,8 @@ desc = "An alien that looks like the awkward half-way point between a queen and a drone, in fact that's likely what it is." icon_state = "alienpraetorian" caste = "praetorian" - maxHealth = 225 - health = 225 + maxHealth = 250 + health = 250 mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 1fe62ff333a..14e5ebf1fc6 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -25,6 +25,8 @@ mecha_armor_penetration = 45 resist_heavy_hits = TRUE + can_hold_facehugger = TRUE + /mob/living/carbon/alien/adult/tgmc/queen/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 4e973302cd0..54a2a53c5c2 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -5,8 +5,8 @@ desc = "An alien with angry red chitin, with equally intimidating looking blade-like claws in place of normal hands. That sharp tail looks like it'd probably hurt." icon_state = "alienravager" caste = "ravager" - maxHealth = 175 - health = 175 + maxHealth = 200 + health = 200 mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index cf04c27ca1c..e2fca1d2832 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -5,8 +5,8 @@ desc = "A short alien with sleek red chitin, clearly abiding by the 'red ones go faster' theorem and almost always running on all fours." icon_state = "alienrunner" caste = "runner" - maxHealth = 100 - health = 100 + maxHealth = 125 + health = 125 melee_damage_lower = 15 melee_damage_upper = 20 alien_speed = -0.5 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index f927d28e747..85d3f08e52f 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -5,8 +5,8 @@ desc = "An alien that'd be unremarkable if not for the bright coloring and visible acid glands that cover it." icon_state = "aliensentinel" caste = "sentinel" - maxHealth = 125 - health = 125 + maxHealth = 150 + health = 150 melee_damage_lower = 10 melee_damage_upper = 15 alien_speed = 0.5 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 91659d705a2..0b7f36d6f6c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -5,8 +5,8 @@ desc = "A fairly heavy looking alien with prominent acid glands, it's mouth dripping with... some kind of toxin or acid." icon_state = "alienspitter" caste = "spitter" - maxHealth = 175 - health = 175 + maxHealth = 200 + health = 200 mob_size = MOB_SIZE_LARGE melee_damage_lower = 15 melee_damage_upper = 20 From f8d81812475dbe287a59348ac7ddd29bced9d405 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:00:59 +0700 Subject: [PATCH 102/120] last (true) --- .../modules/tgmc_xenos/code/base_alien.dm | 2 +- .../modules/tgmc_xenos/code/misc/larva.dm | 4 ++-- .../modules/tgmc_xenos/code/xeno_types/queen.dm | 2 +- .../tgmc_xenos/code/xeno_types/spitter.dm | 2 +- .../modules/tgmc_xenos/sound/alien_help1.ogg | Bin 0 -> 21563 bytes 5 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/sound/alien_help1.ogg diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 7d42858a5c1..34929c1de2a 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -58,7 +58,7 @@ var/fortify = FALSE // Может ли переносить хагов - var/can_hold_facehugger = FALSE + var/can_hold_facehuggers = FALSE /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index 38a97ecd2f7..e5f10e4197d 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -14,7 +14,7 @@ /obj/item/clothing/mask/facehugger/tgmc/attempt_pickup(mob/living/user, skip_grav) if(istgmcalien(user)) var/mob/living/carbon/alien/adult/tgmc/xeno = user - if(!xeno.can_hold_facehugger) + if(!xeno.can_hold_facehuggers) to_chat(user, span_alien("Your claws lack the dexterity to hold [src]")) return TRUE return ..() @@ -23,7 +23,7 @@ . = ..() if(. && istgmcalien(user)) var/mob/living/carbon/alien/adult/tgmc/xeno = user - if(!xeno.can_hold_facehugger) + if(!xeno.can_hold_facehuggers) to_chat(user, span_alien("Your claws lack the dexterity to hold [src]")) return FALSE diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 14e5ebf1fc6..b2bef7403d8 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -25,7 +25,7 @@ mecha_armor_penetration = 45 resist_heavy_hits = TRUE - can_hold_facehugger = TRUE + can_hold_facehuggers = TRUE /mob/living/carbon/alien/adult/tgmc/queen/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 0b7f36d6f6c..66c562e6817 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -22,7 +22,7 @@ resist_heavy_hits = TRUE - can_hold_facehugger = TRUE + can_hold_facehuggers = TRUE /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/sound/alien_help1.ogg b/tff_modular/modules/tgmc_xenos/sound/alien_help1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9948030670f06f388cdfe3be558687da1adc15ba GIT binary patch literal 21563 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 Date: Sun, 28 Dec 2025 21:24:06 +0700 Subject: [PATCH 103/120] final movement --- code/__DEFINES/~ff_defines/signals.dm | 2 ++ .../~ff_defines/{_globalvars => }/traits/declarations.dm | 8 +------- code/__HELPERS/~ff_helpers/is_helpers.dm | 6 +----- tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm | 1 + tgstation.dme | 3 ++- 5 files changed, 7 insertions(+), 13 deletions(-) create mode 100644 code/__DEFINES/~ff_defines/signals.dm rename code/__DEFINES/~ff_defines/{_globalvars => }/traits/declarations.dm (77%) diff --git a/code/__DEFINES/~ff_defines/signals.dm b/code/__DEFINES/~ff_defines/signals.dm new file mode 100644 index 00000000000..490358c1f00 --- /dev/null +++ b/code/__DEFINES/~ff_defines/signals.dm @@ -0,0 +1,2 @@ +// on call adjustPlasma() proc +#define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/traits/declarations.dm similarity index 77% rename from code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm rename to code/__DEFINES/~ff_defines/traits/declarations.dm index 2c52ce8823c..7da836a6b1b 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/traits/declarations.dm @@ -1,6 +1,4 @@ - // xeno traits -#define TRAIT_XENO_HUD "xeno_hud" /// Trait source for xeno innate abilities #define TRAIT_XENO_INNATE "xeno_innate" /// Trait source for something added BY a xeno ability @@ -9,8 +7,4 @@ #define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" /// Trait source for traits added by fortify ability #define TRAIT_XENO_FORTIFY "xeno_fortify" - -// on call adjustPlasma() proc -#define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" - -GLOBAL_VAR_INIT(xeno_rounymode, FALSE) +#define TRAIT_XENO_HUD "xeno_hud" diff --git a/code/__HELPERS/~ff_helpers/is_helpers.dm b/code/__HELPERS/~ff_helpers/is_helpers.dm index b958fd8b0c2..885f04dfc28 100644 --- a/code/__HELPERS/~ff_helpers/is_helpers.dm +++ b/code/__HELPERS/~ff_helpers/is_helpers.dm @@ -1,16 +1,12 @@ +// Nubbers #define isnabber(A) (is_species(A, /datum/species/nabber)) // TGMC Xenomorph #define istgmcalien(A) (istype(A, /mob/living/carbon/alien/adult/tgmc)) - #define istgmcalienqueen(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/queen)) - #define istgmcalienpraetorian(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/praetorian)) - #define istgmcalienravager(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/ravager)) - #define istgmcaliencrusher(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/crusher)) - #define istgmcalienspitter(A) (istype(A, /mob/living/carbon/alien/adult/tgmc/spitter)) #define istgmcalientier2(A) (istgmcalienpraetorian(A) || istgmcalienravager(A) || istgmcaliencrusher(A) || istgmcalienspitter(A)) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm b/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm index 1609f890ae7..189692db549 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/rouny_mode.dm @@ -1,5 +1,6 @@ /// TGMC_XENOS (old nova sector xenos) +GLOBAL_VAR_INIT(xeno_rounymode, FALSE) #define ROUNY_ICON_FILE 'tff_modular/modules/tgmc_xenos/icons/rouny.dmi' /mob/living/carbon/alien/adult/tgmc/update_icon(updates) diff --git a/tgstation.dme b/tgstation.dme index ee6e41b9213..3d9fac5cbae 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -419,6 +419,7 @@ #include "code\__DEFINES\~ff_defines\flavor_misc.dm" #include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm" #include "code\__DEFINES\~ff_defines\say.dm" +#include "code\__DEFINES\~ff_defines\signals.dm" #include "code\__DEFINES\~ff_defines\span.dm" #include "code\__DEFINES\~ff_defines\techweb_nodes.dm" #include "code\__DEFINES\~ff_defines\text.dm" @@ -426,7 +427,7 @@ #include "code\__DEFINES\~ff_defines\_globalvars\logging.dm" #include "code\__DEFINES\~ff_defines\_globalvars\lists\blooper.dm" #include "code\__DEFINES\~ff_defines\_globalvars\lists\hidden_verbs.dm" -#include "code\__DEFINES\~ff_defines\_globalvars\traits\declarations.dm" +#include "code\__DEFINES\~ff_defines\traits\declarations.dm" #include "code\__DEFINES\~nova_defines\_organ_defines.dm" #include "code\__DEFINES\~nova_defines\access.dm" #include "code\__DEFINES\~nova_defines\actionspeed_modification.dm" From 91414e3636c620a863476e64c4c88843bee713f8 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:50:54 +0700 Subject: [PATCH 104/120] xenohud fix --- code/__DEFINES/atom_hud.dm | 2 +- tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm | 7 +++---- tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 5ca506297d9..68099f302fb 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -78,7 +78,7 @@ #define DATA_HUD_FAN 9 #define DATA_HUD_MALF_APC 10 #define DATA_HUD_PERMIT 11 //NOVA EDIT ADDITION -#define DATA_HUD_XENO 12 // FLUFFY FRONTIER ADDITION +#define DATA_HUD_XENO (DATA_HUD_PERMIT + 1) // FLUFFY FRONTIER ADDITION /// cooldown for being shown the images for any particular data hud #define ADD_HUD_TO_COOLDOWN 20 diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm index 9102cb9540a..4ec41e49fbf 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm @@ -29,9 +29,8 @@ set_hud_image_state(XENO_HUD, "xenohealth[amount]", 32, -32) /mob/living/carbon/alien/adult/tgmc/proc/xeno_hud_set_plasma() - var/amount - if(stat == DEAD || get_max_plasma() == 0) - amount = 0 - else + var/amount = 0 + if(stat != DEAD || get_max_plasma() > 0) amount = round(getPlasma() * 100 / get_max_plasma(), 10) + set_hud_image_state(XENOPLASMA_HUD, "plasma[amount]", 32, -32) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm index cd617105976..16d575e772d 100644 --- a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm +++ b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(additional_combo_huds, list()) /// Эта штука добавляет указанный худ в глобальные списки из `code\datums\hud.dm`. Так же дает возмоно добавить указанный трейт худа в список худов гостов/админов /proc/register_new_hud(atom_hud_path, data_hud, trait, for_observer = FALSE, for_combohud = FALSE) - GLOB.huds.Insert(data_hud, new atom_hud_path()) + GLOB.huds += new atom_hud_path() GLOB.trait_to_hud += list("[trait]" = data_hud) if(for_observer) @@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(additional_combo_huds, list()) GLOB.additional_combo_huds += trait /proc/init_additional_huds() - register_new_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, TRUE, TRUE) + register_new_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, TRUE, TRUE) // TRAIT_XENO_HUD - 12 /client/enable_combo_hud() From fd6c9893d1bf03f229b37ddca6324498556ed05a Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:54:05 +0700 Subject: [PATCH 105/120] Update tgmc_alien_event.dm --- tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm index 5932b85de88..7685301efee 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm @@ -3,8 +3,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/tgmc name = "TGMC Alien Infestation" config_tag = "XenomorphTGMC" - pref_flag = null - preview_antag_datum = null + ruleset_flags = parent_type::ruleset_flags | RULESET_VARIATION /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/tgmc/create_ruleset_body() return new /mob/living/carbon/alien/larva/tgmc From da74d4f19ace2145b6297f8bab1ff16339009695 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 28 Dec 2025 22:17:11 +0700 Subject: [PATCH 106/120] hud --- code/modules/mob/mob.dm | 2 ++ .../tgmc_xenos/code/modular_hud/code.dm | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 97c29958015..a8d45a0f8b7 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1747,6 +1747,8 @@ return // it may seem counterintuitive to check for blockers on trait removal, the blocker now has total reign over whether the hud should come back var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[lost_trait]] + if(lost_trait == TRAIT_XENO_HUD) + CRASH("trait: [lost_trait] -> trait_to_hud: [GLOB.trait_to_hud[lost_trait]] -> datahud: [GLOB.huds[GLOB.trait_to_hud[lost_trait]]]") datahud.hide_from(src) /mob/proc/hud_trait_blocker_gained(datum/source, new_trait) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm index 16d575e772d..0b0a862fb13 100644 --- a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm +++ b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm @@ -1,28 +1,38 @@ GLOBAL_LIST_INIT(additional_observer_huds, list()) GLOBAL_LIST_INIT(additional_combo_huds, list()) -/// Эта штука добавляет указанный худ в глобальные списки из `code\datums\hud.dm`. Так же дает возмоно добавить указанный трейт худа в список худов гостов/админов -/proc/register_new_hud(atom_hud_path, data_hud, trait, for_observer = FALSE, for_combohud = FALSE) +/** + * Эта штука добавляет указанный худ в глобальные списки из `code\datums\hud.dm`. Так же позволяет сделать дангный худ видимым для гостов/админов + * Arguments: + * - atom_hud_path: путь /datum/atom_hud/data/... требумого худа + * - data_hud_define: дефайн атом_худа + * - trait_define: дефайн трейта + * - for_observer: будет ли виден этот худ гостам + * - for_combohud: будет ли виден этот худ тем, кто включил комбохуд + */ +/proc/register_new_data_hud(atom_hud_path, data_hud_define, trait_define, for_observer = FALSE, for_combohud = FALSE) GLOB.huds += new atom_hud_path() - GLOB.trait_to_hud += list("[trait]" = data_hud) + GLOB.trait_to_hud += list("[trait_define]" = data_hud_define) if(for_observer) GLOB.additional_observer_huds += trait if(for_combohud) GLOB.additional_combo_huds += trait + stack_trace(length(GLOB.huds)) + /proc/init_additional_huds() - register_new_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, TRUE, TRUE) // TRAIT_XENO_HUD - 12 + register_new_data_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, for_observer = TRUE, for_combohud = TRUE) // TRAIT_XENO_HUD - 12 /client/enable_combo_hud() - if (combo_hud_enabled) + if(combo_hud_enabled) return mob.add_traits(GLOB.additional_combo_huds, ADMIN_TRAIT) return ..() /client/disable_combo_hud() - if (!combo_hud_enabled) + if(!combo_hud_enabled) return mob.remove_traits(GLOB.additional_combo_huds, ADMIN_TRAIT) return ..() From 28b0af2ab26329b98dfed791dadb7a5b6babbe82 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sun, 28 Dec 2025 22:48:00 +0700 Subject: [PATCH 107/120] Update code.dm --- tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm index 0b0a862fb13..ef00b9e2d4a 100644 --- a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm +++ b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm @@ -15,9 +15,9 @@ GLOBAL_LIST_INIT(additional_combo_huds, list()) GLOB.trait_to_hud += list("[trait_define]" = data_hud_define) if(for_observer) - GLOB.additional_observer_huds += trait + GLOB.additional_observer_huds += trait_define if(for_combohud) - GLOB.additional_combo_huds += trait + GLOB.additional_combo_huds += trait_define stack_trace(length(GLOB.huds)) From e9731f8728b07b601151c0a1fea2d94e1c6b41e9 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 30 Dec 2025 05:32:58 +0700 Subject: [PATCH 108/120] q --- code/modules/mob/mob.dm | 2 -- tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm | 2 -- 2 files changed, 4 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a8d45a0f8b7..97c29958015 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1747,8 +1747,6 @@ return // it may seem counterintuitive to check for blockers on trait removal, the blocker now has total reign over whether the hud should come back var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[lost_trait]] - if(lost_trait == TRAIT_XENO_HUD) - CRASH("trait: [lost_trait] -> trait_to_hud: [GLOB.trait_to_hud[lost_trait]] -> datahud: [GLOB.huds[GLOB.trait_to_hud[lost_trait]]]") datahud.hide_from(src) /mob/proc/hud_trait_blocker_gained(datum/source, new_trait) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm index ef00b9e2d4a..eb6d62bc6f8 100644 --- a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm +++ b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm @@ -19,8 +19,6 @@ GLOBAL_LIST_INIT(additional_combo_huds, list()) if(for_combohud) GLOB.additional_combo_huds += trait_define - stack_trace(length(GLOB.huds)) - /proc/init_additional_huds() register_new_data_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, for_observer = TRUE, for_combohud = TRUE) // TRAIT_XENO_HUD - 12 From 4150a526740f00c678b54334674e282fddfc8674 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Tue, 30 Dec 2025 06:22:17 +0700 Subject: [PATCH 109/120] Update mob.dm --- code/modules/mob/mob.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 97c29958015..cde5fd8e541 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1747,6 +1747,7 @@ return // it may seem counterintuitive to check for blockers on trait removal, the blocker now has total reign over whether the hud should come back var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[lost_trait]] + stack_trace("[length(GLOB.huds)] [lost_trait]") datahud.hide_from(src) /mob/proc/hud_trait_blocker_gained(datum/source, new_trait) From 9f2eca144a23df16b0b6cc28a2b355406ec3f5d9 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 31 Dec 2025 04:10:09 +0700 Subject: [PATCH 110/120] Update code.dm --- tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm index eb6d62bc6f8..919f6749622 100644 --- a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm +++ b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(additional_combo_huds, list()) * - for_combohud: будет ли виден этот худ тем, кто включил комбохуд */ /proc/register_new_data_hud(atom_hud_path, data_hud_define, trait_define, for_observer = FALSE, for_combohud = FALSE) - GLOB.huds += new atom_hud_path() + GLOB.huds.Add(new atom_hud_path()) GLOB.trait_to_hud += list("[trait_define]" = data_hud_define) if(for_observer) From 864c0684d7372437eea29924df50a74b8611c852 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 31 Dec 2025 04:32:31 +0700 Subject: [PATCH 111/120] remove "modular" huds --- code/__HELPERS/global_lists.dm | 1 - code/datums/hud.dm | 2 ++ code/modules/mob/mob.dm | 1 - .../tgmc_xenos/code/modular_hud/code.dm | 31 ++++--------------- 4 files changed, 8 insertions(+), 27 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d8c88161474..1336b6aa9dc 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -16,7 +16,6 @@ init_crafting_recipes() init_crafting_recipes_atoms() init_blooper_prefs() // FLUFFY FRONTIER ADDITION - Blooper - init_additional_huds() // FLUFFY FRONTIED ADDITION - modular huds /// Inits crafting recipe lists /proc/init_crafting_recipes(list/crafting_recipes) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 9fb01c207a1..8d21fb086e9 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -19,6 +19,7 @@ GLOBAL_ALIST_INIT(huds, alist( DATA_HUD_FAN = new /datum/atom_hud/data/human/fan_hud(), DATA_HUD_MALF_APC = new /datum/atom_hud/data/malf_apc(), DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), // NOVA EDIT ADDITION + DATA_HUD_XENO = new /datum/atom_hud/data/xeno(), // FLUFFY FRONTIER ADDITION )) /// Assoc list of traits to the huds they give. @@ -33,6 +34,7 @@ GLOBAL_LIST_INIT(trait_to_hud, list( TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED, TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC, TRAIT_PERMIT_HUD = DATA_HUD_PERMIT, // NOVA EDIT ADDITION + TRAIT_XENO_HUD = DATA_HUD_XENO, )) /// Assoc list of traits that block other traits' huds to list of hud (traits) that they block diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cde5fd8e541..97c29958015 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1747,7 +1747,6 @@ return // it may seem counterintuitive to check for blockers on trait removal, the blocker now has total reign over whether the hud should come back var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[lost_trait]] - stack_trace("[length(GLOB.huds)] [lost_trait]") datahud.hide_from(src) /mob/proc/hud_trait_blocker_gained(datum/source, new_trait) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm index 919f6749622..e75afe4164e 100644 --- a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm +++ b/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm @@ -1,27 +1,9 @@ -GLOBAL_LIST_INIT(additional_observer_huds, list()) -GLOBAL_LIST_INIT(additional_combo_huds, list()) - -/** - * Эта штука добавляет указанный худ в глобальные списки из `code\datums\hud.dm`. Так же позволяет сделать дангный худ видимым для гостов/админов - * Arguments: - * - atom_hud_path: путь /datum/atom_hud/data/... требумого худа - * - data_hud_define: дефайн атом_худа - * - trait_define: дефайн трейта - * - for_observer: будет ли виден этот худ гостам - * - for_combohud: будет ли виден этот худ тем, кто включил комбохуд - */ -/proc/register_new_data_hud(atom_hud_path, data_hud_define, trait_define, for_observer = FALSE, for_combohud = FALSE) - GLOB.huds.Add(new atom_hud_path()) - GLOB.trait_to_hud += list("[trait_define]" = data_hud_define) - - if(for_observer) - GLOB.additional_observer_huds += trait_define - if(for_combohud) - GLOB.additional_combo_huds += trait_define - -/proc/init_additional_huds() - register_new_data_hud(/datum/atom_hud/data/xeno, DATA_HUD_XENO, TRAIT_XENO_HUD, for_observer = TRUE, for_combohud = TRUE) // TRAIT_XENO_HUD - 12 - +GLOBAL_LIST_INIT(additional_observer_huds, list( + TRAIT_XENO_HUD, +)) +GLOBAL_LIST_INIT(additional_combo_huds, list( + TRAIT_XENO_HUD, +)) /client/enable_combo_hud() if(combo_hud_enabled) @@ -35,7 +17,6 @@ GLOBAL_LIST_INIT(additional_combo_huds, list()) mob.remove_traits(GLOB.additional_combo_huds, ADMIN_TRAIT) return ..() - /mob/dead/observer/show_data_huds() . = ..() add_traits(GLOB.additional_observer_huds, REF(src)) From 8ecc105a769335b301f2b0568e736b5b3296351c Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 31 Dec 2025 04:33:01 +0700 Subject: [PATCH 112/120] Update hud.dm --- code/datums/hud.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 8d21fb086e9..257ac61c504 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(trait_to_hud, list( TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED, TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC, TRAIT_PERMIT_HUD = DATA_HUD_PERMIT, // NOVA EDIT ADDITION - TRAIT_XENO_HUD = DATA_HUD_XENO, + TRAIT_XENO_HUD = DATA_HUD_XENO, // FLUFFY FRONTIER ADDITION )) /// Assoc list of traits that block other traits' huds to list of hud (traits) that they block From 72b01a7bce73659c0e6f43d512932eb4b58c3d64 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 31 Dec 2025 05:24:02 +0700 Subject: [PATCH 113/120] Update xeno_hud.dm --- tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm index 4ec41e49fbf..657a4a0be44 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/xeno_hud.dm @@ -18,19 +18,18 @@ var/amount = 0 if(stat != DEAD) - amount = health > 0 ? round(health * 100 / maxHealth, 10) : CEILING(health, 10) if(health < 0) amount = round((health / (HEALTH_THRESHOLD_DEAD)) * -100, 10) else amount = CEILING((health / maxHealth) * 100, 10) - if(!amount) + if(amount == 0) amount = -1 //don't want the 'zero health' icon when we are crit set_hud_image_state(XENO_HUD, "xenohealth[amount]", 32, -32) /mob/living/carbon/alien/adult/tgmc/proc/xeno_hud_set_plasma() var/amount = 0 - if(stat != DEAD || get_max_plasma() > 0) + if((stat != DEAD) && (get_max_plasma() > 0)) amount = round(getPlasma() * 100 / get_max_plasma(), 10) set_hud_image_state(XENOPLASMA_HUD, "plasma[amount]", 32, -32) From f2738d49e3aafc259b45553e4732147a0464cd19 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 31 Dec 2025 06:01:12 +0700 Subject: [PATCH 114/120] t --- code/modules/vehicles/mecha/_mecha.dm | 2 +- .../tgmc_xenos/code/defense/alien_defense.dm | 24 ++++++++++--------- .../tgmc_xenos/code/defense/human_defense.dm | 7 +++--- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 64f43b465eb..ab0cd4cb895 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -989,7 +989,7 @@ /obj/vehicle/sealed/mecha/proc/melee_attack_effect(mob/living/victim, heavy) if(heavy) - // FLUFFY FRONTIER ADDITION START - TGMC_XENOS + // FLUFFY FRONTIER ADDITION START - TGMC_XENOS - Я не знаю как сделать это красивее... if(istgmcalien(victim)) var/mob/living/carbon/alien/adult/tgmc/tgmc_alien = victim if(tgmc_alien.resist_heavy_hits) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm index f339f103f93..3b99023ce6a 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm @@ -4,26 +4,28 @@ /mob/living/carbon/alien/adult/tgmc/attack_alien(mob/living/carbon/alien/user, list/modifiers) if(!user.combat_mode) - if(user == src) + if(user == src && check_self_for_injuries()) return playsound(loc, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) + AdjustStun(-6 SECONDS) + AdjustKnockdown(-6 SECONDS) + AdjustImmobilized(-6 SECONDS) + AdjustParalyzed(-6 SECONDS) + AdjustUnconscious(-6 SECONDS) + AdjustSleeping(-10 SECONDS) + if(on_fire && fire_stacks > 0) adjust_fire_stacks(-2) - if(fire_stacks > 0) user.visible_message(span_danger("[user] tries to put out the fire on [src]!"), span_warning("You try to put out the fire on [src]!"), vision_distance = 5) else user.visible_message(span_danger("[user] has successfully extinguished the fire on [src]!"), span_notice("You extinguished the fire on [src]!"), vision_distance = 5) - - AdjustStun(-6 SECONDS) - AdjustKnockdown(-6 SECONDS) - AdjustImmobilized(-6 SECONDS) - AdjustParalyzed(-6 SECONDS) - AdjustUnconscious(-6 SECONDS) - AdjustSleeping(-10 SECONDS) - return - return ..() + else + visible_message(span_notice("[user.name] nuzzles [src].")) + return + else + return ..() /mob/living/carbon/alien/adult/tgmc/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm index c9cea887525..0450e505d7c 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/human_defense.dm @@ -63,7 +63,6 @@ /mob/living/carbon/human/can_be_pulled(user, force) . = ..() - if(.) - if(stat == DEAD && istgmcalien(user)) - to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) - return FALSE + if(. && stat == DEAD && istgmcalien(user)) + to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) + return FALSE From eb280955d691dc67c69fe12772b6a278087d1b4b Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 31 Dec 2025 22:49:54 +0700 Subject: [PATCH 115/120] wehs --- .../modular_hud/code.dm => custom_huds/code/huds_for_ghosts.dm} | 0 tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename tff_modular/modules/{tgmc_xenos/code/modular_hud/code.dm => custom_huds/code/huds_for_ghosts.dm} (100%) diff --git a/tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm b/tff_modular/modules/custom_huds/code/huds_for_ghosts.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/modular_hud/code.dm rename to tff_modular/modules/custom_huds/code/huds_for_ghosts.dm diff --git a/tgstation.dme b/tgstation.dme index 189dff398c4..3ee814e6ccc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9540,6 +9540,7 @@ #include "tff_modular\modules\cqd_holsters\code\utility.dm" #include "tff_modular\modules\crucible_soul_potion_rebalance\crucible_soul_tweak.dm" #include "tff_modular\modules\custom_huds\code\huds.dm" +#include "tff_modular\modules\custom_huds\code\huds_for_ghosts.dm" #include "tff_modular\modules\custom_objectives\code\custom_objectives.dm" #include "tff_modular\modules\custom_revolution\code\rev_convert_item.dm" #include "tff_modular\modules\custom_revolution\code\rev_custom_hud.dm" @@ -9663,7 +9664,6 @@ #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\xeno_hud.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\xeno_shuttle.dm" -#include "tff_modular\modules\tgmc_xenos\code\modular_hud\code.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_charge.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\xeno_powers.dm" From 5a2217a13caf03ed14b0f87316aaaa091278e8fc Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Fri, 2 Jan 2026 22:21:04 +0700 Subject: [PATCH 116/120] fix damage procs --- .../modules/tgmc_xenos/code/defense/alien_defense.dm | 2 +- tff_modular/modules/tgmc_xenos/code/xeno_organs.dm | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm index 3b99023ce6a..3a0a9982a99 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm @@ -29,4 +29,4 @@ /mob/living/carbon/alien/adult/tgmc/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) . = ..() - adjustFireLoss(seconds_per_tick * TGMC_XENO_FIRESTACK_DAMAGE) + adjust_fire_loss(seconds_per_tick * TGMC_XENO_FIRESTACK_DAMAGE) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index 5f96744234e..bb544d92f43 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -42,9 +42,9 @@ heal_amt *= delta_time_capped owner.adjustPlasma(0.5 * plasma_rate * delta_time_capped) - owner.adjustBruteLoss(-heal_amt) - owner.adjustFireLoss(-heal_amt) - owner.adjustOxyLoss(-heal_amt) + owner.adjust_brute_loss(-heal_amt) + owner.adjust_fire_loss(-heal_amt) + owner.adjust_oxy_loss(-heal_amt) heal_owner_organs(heal_amt / 20) else owner.adjustPlasma(0.1 * plasma_rate * delta_time) @@ -52,7 +52,7 @@ /obj/item/organ/alien/plasmavessel/tgmc/proc/heal_owner_organs(heal_amount) var/list/slots_to_heal = list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_EYES, ORGAN_SLOT_LIVER, ORGAN_SLOT_EARS, ORGAN_SLOT_STOMACH) for(var/slot in slots_to_heal) - owner.adjustOrganLoss(slot, -heal_amount) + owner.adjust_organ_loss(slot, -heal_amount) /obj/item/organ/alien/plasmavessel/tgmc/large name = "large plasma vessel" From 3db6992b59dde073b576852fc88a08f0668bf46c Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:09:22 +0700 Subject: [PATCH 117/120] last --- code/modules/vehicles/mecha/_mecha.dm | 2 +- .../modules/tgmc_xenos/code/base_alien.dm | 18 ++++++++++++------ .../tgmc_xenos/code/xeno_types/defender.dm | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index bdc0ad762dc..573aada3733 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -1024,7 +1024,7 @@ /obj/vehicle/sealed/mecha/proc/melee_attack_effect(mob/living/victim, heavy) if(heavy) - // FLUFFY FRONTIER ADDITION START - TGMC_XENOS - Я не знаю как сделать это красивее... + // FLUFFY FRONTIER ADDITION START - TGMC_XENOS - Это нужно реворкнуть на апстриме if(istgmcalien(victim)) var/mob/living/carbon/alien/adult/tgmc/tgmc_alien = victim if(tgmc_alien.resist_heavy_hits) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 34929c1de2a..92a8f8a906c 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -75,6 +75,7 @@ add_traits(list(TRAIT_XENO_HEAL_AURA, TRAIT_PIERCEIMMUNE, TRAIT_XENO_HUD), TRAIT_XENO_INNATE) AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) + AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/tgmc/create_internal_organs() @@ -85,16 +86,22 @@ /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха + to_chat(src, span_warning("You can't do that in this position!")) return FALSE if(fortify) + to_chat(src, span_warning("You can't do that in this position!")) return FALSE if(ishuman(attack_target)) var/mob/living/carbon/human/target = attack_target if(target.stat == DEAD) - to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) + to_chat(src, span_warning("[target] is dead, why would you want to touch it?")) return FALSE return ..() +/mob/living/carbon/alien/adult/tgmc/death(gibbed) + . = ..() + xeno_hud_set_plasma() + /mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) if(fortify) balloon_alert(src, "Cannot while fortified") @@ -103,15 +110,14 @@ /mob/living/carbon/alien/adult/tgmc/on_lying_down(new_lying_angle) . = ..() - ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + add_movespeed_modifier(/datum/movespeed_modifier/tgmc_alien_sleeping) /mob/living/carbon/alien/adult/tgmc/on_standing_up() . = ..() - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + remove_movespeed_modifier(/datum/movespeed_modifier/tgmc_alien_sleeping) -/mob/living/carbon/alien/adult/tgmc/death(gibbed) - . = ..() - xeno_hud_set_plasma() +/datum/movespeed_modifier/tgmc_alien_sleeping + multiplicative_slowdown = 8 /mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) return get_armor_rating(type) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 4bc8edd593b..a7dd6ea3e81 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -5,8 +5,8 @@ desc = "A heavy looking alien with a wrecking ball-like tail that'd probably hurt to get hit by." icon_state = "aliendefender" caste = "defender" - maxHealth = 200 - health = 200 + maxHealth = 225 + health = 225 mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 From b0fd2fe520b2361133faf60e72d1b3a8bd35416e Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:15:19 +0700 Subject: [PATCH 118/120] bleh --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 158919a3d6d..2a061aa2512 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -430,6 +430,7 @@ #include "code\__DEFINES\~ff_defines\_globalvars\logging.dm" #include "code\__DEFINES\~ff_defines\_globalvars\lists\blooper.dm" #include "code\__DEFINES\~ff_defines\traits\declarations.dm" +#include "code\__DEFINES\~nova_defines\_flags.dm" #include "code\__DEFINES\~nova_defines\_organ_defines.dm" #include "code\__DEFINES\~nova_defines\access.dm" #include "code\__DEFINES\~nova_defines\actionspeed_modification.dm" From 823cc99c016e291bf694b231d1ddfc8e8be97924 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:53:57 +0700 Subject: [PATCH 119/120] blepweh --- .../modules/tgmc_xenos/code/base_alien.dm | 2 +- .../code/misc/attack_prevent_element.dm | 42 +++++++++++++++++++ tgstation.dme | 1 + 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 92a8f8a906c..6c827d2f905 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -75,7 +75,7 @@ add_traits(list(TRAIT_XENO_HEAL_AURA, TRAIT_PIERCEIMMUNE, TRAIT_XENO_HUD), TRAIT_XENO_INNATE) AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) - AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") + AddElement(/datum/element/prevent_xeno_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/tgmc/create_internal_organs() diff --git a/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm b/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm new file mode 100644 index 00000000000..6bccca653be --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm @@ -0,0 +1,42 @@ +// TGMC_XENOS +// Почти ПОЛНАЯ КОПИЯ code\datums\elements\prevent_attacking_of_types.dm +// Нужно обновить этот элемент на апстриме, после чего удалить этот тип + +/// This hostile will not be able to attack a given typecache, and will receive +/// a balloon alert when it tries to. +/datum/element/prevent_xeno_attacking_of_types + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + + /// The typecache of things this hostile can't attack + var/list/typecache + + /// The message to send to the hostile mob when they try to attack something they can't + var/alert_message + +/datum/element/prevent_xeno_attacking_of_types/Attach(datum/target, list/typecache, alert_message) + . = ..() + + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.alert_message = alert_message + src.typecache = typecache + + RegisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attacking_target)) + +/datum/element/prevent_xeno_attacking_of_types/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) + return ..() + +/datum/element/prevent_xeno_attacking_of_types/proc/on_pre_attacking_target(mob/source, atom/target) + SIGNAL_HANDLER + + if (!typecache[target.type]) + return + + target.balloon_alert(source, alert_message) + + return COMPONENT_HOSTILE_NO_ATTACK + + diff --git a/tgstation.dme b/tgstation.dme index 2a061aa2512..c948fb126ee 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9685,6 +9685,7 @@ #include "tff_modular\modules\tgmc_xenos\code\defense\alien_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" +#include "tff_modular\modules\tgmc_xenos\code\misc\attack_prevent_element.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\larva.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\projectiles.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\queen_finder.dm" From f917ca286ec65f04864828fc9b6fe818c82d0b56 Mon Sep 17 00:00:00 2001 From: Cornka <112967882+Kocma-san@users.noreply.github.com> Date: Mon, 9 Feb 2026 17:21:58 +0700 Subject: [PATCH 120/120] Update attack_prevent_element.dm --- .../tgmc_xenos/code/misc/attack_prevent_element.dm | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm b/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm index 6bccca653be..cce3ab7900a 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/attack_prevent_element.dm @@ -1,6 +1,5 @@ // TGMC_XENOS -// Почти ПОЛНАЯ КОПИЯ code\datums\elements\prevent_attacking_of_types.dm -// Нужно обновить этот элемент на апстриме, после чего удалить этот тип +// Почти ПОЛНАЯ КОПИЯ code\datums\elements\prevent_attacking_of_types.dm, измененная под работу со всеми мобами, а не только базовыми /// This hostile will not be able to attack a given typecache, and will receive /// a balloon alert when it tries to. @@ -23,10 +22,10 @@ src.alert_message = alert_message src.typecache = typecache - RegisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attacking_target)) + RegisterSignal(target, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_pre_attacking_target)) /datum/element/prevent_xeno_attacking_of_types/Detach(datum/source, ...) - UnregisterSignal(source, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) + UnregisterSignal(source, COMSIG_LIVING_EARLY_UNARMED_ATTACK) return ..() /datum/element/prevent_xeno_attacking_of_types/proc/on_pre_attacking_target(mob/source, atom/target) @@ -37,6 +36,4 @@ target.balloon_alert(source, alert_message) - return COMPONENT_HOSTILE_NO_ATTACK - - + return COMPONENT_CANCEL_ATTACK_CHAIN

FKO)eH@AQKgzJL9!hgd5LSa8+yiE@m>hR?gb%vsy-`rOr7a=>HEQ`L&EkY!E9 z@Ihumx3)XjFTM}icbnB)Al;j2p?B|N39i2F0!Ju*S6s>QTj3+0>k!g$-zUx2oETBt zyi7a9%SM)-WLgMs);Rci?r2oB6hpw0>dLWnJv1hA`9i#$u)j`n&zz3vQ3%}P8QJHq zf6j}TP|erR^~zW1Nv+kh=^AGq62GyE)_&%A>(?n}S?44BI~zZZ@_8K5l#?Bk|FrXy zuJTYsRPo2G?OwKtFOBRE;LdJ!wNqu=n?2$4#M<}}IMvXHW5QXD{N6cP^$4tm*5@{P zY@4y@RW728RpdEvI&Uai;mtgXos)h6f|^2t$WDJLsv>_jP8cWuI=H_-#8}jC8#5qQ zzVTgl?a#IO@ihZi-IL3P+a{J|0<1#Q;gf5N7gYUhmmFCe^d-yol^%byg;@S6KjF$! zMw7F}>Kil7ix6dM@C&XWe|X722@{s+y5g6wXHy_&XP`y3)&XcE!fze9W_&y z^eu}vT#!snO5Iuz^}Tq%V5~z+a=o}Ww7v6ve=|ACyh!*A?%Y&Ei;&t<&3yC7K+KH; z_jBYv{ZLv%LM#oVgu1bp42w%U&kq+=Fpuon|ADV~@&@Ny$Er_-n$d$7VjFWr!l59C zOLcu)5+rI{>{<76x9t2zx>h>QfAi7tVV7W~uzc)fp^gVqDk@go)`oHJg~1yu#;fI@ z(O(Sd6VukxJK`L!l%(nejcoN0=qrjja9{ZhBEL9A4f+-*BPpnF`7uetbCKVqc1Zq| zYW>vmV&d0MuIK%6L8#@;4Y@S7`yM-W!meK*>RCsQtMWB&kacLbIC8qUR#)8Eq$MT! z_$7B{RdnMq!3z1A&krA<+vCYpwfDCJu`+Y1y>ln8ChUX0YYimmq`GZ5D`KO7dfgHr zR1|1rX0;UhW8UP&`}sGoOM;gV%_n}Faoq&V32tGX%Gx&GDytY1;UUBSCQkLSw((Ve zQx}27B$MV~D55!q+cTbD{Hlv6_~+S;hL2VH1pgkhM)5(<2U@$8Brcx&Sa)%uO=Y6> zq%uBE!_$b=K;BuN?!5B0N-y~a1!akV7+o3|x>|^R5&Zc+OaRLioX{yT^+f6q(oV zQI3r0@4Dh9Q>R#6vm~_pYV3Xjf6-xQhp(-Rc@t(NiyXz_raI_MG1Vil6?5AtPdM;k z@U^s6d6`kBh+ZPPzpioj@*YW>+bO7{8~w+ul>}W9PKBUYKG!rhEiAS^uUm7Jc6;qA z#}RF85@Mc<`tx9iUx>P{(ce`EQV})|d6R|%1?J!XJX5-pLSo%?{IZ5kBu7Yi9=cHG z^^0vSegB;A&BkysnGK^xo&4M*=ONXGHgGdOE|Y}aUg;P}>i%P8^1-`N<-bOIa2}ix zpNmI1({BU}oJw6@`*8CeDz6;f^ZdcNN61(a+nMGDD1N_;>)mH^v zj~!)vIknPRc5hVd^wzrki3(af7STxkb_dZbrrIf>YsG*T3Iwwp_3g1Y>K~n%&*<}f zj5oYK_Wg@!ep2g);#)l|X}Edew!|IvEOps#r})-8jlueoABh$fZ?cvyo|ZU!r!SM+ zXQnN#EV|H^S~sb_^l}9LYl{f|1T@*PRSps<`qFyykOS5KvOK5Acy{esVYQ;FQ*w;& z-|^c8&<1hYIq?T}|E#1d4XhzmX&Y~CF_0>9_sDbqCe?+sFd@H>ta_OB!ptqM&7&={ z)8+H&rqDj?s>_L} zhc#ceeRYoKT-Q0{v)u>UjdmN{2uUA@!aOhHZyFR(4$Y69Q!6O#Mr?KUa$A(r$n6y` zWvQ#rzarM)rOXjOIw_J}Ul-5JXlu)JgCd)B59yp`FF>mPUiuCu2SKkg)33bii5`vz6rJ5Zc-nm)c o#i8SlwsfOgZQR&tY<)TTvOoAK(RbEJw!B~{eG86SaTJ684Z?q;h5!Hn diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_travel.ogg deleted file mode 100644 index 965e6ddbfa44182ccac60b4e5222a5e7011b2239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16265 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 Q^0Y3i%qBg9gs}1c4~#!ysQ>@~ diff --git a/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg b/tff_modular/modules/tgmc_xenos/mortar/sound/gun_mortar_unpack.ogg deleted file mode 100644 index 32058c8e0acba2b2c41303ac1868c99ea0d0f779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16844 zcmajGWmp_d&?q_!!6mpu(BLi!?hXMK7GK;oxJ$6$?(QxD!s3$P?k*t^Ab1FtK!Cf+ zd%knd{c)e$Pft&ES66j)b#+(G?5vu#wI+Z7{I4{*@U!4A*wvc}15trIon6gr-TpR! zWNQE30N^by=-<5!r1qEcf2Y5ce=$T9XcpKKPybiKMf{Hq796W$>S@LQii2N(gPV)% zZ}%7Q%hJi**}~FQ6pl29BL(>2NN#EeTeJV@KuG`HX{DsKL4X7R(7Tba$d$Pfh2fA% zsgv$fNKM(FkV>iGhEVXR7>qNxCDN1@N<|tly_-pd0DlSIOL`N8MN6X6gfWQfCWkVL z!l6h(c$@9tHXNz{DP#q0;8;mi%CKFo*O;MuuYXa5$qMS?z}vo4hdq~S%MPs-gm`+DiUu0p{lHNrBjX^J|kQjDY+SOEER01E^+gypp9LY12mpn}Owq+m=s09e=)ed7;7Di?47*T_ zCQ*zwQedEB=^??_0YHWKQ;05Ai2tULOs|*B@GtL2RkMvZ{mVT6$Q1xUT?13rg#hIr zodp1(7QT)y(~T~(i9U#oM-7XpMF4^U;2C@vK50!6`Ba%{Eyyy=asB_w2I-ch|H$Dw z#F?|TszQ$BLL^20w+?VIf^nm{27>=b$-yK_*u`jdf?slX3-z$Gl^O*pa}`>Al5?Wl z1rKuFrbhR3xu@VzajqU_HoV_K?m(d)`hO5(qt8q>%ilJasY8=o+#xvhvd$+lJFW!| zA=TN&XDc_tA%%7yaE|idHn+d5{uM`qhZMQ^f2)<;dD|Iyc-KI2E2$dnt1+2vQpTZFU2~?VJ z0GmT0h{pr%fnPR-BR!WmH(SMe3Mhd zjs3rgFb|QqO$dIcPsRD4X~Gv2cuOGv&)yW9=#}T_C+FDIF8S2(MKuUy=lLMBgiwuF zjv4}%^ZZav0VqVK@yQ4x(jGn#3D{ySI_h57pwS4iP4o?vM1FoB>{;!wI`Smxh-^$gH}?>(9^D8h0#M)=M$t?n zAxMG%0N&w%(V4?j&8CDT7x85m)A%O&_%*a3ssyTwS`a-V z)x|UhRbEw90*EHQEQAoEnXU>+vz+F0T-AbX5fD4IEXVCG1z3|pGwR2hIBT0~Ft~n0NaH++VB3ju;0wr7K)H!`-2AH~1OkIn%z6n zFv|v3%qH4fwC(>5UdvFnW>(t*9~`S}Ko?x~m!hU|nZ$gO8D^*%!{18cSI^#R|SGNym#SF`}ukT*o2w?*NlYd(-j7QyOLlsz@J{zVjTG{*`uh&9KSOWf=dQ>n5K!3{v55O7dI$mI?@?$07jcN%0tY-o z9R~NO%wefuxJyE&000CPCd7YY7sJnd+S-;See*ha5%U+auYp0dgO&T8sX6{u{r7fM6tSxT_JU zjeiT~BhvkAN`K?TkTq8}Ze9h!eKvt-G)V0b1?ItzR&u0!Z4h*tQa+0}+!mz+`fgS5 z6#zout~6d_evE8EU)$07yno;6z1)Z~rL7qoyrK2p)JAZU|I~M4XmG~}Pb9!E0C+7E92vRK#lt7?T1Z4pLJDpZ|E1vI;D3MwybKQh?`cD#?q3t| z_i5vA$7Sy2GCL}AN(NTe;jwvkcGeeEG&C>R*~b}ZsHtdZY1vp<**I7^nI}K9GPAao zz?j*GyLx+RSy^W~I=kBY=on}js3};PTB>2R)GydrCtE+!vvG2cbx$(04fT!F(oxgW z)3C8~3{$eREqBw?mCl@6GFm_1dWKL&2XjZ4@s95t>7{(fQV%PUX%qf92eg{_5tzRN zhy#QtDttB{UFx+JW>m_ixVykV{TGlW5`BTo=9I9O5#J*xNpr^p`Sv@tKK6k*sJ!%} z!2(_lqC~)hIi3=0D60PH-pG`=x8?VnyEnd5&p!hbV`%nrPt|qy6IDAd0(xs}t_P7d z24oU~hlF=abpb*FV-J9Z|@iH7nZhiHi28yZ_edeY|c-Z)!YFZRw^> z5|b9H3rJyaiu2J!kf-`=vAf~ta*M}HfXaAzH@^})U#)Ao{sq7NJn}4@R4q6ef0?Ca zPKqvLp;tElh3cMME_*a=&5ro2`&TAjpn}(*D(6+s`}C~0*4e2WO5DBdx~&0wXYO2M zTp#g2KCYbaEcK+$9SbwORCb-HmL(oi$o8P_R&BuV9;Yo}0Tl{`UnO0)>r{ME^^t;r zJnubXWDG4Zn0}lG1hn^(pO^W2|1{fixE_fWeFx$baH=jXJv6T${kb)XNGCiFJM3t1 zAuSN%#TGMQ7MBbdv>b?=%jI3ZUfH^j88p8*?7TTHtMcc1>pimxN~b0|Z`#s-%Q$+s z$GMt@a~XJ9xg?TPfdtEVlA3Y3o3X5Cu0p!4KussKUpjlq{$5P~%#md@xjLO;fueCR zQu35GlUsqfq$>V*igZ1~0?%7!XkKlZcbr#R_Imu!2V^!!5BR<7~90-<{8XM&8xk9{pRXeE=|5D@h+#e+#@0ARC$C*kN>G;|51Yk*TTFF z^$3J#rPXB*)EC?1INAlO^Eu7q{~75W9mm&SDdcsN^{m(eI<(|I5nDX*?WGfH>vRf%g}V2W)`6j5J1p9X|BMRCo2Ad zMmAahiP9PjtDA?*s2@c}2~2c?blf|hr4?$=8~gN*U|AWOA>`l+xa;gISfg+yfT(tP zOGDggjpev;Xk+tN3u(hB)3k>C;pFv0j_$x`qhMh}XHEvinAffC*Q=HE?N{0iYGT9c1491kVnUyCqw_dHn&2vKtSh{syW@_gVH` zFbPoc>h8MH#QF+H9Hata<|B3n6!H*^$`g*`qDnbl-7?g&p7-mY?tZ9#`R;N;^HpnVK@@NsN)QXLfchGxb@tEc8KqQQ zb2?J|=l=R(G-`M%8dZ#fSi!YG2L7?ubK7D;cAm^ye#<$9-@fA#$$ZLPNz02QK*AJ? zyIpp)+>)$D;2cw{QCI_AM%1t%KBAVMp-kNnAkzZadts;AZtz@5^)dMCw00VIcDsB{ zL)r#ZG%3Q$v8aDs2eZXxQ4yArc*s7jRaDpN_*i?K=^tckrCAsU2UmCnyVJdse=f2q zn?U0e)SACDnR99_UNf0RTqkxWs@Mj-`HI{7{+WX%?QAG~b7ce@cZzWY$*1p_)5RN% zT&T9N^$;(15Nmuvy0OqA}-(PEUcscP}{+!smNgUt-T5YhyJ2$e)#! zvLN`IM}&3-ohtAOqkjOWL54zCaId~1AVn5R{s!Q^nB^uR-b#n!z^=wPs2 z_0;RP&$lFjf2i9V^pu_bJBn3=@=g8t7v2Wb=mIL+!`T4eQQPNmGoRUJ5Rw@3MOd$f zo()u$>DPbe7PEhuUiOUn=*oVPSw7GlQI5CI&ZeZa5ttU)}DI^{By2i}C{ znxnJ%al^&NWfuq!cE;QRL~V=r+yVV=oq;x#9!X(E>C5@TZ%MWJWy*PH(b)d{2>wDl z?egy`gQZK&r+zOvyDzR~Cpgk>tbQ&QcI$p%x6omEs4gQL4|ok0*b=@iPMiZnV!O&9 z%cfinMOGNQ!}gm|t0gb<_@uiRY4{s`>WhaIgt8U&b#J&AkG_*pb2;c(Q~G|?>)JYH zIf_ExUliKNgIM1Qrj3*PM34T!#UNwunDwwQT&9m#CLB!p6D?`rBofCrE@+xeGZtn? zQS&%axz8|X5XKUj&5}R}?wdU)x=}7qkx4mx`Mq|r=V7qKzjtTC+;yQjD$t7#KQ7E} zEUh*9+e^-2viMyp<@w!T^(5l=dJpvuDdmm0I?c;i*5V@R2b@(9Tp?3dDTLBtPbxn1 z{eaYbcl4jOkLmA~th8@4yHYg2?f6&Qj|KMr;I@b=f1_n)r;ly7KO><3J>aQ@^k|v% znu7wAeZQ`YFkeBe$~y`=z>vMz?`|=^!`X~ey1}BiW4bg(MZFm`9>x&zf4b4`B_rg{ zToARIc&I^iFn)g?5ATWn>l%7QW{y(w1Q=vD<;Z3^x$?!0m&)!9UA&s1 zF&ZgjxtOYI4DPqsK@ooWW7pP!3-*H#e`>r`Son@<<5W0>W{KMov`itB!G#`UyWOEO zw-QAS!)s~ujSV{DS#tvP7)@}6s+4p{h1rtJOR&`zNT%7*dbBSYoTZcvc+q2e=V|fl{KV+iBHqG)!7z7gEZ@m?6aH?Ntm|D!((EseB*g&zzf3l98w?7!Ew~ug~ zv0T6(ReH#zoTJk~?x$XzlcrGl#gWyc0{?RkwHH=@5Rtw3NCke^exG1PFM<#h{ zI_F`?;J(`@P!N2)xLGyR#tQrL`^G88|0@nJ*T#qHqd)R*5G3v|QXFd*AT_YvABq^w zzwRtF^NV@UIli2BoH5b^+q5~?vV7>nE%ie`=q)@yl8K&*D09AUmc%UdWYq)eHN2h> z0ZS3|>BJK*cUTA&kGKq;{$a54?8Gz;xZ+uN4}JCP932|MjdwrJL4bpvO#5BKQV42I z&dUl{3gUzv&5H!b+;_w&K4&6_3Z}nG}@G7f$ z4psSVdiZQbUySDXsN{G1TFeD~r=`iXvZfN%4r(L)9zb=SGmSiPulYU1nW)NLl)}F> z_zCKkp3NbH1HD1+zM-}H9odx7ihsba@B?pS`?XP2=Uq#;cSE*V!Dy|Snq1n^mRC-P zi(>Uiq+&+1p~!WEjET^n2e(}OELvI9DB|Hl%WNQzV)I0n_<&3Iv->B_GJt97X=zo$ zGypL)fAr;%zJ9Z&79sG6QQut3BT8Q>{e3;dc#4dNCzswEGpTXn<-Bf``J&@~spQFY z;c-x1mEMk}59^+}Z+m^ap}5&TgJcYfjFrN3nZ^XOlPX_Tw9CiR59E!!w3x)d`%N>8 zgo@6;`?RfzpbbWDpPimY#T)DIW}MOPA0|yPFgPW5Y?Ov8nt5;b#^f7|Ke`$UP1$X1GTz)#y6P`vw33^7xAKh&xe9Y}C!Can68-P)_j) z4PuWi3`Bt9^3cBh zo|2A`nYa!!s^lLoaXohzUK>2)Lk=k|v%CX^n)?xlXDpECv5XwoRq6dxA~_LIZ6)2q z@bv@NO|p3FpN-HVJaFNZZ_w)+8bOisiRk6PlW>)$g&>?f*NXDq6b+0S-uJD?dJ_`q z+RCq9ge3MgwYV=!a0sYqeAs2baS_u*SS=Kj8vUqk@pby4^ONQU7%Dhh`yRxIprvO) z;|W{?SHK_qj8%_R`HJ^zZORQUKQEcIHAYCi(f*gTf5TBLB?$H!;TXXY-vdii(T;neAsK%5KS7nc0`}Smg%6opU+iAyklL+ zou|qU=ylN?1)N6HV^1azjnd7Z9wxq0IbwwSquX~Y1;(c_rYCSki9{&^MLy%#%dm|>{PWAKnK@_W~{M{Fqg#MZ7+h~v&9!2Ubb?)Q}C`Z zeMLR1<)EqkQ+re9A?2-{7~N{`TXnZZC-82urKQXrfDB`Hk zski;ZSMJC}0%sujCry*I&3)UctiW~l!boBNF665eX5=W-UQE=Ehp5jD>?b{e2!6LO z6NEQ!+=baK3RBHeqe`)rb)HAMv8L*smOxBaVm=KoQKj9FiDos}aQ*29K00&O^Hw^X z-DK9bgJryS?NqVOaIuiqJhZ|WVl3p6-15<94sIorjkSky3o44)44rpv0vC%TyrYZX z9+uVCj5@_n->5$)Yl|F9Kp}Z4a!+a zqd2dLlz(iS`!u$P+I$@#lDWF)zMtl(8?*lU_$Hy6_Jy1O%}s6OY5S8(sL3|PCwA4@ z5;N(E#}~zp%3mfUnqj%3ILf%yP0b5s>F>AAoHb*NXA_)j>Ud|H%aR;mILzlR*|6vK zB{IvI($9ynbIDW3Zl&61PY~@V#7-MZN~(uzh(5Q$ zf<+@O7QxP~PU!PY?rt7$#b1bjU-$AQ5Zo~>OWWj8h+FkGcPPt=_|?>+%rY-_FO{kN z_@d-j^@XyC48z^yBY&%{xjpUVfXy_4fT>=8iV`lzfi+3qFwalaL#RkGE!S7g18BOD z%#)P#;dkD)yx8sHC^QL64%!Opt;KGEK~ufmDcWm@riGMV*;+}cpJ`P^d9;n=h2?OH z9F~0sc6C9YOOgdy%rlyMDYXHU>MB1X6AI@LqM=qduksylkcy5LUnOX}a2+YaXk<-S zl0dC$u!E~$>cbtfb^}CO{!|O#(?pY_SOH{=P`6i0A(KM_9iLt|njTz|$~+}G58hbR zG>u7u_|&Rm74*taZqcb54``NBq7C!Cy{9#}lGU3aY|MA3m1KO%hIAYb0Qv!&M8ZwI zjl5;o#1*cZa2zCxKkSNt)%3yWQK3Yign@yqDkolF_4UEKt;9NQ3O3}__2@0%ft%)F@rjI}y6k`T5<)&EU^wk;GvV@MR z0oM)Wb;Cc(euqzf=jD8|%M?3^nzrfSNGM6y$Iq`Y_pGK0aOj%wIzL;9=G}PVh0t8B z^L+2s$-+;QQ^hG`A^mYH*F3vg@nG7d#F(xORSNnl$z?RO_lxe0al!UlUoS$^)Kk_s zou;VunDIxil8yZ}?jq}xL31@IH~}lLSBdHwR~-j39&) zT${y|x{<)FWP*_&8zkr!CnYI?Y>(3^_mMXtB)Lt$*!NVWA@7v|l9Va7AjX+SkHg%k zPT`-5BM0&ROs3}bsNZvx_JufV9nH;9m!I`6RQHoC=9zbpPiP0BT-#=mTpg_4M&3U; zpE<474Md`%Jjyd|utikPv}#H;M~Qr+sMEY6k}$H2neO6sPh>`j!GHZOf4lMw3KC%1 zizx>)XG&ZK-Ol>j{T6gHMi-qWrwnV(i_vRL6_}-YY<*=3wR&Uq=CSqnoX5)b%3%gy z%_?@oGTqJ(q~=M7)4kIdi7&|-{xqe}q+icoMq$p9A+_4-QtR38S=KA~dfBGQ-f420 zQwT@DJRnj|@;(w!j2{0$uq2hYWXAdlT*^Fuq0&}E<7*u9DZO}6#mQa!0QD2`8S6n;j5r0 zKTwV}_aTmo#*f0zaV=u{orR#SLkqa5ZOzY+ zYSwk@>`|lu-G}$R9^eeNIYv&zlK3p_NWmljCc$J9;AF}t=oUpHKiw0>s{@H*&0FNj z1tye^0d8*p{9NWVaqGy(CJAxn$IH1Z+X8$5bfTm2!62|o-v8lf(R}wjspFMd3Bs1p zqHN(z*#`*^NVc&NgZ2x7BVS@Utjbu+Y`Zo_kMF)D*3WCiYJPX9bUZvJ$^VSoqCjvv zT}uCIf__n-_Lj<@;HdSNiRX8&owq>)@)T1${a3hBm6!q+8}XwDJd;60BVdWeo%Bxy z(Z_>`%fvUYg?Uq2)UPGvE}2Uk?2dz3|#|J*g$u}xa!rPZe{+KgQP|i?N>7^ zka*{0F94`=u;`4~`88$o6Az4U{kWz0T7OCV2o;dvI!o$07K;CPF?CvEMRX8D#_M+L zoFqSy@lD-q?hgJ^QsJUX*!*+ZGuBhw_}030`uDU{8FoUt_Mf#rzZVcXHk<46W9D z#f0u%q4Ah^bqp|&*j6<>5iNB=CyH~|_go_9z%J&^9be+khn*2*)F8Umy=qf9&t11> zCY$72>+Pnz&Ju)6k9me0f|l|LHvees4jR>a5-C@Z4`PbU4@IqjdiYmNy%-5lPCjHm zYmhbN^b6ZHw&Jk{U)U8@{xo9SVoJFa*%?POL=dvu!;&oVoH3@fT+@I3)OsKvbVW>D zBIYJY6_3)YCzBuD3|ZF&WNPP4s-v=8`elU6$%M>pB4eCZ>ZwdmJFQe&s#-{X`nNxV2p zX|!2gLncDs>n?11jg4N}-2i{zD@!=sN`B$)p%%oiLnj@wTAE`!ehvUJ?vD+_=ei4T zgkgG`b-eb!#tlQ!&uD=yhG2qg+*jufL8S7(U%SfFU4GOg9AhK%JHnN{*v83dGmMYh zGIm5L&to#F4d4)NFg-NF6TKV@ZQ)Rd46QqMf}TE-VY_`-j~|$+GO=b(__&rPEw&n+ z6IthW3jX#g-S>EqgR29D>yS3;kAip@A82jWtDH04#g;Abb9l*EYKE=!(FjQ%ZR!kV zsuDaLa*w7F1~RRYm-=oP_16x5W=@X@QB8NGKMiZ?q?sFw2-~szo(2=}sX@GBh5x)d zz*f9EnBHm_%ohG$QB(2wFwJ6U*F_jFDp)MhRxkkpJ&cP9=|j5vGz0RhT|6?e>!TiH z#9a$2y6?1+t``K~jFEv>LJ0uETP3}n<-mj4>#^f7tHrf#WYKI7HC5;E?^iVZPP~LB ze26GWB?y5{-QW!e_;*3kqiAimZEuzuA@}HIbS*5=I>6v$&I>VZ-W9BGmp3nuinsB2 z(kgy*iHn}kAvkPncz85AhhsBmVjz)nGu)mU^tYKzG3*`MhM!f+(A-#f@IQv)cC{m# zxV{pVfL&YG6cX86zg(7ekh{KX>|KyW03PiK!;uOj_=u(5zqmlmub1fFIG_mOs`Ji| z2`AdK+1}Y3TdQPbKQ%=+Pp=}(j>zesoJt|68b3;+Nsx9TR+6DZj52zWS+nWZ=ED5& zH76HIgUE{|cpD$;T!}ooN{^2ZRC2YwV86c*C}TsWIe#`qIjQwwu2H_JdTB)ccpA*b z@F5RNW2<$lOYZ5#&aX$`-7sB$wPu}ou7K{apYP4jTq6OK642tckE+jpJRK{h^ClRV zPV2JsUQG%818AwEjE>IL2Qw1k?dduifHQBM5jIr&5~j@zt9H;!5z^mK%+XLi3A$9}-@5I4^9m9K4R-wHaBhWF4Z_-8zS~&)<_g2K|bC9oz5O?G; zDW#?kAH=3+I1zdXAefME`|p0G*`yJ>Io5=DB+jdzo{C5L3f)ukjV_T)SqK5|MA1a% zs)$;`-@?Y$tShRQp#FZ}j1J$kRHImEe)zgtYiCGFX7Tu(8CP!umnHqKCaaQq7&2my zM*uR^@TK6l1xU_`fBDI=u7_HEJ7hL+TG%+QcT|}dt^Rg~qoSvWv%LZXc~|90l*_X; z#>Ukv7^vs?xXv5$%1>6wmc~#JYw2xg*`i3S_yk||xcH0@EJ1~bzRF}^d6+bsy4Uw>R?796ttHCCIQMWc|dWn19p4ApG{pOkypFq26a?IC zPCYZ3A~i6OWI1TWeR$+?t>7GYjd*UczXA1~Zf96^4Ncl#|7~BwKxHhJE!uFttwA7M zeS`x&Q}%lnZY2E8{H<4)IO`~td{djFMyH0orq6Fdp;nO>K4|ZGIzuwu=+}+~4}Ooy z*dC#DzM^!E{3-t0AXB9se1HmhL*Nn5P`t+o(xWAw_Tf!SpFQRMEg3H|Sfu6h=JeF#V$#gESJQMRPlC}4V0IbM@^njXtz%5$tW0m4G$1t zs9Sqfo@JZaQ<%w+U0d=#IY0#0H^$7V9*5 zHUhy(GnaJCyQJZD`{uq+irt>cL4U@J_5(u(Vn_pEQ7fE+{P#PTvdM5;)^tAk)v{-; zlU#_C+%0F!M?SZJ$f9PSCvX_h&5~|)c4!UothRM%$$Cev%J|Ic?TSsFy!!Xe)3e~m z|MSfgA{?}g(wr>Kp9q?Pwcn8|;L2^nV^gX0ZT1C+Rcc@*L30_YsR^F>bjjV6yaP@BovX)!KZ1j0dMQpZ zs8mQEIImqTJIfU2+==0m9hV>Fl%}DT*S*bD^)5h6j!Y)shT^Pl;LV?O$I2$X7IhL5f-Tx*&P3fkJZ)8H3UT7v2a%J#x;J_cn ztlAS|wW@i$NxxDuax(FOv3ZhIJ;XU=huT@>L0%CvKrN8IhpN9tRM#%`y;$bg5#4un zT$m_sWcH|okh5fk2#ILNXt1JzKb}D?Z6$@``Ac7S#Uc|C;IY$#wO^8wUUV+dYxt_m zW`A*dFL#eHVkv3s`2AvsDB9OD=|`cM*6A3%2glJ_bHnPR{{6X(3@Q1I8Tob1Hu+eq zGH-|2^t0n<-+~A0g~y4OLDmAxZw-V{EoI)G?d)7F&3^4!-A7?xK@=3wuQfAmh=?!G zTKRd{l_8=8rV^FEII@^RrJ&xZXFUl#!GjDzidt3mh;u9i3{I-DN8kB`TwLsH%1w6? z^Ck%h(@kJ8hQ3^+wis|7wOR;A0L1RYRYUCGJ(~->ulA3Bb|H6bt1b|{8U~iA;;RZI z6S6)`?paRR@M3gIP3L<& znJ#^R%C8Ja9CC^sZ^6zYsDi^LX3p?60^lNi6o^+;kY#LbMD&%xvALH; z4f3KgB=(BkGhs~20*3vt!L&n{&Q!SWZZhObZ|BM;e7AN}FtSenDf zuP#o}XCM3pXit1)d7kTq26`!N4Gp#F-3ZCaRifv7fA_rkU_0SAGkPq}3+-|4)0Ap? zZ!e($e#@dEgjjRw!kBc9xw&uF3B2XCC}_Vql(?z3t2k!h3t<^W&7~;W_o3}ecP|lE zx1%}v8^lOKR&s@1&1#%zl4_}+^$o65ocUj3`LLQJ0yozUCC4U z{@_iLrq9uQyTe4KAyxBwm=umz!rLl++H*cKB)ISiLa>_(a%72>9bMevB$ z1PT#bgUK% z$2vt5Re$5S@Wm(JM@Kfa&@xn~fCA8Lw3~zR`eilB5-zIQ^oh3^XZP%_`DHkNb5LTT z9KpYTpPnx@&D2zMq`sfA7=72vPj) zOHiyyxwXk@JZDxA z-pGRWUqAHY2qT8cDGS#khpPH*kpme08Ox?C$xDywIQPN?8S7Y5B$Ymy@uH%9A*aMZ zY(x6FkvW!pkf^_@n5~bSgdFO^p(56suw1R0^>8xqNVXUU@F5bR-uZvY16g$Y$<=?t zG+AO>PprhXC^#Utm@*gCbl%UXVmn+**{99Y6{{AfqA5Or&{X++WO6DnoOz~9X_7q% zbEbSwqgmqxc@%rT*M1yG6%{R7{-IVwtNCFafynI}AXsgJcNII&<)KRyVom0jYDQs! z>@51E_)P86hkto;8#Xh}i1%tLE*L4p@hM%)6Y2MM@`Ufa$HrvULDAdqd&$$JOiJZy zgJ2%y+R}5+Xdqu`5ViAk@sAZ(Q}LHbvOX+(WT;P`Xa}C?k5w*Y z5~?t;Qr)dBs-139>at#BH3`vN{iwRXZkJ?jMq%()E#Bh@pM9X)Lt}y2WlEUwLJq%*%1*Fq)!^g7Z3G#*{w|cooFK4M6{!#@;=MWpgZll2C=)1jg**7! z3Np~%bI@l~Z<)fiI{vM=-qt2}dS{E|pUs1>;_2ceLhaaOKmAvpisk#M`3 zwFkvlR%H^D8hGnc{Bt;eF|LRF>a-#DOWHeC%PZTzzs22#+ z?xOm5ZqiHpO3orE-NG|$>64G|QQHD%Mm=nl@YKpoKs1#|gn%P4nqxJO%lRJ5u1L>~ zfg(FJm&xe(6ho$QPww-ZwSb1~S%9(QyTUzU1_ADj!d_!GSO>&TEI^)Z3 ztM&vwx^A7>;fiO1U+5oDsdik&)fcn-uI*3cMzj_wFXSO)FFoW%#7T686|?!G)yCE- z^aqMAMWnRTdbH@=>$T@;1uJ$)nzaqkv&^oPNw|W!#LcZrnT#c0B?>gCNp*t)*ByDK z5no-A3CsohJq04$SpR7(wxZ4Vo99i!!GV#8kGUD_Db-!{AZv3`xDtDYW4jJonT z7Ir+5`asMrZxUG305b6=c;B~%XP=Y3vb;v3Mn)ZTnw1)`GBBr#8|svBJ7^@enAl;F zl3boVG>6i+^X5-MCo0xJeE^DB4W%%$I--JHZ)cz=h>7xGqL3%-YE&kF ziB4@zrCjutm)G#a@ka7-#bg}W{iAneVD@08!kua0^}t2Hwx5Zhqf<p4<@$KA)T$`_hBt-J=9=g@+kJY_1}v^i%tyMC-TKnTU*h+#rP8SF8VK*@-aOu z=apt$-&`E3_uDBssDAzo`7BL#{8>ecV!ZNc6#h%Qk2$4}Wp#|s)}@@YiA_T#8v6^e zI6P7Q9ABE;ux}!FlT_ZRQbZ@f%6MEHT|4KJSAZvr18Q$$f!j8{5equLORuAr-?Xa< zG4mZ^Co!Z(%NDlitoS2$EhrbDI=Z4nz*A=vC=T>KSm;=66pV%923y6?PLx)GBx*f6 zXfm1yk8XZhD{OXIp61_ZdUqPF*t3;IOE^E2%`KVzF8RRz2Mpd*3UU6iE8b&QSo_p7m?OS}6G2~e%-miV9 z><8@I8)VNz8P)AA=;u1tk{7*S#5}hq4p*Oy6Y-6j2PO}n||Vwfj@)rB4^A6Kmt6> z*!=G5+}5Z@jgGR$`pXvvikoBoTb8oE%mG!?+U~JuNsuRjB8yeYiub;1R+G;?S_kzc zq^Y-cT;I_3m_?G-F_iG&ax!NsZdPFg;8SrtsP1k*G{-e2w~B9`V!T^_SnJCY@u4J; z-$!>8lF({F{tgzV@T{PGz9-#%@w)yvE5UtkQLN{U{5{)B^U6ouUJ;@z1pw1M*cB6} o0BK^c+4&=^zRPR?T2Ld(9Wm9*xz_nxdQ&bTX+QQhK^)=#0XI>paR2}S diff --git a/tgstation.dme b/tgstation.dme index eb802519c1e..f83adf99c95 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9183,11 +9183,6 @@ #include "tff_modular\modules\tgmc_xenos\code\xeno_types\rouny.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\sentinel.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_types\spitter.dm" -#include "tff_modular\modules\tgmc_xenos\mortar\_mortar_defines.dm" -#include "tff_modular\modules\tgmc_xenos\mortar\mortar_shells.dm" -#include "tff_modular\modules\tgmc_xenos\mortar\mortars.dm" -#include "tff_modular\modules\tgmc_xenos\mortar\misc\fire_spread.dm" -#include "tff_modular\modules\tgmc_xenos\mortar\misc\rangefinder.dm" #include "tff_modular\modules\timed_citations\crime.dm" #include "tff_modular\modules\toys\code\loadout_datum_toys.dm" #include "tff_modular\modules\toys\code\plushes.dm" From bc8bfd5efea7b60ea9dd6517c4ab09d550c04ff6 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 12 Apr 2025 23:12:27 +0700 Subject: [PATCH 052/120] comments --- .../mob/living/carbon/alien/special/alien_embryo.dm | 2 +- tff_modular/modules/tgmc_xenos/readme.md | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 5ee1a8d89af..ad428a101bf 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -121,7 +121,7 @@ owner.add_overlay(overlay) var/atom/xeno_loc = get_turf(owner) - var/mob/living/carbon/alien/larva/new_xeno = new larva_path(xeno_loc) // FLUFFY FRONTIER EDIT - TGMC XENOS. ORIGINAL: var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) + var/mob/living/carbon/alien/larva/new_xeno = new larva_path(xeno_loc) // FLUFFY FRONTIER EDIT - TGMC_XENOS. ORIGINAL: var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.PossessByPlayer(ghost.key) SEND_SOUND(new_xeno, sound('sound/mobs/non-humanoids/hiss/hiss5.ogg',0,0,0,100)) //To get the player's attention new_xeno.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) //so we don't move during the bursting animation diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index b9e44503b81..c5424c46f4b 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -16,8 +16,11 @@ Additions: -- code/modules/mob/living/living_defense.dm: `/mob/living/attack_alien` -- code/modules/vehicles/mecha/_mecha.dm: `/obj/vehicle/sealed/mecha/proc/melee_attack_effect` +- code\game\objects\structures\aliens.dm: `/obj/structure/alien/egg` && `/obj/structure/alien/egg/Initialize()` +- code\modules\mob\living\carbon\alien\special\alien_embryo.dm: `/obj/item/organ/body_egg/alien_embryo` && `/obj/item/organ/body_egg/alien_embryo/proc/on_poll_concluded()` +- code\modules\mob\living\carbon\alien\special\facehugger.dm: `/obj/item/clothing/mask/facehugger` && `/obj/item/clothing/mask/facehugger/proc/Impregnate()` +- code/modules/mob/living/living_defense.dm: `/mob/living/attack_alien()` +- code/modules/vehicles/mecha/_mecha.dm: `/obj/vehicle/sealed/mecha/proc/melee_attack_effect()` ## Defines From 7fb17d72acb8e41c72f7948d403fa06038acd6d5 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 12 Apr 2025 23:44:19 +0700 Subject: [PATCH 053/120] fixing my silly decisions --- code/modules/mob/living/living_defense.dm | 5 ----- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 9 +++++++++ tff_modular/modules/tgmc_xenos/readme.md | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f7d5830b8d3..9bf84853874 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -532,11 +532,6 @@ return FALSE if(check_block(user, user.melee_damage_upper, "[user]'s slash", UNARMED_ATTACK, 0, BRUTE)) return FALSE - // FLUFFY FRONTIER ADIITION START - TGMC_XENOS - if(stat == DEAD) - to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) - return FALSE - // FLUFFY FRONTIER ADIITION END user.do_attack_animation(src) return TRUE diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 017a7255464..98e61cfbe5f 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -101,6 +101,15 @@ return FALSE if(fortify) return FALSE + if(ishuman(attack_target) && attack_target.stat == DEAD) + to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) + return FALSE + return ..() + +/mob/living/carbon/alien/adult/tgmc/grab(mob/living/target) + if(ishuman(target) && target.stat == DEAD) + to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) + return FALSE return ..() /mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index c5424c46f4b..37f39c0c992 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -19,7 +19,6 @@ Additions: - code\game\objects\structures\aliens.dm: `/obj/structure/alien/egg` && `/obj/structure/alien/egg/Initialize()` - code\modules\mob\living\carbon\alien\special\alien_embryo.dm: `/obj/item/organ/body_egg/alien_embryo` && `/obj/item/organ/body_egg/alien_embryo/proc/on_poll_concluded()` - code\modules\mob\living\carbon\alien\special\facehugger.dm: `/obj/item/clothing/mask/facehugger` && `/obj/item/clothing/mask/facehugger/proc/Impregnate()` -- code/modules/mob/living/living_defense.dm: `/mob/living/attack_alien()` - code/modules/vehicles/mecha/_mecha.dm: `/obj/vehicle/sealed/mecha/proc/melee_attack_effect()` ## Defines From 93f86fe9af2c34ff58436d32639dac461ec6fb6a Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sat, 12 Apr 2025 23:55:30 +0700 Subject: [PATCH 054/120] test for tests --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 98e61cfbe5f..f5d3de5443a 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -4,7 +4,7 @@ name = "rare bugged alien" icon = 'tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi' rotate_on_lying = FALSE - base_pixel_x = -16 //All of the xeno sprites are 64x64, and we want them to be level with the tile they are on, much like oversized quirk users + icon_w = 16 layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles maptext_height = 64 maptext_width = 64 From 222be0921191e263c07d692a18b45b4eb0a078b7 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 00:00:08 +0700 Subject: [PATCH 055/120] silly me (again) --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index f5d3de5443a..070c0416d3c 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -101,14 +101,16 @@ return FALSE if(fortify) return FALSE - if(ishuman(attack_target) && attack_target.stat == DEAD) - to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) - return FALSE + if(ishuman(attack_target)) + var/mob/living/carbon/human/target = attack_target + if(target.stat == DEAD) + to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) + return FALSE return ..() /mob/living/carbon/alien/adult/tgmc/grab(mob/living/target) if(ishuman(target) && target.stat == DEAD) - to_chat(user, span_warning("[src] is dead, why would we want to touch it?")) + to_chat(src, span_warning("[target] is dead, why would we want to touch it?")) return FALSE return ..() From f7d19a72efc2dd69bdb98d9cc5449960a87d8b93 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 00:16:57 +0700 Subject: [PATCH 056/120] =?UTF-8?q?=D0=A3=D1=80=D0=B0,=20=D0=BC=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B0=D0=B7=D1=80=D0=B5=D1=88=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=8D=D1=82=D1=83=20=D1=88=D1=82=D1=83=D0=BA?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 6 +----- tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 070c0416d3c..44ec7500173 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -41,15 +41,11 @@ var/evolution_cooldown_time = 90 SECONDS /// Determines if a xeno is unable to use abilities var/unable_to_use_abilities = FALSE - /// Pixel X shifting of the on fire overlay - var/on_fire_pixel_x = 16 - /// Pixel Y shifting of the on fire overlay - var/on_fire_pixel_y = 16 /// Все дополнительные органы, что должны находиться в телах ксеносов var/list/additional_organ_types_by_slot // Оффсет для худ-ов, чтобы они лучше соответствовали размерам ксеноса - var/hud_offset_x = 32 + var/hud_offset_x = 16 var/hud_offset_y = 0 // Урон по тяжелым транспортным штукам (типа мехов) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 4c0a9e97f53..55ed2387275 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -10,7 +10,6 @@ melee_damage_lower = 15 melee_damage_upper = 20 next_evolution = /mob/living/carbon/alien/adult/tgmc/ravager - on_fire_pixel_y = 0 additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small/tiny, From be2029ec020af5791e044c3aa26af9febbf571f6 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 00:18:37 +0700 Subject: [PATCH 057/120] =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D0=B2=D0=BE=D1=82?= =?UTF-8?q?=20=D1=8D=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 44ec7500173..f45b1434433 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -58,7 +58,6 @@ /mob/living/carbon/alien/adult/tgmc/Initialize(mapload) . = ..() real_name = "alien [caste]" - pixel_x = -16 set_armor(armor_type) From 291946940356a138e62ad31c104a82f87587005e Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 05:36:02 +0700 Subject: [PATCH 058/120] some changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлена броня в 100 к кислоте, био урону и вундам - переделана выдача TRAIT_IMMOBILIZED при переключении положения тела - добавлена возможность тушить других ксенов своими лапками - добавлена возможность ксеносам смотреть сквозь себя (так как они бошие) --- .../modules/tgmc_xenos/code/base_alien.dm | 35 ++++++------------- .../tgmc_xenos/code/defense/alien_defense.dm | 31 ++++++++++++++++ tgstation.dme | 1 + 3 files changed, 43 insertions(+), 24 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index f45b1434433..659252b4861 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -64,14 +64,9 @@ if(next_evolution) GRANT_ACTION(/datum/action/cooldown/alien/tgmc/generic_evolve) - ADD_TRAIT(src, TRAIT_XENO_HEAL_AURA, TRAIT_XENO_INNATE) - ADD_TRAIT(src, TRAIT_PIERCEIMMUNE, TRAIT_XENO_INNATE) + add_traits(list(TRAIT_XENO_HEAL_AURA, TRAIT_PIERCEIMMUNE), TRAIT_XENO_INNATE) AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) - RegisterSignal(src, COMSIG_LIVING_UPDATED_RESTING, PROC_REF(on_rest)) - -/mob/living/carbon/alien/adult/tgmc/Destroy() - . = ..() - UnregisterSignal(src, COMSIG_LIVING_UPDATED_RESTING) + AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/tgmc/create_internal_organs() if(additional_organ_types_by_slot) @@ -113,8 +108,8 @@ return get_armor_rating(type) /datum/armor/tgmc_alien - acid = 0 - bio = 0 + acid = 100 + bio = 100 bomb = 0 bullet = 0 consume = 0 @@ -122,7 +117,7 @@ laser = 0 fire = 0 melee = 0 - wound = 0 + wound = 100 /datum/movespeed_modifier/resin_speedup multiplicative_slowdown = -0.5 @@ -225,24 +220,16 @@ /mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) -/mob/living/carbon/alien/adult/tgmc/proc/on_rest() - SIGNAL_HANDLER - - if(resting) - // add_movespeed_modifier(/datum/movespeed_modifier/alien_rest) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) - else - // remove_movespeed_modifier(/datum/movespeed_modifier/alien_rest) - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) - /mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) if(fortify) balloon_alert(src, "Cannot while fortified") return FALSE - return ..() - -/datum/movespeed_modifier/alien_rest - multiplicative_slowdown = 5 + . = ..() + if(!isnull(.)) + if(new_resting) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + else + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) /mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) . = ..() diff --git a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm new file mode 100644 index 00000000000..a370b6b0708 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm @@ -0,0 +1,31 @@ +/// TGMC_XENOS (old nova sector xenos) + +/mob/living/carbon/alien/adult/tgmc/attack_alien(mob/living/carbon/alien/user, list/modifiers) + if(!user.combat_mode) + if(user == src) + return + if(on_fire && fire_stacks > 0) + adjust_fire_stacks(-2) + user.visible_message(span_danger("[user] tries to put out the fire on [src]!"), span_warning("You try to put out the fire on [src]!"), vision_distance = 5) + if(fire_stacks <= 0) + user.visible_message(span_danger("[user] has successfully extinguished the fire on [src]!"), span_notice("You extinguished the fire on [src]!"), vision_distance = 5) + else + set_resting(FALSE) + visible_message(span_notice("[user.name] nuzzles [src] trying to wake [p_them()] up!")) + playsound(loc, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) + AdjustStun(-6 SECONDS) + AdjustKnockdown(-6 SECONDS) + AdjustImmobilized(-6 SECONDS) + AdjustParalyzed(-6 SECONDS) + AdjustUnconscious(-6 SECONDS) + AdjustSleeping(-10 SECONDS) + else if(health > 0) + user.do_attack_animation(src, ATTACK_EFFECT_BITE) + playsound(loc, 'sound/items/weapons/bite.ogg', 50, TRUE, -1) + visible_message(span_danger("[user.name] bites [src]!"), \ + span_userdanger("[user.name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You bite [src]!")) + adjustBruteLoss(1) + log_combat(user, src, "attacked") + else + to_chat(user, span_warning("[name] is too injured for that.")) diff --git a/tgstation.dme b/tgstation.dme index bdf44136203..b69a6d7fd6f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9191,6 +9191,7 @@ #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" #include "tff_modular\modules\tgmc_xenos\code\organs.dm" +#include "tff_modular\modules\tgmc_xenos\code\defense\alien_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\larva.dm" From 61986cc3eae68cc023e7ac3a80f71b06515d0fc1 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 15:23:13 +0700 Subject: [PATCH 059/120] i do this but dont know why --- .../modules/tgmc_xenos/code/base_alien.dm | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 659252b4861..3cd027f0ce1 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -73,19 +73,6 @@ default_organ_types_by_slot += additional_organ_types_by_slot return ..() -/// Called when a larva or xeno evolves, adds a configurable timer on evolving again to the xeno -/mob/living/carbon/alien/adult/tgmc/proc/has_just_evolved() - if(has_evolved_recently) - return - has_evolved_recently = TRUE - addtimer(CALLBACK(src, PROC_REF(can_evolve_once_again)), evolution_cooldown_time) - -/// Allows xenos to evolve again if they are currently unable to -/mob/living/carbon/alien/adult/tgmc/proc/can_evolve_once_again() - if(!has_evolved_recently) - return - has_evolved_recently = FALSE - /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(body_position == LYING_DOWN) // Лежим - значит отдыхаем. Никакой войны во время отдыха return FALSE @@ -104,6 +91,20 @@ return FALSE return ..() +/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) + return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) + +/mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) + if(fortify) + balloon_alert(src, "Cannot while fortified") + return FALSE + . = ..() + if(!isnull(.)) + if(new_resting) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + else + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + /mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) return get_armor_rating(type) @@ -162,23 +163,6 @@ overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) -/mob/living/carbon/proc/get_max_plasma() - var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) - if(!vessel) - return -1 - return vessel.max_plasma - -/mob/living/carbon/alien/adult/tgmc/alien_evolve(mob/living/carbon/alien/new_xeno, is_it_a_larva) - var/mob/living/carbon/alien/adult/tgmc/xeno_to_transfer_to = new_xeno - - xeno_to_transfer_to.setDir(dir) - if(!islarva(xeno_to_transfer_to)) - xeno_to_transfer_to.has_just_evolved() - if(mind) - mind.name = xeno_to_transfer_to.real_name - mind.transfer_to(xeno_to_transfer_to) - qdel(src) - /mob/living/carbon/alien/adult/tgmc/get_fire_overlay(stacks, on_fire) var/fire_icon = "generic_fire" @@ -217,19 +201,35 @@ var/image/finder_eye = image('icons/hud/screen_alien.dmi', finder_icon, dir = Qdir) hud_used.alien_queen_finder.add_overlay(finder_eye) -/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) - return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) +/mob/living/carbon/alien/adult/tgmc/alien_evolve(mob/living/carbon/alien/new_xeno, is_it_a_larva) + var/mob/living/carbon/alien/adult/tgmc/xeno_to_transfer_to = new_xeno -/mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) - if(fortify) - balloon_alert(src, "Cannot while fortified") - return FALSE - . = ..() - if(!isnull(.)) - if(new_resting) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) - else - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + xeno_to_transfer_to.setDir(dir) + if(!islarva(xeno_to_transfer_to)) + xeno_to_transfer_to.has_just_evolved() + if(mind) + mind.name = xeno_to_transfer_to.real_name + mind.transfer_to(xeno_to_transfer_to) + qdel(src) + +/// Called when a larva or xeno evolves, adds a configurable timer on evolving again to the xeno +/mob/living/carbon/alien/adult/tgmc/proc/has_just_evolved() + if(has_evolved_recently) + return + has_evolved_recently = TRUE + addtimer(CALLBACK(src, PROC_REF(can_evolve_once_again)), evolution_cooldown_time) + +/// Allows xenos to evolve again if they are currently unable to +/mob/living/carbon/alien/adult/tgmc/proc/can_evolve_once_again() + if(!has_evolved_recently) + return + has_evolved_recently = FALSE + +/mob/living/carbon/proc/get_max_plasma() + var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) + if(!vessel) + return -1 + return vessel.max_plasma /mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) . = ..() From bf6a4f559dbbe49e2dc2c9aaa54ec75cfac918e0 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 19:27:13 +0700 Subject: [PATCH 060/120] juggling numbers & fixes & tackle for rav MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - У крика королевы увеличено время паралича и стана до 8 и 4 секунд соответственно - Добавлен такл для равагера - Немного исправлен такл раннера - Исправлена ошибка в проке melee_attack_effect - Исправлена ошибка из-за которой чардж не ломал стены - Чардж в меха со включенным щитом вызовет отключение этого щита и потратит огромное количество энергии - Убран множитель урона по мехам, его место заняло пробитие брони. У всех ксеносов теперь 15 пробития брони против мехов, у претора и равы 30, у крашера 35, у королевы 40 --- code/modules/vehicles/mecha/_mecha.dm | 6 +++--- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 2 +- .../tgmc_xenos/code/defense/mecha_defense.dm | 4 ++-- .../modules/tgmc_xenos/code/powers/charge.dm | 15 ++++++++++++++- .../modules/tgmc_xenos/code/xeno_types/crusher.dm | 2 +- .../tgmc_xenos/code/xeno_types/defender.dm | 2 -- .../modules/tgmc_xenos/code/xeno_types/drone.dm | 2 -- .../tgmc_xenos/code/xeno_types/praetorian.dm | 2 +- .../modules/tgmc_xenos/code/xeno_types/queen.dm | 6 +++--- .../modules/tgmc_xenos/code/xeno_types/ravager.dm | 3 ++- .../modules/tgmc_xenos/code/xeno_types/rouny.dm | 4 +--- .../tgmc_xenos/code/xeno_types/sentinel.dm | 2 -- .../modules/tgmc_xenos/code/xeno_types/spitter.dm | 1 - 13 files changed, 28 insertions(+), 23 deletions(-) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index b0b53988f68..24c6fc88f5f 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -922,11 +922,11 @@ if(heavy) // FLUFFY FRONTIER ADDITION START - TGMC_XENOS if(istgmcalien(victim)) - var/mob/living/carbon/alien/adult/tgmc/tgmc_alien + var/mob/living/carbon/alien/adult/tgmc/tgmc_alien = victim if(tgmc_alien.resist_heavy_hits) - if(health_percentage(victim) >= 35) + if(health_percentage(tgmc_alien) >= 35) return - if(!prob(50)) + if(!prob(50)) // 50% что при ударе по ослабленному ксеносу - он упадет в бессознательное состояние return // FLUFFY FRONTIER ADDITION END victim.Unconscious(2 SECONDS) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 3cd027f0ce1..a70709eda59 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -49,7 +49,7 @@ var/hud_offset_y = 0 // Урон по тяжелым транспортным штукам (типа мехов) - var/melee_vehicle_damage + var/mecha_armor_penetration = 15 var/resist_heavy_hits = FALSE // Включен ли в данный момент фортифай diff --git a/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm index 865ea95f7a7..ffbabe34bf3 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/mecha_defense.dm @@ -8,8 +8,8 @@ log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") playsound(loc, 'sound/items/weapons/slash.ogg', 100, TRUE) - var/damage = user.melee_vehicle_damage - attack_generic(user, damage, BRUTE, MELEE, 0) + var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) + attack_generic(user, damage, BRUTE, MELEE, 0, armor_penetration = user.mecha_armor_penetration) // Так как плевки не могут наносить урон мехам из-за их брони к кислоте, то мы просто будем переопределять armor_flag этих самых плевков с кислоты на лазер /obj/vehicle/sealed/mecha/bullet_act(obj/projectile/source, def_zone, mode) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm index 5ef379af8f0..a324b775861 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm @@ -96,6 +96,9 @@ var/damage = obj_damage if(ismecha(target)) damage = mecha_damage + var/obj/vehicle/sealed/mecha/target_mecha = target + if(target_mecha.defense_mode) + damage /= 2 else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/target_airlock = target damage = ceil(target_airlock.normal_integrity / 2) @@ -121,6 +124,16 @@ if(throw_mecha && (target.max_integrity < 400) && (dist_from_source <= 1)) target_mecha.safe_throw_at(throwtarget, 1, 1, source, spin = FALSE, force = MOVE_FORCE_EXTREMELY_STRONG) + if(target_mecha.defense_mode) + target_mecha.use_energy(damage * (STANDARD_CELL_CHARGE / 50)) + for(var/O in target_mecha.occupants) + var/mob/living/occupant = O + var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = LAZYACCESSASSOC(target_mecha.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) + if(isnull(action)) + continue + action.Trigger(forced_state = TRUE) + break + return if(crushed_obj.anchored) @@ -133,7 +146,7 @@ // Столокновение с турфами else if(isturf(target)) - var/turf/crushed_turf + var/turf/crushed_turf = target if(crush_walls) if(!isclosedturf(crushed_turf) || isindestructiblewall(crushed_turf)) return diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index dd06c6c00e8..62b24cb6fc7 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -17,7 +17,7 @@ hud_offset_y = -16 - melee_vehicle_damage = 40 + mecha_armor_penetration = 35 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/crusher/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index 5d4f8e02291..fb06657cdaa 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -16,8 +16,6 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/small, ) - melee_vehicle_damage = 30 - /mob/living/carbon/alien/adult/tgmc/defender/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm index b2af49af9ed..8f36e170644 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/drone.dm @@ -21,8 +21,6 @@ maptext_width = 32 hud_offset_y = -16 - melee_vehicle_damage = 20 - /mob/living/carbon/alien/adult/tgmc/drone/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index eafe6d5ffe0..e170325b2b4 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -19,7 +19,7 @@ ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/tgmc/large, ) - melee_vehicle_damage = 30 + mecha_armor_penetration = 30 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/praetorian/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index aa6f5da384f..f5c6fb0c187 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -19,7 +19,7 @@ ORGAN_SLOT_XENO_EGGSAC = /obj/item/organ/alien/eggsac/tgmc, ) - melee_vehicle_damage = 35 + mecha_armor_penetration = 40 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/queen/Initialize(mapload) @@ -77,10 +77,10 @@ var/distance_to_target = get_dist(queenie, screech_target) if(distance_to_target <= 4) to_chat(src, span_danger("An ear-splitting guttural roar shakes the ground beneath your feet!")) - screech_target.AdjustParalyzed(60) + screech_target.AdjustParalyzed(80) else if(distance_to_target >= 5 && distance_to_target < 7) to_chat(src, span_danger("The roar shakes your body to the core, freezing you in place!")) - screech_target.AdjustStun(30) + screech_target.AdjustStun(40) return TRUE diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index a7623a5d0c7..76d260be7ba 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -15,7 +15,7 @@ ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc ) - melee_vehicle_damage = 35 + mecha_armor_penetration = 30 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/ravager/Initialize(mapload) @@ -27,3 +27,4 @@ grant_actions_by_list(innate_actions) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 0, range = 8, speed = 2, skill_mod = 9, min_distance = 0) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 55ed2387275..631442cf2a8 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -19,8 +19,6 @@ maptext_width = 32 hud_offset_y = -32 - melee_vehicle_damage = 20 - /// Holds the evade ability to be granted to the runner later var/datum/action/cooldown/alien/tgmc/evade/evade_ability @@ -30,7 +28,7 @@ evade_ability.Grant(src) add_movespeed_modifier(/datum/movespeed_modifier/alien_quick) - AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 7, min_distance = 0) + AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 4, min_distance = 0) /mob/living/carbon/alien/adult/tgmc/runner/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) if(evade_ability) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 202a718d151..0bf8c22b1d0 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -21,8 +21,6 @@ maptext_width = 32 hud_offset_y = -16 - melee_vehicle_damage = 15 - /mob/living/carbon/alien/adult/tgmc/sentinel/Initialize(mapload) . = ..() var/static/list/innate_actions = list( diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 34253956d7f..3b014b70721 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -19,7 +19,6 @@ hud_offset_y = -16 - melee_vehicle_damage = 20 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) From 220aea33d001e324b577902871c0d3f42d8bf1a2 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 21:35:39 +0700 Subject: [PATCH 061/120] spit update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - урон у всех снарядов увеличен, но добавлен кулдаун на плевки - исправлен баг с отключением щита при чардже в него --- .../tgmc_xenos/code/misc/projectiles.dm | 12 +- .../tgmc_xenos/code/powers/acid_spit.dm | 166 ++++++++++++++++++ .../tgmc_xenos/code/powers/alien_powers.dm | 163 ----------------- .../modules/tgmc_xenos/code/powers/charge.dm | 2 +- tgstation.dme | 1 + 5 files changed, 174 insertions(+), 170 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm diff --git a/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm index f1c66dfc0db..ee696327264 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/projectiles.dm @@ -3,32 +3,32 @@ /obj/projectile/neurotoxin/tgmc name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 25 + damage = 80 paralyze = 0 damage_type = STAMINA armor_flag = BIO /obj/projectile/neurotoxin/tgmc/queen - damage = 40 + damage = 140 /obj/projectile/neurotoxin/tgmc/acid name = "acid spit" icon_state = "toxin" - damage = 20 + damage = 25 paralyze = 0 damage_type = BURN armor_flag = ACID /obj/projectile/neurotoxin/tgmc/acid/queen - damage = 25 + damage = 40 /obj/projectile/neurotoxin/tgmc/spitter_spread //Slightly nerfed because its a shotgun spread of these name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 25 + damage = 40 /obj/projectile/neurotoxin/tgmc/acid/spitter_spread name = "acid spit" icon_state = "toxin" - damage = 15 + damage = 20 damage_type = BURN diff --git a/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm b/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm new file mode 100644 index 00000000000..8fd43b0178a --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm @@ -0,0 +1,166 @@ +/// TGMC_XENOS (old nova sector xenos) + +// Наши личные нейротоксичные гланды, большую часть мехаана которых по хорошему бы на ТГ перенести, ведь у этих куда большая возможность настройки без боли +/datum/action/cooldown/alien/acid/tgmc + name = "Spit Neurotoxin" + desc = "Spits neurotoxin at someone, exhausting them." + button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' + button_icon_state = "neurospit_0" + plasma_cost = 40 + /// A singular projectile? Use this one and leave acid_casing null + var/acid_projectile = /obj/projectile/neurotoxin/tgmc + /// You want it to be more like a shotgun style attack? Use this one and make acid_projectile null + var/acid_casing + /// Used in to_chat messages to the owner + var/projectile_name = "neurotoxin" + /// The base icon for the ability, so a red box can be put on it using _0 or _1 + var/button_base_icon = "neurospit" + /// The sound that should be played when the xeno actually spits + var/spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid.ogg' + shared_cooldown = MOB_SHARED_COOLDOWN_3 + cooldown_time = 3 SECONDS + +/datum/action/cooldown/alien/acid/tgmc/IsAvailable(feedback = FALSE) + return ..() && isturf(owner.loc) + +/datum/action/cooldown/alien/acid/tgmc/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_notice("You prepare your [projectile_name] gland. Left-click to fire at a target!")) + + button_icon_state = "[button_base_icon]_1" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/tgmc/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + if(refund_cooldown) + to_chat(on_who, span_notice("You empty your [projectile_name] gland.")) + + button_icon_state = "[button_base_icon]_0" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/tgmc/InterceptClickOn(mob/living/clicker, params, atom/target) + . = ..() + if(!.) + return FALSE + + var/turf/user_turf = clicker.loc + var/turf/target_turf = get_step(clicker, target.dir) + if(!isturf(target_turf)) + return FALSE + + var/modifiers = params2list(params) + clicker.visible_message( + span_danger("[clicker] spits [projectile_name]!"), + span_alertalien("You spit [projectile_name]."), + ) + + if(acid_projectile) + var/obj/projectile/spit_projectile = new acid_projectile(clicker.loc) + spit_projectile.aim_projectile(target, clicker, modifiers) + spit_projectile.firer = clicker + spit_projectile.fire() + playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) + clicker.newtonian_move(get_dir(target_turf, user_turf)) + StartCooldown() + return TRUE + + if(acid_casing) + var/obj/item/ammo_casing/casing = new acid_casing(clicker.loc) + playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) + casing.fire_casing(target, clicker, null, null, null, ran_zone(), 0, clicker) + clicker.newtonian_move(get_dir(target_turf, user_turf)) + StartCooldown() + return TRUE + + CRASH("Neither acid_projectile or acid_casing are set on [clicker]'s spit attack!") + +/datum/action/cooldown/alien/acid/tgmc/Activate(atom/target) + return TRUE + + +// Летальная версия плевка +/datum/action/cooldown/alien/acid/tgmc/lethal + name = "Spit Acid" + desc = "Spits neurotoxin at someone, burning them." + acid_projectile = /obj/projectile/neurotoxin/tgmc/acid + button_icon_state = "acidspit_0" + projectile_name = "acid" + button_base_icon = "acidspit" + + +// Королевские версии плевков нейротоксина +/datum/action/cooldown/alien/acid/tgmc/queen + acid_projectile = /obj/projectile/neurotoxin/tgmc/queen + cooldown_time = 6 SECONDS + +/datum/action/cooldown/alien/acid/tgmc/lethal/queen + acid_projectile = /obj/projectile/neurotoxin/tgmc/acid/queen + + +// Версия плевка нейротоксина, который работает как дробовик +/datum/action/cooldown/alien/acid/tgmc/spread + name = "Spit Neurotoxin Spread" + desc = "Spits a spread neurotoxin at someone, exhausting them." + plasma_cost = 50 + acid_projectile = null + acid_casing = /obj/item/ammo_casing/xenospit + spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid2.ogg' + cooldown_time = 5 SECONDS + +// Немного хренового кода, но блин, какой же прошлый кодер крутой, что нашел такой забавный способ) +/obj/item/ammo_casing/xenospit //This is probably really bad, however I couldn't find any other nice way to do this + name = "big glob of neurotoxin" + projectile_type = /obj/projectile/neurotoxin/tgmc/spitter_spread + pellets = 3 + variance = 20 + +/obj/item/ammo_casing/xenospit/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/xenospit/tk_firing(mob/living/user, atom/fired_from) + return FALSE + + +// Летальная версия дробовик-плевка +/datum/action/cooldown/alien/acid/tgmc/spread/lethal + name = "Spit Acid Spread" + desc = "Spits a spread of acid at someone, burning them." + acid_projectile = null + acid_casing = /obj/item/ammo_casing/xenospit/spread/lethal + button_icon_state = "acidspit_0" + projectile_name = "acid" + button_base_icon = "acidspit" + +/obj/item/ammo_casing/xenospit/spread/lethal + name = "big glob of acid" + projectile_type = /obj/projectile/neurotoxin/tgmc/acid/spitter_spread + pellets = 4 + variance = 30 + + +// Плевок кислоты +/datum/action/cooldown/alien/acid/corrosion/tgmc + name = "Corrosive Acid (150)" + desc = "Drench an object in acid, destroying it over time." + button_icon_state = "alien_acid" + plasma_cost = 150 + corrosion_acid_power = 100 + corrosion_acid_volume = 500 + +/datum/action/cooldown/alien/acid/corrosion/tgmc/strong + name = "Corrosive Acid (200)" + desc = "Drench an object in acid, destroying it over time." + button_icon_state = "alien_acid" + plasma_cost = 200 + corrosion_acid_power = 400 + corrosion_acid_volume = 1000 + diff --git a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm index f82f5534bd2..32b10e40ead 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm @@ -70,169 +70,6 @@ return TRUE -// Наши личные нейротоксичные гланды, большую часть мехаана которых по хорошему бы на ТГ перенести, ведь у этих куда большая возможность настройки без боли -/datum/action/cooldown/alien/acid/tgmc - name = "Spit Neurotoxin" - desc = "Spits neurotoxin at someone, exhausting them." - button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' - button_icon_state = "neurospit_0" - plasma_cost = 40 - /// A singular projectile? Use this one and leave acid_casing null - var/acid_projectile = /obj/projectile/neurotoxin/tgmc - /// You want it to be more like a shotgun style attack? Use this one and make acid_projectile null - var/acid_casing - /// Used in to_chat messages to the owner - var/projectile_name = "neurotoxin" - /// The base icon for the ability, so a red box can be put on it using _0 or _1 - var/button_base_icon = "neurospit" - /// The sound that should be played when the xeno actually spits - var/spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid.ogg' - shared_cooldown = MOB_SHARED_COOLDOWN_3 - cooldown_time = 5 SECONDS - -/datum/action/cooldown/alien/acid/tgmc/IsAvailable(feedback = FALSE) - return ..() && isturf(owner.loc) - -/datum/action/cooldown/alien/acid/tgmc/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - - to_chat(on_who, span_notice("You prepare your [projectile_name] gland. Left-click to fire at a target!")) - - button_icon_state = "[button_base_icon]_1" - build_all_button_icons() - on_who.update_icons() - -/datum/action/cooldown/alien/acid/tgmc/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - if(refund_cooldown) - to_chat(on_who, span_notice("You empty your [projectile_name] gland.")) - - button_icon_state = "[button_base_icon]_0" - build_all_button_icons() - on_who.update_icons() - -/datum/action/cooldown/alien/acid/tgmc/InterceptClickOn(mob/living/clicker, params, atom/target) - . = ..() - if(!.) - unset_click_ability(clicker, refund_cooldown = FALSE) - return FALSE - - var/turf/user_turf = clicker.loc - var/turf/target_turf = get_step(clicker, target.dir) - if(!isturf(target_turf)) - return FALSE - - var/modifiers = params2list(params) - clicker.visible_message( - span_danger("[clicker] spits [projectile_name]!"), - span_alertalien("You spit [projectile_name]."), - ) - - if(acid_projectile) - var/obj/projectile/spit_projectile = new acid_projectile(clicker.loc) - spit_projectile.aim_projectile(target, clicker, modifiers) - spit_projectile.firer = clicker - spit_projectile.fire() - playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) - clicker.newtonian_move(get_dir(target_turf, user_turf)) - return TRUE - - if(acid_casing) - var/obj/item/ammo_casing/casing = new acid_casing(clicker.loc) - playsound(clicker, spit_sound, 100, TRUE, 5, 0.9) - casing.fire_casing(target, clicker, null, null, null, ran_zone(), 0, clicker) - clicker.newtonian_move(get_dir(target_turf, user_turf)) - return TRUE - - CRASH("Neither acid_projectile or acid_casing are set on [clicker]'s spit attack!") - -/datum/action/cooldown/alien/acid/tgmc/Activate(atom/target) - return TRUE - - -// Летальная версия плевка -/datum/action/cooldown/alien/acid/tgmc/lethal - name = "Spit Acid" - desc = "Spits neurotoxin at someone, burning them." - acid_projectile = /obj/projectile/neurotoxin/tgmc/acid - button_icon_state = "acidspit_0" - projectile_name = "acid" - button_base_icon = "acidspit" - - -// Королевские версии плевков нейротоксина -/datum/action/cooldown/alien/acid/tgmc/queen - acid_projectile = /obj/projectile/neurotoxin/tgmc/queen - -/datum/action/cooldown/alien/acid/tgmc/lethal/queen - acid_projectile = /obj/projectile/neurotoxin/tgmc/acid/queen - - -// Версия плевка нейротоксина, который работает как дробовик -/datum/action/cooldown/alien/acid/tgmc/spread - name = "Spit Neurotoxin Spread" - desc = "Spits a spread neurotoxin at someone, exhausting them." - plasma_cost = 50 - acid_projectile = null - acid_casing = /obj/item/ammo_casing/xenospit - spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid2.ogg' - cooldown_time = 10 SECONDS - -// Немного хренового кода, но блин, какой же прошлый кодер крутой, что нашел такой забавный способ) -/obj/item/ammo_casing/xenospit //This is probably really bad, however I couldn't find any other nice way to do this - name = "big glob of neurotoxin" - projectile_type = /obj/projectile/neurotoxin/tgmc/spitter_spread - pellets = 3 - variance = 20 - -/obj/item/ammo_casing/xenospit/Initialize(mapload) - . = ..() - AddElement(/datum/element/caseless) - -/obj/item/ammo_casing/xenospit/tk_firing(mob/living/user, atom/fired_from) - return FALSE - - -// Летальная версия дробовик-плевка -/datum/action/cooldown/alien/acid/tgmc/spread/lethal - name = "Spit Acid Spread" - desc = "Spits a spread of acid at someone, burning them." - acid_projectile = null - acid_casing = /obj/item/ammo_casing/xenospit/spread/lethal - button_icon_state = "acidspit_0" - projectile_name = "acid" - button_base_icon = "acidspit" - -/obj/item/ammo_casing/xenospit/spread/lethal - name = "big glob of acid" - projectile_type = /obj/projectile/neurotoxin/tgmc/acid/spitter_spread - pellets = 4 - variance = 30 - - -// Плевок кислоты -/datum/action/cooldown/alien/acid/corrosion/tgmc - name = "Corrosive Acid (150)" - desc = "Drench an object in acid, destroying it over time." - button_icon_state = "alien_acid" - plasma_cost = 150 - corrosion_acid_power = 100 - corrosion_acid_volume = 500 - -/datum/action/cooldown/alien/acid/corrosion/tgmc/strong - name = "Corrosive Acid (200)" - desc = "Drench an object in acid, destroying it over time." - button_icon_state = "alien_acid" - plasma_cost = 200 - corrosion_acid_power = 400 - corrosion_acid_volume = 1000 - - // Хил-аура дрона /datum/action/cooldown/alien/tgmc/heal_aura name = "Healing Aura" diff --git a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm index a324b775861..7958deefc94 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm @@ -131,7 +131,7 @@ var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = LAZYACCESSASSOC(target_mecha.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) if(isnull(action)) continue - action.Trigger(forced_state = TRUE) + action.Trigger(TRIGGER_FORCE_AVAILABLE, forced_state = TRUE) break return diff --git a/tgstation.dme b/tgstation.dme index b69a6d7fd6f..e9c6510bb09 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9198,6 +9198,7 @@ #include "tff_modular\modules\tgmc_xenos\code\misc\projectiles.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\resin_walker.dm" #include "tff_modular\modules\tgmc_xenos\code\misc\tgmc_alien_event.dm" +#include "tff_modular\modules\tgmc_xenos\code\powers\acid_spit.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\alien_powers.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\charge.dm" #include "tff_modular\modules\tgmc_xenos\code\powers\tailsweep.dm" From a752729933e67ff72a59059c77af8c81e89d8f80 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 13 Apr 2025 21:51:51 +0700 Subject: [PATCH 062/120] spit cooldown feedback --- tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm b/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm index 8fd43b0178a..665a18682d6 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm @@ -19,6 +19,7 @@ var/spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid.ogg' shared_cooldown = MOB_SHARED_COOLDOWN_3 cooldown_time = 3 SECONDS + var/too_much_clicks = 0 // Костыль, чтобы выключать способность не сразу, а только в экстренных ситуациях /datum/action/cooldown/alien/acid/tgmc/IsAvailable(feedback = FALSE) return ..() && isturf(owner.loc) @@ -49,8 +50,15 @@ /datum/action/cooldown/alien/acid/tgmc/InterceptClickOn(mob/living/clicker, params, atom/target) . = ..() if(!.) + if(too_much_clicks >= 2) + unset_click_ability(clicker, refund_cooldown = FALSE) + too_much_clicks = 0 + else + too_much_clicks += 1 + clicker.balloon_alert(clicker, "Not ready!") return FALSE + too_much_clicks = 0 var/turf/user_turf = clicker.loc var/turf/target_turf = get_step(clicker, target.dir) if(!isturf(target_turf)) From 40f0ac4696bf071ab248fc7e4ef9bfca8475ec8f Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Mon, 14 Apr 2025 02:19:02 +0700 Subject: [PATCH 063/120] want a hug? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Хаггеры теперь прыгают из яйца на проходящих рядом жертв. Ради баланса хаггеры, что не в яйце имеют куда меньший радиус (ванильный) - Добавлена возможность вернуть хаггера в яйцо обратно + он сам возвращается туда через время, если вокруг нет жертв - Изменена выдача модификатора скорости у ксенов - Временно (Но скорее всего навсегда) убрано отображение хаггера в руках ксеноса --- .../modules/tgmc_xenos/code/base_alien.dm | 24 +++-------- .../modules/tgmc_xenos/code/misc/larva.dm | 8 ++++ .../tgmc_xenos/code/misc/resin_walker.dm | 4 ++ .../code/structures/alien_structures.dm | 41 +++++++++++++++++++ .../tgmc_xenos/code/xeno_types/crusher.dm | 2 +- .../tgmc_xenos/code/xeno_types/defender.dm | 2 +- .../tgmc_xenos/code/xeno_types/praetorian.dm | 2 +- .../tgmc_xenos/code/xeno_types/queen.dm | 2 +- .../tgmc_xenos/code/xeno_types/rouny.dm | 2 +- .../tgmc_xenos/code/xeno_types/sentinel.dm | 3 +- .../tgmc_xenos/code/xeno_types/spitter.dm | 2 +- 11 files changed, 66 insertions(+), 26 deletions(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index a70709eda59..1d28e91ba3d 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -120,24 +120,11 @@ melee = 0 wound = 100 -/datum/movespeed_modifier/resin_speedup - multiplicative_slowdown = -0.5 - -/datum/movespeed_modifier/alien_quick - multiplicative_slowdown = -0.5 - -/datum/movespeed_modifier/alien_slow - multiplicative_slowdown = 0.5 - -/datum/movespeed_modifier/alien_heavy - multiplicative_slowdown = 1 - -/datum/movespeed_modifier/alien_big - multiplicative_slowdown = 2 - /mob/living/carbon/alien/adult/tgmc/update_held_items() - ..() + . = ..() remove_overlay(HANDS_LAYER) + // Временное(ложь) решение, из-за сложностей с получением иконок для всех ксенов, а так же неопределенностью, связанной с icon_w, pixel_w и т.п + /* var/list/hands = list() var/obj/item/l_hand = get_item_for_held_index(1) @@ -147,7 +134,7 @@ itm_state = l_hand.icon_state var/mutable_appearance/l_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) if(l_hand.blocks_emissive) - l_hand_item.overlays += emissive_blocker(l_hand_item.icon, l_hand_item.icon_state, alpha = l_hand_item.alpha) + l_hand_item.overlays += emissive_blocker(l_hand_item.icon, l_hand_item.icon_state, src, alpha = l_hand_item.alpha) hands += l_hand_item var/obj/item/r_hand = get_item_for_held_index(2) @@ -157,11 +144,12 @@ itm_state = r_hand.icon_state var/mutable_appearance/r_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) if(r_hand.blocks_emissive) - r_hand_item.overlays += emissive_blocker(r_hand_item.icon, r_hand_item.icon_state, alpha = r_hand_item.alpha) + r_hand_item.overlays += emissive_blocker(r_hand_item.icon, r_hand_item.icon_state, src, alpha = r_hand_item.alpha) hands += r_hand_item overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) + */ /mob/living/carbon/alien/adult/tgmc/get_fire_overlay(stacks, on_fire) var/fire_icon = "generic_fire" diff --git a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm index ed3a1ead5b8..4714a50eff5 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/larva.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/larva.dm @@ -4,6 +4,14 @@ /obj/item/clothing/mask/facehugger/tgmc embryo_path = /obj/item/organ/body_egg/alien_embryo/tgmc +/obj/item/clothing/mask/facehugger/tgmc/proc/ProximityLeap(range = 1) + for(var/mob/M in range(range, src)) + if(!CanHug(M)) + continue + Leap(M) + return TRUE + return FALSE + // То же самое, но для эмбриона ларвочки /obj/item/organ/body_egg/alien_embryo/tgmc larva_path = /mob/living/carbon/alien/larva/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm b/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm index 1989f1e659f..3b986fddd5b 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm @@ -27,3 +27,7 @@ source.add_movespeed_modifier(on_resin_modifier) else source.remove_movespeed_modifier(on_resin_modifier) + + +/datum/movespeed_modifier/resin_speedup + multiplicative_slowdown = -0.5 diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index 5e2509c55e8..d0330d48aa1 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -3,6 +3,47 @@ /obj/structure/alien/egg/tgmc child_path = /obj/item/clothing/mask/facehugger/tgmc + var/leap_range = 3 + var/return_timer + +/obj/structure/alien/egg/tgmc/Grow() + . = ..() + proximity_monitor.set_range(leap_range - 1) + +/obj/structure/alien/egg/tgmc/finish_bursting(kill = TRUE) + if(child) + var/obj/item/clothing/mask/facehugger/tgmc/child_hugger = child + child_hugger.forceMove(get_turf(src)) + // TECHNICALLY you could put non-facehuggers in the child var + if(istype(child_hugger, child_path)) + if(kill) + child_hugger.Die() + else + child_hugger.ProximityLeap(leap_range) + return_timer = addtimer(CALLBACK(src, PROC_REF(return_child)), 15 SECONDS, TIMER_UNIQUE|TIMER_DELETE_ME) + return ..() + +/obj/structure/alien/egg/tgmc/proc/return_child(obj/item/clothing/mask/facehugger/hugger) + if(isnull(hugger)) + hugger = locate(child_path) in loc + + if(!istype(hugger, child_path)) + return FALSE + + hugger.forceMove(src) + child = hugger + proximity_monitor.set_range(leap_range - 1) + + status = "grown" + update_appearance() + return TRUE + +/obj/structure/alien/egg/tgmc/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, child_path)) + return return_child(tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_FAILURE + return ..() + + /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature) // Мы подняли температуру, при которой начинает наноситься урон до ~72 градусов. Иначе на какой-нибудь серенити просто атмос улицы будет убивать резину return exposed_temperature > 345 diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm index 62b24cb6fc7..95e8e60af83 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/crusher.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 + alien_speed = 1.5 additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc @@ -27,5 +28,4 @@ ) grant_actions_by_list(innate_actions) - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm index fb06657cdaa..6da915df195 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/defender.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 + alien_speed = 1 next_evolution = /mob/living/carbon/alien/adult/tgmc/crusher additional_organ_types_by_slot = list( @@ -24,7 +25,6 @@ ) grant_actions_by_list(innate_actions) - add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /mob/living/carbon/alien/adult/tgmc/defender/update_icons() diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm index e170325b2b4..8e32a40be6d 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/praetorian.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 25 melee_damage_upper = 30 + alien_speed = 2 next_evolution = /mob/living/carbon/alien/adult/tgmc/queen additional_organ_types_by_slot = list( @@ -30,5 +31,4 @@ ) grant_actions_by_list(innate_actions) - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index f5c6fb0c187..7e1c1b9ffaa 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 + alien_speed = 2 additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/large/queen, @@ -30,7 +31,6 @@ ) grant_actions_by_list(innate_actions) - add_movespeed_modifier(/datum/movespeed_modifier/alien_big) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /mob/living/carbon/alien/adult/tgmc/queen/alien_talk(message, shown_name = name) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 631442cf2a8..36f02ebcb2d 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -9,6 +9,7 @@ health = 150 melee_damage_lower = 15 melee_damage_upper = 20 + alien_speed = -0.5 next_evolution = /mob/living/carbon/alien/adult/tgmc/ravager additional_organ_types_by_slot = list( @@ -27,7 +28,6 @@ evade_ability = new(src) evade_ability.Grant(src) - add_movespeed_modifier(/datum/movespeed_modifier/alien_quick) AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 4, min_distance = 0) /mob/living/carbon/alien/adult/tgmc/runner/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm index 0bf8c22b1d0..18336e26d6b 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/sentinel.dm @@ -9,6 +9,7 @@ health = 200 melee_damage_lower = 10 melee_damage_upper = 15 + alien_speed = 0.5 next_evolution = /mob/living/carbon/alien/adult/tgmc/spitter additional_organ_types_by_slot = list( @@ -27,5 +28,3 @@ /datum/action/cooldown/mob_cooldown/sneak/alien, ) grant_actions_by_list(innate_actions) - - add_movespeed_modifier(/datum/movespeed_modifier/alien_slow) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm index 3b014b70721..5c6b503dd7c 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/spitter.dm @@ -10,6 +10,7 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 15 melee_damage_upper = 20 + alien_speed = 1 additional_organ_types_by_slot = list( ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc, @@ -23,5 +24,4 @@ /mob/living/carbon/alien/adult/tgmc/spitter/Initialize(mapload) . = ..() - add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) From 4438d624534e0aaba9e6ce331df9759a812c6e98 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Mon, 14 Apr 2025 03:42:08 +0700 Subject: [PATCH 064/120] temporary_thing --- code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm | 2 -- tff_modular/modules/tgmc_xenos/code/xeno_defines.dm | 2 ++ tgstation.dme | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/xeno_defines.dm diff --git a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm index 5769ce3ccd7..9b3ae25f1ff 100644 --- a/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm +++ b/code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm @@ -4,5 +4,3 @@ #define TRAIT_XENO_ABILITY_GIVEN "xeno_ability_given" /// Determines if something can receive healing from a xeno #define TRAIT_XENO_HEAL_AURA "trait_xeno_heal_aura" -/// Defender fortify ability -#define TRAIT_XENO_FORTIFY "xeno_fortify" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/xeno_defines.dm new file mode 100644 index 00000000000..fa5f56134c7 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/xeno_defines.dm @@ -0,0 +1,2 @@ +/// Defender fortify ability +#define TRAIT_XENO_FORTIFY "xeno_fortify" diff --git a/tgstation.dme b/tgstation.dme index e9c6510bb09..d4cc3ea6c2b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9191,6 +9191,7 @@ #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" #include "tff_modular\modules\tgmc_xenos\code\organs.dm" +#include "tff_modular\modules\tgmc_xenos\code\xeno_defines.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\alien_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" From 89229f785f56d82353b715906920e7d76a12757a Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 17 Apr 2025 22:25:12 +0700 Subject: [PATCH 065/120] bugfixes + qol + code things MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Обновлены комментарии - Изменены названия файлов - Добавлено значение по умолчанию для резинволкера - Исправлены оффсеты, отображение огня и способность seethrough - Органы теперь лечатся, если ксенос лежит на резине. Так же глаза ксеносов теперь не могут получить шармы --- .../modules/tgmc_xenos/code/base_alien.dm | 47 ++++++++++++++----- .../tgmc_xenos/code/defense/alien_defense.dm | 37 ++++++--------- .../tgmc_xenos/code/misc/resin_walker.dm | 2 +- .../tgmc_xenos/code/misc/tgmc_alien_event.dm | 4 +- .../code/structures/alien_structures.dm | 1 - .../code/{bodyparts.dm => xeno_bodyparts.dm} | 0 .../code/{organs.dm => xeno_organs.dm} | 19 ++++++-- tgstation.dme | 4 +- 8 files changed, 70 insertions(+), 44 deletions(-) rename tff_modular/modules/tgmc_xenos/code/{bodyparts.dm => xeno_bodyparts.dm} (100%) rename tff_modular/modules/tgmc_xenos/code/{organs.dm => xeno_organs.dm} (81%) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 1d28e91ba3d..797d24e246d 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -4,11 +4,12 @@ name = "rare bugged alien" icon = 'tff_modular/modules/tgmc_xenos/icons/big_xenos.dmi' rotate_on_lying = FALSE - icon_w = 16 + base_pixel_w = -16 layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles maptext_height = 64 maptext_width = 64 pressure_resistance = 200 + satiety = MAX_SATIETY // Костыльная необходимость для того, чтобы органы лечились с armor_type = /datum/armor/tgmc_alien @@ -25,7 +26,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain/alien, ORGAN_SLOT_XENO_HIVENODE = /obj/item/organ/alien/hivenode, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/alien, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/alien, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/alien/tgmc, ORGAN_SLOT_LIVER = /obj/item/organ/liver/alien, ORGAN_SLOT_EARS = /obj/item/organ/ears, ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, @@ -45,11 +46,15 @@ var/list/additional_organ_types_by_slot // Оффсет для худ-ов, чтобы они лучше соответствовали размерам ксеноса - var/hud_offset_x = 16 + var/hud_offset_x = 32 var/hud_offset_y = 0 + // Оффсет для огня + var/fire_offset_x = 16 + var/fire_offset_y = 0 // Урон по тяжелым транспортным штукам (типа мехов) var/mecha_armor_penetration = 15 + // Способность выдержать тяжелые удары мехов и не потерять сознание var/resist_heavy_hits = FALSE // Включен ли в данный момент фортифай @@ -59,6 +64,7 @@ . = ..() real_name = "alien [caste]" + update_offsets() // Необходимо, чтобы base_pixel_w применился set_armor(armor_type) if(next_evolution) @@ -68,6 +74,12 @@ AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) AddComponent(/datum/component/seethrough_mob) + RegisterSignal(src, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(body_position_changed)) + +/mob/living/carbon/alien/adult/tgmc/Destroy() + . = ..() + UnregisterSignal(src, COMSIG_LIVING_SET_BODY_POSITION) + /mob/living/carbon/alien/adult/tgmc/create_internal_organs() if(additional_organ_types_by_slot) default_organ_types_by_slot += additional_organ_types_by_slot @@ -91,19 +103,19 @@ return FALSE return ..() -/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset = 0, y_offset = 0) - return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) - /mob/living/carbon/alien/adult/tgmc/set_resting(new_resting, silent = TRUE, instant = FALSE) if(fortify) balloon_alert(src, "Cannot while fortified") return FALSE - . = ..() - if(!isnull(.)) - if(new_resting) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) - else - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) + return ..() + +/mob/living/carbon/alien/adult/tgmc/proc/body_position_changed(datum/source, new_value, old_value) + SIGNAL_HANDLER + + if(new_value == LYING_DOWN) + add_traits(list(TRAIT_IMMOBILIZED), LYING_DOWN_TRAIT) + else + remove_traits(list(TRAIT_IMMOBILIZED), LYING_DOWN_TRAIT) /mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) return get_armor_rating(type) @@ -161,10 +173,21 @@ -HIGHEST_LAYER, appearance_flags = RESET_COLOR, ) + var/matrix/M = matrix(fire_offset_x, fire_offset_y, MATRIX_TRANSLATE) + new_fire_overlay.transform = M GLOB.fire_appearances[fire_icon] = new_fire_overlay return GLOB.fire_appearances[fire_icon] +/mob/living/carbon/alien/adult/tgmc/add_shared_particles(particle_type, custom_key, particle_flags, pool_size) + . = ..() + var/obj/particle_holder = . + particle_holder.pixel_x = fire_offset_x + particle_holder.pixel_y = fire_offset_y + +/mob/living/carbon/alien/adult/tgmc/set_hud_image_state(hud_type, hud_state, x_offset, y_offset) + return ..(hud_type, hud_state, hud_offset_x, hud_offset_y) + //Yes we really do need to do this whole thing to let the queen finder work /mob/living/carbon/alien/adult/tgmc/findQueen() if(hud_used) diff --git a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm index a370b6b0708..712e3950a5c 100644 --- a/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm +++ b/tff_modular/modules/tgmc_xenos/code/defense/alien_defense.dm @@ -4,28 +4,21 @@ if(!user.combat_mode) if(user == src) return + + playsound(loc, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) if(on_fire && fire_stacks > 0) adjust_fire_stacks(-2) - user.visible_message(span_danger("[user] tries to put out the fire on [src]!"), span_warning("You try to put out the fire on [src]!"), vision_distance = 5) - if(fire_stacks <= 0) + + if(fire_stacks > 0) + user.visible_message(span_danger("[user] tries to put out the fire on [src]!"), span_warning("You try to put out the fire on [src]!"), vision_distance = 5) + else user.visible_message(span_danger("[user] has successfully extinguished the fire on [src]!"), span_notice("You extinguished the fire on [src]!"), vision_distance = 5) - else - set_resting(FALSE) - visible_message(span_notice("[user.name] nuzzles [src] trying to wake [p_them()] up!")) - playsound(loc, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) - AdjustStun(-6 SECONDS) - AdjustKnockdown(-6 SECONDS) - AdjustImmobilized(-6 SECONDS) - AdjustParalyzed(-6 SECONDS) - AdjustUnconscious(-6 SECONDS) - AdjustSleeping(-10 SECONDS) - else if(health > 0) - user.do_attack_animation(src, ATTACK_EFFECT_BITE) - playsound(loc, 'sound/items/weapons/bite.ogg', 50, TRUE, -1) - visible_message(span_danger("[user.name] bites [src]!"), \ - span_userdanger("[user.name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You bite [src]!")) - adjustBruteLoss(1) - log_combat(user, src, "attacked") - else - to_chat(user, span_warning("[name] is too injured for that.")) + + AdjustStun(-6 SECONDS) + AdjustKnockdown(-6 SECONDS) + AdjustImmobilized(-6 SECONDS) + AdjustParalyzed(-6 SECONDS) + AdjustUnconscious(-6 SECONDS) + AdjustSleeping(-10 SECONDS) + return + return ..() diff --git a/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm b/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm index 3b986fddd5b..a7febfc3809 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/resin_walker.dm @@ -7,7 +7,7 @@ var/datum/movespeed_modifier/on_resin_modifier -/datum/element/resin_walker/Attach(datum/target, datum/movespeed_modifier/on_resin_modifier) +/datum/element/resin_walker/Attach(datum/target, datum/movespeed_modifier/on_resin_modifier = /datum/movespeed_modifier/resin_speedup) . = ..() if (!isliving(target)) return ELEMENT_INCOMPATIBLE diff --git a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm index 15a8d2fd745..051cf52197f 100644 --- a/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm +++ b/tff_modular/modules/tgmc_xenos/code/misc/tgmc_alien_event.dm @@ -18,9 +18,7 @@ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] if(!temp_vent_parent) - continue//no parent vent - //Stops Aliens getting stuck in small networks. - //See: Security, Virology + continue if(temp_vent_parent.other_atmos_machines.len > 20) vents += temp_vent diff --git a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm index d0330d48aa1..457262ad1e3 100644 --- a/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm +++ b/tff_modular/modules/tgmc_xenos/code/structures/alien_structures.dm @@ -14,7 +14,6 @@ if(child) var/obj/item/clothing/mask/facehugger/tgmc/child_hugger = child child_hugger.forceMove(get_turf(src)) - // TECHNICALLY you could put non-facehuggers in the child var if(istype(child_hugger, child_path)) if(kill) child_hugger.Die() diff --git a/tff_modular/modules/tgmc_xenos/code/bodyparts.dm b/tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm similarity index 100% rename from tff_modular/modules/tgmc_xenos/code/bodyparts.dm rename to tff_modular/modules/tgmc_xenos/code/xeno_bodyparts.dm diff --git a/tff_modular/modules/tgmc_xenos/code/organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm similarity index 81% rename from tff_modular/modules/tgmc_xenos/code/organs.dm rename to tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index bb49d360487..134c716f083 100644 --- a/tff_modular/modules/tgmc_xenos/code/organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -1,5 +1,11 @@ /// TGMC_XENOS (old nova sector xenos) +// Глазки ксенусей. Нужно для того, чтобы они не получали шармы +/obj/item/organ/eyes/alien/tgmc + +/obj/item/organ/eyes/alien/tgmc/apply_scar(side) + return // Нам не нужны слепые ксеносы из-за глупого способа нанесения шрамов на глаза + // Сосуды плазмы /obj/item/organ/alien/plasmavessel/tgmc name = "plasma vessel" @@ -33,14 +39,21 @@ heal_amt *= 0.2 if(owner.resting) heal_amt *= resting_mult + heal_amt *= delta_time_capped owner.adjustPlasma(0.5 * plasma_rate * delta_time_capped) - owner.adjustBruteLoss(-heal_amt * delta_time_capped) - owner.adjustFireLoss(-heal_amt * delta_time_capped) - owner.adjustOxyLoss(-heal_amt * delta_time_capped) + owner.adjustBruteLoss(-heal_amt) + owner.adjustFireLoss(-heal_amt) + owner.adjustOxyLoss(-heal_amt) + heal_owner_organs(heal_amt / 20) else owner.adjustPlasma(0.1 * plasma_rate * delta_time) +/obj/item/organ/alien/plasmavessel/tgmc/proc/heal_owner_organs(heal_amount) + var/list/slots_to_heal = list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_EYES, ORGAN_SLOT_LIVER, ORGAN_SLOT_EARS, ORGAN_SLOT_STOMACH) + for(var/slot in slots_to_heal) + owner.adjustOrganLoss(slot, -heal_amount) + /obj/item/organ/alien/plasmavessel/tgmc/large name = "large plasma vessel" icon_state = "plasma_large" diff --git a/tgstation.dme b/tgstation.dme index be3808829e7..8e4d9cf995a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9226,9 +9226,9 @@ #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" -#include "tff_modular\modules\tgmc_xenos\code\bodyparts.dm" -#include "tff_modular\modules\tgmc_xenos\code\organs.dm" +#include "tff_modular\modules\tgmc_xenos\code\xeno_bodyparts.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_defines.dm" +#include "tff_modular\modules\tgmc_xenos\code\xeno_organs.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\alien_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\mecha_defense.dm" From bfd7be61e4c4874f8e9aead1a49b9b93da676bd2 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Thu, 17 Apr 2025 22:45:36 +0700 Subject: [PATCH 066/120] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B5=D0=BC=D1=83=20?= =?UTF-8?q?=D1=8D=D1=82=D0=BE=20=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D0=BE=D1=81?= =?UTF-8?q?=D1=8C...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tff_modular/modules/tgmc_xenos/code/base_alien.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 797d24e246d..7dbf246c196 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -9,7 +9,6 @@ maptext_height = 64 maptext_width = 64 pressure_resistance = 200 - satiety = MAX_SATIETY // Костыльная необходимость для того, чтобы органы лечились с armor_type = /datum/armor/tgmc_alien From 566d79f3b75830a75dcd389befdf62b0ce93c526 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 20 Apr 2025 00:56:37 +0700 Subject: [PATCH 067/120] little changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Small code staff - При включении способности плевков прицел заменяется на прицел - Равагер теперь не может ставить резину и имеет меньшую скорость --- .../modules/tgmc_xenos/code/_xeno_defines.dm | 5 ++ .../modules/tgmc_xenos/code/base_alien.dm | 52 +++-------- .../tgmc_xenos/code/powers/acid_spit.dm | 10 ++- .../tgmc_xenos/code/powers/alien_powers.dm | 73 +++------------ .../modules/tgmc_xenos/code/powers/charge.dm | 13 +++ .../tgmc_xenos/code/powers/tailsweep.dm | 13 +++ .../modules/tgmc_xenos/code/xeno_defines.dm | 2 - .../modules/tgmc_xenos/code/xeno_evolve.dm | 84 ++++++++++++++++++ .../modules/tgmc_xenos/code/xeno_organs.dm | 3 + .../tgmc_xenos/code/xeno_types/queen.dm | 2 +- .../tgmc_xenos/code/xeno_types/ravager.dm | 5 +- .../tgmc_xenos/code/xeno_types/rouny.dm | 7 -- .../modules/tgmc_xenos/icons/rouny.dmi | Bin 0 -> 34168 bytes tff_modular/modules/tgmc_xenos/readme.md | 2 +- tgstation.dme | 3 +- 15 files changed, 157 insertions(+), 117 deletions(-) create mode 100644 tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm delete mode 100644 tff_modular/modules/tgmc_xenos/code/xeno_defines.dm create mode 100644 tff_modular/modules/tgmc_xenos/code/xeno_evolve.dm create mode 100644 tff_modular/modules/tgmc_xenos/icons/rouny.dmi diff --git a/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm new file mode 100644 index 00000000000..b6fc4bc0a92 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/_xeno_defines.dm @@ -0,0 +1,5 @@ +/// fortify ability trait source +#define XENO_FORTIFY_TRAIT "xeno_fortify" + +// on call adjustPlasma() proc +#define COMSIG_XENO_PLASMA_ADJUSTED "plasma_adjusted" diff --git a/tff_modular/modules/tgmc_xenos/code/base_alien.dm b/tff_modular/modules/tgmc_xenos/code/base_alien.dm index 7dbf246c196..df0fd67688f 100644 --- a/tff_modular/modules/tgmc_xenos/code/base_alien.dm +++ b/tff_modular/modules/tgmc_xenos/code/base_alien.dm @@ -10,7 +10,7 @@ maptext_width = 64 pressure_resistance = 200 - armor_type = /datum/armor/tgmc_alien + armor_type = /datum/armor/tgmc_xeno bodyparts = list( /obj/item/bodypart/chest/alien/tgmc, @@ -73,15 +73,10 @@ AddElement(/datum/element/resin_walker, /datum/movespeed_modifier/resin_speedup) AddComponent(/datum/component/seethrough_mob) - RegisterSignal(src, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(body_position_changed)) - -/mob/living/carbon/alien/adult/tgmc/Destroy() - . = ..() - UnregisterSignal(src, COMSIG_LIVING_SET_BODY_POSITION) - /mob/living/carbon/alien/adult/tgmc/create_internal_organs() if(additional_organ_types_by_slot) - default_organ_types_by_slot += additional_organ_types_by_slot + for(var/slot in additional_organ_types_by_slot) + default_organ_types_by_slot[slot] = additional_organ_types_by_slot[slot] return ..() /mob/living/carbon/alien/adult/tgmc/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) @@ -108,18 +103,18 @@ return FALSE return ..() -/mob/living/carbon/alien/adult/tgmc/proc/body_position_changed(datum/source, new_value, old_value) - SIGNAL_HANDLER +/mob/living/carbon/alien/adult/tgmc/on_lying_down(new_lying_angle) + . = ..() + ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) - if(new_value == LYING_DOWN) - add_traits(list(TRAIT_IMMOBILIZED), LYING_DOWN_TRAIT) - else - remove_traits(list(TRAIT_IMMOBILIZED), LYING_DOWN_TRAIT) +/mob/living/carbon/alien/adult/tgmc/on_standing_up() + . = ..() + REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) /mob/living/carbon/alien/adult/tgmc/getarmor(def_zone, type) return get_armor_rating(type) -/datum/armor/tgmc_alien +/datum/armor/tgmc_xeno acid = 100 bio = 100 bomb = 0 @@ -211,30 +206,6 @@ var/image/finder_eye = image('icons/hud/screen_alien.dmi', finder_icon, dir = Qdir) hud_used.alien_queen_finder.add_overlay(finder_eye) -/mob/living/carbon/alien/adult/tgmc/alien_evolve(mob/living/carbon/alien/new_xeno, is_it_a_larva) - var/mob/living/carbon/alien/adult/tgmc/xeno_to_transfer_to = new_xeno - - xeno_to_transfer_to.setDir(dir) - if(!islarva(xeno_to_transfer_to)) - xeno_to_transfer_to.has_just_evolved() - if(mind) - mind.name = xeno_to_transfer_to.real_name - mind.transfer_to(xeno_to_transfer_to) - qdel(src) - -/// Called when a larva or xeno evolves, adds a configurable timer on evolving again to the xeno -/mob/living/carbon/alien/adult/tgmc/proc/has_just_evolved() - if(has_evolved_recently) - return - has_evolved_recently = TRUE - addtimer(CALLBACK(src, PROC_REF(can_evolve_once_again)), evolution_cooldown_time) - -/// Allows xenos to evolve again if they are currently unable to -/mob/living/carbon/alien/adult/tgmc/proc/can_evolve_once_again() - if(!has_evolved_recently) - return - has_evolved_recently = FALSE - /mob/living/carbon/proc/get_max_plasma() var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) if(!vessel) @@ -243,5 +214,4 @@ /mob/living/carbon/alien/adult/tgmc/adjustPlasma(amount) . = ..() - for(var/datum/action/cooldown/ability in actions) - ability.build_all_button_icons() + SEND_SIGNAL(src, COMSIG_XENO_PLASMA_ADJUSTED, amount) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm b/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm index 665a18682d6..f8bb34e51e2 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/acid_spit.dm @@ -6,7 +6,11 @@ desc = "Spits neurotoxin at someone, exhausting them." button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' button_icon_state = "neurospit_0" + shared_cooldown = MOB_SHARED_COOLDOWN_3 + cooldown_time = 3 SECONDS plasma_cost = 40 + ranged_mousepointer = 'icons/effects/mouse_pointers/weapon_pointer.dmi' + /// A singular projectile? Use this one and leave acid_casing null var/acid_projectile = /obj/projectile/neurotoxin/tgmc /// You want it to be more like a shotgun style attack? Use this one and make acid_projectile null @@ -17,9 +21,9 @@ var/button_base_icon = "neurospit" /// The sound that should be played when the xeno actually spits var/spit_sound = 'tff_modular/modules/tgmc_xenos/sound/alien_spitacid.ogg' - shared_cooldown = MOB_SHARED_COOLDOWN_3 - cooldown_time = 3 SECONDS - var/too_much_clicks = 0 // Костыль, чтобы выключать способность не сразу, а только в экстренных ситуациях + + // Костыль, чтобы выключать способность не сразу, а только при многократных нажатиях + var/too_much_clicks = 0 /datum/action/cooldown/alien/acid/tgmc/IsAvailable(feedback = FALSE) return ..() && isturf(owner.loc) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm index 32b10e40ead..5b3c2f06ac1 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/alien_powers.dm @@ -18,58 +18,6 @@ return FALSE -// Способность эволюционировать -/datum/action/cooldown/alien/tgmc/generic_evolve - name = "Evolve" - desc = "Allows us to evolve to a higher caste of our type, if there is not one already." - button_icon_state = "evolution" - /// What type this ability will turn the owner into upon completion - var/type_to_evolve_into - -/datum/action/cooldown/alien/tgmc/generic_evolve/Grant(mob/grant_to) - . = ..() - if(!isalien(owner)) - return - var/mob/living/carbon/alien/target_alien = owner - plasma_cost = target_alien.get_max_plasma() //This ability should always require that a xeno be at their max plasma capacity to use - -/datum/action/cooldown/alien/tgmc/generic_evolve/Activate() - var/mob/living/carbon/alien/adult/tgmc/evolver = owner - - if(!istype(evolver)) - to_chat(owner, span_warning("You aren't an alien, you can't evolve!")) - return FALSE - - type_to_evolve_into = evolver.next_evolution - if(!type_to_evolve_into) - to_chat(evolver, span_bolddanger("Something is wrong... We can't evolve into anything? (This is broken report it on GitHub)")) - CRASH("Couldn't find an evolution for [owner] ([owner.type]).") - - if(!isturf(evolver.loc)) - return FALSE - - if(get_alien_type(type_to_evolve_into)) - evolver.balloon_alert(evolver, "too many of our evolution already") - return FALSE - - var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode) - if(!node) - to_chat(evolver, span_bolddanger("We can't sense our node's connection to the hive... We can't evolve!")) - return FALSE - - if(node.recent_queen_death) - to_chat(evolver, span_bolddanger("The death of our queen... We can't seem to gather the mental energy required to evolve...")) - return FALSE - - if(evolver.has_evolved_recently) - evolver.balloon_alert(evolver, "can evolve in 1.5 minutes") //Make that 1.5 variable later, but it keeps fucking up for me :( - return FALSE - - var/new_beno = new type_to_evolve_into(evolver.loc) - evolver.alien_evolve(new_beno) - return TRUE - - // Хил-аура дрона /datum/action/cooldown/alien/tgmc/heal_aura name = "Healing Aura" @@ -195,7 +143,7 @@ to_chat(owner, span_danger("We take evasive action, making us impossible to hit with projectiles for the next [evasion_duration / 10] seconds.")) addtimer(CALLBACK(src, PROC_REF(evasion_deactivate)), evasion_duration) evade_active = TRUE - RegisterSignal(owner, COMSIG_PROJECTILE_ON_HIT, PROC_REF(on_projectile_hit)) + RegisterSignal(owner, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(on_projectile_hit)) REMOVE_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) addtimer(CALLBACK(src, PROC_REF(give_back_ventcrawl)), (cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE)) //They cannot ventcrawl until the defined percent of the cooldown has passed to_chat(owner, span_warning("We will be unable to crawl through vents for the next [(cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE) / 10] seconds.")) @@ -205,7 +153,7 @@ /datum/action/cooldown/alien/tgmc/evade/proc/evasion_deactivate() evade_active = FALSE owner.balloon_alert(owner, "evasion ended") - UnregisterSignal(owner, COMSIG_PROJECTILE_ON_HIT) + UnregisterSignal(owner, COMSIG_ATOM_PRE_BULLET_ACT) /datum/action/cooldown/alien/tgmc/evade/proc/give_back_ventcrawl() ADD_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) @@ -213,14 +161,16 @@ /// Handles if either BULLET_ACT_HIT or BULLET_ACT_FORCE_PIERCE happens to something using the xeno evade ability /datum/action/cooldown/alien/tgmc/evade/proc/on_projectile_hit() + SIGNAL_HANDLER + if(owner.build_incapacitated(INCAPABLE_GRAB) || !isturf(owner.loc) || !evade_active) - return BULLET_ACT_HIT + return owner.visible_message(span_danger("[owner] effortlessly dodges the projectile!"), span_userdanger("You dodge the projectile!")) playsound(get_turf(owner), pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) owner.add_filter(RUNNER_BLUR_EFFECT, 2, gauss_blur_filter(5)) addtimer(CALLBACK(owner, TYPE_PROC_REF(/datum, remove_filter), RUNNER_BLUR_EFFECT), 0.5 SECONDS) - return BULLET_ACT_FORCE_PIERCE + return COMPONENT_BULLET_PIERCED #undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE #undef RUNNER_BLUR_EFFECT @@ -230,10 +180,11 @@ /datum/action/cooldown/alien/fortify name = "Fortify" desc = "Plant yourself for a large defensive boost." + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED cooldown_time = 2 SECONDS button_icon = 'tff_modular/modules/tgmc_xenos/icons/xeno_actions.dmi' button_icon_state = "fortify" - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + active_overlay_icon_state = "ab_goldborder" var/mob/living/carbon/alien/adult/tgmc/xeno_owner var/datum/armor/fortify_armor_type = /datum/armor/fortify_armor @@ -261,6 +212,9 @@ set_fortify(TRUE) +/datum/action/cooldown/alien/fortify/is_action_active(atom/movable/screen/movable/action_button/current_button) + return (xeno_owner && xeno_owner.fortify) + /datum/action/cooldown/alien/fortify/proc/set_fortify(on) if(xeno_owner.fortify == on) return @@ -268,11 +222,11 @@ xeno_owner.set_resting(FALSE, instant = TRUE) if(on) - ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) + ADD_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, XENO_FORTIFY_TRAIT) to_chat(xeno_owner, span_alertalien("We tuck ourselves into a defensive stance.")) xeno_owner.set_armor(xeno_owner.get_armor().add_other_armor(fortify_armor_type)) else - REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, TRAIT_XENO_FORTIFY) + REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILIZED, XENO_FORTIFY_TRAIT) to_chat(xeno_owner, span_alertalien("We resume our normal stance.")) xeno_owner.set_armor(xeno_owner.get_armor().subtract_other_armor(fortify_armor_type)) @@ -280,4 +234,5 @@ xeno_owner.fortify = on xeno_owner.resist_heavy_hits = on playsound(xeno_owner, 'sound/effects/stonedoor_openclose.ogg', 30, TRUE) + build_all_button_icons(UPDATE_BUTTON_OVERLAY) xeno_owner.update_icons() diff --git a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm index 7958deefc94..9d60c039605 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/charge.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/charge.dm @@ -27,6 +27,19 @@ var/plasma_cost = 125 +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/Grant(mob/granted_to) + . = ..() + RegisterSignal(granted_to, COMSIG_XENO_PLASMA_ADJUSTED, PROC_REF(on_owner_plasma_change)) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/Remove(mob/removed_from) + . = ..() + UnregisterSignal(removed_from, COMSIG_XENO_PLASMA_ADJUSTED) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/proc/on_owner_plasma_change() + SIGNAL_HANDLER + + build_all_button_icons() + /datum/action/cooldown/mob_cooldown/charge/basic_charge/xeno_charge/Activate(atom/target_atom) var/mob/living/carbon/carbon_owner = owner carbon_owner.adjustPlasma(-plasma_cost) diff --git a/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm b/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm index 38bdc93f0a6..794afab302b 100644 --- a/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm +++ b/tff_modular/modules/tgmc_xenos/code/powers/tailsweep.dm @@ -30,6 +30,19 @@ // Время стана оператора меха var/mecha_occupant_stun_duration +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/Grant(mob/granted_to) + . = ..() + RegisterSignal(granted_to, COMSIG_XENO_PLASMA_ADJUSTED, PROC_REF(on_owner_plasma_change)) + +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/Remove(mob/removed_from) + UnregisterSignal(removed_from, COMSIG_XENO_PLASMA_ADJUSTED) + return ..() + +/datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/proc/on_owner_plasma_change() + SIGNAL_HANDLER + + build_all_button_icons() + /datum/action/cooldown/spell/aoe/repulse/xeno/tgmc_tailsweep/IsAvailable(feedback = FALSE) . = ..() if(!.) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_defines.dm b/tff_modular/modules/tgmc_xenos/code/xeno_defines.dm deleted file mode 100644 index fa5f56134c7..00000000000 --- a/tff_modular/modules/tgmc_xenos/code/xeno_defines.dm +++ /dev/null @@ -1,2 +0,0 @@ -/// Defender fortify ability -#define TRAIT_XENO_FORTIFY "xeno_fortify" diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_evolve.dm b/tff_modular/modules/tgmc_xenos/code/xeno_evolve.dm new file mode 100644 index 00000000000..528aba80a41 --- /dev/null +++ b/tff_modular/modules/tgmc_xenos/code/xeno_evolve.dm @@ -0,0 +1,84 @@ +/// TGMC_XENOS (old nova sector xenos) + +/datum/action/cooldown/alien/tgmc/generic_evolve + name = "Evolve" + desc = "Allows us to evolve to a higher caste of our type, if there is not one already." + button_icon_state = "evolution" + /// What type this ability will turn the owner into upon completion + var/type_to_evolve_into + +/datum/action/cooldown/alien/tgmc/generic_evolve/Grant(mob/grant_to) + . = ..() + if(!isalien(owner)) + return + var/mob/living/carbon/alien/target_alien = owner + plasma_cost = target_alien.get_max_plasma() //This ability should always require that a xeno be at their max plasma capacity to use + +/datum/action/cooldown/alien/tgmc/generic_evolve/Activate() + var/mob/living/carbon/alien/adult/tgmc/evolver = owner + + if(!istype(evolver)) + to_chat(owner, span_warning("You aren't an alien, you can't evolve!")) + return FALSE + + type_to_evolve_into = evolver.next_evolution + if(!type_to_evolve_into) + to_chat(evolver, span_bolddanger("Something is wrong... We can't evolve into anything? (This is broken report it on GitHub)")) + CRASH("Couldn't find an evolution for [owner] ([owner.type]).") + + if(!isturf(evolver.loc)) + return FALSE + + if(get_alien_type(type_to_evolve_into)) + evolver.balloon_alert(evolver, "too many of our evolution already") + return FALSE + + var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode) + if(!node) + to_chat(evolver, span_bolddanger("We can't sense our node's connection to the hive... We can't evolve!")) + return FALSE + + if(node.recent_queen_death) + to_chat(evolver, span_bolddanger("The death of our queen... We can't seem to gather the mental energy required to evolve...")) + return FALSE + + if(evolver.has_evolved_recently) + evolver.balloon_alert(evolver, "can evolve in 1.5 minutes") //Make that 1.5 variable later, but it keeps fucking up for me :( + return FALSE + + var/new_beno = new type_to_evolve_into(evolver.loc) + evolver.alien_evolve(new_beno) + return TRUE + + +/mob/living/carbon/alien/adult/tgmc/alien_evolve(mob/living/carbon/alien/adult/tgmc/new_xeno, is_it_a_larva) + visible_message( + span_alertalien("[src] begins to twist and contort!"), + span_noticealien("You begin to evolve!"), + ) + + new_xeno.setDir(dir) + new_xeno.identifier = identifier + new_xeno.name = new_xeno.real_name + new_xeno.set_name() + + if(!islarva(new_xeno)) + new_xeno.has_just_evolved() + if(mind) + mind.name = new_xeno.real_name + mind.transfer_to(new_xeno) + drop_all_held_items() + qdel(src) + +/// Called when a larva or xeno evolves, adds a configurable timer on evolving again to the xeno +/mob/living/carbon/alien/adult/tgmc/proc/has_just_evolved() + if(has_evolved_recently) + return + has_evolved_recently = TRUE + addtimer(CALLBACK(src, PROC_REF(can_evolve_once_again)), evolution_cooldown_time) + +/// Allows xenos to evolve again if they are currently unable to +/mob/living/carbon/alien/adult/tgmc/proc/can_evolve_once_again() + if(!has_evolved_recently) + return + has_evolved_recently = FALSE diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm index 134c716f083..8d0d0cdec92 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_organs.dm @@ -80,6 +80,9 @@ max_plasma = 100 actions_types = list(/datum/action/cooldown/alien/transfer) +/obj/item/organ/alien/plasmavessel/tgmc/no_weeds + actions_types = list(/datum/action/cooldown/alien/transfer) + // Яйцеклад королевы /obj/item/organ/alien/eggsac/tgmc diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm index 7e1c1b9ffaa..d1a794286b4 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/queen.dm @@ -20,7 +20,7 @@ ORGAN_SLOT_XENO_EGGSAC = /obj/item/organ/alien/eggsac/tgmc, ) - mecha_armor_penetration = 40 + mecha_armor_penetration = 45 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/queen/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm index 76d260be7ba..d08b0bc65de 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/ravager.dm @@ -10,12 +10,13 @@ mob_size = MOB_SIZE_LARGE melee_damage_lower = 30 melee_damage_upper = 35 + alien_speed = 0.5 additional_organ_types_by_slot = list( - ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/tgmc/no_weeds ) - mecha_armor_penetration = 30 + mecha_armor_penetration = 35 resist_heavy_hits = TRUE /mob/living/carbon/alien/adult/tgmc/ravager/Initialize(mapload) diff --git a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm index 36f02ebcb2d..37d11641e69 100644 --- a/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm +++ b/tff_modular/modules/tgmc_xenos/code/xeno_types/rouny.dm @@ -29,10 +29,3 @@ evade_ability.Grant(src) AddComponent(/datum/component/tackler, stamina_cost = 0, base_knockdown = 2, range = 10, speed = 2, skill_mod = 4, min_distance = 0) - -/mob/living/carbon/alien/adult/tgmc/runner/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) - if(evade_ability) - var/evade_result = evade_ability.on_projectile_hit() - if(!(evade_result == BULLET_ACT_HIT)) - return evade_result - return ..() diff --git a/tff_modular/modules/tgmc_xenos/icons/rouny.dmi b/tff_modular/modules/tgmc_xenos/icons/rouny.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1ad615b4753bb0782589555f68aaf2c68acba7b7 GIT binary patch literal 34168 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 literal 0 HcmV?d00001 diff --git a/tff_modular/modules/tgmc_xenos/readme.md b/tff_modular/modules/tgmc_xenos/readme.md index 37f39c0c992..4b5db1021f6 100644 --- a/tff_modular/modules/tgmc_xenos/readme.md +++ b/tff_modular/modules/tgmc_xenos/readme.md @@ -28,7 +28,7 @@ IN: code/__DEFINES/~ff_defines/_globalvars/traits/declarations.dm - TRAIT_XENO_INNATE - TRAIT_XENO_ABILITY_GIVEN - TRAIT_XENO_HEAL_AURA -- TRAIT_XENO_FORTIFY +- XENO_FORTIFY_TRAIT ## Helpers diff --git a/tgstation.dme b/tgstation.dme index 8e4d9cf995a..384800f5223 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9225,9 +9225,10 @@ #include "tff_modular\modules\silicon_laws_tweaks\code\upload.dm" #include "tff_modular\modules\snowfall\snowfall.dm" #include "tff_modular\modules\streletz\code\clothing.dm" +#include "tff_modular\modules\tgmc_xenos\code\_xeno_defines.dm" #include "tff_modular\modules\tgmc_xenos\code\base_alien.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_bodyparts.dm" -#include "tff_modular\modules\tgmc_xenos\code\xeno_defines.dm" +#include "tff_modular\modules\tgmc_xenos\code\xeno_evolve.dm" #include "tff_modular\modules\tgmc_xenos\code\xeno_organs.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\alien_defense.dm" #include "tff_modular\modules\tgmc_xenos\code\defense\human_defense.dm" From 19730356508a9dbe62109bc38f9edb892bae6c96 Mon Sep 17 00:00:00 2001 From: Kocma-san Date: Sun, 20 Apr 2025 01:02:15 +0700 Subject: [PATCH 068/120] Delete Mortar.tsx --- tgui/packages/tgui/interfaces/Mortar.tsx | 114 ----------------------- 1 file changed, 114 deletions(-) delete mode 100644 tgui/packages/tgui/interfaces/Mortar.tsx diff --git a/tgui/packages/tgui/interfaces/Mortar.tsx b/tgui/packages/tgui/interfaces/Mortar.tsx deleted file mode 100644 index 723fe31d6c9..00000000000 --- a/tgui/packages/tgui/interfaces/Mortar.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import { useState } from 'react'; -import { - Button, - LabeledList, - NumberInput, - Section, -} from 'tgui-core/components'; - -import { useBackend } from '../backend'; -import { Window } from '../layouts'; - -type MortarData = { - data_target_x: number; - data_target_y: number; - data_dial_x: number; - data_dial_y: number; -}; - -export const Mortar = (props) => { - const { act, data } = useBackend(); - const { data_target_x, data_target_y, data_dial_x, data_dial_y } = data; - - const [target_x, setTargetX] = useState(data_target_x); - const [target_y, setTargetY] = useState(data_target_y); - const [dial_x, setDialX] = useState(data_dial_x); - const [dial_y, setDialY] = useState(data_dial_y); - - return ( - - -