Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Praetorian dancer strain #699

Merged
merged 12 commits into from
Dec 14, 2024
Merged
4 changes: 4 additions & 0 deletions code/__DEFINES/dcs/signals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,10 @@
#define COMSIG_XENOABILITY_MINION_BEHAVIOUR "xenoability_minion_behavior"
#define COMSIG_XENOABILITY_SILENCE "xenoability_silence"

#define COMSIG_XENOABILITY_DODGE "xenoability_dodge"
#define COMSIG_XENOABILITY_IMPALE "xenoability_impale"
#define COMSIG_XENOABILITY_TAIL_TRIP "xenoability_tail_trip"

#define COMSIG_XENOABILITY_TOXIC_SPIT "xenoability_toxic_spit"
#define COMSIG_XENOABILITY_TOXIC_SLASH "xenoability_toxic_slash"
#define COMSIG_XENOABILITY_DRAIN_STING "xenoability_drain_sting"
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/movespeed_modification.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#define MOVESPEED_ID_CRESTDEFENSE "CRESTDEFENSE"
#define MOVESPEED_ID_WARRIOR_AGILITY "WARRIOR_AGILITY"
#define MOVESPEED_ID_FRENZY_AURA "FRENZY_AURA"
#define MOVESPEED_ID_PRAETORIAN_DANCER_DODGE_SPEED "PRAETORIAN_DANCER_DODGE_SPEED"
#define MOVESPEED_ID_XENO_HEMODILE "XENO_HEMODILE"
#define MOVESPEED_ID_RAVAGER_RAGE "RAVAGER_RAGE"
#define MOVESPEED_ID_BULL_ACID_CHARGE "BULL_ACID_CHARGE"
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/status_effects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@

#define STATUS_EFFECT_INTOXICATED /datum/status_effect/stacking/intoxicated //Damage over time

#define STATUS_EFFECT_DANCER_TAGGED /datum/status_effect/incapacitating/dancer_tagged //Additional damage/effects by Praetorian Dancer's abilities

