diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm
index f869357efd1b..54fd2cb0164d 100644
--- a/code/__DEFINES/job.dm
+++ b/code/__DEFINES/job.dm
@@ -359,6 +359,7 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define JOB_PLAYTIME_TIER_2 (25 HOURS)
#define JOB_PLAYTIME_TIER_3 (70 HOURS)
#define JOB_PLAYTIME_TIER_4 (175 HOURS)
+#define JOB_PLAYTIME_TIER_5 (1000 HOURS)
#define XENO_NO_AGE -1
#define XENO_YOUNG 0
@@ -367,6 +368,7 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define XENO_ELDER 3
#define XENO_ANCIENT 4
#define XENO_PRIME 5
+#define XENO_IMPERATOR 6
/// For monthly time tracking
#define JOB_OBSERVER "Observer"
diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm
index 18d4908c9df7..3e66f5497d14 100644
--- a/code/__DEFINES/xeno.dm
+++ b/code/__DEFINES/xeno.dm
@@ -697,7 +697,8 @@
#define XENO_CASTE_QUEEN "Queen"
#define XENO_CASTE_PREDALIEN "Predalien"
#define XENO_CASTE_HELLHOUND "Hellhound"
-#define XENO_SPECIAL_CASTES list(XENO_CASTE_QUEEN, XENO_CASTE_PREDALIEN, XENO_CASTE_HELLHOUND)
+#define XENO_CASTE_PALATINE "Palatine"
+#define XENO_SPECIAL_CASTES list(XENO_CASTE_QUEEN, XENO_CASTE_PREDALIEN, XENO_CASTE_HELLHOUND, XENO_CASTE_PALATINE)
#define ALL_XENO_CASTES list(XENO_CASTE_LARVA, XENO_CASTE_PREDALIEN_LARVA, XENO_CASTE_FACEHUGGER, XENO_CASTE_LESSER_DRONE, XENO_CASTE_DRONE, XENO_CASTE_RUNNER, XENO_CASTE_SENTINEL, XENO_CASTE_DEFENDER, XENO_CASTE_BURROWER, XENO_CASTE_CARRIER, XENO_CASTE_HIVELORD, XENO_CASTE_LURKER, XENO_CASTE_WARRIOR, XENO_CASTE_SPITTER, XENO_CASTE_BOILER, XENO_CASTE_PRAETORIAN, XENO_CASTE_CRUSHER, XENO_CASTE_RAVAGER, XENO_CASTE_QUEEN, XENO_CASTE_PREDALIEN, XENO_CASTE_HELLHOUND)
diff --git a/code/datums/entities/player_times.dm b/code/datums/entities/player_times.dm
index 2bbd4a3bc39e..2c6dd7b94af9 100644
--- a/code/datums/entities/player_times.dm
+++ b/code/datums/entities/player_times.dm
@@ -54,8 +54,10 @@ BSQL_PROTECT_DATUM(/datum/entity/player_time)
icon_display = "tier2_big"
if(JOB_PLAYTIME_TIER_3 to JOB_PLAYTIME_TIER_4)
icon_display = "tier3_big"
- if(JOB_PLAYTIME_TIER_4 to INFINITY)
+ if(JOB_PLAYTIME_TIER_4 to JOB_PLAYTIME_TIER_5)
icon_display = "tier4_big"
+ if(JOB_PLAYTIME_TIER_5 to INFINITY)
+ icon_display = "tier5_big"
var/playtime_percentage = min((total_minutes MINUTES_TO_DECISECOND) / JOB_PLAYTIME_TIER_4, 1)
return list(
diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm
index 58c9ad5b5092..8f8944ec58a7 100644
--- a/code/game/jobs/role_authority.dm
+++ b/code/game/jobs/role_authority.dm
@@ -760,6 +760,8 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou
M = /mob/living/carbon/xenomorph/predalien
if(XENO_CASTE_HELLHOUND)
M = /mob/living/carbon/xenomorph/hellhound
+ if(XENO_CASTE_PALATINE)
+ M = /mob/living/carbon/xenomorph/palatine
return M
diff --git a/code/modules/admin/player_panel/actions/transform.dm b/code/modules/admin/player_panel/actions/transform.dm
index 91a62b1a1d02..3d3704f02c92 100644
--- a/code/modules/admin/player_panel/actions/transform.dm
+++ b/code/modules/admin/player_panel/actions/transform.dm
@@ -137,9 +137,14 @@ GLOBAL_LIST_INIT(pp_transformables, list(
color = "purple"
),
list(
- name = XENO_CASTE_PREDALIEN,
- key = /mob/living/carbon/xenomorph/predalien,
- color = "purple"
+ name = XENO_CASTE_PALATINE,
+ key = /mob/living/carbon/xenomorph/palatine,
+ color = "purple"
+ ),
+ list(
+ name = XENO_CASTE_PREDALIEN,
+ key = /mob/living/carbon/xenomorph/predalien,
+ color = "purple"
)
),
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 847654e2c067..7b745b1749f0 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -191,11 +191,13 @@
var/tier2_state = "hudxenoupgrade3"
var/tier3_state = "hudxenoupgrade4"
var/tier4_state = "hudxenoupgrade5"
+ var/tier5_state = "hudxenoupgrade6"
var/icon/tier1_icon = icon(icon_file, tier1_state, SOUTH)
var/icon/tier2_icon = icon(icon_file, tier2_state, SOUTH)
var/icon/tier3_icon = icon(icon_file, tier3_state, SOUTH)
var/icon/tier4_icon = icon(icon_file, tier4_state, SOUTH)
+ var/icon/tier5_icon = icon(icon_file, tier5_state, SOUTH)
tier1_icon.Crop(6,26,18,14)
@@ -213,6 +215,10 @@
tier4_icon.Crop(6,30,18,18)
tier4_icon.Scale(32, 32)
Insert("tier4_big", tier4_icon)
+
+ tier5_icon.Crop(6,30,18,18)
+ tier5_icon.Scale(32, 32)
+ Insert("tier5_big", tier5_icon)
return ..()
/datum/asset/spritesheet/choose_mark
diff --git a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm
index ae03d0646657..99347c544860 100644
--- a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm
+++ b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm
@@ -13,8 +13,10 @@
age = XENO_ELDER
if(JOB_PLAYTIME_TIER_3 to JOB_PLAYTIME_TIER_4)
age = XENO_ANCIENT
- if(JOB_PLAYTIME_TIER_4 to INFINITY)
+ if(JOB_PLAYTIME_TIER_4 to JOB_PLAYTIME_TIER_5)
age = XENO_PRIME
+ if(JOB_PLAYTIME_TIER_5 to INFINITY)
+ age = XENO_IMPERATOR
if(hours_as_xeno < JOB_PLAYTIME_TIER_1)
age = XENO_YOUNG
@@ -36,6 +38,8 @@
age_prefix = "Ancient "
if(XENO_PRIME)
age_prefix = "Prime "
+ if(XENO_IMPERATOR)
+ age_prefix = "Imperator "
hud_update() //update the age level insignia on our xeno hud.
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
index 39b05b964648..abb77c68827c 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
@@ -233,7 +233,7 @@
/**
* Any additional effects to apply to the target
* is called if and only if we actually hit a human target
- */
+*/
/datum/action/xeno_action/activable/pounce/proc/additional_effects(mob/living/L)
return
@@ -449,6 +449,8 @@
/datum/action/xeno_action/activable/xeno_spit/queen_macro //so it doesn't screw other macros up
ability_primacy = XENO_PRIMARY_ACTION_3
+/datum/action/xeno_action/activable/xeno_spit/palatine_macro
+ ability_primacy = XENO_NOT_PRIMARY_ACTION
/datum/action/xeno_action/activable/bombard
name = "Bombard"
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/palatine/palatine_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/palatine/palatine_abilities.dm
new file mode 100644
index 000000000000..2bbddda19f7f
--- /dev/null
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/palatine/palatine_abilities.dm
@@ -0,0 +1,49 @@
+/datum/action/xeno_action/onclick/palatine_roar
+ name = "Roar"
+ icon_file = 'icons/mob/hud/actions_palatine.dmi'
+ action_icon_state = "screech_empower"
+ ability_name = "roar"
+ action_type = XENO_ACTION_CLICK
+ ability_primacy = XENO_PRIMARY_ACTION_1
+ xeno_cooldown = 60 SECONDS
+ plasma_cost = 50
+
+ var/roar_type = "piercing"
+ var/screech_sound_effect = "sound/voice/alien_distantroar_3.ogg"
+ var/bonus_damage_scale = 2.5
+ var/bonus_speed_scale = 0.05
+
+/datum/action/xeno_action/onclick/palatine_change_roar
+ name = "Change Roar"
+ icon_file = 'icons/mob/hud/actions_palatine.dmi'
+ action_icon_state = "screech_shift"
+ ability_name = "change roar"
+ action_type = XENO_ACTION_CLICK
+ ability_primacy = XENO_NOT_PRIMARY_ACTION
+ plasma_cost = 0
+
+/datum/action/xeno_action/onclick/palatine_change_roar/use_ability(atom/A)
+ var/mob/living/carbon/xenomorph/X = owner
+ var/action_icon_result
+
+ if(!X.check_state(1))
+ return
+
+ var/datum/action/xeno_action/onclick/palatine_roar/PR = get_xeno_action_by_type(X, /datum/action/xeno_action/onclick/palatine_roar)
+ if (!istype(PR))
+ return
+
+ if (PR.roar_type == "piercing")
+ action_icon_result = "screech_disrupt"
+ PR.roar_type = "thundering"
+ PR.screech_sound_effect = "sound/voice/4_xeno_roars.ogg"
+ to_chat(X, SPAN_XENOWARNING("You will now disrupt dangers to the hive!"))
+
+ else
+ action_icon_result = "screech_empower"
+ PR.roar_type = "piercing"
+ PR.screech_sound_effect = "sound/voice/alien_distantroar_3.ogg"
+ to_chat(X, SPAN_XENOWARNING("You will now empower your allies with rage!"))
+
+ PR.button.overlays.Cut()
+ PR.button.overlays += image('icons/mob/hud/actions_palatine.dmi', button, action_icon_result)
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/palatine/palatine_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/palatine/palatine_powers.dm
new file mode 100644
index 000000000000..b0233bb05e6d
--- /dev/null
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/palatine/palatine_powers.dm
@@ -0,0 +1,49 @@
+/datum/action/xeno_action/onclick/palatine_roar/use_ability(atom/target)
+ var/mob/living/carbon/xenomorph/xeno = owner
+
+ if (!action_cooldown_check())
+ return
+
+ if (!xeno.check_state())
+ return
+
+ if(!check_and_use_plasma_owner())
+ return
+
+ if(roar_type == "piercing")
+ var/datum/behavior_delegate/palatine_base/behavior = xeno.behavior_delegate
+ if(!istype(behavior))
+ to_chat(xeno, SPAN_ALERTWARNING("Something went wrong with your behavior delegate! Inform forest2001 or a coder!"))
+ return FALSE
+ if(behavior.thirst < 3)
+ to_chat(xeno, SPAN_WARNING("You have not slain enough in the name of the Queen Mother to unleash this power!"))
+ return FALSE
+
+ xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] emits a piercing screech!"))
+ for(var/mob/living/carbon/carbon in view(7, xeno))
+ if(isxeno(carbon) && xeno.can_not_harm(carbon))
+ new /datum/effects/xeno_buff(carbon, xeno, ttl = (0.5 SECONDS * behavior.thirst + 3 SECONDS), bonus_damage = bonus_damage_scale * behavior.thirst, bonus_speed = (bonus_speed_scale * behavior.thirst))
+
+ for(var/mob/M in view(xeno))
+ if(M && M.client)
+ shake_camera(M, 10, 1)
+ behavior.thirst = max(0, behavior.thirst - 3)
+ to_chat(xeno, SPAN_XENOMINORWARNING("Your bloodlust cools as you unleash your rage."))
+ else
+ xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] emits a thundering roar!"))
+ for(var/mob/living/carbon/carbon in view(7, xeno))
+ if(ishuman(carbon))
+ var/mob/living/carbon/human/human = carbon
+ human.disable_special_items()
+
+ var/obj/item/clothing/gloves/yautja/hunter/YG = locate(/obj/item/clothing/gloves/yautja/hunter) in human
+ if(isyautja(human) && YG)
+ if(HAS_TRAIT(human, TRAIT_CLOAKED))
+ YG.decloak(human, TRUE, DECLOAK_PREDALIEN)
+
+ xeno.create_shriekwave(9)
+ playsound(xeno.loc, screech_sound_effect, 75, 0, status = 0)
+ apply_cooldown()
+
+ . = ..()
+ return
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
index 199df345fb62..2e3bbdee40c1 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
@@ -131,6 +131,9 @@
var/max_distance = 7
var/windup = 8 DECISECONDS
+/datum/action/xeno_action/activable/prae_abduct/palatine_macro
+ ability_primacy = XENO_NOT_PRIMARY_ACTION
+
/datum/action/xeno_action/activable/oppressor_punch
name = "Dislocate"
action_icon_state = "punch"
@@ -307,6 +310,8 @@
var/curr_effect_type = WARDEN_HEAL_HP
+/datum/action/xeno_action/activable/warden_heal/palatine_macro
+ ability_primacy = XENO_PRIMARY_ACTION_4
/datum/action/xeno_action/onclick/prae_switch_heal_type
name = "Toggle Aid Type"
@@ -360,3 +365,6 @@
var/max_distance = 7
var/windup = 6
var/retrieve_cost = 100
+
+/datum/action/xeno_action/activable/prae_retrieve/palatine_macro
+ ability_primacy = XENO_PRIMARY_ACTION_3
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 b1358e30c26b..8c0b0afbe7a3 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
@@ -20,7 +20,8 @@
/datum/action/xeno_action/onclick/predalien_roar
name = "Roar"
- action_icon_state = "screech"
+ icon_file = 'icons/mob/hud/actions_palatine.dmi'
+ action_icon_state = "screech_disrupt"
ability_name = "roar"
action_type = XENO_ACTION_CLICK
ability_primacy = XENO_PRIMARY_ACTION_2
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/queen/mutated_flight.dm b/code/modules/mob/living/carbon/xenomorph/abilities/queen/mutated_flight.dm
new file mode 100644
index 000000000000..a364f2aa2c45
--- /dev/null
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/queen/mutated_flight.dm
@@ -0,0 +1,53 @@
+/datum/action/xeno_action/activable/flight
+ name = "Flight"
+ action_icon_state = "flight"
+ plasma_cost = 200
+ xeno_cooldown = 1 MINUTES
+ var/max_distance = 5
+ var/speed = 5
+
+/datum/action/xeno_action/activable/flight/can_use_action()
+ . = ..()
+ if(!.)
+ return FALSE
+
+/datum/action/xeno_action/activable/flight/use_ability(atom/target)
+ if(!..())
+ return FALSE
+ var/mob/living/carbon/xenomorph/xeno = owner
+ if(isstorage(target.loc) || xeno.contains(target) || istype(target, /atom/movable/screen)) return FALSE
+
+ if(!xeno.check_plasma(plasma_cost))
+ to_chat(owner, SPAN_XENOWARNING("You have insufficient plasma to do this."))
+ return FALSE
+ if(target.z != xeno.z)
+ to_chat(owner, SPAN_XENOWARNING("Not even you can fly that far!"))
+ return FALSE
+ apply_cooldown()
+
+ use_plasma_owner()
+ playsound(owner, 'sound/effects/wingflap.ogg')
+ owner.visible_message(SPAN_DANGER("\The [src] spreads their wings and leaps into the air!"), \
+ SPAN_DANGER("You spread your wings and leap into the air!"), null, 5, CHAT_TYPE_XENO_COMBAT)
+
+ var/turf/t_turf = get_turf(target)
+ var/obj/effect/warning/hover/warning = new(t_turf)
+ calculate_warning_turf(warning, owner, t_turf)
+
+ //has sleep
+
+ RegisterSignal(owner, COMSIG_CLIENT_MOB_MOVE, PROC_REF(disable_flying_movement))
+ owner.throw_atom(t_turf, max_distance, speed, launch_type = HIGH_LAUNCH)
+ UnregisterSignal(owner, COMSIG_CLIENT_MOB_MOVE)
+ qdel(warning)
+
+/datum/action/xeno_action/activable/flight/proc/disable_flying_movement(mob/living/carbon/human/user)
+ SIGNAL_HANDLER
+ return COMPONENT_OVERRIDE_MOVE
+
+/datum/action/xeno_action/activable/flight/proc/calculate_warning_turf(obj/effect/warning/warning, mob/living/user, turf/t_turf)
+ var/t_dist = get_dist(user, t_turf)
+ if(!(t_dist > max_distance))
+ return
+ var/list/turf/path = get_line(user, t_turf, FALSE)
+ warning.forceMove(path[max_distance])
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Palatine.dm b/code/modules/mob/living/carbon/xenomorph/castes/Palatine.dm
new file mode 100644
index 000000000000..cf91f8e061a4
--- /dev/null
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Palatine.dm
@@ -0,0 +1,92 @@
+/datum/caste_datum/palatine
+ caste_type = XENO_CASTE_PALATINE
+ tier = 3
+
+ melee_damage_lower = XENO_DAMAGE_TIER_7
+ melee_damage_upper = XENO_DAMAGE_TIER_8
+ melee_vehicle_damage = XENO_DAMAGE_TIER_9
+ max_health = XENO_HEALTH_IMMORTAL
+ plasma_gain = XENO_PLASMA_GAIN_TIER_8
+ plasma_max = XENO_PLASMA_TIER_10
+ xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_6
+ armor_deflection = XENO_ARMOR_TIER_5
+ evasion = XENO_EVASION_NONE
+ speed = XENO_SPEED_TIER_5
+
+ evolution_allowed = FALSE
+ deevolves_to = list()
+ caste_desc = "The guard of the Queen Mother"
+ spit_types = list(/datum/ammo/xeno/toxin/queen, /datum/ammo/xeno/acid/spatter)
+ acid_level = 3
+
+ aura_strength = 3
+ spit_delay = 20
+
+ tackle_min = 2
+ tackle_max = 5
+ tackle_chance = 45
+
+ behavior_delegate_type = /datum/behavior_delegate/palatine_base
+ minimum_evolve_time = 0
+ royal_caste = TRUE
+
+/mob/living/carbon/xenomorph/palatine
+ caste_type = XENO_CASTE_PALATINE
+ name = XENO_CASTE_PALATINE
+ desc = "What god did you anger..."
+ icon_size = 64
+ icon_state = "Normal Palatine Walking"
+ plasma_types = list(PLASMA_ROYAL,PLASMA_CHITIN,PLASMA_PHEROMONE,PLASMA_NEUROTOXIN)
+ pixel_x = -16
+ old_x = -16
+ mob_size = MOB_SIZE_BIG
+ drag_delay = 6 //pulling a big dead xeno is hard
+ tier = 3
+ counts_for_slots = FALSE
+ claw_type = CLAW_TYPE_VERY_SHARP
+
+ base_actions = list(
+ /datum/action/xeno_action/onclick/xeno_resting,
+ /datum/action/xeno_action/onclick/regurgitate,
+ /datum/action/xeno_action/watch_xeno,
+ /datum/action/xeno_action/activable/tail_stab,
+ /datum/action/xeno_action/activable/corrosive_acid/strong,
+ /datum/action/xeno_action/activable/xeno_spit/palatine_macro,
+ /datum/action/xeno_action/onclick/shift_spits,
+ /datum/action/xeno_action/activable/spray_acid/base_prae_spray_acid,
+ /datum/action/xeno_action/onclick/palatine_roar,//Mac1
+ /datum/action/xeno_action/onclick/palatine_change_roar,
+ /datum/action/xeno_action/activable/prae_abduct/palatine_macro,//Mac2
+ /datum/action/xeno_action/activable/prae_retrieve,//Mac3
+ /datum/action/xeno_action/activable/warden_heal,//Mac4
+ /datum/action/xeno_action/onclick/prae_switch_heal_type,//Mac5
+ /datum/action/xeno_action/onclick/emit_pheromones,
+ )
+
+ icon_xeno = 'icons/mob/xenos/palatine.dmi'
+ icon_xenonid = 'icons/mob/xenos/palatine.dmi'
+
+/datum/behavior_delegate/palatine_base
+ name = "Base Palatine Behavior Delegate"
+
+ var/thirst = 0
+ var/max_thirst = 10
+
+/datum/behavior_delegate/palatine_base/append_to_stat()
+ . = list()
+ . += "Bloodthirst: [thirst]/[max_thirst]"
+
+/datum/behavior_delegate/palatine_base/on_kill_mob(mob/M)
+ . = ..()
+
+ thirst = min(thirst + 1, max_thirst)
+
+/datum/behavior_delegate/palatine_base/melee_attack_modify_damage(original_damage, mob/living/carbon/target)
+ if(!iscarbonsizehuman(target))
+ return original_damage
+
+ var/size = target.mob_size
+ var/multiplier = thirst - size
+
+
+ return original_damage + (2.5 * multiplier)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
index f5207e6abf30..2c2e3ff8bcf8 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
@@ -425,11 +425,13 @@
if(XENO_MATURE)
name = "[name_prefix]Elder Queen" //Mature
if(XENO_ELDER)
- name = "[name_prefix]Elder Empress" //Elite
+ name = "[name_prefix]Empress" //Elite
if(XENO_ANCIENT)
- name = "[name_prefix]Ancient Empress" //Ancient
+ name = "[name_prefix]Elder Empress" //Ancient
if(XENO_PRIME)
- name = "[name_prefix]Prime Empress" //Primordial
+ name = "[name_prefix]Ancient Empress" //Prime
+ if(XENO_IMPERATOR)
+ name = "[name_prefix]Prime Empress" //No life
else
age = XENO_NORMAL
if(client)
diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm
index c40a50ce7523..83ff199b94f4 100644
--- a/code/modules/mob/living/carbon/xenomorph/say.dm
+++ b/code/modules/mob/living/carbon/xenomorph/say.dm
@@ -141,6 +141,8 @@
ghostrend = SPAN_XENOQUEEN("Hivemind, [src.name][track] hisses, '[message]'")
else if(istype(X) && IS_XENO_LEADER(X))
ghostrend = SPAN_XENOLEADER("Hivemind, Leader [src.name][track] hisses, '[message]'")
+ else if(istype(X, /mob/living/carbon/xenomorph/palatine))
+ ghostrend = SPAN_XENOLEADER("Hivemind, [src.name][track] hisses, '[message]'")
else
ghostrend = SPAN_XENO("Hivemind, [src.name][track] hisses, '[message]'")
S.show_message(ghostrend, SHOW_MESSAGE_AUDIBLE)
@@ -153,6 +155,8 @@
rendered = SPAN_XENOQUEEN("Hivemind, [src.name][overwatch_insert] hisses, '[message]'")
else if(istype(X) && IS_XENO_LEADER(X))
rendered = SPAN_XENOLEADER("Hivemind, Leader [src.name][overwatch_insert] hisses, '[message]'")
+ else if(istype(X, /mob/living/carbon/xenomorph/palatine))
+ rendered = SPAN_XENOLEADER("Hivemind, [src.name][overwatch_insert] hisses, '[message]'")
else
rendered = SPAN_XENO("Hivemind, [src.name][overwatch_insert] hisses, '[message]'")
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 520b58a30db6..da4dc8384fc9 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -98,6 +98,8 @@
new_xeno = new /mob/living/carbon/xenomorph/crusher(loc)
if(XENO_CASTE_PRAETORIAN)
new_xeno = new /mob/living/carbon/xenomorph/praetorian(loc)
+ if(XENO_CASTE_PALATINE)
+ new_xeno = new /mob/living/carbon/xenomorph/palatine(loc)
if(XENO_CASTE_QUEEN)
new_xeno = new /mob/living/carbon/xenomorph/queen(loc)
if(XENO_CASTE_HELLHOUND)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 83cd5da023f3..5fa3300406c1 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -2033,12 +2033,15 @@
#include "code\modules\mob\living\carbon\xenomorph\abilities\lurker\lurker_abilities.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\lurker\lurker_macros.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\lurker\lurker_powers.dm"
+#include "code\modules\mob\living\carbon\xenomorph\abilities\palatine\palatine_abilities.dm"
+#include "code\modules\mob\living\carbon\xenomorph\abilities\palatine\palatine_powers.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\praetorian\praetorian_abilities.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\praetorian\praetorian_macros.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\praetorian\praetorian_powers.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\predalien\predalien_abilities.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\predalien\predalien_macros.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\predalien\predalien_powers.dm"
+#include "code\modules\mob\living\carbon\xenomorph\abilities\queen\mutated_flight.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\queen\queen_abilities.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\queen\queen_macros.dm"
#include "code\modules\mob\living\carbon\xenomorph\abilities\queen\queen_powers.dm"
@@ -2070,6 +2073,7 @@
#include "code\modules\mob\living\carbon\xenomorph\castes\Larva.dm"
#include "code\modules\mob\living\carbon\xenomorph\castes\lesser_drone.dm"
#include "code\modules\mob\living\carbon\xenomorph\castes\Lurker.dm"
+#include "code\modules\mob\living\carbon\xenomorph\castes\Palatine.dm"
#include "code\modules\mob\living\carbon\xenomorph\castes\Praetorian.dm"
#include "code\modules\mob\living\carbon\xenomorph\castes\Predalien.dm"
#include "code\modules\mob\living\carbon\xenomorph\castes\Queen.dm"
diff --git a/icons/mob/hud/actions_palatine.dmi b/icons/mob/hud/actions_palatine.dmi
new file mode 100644
index 000000000000..e094c4fce6c4
Binary files /dev/null and b/icons/mob/hud/actions_palatine.dmi differ
diff --git a/icons/mob/xenos/palatine.dmi b/icons/mob/xenos/palatine.dmi
new file mode 100644
index 000000000000..4448227b62eb
Binary files /dev/null and b/icons/mob/xenos/palatine.dmi differ
diff --git a/icons/mob/xenos/wounds.dmi b/icons/mob/xenos/wounds.dmi
index 730e367f43ae..91f7136620f7 100644
Binary files a/icons/mob/xenos/wounds.dmi and b/icons/mob/xenos/wounds.dmi differ
diff --git a/icons/mob/xenos/wounds_palatine.dmi b/icons/mob/xenos/wounds_palatine.dmi
new file mode 100644
index 000000000000..90ba4af03622
Binary files /dev/null and b/icons/mob/xenos/wounds_palatine.dmi differ
diff --git a/sound/effects/wingflap.ogg b/sound/effects/wingflap.ogg
new file mode 100644
index 000000000000..2a63afa616f3
Binary files /dev/null and b/sound/effects/wingflap.ogg differ