diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index d330983f20eb9..ef31897f3a36a 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -48,6 +48,8 @@ return TRUE +//BANDASTATION EDIT REMOVAL BEGIN XENO_REWORK - Moved to: modular_bandastation\xeno_rework\code\larva.dm +/* /datum/action/cooldown/alien/larva_evolve/Activate(atom/target) var/mob/living/carbon/alien/larva/larva = owner var/static/list/caste_options @@ -101,3 +103,5 @@ larva.alien_evolve(new_xeno) return TRUE +*/ +////BANDASTATION EDIT REMOVAL END diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm index ca75bb2d78971..0294bb5ff002c 100644 --- a/code/modules/mob/living/carbon/alien/screen.dm +++ b/code/modules/mob/living/carbon/alien/screen.dm @@ -9,7 +9,7 @@ /mob/living/carbon/alien/proc/findQueen() if(hud_used) hud_used.alien_queen_finder.cut_overlays() - var/mob/queen = get_alien_type(/mob/living/carbon/alien/adult/royal/queen) + var/mob/queen = get_alien_type(/mob/living/carbon/alien/adult/banda/queen) // Bandastation edit. Original: /mob/living/carbon/alien/adult/royal/queen if(!queen) return var/turf/Q = get_turf(queen) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index aad3a0f1cc300..fee32e20758a6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -194,6 +194,8 @@ apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE)) return TRUE +//BANDASTATION EDIT REMOVAL BEGIN XENO_REWORK - Moved to: modular_bandastation\xeno_rework\code\larva.dm +/* /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) . = ..() if(!.) @@ -245,6 +247,8 @@ if(!dismembering_strike(user, user.zone_selected)) //Dismemberment successful return TRUE apply_damage(damage, BRUTE, affecting, armor_block) +*/ +//BANDASTATION EDIT REMOVAL END /mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/worm, list/modifiers) . = ..() diff --git a/modular_bandastation/modular_bandastation.dme b/modular_bandastation/modular_bandastation.dme index 0d27a646e6f82..3003a3e914d2d 100644 --- a/modular_bandastation/modular_bandastation.dme +++ b/modular_bandastation/modular_bandastation.dme @@ -56,6 +56,7 @@ #include "turfs/_turfs.dme" #include "whitelist220/_whitelist220.dme" #include "world_topics/_world_topics.dme" +#include "xeno_rework/_xeno_rework.dme" #include "storyteller/_storyteller.dme" #include "game/_game.dme" // --- MODULES END --- // diff --git a/modular_bandastation/tts/code/base_seeds/mobs/alien.dm b/modular_bandastation/tts/code/base_seeds/mobs/alien.dm index 9970e9aacdf55..750aa1e0049dc 100644 --- a/modular_bandastation/tts/code/base_seeds/mobs/alien.dm +++ b/modular_bandastation/tts/code/base_seeds/mobs/alien.dm @@ -7,7 +7,7 @@ AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/ladyvashj) /mob/living/carbon/alien/larva/add_tts_component() - AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/templar) + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/stelina) /mob/living/carbon/alien/adult/royal/queen/add_tts_component() AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/queen) diff --git a/modular_bandastation/xeno_rework/_xeno_rework.dm b/modular_bandastation/xeno_rework/_xeno_rework.dm new file mode 100644 index 0000000000000..96b6da1de6a3f --- /dev/null +++ b/modular_bandastation/xeno_rework/_xeno_rework.dm @@ -0,0 +1,4 @@ +/datum/modpack/world_topics + name = "Xeno Rework" + desc = "Добавляет новые касты ксеноморфов, перерабоатывает существующие" + author = "artfish(modpack), Paxilmaniac(original)" diff --git a/modular_bandastation/xeno_rework/_xeno_rework.dme b/modular_bandastation/xeno_rework/_xeno_rework.dme new file mode 100644 index 0000000000000..1e4b913290a3d --- /dev/null +++ b/modular_bandastation/xeno_rework/_xeno_rework.dme @@ -0,0 +1,17 @@ +#include "_xeno_rework.dm" + +#include "code/defines/traits.dm" +#include "code/base_xeno.dm" +#include "code/human_defense.dm" +#include "code/larva.dm" + +#include "code/xeno_types/defender.dm" +#include "code/xeno_types/drone.dm" +#include "code/xeno_types/praetorian.dm" +#include "code/xeno_types/queen.dm" +#include "code/xeno_types/ravager.dm" +#include "code/xeno_types/rouny.dm" +#include "code/xeno_types/sentinel.dm" +#include "code/xeno_types/spitter.dm" +#include "code/xeno_types/warrior.dm" + diff --git a/modular_bandastation/xeno_rework/code/base_xeno.dm b/modular_bandastation/xeno_rework/code/base_xeno.dm new file mode 100644 index 0000000000000..e27395d1b2b6d --- /dev/null +++ b/modular_bandastation/xeno_rework/code/base_xeno.dm @@ -0,0 +1,216 @@ +/// MODULE _XENO_REDO + +/mob/living/carbon/alien/adult/banda + name = "rare bugged alien" + icon = 'modular_bandastation/xeno_rework/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 + mob_size = MOB_SIZE_LARGE + layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles + plane = ABOVE_GAME_PLANE + maptext_height = 64 + maptext_width = 64 + pressure_resistance = 200 + /// What icon file update_held_items will look for when making inhands for xenos + var/alt_inhands_file = 'modular_bandastation/xeno_rework/icons/big_xenos.dmi' + /// Setting this will give a xeno generic_evolve set to evolve them into this type + var/next_evolution + /// Keeps track of if a xeno has evolved recently, if so then we prevent them from evolving until that time is up + var/has_evolved_recently = FALSE + /// How long xenos should be unable to evolve after recently evolving + 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 + + +/mob/living/carbon/alien/adult/banda/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seethrough_mob) + + GRANT_ACTION(/datum/action/cooldown/alien/banda/sleepytime) + if(next_evolution) + GRANT_ACTION(/datum/action/cooldown/alien/banda/generic_evolve) + + pixel_x = -16 + + ADD_TRAIT(src, TRAIT_XENO_HEAL_AURA, TRAIT_XENO_INNATE) + real_name = "alien [caste]" + +/// Called when a larva or xeno evolves, adds a configurable timer on evolving again to the xeno +/mob/living/carbon/alien/adult/banda/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/banda/proc/can_evolve_once_again() + if(!has_evolved_recently) + return + has_evolved_recently = FALSE + +/datum/action/cooldown/alien/banda + button_icon = 'modular_bandastation/xeno_rework/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/banda/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + if(can_be_used_always) + return TRUE + + var/mob/living/carbon/alien/adult/banda/owner_alien = owner + if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) + return FALSE + +/datum/action/cooldown/alien/banda/sleepytime //I don't think this has a mechanical advantage but they have cool resting sprites so... + name = "Rest" + desc = "Иногда даже кровожадным чужим нужно немного полежать." + button_icon_state = "sleepytime" + +/datum/action/cooldown/alien/banda/sleepytime/Activate() + var/mob/living/carbon/sleepytime_mob = owner + if(!isalien(owner)) + return FALSE + if(!sleepytime_mob.resting) + sleepytime_mob.set_resting(new_resting = TRUE, silent = FALSE, instant = TRUE) + return TRUE + sleepytime_mob.set_resting(new_resting = FALSE, silent = FALSE, instant = FALSE) + return TRUE + +/datum/action/cooldown/alien/banda/generic_evolve + name = "Evolve" + desc = "Позволяет нам эволюционировать в высшую касту нашего типа, если такая ещё не существует." + button_icon_state = "evolution" + /// What type this ability will turn the owner into upon completion + var/type_to_evolve_into + +/datum/action/cooldown/alien/banda/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/banda/generic_evolve/Activate() + var/mob/living/carbon/alien/adult/banda/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, "Слишком много наших эволюционировавших форм уже существует.") + 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("Мы не ощущаем связь нашего узла с ульем... Мы не можем эволюционировать!")) + return FALSE + + if(node.recent_queen_death) + to_chat(evolver, span_bolddanger("Смерть нашей королевы... Мы не можем собрать достаточно ментальной энергии, чтобы эволюционировать...")) + return FALSE + + if(evolver.has_evolved_recently) + evolver.balloon_alert(evolver, "сможет эволюционировать через 1.5 минуты") //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/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/banda/update_held_items() + ..() + remove_overlay(HANDS_LAYER) + 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, 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, alpha = r_hand_item.alpha) + hands += r_hand_item + + 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/banda/alien_evolve(mob/living/carbon/alien/new_xeno, is_it_a_larva) + var/mob/living/carbon/alien/adult/banda/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/banda/findQueen() //Yes we really do need to do this whole thing to let the queen finder work + if(hud_used) + hud_used.alien_queen_finder.cut_overlays() + var/mob/queen = get_alien_type(/mob/living/carbon/alien/adult/banda/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/modular_bandastation/xeno_rework/code/defines/traits.dm b/modular_bandastation/xeno_rework/code/defines/traits.dm new file mode 100644 index 0000000000000..9b3ae25f1ffad --- /dev/null +++ b/modular_bandastation/xeno_rework/code/defines/traits.dm @@ -0,0 +1,6 @@ +/// 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/modular_bandastation/xeno_rework/code/human_defense.dm b/modular_bandastation/xeno_rework/code/human_defense.dm new file mode 100644 index 0000000000000..4ddb755ac0722 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/human_defense.dm @@ -0,0 +1,61 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) + . = ..() + if(!.) + return + + if(LAZYACCESS(modifiers, RIGHT_CLICK)) //Always drop item in hand, if no item, get stun instead. + var/obj/item/mob_held_item = get_active_held_item() + var/disarm_damage = rand(user.melee_damage_lower * 1.5, user.melee_damage_upper * 1.5) + + if(mob_held_item) + + if(check_block(user, damage = 0, attack_text = "[user.name]")) + playsound(loc, 'sound/items/weapons/parry.ogg', 25, TRUE, -1) //Audio feedback to the fact you just got blocked + apply_damage(disarm_damage / 2, STAMINA) + visible_message(span_danger("[user] пытается дотронуться до [src]!"), \ + span_danger("[user] пытается дотронуться до вас!"), span_hear("Вы слышите свистящий звук!"), null, user) + to_chat(user, span_warning("Вы пытаетесь дотронуться до [src]!")) + return FALSE + + playsound(loc, 'sound/items/weapons/thudswoosh.ogg', 25, TRUE, -1) //The sounds of these are changed so the xenos can actually hear they are being non-lethal + Knockdown(3 SECONDS) + apply_damage(disarm_damage, STAMINA) + visible_message(span_danger("[user] валит [src] на землю!"), \ + span_userdanger("[user] валит вас на землю!"), span_hear("Вы слышите яростное шарканье, за которым следует громкий глухой удар!"), null, user) + to_chat(user, span_danger("Вы опрокидываете [src] на землю!")) + return TRUE + + else + playsound(loc, 'sound/effects/hit_kick.ogg', 25, TRUE, -1) + apply_damage(disarm_damage, STAMINA) + log_combat(user, src, "tackled") + visible_message(span_danger("[user] сбивает [src] с ног!"), \ + span_userdanger("[user] сбивает вас с ног!"), span_hear("Вы слышите яростное шарканье!"), null, user) + to_chat(user, span_danger("Вы валите [src] на землю!")) + + return TRUE + + if(user.combat_mode) + if(w_uniform) + w_uniform.add_fingerprint(user) + + var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(user.zone_selected)) + + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + + var/armor_block = run_armor_check(affecting, MELEE,"","",10) + + playsound(loc, 'sound/items/weapons/slice.ogg', 25, TRUE, -1) + visible_message(span_danger("[user] наносит когтями удар по [src]!"), \ + span_userdanger("[user] наносит вам удар когтями!"), span_hear("Вы слышите мерзкий звук разрезаемой плоти!"), null, user) + to_chat(user, span_danger("Вы наносите удар когтями по [src]!")) + log_combat(user, src, "attacked") + + if(!dismembering_strike(user, user.zone_selected)) //Dismemberment successful + return TRUE + + apply_damage(damage, BRUTE, affecting, armor_block) diff --git a/modular_bandastation/xeno_rework/code/larva.dm b/modular_bandastation/xeno_rework/code/larva.dm new file mode 100644 index 0000000000000..1597d963272d5 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/larva.dm @@ -0,0 +1,90 @@ +/// banda MODULE banda_XENO_REDO + +/datum/action/cooldown/alien/larva_evolve/Activate(atom/target) + 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 = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi', icon_state = "preview_runner"), + caste_info = span_info("Бегуны — самая подвижная каста. Их низкий рост и передвижение на четырёх \ + лапах дают им высокую скорость, способность уклоняться от снарядов \ + и возможность сбивать врагов с ног при броске и клике. \ + Со временем бегуны могут эволюционировать в устрашающего разрушителя, \ + если улей позволит это."), + caste_options = caste_options, + ) + + make_xeno_caste_entry( + caste_name = "Sentinel", + caste_image = image(icon = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi', icon_state = "preview_sentinel"), + caste_info = span_info("Стражи — каста, по форме похожая на дронов, но жертвующая возможностью \ + стать королевской особой ради способности плеваться кислотой или мощным \ + нейротоксином. В ближнем бою они слабее других каст, но со временем могут \ + эволюционировать в более опасную форму кислотного плевальщика, \ + если у улья будет достаточно ресурсов."), + caste_options = caste_options, + ) + + make_xeno_caste_entry( + caste_name = "Defender", + caste_image = image(icon = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi', icon_state = "preview_defender"), + caste_info = span_info("Медленный, выносливый и мощно атакующий, защитник полностью оправдывает своё имя. \ + Его толстая броня позволяет выдерживать больше ударов, чем другие касты, а смертельная \ + булава на хвосте и способность совершать короткие рывки делают его грозным бойцом. \ + Со временем защитник может эволюционировать в устрашающего крушителя — \ + разрушителя стационарных объектов, если у улья будет достаточно ресурсов."), + caste_options = caste_options, + ) + + make_xeno_caste_entry( + caste_name = "Drone", + caste_image = image(icon = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi', icon_state = "preview_drone"), + caste_info = span_info("Дроны — это относительно слабая, но довольно быстрая каста, выполняющая \ + в улье в основном вспомогательную роль. Они обладают большей вместимостью \ + плазмы по сравнению с большинством первых стадий эволюции, а также \ + способностью создавать исцеляющую ауру для ближайших ксеноморфов. \ + Дроны — единственная каста, способная эволюционировать как в преторианцев, \ + так и в королеву, хотя в любой момент времени может существовать \ + только одна королева и один преторианец."), + caste_options = caste_options, + ) + + var/alien_caste = show_radial_menu(owner, owner, caste_options, radius = 38, require_near = TRUE, tooltips = TRUE) + if(QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE) || isnull(alien_caste)) + return + + spawn_new_xeno(alien_caste) + + return TRUE + +/// Generates a new entry to the +/datum/action/cooldown/alien/larva_evolve/proc/make_xeno_caste_entry(caste_name, caste_image, caste_info, list/caste_options) + var/datum/radial_menu_choice/caste_option = new() + + caste_option.name = caste_name + caste_option.image = caste_image + caste_option.info = caste_info + + caste_options[caste_name] = caste_option + +/datum/action/cooldown/alien/larva_evolve/proc/spawn_new_xeno(alien_caste) + var/mob/living/carbon/alien/adult/banda/new_xeno + var/mob/living/carbon/alien/larva/larva = owner + + switch(alien_caste) + if("Runner") + new_xeno = new /mob/living/carbon/alien/adult/banda/runner(larva.loc) + if("Sentinel") + new_xeno = new /mob/living/carbon/alien/adult/banda/sentinel(larva.loc) + if("Defender") + new_xeno = new /mob/living/carbon/alien/adult/banda/defender(larva.loc) + if("Drone") + new_xeno = new /mob/living/carbon/alien/adult/banda/drone(larva.loc) + else + CRASH("Alien evolve was given an invalid / incorrect alien cast type. Got: [alien_caste]") + + new_xeno.has_just_evolved() + larva.alien_evolve(new_xeno) diff --git a/modular_bandastation/xeno_rework/code/xeno_types/defender.dm b/modular_bandastation/xeno_rework/code/xeno_types/defender.dm new file mode 100644 index 0000000000000..9de5279f91911 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/defender.dm @@ -0,0 +1,123 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/defender + name = "alien defender" + desc = "Тяжелый на вид чужой с хвостом, похожим на ядро тарана — получить удар таким было бы больно." + caste = "defender" + maxHealth = 300 + health = 300 + icon_state = "aliendefender" + melee_damage_lower = 25 + melee_damage_upper = 30 + next_evolution = /mob/living/carbon/alien/adult/banda/warrior + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small, + ) + +/mob/living/carbon/alien/adult/banda/defender/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/spell/aoe/repulse/xeno/banda_tailsweep, + /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender, + ) + 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/banda/defender/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/sejuani) + +/datum/action/cooldown/spell/aoe/repulse/xeno/banda_tailsweep + name = "Crushing Tail Sweep" + desc = "Отбросьте нападающих взмахом хвоста, вероятно, ломая им кости." + + cooldown_time = 60 SECONDS + + aoe_radius = 1 + + button_icon = 'modular_bandastation/xeno_rework/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/banda_tailsweep/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + + var/mob/living/carbon/alien/adult/banda/owner_alien = owner + if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) + return FALSE + +/datum/action/cooldown/spell/aoe/repulse/xeno/banda_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, 70, TRUE, 8, 0.9) + to_chat(victim_living, span_userdanger("Хвост [caster] обрушивается на вас, отбрасывая назад!")) + + 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 = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi' + icon_state = "crush_tail_anim" + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/defender + name = "Charge Attack" + desc = "Позволяет совершить рывок к указанной позиции, растаптывая всё на своём пути." + cooldown_time = 15 SECONDS + charge_delay = 0.3 SECONDS + charge_distance = 5 + destroy_objects = FALSE + charge_damage = 50 + button_icon = 'modular_bandastation/xeno_rework/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, 'modular_bandastation/xeno_rework/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/modular_bandastation/xeno_rework/code/xeno_types/drone.dm b/modular_bandastation/xeno_rework/code/xeno_types/drone.dm new file mode 100644 index 0000000000000..46144b81278d2 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/drone.dm @@ -0,0 +1,71 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/drone + name = "alien drone" + desc = "Настолько обычный, насколько может быть чужой с бронированным черным хитином и огромными когтями." + caste = "drone" + maxHealth = 200 + health = 200 + icon_state = "aliendrone" + melee_damage_lower = 15 + melee_damage_upper = 20 + next_evolution = /mob/living/carbon/alien/adult/banda/praetorian + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ) + +/mob/living/carbon/alien/adult/banda/drone/Initialize(mapload) + . = ..() + GRANT_ACTION(/datum/action/cooldown/alien/banda/heal_aura) + +/mob/living/carbon/alien/adult/banda/drone/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/annah) + +/datum/action/cooldown/alien/banda/heal_aura + name = "Healing Aura" + desc = "Дружественные ксеноморфы в небольшом радиусе вокруг вас будут получать пассивное исцеление." + 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/banda/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("Мы испускаем феромоны, которые побуждают сестёр рядом с нами исцеляться в течение следующих [aura_duration / 10] секунд.")) + 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/banda/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/modular_bandastation/xeno_rework/code/xeno_types/praetorian.dm b/modular_bandastation/xeno_rework/code/xeno_types/praetorian.dm new file mode 100644 index 0000000000000..628a6a4f575e5 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/praetorian.dm @@ -0,0 +1,128 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/praetorian + name = "alien praetorian" + desc = "Чужой, выглядящий как нечто среднее между королевой и дроном — и, вероятно, именно так оно и есть." + caste = "praetorian" + maxHealth = 400 + health = 400 + icon_state = "alienpraetorian" + melee_damage_lower = 25 + melee_damage_upper = 30 + next_evolution = /mob/living/carbon/alien/adult/banda/queen + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/spitter, + ) + +/mob/living/carbon/alien/adult/banda/praetorian/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/alien/banda/heal_aura/juiced, + /datum/action/cooldown/spell/aoe/repulse/xeno/banda_tailsweep/hard_throwing, + ) + grant_actions_by_list(innate_actions) + + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + +/mob/living/carbon/alien/adult/banda/praetorian/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/tyrande_hs) + +/datum/action/cooldown/alien/banda/heal_aura/juiced + name = "Strong Healing Aura" + desc = "Дружественные ксеноморфы в большем радиусе вокруг вас будут получать пассивное исцеление." + 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/banda_tailsweep/hard_throwing + name = "Flinging Tail Sweep" + desc = "Размашистый удар хвоста отбрасывает врагов назад с огромной силой." + + 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 = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi' + icon_state = "throw_tail_anim" + +/datum/action/cooldown/alien/acid/banda/spread + name = "Spit Neurotoxin Spread" + desc = "Выплёвывает нейротоксин, истощая противника." + plasma_cost = 50 + acid_projectile = null + acid_casing = /obj/item/ammo_casing/xenospit + spit_sound = 'modular_bandastation/xeno_rework/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/banda/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/banda/spitter_spread //Slightly nerfed because its a shotgun spread of these + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 25 + +/datum/action/cooldown/alien/acid/banda/spread/lethal + name = "Spit Acid Spread" + desc = "Выплёвывает облако кислоты в цель, обжигая её." + 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/banda/acid/spitter_spread + pellets = 4 + variance = 30 + +/obj/projectile/neurotoxin/banda/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/banda/spread, + /datum/action/cooldown/alien/acid/banda/spread/lethal, + /datum/action/cooldown/alien/acid/corrosion, + ) diff --git a/modular_bandastation/xeno_rework/code/xeno_types/queen.dm b/modular_bandastation/xeno_rework/code/xeno_types/queen.dm new file mode 100644 index 0000000000000..c401c579387cb --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/queen.dm @@ -0,0 +1,99 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/queen + name = "alien queen" + desc = "Исполинская тварь с устрашающей аурой. Пора действовать, а не глазеть." + caste = "queen" + maxHealth = 500 + health = 500 + icon_state = "alienqueen" + melee_damage_lower = 30 + melee_damage_upper = 35 + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large/queen, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/queen, + ORGAN_SLOT_XENO_EGGSAC = /obj/item/organ/alien/eggsac, + ) + +/mob/living/carbon/alien/adult/banda/queen/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/spell/aoe/repulse/xeno/banda_tailsweep/hard_throwing, + /datum/action/cooldown/alien/banda/queen_screech, + ) + grant_actions_by_list(innate_actions) + + ADD_TRAIT(src, TRAIT_NOFIRE, INNATE_TRAIT) + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + +/mob/living/carbon/alien/adult/banda/queen/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/alexstraza) + +/mob/living/carbon/alien/adult/banda/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/banda, + /datum/action/cooldown/alien/acid/banda/lethal, + /datum/action/cooldown/alien/acid/corrosion, + ) + +/mob/living/carbon/alien/adult/banda/queen/death(gibbed) + if(stat == DEAD) + return + + for(var/mob/living/carbon/carbon_mob in GLOB.alive_mob_list) + if(carbon_mob == src) + continue + + var/obj/item/organ/alien/hivenode/node = carbon_mob.get_organ_by_type(/obj/item/organ/alien/hivenode) + + if(istype(node)) + node.queen_death() + + return ..() + +/datum/action/cooldown/alien/banda/queen_screech + name = "Deafening Screech" + desc = "Издаёт оглушительный визг, который, вероятно, ненадолго выведет из строя всех слышащих существ вокруг. Перезарядка 5 минут." + button_icon_state = "screech" + cooldown_time = 5 MINUTES + +/datum/action/cooldown/alien/banda/queen_screech/Activate() + . = ..() + var/mob/living/carbon/alien/adult/banda/queenie = owner + playsound(queenie, 'modular_bandastation/xeno_rework/sound/alien_queen_screech.ogg', 70, FALSE, 8, 0.9) + 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_red("[queenie] lets out a deafening screech!")) + + return TRUE + +/mob/living/carbon/alien/adult/banda/proc/create_shriekwave() + remove_overlay(HALO_LAYER) + overlays_standing[HALO_LAYER] = image("icon" = 'modular_bandastation/xeno_rework/icons/big_xenos.dmi', "icon_state" = "shriek_waves") //Ehh, suit layer's not being used. + apply_overlay(HALO_LAYER) + addtimer(CALLBACK(src, PROC_REF(remove_shriekwave)), 3 SECONDS) + +/mob/living/carbon/alien/adult/banda/proc/remove_shriekwave() + remove_overlay(HALO_LAYER) diff --git a/modular_bandastation/xeno_rework/code/xeno_types/ravager.dm b/modular_bandastation/xeno_rework/code/xeno_types/ravager.dm new file mode 100644 index 0000000000000..f48111337174d --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/ravager.dm @@ -0,0 +1,115 @@ +/// banda MODULE banda_XENO_REDO + +#define RAVAGER_OUTLINE_EFFECT "ravager_endure_outline" + +/mob/living/carbon/alien/adult/banda/ravager + name = "alien ravager" + desc = "Чужой с ярко-красным, словно разъярённым, хитином и устрашающими клинковыми когтями вместо обычных рук. Острый хвост выглядит так, будто удар им будет крайне болезненным." + caste = "ravager" + maxHealth = 350 + health = 350 + icon_state = "alienravager" + melee_damage_lower = 30 + melee_damage_upper = 35 + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, + ) + +/mob/living/carbon/alien/adult/banda/ravager/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/spell/aoe/repulse/xeno/banda_tailsweep/slicing, + /datum/action/cooldown/alien/banda/literally_too_angry_to_die, + /datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager, + ) + grant_actions_by_list(innate_actions) + + ADD_TRAIT(src, TRAIT_NOFIRE, INNATE_TRAIT) + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/mob/living/carbon/alien/adult/banda/ravager/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/zarya) + +/datum/action/cooldown/mob_cooldown/charge/triple_charge/ravager + name = "Triple Charge Attack" + desc = "Позволяет трижды совершить рывок к указанной точке, растаптывая всех на своём пути. Каждый рывок наносит дополнительный удар рукой, если вы в агресивном режиме" + cooldown_time = 60 SECONDS + charge_delay = 0.2 SECONDS + charge_distance = 7 + charge_past = 3 + destroy_objects = FALSE + charge_damage = 8 + button_icon = 'modular_bandastation/xeno_rework/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, 'modular_bandastation/xeno_rework/sound/alien_roar2.ogg', 70, 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/banda_tailsweep/slicing + name = "Slicing Tail Sweep" + desc = "Отбросьте нападающих взмахом хвоста, разрезая их его заострённым кончиком." + + aoe_radius = 2 + + button_icon_state = "slice_tail" + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep/ravager + + sound = 'modular_bandastation/xeno_rework/sound/alien_tail_swipe.ogg' //The defender's tail sound isn't changed because its big and heavy, this isn't + + impact_sound = 'modular_bandastation/xeno_rework/sound/bloodyslice.ogg' + impact_damage = 40 + impact_sharpness = SHARP_EDGED + +/obj/effect/temp_visual/dir_setting/tailsweep/ravager + icon = 'modular_bandastation/xeno_rework/icons/xeno_actions.dmi' + icon_state = "slice_tail_anim" + +/datum/action/cooldown/alien/banda/literally_too_angry_to_die + name = "Endure" + desc = "Наполните своё тело невообразимой яростью (и плазмой), позволяя себе игнорировать всю боль на короткое время." + 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/banda/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, 'modular_bandastation/xeno_rework/sound/alien_roar1.ogg', 70, TRUE, 8, 0.9) + to_chat(owner, span_danger("Мы подавляем способность чувствовать боль, позволяя себе сражаться до самого конца в течение следующих [endure_duration/10] секунд.")) + 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/banda/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/modular_bandastation/xeno_rework/code/xeno_types/rouny.dm b/modular_bandastation/xeno_rework/code/xeno_types/rouny.dm new file mode 100644 index 0000000000000..1fe4b8ace730a --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/rouny.dm @@ -0,0 +1,103 @@ +/// banda MODULE banda_XENO_REDO + +#define EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE 0.8 +#define RUNNER_BLUR_EFFECT "runner_evasion" + +/mob/living/carbon/alien/adult/banda/runner + name = "alien runner" + desc = "Невысокий чужой с гладким красным хитином, явно следующий теореме «красный значит быстрый» и почти всегда передвигающийся на четырёх лапах." + caste = "runner" + maxHealth = 150 + health = 150 + icon_state = "alienrunner" + /// Holds the evade ability to be granted to the runner later + var/datum/action/cooldown/alien/banda/evade/evade_ability + melee_damage_lower = 15 + melee_damage_upper = 20 + next_evolution = /mob/living/carbon/alien/adult/banda/ravager + on_fire_pixel_y = 0 + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/small/tiny, + ) + +/mob/living/carbon/alien/adult/banda/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) + +/mob/living/carbon/alien/adult/banda/runner/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/wendy) + +/mob/living/carbon/alien/adult/banda/runner/create_internal_organs() + organs += new /obj/item/organ/alien/plasmavessel/small/tiny + ..() + +/datum/action/cooldown/alien/banda/evade + name = "Evade" + desc = "Позволяет уклоняться от любых снарядов, которые могли бы попасть в вас, в течение нескольких секунд." + 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/banda/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, 'modular_bandastation/xeno_rework/sound/alien_hiss.ogg', 70, TRUE, 8, 0.9) + to_chat(owner, span_danger("Мы совершаем уклоняющий манёвр, становясь неуязвимыми для снарядов в течение следующих [evasion_duration / 10] секунд.")) + 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("Мы не сможем ползать по вентиляции в течение следующих [(cooldown_time * EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE) / 10] секунд.")) + return TRUE + +/// Handles deactivation of the xeno evasion ability, mainly unregistering the signal and giving a balloon alert +/datum/action/cooldown/alien/banda/evade/proc/evasion_deactivate() + evade_active = FALSE + owner.balloon_alert(owner, "evasion ended") + UnregisterSignal(owner, COMSIG_PROJECTILE_ON_HIT) + +/datum/action/cooldown/alien/banda/evade/proc/give_back_ventcrawl() + ADD_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + to_chat(owner, span_notice("Мы достаточно отдохнули и снова можем ползать по вентиляции.")) + +/// Handles if either BULLET_ACT_HIT or BULLET_ACT_FORCE_PIERCE happens to something using the xeno evade ability +/datum/action/cooldown/alien/banda/evade/proc/on_projectile_hit() + if(!INCAPACITATED_IGNORING(owner, INCAPABLE_GRAB) || !isturf(owner.loc) || !evade_active) + return BULLET_ACT_HIT + + owner.visible_message(span_danger("[owner] без труда уклоняется от снаряда!"), span_userdanger("Вы уклоняетесь от снаряда!")) + 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/banda/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/modular_bandastation/xeno_rework/code/xeno_types/sentinel.dm b/modular_bandastation/xeno_rework/code/xeno_types/sentinel.dm new file mode 100644 index 0000000000000..1c25610288bae --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/sentinel.dm @@ -0,0 +1,154 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/sentinel + name = "alien sentinel" + desc = "Чужой, который был бы неприметным, если бы не яркая окраска и видимые кислотные железы, покрывающие его тело." + caste = "sentinel" + maxHealth = 200 + health = 200 + icon_state = "aliensentinel" + melee_damage_lower = 10 + melee_damage_upper = 15 + next_evolution = /mob/living/carbon/alien/adult/banda/spitter + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel/large, + ORGAN_SLOT_XENO_RESINSPINNER = /obj/item/organ/alien/resinspinner, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/sentinel, + ) + +/mob/living/carbon/alien/adult/banda/sentinel/Initialize(mapload) + . = ..() + + add_movespeed_modifier(/datum/movespeed_modifier/alien_slow) + +/mob/living/carbon/alien/adult/banda/sentinel/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/tracer) + +/datum/action/cooldown/alien/acid/banda + name = "Spit Neurotoxin" + desc = "Выплёвывает нейротоксин в цель, изнуряя её." + button_icon = 'modular_bandastation/xeno_rework/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/banda + /// 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 = 'modular_bandastation/xeno_rework/sound/alien_spitacid.ogg' + shared_cooldown = MOB_SHARED_COOLDOWN_3 + cooldown_time = 5 SECONDS + +/datum/action/cooldown/alien/acid/banda/IsAvailable(feedback = FALSE) + return ..() && isturf(owner.loc) + +/datum/action/cooldown/alien/acid/banda/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_notice("Вы подготавливаете свою железу [projectile_name]. Левый клик, чтобы выстрелить по цели!")) + + button_icon_state = "[button_base_icon]_1" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/banda/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + if(refund_cooldown) + to_chat(on_who, span_notice("Вы опустошаете свою железу [projectile_name].")) + + button_icon_state = "[button_base_icon]_0" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/alien/acid/banda/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] выплёвывает [projectile_name]!"), + span_alertalien("Вы выплёвываете [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, 70, 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, 70, 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("Для плевательной атаки [clicker] не заданы ни acid_projectile, ни acid_casing!") + +/datum/action/cooldown/alien/acid/banda/Activate(atom/target) + return TRUE + +/obj/projectile/neurotoxin/banda + 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/banda/lethal + name = "Spit Acid" + desc = "Выплёвывает нейротоксин в цель, обжигая её." + acid_projectile = /obj/projectile/neurotoxin/banda/acid + button_icon_state = "acidspit_0" + projectile_name = "acid" + button_base_icon = "acidspit" + +/obj/projectile/neurotoxin/banda/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/banda, + /datum/action/cooldown/alien/acid/banda/lethal, + ) diff --git a/modular_bandastation/xeno_rework/code/xeno_types/spitter.dm b/modular_bandastation/xeno_rework/code/xeno_types/spitter.dm new file mode 100644 index 0000000000000..5d9eb03332a33 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/spitter.dm @@ -0,0 +1,33 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/spitter + name = "alien spitter" + desc = "Довольно массивный чужой с выраженными кислотными железами, из его рта капает... то ли токсин, то ли кислота." + caste = "spitter" + maxHealth = 300 + health = 300 + icon_state = "alienspitter" + melee_damage_lower = 15 + melee_damage_upper = 20 + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, + ORGAN_SLOT_XENO_NEUROTOXINGLAND = /obj/item/organ/alien/neurotoxin/spitter, + ) + +/mob/living/carbon/alien/adult/banda/spitter/Initialize(mapload) + . = ..() + + add_movespeed_modifier(/datum/movespeed_modifier/alien_heavy) + + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/mob/living/carbon/alien/adult/banda/spitter/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/janna) diff --git a/modular_bandastation/xeno_rework/code/xeno_types/warrior.dm b/modular_bandastation/xeno_rework/code/xeno_types/warrior.dm new file mode 100644 index 0000000000000..f90efa18ee575 --- /dev/null +++ b/modular_bandastation/xeno_rework/code/xeno_types/warrior.dm @@ -0,0 +1,88 @@ +/// banda MODULE banda_XENO_REDO + +/mob/living/carbon/alien/adult/banda/warrior + name = "alien warrior" + desc = "Если среди чужих и есть ходячие танки, то этот — один из них, с тяжёлой бронёй и мощными руками, подтверждающими этот статус." + caste = "warrior" + maxHealth = 400 + health = 400 + icon_state = "alienwarrior" + melee_damage_lower = 30 + melee_damage_upper = 35 + + default_organ_types_by_slot = list( + 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_LIVER = /obj/item/organ/liver/alien, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/alien, + ORGAN_SLOT_XENO_PLASMAVESSEL = /obj/item/organ/alien/plasmavessel, + ) + +/mob/living/carbon/alien/adult/banda/warrior/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/spell/aoe/repulse/xeno/banda_tailsweep, + /datum/action/cooldown/mob_cooldown/charge/basic_charge/defender, + /datum/action/cooldown/alien/banda/warrior_agility, + ) + grant_actions_by_list(innate_actions) + + REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + add_movespeed_modifier(/datum/movespeed_modifier/alien_big) + +/mob/living/carbon/alien/adult/banda/warrior/add_tts_component() + AddComponent(/datum/component/tts_component, /datum/tts_seed/silero/barbarian) + +/datum/action/cooldown/alien/banda/warrior_agility + name = "Agility Mode" + desc = "Опуститесь на четвереньки, увеличивая скорость за счёт снижения урона и невозможности использовать большинство способностей." + 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/banda/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/banda/warrior_agility/proc/begin_agility() + var/mob/living/carbon/alien/adult/banda/agility_target = owner + agility_target.balloon_alert(agility_target, "agility active") + to_chat(agility_target, span_danger("Мы опускаемся на четвереньки, позволяя себе двигаться намного быстрее, но теряя возможность использовать большинство способностей.")) + playsound(agility_target, 'modular_bandastation/xeno_rework/sound/alien_hiss.ogg', 79, 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/banda/warrior_agility/proc/end_agility() + var/mob/living/carbon/alien/adult/banda/agility_target = owner + agility_target.balloon_alert(agility_target, "agility ended") + playsound(agility_target, 'modular_bandastation/xeno_rework/sound/alien_roar2.ogg', 70, 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/modular_bandastation/xeno_rework/icons/big_xenos.dmi b/modular_bandastation/xeno_rework/icons/big_xenos.dmi new file mode 100644 index 0000000000000..2f1c5bb00228a Binary files /dev/null and b/modular_bandastation/xeno_rework/icons/big_xenos.dmi differ diff --git a/modular_bandastation/xeno_rework/icons/xeno_actions.dmi b/modular_bandastation/xeno_rework/icons/xeno_actions.dmi new file mode 100644 index 0000000000000..56b6273cbfe30 Binary files /dev/null and b/modular_bandastation/xeno_rework/icons/xeno_actions.dmi differ diff --git a/modular_bandastation/xeno_rework/sound/alien_hiss.ogg b/modular_bandastation/xeno_rework/sound/alien_hiss.ogg new file mode 100644 index 0000000000000..f29323687b080 Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_hiss.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/alien_queen_screech.ogg b/modular_bandastation/xeno_rework/sound/alien_queen_screech.ogg new file mode 100644 index 0000000000000..8b99aebe96313 Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_queen_screech.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/alien_roar1.ogg b/modular_bandastation/xeno_rework/sound/alien_roar1.ogg new file mode 100644 index 0000000000000..302ebf810435b Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_roar1.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/alien_roar2.ogg b/modular_bandastation/xeno_rework/sound/alien_roar2.ogg new file mode 100644 index 0000000000000..4f96d740c0fe1 Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_roar2.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/alien_spitacid.ogg b/modular_bandastation/xeno_rework/sound/alien_spitacid.ogg new file mode 100644 index 0000000000000..b4aa578b171fd Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_spitacid.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/alien_spitacid2.ogg b/modular_bandastation/xeno_rework/sound/alien_spitacid2.ogg new file mode 100644 index 0000000000000..243d1aa1744c3 Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_spitacid2.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/alien_tail_swipe.ogg b/modular_bandastation/xeno_rework/sound/alien_tail_swipe.ogg new file mode 100644 index 0000000000000..5705cf90518ac Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/alien_tail_swipe.ogg differ diff --git a/modular_bandastation/xeno_rework/sound/bloodyslice.ogg b/modular_bandastation/xeno_rework/sound/bloodyslice.ogg new file mode 100644 index 0000000000000..8b2cb728939b2 Binary files /dev/null and b/modular_bandastation/xeno_rework/sound/bloodyslice.ogg differ