From 1544eafb4ff8f116be3b2ec537821273101f1784 Mon Sep 17 00:00:00 2001 From: Azarak Date: Mon, 4 Nov 2019 23:20:16 +0100 Subject: [PATCH] TG GENETICS AAAAAAAA aaaaaaaa --- code/__DEFINES/DNA.dm | 86 ++- code/__DEFINES/misc.dm | 2 +- code/__DEFINES/status_effects.dm | 2 + code/__DEFINES/traits.dm | 2 + code/__HELPERS/dna.dm | 12 + code/_globalvars/genetics.dm | 7 +- code/_onclick/telekinesis.dm | 6 +- code/controllers/subsystem/atoms.dm | 23 +- code/datums/datacore.dm | 1 - .../diseases/advance/symptoms/genetics.dm | 6 +- code/datums/dna.dm | 293 +++++++-- code/datums/mutations.dm | 136 ++-- code/datums/mutations/actions.dm | 169 +++++ code/datums/mutations/antenna.dm | 107 +++ code/datums/mutations/body.dm | 135 +++- code/datums/mutations/chameleon.dm | 5 +- code/datums/mutations/cold_resistance.dm | 31 +- code/datums/mutations/combined.dm | 24 + code/datums/mutations/hulk.dm | 11 +- code/datums/mutations/radioactive.dm | 19 + code/datums/mutations/sight.dm | 41 +- code/datums/mutations/speech.dm | 20 +- code/datums/mutations/telekinesis.dm | 14 +- code/datums/status_effects/debuffs.dm | 23 + .../weather/weather_types/radiation_storm.dm | 4 +- code/game/machinery/cloning.dm | 8 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/dna_console.dm | 618 ++++++++++++++---- code/game/machinery/exp_cloner.dm | 6 +- .../game/mecha/equipment/tools/other_tools.dm | 4 +- code/game/objects/items/chromosome.dm | 92 +++ .../circuitboards/machine_circuitboards.dm | 2 +- code/game/objects/items/devices/scanners.dm | 64 +- code/game/objects/items/dna_injector.dm | 244 ++++--- .../changeling/powers/chameleon_skin.dm | 11 +- code/modules/antagonists/revenant/revenant.dm | 2 +- .../revenant/revenant_abilities.dm | 29 +- .../antagonists/wishgranter/wishgranter.dm | 2 +- .../awaymissions/mission_code/wildwest.dm | 2 +- code/modules/client/asset_cache.dm | 8 + code/modules/events/disease_outbreak.dm | 2 +- code/modules/jobs/job_types/medical.dm | 1 + .../mining/lavaland/necropolis_chests.dm | 57 +- code/modules/mob/living/carbon/carbon.dm | 8 + .../mob/living/carbon/human/species.dm | 11 +- .../human/species_types/lizardpeople.dm | 1 + .../carbon/human/species_types/podpeople.dm | 4 +- code/modules/mob/living/carbon/life.dm | 7 +- code/modules/mob/living/carbon/monkey/life.dm | 2 +- code/modules/mob/transform_procs.dm | 10 +- .../chemistry/reagents/medicine_reagents.dm | 2 +- .../chemistry/reagents/toxin_reagents.dm | 4 +- .../research/designs/medical_designs.dm | 10 + code/modules/research/techweb/_techweb.dm | 1 + code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/spells/spell_types/genetic.dm | 2 +- code/modules/spells/spell_types/telepathy.dm | 30 + .../spells/spell_types/touch_attacks.dm | 6 +- .../surgery/bodyparts/dismemberment.dm | 2 +- html/browser/scannernew.css | 21 + html/dna_discovered.gif | Bin 0 -> 48972 bytes html/dna_extra.gif | Bin 0 -> 48105 bytes html/dna_undiscovered.gif | Bin 0 -> 48198 bytes icons/effects/genetics.dmi | Bin 20768 -> 22667 bytes icons/mob/actions/actions_genetic.dmi | Bin 0 -> 413 bytes icons/mob/actions/actions_spells.dmi | Bin 21667 -> 24828 bytes icons/obj/chromosomes.dmi | Bin 0 -> 1090 bytes icons/obj/device.dmi | Bin 46646 -> 48379 bytes .../code/game/machinery/wishgranter.dm | 2 +- tgstation.dme | 7 + 70 files changed, 1963 insertions(+), 502 deletions(-) create mode 100644 code/__HELPERS/dna.dm create mode 100644 code/datums/mutations/actions.dm create mode 100644 code/datums/mutations/antenna.dm create mode 100644 code/datums/mutations/combined.dm create mode 100644 code/datums/mutations/radioactive.dm create mode 100644 code/game/objects/items/chromosome.dm create mode 100644 code/modules/spells/spell_types/telepathy.dm create mode 100644 html/dna_discovered.gif create mode 100644 html/dna_extra.gif create mode 100644 html/dna_undiscovered.gif create mode 100644 icons/mob/actions/actions_genetic.dmi create mode 100644 icons/obj/chromosomes.dmi diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 39f70246..068a5e3c 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -2,32 +2,45 @@ #define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return -//Defines copying names of mutations in all cases, make sure to change this if you change mutation's name -#define HULK "Hulk" -#define XRAY "X Ray Vision" -#define COLDRES "Cold Resistance" -#define TK "Telekinesis" -#define NERVOUS "Nervousness" -#define EPILEPSY "Epilepsy" -#define MUTATE "Unstable DNA" -#define COUGH "Cough" -#define DWARFISM "Dwarfism" -#define CLOWNMUT "Clumsiness" -#define TOURETTES "Tourettes Syndrome" -#define DEAFMUT "Deafness" -#define BLINDMUT "Blindness" -#define RACEMUT "Monkified" -#define BADSIGHT "Near Sightness" -#define LASEREYES "Laser Eyes" -#define CHAMELEON "Chameleon" -#define WACKY "Wacky" -#define MUT_MUTE "Mute" -#define SMILE "Smile" -#define STONER "Stoner" -#define UNINTELLIGIBLE "Unintelligible" -#define SWEDISH "Swedish" -#define CHAV "Chav" -#define ELVIS "Elvis" +//Defines copying names of mutations in all cases, make sure to change this if you change mutation's type +#define HULK /datum/mutation/human/hulk +#define XRAY /datum/mutation/human/thermal/x_ray +#define SPACEMUT /datum/mutation/human/space_adaptation +#define TK /datum/mutation/human/telekinesis +#define NERVOUS /datum/mutation/human/nervousness +#define EPILEPSY /datum/mutation/human/epilepsy +#define MUTATE /datum/mutation/human/bad_dna +#define COUGH /datum/mutation/human/cough +#define DWARFISM /datum/mutation/human/dwarfism +#define CLOWNMUT /datum/mutation/human/clumsy +#define TOURETTES /datum/mutation/human/tourettes +#define DEAFMUT /datum/mutation/human/deaf +#define BLINDMUT /datum/mutation/human/blind +#define RACEMUT /datum/mutation/human/race +#define BADSIGHT /datum/mutation/human/nearsight +#define LASEREYES /datum/mutation/human/laser_eyes +#define CHAMELEON /datum/mutation/human/chameleon +#define WACKY /datum/mutation/human/wacky +#define MUT_MUTE /datum/mutation/human/mute +#define SMILE /datum/mutation/human/smile +#define STONER /datum/mutation/human/stoner +#define UNINTELLIGIBLE /datum/mutation/human/unintelligible +#define SWEDISH /datum/mutation/human/swedish +#define CHAV /datum/mutation/human/chav +#define ELVIS /datum/mutation/human/elvis +#define RADIOACTIVE /datum/mutation/human/radioactive +#define GLOWY /datum/mutation/human/glow +#define TELEPATHY /datum/mutation/human/telepathy +#define FIREBREATH /datum/mutation/human/firebreath +#define VOID /datum/mutation/human/void +#define STRONG /datum/mutation/human/strong +#define FIRESWEAT /datum/mutation/human/fire +#define THERMAL /datum/mutation/human/thermal +#define INSULATED /datum/mutation/human/insulated +#define SHOCKTOUCH /datum/mutation/human/shock +#define ANTENNA /datum/mutation/human/antenna +#define PARANOIA /datum/mutation/human/paranoia +#define MINDREAD /datum/mutation/human/mindreader #define UI_CHANGED "ui changed" #define UE_CHANGED "ue changed" @@ -39,10 +52,13 @@ //Types of usual mutations #define POSITIVE 1 #define NEGATIVE 2 -#define MINOR_NEGATIVE 3 +#define MINOR_NEGATIVE 4 -//Mutations that cant be taken from genetics and are not in SE -#define NON_SCANNABLE -1 + +//Mutation classes. Normal being on them, extra being additional mutations with instability and other being stuff you dont want people to fuck with like wizard mutate +#define MUT_NORMAL 1 +#define MUT_EXTRA 2 +#define MUT_OTHER 3 //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 @@ -63,7 +79,8 @@ #define DNA_MUTANTMARKING_BLOCK 13 #define DNA_TAUR_BLOCK 14 -#define DNA_STRUC_ENZYMES_BLOCKS 18 +#define DNA_SEQUENCE_LENGTH 4 +#define DNA_MUTATION_BLOCKS 8 #define DNA_UNIQUE_ENZYMES_LEN 32 //Transformation proc stuff @@ -126,4 +143,11 @@ ////organ defines #define STANDARD_ORGAN_THRESHOLD 100 #define STANDARD_ORGAN_HEALING 0.001 -#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes \ No newline at end of file +#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes + + + +//used for the can_chromosome var on mutations +#define CHROMOSOME_NEVER 0 +#define CHROMOSOME_NONE 1 +#define CHROMOSOME_USED 2 \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 97886591..98d630b7 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -82,7 +82,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index fb4718d4..f5256122 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -91,3 +91,5 @@ #define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic #define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor + +#define STATUS_EFFECT_DNA_MELT /datum/status_effect/dna_melt //usually does something horrible to you when you hit 100 genetic instability diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ed000713..4cb885db 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -153,6 +153,8 @@ #define TRAIT_FRIENDLY "friendly" #define TRAIT_ASSBLASTUSA "assblastusa" #define TRAIT_CULT_EYES "cult_eyes" +#define TRAIT_XRAY_VISION "xray_vision" +#define TRAIT_THERMAL_VISION "thermal_vision" // common trait sources diff --git a/code/__HELPERS/dna.dm b/code/__HELPERS/dna.dm new file mode 100644 index 00000000..b366f9c4 --- /dev/null +++ b/code/__HELPERS/dna.dm @@ -0,0 +1,12 @@ +////////////////////////////////////////////////////////// +//A bunch of helpers to make genetics less of a headache// +////////////////////////////////////////////////////////// + +#define GET_INITIALIZED_MUTATION(A) GLOB.all_mutations[A] +#define GET_GENE_STRING(A, B) (B.mutation_index[A]) +#define GET_SEQUENCE(A) (GLOB.full_sequences[A]) + +#define GET_MUTATION_STABILIZER(A) ((A.stabilizer_coeff < 0) ? 1 : A.stabilizer_coeff) +#define GET_MUTATION_SYNCHRONIZER(A) ((A.synchronizer_coeff < 0) ? 1 : A.synchronizer_coeff) +#define GET_MUTATION_POWER(A) ((A.power_coeff < 0) ? 1 : A.power_coeff) +#define GET_MUTATION_ENERGY(A) ((A.energy_coeff < 0) ? 1 : A.energy_coeff) \ No newline at end of file diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 7016415d..3b16a4ad 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -21,8 +21,11 @@ GLOBAL_LIST(op_se_blocks) GLOBAL_VAR(NULLED_SE) GLOBAL_VAR(NULLED_UI) -GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things +GLOBAL_LIST_EMPTY(all_mutations) +GLOBAL_LIST_EMPTY(full_sequences) GLOBAL_LIST_EMPTY(bad_mutations) GLOBAL_LIST_EMPTY(good_mutations) -GLOBAL_LIST_EMPTY(not_good_mutations) \ No newline at end of file +GLOBAL_LIST_EMPTY(not_good_mutations) + +GLOBAL_LIST_EMPTY(mutation_recipes) \ No newline at end of file diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 12b1ca27..71ef48bb 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -1,12 +1,10 @@ /* Telekinesis - This needs more thinking out, but I might as well. */ /* Telekinetic attack: - By default, emulate the user's unarmed attack */ @@ -45,7 +43,6 @@ /* This is similar to item attack_self, but applies to anything that you can grab with a telekinetic grab. - It is used for manipulating things at range, for example, opening and closing closets. There are not a lot of defaults at this time, add more where appropriate. */ @@ -59,7 +56,6 @@ /* TK Grab Item (the workhorse of old TK) - * If you have not grabbed something, do a normal tk attack * If you have something, throw it at the target. If it is already adjacent, do a normal attackby() * If you click what you are holding, or attack_self(), do an attack_self_tk() on it. @@ -196,4 +192,4 @@ return (OXYLOSS) -#undef TK_MAXRANGE +#undef TK_MAXRANGE \ No newline at end of file diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index d94526e6..3aaa4a11 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR - setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation. + setupGenetics() //to set the mutations' sequence initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() return ..() @@ -108,16 +108,19 @@ SUBSYSTEM_DEF(atoms) BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() - var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) - for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) - avnums[i] = i - CHECK_TICK - - for(var/A in subtypesof(/datum/mutation/human)) - var/datum/mutation/human/B = new A() - if(B.dna_block == NON_SCANNABLE) + var/list/mutations = subtypesof(/datum/mutation/human) + shuffle_inplace(mutations) + for(var/A in subtypesof(/datum/generecipe)) + var/datum/generecipe/GR = A + GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result) + for(var/i in 1 to LAZYLEN(mutations)) + var/path = mutations[i] //byond gets pissy when we do it in one line + var/datum/mutation/human/B = new path () + B.alias = "Mutation #[i]" + GLOB.all_mutations[B.type] = B + GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks) + if(B.locked) continue - B.dna_block = pick_n_take(avnums) if(B.quality == POSITIVE) GLOB.good_mutations |= B else if(B.quality == NEGATIVE) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 3a2efb9d..8cfb84cb 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -277,7 +277,6 @@ L.fields["sex"] = H.gender L.fields["blood_type"] = H.dna.blood_type L.fields["b_dna"] = H.dna.unique_enzymes - L.fields["enzymes"] = H.dna.struc_enzymes L.fields["identity"] = H.dna.uni_identity L.fields["species"] = H.dna.species.type L.fields["features"] = H.dna.features diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 7f21b03d..49b229e5 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -58,12 +58,12 @@ Bonus symptom_delay_max = 60 if(A.properties["resistance"] >= 8) //mutate twice power = 2 - possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT] + possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT] var/mob/living/carbon/M = A.affected_mob if(M) if(!M.has_dna()) return - archived_dna = M.dna.struc_enzymes + archived_dna = M.dna.mutation_index // Give them back their old DNA when cured. /datum/symptom/genetic_mutation/End(datum/disease/advance/A) @@ -74,5 +74,5 @@ Bonus if(M && archived_dna) if(!M.has_dna()) return - M.dna.struc_enzymes = archived_dna + M.dna.mutation_index = archived_dna M.domutcheck() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index fe4b2dbe..e6f33680 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -2,7 +2,6 @@ /////////////////////////// DNA DATUM /datum/dna var/unique_enzymes - var/struc_enzymes var/uni_identity var/blood_type var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man) @@ -11,10 +10,13 @@ var/nameless = FALSE var/custom_species //siiiiigh I guess this is important var/list/mutations = list() //All mutations are from now on here - var/list/temporary_mutations = list() //Timers for temporary mutations + var/list/temporary_mutations = list() //Temporary changes to the UE var/list/previous = list() //For temporary name/ui/ue/blood_type modifications var/mob/living/holder var/delete_species = TRUE //Set to FALSE when a body is scanned by a cloner to fix #38875 + var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block + var/stability = 100 + var/scrambled = FALSE //Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers. /datum/dna/New(mob/living/new_holder) if(istype(new_holder)) @@ -53,11 +55,11 @@ H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text if(transfer_SE) - destination.dna.struc_enzymes = struc_enzymes + destination.dna.mutation_index = mutation_index /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes - new_dna.struc_enzymes = struc_enzymes + new_dna.mutation_index = mutation_index new_dna.uni_identity = uni_identity new_dna.blood_type = blood_type new_dna.features = features.Copy() @@ -67,26 +69,32 @@ new_dna.custom_species = custom_species new_dna.mutations = mutations.Copy() -/datum/dna/proc/add_mutation(mutation_name) - var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name] - HM.on_acquiring(holder) +//See mutation.dm for what 'class' does. 'time' is time till it removes itself in decimals. 0 for no timer +/datum/dna/proc/add_mutation(mutation, class = MUT_OTHER, time) + var/mutation_type = mutation + if(istype(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = mutation + mutation_type = HM.type + if(get_mutation(mutation_type)) + return + return force_give(new mutation_type (class, time, copymut = mutation)) -/datum/dna/proc/remove_mutation(mutation_name) - var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name] - HM.on_losing(holder) +/datum/dna/proc/remove_mutation(mutation_type) + return force_lose(get_mutation(mutation_type)) -/datum/dna/proc/check_mutation(mutation_name) - var/datum/mutation/human/HM = GLOB.mutations_list[mutation_name] - return mutations.Find(HM) +/datum/dna/proc/check_mutation(mutation_type) + return get_mutation(mutation_type) -/datum/dna/proc/remove_all_mutations() - remove_mutation_group(mutations) +/datum/dna/proc/remove_all_mutations(list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE) + remove_mutation_group(mutations, classes, mutadone) + scrambled = FALSE -/datum/dna/proc/remove_mutation_group(list/group) +/datum/dna/proc/remove_mutation_group(list/group, list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE) if(!group) return for(var/datum/mutation/human/HM in group) - HM.force_lose(holder) + if((HM.class in classes) && !(HM.mutadone_proof && mutadone)) + force_lose(HM) /datum/dna/proc/generate_uni_identity() . = "" @@ -128,19 +136,49 @@ . += random_string(DNA_BLOCK_SIZE,GLOB.hex_characters) return . -/datum/dna/proc/generate_struc_enzymes() - var/list/sorting = new /list(DNA_STRUC_ENZYMES_BLOCKS) - var/result = "" - for(var/datum/mutation/human/A in GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations) - if(A.name == RACEMUT && ismonkey(holder)) - sorting[A.dna_block] = num2hex(A.lowest_value + rand(0, 256 * 6), DNA_BLOCK_SIZE) - mutations |= A - else - sorting[A.dna_block] = random_string(DNA_BLOCK_SIZE, list("0","1","2","3","4","5","6")) +/datum/dna/proc/generate_dna_blocks() + var/bonus + if(species && species.inert_mutation) + bonus = GET_INITIALIZED_MUTATION(species.inert_mutation) + var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations + bonus + if(!LAZYLEN(mutations_temp)) + return + mutation_index.Cut() + shuffle_inplace(mutations_temp) + if(ismonkey(holder)) + mutations |= new RACEMUT(MUT_NORMAL) + mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT) + else + mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE) + for(var/i in 2 to DNA_MUTATION_BLOCKS) + var/datum/mutation/human/M = mutations_temp[i] + mutation_index[M.type] = create_sequence(M.type, FALSE,M.difficulty) + shuffle_inplace(mutation_index) - for(var/B in sorting) - result += B - return result +//Used to generate original gene sequences for every mutation +/proc/generate_gene_sequence(length=4) + var/static/list/active_sequences = list("AT","TA","GC","CG") + var/sequence + for(var/i in 1 to length*DNA_SEQUENCE_LENGTH) + sequence += pick(active_sequences) + return sequence + +//Used to create a chipped gene sequence +/proc/create_sequence(mutation, active, difficulty) + if(!difficulty) + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation) //leaves the possibility to change difficulty mid-round + if(!A) + return + difficulty = A.difficulty + difficulty += rand(-2,4) + var/sequence = GET_SEQUENCE(mutation) + if(active) + return sequence + while(difficulty) + var/randnum = rand(1, length(sequence)) + sequence = copytext(sequence, 1, randnum) + "X" + copytext(sequence, randnum+1, length(sequence)+1) + difficulty-- + return sequence /datum/dna/proc/generate_unique_enzymes() . = "" @@ -185,12 +223,57 @@ if(DNA_TAUR_BLOCK) construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) +//Please use add_mutation or activate_mutation instead +/datum/dna/proc/force_give(datum/mutation/human/HM) + if(holder && HM) + if(HM.class == MUT_NORMAL) + set_se(1, HM) + . = HM.on_acquiring(holder) + if(.) + qdel(HM) + update_instability() + +//Use remove_mutation instead +/datum/dna/proc/force_lose(datum/mutation/human/HM) + if(holder && (HM in mutations)) + set_se(0, HM) + . = HM.on_losing(holder) + update_instability(FALSE) + return + /datum/dna/proc/is_same_as(datum/dna/D) - if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) + if(uni_identity == D.uni_identity && mutation_index == D.mutation_index && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) if(species.type == D.species.type && features == D.features && blood_type == D.blood_type) return 1 return 0 +/datum/dna/proc/update_instability(alert=TRUE) + stability = 100 + for(var/datum/mutation/human/M in mutations) + if(M.class == MUT_EXTRA) + stability -= M.instability * GET_MUTATION_STABILIZER(M) + if(holder) + var/message + if(alert) + switch(stability) + if(70 to 90) + message = "You shiver." + if(60 to 69) + message = "You feel cold." + if(40 to 59) + message = "You feel sick." + if(20 to 39) + message = "It feels like your skin is moving." + if(1 to 19) + message = "You can feel your cells burning." + if(-INFINITY to 0) + message = "You can feel your DNA exploding, we need to do something fast!" + if(stability <= 0) + holder.apply_status_effect(STATUS_EFFECT_DNA_MELT) + if(message) + to_chat(holder, message) + + //used to update dna UI, UE, and dna.real_name. /datum/dna/proc/update_dna_identity() uni_identity = generate_uni_identity() @@ -201,7 +284,7 @@ blood_type = newblood_type unique_enzymes = generate_unique_enzymes() uni_identity = generate_uni_identity() - struc_enzymes = generate_struc_enzymes() + generate_dna_blocks() features = random_features() @@ -265,7 +348,7 @@ return dna -/mob/living/carbon/human/proc/hardset_dna(ui, se, newreal_name, newblood_type, datum/species/mrace, newfeatures) +/mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures) if(newfeatures) dna.features = newfeatures @@ -287,8 +370,8 @@ dna.uni_identity = ui updateappearance(icon_update=0) - if(se) - dna.struc_enzymes = se + if(LAZYLEN(mutation_index)) + dna.mutation_index = mutation_index domutcheck() if(mrace || newfeatures || ui) @@ -331,19 +414,63 @@ /mob/proc/domutcheck() return -/mob/living/carbon/domutcheck(force_powers=0) //Set force_powers to 1 to bypass the power chance +/mob/living/carbon/domutcheck() if(!has_dna()) return - for(var/datum/mutation/human/A in GLOB.good_mutations | GLOB.bad_mutations | GLOB.not_good_mutations) - if(ismob(A.check_block(src, force_powers))) + for(var/mutation in dna.mutation_index) + if(ismob(dna.check_block(mutation))) return //we got monkeyized/humanized, this mob will be deleted, no need to continue. update_mutations_overlay() +/datum/dna/proc/check_block(mutation) + var/datum/mutation/human/HM = get_mutation(mutation) + if(check_block_string(mutation)) + if(!HM) + . = add_mutation(mutation, MUT_NORMAL) + return + return force_lose(HM) + +//Return the active mutation of a type if there is one +/datum/dna/proc/get_mutation(A) + for(var/datum/mutation/human/HM in mutations) + if(HM.type == A) + return HM + +/datum/dna/proc/check_block_string(mutation) + if((LAZYLEN(mutation_index) > DNA_MUTATION_BLOCKS) || !(mutation in mutation_index)) + return 0 + return is_gene_active(mutation) + +/datum/dna/proc/is_gene_active(mutation) + return (mutation_index[mutation] == GET_SEQUENCE(mutation)) + +/datum/dna/proc/set_se(on=TRUE, datum/mutation/human/HM) + if(!HM || !(HM.type in mutation_index) || (LAZYLEN(mutation_index) < DNA_MUTATION_BLOCKS)) + return + . = TRUE + if(on) + mutation_index[HM.type] = GET_SEQUENCE(HM.type) + else if(GET_SEQUENCE(HM.type) == mutation_index[HM.type]) + mutation_index[HM.type] = create_sequence(HM.type, FALSE, HM.difficulty) + +/datum/dna/proc/activate_mutation(mutation) //note that this returns a boolean and not a new mob + if(!mutation) + return FALSE + var/mutation_type = mutation + if(istype(mutation, /datum/mutation/human)) + var/datum/mutation/human/M = mutation + mutation_type = M.type + if(!mutation_in_sequence(mutation_type)) //cant activate what we dont have, use add_mutation + return FALSE + add_mutation(mutation, MUT_NORMAL) + return TRUE + /////////////////////////// DNA HELPER-PROCS ////////////////////////////// + /proc/getleftblocks(input,blocknumber,blocksize) if(blocknumber > 1) return copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) @@ -360,29 +487,47 @@ return 0 return getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) +/datum/dna/proc/mutation_in_sequence(mutation) + if(!mutation) + return + if(istype(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = mutation + if(HM.type in mutation_index) + return TRUE + else if(mutation in mutation_index) + return TRUE + /mob/living/carbon/proc/randmut(list/candidates, difficulty = 2) if(!has_dna()) return - var/datum/mutation/human/num = pick(candidates) - . = num.force_give(src) + var/mutation = pick(candidates) + . = dna.add_mutation(mutation) -/mob/living/carbon/proc/randmutb() +/mob/living/carbon/proc/easy_randmut(quality = POSITIVE + NEGATIVE + MINOR_NEGATIVE, scrambled = TRUE, sequence = TRUE, exclude_monkey = TRUE) if(!has_dna()) return - var/datum/mutation/human/HM = pick((GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.mutations_list[RACEMUT]) - . = HM.force_give(src) + var/list/mutations = list() + if(quality & POSITIVE) + mutations += GLOB.good_mutations + if(quality & NEGATIVE) + mutations += GLOB.bad_mutations + if(quality & MINOR_NEGATIVE) + mutations += GLOB.not_good_mutations + var/list/possible = list() + for(var/datum/mutation/human/A in mutations) + if((!sequence || dna.mutation_in_sequence(A.type)) && !dna.get_mutation(A.type)) + possible += A.type + if(exclude_monkey) + possible.Remove(RACEMUT) + if(LAZYLEN(possible)) + var/mutation = pick(possible) + . = dna.activate_mutation(mutation) + if(scrambled) + var/datum/mutation/human/HM = dna.get_mutation(mutation) + if(HM) + HM.scrambled = TRUE + return TRUE -/mob/living/carbon/proc/randmutg() - if(!has_dna()) - return - var/datum/mutation/human/HM = pick(GLOB.good_mutations) - . = HM.force_give(src) - -/mob/living/carbon/proc/randmutvg() - if(!has_dna()) - return - var/datum/mutation/human/HM = pick((GLOB.good_mutations) - GLOB.mutations_list[HULK] - GLOB.mutations_list[DWARFISM]) - . = HM.force_give(src) /mob/living/carbon/proc/randmuti() if(!has_dna()) @@ -405,9 +550,9 @@ if(!M.has_dna()) return 0 if(se) - for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) + for(var/i=1, i<=DNA_MUTATION_BLOCKS, i++) if(prob(probability)) - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, random_string(DNA_BLOCK_SIZE, GLOB.hex_characters)) + M.dna.generate_dna_blocks() M.domutcheck() if(ui) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) @@ -434,3 +579,41 @@ return value /////////////////////////// DNA HELPER-PROCS + +/mob/living/carbon/human/proc/something_horrible() + if(!has_dna()) //shouldn't ever happen anyway so it's just in really weird cases + return + if(dna.stability > 0) + return + var/instability = -dna.stability + dna.remove_all_mutations() + dna.stability = 100 + if(prob(max(70-instability,0))) + switch(rand(0,3)) //not complete and utter death + if(0) + monkeyize() + if(1) + gain_trauma(/datum/brain_trauma/severe/paralysis) + if(2) + corgize() + if(3) + to_chat(src, "Oh, we actually feel quite alright!") + else + switch(rand(0,3)) + if(0) + gib() + if(1) + dust() + + if(2) + death() + petrify(INFINITY) + if(3) + if(prob(90)) + var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD)) + if(BP) + BP.dismember() + else + gib() + else + set_species(/datum/species/dullahan) \ No newline at end of file diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index efa248b4..9234e124 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -1,58 +1,55 @@ -GLOBAL_LIST_EMPTY(mutations_list) - /datum/mutation var/name -/datum/mutation/New() - GLOB.mutations_list[name] = src - /datum/mutation/human - var/dna_block + name = "mutation" + var/desc = "A mutation." + var/locked var/quality var/get_chance = 100 var/lowest_value = 256 * 8 var/text_gain_indication = "" var/text_lose_indication = "" var/list/mutable_appearance/visual_indicators = list() + var/obj/effect/proc_holder/spell/power 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 var/limb_req //required limbs to acquire this mutation var/time_coeff = 1 //coefficient for timed mutations + var/datum/dna/dna + var/mob/living/carbon/human/owner + var/instability = 0 //instability the holder gets when the mutation is not native + var/blocks = 4 //Amount of those big blocks with gene sequences + var/difficulty = 8 //Amount of missing sequences. Sometimes it removes an entire pair for 2 points + var/timed = FALSE //Boolean to easily check if we're going to self destruct + var/alias //'Mutation #49', decided every round to get some form of distinction between undiscovered mutations + var/scrambled = FALSE //Wheter we can read it if it's active. To avoid cheesing with mutagen + var/class //Decides player accesibility, sorta + //MUT_NORMAL - A mutation that can be activated and deactived by completing a sequence + //MUT_EXTRA - A mutation that is in the mutations tab, and can be given and taken away through though the DNA console. Has a 0 before it's name in the mutation section of the dna console + //MUT_OTHER Cannot be interacted with by players through normal means. I.E. wizards mutate -/datum/mutation/human/proc/force_give(mob/living/carbon/human/owner) - set_block(owner) - . = on_acquiring(owner) + var/can_chromosome = CHROMOSOME_NONE //can we take chromosomes? 0: CHROMOSOME_NEVER never, 1:CHROMOSOME_NONE yeah, 2: CHROMOSOME_USED no, already have one + var/chromosome_name //purely cosmetic + var/modified = FALSE //ugly but we really don't want chromosomes and on_acquiring to overlap and apply double the powers + var/mutadone_proof = FALSE -/datum/mutation/human/proc/force_lose(mob/living/carbon/human/owner) - set_block(owner, 0) - . = on_losing(owner) + //Chromosome stuff - set to -1 to prevent people from changing it. Example: It'd be a waste to decrease cooldown on mutism + var/stabilizer_coeff = 1 //genetic stability coeff + var/synchronizer_coeff = -1 //makes the mutation hurt the user less + var/power_coeff = -1 //boosts mutation strength + var/energy_coeff = -1 //lowers mutation cooldown -/datum/mutation/human/proc/set_se(se_string, on = 1) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) - return - var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1) - var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE) - var/after = copytext(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0) - return before + injection + after - -/datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1) - if(owner && owner.has_dna()) - owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on) - -/datum/mutation/human/proc/check_block_string(se_string) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) - return 0 - if(hex2num(getblock(se_string, dna_block)) >= lowest_value) - return 1 - -/datum/mutation/human/proc/check_block(mob/living/carbon/human/owner, force_powers=0) - if(check_block_string(owner.dna.struc_enzymes)) - if(prob(get_chance)||force_powers) - . = on_acquiring(owner) - else - . = on_losing(owner) +/datum/mutation/human/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + . = ..() + class = class_ + if(timer) + addtimer(CALLBACK(src, .proc/remove), timer) + timed = TRUE + if(copymut && istype(copymut, /datum/mutation/human)) + copy_mutation(copymut) /datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/owner) if(!owner || !istype(owner) || owner.stat == DEAD || (src in owner.dna.mutations)) @@ -63,7 +60,8 @@ GLOBAL_LIST_EMPTY(mutations_list) return TRUE if(limb_req && !owner.get_bodypart(limb_req)) return TRUE - owner.dna.mutations.Add(src) + dna = owner.dna + dna.mutations += src if(text_gain_indication) to_chat(owner, text_gain_indication) if(visual_indicators.len) @@ -75,6 +73,10 @@ GLOBAL_LIST_EMPTY(mutations_list) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) + grant_spell(owner) + if(!modified) + addtimer(CALLBACK(src, .proc/modify, 5)) //gonna want children calling ..() to run first + /datum/mutation/human/proc/get_visual_indicator(mob/living/carbon/human/owner) return @@ -102,26 +104,80 @@ GLOBAL_LIST_EMPTY(mutations_list) mut_overlay.Remove(get_visual_indicator(owner)) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) + if(power) + owner.RemoveSpell(power) + qdel(src) return 0 return 1 +/datum/mutation/human/proc/say_mod(message) + if(message) + return message + +/datum/mutation/human/proc/get_spans() + return list() + /mob/living/carbon/proc/update_mutations_overlay() return /mob/living/carbon/human/update_mutations_overlay() 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) //shouldn't have that mutation at all + dna.force_lose(CM) //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/mutable_appearance/V = CM.get_visual_indicator(src) + var/mutable_appearance/V = CM.get_visual_indicator() if(!mut_overlay.Find(V)) //either we lack the visual indicator or we have the wrong one remove_overlay(CM.layer_used) - for(var/mutable_appearance/MA in CM.visual_indicators) + for(var/mutable_appearance/MA in CM.visual_indicators[CM.type]) mut_overlay.Remove(MA) mut_overlay |= V overlays_standing[CM.layer_used] = mut_overlay apply_overlay(CM.layer_used) + + +/datum/mutation/human/proc/modify() //called when a genome is applied so we can properly update some stats without having to remove and reapply the mutation from someone + if(modified || !power || !owner) + return + power.charge_max *= GET_MUTATION_ENERGY(src) + power.charge_counter *= GET_MUTATION_ENERGY(src) + modified = TRUE + +/datum/mutation/human/proc/copy_mutation(datum/mutation/human/HM) + if(!HM) + return + chromosome_name = HM.chromosome_name + stabilizer_coeff = HM.stabilizer_coeff + synchronizer_coeff = HM.synchronizer_coeff + power_coeff = HM.power_coeff + energy_coeff = HM.energy_coeff + mutadone_proof = HM.mutadone_proof + can_chromosome = HM.can_chromosome + +/datum/mutation/human/proc/remove_chromosome() + stabilizer_coeff = initial(stabilizer_coeff) + synchronizer_coeff = initial(synchronizer_coeff) + power_coeff = initial(power_coeff) + energy_coeff = initial(energy_coeff) + mutadone_proof = initial(mutadone_proof) + can_chromosome = initial(can_chromosome) + chromosome_name = null + +/datum/mutation/human/proc/remove() + if(dna) + dna.force_lose(src) + else + qdel(src) + +/datum/mutation/human/proc/grant_spell(mob/living/carbon/human/owner) + if(!ispath(power) || !owner) + return FALSE + + power = new power() + power.action_background_icon_state = "bg_tech_blue_on" + power.panel = "Genetic" + owner.AddSpell(power) + return TRUE \ No newline at end of file diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm new file mode 100644 index 00000000..44187cc9 --- /dev/null +++ b/code/datums/mutations/actions.dm @@ -0,0 +1,169 @@ +/datum/mutation/human/telepathy + name = "Telepathy" + desc = "A rare mutation that allows the user to telepathically communicate to others." + quality = POSITIVE + text_gain_indication = "You can hear your own voice echoing in your mind!" + text_lose_indication = "You don't hear your mind echo anymore." + difficulty = 12 + power = /obj/effect/proc_holder/spell/targeted/telepathy/genetic + instability = 10 + energy_coeff = 1 + +/datum/mutation/human/telepathy/on_acquiring(mob/living/carbon/human/owner) + . = ..() + +/datum/mutation/human/telepathy/on_losing(mob/living/carbon/human/owner) + . = ..() + +/obj/effect/proc_holder/spell/targeted/telepathy/genetic + magic_check = FALSE + +/datum/mutation/human/firebreath + name = "Fire Breath" + desc = "An ancient mutation that gives lizards breath of fire." + quality = POSITIVE + difficulty = 12 + locked = TRUE + text_gain_indication = "Your throat is burning!" + text_lose_indication = "Your throat is cooling down." + power = /obj/effect/proc_holder/spell/aimed/firebreath + instability = 30 + energy_coeff = 1 + power_coeff = 1 + +/datum/mutation/human/firebreath/modify() + if(power) + var/obj/effect/proc_holder/spell/aimed/firebreath/S = power + S.strength = GET_MUTATION_POWER(src) + +/obj/effect/proc_holder/spell/aimed/firebreath + name = "Fire Breath" + desc = "You can breathe fire at a target." + school = "evocation" + charge_max = 1200 + clothes_req = FALSE + range = 20 + projectile_type = /obj/item/projectile/magic/aoe/fireball/firebreath + base_icon_state = "fireball" + action_icon_state = "fireball0" + sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises + active_msg = "You built up heat in your mouth." + deactive_msg = "You swallow the flame." + var/strength = 1 + +/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets) + . = ..() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(C.is_mouth_covered()) + C.adjust_fire_stacks(2) + C.IgniteMob() + to_chat(C,"Something in front of your mouth caught fire!") + return FALSE + +/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/item/projectile/P, atom/target, mob/user, iteration) + if(!istype(P, /obj/item/projectile/magic/aoe/fireball)) + return + var/obj/item/projectile/magic/aoe/fireball/F = P + switch(strength) + if(1 to 3) + F.exp_light = strength-1 + if(4 to INFINITY) + F.exp_heavy = strength-3 + F.exp_fire += strength + + +/obj/item/projectile/magic/aoe/fireball/firebreath + name = "fire breath" + exp_heavy = 0 + exp_light = 0 + exp_flash = 0 + exp_fire= 4 + +/datum/mutation/human/void + name = "Void Magnet" + desc = "A rare genome that attracts odd forces not usually observed." + quality = MINOR_NEGATIVE //upsides and downsides + text_gain_indication = "You feel a heavy, dull force just beyond the walls watching you." + instability = 30 + power = /obj/effect/proc_holder/spell/self/void + energy_coeff = 1 + synchronizer_coeff = 1 + +/datum/mutation/human/void/on_life(mob/living/carbon/human/owner) + if(!isturf(owner.loc)) + return + if(prob((0.5+((100-dna.stability)/20))) * GET_MUTATION_SYNCHRONIZER(src)) //very rare, but enough to annoy you hopefully. +0.5 probability for every 10 points lost in stability + new /obj/effect/immortality_talisman/void(get_turf(owner), owner) + +/obj/effect/proc_holder/spell/self/void + name = "Convoke Void" //magic the gathering joke here + desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly." + school = "evocation" + clothes_req = FALSE + charge_max = 600 + invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!" + invocation_type = "shout" + action_icon_state = "void_magnet" + var/in_use = FALSE //so it doesnt cast while you are already deep innit + +/obj/effect/proc_holder/spell/self/void/can_cast(mob/user = usr) + . = ..() + if(!isturf(user.loc)) + return FALSE + +/obj/effect/proc_holder/spell/self/void/cast(mob/user = usr) + . = ..() + new /obj/effect/immortality_talisman/void(get_turf(user), user) + +/datum/mutation/human/shock + name = "Shock Touch" + desc = "The affected can channel excess electricity through their hands without shocking themselves, allowing them to shock others." + quality = POSITIVE + locked = TRUE + difficulty = 16 + text_gain_indication = "You feel power flow through your hands." + text_lose_indication = "The energy in your hands subsides." + power = /obj/effect/proc_holder/spell/targeted/touch/shock + instability = 30 + +/obj/effect/proc_holder/spell/targeted/touch/shock + name = "Shock Touch" + desc = "Channel electricity to your hand to shock people with." + drawmessage = "You channel electricity into your hand." + dropmessage = "You let the electricity from your hand dissipate." + hand_path = /obj/item/melee/touch_attack/shock + charge_max = 400 + clothes_req = FALSE + action_icon_state = "zap" + +/obj/item/melee/touch_attack/shock + name = "\improper shock touch" + desc = "This is kind of like when you rub your feet on a shag rug so you can zap your friends, only a lot less safe." + catchphrase = null + on_use_sound = 'sound/weapons/zapbang.ogg' + icon_state = "zapper" + item_state = "zapper" + +/obj/item/melee/touch_attack/shock/afterattack(atom/target, mob/living/carbon/user, proximity) + if(!proximity || !isliving(target)) + return + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.electrocute_act(15, user, 1, stun = 0))//doesnt stun. never let this stun + C.dropItemToGround(C.get_active_held_item()) + C.dropItemToGround(C.get_inactive_held_item()) + C.confused += 10 + C.visible_message("[user] electrocutes [target]!","[user] electrocutes you!") + return ..() + else + user.visible_message("[user] fails to electrocute [target]!") + return ..() + else if(isliving(target)) + var/mob/living/L = target + L.electrocute_act(15, user, 1, stun = 0) + L.visible_message("[user] electrocutes [target]!","[user] electrocutes you!") + return ..() + else + to_chat(user,"The electricity doesn't seem to affect [target]...") + return ..() \ No newline at end of file diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm new file mode 100644 index 00000000..7e06a917 --- /dev/null +++ b/code/datums/mutations/antenna.dm @@ -0,0 +1,107 @@ +/datum/mutation/human/antenna + name = "Antenna" + desc = "The affected person sprouts an antenna. This is known to allow them to access common radio channels passively." + quality = POSITIVE + text_gain_indication = "You feel an antenna sprout from your forehead." + text_lose_indication = "Your antenna shrinks back down." + instability = 5 + difficulty = 8 + var/obj/item/implant/radio/antenna/linked_radio + +/obj/item/implant/radio/antenna + name = "internal antenna organ" + desc = "The internal organ part of the antenna. Science has not yet given it a good name." + icon = 'icons/obj/radio.dmi'//maybe make a unique sprite later. not important + icon_state = "walkietalkie" + +/obj/item/implant/radio/antenna/Initialize(mapload) + ..() + radio.name = "internal antenna" + +/datum/mutation/human/antenna/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + linked_radio = new(owner) + linked_radio.implant(owner, null, TRUE, TRUE) + +/datum/mutation/human/antenna/on_losing(mob/living/carbon/human/owner) + if(..()) + return + if(linked_radio) + linked_radio.Destroy() + +/datum/mutation/human/antenna/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + ..() + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1))//-MUTATIONS_LAYER+1 + +/datum/mutation/human/antenna/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[type][1] + +/datum/mutation/human/mindreader + name = "Mind Reader" + desc = "The affected person can look into the recent memories of others." + quality = POSITIVE + text_gain_indication = "You hear distant voices at the corners of your mind." + text_lose_indication = "The distant voices fade." + power = /obj/effect/proc_holder/spell/targeted/mindread + instability = 40 + difficulty = 8 + locked = TRUE + +/obj/effect/proc_holder/spell/targeted/mindread + name = "Mindread" + desc = "Read the target's mind." + charge_max = 300 + range = 7 + clothes_req = FALSE + action_icon_state = "mindread" + +/obj/effect/proc_holder/spell/targeted/mindread/cast(list/targets, mob/living/carbon/human/user = usr) + for(var/mob/living/M in targets) + if(usr.anti_magic_check(FALSE, FALSE, TRUE, 0) || M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(usr, "As you reach out with your mind, you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") + return + if(M.stat == DEAD) + to_chat(user, "[M] is dead!") + return + if(M.mind) + to_chat(user, "You plunge into [M]'s mind...") + if(prob(20)) + to_chat(M, "You feel something foreign enter your mind.")//chance to alert the read-ee + var/list/recent_speech = list() + var/list/say_log = list() + var/log_source = M.logging + for(var/log_type in log_source)//this whole loop puts the read-ee's say logs into say_log in an easy to access way + var/nlog_type = text2num(log_type) + if(nlog_type & LOG_SAY) + var/list/reversed = log_source[log_type] + if(islist(reversed)) + say_log = reverseRange(reversed.Copy()) + break + if(LAZYLEN(say_log)) + for(var/spoken_memory in say_log) + if(recent_speech.len >= 3)//up to 3 random lines of speech, favoring more recent speech + break + if(prob(50)) + recent_speech[spoken_memory] = say_log[spoken_memory] + if(recent_speech.len) + to_chat(user, "You catch some drifting memories of their past conversations...") + for(var/spoken_memory in recent_speech) + to_chat(user, "[recent_speech[spoken_memory]]") + if(iscarbon(M)) + var/mob/living/carbon/human/H = M + to_chat(user, "You find that their intent is to [H.a_intent]...") + var/datum/dna/the_dna = H.has_dna() + if(the_dna) + to_chat(user, "You uncover that [H.p_their()] true identity is [the_dna.real_name].") + else + to_chat(user, "You can't find a mind to read inside of [M]!") + +/datum/mutation/human/mindreader/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + ..() + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1)) + +/datum/mutation/human/mindreader/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[type][1] \ No newline at end of file diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index a32220aa..a64f4afd 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -3,16 +3,19 @@ //Epilepsy gives a very small chance to have a seizure every life tick, knocking you unconscious. /datum/mutation/human/epilepsy name = "Epilepsy" + desc = "A genetic defect that sporadically causes seizures." quality = NEGATIVE text_gain_indication = "You get a headache." + synchronizer_coeff = 1 + power_coeff = 1 /datum/mutation/human/epilepsy/on_life(mob/living/carbon/human/owner) - if(prob(1) && owner.stat == CONSCIOUS) + if(prob(1 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS) owner.visible_message("[owner] starts having a seizure!", "You have a seizure!") - owner.Unconscious(200) - owner.Jitter(1000) + owner.Unconscious(200 * GET_MUTATION_POWER(src)) + owner.Jitter(1000 * GET_MUTATION_POWER(src)) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy) - addtimer(CALLBACK(src, .proc/jitter_less, owner), 90) + addtimer(CALLBACK(src, .proc/jitter_less), 90) /datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner) if(owner) @@ -22,19 +25,23 @@ //Unstable DNA induces random mutations! /datum/mutation/human/bad_dna name = "Unstable DNA" + desc = "Strange mutation that causes the holder to randomly mutate." quality = NEGATIVE text_gain_indication = "You feel strange." + locked = TRUE /datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return to_chat(owner, text_gain_indication) var/mob/new_mob if(prob(95)) if(prob(50)) - new_mob = owner.randmutb() + new_mob = owner.easy_randmut(NEGATIVE + MINOR_NEGATIVE) else new_mob = owner.randmuti() else - new_mob = owner.randmutg() + new_mob = owner.easy_randmut(POSITIVE) if(new_mob && ismob(new_mob)) owner = new_mob . = owner @@ -44,21 +51,31 @@ //Cough gives you a chronic cough that causes you to drop items. /datum/mutation/human/cough name = "Cough" + desc = "A chronic cough." quality = MINOR_NEGATIVE text_gain_indication = "You start coughing." + synchronizer_coeff = 1 + power_coeff = 1 /datum/mutation/human/cough/on_life(mob/living/carbon/human/owner) - if(prob(5) && owner.stat == CONSCIOUS) + if(prob(5 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS) owner.drop_all_held_items() owner.emote("cough") + if(GET_MUTATION_POWER(src) > 1) + var/cough_range = GET_MUTATION_POWER(src) * 4 + var/turf/target = get_ranged_target_turf(owner, turn(owner.dir, 180), cough_range) + owner.throw_at(target, cough_range, GET_MUTATION_POWER(src)) + //Dwarfism shrinks your body and lets you pass tables. /datum/mutation/human/dwarfism name = "Dwarfism" + desc = "A mutation believed to be the cause of dwarfism." quality = POSITIVE - get_chance = 15 - lowest_value = 256 * 12 + difficulty = 16 + instability = 5 + locked = TRUE // Default intert species for now, so locked from regular pool. /datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -78,6 +95,7 @@ //Clumsiness has a very large amount of small drawbacks depending on item. /datum/mutation/human/clumsy name = "Clumsiness" + desc = "A genome that inhibits certain brain functions, causing the holder to appear clumsy. Honk" quality = MINOR_NEGATIVE text_gain_indication = "You feel lightheaded." @@ -95,11 +113,13 @@ //Tourettes causes you to randomly stand in place and shout. /datum/mutation/human/tourettes name = "Tourette's Syndrome" + desc = "A chronic twitch that forces the user to use colorful language." quality = NEGATIVE text_gain_indication = "You twitch." + synchronizer_coeff = 1 /datum/mutation/human/tourettes/on_life(mob/living/carbon/human/owner) - if(prob(10) && owner.stat == CONSCIOUS && !owner.IsStun()) + if(prob(10 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS && !owner.IsStun()) owner.Stun(200) switch(rand(1, 3)) if(1) @@ -117,6 +137,7 @@ //Deafness makes you deaf. /datum/mutation/human/deaf name = "Deafness" + desc = "The holder of this genome is completely deaf." quality = NEGATIVE text_gain_indication = "You can't seem to hear anything." @@ -134,8 +155,10 @@ //Monified turns you into a monkey. /datum/mutation/human/race name = "Monkified" + desc = "A strange genome, believing to be what differentiates monkeys from humans." quality = NEGATIVE time_coeff = 2 + locked = TRUE //Species specific, keep out of actual gene pool /datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -145,3 +168,95 @@ /datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner) if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src))) . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + + +/datum/mutation/human/glow + name = "Glowy" + desc = "You permanently emit a light with a random color and intensity." + quality = POSITIVE + text_gain_indication = "Your skin begins to glow softly." + instability = 5 + var/obj/effect/dummy/luminescent_glow/glowth //shamelessly copied from luminescents + var/glow = 1.5 + power_coeff = 1 + +/datum/mutation/human/glow/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + glowth = new(owner) + glowth.set_light(glow, glow, dna.features["mcolor"]) + +/datum/mutation/human/glow/modify(mob/living/carbon/human/owner) + if(glowth) + glowth.set_light(glow + GET_MUTATION_POWER(src) , glow + GET_MUTATION_POWER(src), dna.features["mcolor"]) + +/datum/mutation/human/glow/on_losing(mob/living/carbon/human/owner) + if(..()) + return + qdel(glowth) + +/datum/mutation/human/strong + name = "Strength" + desc = "The user's muscles slightly expand." + quality = POSITIVE + text_gain_indication = "You feel strong." + difficulty = 16 + +/datum/mutation/human/fire + name = "Fiery Sweat" + desc = "The user's skin will randomly combust, but is generally alot more resilient to burning." + quality = NEGATIVE + text_gain_indication = "You feel hot." + text_lose_indication = "You feel a lot cooler." + difficulty = 14 + synchronizer_coeff = 1 + power_coeff = 1 + +/datum/mutation/human/fire/on_life(mob/living/carbon/human/owner) + if(prob((1+(100-dna.stability)/10)) * GET_MUTATION_SYNCHRONIZER(src)) + owner.adjust_fire_stacks(2 * GET_MUTATION_POWER(src)) + owner.IgniteMob() + +/datum/mutation/human/fire/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.physiology.burn_mod *= 0.5 + +/datum/mutation/human/fire/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.physiology.burn_mod *= 2 + +/datum/mutation/human/insulated + name = "Insulated" + desc = "The affected person does not conduct electricity." + quality = POSITIVE + text_gain_indication = "Your fingertips go numb." + text_lose_indication = "Your fingertips regain feeling." + difficulty = 16 + instability = 25 + +/datum/mutation/human/insulated/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "genetics") + +/datum/mutation/human/insulated/on_losing(mob/living/carbon/human/owner) + if(..()) + return + REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "genetics") + +/datum/mutation/human/paranoia + name = "Paranoia" + desc = "Subject is easily terrified, and may suffer from hallucinations." + quality = NEGATIVE + text_gain_indication = "You feel screams echo through your mind..." + text_lose_indication = "The screaming in your mind fades." + +/datum/mutation/human/paranoia/on_life(mob/living/carbon/human/owner) + if(prob(5) && owner.stat == CONSCIOUS) + owner.emote("scream") + owner.jitteriness = min(max(0, owner.jitteriness + 5), 30) + if(prob(25)) + to_chat(owner,"You feel someone creeping in on you...") + owner.hallucination += 20 \ No newline at end of file diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm index da105109..7682351e 100644 --- a/code/datums/mutations/chameleon.dm +++ b/code/datums/mutations/chameleon.dm @@ -1,12 +1,13 @@ //Chameleon causes the owner to slowly become transparent when not moving. /datum/mutation/human/chameleon name = "Chameleon" + desc = "A genome that causes the holder's skin to become transparent over time." quality = POSITIVE - get_chance = 20 - lowest_value = 256 * 12 + difficulty = 16 text_gain_indication = "You feel one with your surroundings." text_lose_indication = "You feel oddly exposed." time_coeff = 5 + instability = 25 /datum/mutation/human/chameleon/on_acquiring(mob/living/carbon/human/owner) if(..()) diff --git a/code/datums/mutations/cold_resistance.dm b/code/datums/mutations/cold_resistance.dm index 3d8fbaba..4b6beb7b 100644 --- a/code/datums/mutations/cold_resistance.dm +++ b/code/datums/mutations/cold_resistance.dm @@ -1,32 +1,29 @@ //Cold Resistance gives your entire body an orange halo, and makes you immune to the effects of vacuum and cold. -/datum/mutation/human/cold_resistance - name = "Cold Resistance" +/datum/mutation/human/space_adaptation + name = "Space Adaptation" + desc = "A strange mutation that renders the host immune to the vacuum if space. Will still need an oxygen supply." quality = POSITIVE - get_chance = 25 - lowest_value = 256 * 12 + difficulty = 16 text_gain_indication = "Your body feels warm!" time_coeff = 5 + instability = 30 -/datum/mutation/human/cold_resistance/New() +/datum/mutation/human/space_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() - visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER) + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)) -/datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) - return visual_indicators[1] +/datum/mutation/human/space_adaptation/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[type][1] -/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner) +/datum/mutation/human/space_adaptation/on_acquiring(mob/living/carbon/human/owner) if(..()) return ADD_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance") -// ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE + ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") -/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner) +/datum/mutation/human/space_adaptation/on_losing(mob/living/carbon/human/owner) if(..()) return REMOVE_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance") -// REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE - -/datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner) - if(owner.getFireLoss()) - if(prob(1)) - owner.heal_bodypart_damage(0,1) //Is this really needed? + REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") diff --git a/code/datums/mutations/combined.dm b/code/datums/mutations/combined.dm new file mode 100644 index 00000000..c166b013 --- /dev/null +++ b/code/datums/mutations/combined.dm @@ -0,0 +1,24 @@ +/datum/generecipe + var/required = "" //it hurts so bad but initial is not compatible with lists + var/result = null + +/proc/get_mixed_mutation(mutation1, mutation2) + if(!mutation1 || !mutation2) + return FALSE + if(mutation1 == mutation2) //this could otherwise be bad + return FALSE + for(var/A in GLOB.mutation_recipes) + if(findtext(A, "[mutation1]") && findtext(A, "[mutation2]")) + return GLOB.mutation_recipes[A] + +/datum/generecipe/x_ray + required = "/datum/mutation/human/thermal; /datum/mutation/human/radioactive" + result = /datum/mutation/human/thermal/x_ray + +/datum/generecipe/shock + required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive" + result = SHOCKTOUCH + +/datum/generecipe/mindread + required = "/datum/mutation/human/antenna; /datum/mutation/human/paranoia" + result = MINDREAD \ No newline at end of file diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 85cecca4..b6987959 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -1,12 +1,15 @@ //Hulk turns your skin green, and allows you to punch through walls. /datum/mutation/human/hulk name = "Hulk" + desc = "A poorly understood genome that causes the holder's muscles to expand, inhibit speech and gives the person a bad skin condition." quality = POSITIVE - get_chance = 15 - lowest_value = 256 * 12 + locked = TRUE + difficulty = 16 text_gain_indication = "Your muscles hurt!" species_allowed = list("human") //no skeleton/lizard hulk health_req = 25 + instability = 40 + locked = TRUE /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -17,11 +20,11 @@ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech) -/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) +/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity) if(proximity) //no telekinetic hulk attack return target.attack_hulk(owner) -/datum/mutation/human/hulk/on_life(mob/living/carbon/human/owner) +/datum/mutation/human/hulk/on_life() if(owner.health < 0) on_losing(owner) to_chat(owner, "You suddenly feel very weak.") diff --git a/code/datums/mutations/radioactive.dm b/code/datums/mutations/radioactive.dm new file mode 100644 index 00000000..88b276a8 --- /dev/null +++ b/code/datums/mutations/radioactive.dm @@ -0,0 +1,19 @@ +/datum/mutation/human/radioactive + name = "Radioactivity" + desc = "A volatile mutation that causes the host to sent out deadly beta radiation. This affects both the hosts and their surroundings." + quality = NEGATIVE + text_gain_indication = "You can feel it in your bones!" + time_coeff = 5 + instability = 5 + difficulty = 8 + +/datum/mutation/human/radioactive/on_life(mob/living/carbon/human/owner) + radiation_pulse(owner, 20) + +/datum/mutation/human/radioactive/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) + ..() + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "radiation", -MUTATIONS_LAYER)) + +/datum/mutation/human/radioactive/get_visual_indicator() + return visual_indicators[type][1] \ No newline at end of file diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 1f23a929..c8bc1a15 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -1,6 +1,7 @@ //Nearsightedness restricts your vision by several tiles. /datum/mutation/human/nearsight name = "Near Sightness" + desc = "The holder of this mutation has poor eyesight." quality = MINOR_NEGATIVE text_gain_indication = "You can't see very well." @@ -18,6 +19,7 @@ //Blind makes you blind. Who knew? /datum/mutation/human/blind name = "Blindness" + desc = "Renders the subject completely blind." quality = NEGATIVE text_gain_indication = "You can't seem to see anything." @@ -32,43 +34,58 @@ owner.cure_blind(GENETIC_MUTATION) -//X-ray Vision lets you see through walls. -/datum/mutation/human/x_ray - name = "X Ray Vision" +///Thermal Vision lets you see mobs through walls +/datum/mutation/human/thermal + name = "Thermal Vision" + desc = "The user of this genome can visually percieve the unique human thermal signature." quality = POSITIVE - get_chance = 25 - lowest_value = 256 * 12 - text_gain_indication = "The walls suddenly disappear!" + difficulty = 18 + text_gain_indication = "You can see the heat rising off of your skin..." time_coeff = 2 + instability = 25 + var/visionflag = TRAIT_THERMAL_VISION -/datum/mutation/human/x_ray/on_acquiring(mob/living/carbon/human/owner) +/datum/mutation/human/thermal/on_acquiring(mob/living/carbon/human/owner) if(..()) return + ADD_TRAIT(owner, visionflag, GENETIC_MUTATION) owner.update_sight() -/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) +/datum/mutation/human/thermal/on_losing(mob/living/carbon/human/owner) if(..()) return + REMOVE_TRAIT(owner, visionflag, GENETIC_MUTATION) owner.update_sight() +///X-ray Vision lets you see through walls. +/datum/mutation/human/thermal/x_ray + name = "X Ray Vision" + desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, wich might be fun for later //hmb + text_gain_indication = "The walls suddenly disappear!" + instability = 35 + locked = TRUE + visionflag = TRAIT_XRAY_VISION + //Laser Eyes lets you shoot lasers from your eyes! /datum/mutation/human/laser_eyes name = "Laser Eyes" + desc = "Reflects concentrated light back from the eyes." quality = POSITIVE - dna_block = NON_SCANNABLE + locked = TRUE + difficulty = 16 text_gain_indication = "You feel pressure building up behind your eyes." layer_used = FRONT_MUTATIONS_LAYER limb_req = BODY_ZONE_HEAD -/datum/mutation/human/laser_eyes/New() +/datum/mutation/human/laser_eyes/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER) -/datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner) +/datum/mutation/human/laser_eyes/get_visual_indicator() return visual_indicators[1] -/datum/mutation/human/laser_eyes/on_ranged_attack(mob/living/carbon/human/owner, atom/target, mouseparams) +/datum/mutation/human/laser_eyes/on_ranged_attack(atom/target, mouseparams) if(owner.a_intent == INTENT_HARM) owner.LaserEyes(target, mouseparams) diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index f02b7f18..5716b259 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -3,6 +3,7 @@ /datum/mutation/human/nervousness name = "Nervousness" + desc = "Causes the holder to stutter." quality = MINOR_NEGATIVE text_gain_indication = "You feel nervous." @@ -13,6 +14,7 @@ /datum/mutation/human/wacky name = "Wacky" + desc = "Unknown." quality = MINOR_NEGATIVE text_gain_indication = "You feel an off sensation in your voicebox." text_lose_indication = "The off sensation passes." @@ -34,6 +36,7 @@ /datum/mutation/human/mute name = "Mute" + desc = "Completely inhibits the vocal section of the brain." quality = NEGATIVE text_gain_indication = "You feel unable to express yourself at all." text_lose_indication = "You feel able to speak freely again." @@ -53,8 +56,8 @@ /datum/mutation/human/smile name = "Smile" + desc = "Causes the user to be in constant mania." quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)" text_lose_indication = "Everything is terrible again. :(" @@ -120,8 +123,8 @@ /datum/mutation/human/unintelligible name = "Unintelligible" + desc = "Partially inhibits the vocal center of the brain, severely distorting speech." quality = NEGATIVE - dna_block = NON_SCANNABLE text_gain_indication = "You can't seem to form any coherent thoughts!" text_lose_indication = "Your mind feels more clear." @@ -140,8 +143,9 @@ /datum/mutation/human/swedish name = "Swedish" + desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037." quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE + locked = TRUE text_gain_indication = "You feel Swedish, however that works." text_lose_indication = "The feeling of Swedishness passes." @@ -172,8 +176,8 @@ /datum/mutation/human/chav name = "Chav" + desc = "Unknown" quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE text_gain_indication = "Ye feel like a reet prat like, innit?" text_lose_indication = "You no longer feel like being rude and sassy." @@ -219,12 +223,13 @@ /datum/mutation/human/elvis name = "Elvis" + desc = "A terrifying mutation named after its 'patient-zero'." quality = MINOR_NEGATIVE - dna_block = NON_SCANNABLE + locked = TRUE text_gain_indication = "You feel pretty good, honeydoll." text_lose_indication = "You feel a little less conversation would be great." -/datum/mutation/human/elvis/on_life(mob/living/carbon/human/owner) +/datum/mutation/human/elvis/on_life() switch(pick(1,2)) if(1) if(prob(15)) @@ -265,8 +270,9 @@ /datum/mutation/human/stoner name = "Stoner" + desc = "A common mutation that severely decreases intelligence." quality = NEGATIVE - dna_block = NON_SCANNABLE + locked = TRUE text_gain_indication = "You feel...totally chill, man!" text_lose_indication = "You feel like you have a better sense of time." diff --git a/code/datums/mutations/telekinesis.dm b/code/datums/mutations/telekinesis.dm index a5b15eac..b03ac040 100644 --- a/code/datums/mutations/telekinesis.dm +++ b/code/datums/mutations/telekinesis.dm @@ -1,18 +1,20 @@ //Telekinesis lets you interact with objects from range, and gives you a light blue halo around your head. /datum/mutation/human/telekinesis name = "Telekinesis" + desc = "A strange mutation that allows the holder to interact with objects through thought." quality = POSITIVE - get_chance = 20 - lowest_value = 256 * 12 + difficulty = 18 text_gain_indication = "You feel smarter!" limb_req = BODY_ZONE_HEAD + instability = 30 -/datum/mutation/human/telekinesis/New() +/datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() - visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER) + if(!(type in visual_indicators)) + visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER)) /datum/mutation/human/telekinesis/get_visual_indicator(mob/living/carbon/human/owner) - return visual_indicators[1] + return visual_indicators[type][1] /datum/mutation/human/telekinesis/on_ranged_attack(mob/living/carbon/human/owner, atom/target) - target.attack_tk(owner) + target.attack_tk(owner) \ No newline at end of file diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index a470f814..c4a80c19 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -643,3 +643,26 @@ datum/status_effect/pacify addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10) addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it qdel(src) + +/datum/status_effect/dna_melt + id = "dna_melt" + duration = 600 + status_type = STATUS_EFFECT_REPLACE + alert_type = /obj/screen/alert/status_effect/dna_melt + var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now + +/datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove) + . = ..() + to_chat(new_owner, "My body can't handle the mutations! I need to get my mutations removed fast!") + +/datum/status_effect/dna_melt/on_remove() + if(!ishuman(owner)) + owner.gib() //fuck you in particular + return + var/mob/living/carbon/human/H = owner + H.something_horrible(kill_either_way) + +/obj/screen/alert/status_effect/dna_melt + name = "Genetic Breakdown" + desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." + icon_state = "dna_melt" \ No newline at end of file diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index f3b81180..d0fff8da 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -38,9 +38,9 @@ H.randmuti() if(prob(50)) if(prob(90)) - H.randmutb() + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) else - H.randmutg() + H.easy_randmut(POSITIVE) H.domutcheck() L.rad_act(20) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index cc796fdc..5b7eff2b 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -80,6 +80,8 @@ name = "cloning data disk" icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. var/list/fields = list() + var/list/mutations = list() + var/max_mutations = 6 var/read_only = 0 //Well,it's still a floppy disk //Disk stuff. @@ -127,7 +129,7 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/quirks) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks) if(panel_open) return FALSE if(mess || attempting) @@ -161,10 +163,10 @@ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) - H.hardset_dna(ui, se, H.real_name, null, mrace, features) + H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features) if(prob(50 - efficiency*10)) //Chance to give a bad mutation. - H.randmutb() //100% bad mutation. Can be cured with mutadone. + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone. H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. occupant = H diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 47556c09..eceb6042 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -486,7 +486,7 @@ R.fields["id"] = copytext(md5(mob_occupant.real_name), 2, 6) R.fields["UE"] = dna.unique_enzymes R.fields["UI"] = dna.uni_identity - R.fields["SE"] = dna.struc_enzymes + R.fields["SE"] = dna.mutation_index R.fields["blood_type"] = dna.blood_type R.fields["features"] = dna.features R.fields["factions"] = mob_occupant.faction diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9d495743..59c96299 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -1,14 +1,16 @@ #define INJECTOR_TIMEOUT 100 -#define REJUVENATORS_INJECT 15 -#define REJUVENATORS_MAX 90 #define NUMBER_OF_BUFFERS 3 +#define SCRAMBLE_TIMEOUT 600 +#define JOKER_TIMEOUT 12000 //20 minutes +#define JOKER_UPGRADE 1800 #define RADIATION_STRENGTH_MAX 15 -#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has a more range +#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has more range #define RADIATION_DURATION_MAX 30 #define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate + #define RADIATION_IRRADIATION_MULTIPLIER 1 //multiplier for how much radiation a test subject receives #define SCANNER_ACTION_SE 1 @@ -23,22 +25,33 @@ icon_keyboard = "med_key" density = TRUE circuit = /obj/item/circuitboard/computer/scan_consolenew - var/radduration = 2 - var/radstrength = 1 - var/list/buffer[NUMBER_OF_BUFFERS] - - var/injectorready = 0 //world timer cooldown var - var/current_screen = "mainmenu" - var/obj/machinery/dna_scannernew/connected = null - var/obj/item/disk/data/diskette = null - var/list/delayed_action = null use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 400 - light_color = LIGHT_COLOR_BLUE + var/datum/techweb/stored_research + var/max_storage = 6 + var/combine + var/radduration = 2 + var/radstrength = 1 + var/max_chromosomes = 6 + + var/list/buffer[NUMBER_OF_BUFFERS] + var/list/stored_mutations = list() + var/list/stored_chromosomes = list() + + var/injectorready = 0 //world timer cooldown var + var/jokerready = 0 + var/scrambleready = 0 + var/current_screen = "mainmenu" + var/current_mutation //what block are we inspecting? only used when screen = "info" + var/current_storage //what storage block are we looking at? + var/obj/machinery/dna_scannernew/connected = null + var/obj/item/disk/data/diskette = null + var/list/delayed_action = null + /obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) if (istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES if (!src.diskette) @@ -48,6 +61,28 @@ to_chat(user, "You insert [I].") src.updateUsrDialog() return + if (istype(I, /obj/item/chromosome)) + if(LAZYLEN(stored_chromosomes) < max_chromosomes) + I.forceMove(src) + stored_chromosomes += I + to_chat(user, "You insert [I].") + else + to_chat(user, "You cannot store any more chromosomes!") + return + if(istype(I, /obj/item/dnainjector/activator)) + var/obj/item/dnainjector/activator/A = I + if(A.used) + to_chat(user,"Recycled [I].") + if(A.research) + var/c_typepath = generate_chromosome() + var/obj/item/chromosome/CM = new c_typepath (drop_location()) + to_chat(user,"Recycled [I].") + if((LAZYLEN(stored_chromosomes) < max_chromosomes) && prob(60)) + CM.forceMove(src) + stored_chromosomes += CM + to_chat(user,"[capitalize(CM.name)] added to storage.") + qdel(I) + return else return ..() @@ -58,12 +93,26 @@ if(!isnull(connected)) break injectorready = world.time + INJECTOR_TIMEOUT + scrambleready = world.time + SCRAMBLE_TIMEOUT + jokerready = world.time + JOKER_TIMEOUT + + stored_research = SSresearch.science_tech + +/obj/machinery/computer/scan_consolenew/examine(mob/user) + ..() + if(jokerready < world.time) + to_chat(user, "JOKER algorithm available.") + else + to_chat(user, "JOKER algorithm available in about [round(0.00166666667 * (jokerready - world.time))] minutes.") /obj/machinery/computer/scan_consolenew/ui_interact(mob/user, last_change) . = ..() if(!user) return var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window + if(user.client) + var/datum/asset/simple/assets = get_asset_datum(/datum/asset/simple/genetics) + assets.send(user.client) if(!(in_range(src, user) || issilicon(user))) popup.close() return @@ -88,8 +137,6 @@ occupant_status += "" occupant_status += "
Health:
[viable_occupant.health] %
" occupant_status += "
Radiation Level:
[viable_occupant.radiation/(RAD_MOB_SAFE/100)] %
" - var/rejuvenators = viable_occupant.reagents.get_reagent_amount("potass_iodide") - occupant_status += "
Rejuvenators:
[rejuvenators] units
" occupant_status += "
Unique Enzymes :
[viable_occupant.dna.unique_enzymes]
" occupant_status += "
Last Operation:
[last_change ? last_change : "----"]
" else @@ -147,28 +194,53 @@ buttons += "[connected.locked ? "Unlock" : "Lock"] Scanner" else buttons += "Open Scanner Lock Scanner" - if(viable_occupant) - buttons += "Inject Rejuvenators" + if(viable_occupant && (scrambleready < world.time)) + buttons += "Scramble DNA" else - buttons += "Inject Rejuvenators" + buttons += "Scramble DNA" if(diskette) - buttons += "Eject Disk" + buttons += "Disk" else - buttons += "Eject Disk" - if(current_screen == "buffer") - buttons += "Radiation Emitter Menu" + buttons += "Disk" + if(current_screen == "mutations") + buttons += "Mutations" else - buttons += "Buffer Menu" + buttons += "Mutations" + if((current_screen == "mainmenu") || !current_screen) + buttons += "Genetic Sequencer" + else + buttons += "Genetic Sequencer" + if(current_screen == "ui") + buttons += "Unique Identifiers" + else + buttons += "Unique Identifiers" switch(current_screen) if("working") temp_html += status temp_html += "

