diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index dab76ebf7d9a..64ff70e3eef6 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -16,7 +16,7 @@ var/text_gain_indication = "" var/text_lose_indication = "" var/list/visual_indicators = list() - var/above_body = 0 //wether the mutation appear above or below the body layer + var/layer_used = MUTATIONS_LAYER //which mutation layer to use var/list/species_allowed = list() //to restrict mutation to only certain species var/health_req //minimum health required to acquire the mutation @@ -62,7 +62,13 @@ if(text_gain_indication) owner << text_gain_indication if(visual_indicators.len) - owner.update_mutations_overlay() + var/list/mut_overlay = list(get_visual_indicator(owner)) + if(owner.overlays_standing[layer_used]) + mut_overlay = owner.overlays_standing[layer_used] + mut_overlay |= get_visual_indicator(owner) + owner.remove_overlay(layer_used) + owner.overlays_standing[layer_used] = mut_overlay + owner.apply_overlay(layer_used) /datum/mutation/human/proc/get_visual_indicator(mob/living/carbon/human/owner) return @@ -84,7 +90,13 @@ if(text_lose_indication) owner << text_lose_indication if(visual_indicators.len) - owner.update_mutations_overlay() + var/list/mut_overlay = list() + if(owner.overlays_standing[layer_used]) + mut_overlay = owner.overlays_standing[layer_used] + owner.remove_overlay(layer_used) + mut_overlay.Remove(get_visual_indicator(owner)) + owner.overlays_standing[layer_used] = mut_overlay + owner.apply_overlay(layer_used) return 0 return 1 @@ -596,7 +608,7 @@ quality = POSITIVE dna_block = NON_SCANNABLE text_gain_indication = "You feel pressure building up behind your eyes." - above_body = 1 + layer_used = FRONT_MUTATIONS_LAYER /datum/mutation/human/laser_eyes/New() ..() @@ -609,29 +621,24 @@ if(owner.a_intent == "harm") owner.LaserEyes(target) + /mob/living/carbon/proc/update_mutations_overlay() return /mob/living/carbon/human/update_mutations_overlay() - remove_overlay(MUTATIONS_LAYER) //MUTATIONS_LAYER is behind the body layer - remove_overlay(FRONT_MUTATIONS_LAYER) //FRONT_MUTATIONS_LAYER is above the body layer - var/list/standing = list() - var/list/frontstanding = list() - for(var/datum/mutation/human/CM in dna.mutations) if(CM.species_allowed.len && !CM.species_allowed.Find(dna.species.id)) - CM.force_lose(src) + CM.force_lose(src) //shouldn't have that mutation at all continue if(CM.visual_indicators.len) + var/list/mut_overlay = list() + if(overlays_standing[CM.layer_used]) + mut_overlay = overlays_standing[CM.layer_used] var/image/V = CM.get_visual_indicator(src) - if(CM.above_body) - frontstanding += V - else - standing += V - - if(standing.len) - overlays_standing[MUTATIONS_LAYER] = standing - if(frontstanding.len) - overlays_standing[FRONT_MUTATIONS_LAYER] = frontstanding - apply_overlay(MUTATIONS_LAYER) - apply_overlay(FRONT_MUTATIONS_LAYER) + if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one + remove_overlay(CM.layer_used) + for(var/image/I in CM.visual_indicators) + mut_overlay.Remove(I) + mut_overlay |= V + overlays_standing[CM.layer_used] = mut_overlay + apply_overlay(CM.layer_used) diff --git a/code/game/dna.dm b/code/game/dna.dm index 59ae91cce503..33615f83cfbb 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -320,7 +320,7 @@ mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutat for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(prob(probability)) M.dna.uni_identity = setblock(M.dna.uni_identity, i, random_string(DNA_BLOCK_SIZE, hex_characters)) - M.updateappearance() + M.updateappearance(mutations_overlay_update=1) return 1 //value in range 1 to values. values must be greater than 0 diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index e42e1fad6412..d9f6faa94572 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -388,8 +388,6 @@ var/list/sting_paths /mob/proc/remove_changeling_powers(keep_free_powers=0) if(ishuman(src) || ismonkey(src)) if(mind && mind.changeling) - digitalcamo = 0 - digitalinvis = 0 mind.changeling.changeling_speak = 0 mind.changeling.reset() for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 13bf62bdbc47..79651c98a973 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -18,3 +18,7 @@ feedback_add_details("changeling_powers","CAM") return 1 + +/obj/effect/proc_holder/changeling/digitalcamo/on_refund(mob/user) + user.digitalcamo = 0 + user.digitalinvis = 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 960b38ad0bac..28afa0a7bb81 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -38,7 +38,7 @@ M.dna.blood_type = fields["blood_type"] if(fields["UI"]) //UI+UE M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"]) - M.updateappearance() + M.updateappearance(mutations_overlay_update=1) log_attack(log_msg) else user << "It appears that [M] does not have compatible DNA." diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 1857a625da0c..c83ea419df48 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -43,10 +43,9 @@ if(prob(25)) if(prob(75)) randmutb(H) - H.domutcheck() else randmutg(H) - H.domutcheck() + H.domutcheck() else if(istype(C, /mob/living/carbon/monkey)) var/mob/living/carbon/monkey/M = C diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index fdfdd98f4510..9a1558304557 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -21,6 +21,7 @@ I.real_name = I.dna.real_name I.name = I.dna.real_name I.updateappearance(mutcolor_update=1) + I.domutcheck() if(W.ears) I.equip_to_slot_or_del(new W.ears.type, slot_ears) if(W.w_uniform) I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform) if(W.shoes) I.equip_to_slot_or_del(new W.shoes.type, slot_shoes) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6a001457d30e..ff959f6c940b 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -22,6 +22,8 @@ for(var/atom/movable/food in stomach_contents) qdel(food) remove_from_all_data_huds() + if(dna) + qdel(dna) return ..() /mob/living/carbon/Move(NewLoc, direct) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 9d5515a900a1..ff7b09b66323 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -48,8 +48,8 @@ if(tr_flags & TR_KEEPSE) O.dna.struc_enzymes = dna.struc_enzymes - var/datum/mutation/human/race/R = mutations_list[RACEMUT] //we don't want to keep the race block inactive - O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, R.dna_block, random_string(DNA_BLOCK_SIZE, list("8","9","a","b","c","d","e", "f"))) + var/datum/mutation/human/race/R = mutations_list[RACEMUT] + O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=1)//we don't want to keep the race block inactive if(suiciding) O.suiciding = suiciding @@ -166,8 +166,8 @@ if(tr_flags & TR_KEEPSE) O.dna.struc_enzymes = dna.struc_enzymes - var/datum/mutation/human/race/R = mutations_list[RACEMUT] //we don't want to keep the race block active - O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, R.dna_block, random_string(DNA_BLOCK_SIZE, list("0","1","2","3","4","5","6"))) + var/datum/mutation/human/race/R = mutations_list[RACEMUT] + O.dna.struc_enzymes = R.set_se(O.dna.struc_enzymes, on=0)//we don't want to keep the race block active O.domutcheck() if(suiciding) @@ -208,6 +208,10 @@ if(mind) mind.transfer_to(O) + if(O.mind.changeling) + for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers) + mind.changeling.purchasedpowers -= HF + O.a_intent = "help" if (tr_flags & TR_DEFAULTMSG) O << "You are now a human." diff --git a/html/changelogs/phil235-DnaMonkeyStuff.yml b/html/changelogs/phil235-DnaMonkeyStuff.yml new file mode 100644 index 000000000000..cee62b62a22c --- /dev/null +++ b/html/changelogs/phil235-DnaMonkeyStuff.yml @@ -0,0 +1,12 @@ +author: phil235 +delete-after: True + +changes: + - rscdel: "Lizards and other non human species can no longer acquire the hulk mutation. Hulks no longer have red eyes" + - bugfix: "Monkeys now always have dna and a blood type (compatible with humans)." + - bugfix: "Monkey transformation no longer deletes the human's clothes." + - bugfix: "Space Retrovirus now correctly transfers dna SE to the infected human." + - bugfix: "Changeling's Anatomic Panacea removes alien embryo again." + - bugfix: "Cloning someone now correctly sets up their dna UE." + - bugfix: "Fixes the laser eyes mutation not giving glowing red eyes to the human." + - bugfix: "Using changeling readaptation now properly removes all evolutions bought (arm blade, chameleon skin, organic suit)."