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