diff --git a/code/datums/components/genetic_damage.dm b/code/datums/components/genetic_damage.dm deleted file mode 100644 index c944f7be8e3..00000000000 --- a/code/datums/components/genetic_damage.dm +++ /dev/null @@ -1,72 +0,0 @@ -#define GORILLA_MUTATION_CHANCE_PER_SECOND 0.25 -#define GORILLA_MUTATION_MINIMUM_DAMAGE 2500 - -/// Genetic damage, given by DNA consoles, will start to deal toxin damage -/// past a certain threshold, and will go down consistently. -/// Adding multiple of this component will increase the total damage. -/// Can turn monkeys into gorillas. -/datum/component/genetic_damage - dupe_mode = COMPONENT_DUPE_UNIQUE - - /// The total genetic damage on the mob - var/total_damage = 0 - - /// The amount of genetic damage a mob can sustain before taking damage - var/minimum_before_damage = 500 - - /// The amount of genetic damage to remove per second - var/remove_per_second = 1 / 3 - - /// The amount of toxin damage to deal per second, if over the minimum before taking damage - var/toxin_damage_per_second = 1 / 3 - -/datum/component/genetic_damage/Initialize(genetic_damage) - if (!isliving(parent)) - return COMPONENT_INCOMPATIBLE - - src.total_damage = genetic_damage - - START_PROCESSING(SSprocessing, src) - -/datum/component/genetic_damage/RegisterWithParent() - RegisterSignal(parent, COMSIG_LIVING_HEALTHSCAN, PROC_REF(on_healthscan)) - -/datum/component/genetic_damage/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_LIVING_HEALTHSCAN) - -/datum/component/genetic_damage/Destroy(force, silent) - STOP_PROCESSING(SSprocessing, src) - - return ..() - -/datum/component/genetic_damage/InheritComponent(datum/component/genetic_damage/old_component) - total_damage += old_component.total_damage - -/datum/component/genetic_damage/process(seconds_per_tick) - if (ismonkey(parent) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_per_tick)) - var/mob/living/carbon/carbon_parent = parent - carbon_parent.gorillize() - qdel(src) - return PROCESS_KILL - - if (total_damage >= minimum_before_damage) - var/mob/living/living_mob = parent - living_mob.adjustToxLoss(toxin_damage_per_second * seconds_per_tick) - - total_damage -= remove_per_second * seconds_per_tick - if (total_damage <= 0) - qdel(src) - return PROCESS_KILL - -/datum/component/genetic_damage/proc/on_healthscan(datum/source, list/render_list, advanced) - SIGNAL_HANDLER - - if (advanced) - render_list += "Genetic damage: [round(total_damage / minimum_before_damage * 100, 0.1)]%\n" - else if (total_damage >= minimum_before_damage) - render_list += "Severe genetic damage detected.\n" - else - render_list += "Minor genetic damage detected.\n" - -#undef GORILLA_MUTATION_CHANCE_PER_SECOND -#undef GORILLA_MUTATION_MINIMUM_DAMAGE diff --git a/code/datums/status_effects/debuffs/genetic_damage.dm b/code/datums/status_effects/debuffs/genetic_damage.dm new file mode 100644 index 00000000000..c052fa7b524 --- /dev/null +++ b/code/datums/status_effects/debuffs/genetic_damage.dm @@ -0,0 +1,60 @@ +#define GORILLA_MUTATION_CHANCE_PER_SECOND 0.25 +#define GORILLA_MUTATION_MINIMUM_DAMAGE 2500 + +/datum/status_effect/genetic_damage + id = "genetic_damage" + alert_type = null + status_type = STATUS_EFFECT_REFRESH // New effects will add to total_damage + duration = -1 + tick_interval = 2 SECONDS + on_remove_on_mob_delete = TRUE // Need to unregister from owner, be_replaced() would cause runtimes + remove_on_fullheal = TRUE + /// The total genetic damage accumulated on the mob + var/total_damage = 0 + /// The amount of genetic damage a mob can sustain before taking toxin damage + var/minimum_before_tox_damage = 500 + /// The amount of genetic damage to remove per second + var/remove_per_second = 1 / 3 + /// The amount of toxin damage to deal per second, if over the minimum before taking damage + var/toxin_damage_per_second = 1 / 3 + +/datum/status_effect/genetic_damage/on_creation(mob/living/new_owner, total_damage) + . = ..() + src.total_damage = total_damage + RegisterSignal(new_owner, COMSIG_LIVING_HEALTHSCAN, PROC_REF(on_healthscan)) + +/datum/status_effect/genetic_damage/on_remove() + . = ..() + UnregisterSignal(owner, COMSIG_LIVING_HEALTHSCAN) + +/datum/status_effect/genetic_damage/refresh(mob/living/owner, total_damage) + . = ..() + src.total_damage += total_damage + +/datum/status_effect/genetic_damage/tick(seconds_per_tick, times_fired) + if(ismonkey(owner) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_per_tick)) + qdel(src) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.gorillize() + return + + if(total_damage >= minimum_before_tox_damage) + owner.adjustToxLoss(toxin_damage_per_second * seconds_per_tick) + + total_damage -= remove_per_second * seconds_per_tick + if(total_damage <= 0) + qdel(src) + return + +/datum/status_effect/genetic_damage/proc/on_healthscan(datum/source, list/render_list, advanced) + SIGNAL_HANDLER + + if(advanced) + render_list += "Genetic damage: [round(total_damage / minimum_before_tox_damage * 100, 0.1)]%\n" + else if(total_damage >= minimum_before_tox_damage) + render_list += "Severe genetic damage detected.\n" + else + render_list += "Minor genetic damage detected.\n" + +#undef GORILLA_MUTATION_CHANCE_PER_SECOND +#undef GORILLA_MUTATION_MINIMUM_DAMAGE diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 013304a3ecb..65af3ac9c8d 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -334,8 +334,8 @@ data["subjectUF"] = scanner_occupant.dna.unique_features data["storage"]["occupant"] = tgui_occupant_mutations - var/datum/component/genetic_damage/genetic_damage = scanner_occupant.GetComponent(/datum/component/genetic_damage) - data["subjectDamage"] = genetic_damage ? round((genetic_damage.total_damage / genetic_damage.minimum_before_damage) * 100, 0.1) : 0 + var/datum/status_effect/genetic_damage/genetic_damage = scanner_occupant.has_status_effect(/datum/status_effect/genetic_damage) + data["subjectDamage"] = genetic_damage ? round((genetic_damage.total_damage / genetic_damage.minimum_before_tox_damage) * 100, 0.1) : 0 else data["subjectName"] = null data["subjectStatus"] = null @@ -436,7 +436,7 @@ scanner_occupant.dna.generate_dna_blocks() scramble_ready = world.time + SCRAMBLE_TIMEOUT to_chat(usr,span_notice("DNA scrambled.")) - scanner_occupant.AddComponent(/datum/component/genetic_damage, GENETIC_DAMAGE_STRENGTH_MULTIPLIER*50/(connected_scanner.damage_coeff ** 2)) + scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, GENETIC_DAMAGE_STRENGTH_MULTIPLIER*50/(connected_scanner.damage_coeff ** 2)) if(connected_scanner) connected_scanner.use_power(connected_scanner.active_power_usage) else @@ -560,7 +560,7 @@ // Copy genome to scanner occupant and do some basic mutation checks as // we've increased the occupant genetic damage scanner_occupant.dna.mutation_index[path] = copytext(sequence, 1, genepos) + newgene + copytext(sequence, genepos + 1) - scanner_occupant.AddComponent(/datum/component/genetic_damage, GENETIC_DAMAGE_STRENGTH_MULTIPLIER/connected_scanner.damage_coeff) + scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, GENETIC_DAMAGE_STRENGTH_MULTIPLIER/connected_scanner.damage_coeff) scanner_occupant.domutcheck() // GUARD CHECK - Modifying genetics can lead to edge cases where the @@ -1692,7 +1692,7 @@ COOLDOWN_START(src, enzyme_copy_timer, ENZYME_COPY_BASE_COOLDOWN) scanner_occupant.dna.unique_identity = buffer_slot["UI"] scanner_occupant.updateappearance(mutations_overlay_update=1) - scanner_occupant.AddComponent(/datum/component/genetic_damage, damage_increase) + scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, damage_increase) scanner_occupant.domutcheck() return TRUE if("uf") @@ -1705,7 +1705,7 @@ COOLDOWN_START(src, enzyme_copy_timer, ENZYME_COPY_BASE_COOLDOWN) scanner_occupant.dna.unique_features = buffer_slot["UF"] scanner_occupant.updateappearance(mutcolor_update=1, mutations_overlay_update=1) - scanner_occupant.AddComponent(/datum/component/genetic_damage, damage_increase) + scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, damage_increase) scanner_occupant.domutcheck() return TRUE if("ue") @@ -1720,7 +1720,7 @@ scanner_occupant.name = buffer_slot["name"] scanner_occupant.dna.unique_enzymes = buffer_slot["UE"] scanner_occupant.dna.blood_type = buffer_slot["blood_type"] - scanner_occupant.AddComponent(/datum/component/genetic_damage, damage_increase) + scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, damage_increase) scanner_occupant.domutcheck() return TRUE if("mixed") @@ -1738,7 +1738,7 @@ scanner_occupant.name = buffer_slot["name"] scanner_occupant.dna.unique_enzymes = buffer_slot["UE"] scanner_occupant.dna.blood_type = buffer_slot["blood_type"] - scanner_occupant.AddComponent(/datum/component/genetic_damage, damage_increase) + scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, damage_increase) scanner_occupant.domutcheck() return TRUE diff --git a/tgstation.dme b/tgstation.dme index c73160d6685..421b1f0cba4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -912,7 +912,6 @@ #include "code\datums\components\gags_recolorable.dm" #include "code\datums\components\gas_leaker.dm" #include "code\datums\components\geiger_sound.dm" -#include "code\datums\components\genetic_damage.dm" #include "code\datums\components\gps.dm" #include "code\datums\components\grillable.dm" #include "code\datums\components\ground_sinking.dm" @@ -1403,6 +1402,7 @@ #include "code\datums\status_effects\debuffs\drugginess.dm" #include "code\datums\status_effects\debuffs\drunk.dm" #include "code\datums\status_effects\debuffs\fire_stacks.dm" +#include "code\datums\status_effects\debuffs\genetic_damage.dm" #include "code\datums\status_effects\debuffs\hallucination.dm" #include "code\datums\status_effects\debuffs\jitteriness.dm" #include "code\datums\status_effects\debuffs\pacifism.dm"