System Busy

" temp_html += "Working ... Please wait ([DisplayTimeText(radduration*10)])" - if("buffer") + if("ui") temp_html += status temp_html += buttons - temp_html += "

Buffer Menu

" + temp_html += "

Unique Identifiers

" + temp_html += "-- Output Level ++" + temp_html += "
-- Pulse Duration ++" + temp_html += "

Irradiate Subject

" + temp_html += "
Unique Identifier:
" + var/max_line_len = 7*DNA_BLOCK_SIZE + if(viable_occupant) + temp_html += "
1
" + var/len = length(viable_occupant.dna.uni_identity) + for(var/i=1, i<=len, i++) + temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" + if ((i % max_line_len) == 0) + temp_html += "
" + if((i % DNA_BLOCK_SIZE) == 0 && i < len) + temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" + else + temp_html += "---------" + temp_html += "

Buffer Menu

" if(istype(buffer)) for(var/i=1, i<=buffer.len, i++) @@ -188,7 +260,6 @@ temp_html += "Save to Disk" else var/ui = buffer_slot["UI"] - var/se = buffer_slot["SE"] var/ue = buffer_slot["UE"] var/name = buffer_slot["name"] var/label = buffer_slot["label"] @@ -234,19 +305,6 @@ temp_html += "UI+UE Injector" else temp_html += "UI+UE Injector" - if(se) - temp_html += "
\tSE: [se] " - if(viable_occupant) - temp_html += "Occupant" - else - temp_html += "Occupant" - temp_html += "Occupant:Delayed" - if(injectorready < world.time ) - temp_html += "Injector" - else - temp_html += "Injector" - else - temp_html += "
\tSE: No Data" if(viable_occupant) temp_html += "
Save to Buffer" else @@ -260,48 +318,197 @@ temp_html += "Save to Disk" else temp_html += "Save to Disk" + if("disk") + temp_html += status + temp_html += buttons + if(diskette) + temp_html += "