#define STATUS_EFFECT_REPAIR_MODE /datum/status_effect/incapacitating/repair_mode //affected is blinded and stunned, but heals over time
///damage and sunder over time
#define STATUS_EFFECT_MELTING /datum/status_effect/stacking/melting
Expand Down
2 changes: 2 additions & 0 deletions code/_globalvars/lists/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ GLOBAL_LIST_INIT(all_xeno_types, list(
/mob/living/carbon/xenomorph/ravager/primordial,
/mob/living/carbon/xenomorph/praetorian,
/mob/living/carbon/xenomorph/praetorian/primordial,
/mob/living/carbon/xenomorph/praetorian/dancer,
/mob/living/carbon/xenomorph/praetorian/dancer/primordial,
mister-onion marked this conversation as resolved.
Show resolved Hide resolved
/mob/living/carbon/xenomorph/predalien,
/mob/living/carbon/xenomorph/boiler,
/mob/living/carbon/xenomorph/boiler/primordial,
Expand Down
18 changes: 18 additions & 0 deletions code/datums/keybinding/xeno.dm
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,24 @@
keybind_signal = COMSIG_XENOABILITY_DASH
hotkey_keys = list("E")

/datum/keybinding/xeno/dodge
name = "Dodge"
full_name = "Praetorian: Dodge"
description = "Gain a speed boost upon activation and the ability to pass through mobs. Enemies automatically receive bump attacks when passed."
keybind_signal = COMSIG_XENOABILITY_DODGE

/datum/keybinding/xeno/impale
name = "Impale"
full_name = "Praetorian: Impale"
description = "Impale a marine next to you with your tail for moderate damage. Marked enemies are impaled twice."
keybind_signal = COMSIG_XENOABILITY_IMPALE

/datum/keybinding/xeno/tail_trip
name = "Tail Trip"
full_name = "Praetorian: Tail Trip"
description = "Target a marine within two tiles of you to disorient and slows them. Marked enemies receive stronger debuffs and are stunned for a second."
keybind_signal = COMSIG_XENOABILITY_TAIL_TRIP

mister-onion marked this conversation as resolved.
Show resolved Hide resolved
/datum/keybinding/xeno/screech
name = "screech"
full_name = "Queen: Screech"
Expand Down
6 changes: 6 additions & 0 deletions code/datums/status_effects/debuffs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -847,3 +847,9 @@
name = "Freezing"
desc = "Space is very very cold, who would've thought?"
icon_state = "cold3"

// ***************************************
// *********** Dancer Tagged
// ***************************************
/datum/status_effect/incapacitating/dancer_tagged
id = "dancer_tagged"
Original file line number Diff line number Diff line change
Expand Up @@ -324,3 +324,203 @@ GLOBAL_LIST_INIT(acid_spray_hit, typecacheof(list(/obj/structure/barricade, /obj
if(!A)
continue
A.acid_spray_act(owner)

// ***************************************
// *********** Dodge
// ***************************************
/datum/action/ability/xeno_action/dodge
name = "Dodge"
action_icon_state = "dodge"
action_icon = 'icons/Xeno/actions.dmi'
desc = "Gain a speed boost upon activation and the ability to pass through mobs. Enemies automatically receive bump attacks when passed."
ability_cost = 100
cooldown_duration = 12 SECONDS
use_state_flags = ABILITY_USE_BUSY
keybind_flags = ABILITY_KEYBIND_USE_ABILITY
keybinding_signals = list(
KEYBINDING_NORMAL = COMSIG_XENOABILITY_DODGE,
)
/// The increase of speed when ability is active.
var/speed_buff = -0.4
/// How long the ability will last?
var/duration = 6 SECONDS

/datum/action/ability/xeno_action/dodge/action_activate(atom/A)
owner.balloon_alert(owner, "Dodge ready!")

owner.add_movespeed_modifier(MOVESPEED_ID_PRAETORIAN_DANCER_DODGE_SPEED, TRUE, 0, NONE, TRUE, speed_buff)
owner.allow_pass_flags |= (PASS_MOB|PASS_XENO)
owner.pass_flags |= (PASS_MOB|PASS_XENO)
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
addtimer(CALLBACK(src, PROC_REF(remove_effects)), duration)

succeed_activate()
add_cooldown()

/// Automatically bumps living non-xenos if bump attacks are on.
/datum/action/ability/xeno_action/dodge/proc/on_move(datum/source)
if(owner.stat == DEAD)
return FALSE
var/datum/action/bump_attack_toggle/bump_attack_action = owner.actions_by_path[/datum/action/bump_attack_toggle]
if(bump_attack_action == null || bump_attack_action.attacking) // Bump attacks are off if attacking is true, apparently.
return FALSE
if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_BUMP_ATTACK) || owner.next_move > world.time)
return FALSE

var/turf/current_turf = get_turf(owner)
for(var/mob/living/living_mob in current_turf)
if(living_mob.stat == DEAD)
continue
if(isxeno(living_mob))
var/mob/living/carbon/xenomorph/xenomorph_mob = living_mob
if(owner.issamexenohive(xenomorph_mob))
continue
owner.Bump(living_mob)
return

/// Removes the movespeed modifier and various pass_flags that was given by the dodge ability.
/datum/action/ability/xeno_action/dodge/proc/remove_effects()
owner.balloon_alert(owner, "Dodge inactive!")

owner.remove_movespeed_modifier(MOVESPEED_ID_PRAETORIAN_DANCER_DODGE_SPEED)
owner.allow_pass_flags &= ~(PASS_MOB|PASS_XENO)
owner.pass_flags &= ~(PASS_MOB|PASS_XENO)
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)

// ***************************************
// *********** Impale
// ***************************************
/datum/action/ability/activable/xeno/impale
name = "Impale"
action_icon_state = "impale"
action_icon = 'icons/Xeno/actions.dmi'
mister-onion marked this conversation as resolved.
Show resolved Hide resolved
desc = "Impale a marine next to you with your tail for moderate damage. Marked enemies are impaled twice."
ability_cost = 100
cooldown_duration = 8 SECONDS
keybinding_signals = list(
KEYBINDING_NORMAL = COMSIG_XENOABILITY_IMPALE,
)
target_flags = ABILITY_MOB_TARGET

/datum/action/ability/activable/xeno/impale/can_use_ability(atom/A, silent = FALSE, override_flags)
. = ..()
if(!.)
return FALSE
if(!iscarbon(A))
if(!silent)
A.balloon_alert(owner, "cannot impale")
return FALSE
if(isxeno(A))
var/mob/living/carbon/xenomorph/xenomorph_target = A
if(owner.issamexenohive(xenomorph_target))
A.balloon_alert(owner, "cannot impale ally")
return FALSE
var/mob/living/carbon/carbon_target = A
if(!owner.Adjacent(carbon_target))
carbon_target.balloon_alert(owner, "too far")
return FALSE
if(carbon_target.stat == DEAD)
carbon_target.balloon_alert(owner, "already dead")
return FALSE

/datum/action/ability/activable/xeno/impale/use_ability(atom/target_atom)
. = ..()

var/mob/living/carbon/xenomorph/xeno_owner = owner
if(!iscarbon(target_atom))
return
var/mob/living/carbon/living_target = target_atom
var/buffed = living_target.has_status_effect(STATUS_EFFECT_DANCER_TAGGED)
xeno_owner.visible_message(span_danger("\The [xeno_owner] violently slices [living_target] with its tail [buffed ? "twice" : ""]!"), \
span_danger("We slice [living_target] with our tail[buffed ? " twice" : ""]!"))

try_impale(living_target)
if(buffed)
xeno_owner.emote("roar")
addtimer(CALLBACK(src, PROC_REF(try_impale), living_target), 0.1 SECONDS) // A short delay for animation coolness (and also if they're dead).

succeed_activate()
add_cooldown()

/// Performs the main effect of impale ability like animating and attacking.
/datum/action/ability/activable/xeno/impale/proc/try_impale(mob/living/carbon/living_target)
var/mob/living/carbon/xenomorph/xeno_owner = owner
var/damage = (xeno_owner.xeno_caste.melee_damage * xeno_owner.xeno_melee_damage_modifier)
xeno_owner.face_atom(living_target)
xeno_owner.do_attack_animation(living_target, ATTACK_EFFECT_REDSLASH)
xeno_owner.spin(4, 1)
playsound(living_target,'sound/weapons/alien_tail_attack.ogg', 30, TRUE)
if(living_target.stat != DEAD) // If they drop dead from the first impale, keep the effects but do no damage.
living_target.apply_damage(damage, BRUTE, blocked = MELEE)

// ***************************************
// *********** Tail Trip
// ***************************************
/datum/action/ability/activable/xeno/tail_trip
name = "Tail Trip"
action_icon_state = "tail_trip"
action_icon = 'icons/Xeno/actions.dmi'
mister-onion marked this conversation as resolved.
Show resolved Hide resolved
desc = "Target a marine within two tiles of you to disorient and slows them. Marked enemies receive stronger debuffs and are stunned for a second."
ability_cost = 50
cooldown_duration = 8 SECONDS
keybinding_signals = list(
KEYBINDING_NORMAL = COMSIG_XENOABILITY_TAIL_TRIP,
)
target_flags = ABILITY_MOB_TARGET

/datum/action/ability/activable/xeno/tail_trip/can_use_ability(atom/A, silent = FALSE, override_flags)
. = ..()
if(!.)
return FALSE
if(!iscarbon(A))
if(!silent)
A.balloon_alert(owner, "cannot tail trip")
return FALSE
if(isxeno(A))
var/mob/living/carbon/xenomorph/xenomorph_target = A
if(owner.issamexenohive(xenomorph_target))
A.balloon_alert(owner, "cannot tail trip ally")
return FALSE
var/mob/living/carbon/carbon_target = A
if(get_dist(owner, carbon_target) > 2)
if(!silent)
carbon_target.balloon_alert(owner, "too far")
return FALSE
if(!line_of_sight(owner, carbon_target, 2))
if(!silent)
carbon_target.balloon_alert(owner, "need line of sight")
return FALSE
if(carbon_target.stat == DEAD)
carbon_target.balloon_alert(owner, "already dead")
return FALSE
if(carbon_target.stat == UNCONSCIOUS)
carbon_target.balloon_alert(owner, "not standing")
return FALSE

/datum/action/ability/activable/xeno/tail_trip/use_ability(atom/target_atom)
. = ..()

var/mob/living/carbon/xenomorph/xeno_owner = owner
if(!iscarbon(target_atom))
return

var/mob/living/carbon/living_target = target_atom

var/damage = (xeno_owner.xeno_caste.melee_damage * xeno_owner.xeno_melee_damage_modifier)
var/buffed = living_target.has_status_effect(STATUS_EFFECT_DANCER_TAGGED)

xeno_owner.visible_message(span_danger("\The [xeno_owner] sweeps [living_target]'s legs with its tail!"), \
span_danger("We trip [living_target] with our tail!"))
shake_camera(living_target, 2, 1)
xeno_owner.face_atom(living_target)
xeno_owner.spin(4, 1)
xeno_owner.emote("tail")
playsound(living_target,'sound/weapons/alien_claw_block.ogg', 50, 1)

living_target.Paralyze(buffed ? 1 SECONDS : 0.1 SECONDS)
living_target.adjust_stagger(buffed ? 5 SECONDS : 4 SECONDS)
living_target.adjust_slowdown(buffed ? 1.2 : 0.9)
living_target.apply_damage(damage, STAMINA, updating_health = TRUE)

succeed_activate()
add_cooldown()
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,59 @@
/datum/action/ability/xeno_action/pheromones/emit_warding,
/datum/action/ability/xeno_action/pheromones/emit_frenzy,
)

/datum/xeno_caste/praetorian/dancer
caste_type_path = /mob/living/carbon/xenomorph/praetorian/dancer
upgrade_name = ""
caste_name = "Dancer Praetorian"
display_name = "Praetorian"
upgrade = XENO_UPGRADE_BASETYPE
caste_desc = "A giant melee monster. It looks pretty strong."

// +2 melee damage
melee_damage = 25

// Loses some common armor (-5) for more speed (-0.3).
speed = -0.8
soft_armor = list(MELEE = 40, BULLET = 45, LASER = 45, ENERGY = 45, BOMB = 10, BIO = 40, FIRE = 45, ACID = 40)
mister-onion marked this conversation as resolved.
Show resolved Hide resolved

// Loses ranged spit abilities for close combat combo abilities.
actions = list(
/datum/action/ability/xeno_action/xeno_resting,
/datum/action/ability/xeno_action/watch_xeno,
/datum/action/ability/activable/xeno/psydrain,
/datum/action/ability/xeno_action/place_acidwell,
/datum/action/ability/activable/xeno/corrosive_acid,
/datum/action/ability/xeno_action/dodge,
/datum/action/ability/activable/xeno/impale,
/datum/action/ability/activable/xeno/tail_trip,
/datum/action/ability/xeno_action/pheromones,
/datum/action/ability/xeno_action/pheromones/emit_recovery,
/datum/action/ability/xeno_action/pheromones/emit_warding,
/datum/action/ability/xeno_action/pheromones/emit_frenzy,
)

/datum/xeno_caste/praetorian/dancer/normal
upgrade = XENO_UPGRADE_NORMAL

/datum/xeno_caste/praetorian/dancer/primordial
upgrade_name = "Primordial"
caste_desc = "An aberrant creature extremely proficient with its body and tail. Keep your distance if you don't wish to be finessed."
upgrade = XENO_UPGRADE_PRIMO
primordial_message = "With a flick of our tail, we dance through the shadows, striking with lethal precision."

actions = list(
/datum/action/ability/xeno_action/xeno_resting,
/datum/action/ability/xeno_action/watch_xeno,
/datum/action/ability/activable/xeno/psydrain,
/datum/action/ability/xeno_action/place_acidwell,
/datum/action/ability/activable/xeno/corrosive_acid,
/datum/action/ability/xeno_action/dodge,
/datum/action/ability/activable/xeno/impale,
/datum/action/ability/activable/xeno/tail_trip,
/datum/action/ability/activable/xeno/charge/dash, // No unique primordial ability at the moment. Replace eventually with something cooler!
mister-onion marked this conversation as resolved.
Show resolved Hide resolved
/datum/action/ability/xeno_action/pheromones,
/datum/action/ability/xeno_action/pheromones/emit_recovery,
/datum/action/ability/xeno_action/pheromones/emit_warding,
/datum/action/ability/xeno_action/pheromones/emit_frenzy,
)
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,15 @@
/datum/xenomorph_skin/praetorian,
)

/mob/living/carbon/xenomorph/praetorian/dancer
caste_base_type = /datum/xeno_caste/praetorian/dancer

/mob/living/carbon/xenomorph/praetorian/dancer/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_XENOMORPH_POSTATTACK_LIVING, PROC_REF(on_postattack))

/// Applies the dancer mark status effect to those that they slash and damage.
/mob/living/carbon/xenomorph/praetorian/dancer/proc/on_postattack(mob/living/source, mob/living/target, damage)
SIGNAL_HANDLER
target.apply_status_effect(STATUS_EFFECT_DANCER_TAGGED, 4 SECONDS)

3 changes: 3 additions & 0 deletions code/modules/mob/living/carbon/xenomorph/xenoupgrade.dm
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@
/mob/living/carbon/xenomorph/praetorian/primordial
upgrade = XENO_UPGRADE_PRIMO

/mob/living/carbon/xenomorph/praetorian/dancer/primordial
upgrade = XENO_UPGRADE_PRIMO

//----PRAETORIAN END----//
//================//
//----RAVAGER START----//
Expand Down
Binary file modified icons/Xeno/actions.dmi
Binary file not shown.
Binary file added icons/Xeno/castes/praetorian/dancer.dmi
Binary file not shown.