diff --git a/code/modules/mob/living/carbon/xenomorph/Evolution.dm b/code/modules/mob/living/carbon/xenomorph/Evolution.dm
index e0f0844bfa13..02c991e136fe 100644
--- a/code/modules/mob/living/carbon/xenomorph/Evolution.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Evolution.dm
@@ -46,7 +46,7 @@
if(!evolve_checks())
return
- if((!hive.living_xeno_queen) && castepick != XENO_CASTE_QUEEN && !islarva(src) && !hive.allow_no_queen_evo)
+ if((!hive.living_xeno_queen) && castepick != XENO_CASTE_QUEEN && !islarva(src) && !hive.allow_no_queen_evo && castepick != XENO_CASTE_RUNNER && castepick != XENO_CASTE_DEFENDER && castepick != XENO_CASTE_SENTINEL)
to_chat(src, SPAN_WARNING("The Hive is shaken by the death of the last Queen. We can't find the strength to evolve."))
return
@@ -66,9 +66,9 @@
else
to_chat(src, SPAN_WARNING("Nuh-uhh."))
return
- if(evolution_threshold && castepick != XENO_CASTE_QUEEN) //Does the caste have an evolution timer? Then check it
- if(evolution_stored < evolution_threshold)
- to_chat(src, SPAN_WARNING("We must wait before evolving. Currently at: [evolution_stored] / [evolution_threshold]."))
+ if(caste_datum.evolution_cost && castepick != XENO_CASTE_QUEEN) //Does the caste have an evolution timer? Then check it
+ if(evolution_stored < caste_datum.evolution_cost)
+ to_chat(src, SPAN_WARNING("We must wait before evolving. Currently at: [evolution_stored] / [caste_datum.evolution_cost]."))
return
// Used for restricting benos to evolve to drone/queen when they're the only potential queen
@@ -128,8 +128,8 @@
else if(!can_evolve(castepick, potential_queens))
return
- // subtract the threshold, keep the stored amount
- evolution_stored -= evolution_threshold
+ // subtract the evolution cost, keep the stored amount
+ evolution_stored -= caste_datum.evolution_cost
var/obj/item/organ/xeno/organ = locate() in src
if(!isnull(organ))
qdel(organ)
diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
index eed2dce5f7a8..e14db298b9d7 100644
--- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
@@ -151,6 +151,7 @@
var/show_only_numbers = FALSE
var/evolution_stored = 0 //How much evolution they have stored
var/evolution_threshold = 200
+ var/evolution_cost = 30 //How much evolution to caste will cost
var/tier = 1 //This will track their "tier" to restrict/limit evolutions
var/time_of_birth
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm b/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm
index f7e906a82b28..6eb869781a5c 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm
@@ -34,6 +34,7 @@
tacklestrength_max = 4
minimum_evolve_time = 15 MINUTES
+ evolution_cost = 500
minimap_icon = "boiler"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm
index 106dcdcacb62..6d9f04cc132b 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm
@@ -34,6 +34,7 @@
tremor_cooldown = 450
minimum_evolve_time = 7 MINUTES
+ evolution_cost = 200
minimap_icon = "burrower"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm
index d46bfce6bf71..c787e811e17d 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm
@@ -39,6 +39,7 @@
egg_cooldown = 250
minimum_evolve_time = 5 MINUTES
+ evolution_cost = 200
minimap_icon = "carrier"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm
index a84b9965f9c3..26f08feb2fc0 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm
@@ -18,6 +18,7 @@
behavior_delegate_type = /datum/behavior_delegate/crusher_base
minimum_evolve_time = 15 MINUTES
+ evolution_cost = 500
tackle_min = 2
tackle_max = 6
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Defender.dm b/code/modules/mob/living/carbon/xenomorph/castes/Defender.dm
index 548b0389e683..9a4acf31a8c8 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Defender.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Defender.dm
@@ -25,6 +25,7 @@
tackle_max = 4
minimum_evolve_time = 4 MINUTES
+ evolution_cost = 30
minimap_icon = "defender"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm
index e6c4a76c9353..db5dfb0b52a8 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm
@@ -20,7 +20,7 @@
build_time_mult = BUILD_TIME_MULT_BUILDER
caste_desc = "A builder of hives. Only drones may evolve into Queens."
- evolves_to = list(XENO_CASTE_QUEEN, XENO_CASTE_BURROWER, XENO_CASTE_CARRIER, XENO_CASTE_HIVELORD) //Add more here separated by commas
+ evolves_to = list(XENO_CASTE_RUNNER, XENO_CASTE_SENTINEL, XENO_CASTE_DEFENDER, XENO_CASTE_QUEEN, XENO_CASTE_CARRIER, XENO_CASTE_HIVELORD, XENO_CASTE_BURROWER) //Add more here separated by commas
deevolves_to = list("Larva")
can_hold_facehuggers = 1
can_hold_eggs = CAN_HOLD_TWO_HANDS
@@ -36,6 +36,7 @@
aura_strength = 2
minimum_evolve_time = 1 MINUTES
+ evolution_cost = 30
minimap_icon = "drone"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm b/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm
index 8024ed366405..4e8c8fa506d8 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Hivelord.dm
@@ -35,6 +35,7 @@
aura_strength = 2.5
minimum_evolve_time = 3 MINUTES
+ evolution_cost = 200
minimap_icon = "hivelord"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm
index 8dc427e2c55e..32750ac3c06a 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm
@@ -10,7 +10,7 @@
caste_desc = "D'awwwww, so cute!"
speed = XENO_SPEED_TIER_10
innate_healing = TRUE //heals even outside weeds so you're not stuck unable to evolve when hiding on the ship wounded.
- evolves_to = XENO_T1_CASTES
+ evolves_to = list(XENO_CASTE_DRONE)
evolve_without_queen = TRUE
can_be_revived = FALSE
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
index 1dca7eb23f70..4b41628bee36 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
@@ -25,6 +25,7 @@
heal_resting = 1.5
minimum_evolve_time = 9 MINUTES
+ evolution_cost = 200
minimap_icon = "lurker"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Praetorian.dm b/code/modules/mob/living/carbon/xenomorph/castes/Praetorian.dm
index 70d33b905a00..95c5917defba 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Praetorian.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Praetorian.dm
@@ -35,6 +35,7 @@
behavior_delegate_type = /datum/behavior_delegate/praetorian_base
minimum_evolve_time = 15 MINUTES
+ evolution_cost = 500
minimap_icon = "praetorian"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
index 5b9c410e235a..8b90065a9afe 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
@@ -48,6 +48,7 @@
minimap_icon = "xenoqueen"
royal_caste = TRUE
+ evolution_cost = 0
/proc/update_living_queens() // needed to update when you change a queen to a different hive
outer_loop:
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm b/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm
index 90614e338071..b1077df33a6e 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Ravager.dm
@@ -33,6 +33,7 @@
behavior_delegate_type = /datum/behavior_delegate/ravager_base
minimum_evolve_time = 15 MINUTES
+ evolution_cost = 500
minimap_icon = "ravager"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm b/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm
index 12fdb8d02843..1851ac4b68bd 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm
@@ -28,6 +28,7 @@
heal_resting = 1.75
minimum_evolve_time = 5 MINUTES
+ evolution_cost = 30
minimap_icon = "runner"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm b/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm
index 3e7416f39fc5..f95104a344fc 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Sentinel.dm
@@ -28,6 +28,7 @@
minimap_icon = "sentinel"
minimum_evolve_time = 5 MINUTES
+ evolution_cost = 30
/mob/living/carbon/xenomorph/sentinel
caste_type = XENO_CASTE_SENTINEL
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Spitter.dm b/code/modules/mob/living/carbon/xenomorph/castes/Spitter.dm
index 006f66b7f1b2..79205181a83b 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Spitter.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Spitter.dm
@@ -28,6 +28,7 @@
tacklestrength_max = 5
minimum_evolve_time = 9 MINUTES
+ evolution_cost = 200
minimap_icon = "spitter"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm b/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm
index 2885dd6ac553..89360c95d9cd 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm
@@ -28,6 +28,7 @@
heal_resting = 1.4
minimum_evolve_time = 9 MINUTES
+ evolution_cost = 200
minimap_icon = "warrior"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm b/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm
index feee2edecb67..3d631c962dfb 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm
@@ -21,6 +21,10 @@
var/evolution_allowed = 1
///Threshold to next evolution
var/evolution_threshold = 0
+ ///How much evolution is stored
+ var/evolution_stored = 0
+ ///How much caste cost in evo points
+ var/evolution_cost = 0
/// whether they can get evo points without needing an ovi queen
var/evolve_without_queen = FALSE
///This is where you add castes to evolve into. "Separated", "by", "commas"
diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm
index 1657d078ffda..c13cc65c67d1 100644
--- a/code/modules/mob/living/carbon/xenomorph/life.dm
+++ b/code/modules/mob/living/carbon/xenomorph/life.dm
@@ -57,11 +57,31 @@
evolution_stored -= progress_amount
return
+ if(evolution_stored >= evolution_cost)
+ if(!got_evolution_message)
+ early_evolve_message()
+ got_evolution_message = TRUE
+
+ if(ROUND_TIME < XENO_ROUNDSTART_PROGRESS_TIME_2)
+ evolution_stored += progress_amount
+ return
+
+ if(evolution_stored > evolution_threshold + progress_amount)
+ evolution_stored -= progress_amount
+ return
+
else
evolution_stored += progress_amount
/mob/living/carbon/xenomorph/proc/evolve_message()
- to_chat(src, SPAN_XENODANGER("Our carapace crackles and our tendons strengthen. We are ready to evolve!")) //Makes this bold so the Xeno doesn't miss it
+ to_chat(src, SPAN_XENODANGER("Our carapace crackles and we become matured. We are ready to evolve!")) //Makes this bold so the Xeno doesn't miss it
+ playsound_client(client, sound('sound/effects/xeno_evolveready.ogg'))
+
+ var/datum/action/xeno_action/onclick/evolve/evolve_action = new()
+ evolve_action.give_to(src)
+
+/mob/living/carbon/xenomorph/proc/early_evolve_message()
+ to_chat(src, SPAN_XENODANGER("Your tendons strengthen, you can now evolve to young castes!")) //Placeholder evo message, someone can improve it.
playsound_client(client, sound('sound/effects/xeno_evolveready.ogg'))
var/datum/action/xeno_action/onclick/evolve/evolve_action = new()