diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index 5c4020cca9..d8f2d26263 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -162,4 +162,15 @@ var/list/be_special_flags = list(
#define ASPECT_EMP "emp" //Unused now.
#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
-#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
\ No newline at end of file
+#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
+
+/*
+Changeling Defines
+*/
+#define CHANGELING_POWER_INHERENT "Inherent"
+#define CHANGELING_POWER_ARMOR "Armor"
+#define CHANGELING_POWER_STINGS "Stings"
+#define CHANGELING_POWER_SHRIEKS "Shrieks"
+#define CHANGELING_POWER_HEALTH "Health"
+#define CHANGELING_POWER_ENHANCEMENTS "Enhancements"
+#define CHANGELING_POWER_WEAPONS "Weapons"
\ No newline at end of file
diff --git a/code/datums/managed_browsers/changelingevolution.dm b/code/datums/managed_browsers/changelingevolution.dm
new file mode 100644
index 0000000000..d7dd020767
--- /dev/null
+++ b/code/datums/managed_browsers/changelingevolution.dm
@@ -0,0 +1,166 @@
+/client
+ var/datum/managed_browser/changelingevolution/changelingevolution = null
+
+/datum/managed_browser/changelingevolution
+ base_browser_id = "evolution_tree"
+ title = "Evolution Tree"
+ size_x = 480
+ size_y = 600
+ var/textbody = null
+
+/datum/managed_browser/changelingevolution/New(client/new_client)
+ if(!new_client.mob || !new_client.mob.mind || !new_client.mob.mind.changeling)
+ message_admins("[new_client] tried to access changeling evolutions while not changeling.")
+ qdel(src)
+
+ ..()
+
+/datum/managed_browser/changelingevolution/Destroy()
+ if(my_client)
+ my_client.changelingevolution = null
+ return ..()
+
+/datum/managed_browser/changelingevolution/get_html()
+ var/list/dat = list("
")
+ var/geneticpoints_current = my_client.mob.mind.changeling.geneticpoints
+ var/geneticpoints_max = my_client.mob.mind.changeling.max_geneticpoints
+
+ dat += "Genetic Points Available: [geneticpoints_current] / [geneticpoints_max]
"
+ dat += "Obtain more by feeding on your own kind.
"
+ dat += "What am I?
"
+ dat += "Inherent"
+ dat += "Armor"
+ dat += "Weapons"
+ dat += "Stings"
+ dat += "Shrieks"
+ dat += "Health"
+ dat += "Enhancements"
+ if(textbody)
+ dat += ""
+ dat += "[textbody]"
+ dat += "
"
+ dat += ""
+
+ return dat.Join()
+
+/datum/managed_browser/changelingevolution/Topic(href, href_list[])
+ if(!my_client)
+ return FALSE
+
+ if(href_list["close"])
+ return
+
+ if(href_list["inherent"])
+ generate_abilitylist(CHANGELING_POWER_INHERENT)
+
+ if(href_list["armor"])
+ generate_abilitylist(CHANGELING_POWER_ARMOR)
+
+ if(href_list["weapons"])
+ generate_abilitylist(CHANGELING_POWER_WEAPONS)
+
+ if(href_list["stings"])
+ generate_abilitylist(CHANGELING_POWER_STINGS)
+
+ if(href_list["shrieks"])
+ generate_abilitylist(CHANGELING_POWER_SHRIEKS)
+
+ if(href_list["health"])
+ generate_abilitylist(CHANGELING_POWER_HEALTH)
+
+ if(href_list["enhancements"])
+ generate_abilitylist(CHANGELING_POWER_ENHANCEMENTS)
+
+ if(href_list["evolve"])
+ var/datum/mind/M = my_client.mob.mind
+ var/datum/changeling/C = my_client.mob.mind.changeling
+ var/datum/power/changeling/Thepower = href_list["evolve"]
+
+ for (var/datum/power/changeling/P in powerinstances)
+ if(P.name == Thepower)
+ Thepower = P
+ break
+
+ if(!istype(M))
+ return
+
+ if(Thepower == null)
+ to_chat(M.current, "Purchase failed. Inform a dev of this error.")
+ return
+
+ if(Thepower in C.purchased_powers)
+ to_chat(M.current, "You already have this ability! Inform a dev of this error.") /// Should not be possible
+ return
+
+ if(C.geneticpoints < Thepower.genomecost)
+ to_chat(M.current, "We cannot evolve this... yet. We must acquire more DNA.")
+ return
+
+ C.purchased_powers += Thepower /// Set it to purchased
+ C.geneticpoints -= Thepower.genomecost
+ generate_abilitylist(Thepower.power_category) /// Refresh the UI
+
+ my_client.mob.mind.changeling.purchasePower(M, Thepower)
+
+ if(href_list["tutorial"])
+ textbody = "What am I?
|
"
+ textbody += ""
+ textbody += "You are a changeling, a creature empowered with genetic-based abilities that change your body in bizarre ways."
+ textbody += " It's probably best the crew doesn't know about your power -- at least not right away.
"
+ textbody += "What a changeling is, however, is up to you. Are you a strange alien impersonating crew? Are you a"
+ textbody += " normal crewmember infected with a parasite? An experiment gone wrong? It's up to you to make the story.
"
+ textbody += "Of course, you need to know how it works to begin with.
"
+ textbody += "Your abilities cost chemicals that your body will slowly regenerate with varying speeds based on enhancements obtained."
+ textbody += " There are a set of inherent abilities you will always have while the rest may be purchased through genomes.
"
+ textbody += "You may obtain more genomes if you find another changeling and absorb them, but this is not required. If you've found "
+ textbody += "your abilities aren't to your liking, you have up to two re-adapts available, and these may be refilled by absorbing anyone -- including monkeys.
"
+ textbody += "Good luck and remember, killing isn't always the end goal."
+ display()
+
+/datum/managed_browser/changelingevolution/proc/generate_abilitylist(cat)
+ var/list/ability_list = list()
+ var/info = ""
+ var/catname = ""
+ for(var/datum/power/changeling/P in powerinstances)
+ if(P.power_category == cat)
+ ability_list[++ability_list.len] = P
+ switch(cat)
+ if(CHANGELING_POWER_INHERENT)
+ catname = "Inherent"
+ info = "These powers are inherent to your kind and will always be accessible, provided you have the chemicals to use them."
+ if(CHANGELING_POWER_ARMOR)
+ catname = "Armor"
+ info = "These abilities will provide you with space protection -- and potentially armor."
+ if(CHANGELING_POWER_WEAPONS)
+ catname = "Weapons"
+ info = "These abilities will provide you the means to fight back."
+ if(CHANGELING_POWER_STINGS)
+ catname = "Stings"
+ info = "These abilities provide the means to sting organic beings for various effects -- though you must be close enough, and they must have exposed flesh."
+ if(CHANGELING_POWER_SHRIEKS)
+ catname = "Shrieks"
+ info = "These abilities enhance your vocal chords, empowering your screams."
+ if(CHANGELING_POWER_HEALTH)
+ catname = "Health"
+ info = "These abilities will enhance your health or aid you in mending your wounds."
+ if(CHANGELING_POWER_ENHANCEMENTS)
+ catname = "Enhancements"
+ info = "These abilities enhance you in various ways."
+ create_textbody(ability_list, catname, info)
+
+/datum/managed_browser/changelingevolution/proc/create_textbody(ability_list, cat, catinfo)
+ textbody = " |
[cat] Skills
|
"
+ textbody += "[catinfo]
|
"
+ for(var/A in ability_list)
+ var/datum/power/changeling/powerdata = A
+ textbody += "[initial(powerdata.name)] "
+ textbody += "[initial(powerdata.desc)]
"
+ textbody += "[powerdata.helptext] "
+ if(powerdata.enhancedtext != "")
+ textbody += "WHEN EHANCED: [powerdata.enhancedtext] "
+ if(powerdata in my_client.mob.mind.changeling.purchased_powers)
+ textbody += "This ability is already evolved!"
+ else if(cat != "Inherent")
+ textbody += "Evolve"
+ textbody += " |
"
+ display()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a44a9974d7..6f5c03564e 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -86,7 +86,7 @@
if(current) //remove ourself from our old body's mind variable
if(changeling)
current.remove_changeling_powers()
- current.verbs -= /datum/changeling/proc/EvolutionMenu
+ current.verbs -= /datum/changeling/proc/EvolutionTree
current.mind = null
SSnanoui.user_transferred(current, new_character) // transfer active NanoUI instances to new user
diff --git a/code/game/gamemodes/changeling/changeling_evolutiontree.dm b/code/game/gamemodes/changeling/changeling_evolutiontree.dm
new file mode 100644
index 0000000000..afd2da9d7e
--- /dev/null
+++ b/code/game/gamemodes/changeling/changeling_evolutiontree.dm
@@ -0,0 +1,56 @@
+var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
+var/list/datum/power/changeling/powerinstances = list()
+
+/datum/power //Could be used by other antags too
+ var/name = "Power"
+ var/desc = "Placeholder"
+ var/helptext = ""
+ var/enhancedtext = ""
+ var/isVerb = 1 // Is it an active power, or passive?
+ var/verbpath // Path to a verb that contains the effects.
+ var/make_hud_button = 1 // Is this ability significant enough to dedicate screen space for a HUD button?
+ var/ability_icon_state = null // icon_state for icons for the ability HUD. Must be in screen_spells.dmi.
+
+/datum/power/changeling
+ var/allowduringlesserform = 0
+ var/genomecost = 500000 // Cost for the changling to evolve this power.
+ var/power_category = null // _defines/gamemode.dm
+
+/datum/changeling/proc/EvolutionTree() /// Data is in changelingevolution.dm under managed_browsers
+ set name = "-Evolution Tree-"
+ set category = "Changeling"
+ set desc = "Adapt yourself carefully."
+
+ if(!usr || !usr.mind || !usr.mind.changeling) return
+
+ if(usr.client.changelingevolution)
+ usr.client.changelingevolution.textbody = null
+ usr.client.changelingevolution.display()
+ else
+ usr.client.changelingevolution = new(usr.client)
+
+/// Handles adding ability function. Adding to purchased abilities list & genome cost
+/// must be done BEFORE this call.
+/datum/changeling/proc/purchasePower(var/datum/mind/M, var/datum/power/changeling/Pname, var/remake_verbs = 1)
+
+ if(!M || !M.changeling)
+ return
+
+ if(Pname.genomecost > 0)
+ purchased_powers_history.Add("[Pname.name] ([Pname.genomecost] points)")
+
+ if(Pname.make_hud_button && Pname.isVerb)
+ if(!M.current.ability_master)
+ M.current.ability_master = new /obj/screen/movable/ability_master(null, M.current)
+ M.current.ability_master.add_ling_ability(
+ object_given = M.current,
+ verb_given = Pname.verbpath,
+ name_given = Pname.name,
+ ability_icon_given = Pname.ability_icon_state,
+ arguments = list()
+ )
+
+ if(!Pname.isVerb && Pname.verbpath)
+ call(M.current, Pname.verbpath)()
+ else if(remake_verbs)
+ M.current.make_changeling()
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 64b469706f..df0c0a26d7 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -65,7 +65,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
- verbs.Add(/datum/changeling/proc/EvolutionMenu)
+ verbs.Add(/datum/changeling/proc/EvolutionTree)
verbs.Add(/mob/proc/changeling_respec)
add_language("Changeling")
@@ -79,7 +79,8 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
for(var/datum/power/changeling/P in powerinstances)
if(!P.genomecost) // Is it free?
if(!(P in mind.changeling.purchased_powers)) // Do we not have it already?
- mind.changeling.purchasePower(mind, P.name, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
+ mind.changeling.purchased_powers += P /// Add it.
+ mind.changeling.purchasePower(mind, P, 0)// Purchase it. Don't remake our verbs, we're doing it after this.
for(var/datum/power/changeling/P in mind.changeling.purchased_powers)
if(P.isVerb)
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index a010028270..42e95531f8 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -1,25 +1,8 @@
+/* New menu found in changeling_evolutiontree.dm
// READ: Don't use the apostrophe in name or desc. Causes script errors.
//Ling power's evolution menu entry datum should be contained alongside the mob proc for the actual power, in their own file.
-var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
-var/list/datum/power/changeling/powerinstances = list()
-
-/datum/power //Could be used by other antags too
- var/name = "Power"
- var/desc = "Placeholder"
- var/helptext = ""
- var/enhancedtext = ""
- var/isVerb = 1 // Is it an active power, or passive?
- var/verbpath // Path to a verb that contains the effects.
- var/make_hud_button = 1 // Is this ability significant enough to dedicate screen space for a HUD button?
- var/ability_icon_state = null // icon_state for icons for the ability HUD. Must be in screen_spells.dmi.
-
-/datum/power/changeling
- var/allowduringlesserform = 0
- var/genomecost = 500000 // Cost for the changling to evolve this power.
-
-
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
set name = "-Evolution Menu-"
@@ -307,7 +290,6 @@ var/list/datum/power/changeling/powerinstances = list()
call(/datum/changeling/proc/EvolutionMenu)()
-
/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1)
if(!M || !M.changeling)
return
@@ -357,4 +339,4 @@ var/list/datum/power/changeling/powerinstances = list()
call(M.current, Thepower.verbpath)()
else if(remake_verbs)
M.current.make_changeling()
-
+*/
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index e532396176..ce1cf816af 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -3,6 +3,7 @@
desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger if they were of our kind."
ability_icon_state = "ling_absorb_dna"
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
verbpath = /mob/living/proc/changeling_absorb_dna
//Absorbs the victim's DNA. Requires a strong grip on the victim.
diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index 0652280ce7..f26bd3027b 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -5,6 +5,7 @@
enhancedtext = "The blade will have armor peneratration."
ability_icon_state = "ling_armblade"
genomecost = 2
+ power_category = CHANGELING_POWER_WEAPONS
verbpath = /mob/proc/changeling_arm_blade
//Grows a scary, and powerful arm blade.
@@ -30,6 +31,7 @@
enhancedtext = "The claw will have armor peneratration."
ability_icon_state = "ling_claw"
genomecost = 1
+ power_category = CHANGELING_POWER_WEAPONS
verbpath = /mob/proc/changeling_claw
//Grows a scary, and powerful claw.
diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm
index a6928dff2a..fdd60414d7 100644
--- a/code/game/gamemodes/changeling/powers/armor.dm
+++ b/code/game/gamemodes/changeling/powers/armor.dm
@@ -4,6 +4,7 @@
helptext = "To remove the suit, use the ability again."
ability_icon_state = "ling_space_suit"
genomecost = 1
+ power_category = CHANGELING_POWER_ARMOR
verbpath = /mob/proc/changeling_spacesuit
/mob/proc/changeling_spacesuit()
@@ -19,6 +20,7 @@
helptext = "To remove the armor, use the ability again."
ability_icon_state = "ling_armor"
genomecost = 3
+ power_category = CHANGELING_POWER_ARMOR
verbpath = /mob/proc/changeling_spacearmor
/mob/proc/changeling_spacearmor()
diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
index 6e29bf939c..5a0c8a00e8 100644
--- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
+++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
@@ -6,6 +6,7 @@
helptext = "Grants us thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
ability_icon_state = "ling_augmented_eyesight"
genomecost = 2
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_augmented_eyesight
/mob/proc/changeling_augmented_eyesight()
diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
index 67e05ffcc6..f04465e4bc 100644
--- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
+++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
@@ -7,6 +7,7 @@
enhancedtext = "Shocking biologicals without grabbing only requires five chemicals, and has more disabling power."
ability_icon_state = "ling_bioelectrogenesis"
genomecost = 2
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/living/carbon/human/proc/changeling_bioelectrogenesis
//Recharge whatever's in our hand, or shock people.
diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm
index f4721db660..a3132cd703 100644
--- a/code/game/gamemodes/changeling/powers/blind_sting.dm
+++ b/code/game/gamemodes/changeling/powers/blind_sting.dm
@@ -4,6 +4,7 @@
enhancedtext = "Duration is extended."
ability_icon_state = "ling_sting_blind"
genomecost = 2
+ power_category = CHANGELING_POWER_STINGS
allowduringlesserform = 1
verbpath = /mob/proc/changeling_blind_sting
diff --git a/code/game/gamemodes/changeling/powers/boost_range.dm b/code/game/gamemodes/changeling/powers/boost_range.dm
index a22130484c..17efedcf72 100644
--- a/code/game/gamemodes/changeling/powers/boost_range.dm
+++ b/code/game/gamemodes/changeling/powers/boost_range.dm
@@ -5,6 +5,7 @@
enhancedtext = "The range is extended to five tiles."
ability_icon_state = "ling_sting_boost_range"
genomecost = 1
+ power_category = CHANGELING_POWER_STINGS
allowduringlesserform = 1
verbpath = /mob/proc/changeling_boost_range
diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm
index e1a2b10cff..d80d1734c1 100644
--- a/code/game/gamemodes/changeling/powers/cryo_sting.dm
+++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm
@@ -6,6 +6,7 @@
enhancedtext = "Increases the amount of chemicals injected."
ability_icon_state = "ling_sting_cryo"
genomecost = 1
+ power_category = CHANGELING_POWER_STINGS
verbpath = /mob/proc/changeling_cryo_sting
/mob/proc/changeling_cryo_sting()
diff --git a/code/game/gamemodes/changeling/powers/darkvision.dm b/code/game/gamemodes/changeling/powers/darkvision.dm
index 6fbb2954ba..d5de9741fc 100644
--- a/code/game/gamemodes/changeling/powers/darkvision.dm
+++ b/code/game/gamemodes/changeling/powers/darkvision.dm
@@ -4,6 +4,7 @@
helptext = "We will be able to see in the dark."
ability_icon_state = "ling_augmented_eyesight"
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
verbpath = /mob/proc/changeling_darksight
/mob/proc/changeling_darksight()
diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm
index 7b39e90720..fce6cbfe38 100644
--- a/code/game/gamemodes/changeling/powers/deaf_sting.dm
+++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm
@@ -4,6 +4,7 @@
enhancedtext = "Deafness duration is extended."
ability_icon_state = "ling_sting_deafen"
genomecost = 1
+ power_category = CHANGELING_POWER_STINGS
allowduringlesserform = 1
verbpath = /mob/proc/changeling_deaf_sting
diff --git a/code/game/gamemodes/changeling/powers/death_sting.dm b/code/game/gamemodes/changeling/powers/death_sting.dm
index 2eb1e476bd..b50e038174 100644
--- a/code/game/gamemodes/changeling/powers/death_sting.dm
+++ b/code/game/gamemodes/changeling/powers/death_sting.dm
@@ -1,3 +1,4 @@
+/// Not in use.
/datum/power/changeling/DeathSting
name = "Death Sting"
desc = "We silently sting a human, filling him with potent chemicals. His rapid death is all but assured."
diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
index f50460a826..bea75a868f 100644
--- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
+++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
@@ -6,6 +6,7 @@
enhancedtext = "The toxic damage is doubled."
ability_icon_state = "ling_sting_del_toxin"
genomecost = 1
+ power_category = CHANGELING_POWER_STINGS
verbpath = /mob/proc/changeling_delayed_toxic_sting
/datum/modifier/delayed_toxin_sting
diff --git a/code/game/gamemodes/changeling/powers/digital_camo.dm b/code/game/gamemodes/changeling/powers/digital_camo.dm
index 9574b465da..2c9dc95b8a 100644
--- a/code/game/gamemodes/changeling/powers/digital_camo.dm
+++ b/code/game/gamemodes/changeling/powers/digital_camo.dm
@@ -4,6 +4,7 @@
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
ability_icon_state = "ling_digital_camo"
genomecost = 1
+ power_category = CHANGELING_POWER_ENHANCEMENTS
allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo
diff --git a/code/game/gamemodes/changeling/powers/electric_lockpick.dm b/code/game/gamemodes/changeling/powers/electric_lockpick.dm
index 892de51964..9d0c3d37f6 100644
--- a/code/game/gamemodes/changeling/powers/electric_lockpick.dm
+++ b/code/game/gamemodes/changeling/powers/electric_lockpick.dm
@@ -5,6 +5,7 @@
helptext = "Use the ability, then touch something that utilizes an electrical locking system, to open it. Each use costs 10 chemicals."
ability_icon_state = "ling_electric_lockpick"
genomecost = 3
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_electric_lockpick
//Emag-lite
diff --git a/code/game/gamemodes/changeling/powers/endoarmor.dm b/code/game/gamemodes/changeling/powers/endoarmor.dm
index d62c52141a..74e3a0f256 100644
--- a/code/game/gamemodes/changeling/powers/endoarmor.dm
+++ b/code/game/gamemodes/changeling/powers/endoarmor.dm
@@ -3,6 +3,7 @@
desc = "We grow hard plating underneath our skin, making us more resilient to harm by increasing our maximum health potential by 50 points."
helptext = "Our maximum health is increased by 50 points."
genomecost = 1
+ power_category = CHANGELING_POWER_HEALTH
isVerb = 0
verbpath = /mob/proc/changeling_endoarmor
diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
index 81930a7ebc..c2118847d9 100644
--- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm
+++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
@@ -1,10 +1,11 @@
/datum/power/changeling/enfeebling_string
- name = "Enfeebling String"
+ name = "Enfeebling String" /// String????
desc = "We sting a biological with a potent toxin that will greatly weaken them for a short period of time."
helptext = "Lowers the maximum health of the victim for a few minutes, as well as making them more frail and weak. This sting will also warn them of this."
enhancedtext = "Maximum health and outgoing melee damage is lowered further. Incoming damage is increased."
ability_icon_state = "ling_sting_enfeeble"
genomecost = 1
+ power_category = CHANGELING_POWER_STINGS
verbpath = /mob/proc/changeling_enfeebling_string
/datum/modifier/enfeeble
diff --git a/code/game/gamemodes/changeling/powers/engorged_glands.dm b/code/game/gamemodes/changeling/powers/engorged_glands.dm
index b5d96064d6..d0a39259ad 100644
--- a/code/game/gamemodes/changeling/powers/engorged_glands.dm
+++ b/code/game/gamemodes/changeling/powers/engorged_glands.dm
@@ -3,6 +3,7 @@
desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
helptext = "Allows us to store an extra 30 units of chemicals, and doubles production rate."
genomecost = 1
+ power_category = CHANGELING_POWER_ENHANCEMENTS
isVerb = 0
verbpath = /mob/proc/changeling_engorgedglands
diff --git a/code/game/gamemodes/changeling/powers/enrage.dm b/code/game/gamemodes/changeling/powers/enrage.dm
index 00b2193c86..516eedc523 100644
--- a/code/game/gamemodes/changeling/powers/enrage.dm
+++ b/code/game/gamemodes/changeling/powers/enrage.dm
@@ -8,6 +8,7 @@
enhancedtext = "The length of exhaustion after berserking is reduced to one minute, from two, and requires half as much nutrition."
ability_icon_state = "ling_berserk"
genomecost = 2
+ power_category = CHANGELING_POWER_ENHANCEMENTS
allowduringlesserform = 1
verbpath = /mob/living/proc/changeling_berserk
diff --git a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm
index 5d3c1a3be9..d288b45874 100644
--- a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm
+++ b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm
@@ -5,6 +5,7 @@
enhancedtext = "Immunity from most disabling effects for 30 seconds."
ability_icon_state = "ling_epinepherine_overdose"
genomecost = 2
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_epinephrine_overdose
/datum/modifier/unstoppable
diff --git a/code/game/gamemodes/changeling/powers/escape_restraints.dm b/code/game/gamemodes/changeling/powers/escape_restraints.dm
index ced80d35bf..b6747d87e1 100644
--- a/code/game/gamemodes/changeling/powers/escape_restraints.dm
+++ b/code/game/gamemodes/changeling/powers/escape_restraints.dm
@@ -5,6 +5,7 @@
enhancedtext = "More frequent escapes."
ability_icon_state = "ling_escape_restraints"
genomecost = 2
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_escape_restraints
//Escape Cuffs. By design this does not escape from straight jackets
diff --git a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
index baf80140f1..ef97dfc984 100644
--- a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
+++ b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
@@ -4,6 +4,7 @@
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
ability_icon_state = "ling_sting_extract"
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
allowduringlesserform = 1
verbpath = /mob/proc/changeling_extract_dna_sting
diff --git a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
index 04a09d65d1..1799279e2a 100644
--- a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
+++ b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
@@ -19,6 +19,7 @@ var/global/list/changeling_fabricated_clothing = list(
To remove our new fabricated clothing, use this ability again."
ability_icon_state = "ling_fabricate_clothing"
genomecost = 1
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_fabricate_clothing
//Grows biological versions of chameleon clothes.
diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm
index 65fce3cecf..158454c1c4 100644
--- a/code/game/gamemodes/changeling/powers/fake_death.dm
+++ b/code/game/gamemodes/changeling/powers/fake_death.dm
@@ -4,6 +4,7 @@
helptext = "Can be used before or after death. Duration varies greatly."
ability_icon_state = "ling_regenerative_stasis"
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
allowduringlesserform = 1
verbpath = /mob/proc/changeling_fakedeath
diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm
index 05eea72d95..c53d336a79 100644
--- a/code/game/gamemodes/changeling/powers/fleshmend.dm
+++ b/code/game/gamemodes/changeling/powers/fleshmend.dm
@@ -5,6 +5,7 @@
enhancedtext = "Healing is twice as effective."
ability_icon_state = "ling_fleshmend"
genomecost = 1
+ power_category = CHANGELING_POWER_HEALTH
verbpath = /mob/proc/changeling_fleshmend
//Starts healing you every second for 50 seconds. Can be used whilst unconscious.
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index 105de8f4f5..a184f5c210 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -5,6 +5,7 @@
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
make_hud_button = 0
verbpath = /mob/proc/changeling_hiveupload
@@ -13,6 +14,7 @@
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
make_hud_button = 0
verbpath = /mob/proc/changeling_hivedownload
diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm
index d7b9cb0489..3fd3b6a9e8 100644
--- a/code/game/gamemodes/changeling/powers/lesser_form.dm
+++ b/code/game/gamemodes/changeling/powers/lesser_form.dm
@@ -1,3 +1,5 @@
+/// Not in use.
+
/datum/power/changeling/lesser_form
name = "Lesser Form"
desc = "We debase ourselves and become lesser. We become a monkey."
diff --git a/code/game/gamemodes/changeling/powers/lsd_sting.dm b/code/game/gamemodes/changeling/powers/lsd_sting.dm
index fabb81327e..963bf32e18 100644
--- a/code/game/gamemodes/changeling/powers/lsd_sting.dm
+++ b/code/game/gamemodes/changeling/powers/lsd_sting.dm
@@ -1,3 +1,5 @@
+/// Not in use.
+
//This only exists to be abused, so it's highly recommended to ensure this file is unchecked.
/datum/power/changeling/LSDSting
name = "Hallucination Sting"
diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm
index 6b84c577ff..5bb4a184f4 100644
--- a/code/game/gamemodes/changeling/powers/mimic_voice.dm
+++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm
@@ -4,6 +4,7 @@
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
ability_icon_state = "ling_mimic_voice"
genomecost = 1
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_mimicvoice
// Fake Voice
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 30679b6ef5..26ab0471f9 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -5,6 +5,7 @@
enhancedtext = "We heal more toxins."
ability_icon_state = "ling_anatomic_panacea"
genomecost = 1
+ power_category = CHANGELING_POWER_HEALTH
verbpath = /mob/proc/changeling_panacea
//Heals the things that the other regenerative abilities don't.
diff --git a/code/game/gamemodes/changeling/powers/para_sting.dm b/code/game/gamemodes/changeling/powers/para_sting.dm
index c4d04dd7de..9793ba05f0 100644
--- a/code/game/gamemodes/changeling/powers/para_sting.dm
+++ b/code/game/gamemodes/changeling/powers/para_sting.dm
@@ -1,3 +1,5 @@
+/// Not in use.
+
/datum/power/changeling/paralysis_sting
name = "Paralysis Sting"
desc = "We silently sting a human, paralyzing them for a short time."
diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm
index 298ee8769b..7449de3e1f 100644
--- a/code/game/gamemodes/changeling/powers/rapid_regen.dm
+++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm
@@ -6,6 +6,7 @@
enhancedtext = "Healing increased to heal up to maximum health."
ability_icon_state = "ling_rapid_regeneration"
genomecost = 2
+ power_category = CHANGELING_POWER_HEALTH
verbpath = /mob/proc/changeling_rapid_regen
//Gives a big heal, removing various injuries that might shut down normal people, like IB or fractures.
diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
index 77bab9bd99..f933334c0d 100644
--- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
+++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
@@ -1,9 +1,12 @@
+
+/// Intending to replace.
/datum/power/changeling/recursive_enhancement
name = "Recursive Enhancement"
desc = "We cause our abilities to have increased or additional effects."
helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu."
ability_icon_state = "ling_recursive_enhancement"
genomecost = 3
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_recursive_enhancement
//Increases macimum chemical storage
diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm
index 5108361669..41280a6610 100644
--- a/code/game/gamemodes/changeling/powers/self_respiration.dm
+++ b/code/game/gamemodes/changeling/powers/self_respiration.dm
@@ -4,6 +4,7 @@
helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones."
ability_icon_state = "ling_toggle_breath"
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
verbpath = /mob/proc/changeling_self_respiration
//No breathing required
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index 9fe5fa708e..19a0af9d07 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -5,6 +5,7 @@
enhancedtext = "Range is doubled."
ability_icon_state = "ling_resonant_shriek"
genomecost = 2
+ power_category = CHANGELING_POWER_SHRIEKS
verbpath = /mob/proc/changeling_resonant_shriek
/datum/power/changeling/dissonant_shriek
@@ -14,6 +15,7 @@
enhancedtext = "Range is doubled."
ability_icon_state = "ling_dissonant_shriek"
genomecost = 2
+ power_category = CHANGELING_POWER_SHRIEKS
verbpath = /mob/proc/changeling_dissonant_shriek
//A flashy ability, good for crowd control and sewing chaos.
diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm
index 16d24c878f..606a75d2d5 100644
--- a/code/game/gamemodes/changeling/powers/silence_sting.dm
+++ b/code/game/gamemodes/changeling/powers/silence_sting.dm
@@ -5,6 +5,7 @@
enhancedtext = "Silence duration is extended."
ability_icon_state = "ling_sting_mute"
genomecost = 2
+ power_category = CHANGELING_POWER_STINGS
allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 6dd16061a1..16691331c4 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -3,6 +3,7 @@
desc = "We take on the appearance and voice of one we have absorbed."
ability_icon_state = "ling_transform"
genomecost = 0
+ power_category = CHANGELING_POWER_INHERENT
verbpath = /mob/proc/changeling_transform
//Change our DNA to that of somebody we've absorbed.
diff --git a/code/game/gamemodes/changeling/powers/transform_sting.dm b/code/game/gamemodes/changeling/powers/transform_sting.dm
index 1f6bc7b93d..e96398b0a1 100644
--- a/code/game/gamemodes/changeling/powers/transform_sting.dm
+++ b/code/game/gamemodes/changeling/powers/transform_sting.dm
@@ -1,3 +1,5 @@
+/// Not in use.
+
//Suggested to leave unchecked because this is why we can't have nice things.
/datum/power/changeling/transformation_sting
name = "Transformation Sting"
diff --git a/code/game/gamemodes/changeling/powers/unfat_sting.dm b/code/game/gamemodes/changeling/powers/unfat_sting.dm
index ece0d50f46..1b3c099a56 100644
--- a/code/game/gamemodes/changeling/powers/unfat_sting.dm
+++ b/code/game/gamemodes/changeling/powers/unfat_sting.dm
@@ -1,3 +1,5 @@
+/// Not in use.
+
/datum/power/changeling/unfat_sting
name = "Unfat Sting"
desc = "We silently sting a human, forcing them to rapidly metabolize their fat."
diff --git a/code/game/gamemodes/changeling/powers/visible_camouflage.dm b/code/game/gamemodes/changeling/powers/visible_camouflage.dm
index 747deb9f99..ea968e2f50 100644
--- a/code/game/gamemodes/changeling/powers/visible_camouflage.dm
+++ b/code/game/gamemodes/changeling/powers/visible_camouflage.dm
@@ -6,6 +6,7 @@
enhancedtext = "Can run while hidden."
ability_icon_state = "ling_camoflage"
genomecost = 3
+ power_category = CHANGELING_POWER_ENHANCEMENTS
verbpath = /mob/proc/changeling_visible_camouflage
//Hide us from anyone who would do us harm.
diff --git a/code/modules/antagonist/antagonist_add.dm b/code/modules/antagonist/antagonist_add.dm
index 56a716f24b..d6087c655a 100644
--- a/code/modules/antagonist/antagonist_add.dm
+++ b/code/modules/antagonist/antagonist_add.dm
@@ -63,5 +63,9 @@
player.current.verbs -= /mob/living/proc/write_ambition
player.current.client.verbs -= /client/proc/aooc
player.ambitions = ""
+ if(id == MODE_CHANGELING)
+ player.current.remove_changeling_powers()
+ player.current.verbs -= /datum/changeling/proc/EvolutionTree
+ player.current.verbs -= /mob/proc/changeling_respec
return 1
return 0
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index a48906d045..3e74e97c6a 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -324,6 +324,7 @@
#include "code\datums\looping_sounds\sequence.dm"
#include "code\datums\looping_sounds\weather_sounds.dm"
#include "code\datums\managed_browsers\_managed_browser.dm"
+#include "code\datums\managed_browsers\changelingevolution.dm"
#include "code\datums\managed_browsers\feedback_form.dm"
#include "code\datums\managed_browsers\feedback_viewer.dm"
#include "code\datums\observation\_debug.dm"
@@ -475,6 +476,7 @@
#include "code\game\gamemodes\calamity\calamity.dm"
#include "code\game\gamemodes\changeling\absorbed_dna.dm"
#include "code\game\gamemodes\changeling\changeling.dm"
+#include "code\game\gamemodes\changeling\changeling_evolutiontree.dm"
#include "code\game\gamemodes\changeling\changeling_powers.dm"
#include "code\game\gamemodes\changeling\generic_equip_procs.dm"
#include "code\game\gamemodes\changeling\modularchangling.dm"