[diskette.name]


" + temp_html += "Eject Disk
" + if(LAZYLEN(diskette.mutations)) + temp_html += "" + for(var/datum/mutation/human/A in diskette.mutations) + temp_html += "" + temp_html += "" + if(LAZYLEN(stored_mutations) < max_storage) + temp_html += "" + else + temp_html += "" + temp_html += "" + temp_html += "
[A.name]DeleteImportImport
" + else + temp_html += "
Load diskette to start ----------" + if("info") + if(LAZYLEN(stored_mutations)) + if(LAZYLEN(stored_mutations) >= current_storage) + var/datum/mutation/human/HM = stored_mutations[current_storage] + if(HM) + temp_html += display_sequence(HM.type, current_storage) + else + current_screen = "mainmenu" + if("mutations") + temp_html += status + temp_html += buttons + temp_html += "

Mutation Storage:

" + temp_html += "" + for(var/datum/mutation/human/HM in stored_mutations) + var/i = stored_mutations.Find(HM) + temp_html += "" + temp_html += "" + temp_html += "" + if(combine == HM.type) + temp_html += "" + else + temp_html += "" + temp_html += "
[HM.name]ExportDeleteCombine
Combine

" + temp_html += "

Chromosome Storage:

" + temp_html += "" + for(var/i in 1 to stored_chromosomes.len) + var/obj/item/chromosome/CM = stored_chromosomes[i] + temp_html += "
" + temp_html += "
[CM.name]
" else temp_html += status temp_html += buttons - temp_html += "

