[MIRROR] Adds Trait Genetics (#10142)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-02-13 07:41:59 -07:00
committed by GitHub
parent d81e145924
commit 7bfffc808d
138 changed files with 3818 additions and 2996 deletions

View File

@@ -139,6 +139,7 @@
M.radiation += 50
randmutb(M)
domutcheck(M,null)
M.UpdateAppearance()
visible_message("\The [src.name] flashes violently before disintegrating!")
spawn(0)
qdel(s)

View File

@@ -1,3 +1,5 @@
GLOBAL_LIST_EMPTY(mapped_autostrips)
GLOBAL_LIST_EMPTY(mapped_autostrips_mob)
/* Simple object type, calls a proc when "stepped" on by something */
/obj/effect/step_trigger
@@ -283,3 +285,95 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
/obj/effect/step_trigger/warning/train_edge
warningmessage = "The wind billowing alongside the train is extremely strong here! Any movement could easily pull you down beneath the carriages, return to the train immediately!"
/*
This should actually be refactored if it ever needs to be used again into just being
an event controller with more graceful solutions.
Creating lockers was not graceful, in practice, and creates clutter, for example.
Repurpose this idea into a self contained machine in the future that stores and auto-equips someones gear.
But for now, for what it's been used for, it works.
*/
//Admin tool to automatically strip a human victim of all their equipment and genetics powers, and store them in a closet.
//Equips Vox/Zaddat survival gear, and a few basic pieces of clothing
/obj/effect/step_trigger/autostrip
name = "Autostrip trigger. Set the targetid to match the effect/autostriptarget"
var/targetid = "Default"
var/obj/effect/autostriptarget/target
var/obj/effect/autostriptarget/mob/Mtarget
var/remove_implants = 0 //Havn't bothered to implement this yet
var/remove_mutations = 0
/obj/effect/step_trigger/autostrip/Initialize(mapload)
. = ..()
initMappedLink()
/obj/effect/step_trigger/autostrip/Trigger(mob/living/carbon/human/H as mob)
if(!istype(H))
return
if(!target)
if(!initMappedLink())
return
if(Mtarget)
H.forceMove(Mtarget.loc)
var/obj/locker = new /obj/structure/closet/secure_closet/mind(target.loc, mind_target = H.mind)
for(var/obj/item/W in H)
if(istype(W, /obj/item/implant/backup || istype(W, /obj/item/nif)))
continue
if(H.drop_from_inventory(W))
W.forceMove(locker)
// Traitgenes new remove genes code, didn't want to solve per-trait unique mutation shenanigans... So we just strip your entire genome. This is an admin anti-powergaming tool anyway.
if(remove_mutations)
for(var/datum/gene/gene in GLOB.dna_genes)
if(gene.name in H.active_genes)
// Setup injector
var/obj/item/dnainjector/D = new /obj/item/dnainjector(locker)
D.name = initial(D.name) + " - RESTORE: [gene.name]" //lazy, but we may as well support base genes... even if unused...
D.block = gene.block
D.buf.types = DNA2_BUF_SE
D.SetValue( H.dna.GetSEValue(gene.block) ) // Get original block's value for the injector
D.has_radiation = FALSE // safe to use these!
// Turn off gene
H.dna.SetSEState(gene.block,0)
domutcheck(H,null,MUTCHK_FORCED)
H.UpdateAppearance()
if(H.species.name == SPECIES_VOX || SPECIES_ZADDAT) //Species that 'actually' require survival gear to live. The rest don't.
H.species.equip_survival_gear(H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
H.equip_to_slot_or_del(new /obj/item/radio/headset(H),slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/permit(H), slot_l_hand)
/obj/effect/step_trigger/autostrip/proc/initMappedLink()
. = FALSE
target = GLOB.mapped_autostrips[targetid]
Mtarget = GLOB.mapped_autostrips_mob[targetid]
if(target)
. = TRUE
/obj/effect/autostriptarget
name = "Autostrip target. Link me via targetid to an autostrip trigger."
icon = 'icons/mob/screen1.dmi'
icon_state = "no_item1"
var/targetid = "Default"
unacidable = 1
layer = 99
anchored = 1
invisibility = 99
/obj/effect/autostriptarget/Initialize(mapload)
. = ..()
if(targetid)
GLOB.mapped_autostrips[targetid] = src
/obj/effect/autostriptarget/mob
name = "Autostrip target to send mobs to."
/obj/effect/autostriptarget/mob/Initialize(mapload)
if(targetid)
GLOB.mapped_autostrips_mob[targetid] = src

View File

@@ -1062,6 +1062,7 @@ closest to where the cursor has clicked on.
Note: This proc can be overwritten to allow for different types of auto-alignment.
*/
/obj/item/var/center_of_mass_x = 16
/obj/item/var/center_of_mass_y = 16

View File

@@ -171,13 +171,13 @@
playsound(src, 'sound/weapons/flash.ogg', 100, 1)
var/flashfail = 0
//VOREStation Add - NIF
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.nif && H.nif.flag_check(NIF_V_FLASHPROT,NIF_FLAGS_VISION))
flashfail = 1
H.nif.notify("High intensity light detected, and blocked!",TRUE)
//VOREStation Add End
if(FLASHPROOF in H.mutations)
flashfail = 1
if(iscarbon(M) && !flashfail) //VOREStation Add - NIF
var/mob/living/carbon/C = M

View File

@@ -92,7 +92,6 @@
if(!(M.status_flags & FAKEDEATH))
analyzed_results = span_notice(analyzed_results)
dat += analyzed_results
//VOREStation edit/addition starts
if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
dat += span_notice("Time of Death: [worldtime2stationtime(M.timeofdeath)]")
dat += "<br>"
@@ -100,7 +99,6 @@
if(tdelta < (DEFIB_TIME_LIMIT * 10))
dat += span_boldnotice("Subject died [DisplayTimeText(tdelta)] ago - resuscitation may be possible!")
dat += "<br>"
//VOREStation edit/addition ends
if(ishuman(M) && mode == 1)
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
@@ -118,6 +116,17 @@
else
dat += span_notice(" Limbs are OK.")
dat += "<br>"
// This handles genetic side effects and tells you the treatment, if any.
// These are handled in side_effects.dm
if(H.genetic_side_effects)
for(var/datum/genetics/side_effect/side_effect in H.genetic_side_effects)
var/datum/reagent/Rd = SSchemistry.chemical_reagents[side_effect.antidote_reagent]
dat += "<br>"
dat += span_danger("Patient is suffering from [side_effect.name]. ")
if(Rd)
dat += span_danger("Treatment: [Rd]<br>")
else
dat += "There is no known treatment.<br>"
OX = M.getOxyLoss() > 50 ? "[span_cyan(span_bold("Severe oxygen deprivation detected"))]" : "Subject bloodstream oxygen level normal"
TX = M.getToxLoss() > 50 ? "[span_green(span_bold("Dangerous amount of toxins detected"))]" : "Subject bloodstream toxin level minimal"

View File

@@ -5,21 +5,22 @@
icon_state = "dnainjector"
var/block=0
var/datum/dna2/record/buf=null
var/s_time = 10.0
throw_speed = 1
throw_range = 5
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
var/uses = 1
var/nofail
var/is_bullet = 0
var/inuse = 0
// USE ONLY IN PREMADE SYRINGES. WILL NOT WORK OTHERWISE.
var/datatype=0
var/value=0
/obj/item/dnainjector/New()
// Traitgenes edit begin - Removed subtype, replaced with flag. Allows for safe injectors. Mostly for admin usage.
var/has_radiation = TRUE
// Traitgenes edit end
/obj/item/dnainjector/Initialize() // Traitgenes edit - Moved to init
if(datatype && block)
buf=new
buf.dna=new
@@ -28,6 +29,7 @@
//testing("[name]: DNA2 SE blocks prior to SetValue: [english_list(buf.dna.SE)]")
SetValue(src.value)
//testing("[name]: DNA2 SE blocks after SetValue: [english_list(buf.dna.SE)]")
. = ..() // Traitgenes edit - Moved to init
/obj/item/dnainjector/proc/GetRealBlock(var/selblock)
if(selblock==0)
@@ -64,38 +66,54 @@
return buf.dna.SetUIValue(real_block,val)
/obj/item/dnainjector/proc/inject(mob/M as mob, mob/user as mob)
if(isliving(M))
if(isliving(M) && has_radiation)
var/mob/living/L = M
L.apply_effect(rand(5,20), IRRADIATE, check_protection = 0)
L.apply_damage(max(2,L.getCloneLoss()), CLONE)
if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed
if (buf.types & DNA2_BUF_UI)
if (!block) //isolated block?
M.UpdateAppearance(buf.dna.UI.Copy())
if (buf.types & DNA2_BUF_UE) //unique enzymes? yes
M.real_name = buf.dna.real_name
M.name = buf.dna.real_name
// Traitgenes edit begin - NO_SCAN and Synthetics cannot be mutated
var/allow = TRUE
if(M.isSynthetic())
allow = FALSE
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.species || H.species.flags & NO_SCAN)
allow = FALSE
// Traitgenes edit end
if (!(NOCLONE in M.mutations) && allow) // prevents drained people from having their DNA changed, Traitgenes edit - NO_SCAN and Synthetics cannot be mutated
if(buf)
if (buf.types & DNA2_BUF_UI)
if (!block) //isolated block?
M.UpdateAppearance(buf.dna.UI.Copy())
if (buf.types & DNA2_BUF_UE) //unique enzymes? yes
M.real_name = buf.dna.real_name
M.name = buf.dna.real_name
uses--
else
M.dna.SetUIValue(block,src.GetValue())
M.UpdateAppearance()
uses--
if (buf.types & DNA2_BUF_SE)
if (!block) //isolated block?
M.dna.SE = buf.dna.SE.Copy()
M.dna.UpdateSE()
else
M.dna.SetSEValue(block,src.GetValue())
uses--
else
M.dna.SetUIValue(block,src.GetValue())
M.UpdateAppearance()
uses--
if (buf.types & DNA2_BUF_SE)
if (!block) //isolated block?
M.dna.SE = buf.dna.SE.Copy()
M.dna.UpdateSE()
else
M.dna.SetSEValue(block,src.GetValue())
domutcheck(M, null, block!=null)
uses--
if(prob(5))
trigger_side_effect(M)
// Traitgenes edit - Moved gene checks to after side effects
if(prob(5))
trigger_side_effect(M)
// Traitgenes edit begin - Do gene updates here, and more comprehensively
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.sync_dna_traits(FALSE,FALSE)
H.sync_organ_dna()
M.regenerate_icons()
// Traitgenes edit end
spawn(0)//this prevents the collapse of space-time continuum
if (user)
user.drop_from_inventory(src)
qdel(src)
if (user)
user.drop_from_inventory(src)
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src)
return uses
/obj/item/dnainjector/attack(mob/M as mob, mob/user as mob)
@@ -103,18 +121,19 @@
return
if (!user.IsAdvancedToolUser())
return
if(inuse)
return 0
if (in_use)
return
user.visible_message(span_danger("\The [user] is trying to inject \the [M] with \the [src]!"))
inuse = 1
s_time = world.time
spawn(50)
inuse = 0
in_use = TRUE
//addtimer(VARSET_CALLBACK(src, in_use , FALSE), 5 SECONDS, TIMER_DELETE_ME) //Leaving this for reference of how to do the timer here if do_after wasn't present.
if(!do_after(user,50))
in_use = FALSE
return
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
user.do_attack_animation(M)
@@ -125,454 +144,209 @@
to_chat(user, span_warning("Apparently it didn't work..."))
return
// Used by admin log.
var/injected_with_monkey = ""
if((buf.types & DNA2_BUF_SE) && (block ? (GetState() && block == MONKEYBLOCK) : GetState(MONKEYBLOCK)))
injected_with_monkey = span_danger("(MONKEY)")
add_attack_logs(user,M,"[injected_with_monkey] used the [name] on")
// Apply the DNA shit.
inject(M, user)
return
/obj/item/dnainjector/hulkmut
name = "\improper DNA injector (Hulk)"
desc = "This will make you big and strong, but give you a bad skin condition."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/hulkmut/New()
block = HULKBLOCK
..()
/obj/item/dnainjector/antihulk
name = "\improper DNA injector (Anti-Hulk)"
desc = "Cures green skin."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antihulk/New()
block = HULKBLOCK
..()
/obj/item/dnainjector/xraymut
name = "\improper DNA injector (Xray)"
desc = "Finally you can see what the " + JOB_SITE_MANAGER + " does."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/xraymut/New()
block = XRAYBLOCK
..()
/obj/item/dnainjector/antixray
name = "\improper DNA injector (Anti-Xray)"
desc = "It will make you see harder."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antixray/New()
block = XRAYBLOCK
..()
/obj/item/dnainjector/firemut
name = "\improper DNA injector (Fire)"
desc = "Gives you fire."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/firemut/New()
block = FIREBLOCK
..()
/obj/item/dnainjector/antifire
name = "\improper DNA injector (Anti-Fire)"
desc = "Cures fire."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antifire/New()
block = FIREBLOCK
..()
/obj/item/dnainjector/telemut
name = "\improper DNA injector (Tele.)"
desc = "Super brain man!"
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/telemut/New()
block = TELEBLOCK
..()
/obj/item/dnainjector/antitele
name = "\improper DNA injector (Anti-Tele.)"
desc = "Will make you not able to control your mind."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antitele/New()
block = TELEBLOCK
..()
/obj/item/dnainjector/nobreath
name = "\improper DNA injector (No Breath)"
desc = "Hold your breath and count to infinity."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/nobreath/New()
block = NOBREATHBLOCK
..()
/obj/item/dnainjector/antinobreath
name = "\improper DNA injector (Anti-No Breath)"
desc = "Hold your breath and count to 100."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antinobreath/New()
block = NOBREATHBLOCK
..()
/obj/item/dnainjector/remoteview
name = "\improper DNA injector (Remote View)"
desc = "Stare into the distance for a reason."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/remoteview/New()
block = REMOTEVIEWBLOCK
..()
/obj/item/dnainjector/antiremoteview
name = "\improper DNA injector (Anti-Remote View)"
desc = "Cures green skin."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antiremoteview/New()
block = REMOTEVIEWBLOCK
..()
/obj/item/dnainjector/regenerate
name = "\improper DNA injector (Regeneration)"
desc = "Healthy but hungry."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/regenerate/New()
block = REGENERATEBLOCK
..()
/obj/item/dnainjector/antiregenerate
name = "\improper DNA injector (Anti-Regeneration)"
desc = "Sickly but sated."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antiregenerate/New()
block = REGENERATEBLOCK
..()
/obj/item/dnainjector/runfast
name = "\improper DNA injector (Increase Run)"
desc = "Running Man."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/runfast/New()
block = INCREASERUNBLOCK
..()
/obj/item/dnainjector/antirunfast
name = "\improper DNA injector (Anti-Increase Run)"
desc = "Walking Man."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antirunfast/New()
block = INCREASERUNBLOCK
..()
/obj/item/dnainjector/morph
name = "\improper DNA injector (Morph)"
desc = "A total makeover."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/morph/New()
block = MORPHBLOCK
..()
/obj/item/dnainjector/antimorph
name = "\improper DNA injector (Anti-Morph)"
desc = "Cures identity crisis."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antimorph/New()
block = MORPHBLOCK
..()
/obj/item/dnainjector/noprints
name = "\improper DNA injector (No Prints)"
desc = "Better than a pair of budget insulated gloves."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/noprints/New()
block = NOPRINTSBLOCK
..()
/obj/item/dnainjector/antinoprints
name = "\improper DNA injector (Anti-No Prints)"
desc = "Not quite as good as a pair of budget insulated gloves."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antinoprints/New()
block = NOPRINTSBLOCK
..()
/obj/item/dnainjector/insulation
name = "\improper DNA injector (Shock Immunity)"
desc = "Better than a pair of real insulated gloves."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/insulation/New()
block = SHOCKIMMUNITYBLOCK
..()
/obj/item/dnainjector/antiinsulation
name = "\improper DNA injector (Anti-Shock Immunity)"
desc = "Not quite as good as a pair of real insulated gloves."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antiinsulation/New()
block = SHOCKIMMUNITYBLOCK
..()
/obj/item/dnainjector/midgit
name = "\improper DNA injector (Small Size)"
desc = "Makes you shrink."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/midgit/New()
block = SMALLSIZEBLOCK
..()
/obj/item/dnainjector/antimidgit
name = "\improper DNA injector (Anti-Small Size)"
desc = "Makes you grow. But not too much."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antimidgit/New()
block = SMALLSIZEBLOCK
..()
/////////////////////////////////////
/obj/item/dnainjector/antiglasses
name = "\improper DNA injector (Anti-Glasses)"
desc = "Toss away those glasses!"
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antiglasses/New()
block = GLASSESBLOCK
..()
/obj/item/dnainjector/glassesmut
name = "\improper DNA injector (Glasses)"
desc = "Will make you need dorkish glasses."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/glassesmut/New()
block = GLASSESBLOCK
..()
/obj/item/dnainjector/epimut
name = "\improper DNA injector (Epi.)"
desc = "Shake shake shake the room!"
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/epimut/New()
block = HEADACHEBLOCK
..()
/obj/item/dnainjector/antiepi
name = "\improper DNA injector (Anti-Epi.)"
desc = "Will fix you up from shaking the room."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antiepi/New()
block = HEADACHEBLOCK
..()
/obj/item/dnainjector/anticough
name = "\improper DNA injector (Anti-Cough)"
desc = "Will stop that awful noise."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/anticough/New()
block = COUGHBLOCK
..()
/obj/item/dnainjector/coughmut
name = "\improper DNA injector (Cough)"
desc = "Will bring forth a sound of horror from your throat."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/coughmut/New()
block = COUGHBLOCK
..()
/obj/item/dnainjector/clumsymut
name = "\improper DNA injector (Clumsy)"
desc = "Makes clumsy minions."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/clumsymut/New()
block = CLUMSYBLOCK
..()
/obj/item/dnainjector/anticlumsy
name = "\improper DNA injector (Anti-Clumy)"
desc = "Cleans up confusion."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/anticlumsy/New()
block = CLUMSYBLOCK
..()
/obj/item/dnainjector/antitour
name = "\improper DNA injector (Anti-Tour.)"
desc = "Will cure tourrets."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antitour/New()
block = TWITCHBLOCK
..()
/obj/item/dnainjector/tourmut
name = "\improper DNA injector (Tour.)"
desc = "Gives you a nasty case off tourrets."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/tourmut/New()
block = TWITCHBLOCK
..()
/obj/item/dnainjector/stuttmut
name = "\improper DNA injector (Stutt.)"
desc = "Makes you s-s-stuttterrr"
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/stuttmut/New()
block = NERVOUSBLOCK
..()
/obj/item/dnainjector/antistutt
name = "\improper DNA injector (Anti-Stutt.)"
desc = "Fixes that speaking impairment."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antistutt/New()
block = NERVOUSBLOCK
..()
/obj/item/dnainjector/blindmut
name = "\improper DNA injector (Blind)"
desc = "Makes you not see anything."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/blindmut/New()
block = BLINDBLOCK
..()
/obj/item/dnainjector/antiblind
name = "\improper DNA injector (Anti-Blind)"
desc = "ITS A MIRACLE!!!"
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antiblind/New()
block = BLINDBLOCK
..()
/obj/item/dnainjector/deafmut
name = "\improper DNA injector (Deaf)"
desc = "Sorry, what did you say?"
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/deafmut/New()
block = DEAFBLOCK
..()
/obj/item/dnainjector/antideaf
name = "\improper DNA injector (Anti-Deaf)"
desc = "Will make you hear once more."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antideaf/New()
block = DEAFBLOCK
..()
/obj/item/dnainjector/hallucination
name = "\improper DNA injector (Halluctination)"
desc = "What you see isn't always what you get."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/hallucination/New()
block = HALLUCINATIONBLOCK
..()
/obj/item/dnainjector/antihallucination
name = "\improper DNA injector (Anti-Hallucination)"
desc = "What you see is what you get."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/antihallucination/New()
block = HALLUCINATIONBLOCK
..()
/obj/item/dnainjector/h2m
name = "\improper DNA injector (Human > Monkey)"
desc = "Will make you a flea bag."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/dnainjector/h2m/New()
block = MONKEYBLOCK
..()
/obj/item/dnainjector/m2h
name = "\improper DNA injector (Monkey > Human)"
desc = "Will make you...less hairy."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/m2h/New()
block = MONKEYBLOCK
..()
// Traitgenes Injectors are randomized now due to no hardcoded genes. Split into good or bad, and then versions that specify what they do on the label.
// Otherwise scroll down further for how to make unique injectors
/obj/item/dnainjector/proc/pick_block(var/datum/gene/trait/G, var/labeled, var/allow_disable, var/force_disable = FALSE)
if(G)
block = G.block
datatype = DNA2_BUF_SE
if(!force_disable)
value = 0xFFF
else
value = 0x000
if(allow_disable)
value = pick(0x000,0xFFF)
if(labeled)
name = initial(name) + " - [value == 0x000 ? "Removes" : ""] [G.get_name()]"
/obj/item/dnainjector/random
name = "\improper DNA injector"
desc = "This injects the person with DNA."
// Purely rando
/obj/item/dnainjector/random/Initialize()
pick_block( pick(GLOB.dna_genes_good + GLOB.dna_genes_neutral + GLOB.dna_genes_bad), FALSE, TRUE)
. = ..()
/obj/item/dnainjector/random_labeled/Initialize()
pick_block( pick(GLOB.dna_genes_good + GLOB.dna_genes_neutral + GLOB.dna_genes_bad), TRUE, TRUE)
. = ..()
// Good/bad but also neutral genes mixed in, less OP selection of genes
/obj/item/dnainjector/random_good/Initialize()
pick_block( pick(GLOB.dna_genes_good + GLOB.dna_genes_neutral ), FALSE, TRUE)
. = ..()
/obj/item/dnainjector/random_good_labeled/Initialize()
pick_block( pick(GLOB.dna_genes_good + GLOB.dna_genes_neutral ), TRUE, TRUE)
. = ..()
/obj/item/dnainjector/random_bad/Initialize()
pick_block( pick(GLOB.dna_genes_bad + GLOB.dna_genes_neutral ), FALSE, TRUE)
. = ..()
/obj/item/dnainjector/random_bad_labeled/Initialize()
pick_block( pick(GLOB.dna_genes_bad + GLOB.dna_genes_neutral ), TRUE, TRUE)
. = ..()
// Purely good/bad genes, intended to be usually good rewards or punishments
/obj/item/dnainjector/random_verygood/Initialize()
pick_block( pick(GLOB.dna_genes_good), FALSE, FALSE)
. = ..()
/obj/item/dnainjector/random_verygood_labeled/Initialize()
pick_block( pick(GLOB.dna_genes_good), TRUE, FALSE)
. = ..()
/obj/item/dnainjector/random_verybad/Initialize()
pick_block( pick(GLOB.dna_genes_bad), FALSE, FALSE)
. = ..()
/obj/item/dnainjector/random_verybad_labeled/Initialize()
pick_block( pick(GLOB.dna_genes_bad), TRUE, FALSE)
. = ..()
// Random neutral traits
/obj/item/dnainjector/random_neutral/Initialize()
pick_block( pick(GLOB.dna_genes_neutral ), FALSE, TRUE)
. = ..()
/obj/item/dnainjector/random_neutral_labeled/Initialize()
pick_block( pick(GLOB.dna_genes_neutral ), TRUE, TRUE)
. = ..()
// If you want a unique injector, use a subtype of these
/obj/item/dnainjector/set_trait
var/trait_path
var/disabling = FALSE
/obj/item/dnainjector/set_trait/Initialize()
var/G = get_gene_from_trait(trait_path)
if(trait_path && G)
pick_block( G, TRUE, FALSE, disabling)
else
qdel(src)
return
. = ..()
disabling = TRUE
// Injectors for all original genes and some new ones
/obj/item/dnainjector/set_trait/anxiety // stutter
trait_path = /datum/trait/negative/disability_anxiety
/obj/item/dnainjector/set_trait/anxiety/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/noprints // noprints
trait_path = /datum/trait/positive/superpower_noprints
/obj/item/dnainjector/set_trait/noprints/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/tourettes // tour
trait_path = /datum/trait/negative/disability_tourettes
/obj/item/dnainjector/set_trait/tourettes/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/cough // cough
trait_path = /datum/trait/negative/disability_cough
/obj/item/dnainjector/set_trait/cough/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/nearsighted // glasses
trait_path = /datum/trait/negative/disability_nearsighted
/obj/item/dnainjector/set_trait/nearsighted/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/heatadapt // fire
trait_path = /datum/trait/neutral/hotadapt
/obj/item/dnainjector/set_trait/heatadapt/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/epilepsy // epi
trait_path = /datum/trait/negative/disability_epilepsy
/obj/item/dnainjector/set_trait/epilepsy/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/morph // morph
trait_path = /datum/trait/positive/superpower_morph
/obj/item/dnainjector/set_trait/morph/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/regenerate // regenerate
trait_path = /datum/trait/positive/superpower_regenerate
/obj/item/dnainjector/set_trait/regenerate/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/clumsy // clumsy
trait_path = /datum/trait/negative/disability_clumsy
/obj/item/dnainjector/set_trait/clumsy/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/coldadapt // insulated
trait_path = /datum/trait/neutral/coldadapt
/obj/item/dnainjector/set_trait/coldadapt/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/xray // xraymut
trait_path = /datum/trait/positive/superpower_xray
/obj/item/dnainjector/set_trait/xray/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/deaf // deafmut
trait_path = /datum/trait/negative/disability_deaf
/obj/item/dnainjector/set_trait/deaf/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/tk // telemut
trait_path = /datum/trait/positive/superpower_tk
/obj/item/dnainjector/set_trait/tk/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/haste // runfast
trait_path = /datum/trait/positive/speed_fast
/obj/item/dnainjector/set_trait/haste/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/blind // blindmut
trait_path = /datum/trait/negative/blindness
/obj/item/dnainjector/set_trait/blind/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/nobreathe // nobreath
trait_path = /datum/trait/positive/superpower_nobreathe
/obj/item/dnainjector/set_trait/nobreathe/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/remoteview // remoteview
trait_path = /datum/trait/positive/superpower_remoteview
/obj/item/dnainjector/set_trait/remoteview/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/flashproof // flashproof
trait_path = /datum/trait/positive/superpower_flashproof
/obj/item/dnainjector/set_trait/flashproof/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/hulk // hulk
trait_path = /datum/trait/positive/superpower_hulk
/obj/item/dnainjector/set_trait/hulk/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/table_passer // midgit
trait_path = /datum/trait/positive/table_passer
/obj/item/dnainjector/set_trait/table_passer/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/remotetalk // remotetalk
trait_path = /datum/trait/positive/superpower_remotetalk
/obj/item/dnainjector/set_trait/remotetalk/disable
disabling = TRUE
/obj/item/dnainjector/set_trait/nonconduct // shock
trait_path = /datum/trait/positive/nonconductive_plus
/obj/item/dnainjector/set_trait/nonconduct/disable
disabling = TRUE

