diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index e3a35d0c4744..1c86446df1fc 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -62,6 +62,9 @@ #define ACID_SPRAY_LINE 0 #define ACID_SPRAY_CONE 1 +/// Defines for Abomination ability /datum/action/xeno_action/activable/feralfrenzy +#define SINGLETARGETGUT 0 +#define AOETARGETGUT 1 #define WARDEN_HEAL_SHIELD 0 #define WARDEN_HEAL_HP 1 diff --git a/code/datums/ammo/energy.dm b/code/datums/ammo/energy.dm index 27d2b7d4e0c5..c16edb749c04 100644 --- a/code/datums/ammo/energy.dm +++ b/code/datums/ammo/energy.dm @@ -230,3 +230,10 @@ var/mob/living/carbon/xenomorph/xeno = hit_mob xeno.apply_damage(damage * 0.75, BURN) xeno.interference = 30 + +/datum/ammo/energy/yautja/rifle/bolt/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 9cb8a8bef3fc..34233f2ee9cd 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -938,7 +938,7 @@ /obj/item/weapon/gun/energy/yautja/plasmarifle/set_gun_config_values() ..() - set_fire_delay(FIRE_DELAY_TIER_6*2) + set_fire_delay(FIRE_DELAY_TIER_4*2) accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_10 accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_10 scatter = SCATTER_AMOUNT_TIER_6 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm index aa98f063b8d5..b1358e30c26b 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm @@ -1,14 +1,22 @@ -/datum/action/xeno_action/activable/pounce/predalien - name = "Leap" + +/datum/action/xeno_action/onclick/feralrush + name = "Feral Rush" + action_icon_state = "charge_spit" + ability_name = "toughen up" + macro_path = /datum/action/xeno_action/verb/verb_feralrush ability_primacy = XENO_PRIMARY_ACTION_1 + action_type = XENO_ACTION_ACTIVATE + xeno_cooldown = 12 SECONDS + + // Config + var/speed_duration = 3 SECONDS + var/armor_duration = 6 SECONDS + var/speed_buff_amount = 0.8 // Go from shit slow to kindafast + var/armor_buff_amount = 10 // hopefully-minor buff so they can close the distance - knockdown = FALSE + var/speed_buff = FALSE + var/armor_buff = FALSE - distance = 5 - knockdown = FALSE // Should we knock down the target? - slash = FALSE // Do we slash upon reception? - freeze_self = FALSE // Should we freeze ourselves after the lunge? - should_destroy_objects = TRUE // Only used for ravager charge /datum/action/xeno_action/onclick/predalien_roar name = "Roar" @@ -16,37 +24,53 @@ ability_name = "roar" action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 + macro_path = /datum/action/xeno_action/verb/verb_predalien_roar xeno_cooldown = 25 SECONDS - plasma_cost = 50 - var/predalien_roar = list("sound/voice/predalien_roar.ogg") var/bonus_damage_scale = 2.5 var/bonus_speed_scale = 0.05 -/datum/action/xeno_action/onclick/smash - name = "Smash" - action_icon_state = "stomp" - ability_name = "smash" +/datum/action/xeno_action/activable/feral_smash + name = "Feral Smash" + ability_name = "Feral Smash" + action_icon_state = "lunge" action_type = XENO_ACTION_CLICK + macro_path = /datum/action/xeno_action/verb/feral_smash ability_primacy = XENO_PRIMARY_ACTION_3 xeno_cooldown = 20 SECONDS - plasma_cost = 80 - - var/freeze_duration = 1.5 SECONDS - var/activation_delay = 1 SECONDS - var/smash_sounds = list('sound/effects/alien_footstep_charge1.ogg', 'sound/effects/alien_footstep_charge2.ogg', 'sound/effects/alien_footstep_charge3.ogg') + // Configurables + var/grab_range = 4 + var/click_miss_cooldown = 15 + var/twitch_message_cooldown = 0 //apparently this is necessary for a tiny code that makes the lunge message on cooldown not be spammable, doesn't need to be big so 5 will do. + var/smash_damage = 20 + var/smash_scale = 10 + var/stun_duration = 2 SECONDS -/datum/action/xeno_action/activable/devastate - name = "Devastate" - action_icon_state = "gut" - ability_name = "devastate" +/datum/action/xeno_action/activable/feralfrenzy + name = "Feral Frenzy" + action_icon_state = "rav_eviscerate" + ability_name = "Feral Frenzy" action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_4 - xeno_cooldown = 20 SECONDS - plasma_cost = 110 - - var/activation_delay = 1 SECONDS + macro_path = /datum/action/xeno_action/verb/verb_feralfrenzy + xeno_cooldown = 15 SECONDS + //AOE + var/activation_delay_aoe = 1 SECONDS + var/base_damage_aoe = 15 + var/damage_scale_aoe = 10 + //SINGLE TARGET + var/activation_delay = 0.5 SECONDS var/base_damage = 25 - var/damage_scale = 10 // How much it scales by every kill + var/damage_scale = 10 + var/targeting = SINGLETARGETGUT + /// The orange used for a AOETARGETGUT + var/range = 2 + +/datum/action/xeno_action/onclick/toggle_gut_targeting + name = "Toggle Gutting Type" + action_icon_state = "gut" // starting targetting is SINGLETARGETGUT + macro_path = /datum/action/xeno_action/verb/verb_toggle_gut_targeting + action_type = XENO_ACTION_ACTIVATE + ability_primacy = XENO_PRIMARY_ACTION_5 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm new file mode 100644 index 000000000000..450a0ac67745 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm @@ -0,0 +1,35 @@ +/datum/action/xeno_action/verb/verb_feralfrenzy() + set category = "Alien" + set name = "Feral Frenzy" + set hidden = TRUE + var/action_name = "Feral Frenzy" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/verb/verb_toggle_gut_targeting() + set category = "Alien" + set name = "Toggle Gutting Type" + set hidden = TRUE + var/action_name = "Toggle Gutting Type" + handle_xeno_macro(src, action_name) + + +/datum/action/xeno_action/verb/verb_feralrush() + set category = "Alien" + set name = "Feral Rush" + set hidden = TRUE + var/action_name = "Feral Rush" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/verb/verb_predalien_roar() + set category = "Alien" + set name = "Predalien Roar" + set hidden = TRUE + var/action_name = "Roar" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/verb/feral_smash() + set category = "Alien" + set name = "Feral Smash" + set hidden = TRUE + var/action_name = "Feral Smash" + handle_xeno_macro(src, action_name) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm index cdf0d3840084..6e6fef86a2f4 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm @@ -1,13 +1,10 @@ -/datum/action/xeno_action/activable/pounce/predalien/pre_pounce_effects() - playsound(owner, 'sound/voice/predalien_pounce.ogg', 75, 0, status = 0) - /datum/action/xeno_action/onclick/predalien_roar/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner - if (!action_cooldown_check()) + if(!action_cooldown_check()) return - if (!xeno.check_state()) + if(!xeno.check_state()) return if(!check_and_use_plasma_owner()) @@ -34,124 +31,258 @@ continue new /datum/effects/xeno_buff(carbon, xeno, ttl = (0.25 SECONDS * behavior.kills + 3 SECONDS), bonus_damage = bonus_damage_scale * behavior.kills, bonus_speed = (bonus_speed_scale * behavior.kills)) - - for(var/mob/M in view(xeno)) - if(M && M.client) - shake_camera(M, 10, 1) - apply_cooldown() return ..() -/datum/action/xeno_action/onclick/smash/use_ability(atom/target) +/datum/action/xeno_action/activable/feralfrenzy/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner - - if (!action_cooldown_check()) + if(!action_cooldown_check() || xeno.action_busy) + return + if(!xeno.check_state()) return - if (!xeno.check_state()) + var/datum/behavior_delegate/predalien_base/predalienbehavior = xeno.behavior_delegate + if(!istype(predalienbehavior)) return + if(targeting == AOETARGETGUT) + xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] begins digging in for a massive strike!"), SPAN_XENOHIGHDANGER("We begin digging in for a massive strike!")) + ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Eviscerate")) + xeno.anchored = TRUE + if (do_after(xeno, (activation_delay_aoe), INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + xeno.emote("roar") + xeno.spin_circle() + + for (var/mob/living/carbon/carbon in orange(xeno, range)) + if(!isliving(carbon) || xeno.can_not_harm(carbon)) + continue + + if (carbon.stat == DEAD) + continue + + if(!check_clear_path_to_target(xeno, carbon)) + continue + + xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("We rip open the guts of [carbon]!")) + carbon.spawn_gibs() + xeno.animation_attack_on(carbon) + xeno.spin_circle() + xeno.flick_attack_overlay(carbon, "tail") + playsound(get_turf(carbon), 'sound/effects/gibbed.ogg', 30, 1) + carbon.apply_effect(get_xeno_stun_duration(carbon, 0.5), WEAKEN) + playsound(get_turf(carbon), "alien_claw_flesh", 30, 1) + carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, base_damage_aoe + damage_scale_aoe * predalienbehavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) + playsound(owner, 'sound/voice/predalien_death.ogg', 75, 0, status = 0) + REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Eviscerate")) + xeno.anchored = FALSE + apply_cooldown() + return ..() - var/datum/behavior_delegate/predalien_base/behavior = xeno.behavior_delegate - if(!istype(behavior)) + //single target checks + if(xeno.can_not_harm(target)) + to_chat(xeno, SPAN_XENOWARNING("We must target a hostile!")) return - if(!check_plasma_owner()) + if(!isliving(target)) return - if(!do_after(xeno, activation_delay, INTERRUPT_ALL, BUSY_ICON_GENERIC)) - to_chat(xeno, "Keep still whilst trying to smash into the ground") + if(get_dist_sqrd(target, xeno) > 2) + to_chat(xeno, SPAN_XENOWARNING("[target] is too far away!")) + return - var/real_cooldown = xeno_cooldown + var/mob/living/carbon/carbon = target - xeno_cooldown = 3 SECONDS + if(carbon.stat == DEAD) + to_chat(xeno, SPAN_XENOWARNING("[carbon] is dead, why would we want to touch them?")) + return + if(targeting == SINGLETARGETGUT) // single target + ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) apply_cooldown() - xeno_cooldown = real_cooldown + + ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) + xeno.anchored = TRUE + + if(do_after(xeno, activation_delay, INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("We rapidly slice into [carbon]!")) + carbon.spawn_gibs() + playsound(get_turf(carbon), 'sound/effects/gibbed.ogg', 50, 1) + carbon.apply_effect(get_xeno_stun_duration(carbon, 0.5), WEAKEN) + carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, base_damage + damage_scale * predalienbehavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) + + xeno.animation_attack_on(carbon) + xeno.spin_circle() + xeno.flick_attack_overlay(carbon, "tail") + + playsound(owner, 'sound/voice/predalien_growl.ogg', 50, 0, status = 0) + + REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) + xeno.anchored = FALSE + unroot_human(carbon, TRAIT_SOURCE_ABILITY("Devastate")) + + return ..() + + +/datum/action/xeno_action/onclick/feralrush/use_ability(atom/A) + var/mob/living/carbon/xenomorph/predatoralien = owner + + if(!action_cooldown_check()) + return + + if(!istype(predatoralien) || !predatoralien.check_state()) + return + + if(armor_buff && speed_buff) + to_chat(predatoralien, SPAN_XENOHIGHDANGER("We cannot stack this!")) return if(!check_and_use_plasma_owner()) return - playsound(xeno.loc, pick(smash_sounds), 50, 0, status = 0) - xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] smashes into the ground!")) - xeno.create_stomp() + addtimer(CALLBACK(src, PROC_REF(remove_rush_effects)), speed_duration) + addtimer(CALLBACK(src, PROC_REF(remove_armor_effects)), armor_duration) // calculate armor and speed differently, so it's a bit more armored while trying to get out + predatoralien.add_filter("predalien_toughen", 1, list("type" = "outline", "color" = "#421313", "size" = 1)) + to_chat(predatoralien, SPAN_XENOWARNING("We feel our muscles tense as our speed and armor increase!")) + speed_buff = TRUE + armor_buff = TRUE + predatoralien.speed_modifier -= speed_buff_amount + predatoralien.armor_modifier += armor_buff_amount + predatoralien.recalculate_speed() + predatoralien.recalculate_armor() + playsound(predatoralien, 'sound/voice/predalien_growl.ogg', 75, 0, status = 0) + apply_cooldown() - for(var/mob/living/carbon/carbon in oview(round(behavior.kills * 0.5 + 2), xeno)) - if(!xeno.can_not_harm(carbon) && carbon.stat != DEAD) - ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Smash")) - if (ishuman(carbon)) - var/mob/living/carbon/human/human = carbon - human.update_xeno_hostile_hud() +/datum/action/xeno_action/onclick/feralrush/proc/remove_rush_effects() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/predatoralien = owner + if(speed_buff == TRUE) + to_chat(predatoralien, SPAN_XENOWARNING("Our muscles relax as we feel our speed wane.")) + predatoralien.remove_filter("predalien_toughen") + predatoralien.speed_modifier += speed_buff_amount + predatoralien.recalculate_speed() + speed_buff = FALSE - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), carbon, TRAIT_SOURCE_ABILITY("Smash")), get_xeno_stun_duration(carbon, freeze_duration)) +/datum/action/xeno_action/onclick/feralrush/proc/remove_armor_effects() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/predatoralien = owner + if(armor_buff) + to_chat(predatoralien, SPAN_XENOWARNING("We are no longer armored.")) + predatoralien.armor_modifier -= armor_buff_amount + predatoralien.recalculate_armor() + armor_buff = FALSE - for(var/mob/M in view(xeno)) - if(M && M.client) - shake_camera(M, 0.2 SECONDS, 1) - apply_cooldown() - return ..() +/datum/action/xeno_action/onclick/toggle_gut_targeting/use_ability(atom/A) -/datum/action/xeno_action/activable/devastate/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner + var/action_icon_result - if (!action_cooldown_check()) + if(!xeno.check_state()) return - if (!xeno.check_state()) + var/datum/action/xeno_action/activable/feralfrenzy/guttype = get_xeno_action_by_type(xeno, /datum/action/xeno_action/activable/feralfrenzy) + if(!guttype) return - if (!isxeno_human(target) || xeno.can_not_harm(target)) - to_chat(xeno, SPAN_XENOWARNING("We must target a hostile!")) - return + if(guttype.targeting == SINGLETARGETGUT) + action_icon_result = "rav_scissor_cut" + guttype.targeting = AOETARGETGUT + to_chat(xeno, SPAN_XENOWARNING("We will now attack everyone around us during a Feral Frenzy.")) + else + action_icon_result = "gut" + guttype.targeting = SINGLETARGETGUT + to_chat(xeno, SPAN_XENOWARNING("We will now focus our Feral Frenzy on one person!")) + + button.overlays.Cut() + button.overlays += image('icons/mob/hud/actions_xeno.dmi', button, action_icon_result) + return ..() - if (get_dist_sqrd(target, xeno) > 2) - to_chat(xeno, SPAN_XENOWARNING("[target] is too far away!")) - return +/datum/action/xeno_action/activable/feral_smash/use_ability(atom/affected_atom) + var/mob/living/carbon/xenomorph/predalien_smash = owner + var/datum/behavior_delegate/predalien_base/predalienbehavior = predalien_smash.behavior_delegate - var/mob/living/carbon/carbon = target + if(!action_cooldown_check()) + if(twitch_message_cooldown < world.time ) + predalien_smash.visible_message(SPAN_XENOWARNING("[predalien_smash]'s muscles twitch."), SPAN_XENOWARNING("Our claws twitch as we try to grab onto the target but lack the strength. Wait a moment to try again.")) + twitch_message_cooldown = world.time + 5 SECONDS + return //this gives a little feedback on why your lunge didn't hit other than the lunge button going grey. Plus, it might spook marines that almost got lunged if they know why the message appeared, and extra spookiness is always good. - if (carbon.stat == DEAD) - to_chat(xeno, SPAN_XENOWARNING("[carbon] is dead, why would we want to touch them?")) + if(!affected_atom) return - var/datum/behavior_delegate/predalien_base/behavior = xeno.behavior_delegate - if(!istype(behavior)) + if(!isturf(predalien_smash.loc)) + to_chat(predalien_smash, SPAN_XENOWARNING("We can't lunge from here!")) return - if (!check_and_use_plasma_owner()) + if(!predalien_smash.check_state() || predalien_smash.agility) return - ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - - if (ishuman(carbon)) - var/mob/living/carbon/human/human = carbon - human.update_xeno_hostile_hud() - - apply_cooldown() - - ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - xeno.anchored = TRUE + if(predalien_smash.can_not_harm(affected_atom) || !ismob(affected_atom)) + apply_cooldown_override(click_miss_cooldown) + return - if (do_after(xeno, activation_delay, INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) - xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("We rip open the guts of [carbon]!")) - carbon.spawn_gibs() - playsound(get_turf(carbon), 'sound/effects/gibbed.ogg', 75, 1) - carbon.apply_effect(get_xeno_stun_duration(carbon, 0.5), WEAKEN) - carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, base_damage + damage_scale * behavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) - xeno.animation_attack_on(carbon) - xeno.spin_circle() - xeno.flick_attack_overlay(carbon, "tail") + var/mob/living/carbon/carbon = affected_atom + if(carbon.stat == DEAD) + return - playsound(owner, 'sound/voice/predalien_growl.ogg', 75, 0, status = 0) + if(!isliving(affected_atom)) + return - REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - xeno.anchored = FALSE - unroot_human(carbon, TRAIT_SOURCE_ABILITY("Devastate")) + if(!check_and_use_plasma_owner()) + return - xeno.visible_message(SPAN_XENODANGER("[xeno] rapidly slices into [carbon]!")) + apply_cooldown() + predalien_smash.throw_atom(get_step_towards(affected_atom, predalien_smash), grab_range, SPEED_FAST, predalien_smash) + + if(predalien_smash.Adjacent(carbon) && predalien_smash.start_pulling(carbon, TRUE)) + playsound(carbon.pulledby, 'sound/voice/predalien_growl.ogg', 75, 0, status = 0) // bang and roar for dramatic effect + playsound(carbon, 'sound/effects/bang.ogg', 25, 0) + animate(carbon, pixel_y = carbon.pixel_y + 32, time = 4, easing = SINE_EASING) + sleep(4) + playsound(carbon, 'sound/effects/bang.ogg', 25, 0) + playsound(carbon,"slam", 50, 1) + animate(carbon, pixel_y = 0, time = 4, easing = BOUNCE_EASING) //animates the smash + carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, smash_damage + smash_scale * predalienbehavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) + else + predalien_smash.visible_message(SPAN_XENOWARNING("[predalien_smash]'s claws twitch."), SPAN_XENOWARNING("We couldn't grab our target. Wait a moment to try again.")) + + return TRUE + +/mob/living/carbon/xenomorph/predalien/stop_pulling() + if(isliving(pulling) && smashing) + smashing = FALSE // To avoid extreme cases of stopping a lunge then quickly pulling and stopping to pull someone else + var/mob/living/smashed = pulling + smashed.set_effect(0, STUN) + smashed.set_effect(0, WEAKEN) return ..() + +/mob/living/carbon/xenomorph/predalien/start_pulling(atom/movable/movable_atom, feral_smash) + if(!check_state()) + return FALSE + + if(!isliving(movable_atom)) + return FALSE + var/mob/living/living_mob = movable_atom + var/should_neckgrab = !(src.can_not_harm(living_mob)) && feral_smash + + + . = ..(living_mob, feral_smash, should_neckgrab) + + if(.) //successful pull + if(isxeno(living_mob)) + var/mob/living/carbon/xenomorph/xeno = living_mob + if(xeno.tier >= 2) // Tier 2 castes or higher immune to warrior grab stuns + return + + if(should_neckgrab && living_mob.mob_size < MOB_SIZE_BIG) + visible_message(SPAN_XENOWARNING("[src] grabs [living_mob] by the back of their leg and slams them onto the ground!"), \ + SPAN_XENOWARNING("We grab [living_mob] by the back of their leg and slam them onto the ground!")) // more flair + smashing = TRUE + living_mob.drop_held_items() + var/duration = get_xeno_stun_duration(living_mob, 1) + living_mob.KnockDown(duration) + living_mob.Stun(duration) + addtimer(VARSET_CALLBACK(src, smashing, FALSE), duration) diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index d57df232cda4..c0242071fd86 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -910,7 +910,7 @@ return XENO_ATTACK_ACTION /obj/structure/girder/attack_alien(mob/living/carbon/xenomorph/M) - if((M.caste && M.caste.tier < 2 && !isqueen(M)) || unacidable) + if((M.caste && M.caste.tier < 2 && M.claw_type < CLAW_TYPE_VERY_SHARP) || unacidable) to_chat(M, SPAN_WARNING("Our claws aren't sharp enough to damage [src].")) return XENO_NO_DELAY_ACTION M.animation_attack_on(src) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm index bcf47386fefc..f6ce5e3e596c 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm @@ -6,8 +6,7 @@ melee_damage_upper = XENO_DAMAGE_TIER_5 melee_vehicle_damage = XENO_DAMAGE_TIER_5 max_health = XENO_HEALTH_TIER_9 - plasma_gain = XENO_PLASMA_GAIN_TIER_9 - plasma_max = XENO_PLASMA_TIER_3 + plasma_max = XENO_NO_PLASMA xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_10 armor_deflection = XENO_ARMOR_TIER_3 evasion = XENO_EVASION_NONE @@ -41,6 +40,7 @@ speaking_noise = 'sound/voice/predalien_click.ogg' plasma_types = list(PLASMA_CATECHOLAMINE) faction = FACTION_PREDALIEN + claw_type = CLAW_TYPE_VERY_SHARP wall_smash = TRUE hardcore = FALSE pixel_x = -16 @@ -56,10 +56,11 @@ /datum/action/xeno_action/onclick/regurgitate, /datum/action/xeno_action/watch_xeno, /datum/action/xeno_action/activable/tail_stab, - /datum/action/xeno_action/activable/pounce/predalien, + /datum/action/xeno_action/onclick/feralrush, /datum/action/xeno_action/onclick/predalien_roar, - /datum/action/xeno_action/onclick/smash, - /datum/action/xeno_action/activable/devastate, + /datum/action/xeno_action/activable/feral_smash, + /datum/action/xeno_action/activable/feralfrenzy, + /datum/action/xeno_action/onclick/toggle_gut_targeting, /datum/action/xeno_action/onclick/tacmap, ) @@ -68,8 +69,8 @@ weed_food_icon = 'icons/mob/xenos/weeds_64x64.dmi' weed_food_states = list("Predalien_1","Predalien_2","Predalien_3") weed_food_states_flipped = list("Predalien_1","Predalien_2","Predalien_3") + var/smashing = FALSE - var/butcher_time = 6 SECONDS /mob/living/carbon/xenomorph/predalien/Initialize(mapload, mob/living/carbon/xenomorph/oldxeno, h_number) @@ -88,15 +89,20 @@ to_chat(src, {" |______________________| -You are a predator-alien hybrid! -You are a very powerful xenomorph creature that was born of a Yautja warrior body. -You are stronger, faster, and smarter than a regular xenomorph, but you must still listen to the queen. -You have a degree of freedom to where you can hunt and claim the heads of the hive's enemies, so check your verbs. -Your health meter will not regenerate normally, so kill and die for the hive! +You are a yautja-alien hybrid! +You are a xenomorph born from the body of your natural enemy, you are considered an abomination to all of the yautja race and they will do WHATEVER it takes to kill you. +However, being born from one you also harbor their intelligence and strength. You are built to be able to take them on but that does not mean you are invincible. Stay with your hive and overwhelm them with your numbers. Your sisters have sacrificed a lot for you; Do not just wander off and die. +You must still listen to the queen. + |______________________| "}) emote("roar") + +/mob/living/carbon/xenomorph/predalien/resist_fire() + ..() + SetKnockDown(0.1 SECONDS) + /datum/behavior_delegate/predalien_base name = "Base Predalien Behavior Delegate" @@ -120,53 +126,11 @@ Your health meter will not regenerate normally, so kill and die for the hive!