Radiation Emitter Menu

" - - temp_html += "-- Output Level ++" - temp_html += "
-- Pulse Duration ++" - - temp_html += "

Irradiate Subject

" - temp_html += "
Unique Identifier:
" - - var/max_line_len = 7*DNA_BLOCK_SIZE + temp_html += "
Genetic Sequence:

" if(viable_occupant) - temp_html += "
1
" - var/len = length(viable_occupant.dna.uni_identity) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" - if ((i % max_line_len) == 0) - temp_html += "
" - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" + if(viable_occupant) + for(var/A in get_mutation_list()) + temp_html += display_inactive_sequence(A) + temp_html += "
" + else + temp_html += "----" + if(viable_occupant && (current_mutation in get_mutation_list(viable_occupant))) + temp_html += display_sequence(current_mutation) + temp_html += "

" else - temp_html += "----" - temp_html += "

" - - temp_html += "
Structural Enzymes:
" - if(viable_occupant) - temp_html += "
1
" - var/len = length(viable_occupant.dna.struc_enzymes) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]" - if ((i % max_line_len) == 0) - temp_html += "
" - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
[(i / DNA_BLOCK_SIZE) + 1]
" - else - temp_html += "----" - temp_html += "
" + temp_html += "----------" popup.set_content(temp_html.Join()) popup.open() +/obj/machinery/computer/scan_consolenew/proc/display_inactive_sequence(mutation) + var/temp_html = "" + var/class = "unselected" + var/mob/living/carbon/viable_occupant = get_viable_occupant() + if(!viable_occupant) + return + + var/location = viable_occupant.dna.mutation_index.Find(mutation) //We do this because we dont want people using sysexp or similair tools to just read the mutations. + + if(!location) //Do this only when needed, dont make a list with mutations for every iteration if you dont need to + var/list/mutations = get_mutation_list(TRUE) + if(mutation in mutations) + location = mutations.Find(mutation) + if(mutation == current_mutation) + class = "selected" + if(location > DNA_MUTATION_BLOCKS) + temp_html += "Extra Mutation" + else if(mutation in stored_research.discovered_mutations) + temp_html += "Discovered Mutation" + else + temp_html += "Undiscovered" + return temp_html + +/obj/machinery/computer/scan_consolenew/proc/display_sequence(mutation, storage_slot) //Storage slot is for when viewing from the stored mutations + var/temp_html = "" + if(!mutation) + temp_html += "ERR-" + return + var/mut_name = "Unknown gene" + var/mut_desc = "No information available." + var/alias + var/discovered = FALSE + var/active = FALSE + var/scrambled = FALSE + var/instability + var/mob/living/carbon/viable_occupant = get_viable_occupant() + var/datum/mutation/human/HM = get_valid_mutation(mutation) + + if(viable_occupant) + var/datum/mutation/human/M = viable_occupant.dna.get_mutation(mutation) + if(M) + scrambled = M.scrambled + active = TRUE + var/datum/mutation/human/A = GET_INITIALIZED_MUTATION(mutation) + alias = A.alias + if(active && !scrambled) + discover(mutation) + if(stored_research && (mutation in stored_research.discovered_mutations)) + mut_name = A.name + mut_desc = A.desc + discovered = TRUE + instability = A.instability + var/extra + if(viable_occupant && !(storage_slot || viable_occupant.dna.mutation_in_sequence(mutation))) + extra = TRUE + + if(discovered && !scrambled) + var/mutcolor + switch(A.quality) + if(POSITIVE) + mutcolor = "good" + if(MINOR_NEGATIVE) + mutcolor = "average" + if(NEGATIVE) + mutcolor = "bad" + if(HM) + instability *= GET_MUTATION_STABILIZER(HM) + temp_html += "
[mut_name] ([alias])
" + temp_html += "
Instability : [round(instability)]
" + else + temp_html += "
[alias]
" + temp_html += "
[mut_desc]
" + if(active && !storage_slot) + if(HM?.can_chromosome && (HM in viable_occupant.dna.mutations)) + var/i = viable_occupant.dna.mutations.Find(HM) + var/chromosome_name = "----" + if(HM.chromosome_name) + chromosome_name = HM.chromosome_name + temp_html += "
Chromosome status: [chromosome_name]
" + temp_html += "
Sequence:

" + if(!scrambled) + for(var/block in 1 to A.blocks) + var/whole_sequence = get_valid_gene_string(mutation) + var/sequence = copytext(whole_sequence, 1+(block-1)*(DNA_SEQUENCE_LENGTH*2),(DNA_SEQUENCE_LENGTH*2*block+1)) + temp_html += "
" + for(var/i in 1 to DNA_SEQUENCE_LENGTH) + var/num = 1+(i-1)*2 + var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) + temp_html += "" + temp_html += "" + for(var/i in 1 to DNA_SEQUENCE_LENGTH) + temp_html += "" + temp_html += "" + for(var/i in 1 to DNA_SEQUENCE_LENGTH) + var/num = i*2 + var/genenum = num+(DNA_SEQUENCE_LENGTH*2*(block-1)) + temp_html += "" + temp_html += "
|
" + temp_html += "




" + else + temp_html = "
Sequence unreadable due to unpredictable mutation.
" + if((active || storage_slot) && (injectorready < world.time) && !scrambled) + temp_html += "Print Activator" + temp_html += "Print Mutator" + else + temp_html += "Print Activator" + temp_html += "Print Mutator" + temp_html += "
" + if(storage_slot) + temp_html += "Delete" + if((LAZYLEN(stored_mutations) < max_storage) && diskette && !diskette.read_only) + temp_html += "Export" + else + temp_html += "Export" + temp_html += "Back" + else if(active && !scrambled) + temp_html += "Store" + if(extra || scrambled) + temp_html += "Nullify" + else + temp_html += "Nullify" + temp_html += "
" + return temp_html /obj/machinery/computer/scan_consolenew/Topic(href, href_list) if(..()) @@ -340,13 +547,16 @@ radstrength = WRAP(num, 1, RADIATION_STRENGTH_MAX+1) if("screen") current_screen = href_list["text"] - if("rejuv") - if(viable_occupant && viable_occupant.reagents) - var/potassiodide_amount = viable_occupant.reagents.get_reagent_amount("potass_iodide") - var/can_add = max(min(REJUVENATORS_MAX - potassiodide_amount, REJUVENATORS_INJECT), 0) - viable_occupant.reagents.add_reagent("potass_iodide", can_add) + if("scramble") + if(viable_occupant && (scrambleready < world.time)) + viable_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA)) + viable_occupant.dna.generate_dna_blocks() + scrambleready = world.time + SCRAMBLE_TIMEOUT + to_chat(usr,"DNA scrambled.") + viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER*50/(connected.damage_coeff ** 2) + if("setbufferlabel") - var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) + var/text = sanitize(input(usr, "Input a new label:", "Input a Text", null) as text|null) if(num && text) num = CLAMP(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] @@ -358,7 +568,6 @@ buffer[num] = list( "label"="Buffer[num]:[viable_occupant.real_name]", "UI"=viable_occupant.dna.uni_identity, - "SE"=viable_occupant.dna.struc_enzymes, "UE"=viable_occupant.dna.unique_enzymes, "name"=viable_occupant.real_name, "blood_type"=viable_occupant.dna.blood_type @@ -372,8 +581,6 @@ if("transferbuffer") if(num && viable_occupant) switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove - if("se") - apply_buffer(SCANNER_ACTION_SE,num) if("ui") apply_buffer(SCANNER_ACTION_UI,num) if("ue") @@ -387,28 +594,6 @@ if(istype(buffer_slot)) var/obj/item/dnainjector/timed/I switch(href_list["text"]) - if("se") - if(buffer_slot["SE"]) - I = new /obj/item/dnainjector/timed(loc) - var/powers = 0 - for(var/datum/mutation/human/HM in GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations) - if(HM.check_block_string(buffer_slot["SE"])) - I.add_mutations.Add(HM) - if(HM in GLOB.good_mutations) - powers += 1 - if(HM in GLOB.bad_mutations + GLOB.not_good_mutations) - powers -= 1 //To prevent just unlocking everything to get all powers to a syringe for max tech - else - I.remove_mutations.Add(HM) - var/time_coeff - for(var/datum/mutation/human/HM in I.add_mutations) - if(!time_coeff) - time_coeff = HM.time_coeff - continue - time_coeff = min(time_coeff,HM.time_coeff) - if(connected) - I.duration = I.duration * time_coeff * connected.damage_coeff - I.damage_coeff = connected.damage_coeff if("ui") if(buffer_slot["UI"]) I = new /obj/item/dnainjector/timed(loc) @@ -447,7 +632,7 @@ if("setdelayed") if(num) delayed_action = list("action"=text2num(href_list["delayaction"]),"buffer"=num) - if("pulseui","pulsese") + if("pulseui") if(num && viable_occupant && connected) radduration = WRAP(radduration, 1, RADIATION_DURATION_MAX+1) radstrength = WRAP(radstrength, 1, RADIATION_STRENGTH_MAX+1) @@ -459,7 +644,7 @@ ui_interact(usr) sleep(radduration*10) - current_screen = "mainmenu" + current_screen = "ui" if(viable_occupant && connected && connected.occupant==viable_occupant) viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation @@ -480,35 +665,173 @@ viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0) viable_occupant.updateappearance(mutations_overlay_update=1) - if("pulsese") - var/len = length(viable_occupant.dna.struc_enzymes) - num = WRAP(num, 1, len+1) - num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) - - var/block = round((num-1)/DNA_BLOCK_SIZE)+1 - var/subblock = num - block*DNA_BLOCK_SIZE - last_change = "SE #[block]-[subblock]; " - - var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1) - last_change += "[hex]" - hex = scramble(hex, radstrength, radduration) - last_change += "->[hex]" - - viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) - viable_occupant.domutcheck() else current_screen = "mainmenu" if(connected) connected.locked = locked_state + if("inspect") + if(viable_occupant) + var/list/mutations = get_mutation_list(TRUE) + if(current_mutation == mutations[num]) + current_mutation = null + else + current_mutation = mutations[num] + + if("inspectstorage") + current_storage = num + current_screen = "info" + if("savemut") + if(viable_occupant) + var/succes + if(LAZYLEN(stored_mutations) < max_storage) + var/mutation = text2path(href_list["path"]) + if(ispath(mutation, /datum/mutation/human)) //sanity checks + var/datum/mutation/human/HM = viable_occupant.dna.get_mutation(mutation) + if(HM) + var/datum/mutation/human/A = new HM.type() + A.copy_mutation(HM) + succes = TRUE + stored_mutations += A + to_chat(usr,"Mutation succesfully stored.") + if(!succes) //we can exactly return here + to_chat(usr,"Mutation storage is full.") + if("deletemut") + var/datum/mutation/human/HM = stored_mutations[num] + if(HM) + stored_mutations.Remove(HM) + qdel(HM) + current_screen = "mutations" + if("activator") + if(injectorready < world.time) + var/mutation = text2path(href_list["path"]) + if(ispath(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = get_valid_mutation(mutation) + if(HM) + var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) + I.add_mutations += new HM.type (copymut = HM) + I.name = "[HM.name] activator" + I.research = TRUE + if(connected) + I.damage_coeff = connected.damage_coeff*4 + injectorready = world.time + INJECTOR_TIMEOUT * (1 - 0.1 * connected.precision_coeff) //precision_coeff being the matter bin rating + else + injectorready = world.time + INJECTOR_TIMEOUT + if("mutator") + if(injectorready < world.time) + var/mutation = text2path(href_list["path"]) + if(ispath(mutation, /datum/mutation/human)) + var/datum/mutation/human/HM = get_valid_mutation(mutation) + if(HM) + var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) + I.add_mutations += new HM.type (copymut = HM) + I.doitanyway = TRUE + I.name = "[HM.name] injector" + if(connected) + I.damage_coeff = connected.damage_coeff + injectorready = world.time + INJECTOR_TIMEOUT * 5 * (1 - 0.1 * connected.precision_coeff) + else + injectorready = world.time + INJECTOR_TIMEOUT * 5 + if("nullify") + if(viable_occupant) + var/datum/mutation/human/A = viable_occupant.dna.get_mutation(current_mutation) + if(A && (!viable_occupant.dna.mutation_in_sequence(current_mutation) || A.scrambled)) + viable_occupant.dna.remove_mutation(current_mutation) + current_screen = "mainmenu" + current_mutation = null + if("pulsegene") + if(current_screen != "info") + var/path = text2path(href_list["path"]) + if(viable_occupant && num && (path in viable_occupant.dna.mutation_index)) + var/list/genes = list("A","T","G","C","X") + if(jokerready < world.time) + genes += "JOKER" + var/sequence = GET_GENE_STRING(path, viable_occupant.dna) + var/original = sequence[num] + var/new_gene = input("From [original] to-", "New block", original) as null|anything in genes + if(!new_gene) + new_gene = original + if(viable_occupant == get_viable_occupant()) //No cheesing + if((new_gene == "JOKER") && (jokerready < world.time)) + var/true_genes = GET_SEQUENCE(current_mutation) + new_gene = true_genes[num] + jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected.precision_coeff-1)) + sequence = copytext(sequence, 1, num) + new_gene + copytext(sequence, num+1, length(sequence)+1) + viable_occupant.dna.mutation_index[path] = sequence + viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected.damage_coeff + viable_occupant.domutcheck() + if("exportdiskmut") + if(diskette && !diskette.read_only) + var/path = text2path(href_list["path"]) + if(ispath(path, /datum/mutation/human)) + var/datum/mutation/human/A = get_valid_mutation(path) + if(A && diskette && (LAZYLEN(diskette.mutations) < diskette.max_mutations)) + var/datum/mutation/human/HM = new A.type() + diskette.mutations += HM + HM.copy_mutation(A) + to_chat(usr, "Succesfully written [A.name] to [diskette.name].") + if("deletediskmut") + if(diskette && !diskette.read_only) + if(num && (LAZYLEN(diskette.mutations) >= num)) + var/datum/mutation/human/A = diskette.mutations[num] + diskette.mutations.Remove(A) + qdel(A) + if("importdiskmut") + if(diskette && (LAZYLEN(diskette.mutations) >= num)) + if(LAZYLEN(stored_mutations) < max_storage) + var/datum/mutation/human/A = diskette.mutations[num] + var/datum/mutation/human/HM = new A.type() + HM.copy_mutation(A) + stored_mutations += HM + to_chat(usr,"Succesfully written [A.name] to storage.") + if("combine") + if(num && (LAZYLEN(stored_mutations) >= num)) + if(LAZYLEN(stored_mutations) < max_storage) + var/datum/mutation/human/A = stored_mutations[num] + var/path = A.type + if(combine) + var/result_path = get_mixed_mutation(combine, path) + if(result_path) + stored_mutations += new result_path() + to_chat(usr, "Succes! New mutation has been added to storage") + discover(result_path) + combine = null + else + to_chat(usr, "Failed. No mutation could be created.") + combine = null + else + combine = path + to_chat(usr,"Selected [A.name] for combining") + else + to_chat(usr, "Not enough space to store potential mutation.") + if("ejectchromosome") + if(LAZYLEN(stored_chromosomes) <= num) + var/obj/item/chromosome/CM = stored_chromosomes[num] + CM.forceMove(drop_location()) + adjust_item_drop_location(CM) + stored_chromosomes -= CM + if("applychromosome") + if(viable_occupant && (LAZYLEN(viable_occupant.dna.mutations) <= num)) + var/datum/mutation/human/HM = viable_occupant.dna.mutations[num] + var/list/chromosomes = list() + for(var/obj/item/chromosome/CM in stored_chromosomes) + if(CM.can_apply(HM)) + chromosomes += CM + if(chromosomes.len) + var/obj/item/chromosome/CM = input("Select a chromosome to apply", "Apply Chromosome") as null|anything in sortNames(chromosomes) + if(CM) + to_chat(usr, "You apply [CM] to [HM.name].") + stored_chromosomes -= CM + CM.apply(HM) + ui_interact(usr,last_change) -/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) +/obj/machinery/computer/scan_consolenew/proc/scramble(input,rs,rd) //hexadecimal genetics. dont confuse with scramble button var/length = length(input) var/ran = gaussian(0, rs*RADIATION_STRENGTH_MULTIPLIER) if(ran == 0) - ran = pick(-1,1) //hacky, statistically should almost never happen. 0-change makes people mad though + ran = pick(-1,1) //hacky, statistically should almost never happen. 0-chance makes people mad though else if(ran < 0) ran = round(ran) //negative, so floor it else @@ -537,10 +860,6 @@ //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3 //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove switch(action) - if(SCANNER_ACTION_SE) - if(buffer_slot["SE"]) - viable_occupant.dna.struc_enzymes = buffer_slot["SE"] - viable_occupant.domutcheck() if(SCANNER_ACTION_UI) if(buffer_slot["UI"]) viable_occupant.dna.uni_identity = buffer_slot["UI"] @@ -562,15 +881,54 @@ viable_occupant.dna.blood_type = buffer_slot["blood_type"] /obj/machinery/computer/scan_consolenew/proc/on_scanner_close() - if(delayed_action && connected) + if(delayed_action && get_viable_occupant()) to_chat(connected.occupant, "[src] activates!") apply_buffer(delayed_action["action"],delayed_action["buffer"]) delayed_action = null //or make it stick + reset button ? +/obj/machinery/computer/scan_consolenew/proc/get_valid_mutation(mutation) + var/mob/living/carbon/C = get_viable_occupant() + if(C) + var/datum/mutation/human/HM = C.dna.get_mutation(mutation) + if(HM) + return HM + for(var/datum/mutation/human/A in stored_mutations) + if(A.type == mutation) + return A + + +/obj/machinery/computer/scan_consolenew/proc/get_mutation_list(include_storage) //Returns a list of the mutation index types and any extra mutations + var/mob/living/carbon/viable_occupant = get_viable_occupant() + var/list/paths = list() + if(viable_occupant) + for(var/A in viable_occupant.dna.mutation_index) + paths += A + for(var/datum/mutation/human/A in viable_occupant.dna.mutations) + if(A.class == MUT_EXTRA) + paths += A.type + if(include_storage) + for(var/datum/mutation/human/A in stored_mutations) + paths += A.type + return paths + +/obj/machinery/computer/scan_consolenew/proc/get_valid_gene_string(mutation) + var/mob/living/carbon/C = get_viable_occupant() + if(C && (mutation in C.dna.mutation_index)) + return GET_GENE_STRING(mutation, C.dna) + else if(C && (LAZYLEN(C.dna.mutations))) + for(var/datum/mutation/human/A in C.dna.mutations) + if(A.type == mutation) + return GET_SEQUENCE(mutation) + for(var/datum/mutation/human/A in stored_mutations) + if(A.type == mutation) + return GET_SEQUENCE(mutation) + +/obj/machinery/computer/scan_consolenew/proc/discover(mutation) + if(stored_research && !(mutation in stored_research.discovered_mutations)) + stored_research.discovered_mutations += mutation + return TRUE /////////////////////////// DNA MACHINES #undef INJECTOR_TIMEOUT -#undef REJUVENATORS_INJECT -#undef REJUVENATORS_MAX #undef NUMBER_OF_BUFFERS #undef RADIATION_STRENGTH_MAX diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm index e8364d22..ffe66e68 100644 --- a/code/game/machinery/exp_cloner.dm +++ b/code/game/machinery/exp_cloner.dm @@ -26,9 +26,9 @@ var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) H.dna.remove_mutation_group(unclean_mutations) if(efficiency > 5 && prob(20)) - H.randmutvg() + H.easy_randmut(POSITIVE) if(efficiency < 3 && prob(50)) - var/mob/M = H.randmutb() + var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) if(ismob(M)) H = M @@ -292,6 +292,6 @@ temp = "Cloning cycle already in progress." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) else - pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.struc_enzymes, clone_species, dna.features, mob_occupant.faction) + pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, clone_species, dna.features, mob_occupant.faction) temp = "[mob_occupant.real_name] => Cloning data sent to pod." playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index a8ba9850..56bd36a0 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -284,12 +284,12 @@ if(equip_ready) //disabled return var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) + var/pow_chan = GET_MUTATION_POWER_channel(A) if(pow_chan) return 1000 //making magic -/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_power_channel(var/area/A) +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/GET_MUTATION_POWER_channel(var/area/A) var/pow_chan if(A) for(var/c in use_channels) diff --git a/code/game/objects/items/chromosome.dm b/code/game/objects/items/chromosome.dm new file mode 100644 index 00000000..01c22bb4 --- /dev/null +++ b/code/game/objects/items/chromosome.dm @@ -0,0 +1,92 @@ +/obj/item/chromosome + name = "blank chromosome" + icon = 'icons/obj/chromosomes.dmi' + icon_state = "" + desc = "A tube holding chromosomic data." + force = 0 + w_class = WEIGHT_CLASS_SMALL + + var/stabilizer_coeff = 1 //lower is better, affects genetic stability + var/synchronizer_coeff = 1 //lower is better, affects chance to backfire + var/power_coeff = 1 //higher is better, affects "strength" + var/energy_coeff = 1 //lower is better. affects recharge time + + var/weight = 5 + +/obj/item/chromosome/proc/can_apply(datum/mutation/human/HM) + if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE)) + return FALSE + if((stabilizer_coeff != 1) && (HM.stabilizer_coeff != -1)) //if the chromosome is 1, we dont change anything. If the mutation is -1, we cant change it. sorry + return TRUE + if((synchronizer_coeff != 1) && (HM.synchronizer_coeff != -1)) + return TRUE + if((power_coeff != 1) && (HM.power_coeff != -1)) + return TRUE + if((energy_coeff != 1) && (HM.energy_coeff != -1)) + return TRUE + +/obj/item/chromosome/proc/apply(datum/mutation/human/HM) + if(HM.stabilizer_coeff != -1) + HM.stabilizer_coeff = stabilizer_coeff + if(HM.synchronizer_coeff != -1) + HM.synchronizer_coeff = synchronizer_coeff + if(HM.power_coeff != -1) + HM.power_coeff = power_coeff + if(HM.energy_coeff != -1) + HM.energy_coeff = energy_coeff + HM.can_chromosome = 2 + HM.chromosome_name = name + HM.modify() + qdel(src) + +/proc/generate_chromosome() + var/static/list/chromosomes + if(!chromosomes) + chromosomes = list() + for(var/A in subtypesof(/obj/item/chromosome)) + var/obj/item/chromosome/CM = A + if(!initial(CM.weight)) + break + chromosomes[A] = initial(CM.weight) + return pickweight(chromosomes) + + +/obj/item/chromosome/stabilizer + name = "stabilizer chromosome" + desc = "A chromosome that adjusts to the body to reduce genetic damage by 20%." + icon_state = "stabilizer" + stabilizer_coeff = 0.8 + weight = 1 + +/obj/item/chromosome/synchronizer + name = "synchronizer chromosome" + desc = "A chromosome that gives the mind more controle over the mutation, reducing knockback and downsides by 50%." + icon_state = "synchronizer" + synchronizer_coeff = 0.5 + +/obj/item/chromosome/power + name = "power chromosome" + desc = "A power chromosome for boosting certain mutation's power by 50%." + icon_state = "power" + power_coeff = 1.5 + +/obj/item/chromosome/energy + name = "energetic chromosome" + desc = "A chromosome that reduces cooldown on action based mutations by 50%." + icon_state = "energy" + energy_coeff = 0.5 + +/obj/item/chromosome/reinforcer + name = "reinforcement chromosome" + desc = "Renders the mutation immune to mutadone." + icon_state = "reinforcer" + weight = 3 + +/obj/item/chromosome/reinforcer/can_apply(datum/mutation/human/HM) + if(!HM || !(HM.can_chromosome == CHROMOSOME_NONE)) + return FALSE + return !HM.mutadone_proof + +/obj/item/chromosome/reinforcer/apply(datum/mutation/human/HM) + HM.mutadone_proof = TRUE + ..() \ No newline at end of file diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 0496b282..dcf3cd12 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -65,7 +65,7 @@ build_path = /obj/machinery/dna_scannernew req_components = list( /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stack/sheet/glass = 1, /obj/item/stack/cable_coil = 2) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5bc03ab5..fb6eda84 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -6,6 +6,8 @@ T-RAY HEALTH ANALYZER GAS ANALYZER SLIME SCANNER +NANITE SCANNER +GENE SCANNER */ /obj/item/t_scanner @@ -291,7 +293,8 @@ SLIME SCANNER var/ldamage = H.return_liver_damage() if(ldamage > 10) msg += "\t[ldamage > 45 ? "Severe" : "Minor"] liver damage detected.\n" - + if(advanced && H.has_dna()) + to_chat(user, "\tGenetic Stability: [H.dna.stability]%.") // Body part damage report if(iscarbon(M) && mode == 1) var/mob/living/carbon/C = M @@ -757,3 +760,62 @@ SLIME SCANNER var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) if(!response) to_chat(user, "No nanites detected in the subject.") + +/obj/item/sequence_scanner + name = "genetic sequence scanner" + icon = 'icons/obj/device.dmi' + icon_state = "gene" + item_state = "healthanalyzer" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + desc = "A hand-held scanner able to swiftly scan someone for potential mutations. Hold near a DNA console to update from their database." + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + slot_flags = ITEM_SLOT_BELT + throwforce = 3 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + materials = list(MAT_METAL=200) + var/list/discovered = list() //hit a dna console to update the scanners database + +/obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user) + user.visible_message("[user] has analyzed [M]'s genetic sequence.") + + add_fingerprint(user) + + gene_scan(M, user, src) + +/obj/item/sequence_scanner/afterattack(obj/O, mob/user, proximity) + . = ..() + if(!istype(O) || !proximity) + return + + if(istype(O, /obj/machinery/computer/scan_consolenew)) + var/obj/machinery/computer/scan_consolenew/C = O + if(C.stored_research) + to_chat(user, "[name] database updated.") + discovered = C.stored_research.discovered_mutations + else + to_chat(user,"No database to update from.") + +/proc/gene_scan(mob/living/carbon/C, mob/living/user, obj/item/sequence_scanner/G) + if(!iscarbon(C) || !C.has_dna()) + return + to_chat(user, "[C.name]'s potential mutations.") + for(var/A in C.dna.mutation_index) + var/datum/mutation/human/HM = GET_INITIALIZED_MUTATION(A) + var/mut_name + if(G && (A in G.discovered)) + mut_name = "[HM.name] ([HM.alias])" + else + mut_name = HM.alias + var/temp = GET_GENE_STRING(HM.type, C.dna) + var/display + for(var/i in 0 to length(temp) / DNA_MUTATION_BLOCKS-1) + if(i) + display += "-" + display += copytext(temp, 1 + i*DNA_MUTATION_BLOCKS, DNA_MUTATION_BLOCKS*(1+i) + 1) + + + to_chat(user, "- [mut_name] > [display]") \ No newline at end of file diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index a03447c0..8849ac51 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -14,33 +14,25 @@ var/list/add_mutations = list() var/list/remove_mutations = list() - var/list/add_mutations_static = list() - var/list/remove_mutations_static = list() - var/used = 0 /obj/item/dnainjector/attack_paw(mob/user) return attack_hand(user) -/obj/item/dnainjector/proc/prepare() - for(var/mut_key in add_mutations_static) - add_mutations.Add(GLOB.mutations_list[mut_key]) - for(var/mut_key in remove_mutations_static) - remove_mutations.Add(GLOB.mutations_list[mut_key]) - /obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user) - prepare() - if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" - for(var/datum/mutation/human/HM in remove_mutations) - HM.force_lose(M) - for(var/datum/mutation/human/HM in add_mutations) - if(HM.name == RACEMUT) + for(var/HM in remove_mutations) + M.dna.remove_mutation(HM) + for(var/HM in add_mutations) + if(HM == RACEMUT) message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") log_msg += " (MONKEY)" - HM.force_give(M) + if(M.dna.mutation_in_sequence(HM)) + M.dna.activate_mutation(HM) + else + M.dna.add_mutation(HM, MUT_EXTRA) if(fields) if(fields["name"] && fields["UE"] && fields["blood_type"]) M.real_name = fields["name"] @@ -90,123 +82,123 @@ /obj/item/dnainjector/antihulk name = "\improper DNA injector (Anti-Hulk)" desc = "Cures green skin." - remove_mutations_static = list(HULK) + remove_mutations = list(HULK) /obj/item/dnainjector/hulkmut name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - add_mutations_static = list(HULK) + add_mutations = list(HULK) /obj/item/dnainjector/xraymut name = "\improper DNA injector (X-ray)" desc = "Finally you can see what the Captain does." - add_mutations_static = list(XRAY) + add_mutations = list(XRAY) /obj/item/dnainjector/antixray name = "\improper DNA injector (Anti-X-ray)" desc = "It will make you see harder." - remove_mutations_static = list(XRAY) + remove_mutations = list(XRAY) ///////////////////////////////////// /obj/item/dnainjector/antiglasses name = "\improper DNA injector (Anti-Glasses)" desc = "Toss away those glasses!" - remove_mutations_static = list(BADSIGHT) + remove_mutations = list(BADSIGHT) /obj/item/dnainjector/glassesmut name = "\improper DNA injector (Glasses)" desc = "Will make you need dorkish glasses." - add_mutations_static = list(BADSIGHT) + add_mutations = list(BADSIGHT) /obj/item/dnainjector/epimut name = "\improper DNA injector (Epi.)" desc = "Shake shake shake the room!" - add_mutations_static = list(EPILEPSY) + add_mutations = list(EPILEPSY) /obj/item/dnainjector/antiepi name = "\improper DNA injector (Anti-Epi.)" desc = "Will fix you up from shaking the room." - remove_mutations_static = list(EPILEPSY) + remove_mutations = list(EPILEPSY) //////////////////////////////////// /obj/item/dnainjector/anticough name = "\improper DNA injector (Anti-Cough)" desc = "Will stop that awful noise." - remove_mutations_static = list(COUGH) + remove_mutations = list(COUGH) /obj/item/dnainjector/coughmut name = "\improper DNA injector (Cough)" desc = "Will bring forth a sound of horror from your throat." - add_mutations_static = list(COUGH) + add_mutations = list(COUGH) /obj/item/dnainjector/antidwarf name = "\improper DNA injector (Anti-Dwarfism)" desc = "Helps you grow big and strong." - remove_mutations_static = list(DWARFISM) + remove_mutations = list(DWARFISM) /obj/item/dnainjector/dwarf name = "\improper DNA injector (Dwarfism)" desc = "It's a small world after all." - add_mutations_static = list(DWARFISM) + add_mutations = list(DWARFISM) /obj/item/dnainjector/clumsymut name = "\improper DNA injector (Clumsy)" desc = "Makes clown minions." - add_mutations_static = list(CLOWNMUT) + add_mutations = list(CLOWNMUT) /obj/item/dnainjector/anticlumsy name = "\improper DNA injector (Anti-Clumsy)" desc = "Apply this for Security Clown." - remove_mutations_static = list(CLOWNMUT) + remove_mutations = list(CLOWNMUT) /obj/item/dnainjector/antitour name = "\improper DNA injector (Anti-Tour.)" desc = "Will cure Tourette's." - remove_mutations_static = list(TOURETTES) + remove_mutations = list(TOURETTES) /obj/item/dnainjector/tourmut name = "\improper DNA injector (Tour.)" desc = "Gives you a nasty case of Tourette's." - add_mutations_static = list(TOURETTES) + add_mutations = list(TOURETTES) /obj/item/dnainjector/stuttmut name = "\improper DNA injector (Stutt.)" desc = "Makes you s-s-stuttterrr." - add_mutations_static = list(NERVOUS) + add_mutations = list(NERVOUS) /obj/item/dnainjector/antistutt name = "\improper DNA injector (Anti-Stutt.)" desc = "Fixes that speaking impairment." - remove_mutations_static = list(NERVOUS) + remove_mutations = list(NERVOUS) /obj/item/dnainjector/antifire name = "\improper DNA injector (Anti-Fire)" desc = "Cures fire." - remove_mutations_static = list(COLDRES) + remove_mutations = list(SPACEMUT) /obj/item/dnainjector/firemut name = "\improper DNA injector (Fire)" desc = "Gives you fire." - add_mutations_static = list(COLDRES) + add_mutations = list(SPACEMUT) /obj/item/dnainjector/blindmut name = "\improper DNA injector (Blind)" desc = "Makes you not see anything." - add_mutations_static = list(BLINDMUT) + add_mutations = list(BLINDMUT) /obj/item/dnainjector/antiblind name = "\improper DNA injector (Anti-Blind)" desc = "IT'S A MIRACLE!!!" - remove_mutations_static = list(BLINDMUT) + remove_mutations = list(BLINDMUT) /obj/item/dnainjector/antitele name = "\improper DNA injector (Anti-Tele.)" desc = "Will make you not able to control your mind." - remove_mutations_static = list(TK) + remove_mutations = list(TK) /obj/item/dnainjector/telemut name = "\improper DNA injector (Tele.)" desc = "Super brain man!" - add_mutations_static = list(TK) + add_mutations = list(TK) /obj/item/dnainjector/telemut/darkbundle name = "\improper DNA injector" @@ -215,100 +207,171 @@ /obj/item/dnainjector/deafmut name = "\improper DNA injector (Deaf)" desc = "Sorry, what did you say?" - add_mutations_static = list(DEAFMUT) + add_mutations = list(DEAFMUT) /obj/item/dnainjector/antideaf name = "\improper DNA injector (Anti-Deaf)" desc = "Will make you hear once more." - remove_mutations_static = list(DEAFMUT) + remove_mutations = list(DEAFMUT) /obj/item/dnainjector/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - add_mutations_static = list(RACEMUT) + add_mutations = list(RACEMUT) /obj/item/dnainjector/m2h name = "\improper DNA injector (Monkey > Human)" desc = "Will make you...less hairy." - remove_mutations_static = list(RACEMUT) + remove_mutations = list(RACEMUT) /obj/item/dnainjector/antichameleon name = "\improper DNA injector (Anti-Chameleon)" - remove_mutations_static = list(CHAMELEON) + remove_mutations = list(CHAMELEON) /obj/item/dnainjector/chameleonmut name = "\improper DNA injector (Chameleon)" - add_mutations_static = list(CHAMELEON) + add_mutations = list(CHAMELEON) /obj/item/dnainjector/antiwacky name = "\improper DNA injector (Anti-Wacky)" - remove_mutations_static = list(WACKY) + remove_mutations = list(WACKY) /obj/item/dnainjector/wackymut name = "\improper DNA injector (Wacky)" - add_mutations_static = list(WACKY) + add_mutations = list(WACKY) /obj/item/dnainjector/antimute name = "\improper DNA injector (Anti-Mute)" - remove_mutations_static = list(MUT_MUTE) + remove_mutations = list(MUT_MUTE) /obj/item/dnainjector/mutemut name = "\improper DNA injector (Mute)" - add_mutations_static = list(MUT_MUTE) + add_mutations = list(MUT_MUTE) /obj/item/dnainjector/antismile name = "\improper DNA injector (Anti-Smile)" - remove_mutations_static = list(SMILE) + remove_mutations = list(SMILE) /obj/item/dnainjector/smilemut name = "\improper DNA injector (Smile)" - add_mutations_static = list(SMILE) + add_mutations = list(SMILE) /obj/item/dnainjector/unintelligiblemut name = "\improper DNA injector (Unintelligible)" - add_mutations_static = list(UNINTELLIGIBLE) + add_mutations = list(UNINTELLIGIBLE) /obj/item/dnainjector/antiunintelligible name = "\improper DNA injector (Anti-Unintelligible)" - remove_mutations_static = list(UNINTELLIGIBLE) + remove_mutations = list(UNINTELLIGIBLE) /obj/item/dnainjector/swedishmut name = "\improper DNA injector (Swedish)" - add_mutations_static = list(SWEDISH) + add_mutations = list(SWEDISH) /obj/item/dnainjector/antiswedish name = "\improper DNA injector (Anti-Swedish)" - remove_mutations_static = list(SWEDISH) + remove_mutations = list(SWEDISH) /obj/item/dnainjector/chavmut name = "\improper DNA injector (Chav)" - add_mutations_static = list(CHAV) + add_mutations = list(CHAV) /obj/item/dnainjector/antichav name = "\improper DNA injector (Anti-Chav)" - remove_mutations_static = list(CHAV) + remove_mutations = list(CHAV) /obj/item/dnainjector/elvismut name = "\improper DNA injector (Elvis)" - add_mutations_static = list(ELVIS) + add_mutations = list(ELVIS) /obj/item/dnainjector/antielvis name = "\improper DNA injector (Anti-Elvis)" - remove_mutations_static = list(ELVIS) + remove_mutations = list(ELVIS) /obj/item/dnainjector/lasereyesmut name = "\improper DNA injector (Laser Eyes)" - add_mutations_static = list(LASEREYES) + add_mutations = list(LASEREYES) /obj/item/dnainjector/antilasereyes name = "\improper DNA injector (Anti-Laser Eyes)" - remove_mutations_static = list(LASEREYES) + remove_mutations = list(LASEREYES) + +/obj/item/dnainjector/thermalmut + name = "\improper DNA injector (Thermal Vision)" + add_mutations = list(THERMAL) + +/obj/item/dnainjector/antithermal + name = "\improper DNA injector (Anti-Thermal Vision)" + remove_mutations = list(THERMAL) + +/obj/item/dnainjector/telepathymut + name = "\improper DNA injector (Telepathy)" + add_mutations = list(TELEPATHY) + +/obj/item/dnainjector/antitelepathy + name = "\improper DNA injector (Anti-Telepathy)" + remove_mutations = list(TELEPATHY) + +/obj/item/dnainjector/voidmut + name = "\improper DNA injector (Void Magnet)" + add_mutations = list(VOID) + +/obj/item/dnainjector/antivoid + name = "\improper DNA injector (Anti-Void Magnet)" + remove_mutations = list(VOID) + +/obj/item/dnainjector/firebreathmut + name = "\improper DNA injector (Firebreath)" + add_mutations = list(FIREBREATH) + +/obj/item/dnainjector/antifirebreath + name = "\improper DNA injector (Anti-Firebreath)" + remove_mutations = list(FIREBREATH) + +/obj/item/dnainjector/insulatedmut + name = "\improper DNA injector (Insulated)" + add_mutations = list(INSULATED) + +/obj/item/dnainjector/antiinsulated + name = "\improper DNA injector (Anti-Insulated)" + remove_mutations = list(INSULATED) + +/obj/item/dnainjector/shocktouchmut + name = "\improper DNA injector (Shock Touch)" + add_mutations = list(SHOCKTOUCH) + +/obj/item/dnainjector/antishocktouch + name = "\improper DNA injector (Anti-Shock Touch)" + remove_mutations = list(SHOCKTOUCH) + +/obj/item/dnainjector/antenna + name = "\improper DNA injector (Antenna)" + add_mutations = list(ANTENNA) + +/obj/item/dnainjector/antiantenna + name = "\improper DNA injector (Anti-Antenna)" + remove_mutations = list(ANTENNA) + +/obj/item/dnainjector/paranoia + name = "\improper DNA injector (Paranoia)" + add_mutations = list(PARANOIA) + +/obj/item/dnainjector/antiparanoia + name = "\improper DNA injector (Anti-Paranoia)" + remove_mutations = list(PARANOIA) + +/obj/item/dnainjector/mindread + name = "\improper DNA injector (Mindread)" + add_mutations = list(MINDREAD) + +/obj/item/dnainjector/antimindread + name = "\improper DNA injector (Anti-Mindread)" + remove_mutations = list(MINDREAD) /obj/item/dnainjector/timed var/duration = 600 /obj/item/dnainjector/timed/inject(mob/living/carbon/M, mob/user) - prepare() if(M.stat == DEAD) //prevents dead people from having their DNA changed to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.") return FALSE @@ -317,23 +380,22 @@ M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" var/endtime = world.time+duration - for(var/datum/mutation/human/HM in remove_mutations) - if(HM.name == RACEMUT) + for(var/mutation in remove_mutations) + if(mutation == RACEMUT) if(ishuman(M)) continue - M = HM.force_lose(M) + M = M.dna.remove_mutation(mutation) else - HM.force_lose(M) - for(var/datum/mutation/human/HM in add_mutations) - if((HM in M.dna.mutations) && !(M.dna.temporary_mutations[HM.name])) + M.dna.remove_mutation(mutation) + for(var/mutation in add_mutations) + if(M.dna.get_mutation(mutation)) continue //Skip permanent mutations we already have. - if(HM.name == RACEMUT && ishuman(M)) + if(mutation == RACEMUT && ishuman(M)) message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") log_msg += " (MONKEY)" - M = HM.force_give(M) + M = M.dna.add_mutation(mutation, MUT_OTHER, endtime) else - HM.force_give(M) - M.dna.temporary_mutations[HM.name] = endtime + M.dna.add_mutation(mutation, MUT_OTHER, endtime) if(fields) if(fields["name"] && fields["UE"] && fields["blood_type"]) if(!M.dna.previous["name"]) @@ -361,9 +423,41 @@ /obj/item/dnainjector/timed/hulk name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - add_mutations_static = list(HULK) + add_mutations = list(HULK) /obj/item/dnainjector/timed/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - add_mutations_static = list(RACEMUT) + add_mutations = list(RACEMUT) + +/obj/item/dnainjector/activator + name = "\improper DNA activator" + desc = "Activates the current mutation on injection, if the subject has it." + var/doitanyway = FALSE + var/research = FALSE //Set to true to get expended and filled injectors for chromosomes + var/filled = FALSE + +/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user) + if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M,TRAIT_NOCLONE)) + M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) + var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" + for(var/mutation in add_mutations) + var/datum/mutation/human/HM = mutation + if(istype(HM, /datum/mutation/human)) + mutation = HM.type + if(!M.dna.activate_mutation(HM)) + if(!doitanyway) + log_msg += "(FAILED)" + else + M.dna.add_mutation(HM, MUT_EXTRA) + name = "expended [name]" + else if(research && M.client) + filled = TRUE + name = "filled [name]" + else + name = "expended [name]" + log_msg += "([mutation])" + log_attack("[log_msg] [loc_name(user)]") + return TRUE + return FALSE + diff --git a/code/modules/antagonists/changeling/powers/chameleon_skin.dm b/code/modules/antagonists/changeling/powers/chameleon_skin.dm index b7545353..03f3aab4 100644 --- a/code/modules/antagonists/changeling/powers/chameleon_skin.dm +++ b/code/modules/antagonists/changeling/powers/chameleon_skin.dm @@ -13,17 +13,14 @@ var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 if(!istype(H)) // req_human could be done in can_sting stuff. return - var/datum/mutation/human/HM = GLOB.mutations_list[CHAMELEON] - if(HM in H.dna.mutations) - HM.force_lose(H) + if(H.dna.get_mutation(CHAMELEON)) + H.dna.remove_mutation(CHAMELEON) else - HM.force_give(H) + H.dna.add_mutation(CHAMELEON) return TRUE /obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user) action.Remove(user) if(user.has_dna()) var/mob/living/carbon/C = user - var/datum/mutation/human/HM = GLOB.mutations_list[CHAMELEON] - if(HM in C.dna.mutations) - HM.force_lose(C) \ No newline at end of file + C.dna.remove_mutation(CHAMELEON) \ No newline at end of file diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 87794993..8da0546b 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -69,7 +69,7 @@ /mob/living/simple_animal/revenant/Initialize(mapload) . = ..() AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) - AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) + AddSpell(new /obj/effect/proc_holder/spell/targeted/telepathy/revenant(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 112a31f4..0cbe3102 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -104,35 +104,14 @@ action_background_icon_state = "bg_revenant" //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob -/obj/effect/proc_holder/spell/targeted/revenant_transmit - name = "Transmit" - desc = "Telepathically transmits a message to the target." +/obj/effect/proc_holder/spell/targeted/telepathy/revenant + name = "Revenant Transmit" panel = "Revenant Abilities" - charge_max = 0 - clothes_req = 0 - range = 7 - include_user = 0 action_icon = 'icons/mob/actions/actions_revenant.dmi' action_icon_state = "r_transmit" action_background_icon_state = "bg_revenant" - -/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - for(var/mob/living/M in targets) - var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") - if(!msg) - charge_counter = charge_max - return - log_directed_talk(user, M, msg, LOG_SAY, "revenant whisper") - to_chat(user, "You transmit to [M]: [msg]") - if(!M.anti_magic_check(FALSE, TRUE)) //hear no evil - to_chat(M, "You hear something behind you talking... [msg]") - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) - continue - var/follow_rev = FOLLOW_LINK(ded, user) - var/follow_whispee = FOLLOW_LINK(ded, M) - to_chat(ded, "[follow_rev] [user] Revenant Transmit: \"[msg]\" to [follow_whispee] [M]") - + notice = "revennotice" + boldnotice = "revenboldnotice" /obj/effect/proc_holder/spell/aoe_turf/revenant diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index 318de51e..196ce955 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -26,5 +26,5 @@ return H.dna.add_mutation(HULK) H.dna.add_mutation(XRAY) - H.dna.add_mutation(COLDRES) + H.dna.add_mutation(SPACEMUT) H.dna.add_mutation(TK) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index ac1a4077..505b9a1e 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -94,7 +94,7 @@ to_chat(user, "Your wish is granted, but at a terrible cost...") to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") user.dna.add_mutation(LASEREYES) - user.dna.add_mutation(COLDRES) + user.dna.add_mutation(SPACEMUT) user.dna.add_mutation(XRAY) user.set_species(/datum/species/shadow) if("Wealth") diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 0ff87c03..0b83304f 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -677,3 +677,11 @@ GLOBAL_LIST_EMPTY(asset_datums) Insert(initial(D.id), I) return ..() + + +/datum/asset/simple/genetics + assets = list( + "dna_discovered.gif" = 'html/dna_discovered.gif', + "dna_undiscovered.gif" = 'html/dna_undiscovered.gif', + "dna_extra.gif" = 'html/dna_extra.gif' +) \ No newline at end of file diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 96b5c8e2..4800b61f 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -57,7 +57,7 @@ var/datum/disease/dnaspread/DS = D DS.strain_data["name"] = H.real_name DS.strain_data["UI"] = H.dna.uni_identity - DS.strain_data["SE"] = H.dna.struc_enzymes + DS.strain_data["SE"] = H.dna.mutation_index else D = new virus_type() else diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 9373b5ad..d57615d2 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -164,6 +164,7 @@ Geneticist shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat/genetics suit_store = /obj/item/flashlight/pen + l_pocket = /obj/item/sequence_scanner backpack = /obj/item/storage/backpack/genetics satchel = /obj/item/storage/backpack/satchel/gen diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index f12b6b7e..a25ce336 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -453,7 +453,7 @@ /obj/item/immortality_talisman/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE) + AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE) /datum/action/item_action/immortality name = "Immortality" @@ -462,30 +462,45 @@ if(cooldown < world.time) SSblackbox.record_feedback("amount", "immortality_talisman_uses", 1) cooldown = world.time + 600 - user.visible_message("[user] vanishes from reality, leaving a hole in [user.p_their()] place!") - var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc)) - Z.name = "hole in reality" - Z.desc = "It's shaped an awful lot like [user.name]." - Z.setDir(user.dir) - user.forceMove(Z) - user.notransform = 1 - user.status_flags |= GODMODE - addtimer(CALLBACK(src, .proc/return_to_reality, user, Z), 100) + new /obj/effect/immortality_talisman(get_turf(user), user) else to_chat(user, "[src] is not ready yet!") -/obj/item/immortality_talisman/proc/return_to_reality(mob/user, obj/effect/immortality_talisman/Z) - user.status_flags &= ~GODMODE - user.notransform = 0 - user.forceMove(get_turf(Z)) - user.visible_message("[user] pops back into reality!") - Z.can_destroy = TRUE - qdel(Z) - /obj/effect/immortality_talisman + name = "hole in reality" + desc = "It's shaped an awful lot like a person." icon_state = "blank" icon = 'icons/effects/effects.dmi' - var/can_destroy = FALSE + var/vanish_description = "vanishes from reality" + var/can_destroy = TRUE + +/obj/effect/immortality_talisman/Initialize(mapload, mob/new_user) + . = ..() + if(new_user) + vanish(new_user) + +/obj/effect/immortality_talisman/proc/vanish(mob/user) + user.visible_message("[user] [vanish_description], leaving a hole in [user.p_their()] place!") + + desc = "It's shaped an awful lot like [user.name]." + setDir(user.dir) + + user.forceMove(src) + user.notransform = TRUE + user.status_flags |= GODMODE + + can_destroy = FALSE + + addtimer(CALLBACK(src, .proc/unvanish, user), 10 SECONDS) + +/obj/effect/immortality_talisman/proc/unvanish(mob/user) + user.status_flags &= ~GODMODE + user.notransform = FALSE + user.forceMove(get_turf(src)) + + user.visible_message("[user] pops back into reality!") + can_destroy = TRUE + qdel(src) /obj/effect/immortality_talisman/attackby() return @@ -502,6 +517,10 @@ else . = ..() +/obj/effect/immortality_talisman/void + vanish_description = "is dragged into the void" + + //Shared Bag diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a118dc78..89a7ec25 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -603,6 +603,14 @@ sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) + if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) + sight |= (SEE_MOBS) + lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + + if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = max(see_in_dark, 8) + if(see_override) see_invisible = see_override . = ..() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 33b419de..eb91858b 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -44,6 +44,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/siemens_coeff = 1 //base electrocution coefficient var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] + var/inert_mutation = DWARFISM //special mutation that can be found in the genepool. Dont leave empty or changing species will be a headache var/list/special_step_sounds //Sounds to override barefeet walkng var/grab_sound //Special sound for grabbing @@ -317,6 +318,14 @@ GLOBAL_LIST_EMPTY(roundstart_races) for(var/X in inherent_traits) REMOVE_TRAIT(C, X, SPECIES_TRAIT) + //If their inert mutation is not the same, swap it out + if((inert_mutation != new_species.inert_mutation) && LAZYLEN(C.dna.mutation_index) && (inert_mutation in C.dna.mutation_index)) + C.dna.remove_mutation(inert_mutation) + //keep it at the right spot, so we can't have people taking shortcuts + var/location = C.dna.mutation_index.Find(inert_mutation) + C.dna.mutation_index[location] = new_species.inert_mutation + C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) + SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) @@ -1270,7 +1279,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(radiation > RAD_MOB_MUTATE) if(prob(1)) to_chat(H, "You mutate!") - H.randmutb() + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) H.emote("gasp") H.domutcheck() diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 9b2e2ad5..8d448592 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -20,6 +20,7 @@ exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY liked_food = GROSS | MEAT + inert_mutation = FIREBREATH /datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H) H.grant_language(/datum/language/draconic) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 0da4073f..fbe18a6c 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -60,9 +60,9 @@ H.Knockdown(100) H.visible_message("[H] writhes in pain as [H.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.") if(prob(80)) - H.randmutb() + H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) else - H.randmutg() + H.easy_randmut(POSITIVE) H.domutcheck() else H.adjustFireLoss(rand(5,15)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index de542754..1c2234bb 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -419,7 +419,6 @@ /mob/living/carbon/handle_mutations_and_radiation() if(dna && dna.temporary_mutations.len) - var/datum/mutation/human/HM for(var/mut in dna.temporary_mutations) if(dna.temporary_mutations[mut] < world.time) if(mut == UI_CHANGED) @@ -442,9 +441,9 @@ dna.previous.Remove("blood_type") dna.temporary_mutations.Remove(mut) continue - HM = GLOB.mutations_list[mut] - HM.force_lose(src) - dna.temporary_mutations.Remove(mut) + for(var/datum/mutation/human/HM in dna.mutations) + if(HM && HM.timed) + dna.remove_mutation(HM.type) radiation -= min(radiation, RAD_LOSS_PER_TICK) if(radiation > RAD_MOB_SAFE) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index e0386bcd..be7d90c1 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -38,7 +38,7 @@ if(radiation > RAD_MOB_MUTATE) if(prob(1)) to_chat(src, "You mutate!") - randmutb() + easy_randmut(NEGATIVE+MINOR_NEGATIVE) emote("gasp") domutcheck() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e6f79198..65947711 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -50,9 +50,8 @@ O.updateappearance(icon_update=0) if(tr_flags & TR_KEEPSE) - O.dna.struc_enzymes = dna.struc_enzymes - var/datum/mutation/human/race/R = GLOB.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 + O.dna.mutation_index = dna.mutation_index + O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT)) if(suiciding) O.suiciding = suiciding @@ -210,9 +209,8 @@ O.name = O.real_name if(tr_flags & TR_KEEPSE) - O.dna.struc_enzymes = dna.struc_enzymes - var/datum/mutation/human/race/R = GLOB.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.dna.mutation_index = dna.mutation_index + O.dna.set_se(0, GET_INITIALIZED_MUTATION(RACEMUT)) O.domutcheck() if(suiciding) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 0ad83652..b85de2e7 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -913,7 +913,7 @@ /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M) M.jitteriness = 0 if(M.has_dna()) - M.dna.remove_all_mutations() + M.dna.remove_all_mutations(mutadone = TRUE) if(!QDELETED(M)) //We were a monkey, now a human ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 2b50ecc0..c38bbfed 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -43,9 +43,9 @@ if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method==PATCH || method==INJECT) M.randmuti() if(prob(98)) - M.randmutb() + M.easy_randmut(NEGATIVE+MINOR_NEGATIVE) else - M.randmutg() + M.easy_randmut(POSITIVE) M.updateappearance() M.domutcheck() ..() diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 580f9c87..5a8fc03d 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -162,6 +162,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/genescanner + name = "Genetic Sequence Analyzer" + desc = "A handy hand-held analyzers for quickly determining mutations and collecting the full sequence." + id = "genescanner" + build_path = /obj/item/sequence_scanner + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000, MAT_GLASS = 500) + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/healthanalyzer_advanced name = "Advanced Health Analyzer" desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index da3fec61..42cd5ff1 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -19,6 +19,7 @@ var/largest_bomb_value = 0 var/organization = "Third-Party" //Organization name, used for display. var/list/last_bitcoins = list() //Current per-second production, used for display only. + var/list/discovered_mutations = list() //Mutations discovered by genetics, this way they are shared and cant be destroyed by destroying a single console var/list/tiers = list() //Assoc list, datum = number, 1 is available, 2 is all reqs are 1, so on /datum/techweb/New() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 5f848ce8..1349fd23 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -60,7 +60,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag","genescanner") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm index b670d93f..c3bdc74e 100644 --- a/code/modules/spells/spell_types/genetic.dm +++ b/code/modules/spells/spell_types/genetic.dm @@ -4,7 +4,7 @@ var/list/active_on = list() var/list/traits = list() //disabilities - var/list/mutations = list() //mutation strings + var/list/mutations = list() //mutation defines var/duration = 100 //deciseconds /* Disabilities diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm new file mode 100644 index 00000000..db7e284e --- /dev/null +++ b/code/modules/spells/spell_types/telepathy.dm @@ -0,0 +1,30 @@ +/obj/effect/proc_holder/spell/targeted/telepathy + name = "Telepathy" + desc = "Telepathically transmits a message to the target." + charge_max = 0 + clothes_req = 0 + range = 7 + include_user = 0 + action_icon = 'icons/mob/actions/actions_revenant.dmi' + action_icon_state = "r_transmit" + action_background_icon_state = "bg_spell" + var/notice = "notice" + var/boldnotice = "boldnotice" + var/magic_check = TRUE + +/obj/effect/proc_holder/spell/targeted/telepathy/cast(list/targets, mob/living/simple_animal/revenant/user = usr) + for(var/mob/living/M in targets) + var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") + if(!msg) + charge_counter = charge_max + return + log_directed_talk(user, M, msg, LOG_SAY, "[name]") + to_chat(user, "You transmit to [M]: [msg]") + if(!magic_check || !M.anti_magic_check(FALSE, TRUE)) //hear no evil + to_chat(M, "You hear something behind you talking... [msg]") + for(var/ded in GLOB.dead_mob_list) + if(!isobserver(ded)) + continue + var/follow_rev = FOLLOW_LINK(ded, user) + var/follow_whispee = FOLLOW_LINK(ded, M) + to_chat(ded, "[follow_rev] [user] [name]: \"[msg]\" to [follow_whispee] [M]") \ No newline at end of file diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index 0ffe02ce..f0a9735c 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -1,6 +1,8 @@ /obj/effect/proc_holder/spell/targeted/touch var/hand_path = /obj/item/melee/touch_attack var/obj/item/melee/touch_attack/attached_hand = null + var/drawmessage = "You channel the power of the spell to your hand." + var/dropmessage = "You draw the power out of your hand." invocation_type = "none" //you scream on connecting, not summoning include_user = 1 range = -1 @@ -21,7 +23,7 @@ /obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) if(!QDELETED(attached_hand)) remove_hand(TRUE) - to_chat(user, "You draw the power out of your hand.") + to_chat(user, "[dropmessage]") return for(var/mob/living/carbon/C in targets) @@ -43,7 +45,7 @@ remove_hand(TRUE) to_chat(user, "Your hands are full!") return FALSE - to_chat(user, "You channel the power of the spell to your hand.") + to_chat(user, "[drawmessage]") return TRUE diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 9341fb6c..4e2b81dc 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -108,7 +108,7 @@ for(var/X in C.dna.mutations) //some mutations require having specific limbs to be kept. var/datum/mutation/human/MT = X if(MT.limb_req && MT.limb_req == body_zone) - MT.force_lose(C) + C.dna.force_lose(MT) for(var/X in C.internal_organs) //internal organs inside the dismembered limb are dropped. var/obj/item/organ/O = X diff --git a/html/browser/scannernew.css b/html/browser/scannernew.css index 0e809a67..6746a61a 100644 --- a/html/browser/scannernew.css +++ b/html/browser/scannernew.css @@ -16,3 +16,24 @@ float: left; } +img.selected +{ + border: 1px solid blue; +} +img.unselected +{ + border: 2px solid black; +} +div>table { + float: left; +} +td +{ + text-align: center; +} +a.clean +{ + background: none; + border: none; + marging: none; +} \ No newline at end of file diff --git a/html/dna_discovered.gif b/html/dna_discovered.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc6b75f2f984fd761f9877d80e0f46c9abd2dc27 GIT binary patch literal 48972 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 E0I&Wb&Hw-a literal 0 HcmV?d00001 diff --git a/html/dna_extra.gif b/html/dna_extra.gif new file mode 100644 index 0000000000000000000000000000000000000000..c92218a6613373a1b1f03ae379cbc0fb1f135519 GIT binary patch literal 48105 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 EFWx(-M*si- literal 20768 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 diff --git a/icons/mob/actions/actions_genetic.dmi b/icons/mob/actions/actions_genetic.dmi new file mode 100644 index 0000000000000000000000000000000000000000..72bd87f97ebb5494980bd7cd46d0337223ff2a5b GIT binary patch literal 413 zcmV;O0b>4%P)OhBM-Bu2;Ctd zd=9|k4C#|C$adh^cmO^@!qWsIq&ODfIAtmm9E0Q`3!o5;PM)8{(xbA8VorcU=F%fv zEEk*hSg-lBrYYd9YFfv*FWD~}gr<0C=bYAR*n5Rl5AmD6M~pFCg|xs800000NkvXX Hu0mjf#PYOQ literal 0 HcmV?d00001 diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 30927d36084c556b6b82a9c1d0df9bdbf2860118..5617e228bbc5203b14f2c3b98b402963e3f7d074 100644 GIT binary patch literal 24828 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

DOk_OL=m!H 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 V_AReJ{`YeO69bEz)q2pF{{fWRF600J literal 21667 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 literal 0 HcmV?d00001 diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index d604d02ec4af6d25a0262efe2ce91b43fe419990..8a634be1cc8bfa4d3c4e008d7f9f862c2300ab23 100644 GIT binary patch literal 48379 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