View File

@@ -98,12 +98,12 @@
/obj/item/grenade/spawnergrenade/casino/zorgoia,
/obj/item/grenade/spawnergrenade/casino/gygax,
/obj/item/lego,
/obj/item/dnainjector/nobreath,
/obj/item/dnainjector/regenerate,
/obj/item/dnainjector/remoteview,
/obj/item/dnainjector/runfast,
/obj/item/dnainjector/telemut,
/obj/item/dnainjector/xraymut,
/obj/item/dnainjector/set_trait/nobreathe,
/obj/item/dnainjector/set_trait/regenerate,
/obj/item/dnainjector/set_trait/remoteview,
/obj/item/dnainjector/set_trait/haste,
/obj/item/dnainjector/set_trait/tk,
/obj/item/dnainjector/set_trait/xray,
/obj/item/instrument/accordion,
/obj/item/instrument/banjo,
/obj/item/instrument/bikehorn,
@@ -164,7 +164,7 @@
var/gift_type_chaos = pick(
/obj/item/grenade/spawnergrenade/casino/gygax/gorilla,
/obj/item/dnainjector/hulkmut,
/obj/item/dnainjector/set_trait/hulk,
/obj/item/grenade/spawnergrenade/casino/infinitycake,
/obj/item/grenade/spawnergrenade/casino/universal_technomancer,
/obj/item/spellbook,
@@ -186,4 +186,4 @@
I.add_fingerprint(M)
qdel(src)
return
return

View File

@@ -150,9 +150,11 @@
name = "box of DNA injectors"
desc = "This box contains injectors it seems."
icon_state = "dna"
// Traitgenes New injector loot
starts_with = list(
/obj/item/dnainjector/h2m = 3,
/obj/item/dnainjector/m2h = 3
/obj/item/dnainjector/random_good_labeled = 2,
/obj/item/dnainjector/random_neutral_labeled = 2,
/obj/item/dnainjector/random_labeled = 2
)
/obj/item/storage/box/flashbangs
@@ -225,8 +227,8 @@
/obj/item/storage/box/flare
name = "box of flares"
desc = "A box containing 14 flares." // CHOMPedit: More flares.
starts_with = list(/obj/item/flashlight/flare = 14) // CHOMPedit: More flares.
desc = "A box containing 14 flares."
starts_with = list(/obj/item/flashlight/flare = 14)
/obj/item/storage/box/trackimp
name = "boxed tracking implant kit"

View File

@@ -157,3 +157,46 @@
broken = 1
locked = 0
..()
/obj/structure/closet/secure_closet/mind
name = "mind secured locker"
var/datum/mind/owner
var/self_del = 1
anchored = 0
/obj/structure/closet/secure_closet/mind/New(var/datum/mind/mind_target, var/del_self = 1)
.=..()
self_del = del_self
if(mind_target)
owner = mind_target
name = "Owned by [owner.name]"
if(owner.current)
var/icon/I = get_flat_icon(owner.current, dir=SOUTH, no_anim=TRUE)
var/image/IM = image(I, pixel_x = (32 - I.Width()))
//icon2base64(get_flat_icon(owner.current,dir=SOUTH,no_anim=TRUE))
/*
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
I.plane = MOB_PLANE
I.layer = MOB_LAYER
*/
add_overlay(IM)
qdel(I)
/obj/structure/closet/secure_closet/mind/allowed(mob/user)
if(user.mind == owner)
return TRUE
else
return FALSE
/obj/structure/closet/secure_closet/mind/open()
.=..()
if(self_del)
qdel(src)
/obj/structure/closet/secure_closet/mind/LateInitialize()
if(ispath(closet_appearance))
closet_appearance = GLOB.closet_appearances[closet_appearance]
if(istype(closet_appearance))
icon = closet_appearance.icon
color = null
update_icon()