From 75081c610b971a0c296c2aedbea46c72d0c17833 Mon Sep 17 00:00:00 2001 From: Joker66613 Date: Thu, 29 Feb 2024 19:00:26 +0100 Subject: [PATCH] Genetics QoL + Nullifier --- code/datums/dna.dm | 2 +- code/game/machinery/computer/dna_console.dm | 19 +++++++++++++++ code/game/objects/items/devices/scanners.dm | 25 +++++++++++++++----- code/game/objects/items/dna_injector.dm | 5 +++- icons/obj/syringe.dmi | Bin 11087 -> 11509 bytes tgui/packages/tgui/interfaces/DnaConsole.js | 12 ++++++++++ 6 files changed, 55 insertions(+), 8 deletions(-) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 6225bacad8b..96def0b7f10 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -455,7 +455,7 @@ //Return the active mutation of a type if there is one /datum/dna/proc/get_mutation(A) - for(var/datum/mutation/HM as() in mutations) + for(var/datum/mutation/HM in mutations) if(HM.type == A) return HM diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 62f98b6f96e..197659c8e4e 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -630,6 +630,25 @@ if(!HM) return + // nullifier part + // this exists earlier before activator part because "activator" items doesn't work as nullifier because of inject() proc does + var/is_nullifier = text2num(params["is_nullifier"]) + if(is_nullifier) + var/obj/item/dnainjector/I = new /obj/item/dnainjector(loc) + I.remove_mutations += HM.type // this should accept a typepath, not an actual type reference + I.name = "DNA nullifier" + I.desc = "Removes a specific mutation on injection." + I.icon_state = "dnanullifier" + I.base_icon_state = "dnanullifier" + // printing nullifiers a lot wouldn't be good, so it has some cooldown + if(scanner_operational()) + I.damage_coeff = connected_scanner.damage_coeff + injectorready = world.time + INJECTOR_TIMEOUT * 3 * (1 - 0.1 * connected_scanner.precision_coeff) + else + injectorready = world.time + INJECTOR_TIMEOUT * 3 + return + + // Create a new DNA Injector and add the appropriate mutations to it var/obj/item/dnainjector/activator/I = new /obj/item/dnainjector/activator(loc) I.add_mutations += new HM.type(copymut = HM) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 1c57db25ca2..9b05b323b9f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -842,9 +842,22 @@ GENE SCANNER return buffer = C.dna.mutation_index to_chat(user, "Subject [C.name]'s DNA sequence has been saved to buffer.") - if(LAZYLEN(buffer)) - for(var/A in buffer) - to_chat(user, "[get_display_name(A)]") + var/list/full_list_mutations = list() + for(var/each in buffer) // get inherent mutations first + full_list_mutations[each] = FALSE + for(var/datum/mutation/each_mutation in C.dna.mutations) + if(each_mutation.type in buffer) // active inherent mutation + full_list_mutations[each_mutation.type] = "Activated" + else // active artificial mutation + full_list_mutations[each_mutation.type] = "Injected" + for(var/datum/mutation/each_mutation in C.dna.temporary_mutations) + full_list_mutations[each_mutation.type] = "Temporary" + + for(var/A in full_list_mutations) + to_chat(user, "\t[get_display_name(A)]") // if you want to make the scanner tell which mutation is active, put "full_list_mutations[A]" to the second parameter of get_display_name() proc. + to_chat(user, "\tGenetic Stability: [C.dna.stability]%.") + if(C.has_status_effect(STATUS_EFFECT_LING_TRANSFORMATION)) + to_chat(user, "\tSubject's DNA appears to be in an unstable state.") /obj/item/sequence_scanner/proc/display_sequence(mob/living/user) @@ -879,14 +892,14 @@ GENE SCANNER icon_state = initial(icon_state) ready = TRUE -/obj/item/sequence_scanner/proc/get_display_name(mutation) +/obj/item/sequence_scanner/proc/get_display_name(mutation, active_detail=FALSE) var/datum/mutation/HM = GET_INITIALIZED_MUTATION(mutation) if(!HM) return "ERROR" if(discovered[mutation]) - return "[HM.name] ([HM.alias])" + return !active_detail ? "[HM.name] ([HM.alias])" : "[HM.name] ([HM.alias]) - [active_detail]" else - return HM.alias + return !active_detail ? HM.alias : "[HM.alias] - [active_detail]" /obj/item/extrapolator name = "virus extrapolator" diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index e7cc258602a..50a9f0395a8 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -3,6 +3,7 @@ desc = "A cheap single use autoinjector that injects the user with DNA." icon = 'icons/obj/syringe.dmi' icon_state = "dnainjector" + base_icon_state = "dnainjector" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' throw_speed = 3 @@ -25,6 +26,7 @@ var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/HM in remove_mutations) M.dna.remove_mutation(HM) + log_msg += "(mutation removal: [english_list(remove_mutations)])" for(var/HM in add_mutations) if(HM == RACEMUT) message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] (MONKEY)") @@ -74,7 +76,7 @@ to_chat(user, "It appears that [target] does not have compatible DNA.") used = TRUE - icon_state = "dnainjector0" + icon_state = "[base_icon_state]0" desc += " This one is spent, you better recycle it!" @@ -480,6 +482,7 @@ name = "\improper DNA injector (Anti-Medieval)" remove_mutations = list(MEDIEVAL) +// note: this is not functional. mutation is not added to temporary_mutation list - it becomes permanent. /obj/item/dnainjector/timed var/duration = 600 diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index 1248fa674a333fb4a544e5214a9cda53637dcb3a..fa3390e1aaff3c93f69b4a4c3a7d0277bba008bf 100644 GIT binary patch literal 11509 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 T{Jh|DX5iY@+j=Ee?4JD_yg*;K literal 11087 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 diff --git a/tgui/packages/tgui/interfaces/DnaConsole.js b/tgui/packages/tgui/interfaces/DnaConsole.js index 287c29496d0..bd34f20505b 100644 --- a/tgui/packages/tgui/interfaces/DnaConsole.js +++ b/tgui/packages/tgui/interfaces/DnaConsole.js @@ -679,6 +679,18 @@ const MutationInfo = (props, context) => { is_activator: 0, source: mutation.Source, })} /> +