mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Merge pull request #10923 from Miauw62/neonewling
upgrades changeling disguises
This commit is contained in:
@@ -376,7 +376,7 @@
|
|||||||
text += "<b>YES</b>|<a href='?src=\ref[src];changeling=clear'>no</a>"
|
text += "<b>YES</b>|<a href='?src=\ref[src];changeling=clear'>no</a>"
|
||||||
if (objectives.len==0)
|
if (objectives.len==0)
|
||||||
text += "<br>Objectives are empty! <a href='?src=\ref[src];changeling=autoobjectives'>Randomize!</a>"
|
text += "<br>Objectives are empty! <a href='?src=\ref[src];changeling=autoobjectives'>Randomize!</a>"
|
||||||
if( changeling && changeling.absorbed_dna.len && (current.real_name != changeling.absorbed_dna[1]) )
|
if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) )
|
||||||
text += "<br><a href='?src=\ref[src];changeling=initialdna'>Transform to initial appearance.</a>"
|
text += "<br><a href='?src=\ref[src];changeling=initialdna'>Transform to initial appearance.</a>"
|
||||||
else
|
else
|
||||||
text += "<a href='?src=\ref[src];changeling=changeling'>yes</a>|<b>NO</b>"
|
text += "<a href='?src=\ref[src];changeling=changeling'>yes</a>|<b>NO</b>"
|
||||||
@@ -971,12 +971,12 @@
|
|||||||
usr << "<span class='notice'>The objectives for changeling [key] have been generated. You can edit them and anounce manually.</span>"
|
usr << "<span class='notice'>The objectives for changeling [key] have been generated. You can edit them and anounce manually.</span>"
|
||||||
|
|
||||||
if("initialdna")
|
if("initialdna")
|
||||||
if( !changeling || !changeling.absorbed_dna.len || !istype(current, /mob/living/carbon))
|
if( !changeling || !changeling.stored_profiles.len || !istype(current, /mob/living/carbon))
|
||||||
usr << "<span class='danger'>Resetting DNA failed!</span>"
|
usr << "<span class='danger'>Resetting DNA failed!</span>"
|
||||||
else
|
else
|
||||||
var/mob/living/carbon/C = current
|
var/mob/living/carbon/C = current
|
||||||
C.dna = changeling.absorbed_dna[1]
|
C.dna = changeling.first_prof.dna
|
||||||
C.real_name = C.dna.real_name
|
C.real_name = changeling.first_prof.name
|
||||||
updateappearance(C)
|
updateappearance(C)
|
||||||
domutcheck(C)
|
domutcheck(C)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
|
|
||||||
#define LING_FAKEDEATH_TIME 400 //40 seconds
|
#define LING_FAKEDEATH_TIME 400 //40 seconds
|
||||||
#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead.
|
#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead.
|
||||||
#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob
|
#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob
|
||||||
|
|
||||||
var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")
|
var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")
|
||||||
|
var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")
|
||||||
|
var/list/slot2slot = list("head" = slot_head, "wear_mask" = slot_wear_mask, "back" = slot_back, "wear_suit" = slot_wear_suit, "w_uniform" = slot_w_uniform, "shoes" = slot_shoes, "belt" = slot_belt, "gloves" = slot_gloves, "glasses" = slot_glasses, "ears" = slot_ears, "wear_id" = slot_wear_id, "s_store" = slot_s_store)
|
||||||
|
var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling)
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode
|
/datum/game_mode
|
||||||
var/list/datum/mind/changelings = list()
|
var/list/datum/mind/changelings = list()
|
||||||
@@ -257,9 +260,11 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
|
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
|
||||||
var/list/absorbed_dna = list()
|
var/list/stored_profiles = list() //list of datum/changelingprofile
|
||||||
var/list/protected_dna = list() //dna that is not lost when capacity is otherwise full
|
var/datum/changelingprofile/first_prof = null
|
||||||
var/dna_max = 4 //How many extra DNA strands the changeling can store for transformation.
|
//var/list/absorbed_dna = list()
|
||||||
|
//var/list/protected_dna = list() //dna that is not lost when capacity is otherwise full
|
||||||
|
var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation.
|
||||||
var/absorbedcount = 1 //We would require at least 1 sample of compatible DNA to have taken on the form of a human.
|
var/absorbedcount = 1 //We would require at least 1 sample of compatible DNA to have taken on the form of a human.
|
||||||
var/chem_charges = 20
|
var/chem_charges = 20
|
||||||
var/chem_storage = 75
|
var/chem_storage = 75
|
||||||
@@ -288,7 +293,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
|||||||
changelingID = "[honorific] [changelingID]"
|
changelingID = "[honorific] [changelingID]"
|
||||||
else
|
else
|
||||||
changelingID = "[honorific] [rand(1,999)]"
|
changelingID = "[honorific] [rand(1,999)]"
|
||||||
absorbed_dna.len = dna_max
|
|
||||||
|
|
||||||
|
|
||||||
/datum/changeling/proc/regenerate(var/mob/living/carbon/the_ling)
|
/datum/changeling/proc/regenerate(var/mob/living/carbon/the_ling)
|
||||||
@@ -302,18 +306,19 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
|||||||
|
|
||||||
|
|
||||||
/datum/changeling/proc/get_dna(dna_owner)
|
/datum/changeling/proc/get_dna(dna_owner)
|
||||||
for(var/datum/dna/DNA in (absorbed_dna+protected_dna))
|
for(var/datum/changelingprofile/prof in stored_profiles)
|
||||||
if(dna_owner == DNA.real_name)
|
if(dna_owner == prof.name)
|
||||||
return DNA
|
return prof
|
||||||
|
|
||||||
/datum/changeling/proc/has_dna(datum/dna/tDNA)
|
/datum/changeling/proc/has_dna(datum/dna/tDNA)
|
||||||
for(var/datum/dna/D in (absorbed_dna+protected_dna))
|
for(var/datum/changelingprofile/prof in stored_profiles)
|
||||||
if(tDNA.is_same_as(D))
|
if(tDNA.is_same_as(prof.dna))
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/datum/changeling/proc/can_absorb_dna(mob/living/carbon/user, mob/living/carbon/target)
|
/datum/changeling/proc/can_absorb_dna(mob/living/carbon/user, mob/living/carbon/human/target)
|
||||||
if(absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it.
|
var/datum/changelingprofile/prof = stored_profiles[1]
|
||||||
|
if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it.
|
||||||
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
|
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
|
||||||
return
|
return
|
||||||
if(!target)
|
if(!target)
|
||||||
@@ -330,3 +335,106 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
|||||||
user << "<span class='warning'>[target] is not compatible with our biology.</span>"
|
user << "<span class='warning'>[target] is not compatible with our biology.</span>"
|
||||||
return
|
return
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/datum/changeling/proc/add_profile(var/mob/living/carbon/human/H, var/mob/living/carbon/user, protect = 0)
|
||||||
|
if(stored_profiles.len > dna_max)
|
||||||
|
if(!push_out_profile())
|
||||||
|
return
|
||||||
|
|
||||||
|
var/datum/changelingprofile/prof = new()
|
||||||
|
|
||||||
|
H.dna.real_name = H.real_name //Set this again, just to be sure that it's properly set.
|
||||||
|
var/datum/dna/new_dna = new H.dna.type
|
||||||
|
H.dna.copy_dna(new_dna)
|
||||||
|
prof.dna = new_dna
|
||||||
|
prof.name = H.real_name
|
||||||
|
prof.protected = protect
|
||||||
|
|
||||||
|
var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")
|
||||||
|
for(var/slot in slots)
|
||||||
|
var/obj/item/I = H.vars[slot]
|
||||||
|
if(!I)
|
||||||
|
continue
|
||||||
|
prof.name_list[slot] = I.name
|
||||||
|
prof.appearance_list[slot] = I.appearance
|
||||||
|
prof.flags_cover_list[slot] = I.flags_cover
|
||||||
|
prof.item_color_list[slot] = I.item_color
|
||||||
|
prof.item_state_list[slot] = I.item_state
|
||||||
|
prof.exists_list[slot] = 1
|
||||||
|
|
||||||
|
stored_profiles += prof
|
||||||
|
|
||||||
|
return prof
|
||||||
|
|
||||||
|
/datum/changeling/proc/remove_profile(var/mob/living/carbon/human/H, force = 0)
|
||||||
|
for(var/datum/changelingprofile/prof in stored_profiles)
|
||||||
|
if(H.real_name == prof.name)
|
||||||
|
if(prof.protected && !force)
|
||||||
|
continue
|
||||||
|
stored_profiles -= prof
|
||||||
|
qdel(prof)
|
||||||
|
|
||||||
|
/datum/changeling/proc/get_profile_to_remove()
|
||||||
|
for(var/datum/changelingprofile/prof in stored_profiles)
|
||||||
|
if(!prof.protected)
|
||||||
|
return prof
|
||||||
|
|
||||||
|
/datum/changeling/proc/push_out_profile()
|
||||||
|
var/datum/changelingprofile/removeprofile = get_profile_to_remove()
|
||||||
|
if(removeprofile)
|
||||||
|
stored_profiles -= removeprofile
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
/proc/changeling_transform(var/mob/living/carbon/human/user, var/datum/changelingprofile/chosen_prof)
|
||||||
|
var/datum/dna/chosen_dna = chosen_prof.dna
|
||||||
|
user.real_name = chosen_prof.name
|
||||||
|
user.dna = chosen_dna
|
||||||
|
hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
|
||||||
|
domutcheck(user)
|
||||||
|
updateappearance(user)
|
||||||
|
|
||||||
|
//vars hackery. not pretty, but better than the alternative.
|
||||||
|
for(var/slot in slots)
|
||||||
|
if(istype(user.vars[slot], slot2type[slot]) && !(chosen_prof.exists_list[slot])) //remove unnecessary flesh items
|
||||||
|
qdel(user.vars[slot])
|
||||||
|
continue
|
||||||
|
|
||||||
|
if((user.vars[slot] && !istype(user.vars[slot], slot2type[slot])) || !(chosen_prof.exists_list[slot]))
|
||||||
|
continue
|
||||||
|
|
||||||
|
var/obj/item/C
|
||||||
|
var/equip = 0
|
||||||
|
if(!user.vars[slot])
|
||||||
|
var/thetype = slot2type[slot]
|
||||||
|
equip = 1
|
||||||
|
C = new thetype(user)
|
||||||
|
|
||||||
|
else if(istype(user.vars[slot], slot2type[slot]))
|
||||||
|
C = user.vars[slot]
|
||||||
|
|
||||||
|
C.appearance = chosen_prof.appearance_list[slot]
|
||||||
|
C.name = chosen_prof.name_list[slot]
|
||||||
|
C.flags_cover = chosen_prof.flags_cover_list[slot]
|
||||||
|
C.item_color = chosen_prof.item_color_list[slot]
|
||||||
|
C.item_state = chosen_prof.item_state_list[slot]
|
||||||
|
if(equip)
|
||||||
|
user.equip_to_slot_or_del(C, slot2slot[slot])
|
||||||
|
|
||||||
|
user.regenerate_icons()
|
||||||
|
|
||||||
|
/datum/changelingprofile
|
||||||
|
var/name = "a bug"
|
||||||
|
|
||||||
|
var/protected = 0
|
||||||
|
|
||||||
|
var/datum/dna/dna = null
|
||||||
|
var/list/name_list = list() //associative list of slotname = itemname
|
||||||
|
var/list/appearance_list = list()
|
||||||
|
var/list/flags_cover_list = list()
|
||||||
|
var/list/exists_list = list()
|
||||||
|
var/list/item_color_list = list()
|
||||||
|
var/list/item_state_list = list()
|
||||||
|
|
||||||
|
/datum/changelingprofile/Destroy()
|
||||||
|
qdel(dna)
|
||||||
|
|||||||
@@ -371,7 +371,8 @@ var/list/sting_paths
|
|||||||
S.on_purchase(src)
|
S.on_purchase(src)
|
||||||
|
|
||||||
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
|
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
|
||||||
mind.changeling.absorbed_dna |= C.dna
|
var/datum/changelingprofile/prof = mind.changeling.add_profile(C) //not really a point in typecasting here but somebody will probably get mad at me if i dont
|
||||||
|
mind.changeling.first_prof = prof
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/changeling/proc/reset()
|
/datum/changeling/proc/reset()
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
target << "<span class='userdanger'>You are absorbed by the changeling!</span>"
|
target << "<span class='userdanger'>You are absorbed by the changeling!</span>"
|
||||||
|
|
||||||
if(!changeling.has_dna(target.dna))
|
if(!changeling.has_dna(target.dna))
|
||||||
changeling.absorb_dna(target, user)
|
changeling.add_profile(target, user)
|
||||||
|
|
||||||
if(user.nutrition < NUTRITION_LEVEL_WELL_FED)
|
if(user.nutrition < NUTRITION_LEVEL_WELL_FED)
|
||||||
user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)
|
user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
|
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
|
||||||
changeling.absorbedcount += (target.mind.changeling.absorbedcount)
|
changeling.absorbedcount += (target.mind.changeling.absorbedcount)
|
||||||
|
|
||||||
target.mind.changeling.absorbed_dna.len = 1
|
target.mind.changeling.stored_profiles.len = 1
|
||||||
target.mind.changeling.absorbedcount = 0
|
target.mind.changeling.absorbedcount = 0
|
||||||
|
|
||||||
|
|
||||||
@@ -104,26 +104,9 @@
|
|||||||
|
|
||||||
|
|
||||||
//Absorbs the target DNA.
|
//Absorbs the target DNA.
|
||||||
/datum/changeling/proc/absorb_dna(mob/living/carbon/T, mob/user)
|
//datum/changeling/proc/absorb_dna(mob/living/carbon/T, mob/user)
|
||||||
if(absorbed_dna.len)
|
|
||||||
absorbed_dna.Cut(1,2)
|
|
||||||
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
|
|
||||||
var/datum/dna/new_dna = new T.dna.type
|
|
||||||
new_dna.uni_identity = T.dna.uni_identity
|
|
||||||
new_dna.struc_enzymes = T.dna.struc_enzymes
|
|
||||||
new_dna.real_name = T.dna.real_name
|
|
||||||
new_dna.species = T.dna.species
|
|
||||||
new_dna.features = T.dna.features
|
|
||||||
new_dna.blood_type = T.dna.blood_type
|
|
||||||
absorbedcount++
|
|
||||||
store_dna(new_dna, user)
|
|
||||||
|
|
||||||
/datum/changeling/proc/store_dna(datum/dna/new_dna, mob/user)
|
//datum/changeling/proc/store_dna(datum/dna/new_dna, mob/user)
|
||||||
for(var/datum/objective/escape/escape_with_identity/E in user.mind.objectives)
|
|
||||||
if(E.target_real_name == new_dna.real_name)
|
|
||||||
protected_dna |= new_dna
|
|
||||||
return
|
|
||||||
absorbed_dna |= new_dna
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -169,9 +152,8 @@
|
|||||||
target << "<span class='userdanger'>[user] tightens their grip as a painful sensation invades your body.</span>"
|
target << "<span class='userdanger'>[user] tightens their grip as a painful sensation invades your body.</span>"
|
||||||
|
|
||||||
if(!changeling.has_dna(target.dna))
|
if(!changeling.has_dna(target.dna))
|
||||||
changeling.absorb_dna(target, user)
|
changeling.add_profile(target, user)
|
||||||
changeling.protected_dna -= user.dna
|
changeling.remove_profile(user)
|
||||||
changeling.absorbed_dna -= user.dna
|
|
||||||
|
|
||||||
var/mob/dead/observer/ghost = target.ghostize(0)
|
var/mob/dead/observer/ghost = target.ghostize(0)
|
||||||
user.mind.transfer_to(target)
|
user.mind.transfer_to(target)
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ var/list/datum/dna/hivemind_bank = list()
|
|||||||
/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user)
|
/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user)
|
||||||
var/datum/changeling/changeling = user.mind.changeling
|
var/datum/changeling/changeling = user.mind.changeling
|
||||||
var/list/names = list()
|
var/list/names = list()
|
||||||
for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna))
|
for(var/datum/changelingprofile/prof in changeling.stored_profiles)
|
||||||
if(!(DNA in hivemind_bank))
|
if(!(prof in hivemind_bank))
|
||||||
names += DNA.real_name
|
names += prof.name
|
||||||
|
|
||||||
if(names.len <= 0)
|
if(names.len <= 0)
|
||||||
user << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
user << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||||
@@ -43,7 +43,7 @@ var/list/datum/dna/hivemind_bank = list()
|
|||||||
if(!chosen_name)
|
if(!chosen_name)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/dna/chosen_dna = changeling.get_dna(chosen_name)
|
var/datum/changelingprofile/chosen_dna = changeling.get_dna(chosen_name)
|
||||||
if(!chosen_dna)
|
if(!chosen_dna)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -62,7 +62,8 @@ var/list/datum/dna/hivemind_bank = list()
|
|||||||
if(!..())
|
if(!..())
|
||||||
return
|
return
|
||||||
var/datum/changeling/changeling = user.mind.changeling
|
var/datum/changeling/changeling = user.mind.changeling
|
||||||
if(changeling.absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it.
|
var/datum/changelingprofile/first_prof = changeling.stored_profiles[1]
|
||||||
|
if(first_prof.name == user.real_name)//If our current DNA is the stalest, we gotta ditch it.
|
||||||
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
|
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
|
||||||
return
|
return
|
||||||
return 1
|
return 1
|
||||||
@@ -70,9 +71,9 @@ var/list/datum/dna/hivemind_bank = list()
|
|||||||
/obj/effect/proc_holder/changeling/hivemind_download/sting_action(mob/user)
|
/obj/effect/proc_holder/changeling/hivemind_download/sting_action(mob/user)
|
||||||
var/datum/changeling/changeling = user.mind.changeling
|
var/datum/changeling/changeling = user.mind.changeling
|
||||||
var/list/names = list()
|
var/list/names = list()
|
||||||
for(var/datum/dna/DNA in hivemind_bank)
|
for(var/datum/changelingprofile/prof in hivemind_bank)
|
||||||
if(!(DNA in changeling.absorbed_dna))
|
if(!(prof in changeling.stored_profiles))
|
||||||
names[DNA.real_name] = DNA
|
names[prof.name] = prof
|
||||||
|
|
||||||
if(names.len <= 0)
|
if(names.len <= 0)
|
||||||
user << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
user << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||||
@@ -80,13 +81,11 @@ var/list/datum/dna/hivemind_bank = list()
|
|||||||
|
|
||||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||||
if(!S) return
|
if(!S) return
|
||||||
var/datum/dna/chosen_dna = names[S]
|
var/datum/changelingprofile/chosen_prof = names[S]
|
||||||
if(!chosen_dna)
|
if(!chosen_prof)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(changeling.absorbed_dna.len)
|
changeling.add_profile(chosen_prof, user)
|
||||||
changeling.absorbed_dna.Cut(1,2)
|
|
||||||
changeling.store_dna(chosen_dna, user)
|
|
||||||
user << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
user << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||||
feedback_add_details("changeling_powers","HD")
|
feedback_add_details("changeling_powers","HD")
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -11,25 +11,25 @@
|
|||||||
/obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user)
|
/obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user)
|
||||||
var/datum/changeling/changeling = user.mind.changeling
|
var/datum/changeling/changeling = user.mind.changeling
|
||||||
var/list/names = list()
|
var/list/names = list()
|
||||||
for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna))
|
for(var/datum/changelingprofile/prof in changeling.stored_profiles)
|
||||||
names += "[DNA.real_name]"
|
names += "[prof.name]"
|
||||||
|
|
||||||
var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||||
if(!chosen_name)
|
if(!chosen_name)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/dna/chosen_dna = changeling.get_dna(chosen_name)
|
var/datum/changelingprofile/chosen_prof = changeling.get_dna(chosen_name)
|
||||||
if(!chosen_dna)
|
if(!chosen_prof)
|
||||||
return
|
return
|
||||||
if(!user || user.notransform)
|
if(!user || user.notransform)
|
||||||
return 0
|
return 0
|
||||||
user << "<span class='notice'>We transform our appearance.</span>"
|
user << "<span class='notice'>We transform our appearance.</span>"
|
||||||
user.dna = chosen_dna
|
|
||||||
|
user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPSRC), chosen_prof.name)
|
||||||
|
|
||||||
user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
|
changeling_transform(user, chosen_prof)
|
||||||
|
|
||||||
changeling.purchasedpowers -= src
|
changeling.purchasedpowers -= src
|
||||||
feedback_add_details("changeling_powers","LFT")
|
feedback_add_details("changeling_powers","LFT")
|
||||||
qdel(user)
|
qdel(user)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -171,7 +171,7 @@
|
|||||||
/obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target)
|
/obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target)
|
||||||
add_logs(user, target, "stung", "extraction sting")
|
add_logs(user, target, "stung", "extraction sting")
|
||||||
if(!(user.mind.changeling.has_dna(target.dna)))
|
if(!(user.mind.changeling.has_dna(target.dna)))
|
||||||
user.mind.changeling.absorb_dna(target, user)
|
user.mind.changeling.add_profile(target, user)
|
||||||
feedback_add_details("changeling_powers","ED")
|
feedback_add_details("changeling_powers","ED")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -7,30 +7,66 @@
|
|||||||
req_human = 1
|
req_human = 1
|
||||||
max_genetic_damage = 3
|
max_genetic_damage = 3
|
||||||
|
|
||||||
|
/obj/item/clothing/glasses/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
|
||||||
|
/obj/item/clothing/under/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
allowed = list(/obj/item/changeling)
|
||||||
|
|
||||||
|
/obj/item/clothing/head/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
/obj/item/clothing/shoes/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
|
||||||
|
/obj/item/clothing/gloves/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
|
||||||
|
/obj/item/clothing/mask/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
|
||||||
|
/obj/item/changeling
|
||||||
|
name = "flesh"
|
||||||
|
flags = NODROP
|
||||||
|
slot_flags = ALL
|
||||||
|
allowed = list(/obj/item/changeling)
|
||||||
|
|
||||||
//Change our DNA to that of somebody we've absorbed.
|
//Change our DNA to that of somebody we've absorbed.
|
||||||
/obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user)
|
/obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user)
|
||||||
var/datum/changeling/changeling = user.mind.changeling
|
var/datum/changeling/changeling = user.mind.changeling
|
||||||
var/datum/dna/chosen_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
|
var/datum/changelingprofile/chosen_prof = changeling.select_dna("Select the target DNA: ", "Target DNA", user)
|
||||||
|
|
||||||
if(!chosen_dna)
|
if(!chosen_prof)
|
||||||
return
|
return
|
||||||
|
|
||||||
user.dna = chosen_dna
|
changeling_transform(user, chosen_prof)
|
||||||
user.real_name = chosen_dna.real_name
|
|
||||||
hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
|
|
||||||
updateappearance(user)
|
|
||||||
domutcheck(user)
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","TR")
|
feedback_add_details("changeling_powers","TR")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/changeling/proc/select_dna(var/prompt, var/title)
|
/datum/changeling/proc/select_dna(var/prompt, var/title, var/mob/living/carbon/user)
|
||||||
var/list/names = list()
|
var/list/names = list("Drop Flesh Disguise")
|
||||||
for(var/datum/dna/DNA in (absorbed_dna+protected_dna))
|
for(var/datum/changelingprofile/prof in stored_profiles)
|
||||||
names += "[DNA.real_name]"
|
names += "[prof.name]"
|
||||||
|
|
||||||
var/chosen_name = input(prompt, title, null) as null|anything in names
|
var/chosen_name = input(prompt, title, null) as null|anything in names
|
||||||
if(!chosen_name)
|
if(!chosen_name)
|
||||||
return
|
return
|
||||||
var/datum/dna/chosen_dna = get_dna(chosen_name)
|
|
||||||
return chosen_dna
|
if(chosen_name == "Drop Flesh Disguise")
|
||||||
|
for(var/slot in slots)
|
||||||
|
if(istype(user.vars[slot], slot2type[slot]))
|
||||||
|
qdel(user.vars[slot])
|
||||||
|
|
||||||
|
var/datum/changelingprofile/prof = get_dna(chosen_name)
|
||||||
|
return prof
|
||||||
|
|||||||
@@ -610,7 +610,7 @@ var/global/list/possible_items_special = list()
|
|||||||
return target_amount
|
return target_amount
|
||||||
|
|
||||||
/datum/objective/absorb/check_completion()
|
/datum/objective/absorb/check_completion()
|
||||||
if(owner && owner.changeling && owner.changeling.absorbed_dna && (owner.changeling.absorbedcount >= target_amount))
|
if(owner && owner.changeling && owner.changeling.stored_profiles && (owner.changeling.absorbedcount >= target_amount))
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
7
html/changelogs/Miauw-lingdisguise.yml
Normal file
7
html/changelogs/Miauw-lingdisguise.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#if ur redding dis ur a dork xd
|
||||||
|
author: Miauw
|
||||||
|
|
||||||
|
delete-after: True
|
||||||
|
|
||||||
|
changes:
|
||||||
|
- rscadd: "Changeling transformations have been upgraded to also include clothing instead of just DNA."
|
||||||
Reference in New Issue
Block a user