Adds Trait Genetics (#16921)

* Adds Trait Genetics from Outpost21

Adds trait genetics from Outpost 21
- Tried to update each file it touched to be equivalent to their Chomp specific variants in order to maintain functionality and make sure no oddities would happen due to code differences. (Some things like the eardeaf loop were left there but commented out)

* Morph trait

* Fixes a server crashing bug with flip

aa

* flip

* Makes morph superpower better

- Makes it use the appearance_changer instead of 1000 different  procs

- Makes cocoon weaver able to change eye and skin color.

I did NOT select you. BAD

* begone

* fix dna modifier

* Fixes massive memory leak

* Brain Runtime Fix

* There was no reason for this to be a spawn(0)

And no I didn't spawn with no blood - https://i.imgur.com/vPizqCD.png

* revert

revert the dna changes there

* Deconf

* gets rid of unused proc vars that did nothing

* expects enough free slots

* glob

* fixed and added two other tests

* another few tests

* this is a list

* fixed bad injector

* lets wrap these for sanity

* better feedback

* wrong name

* don't allow multiple occupants into the dna pod

* future traits will have activation levels instead of binary on/off

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: Willburd <7099514+Willburd@users.noreply.github.com>
This commit is contained in:
Cameron Lennox
2025-02-11 02:01:27 -05:00
committed by GitHub
co-authored by Kashargul Willburd
parent 408b765def
commit cdafe425a5
108 changed files with 3805 additions and 2014 deletions
@@ -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
@@ -285,3 +287,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.update_mutations()
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
+1
View File
@@ -1060,6 +1060,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
+2 -2
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
@@ -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"
+171 -480
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,126 @@
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
..()
// 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)
if(G)
block = G.block
datatype = DNA2_BUF_SE
value = 0xFFF
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
/obj/item/dnainjector/set_trait/Initialize()
var/G = get_gene_from_trait(trait_path)
if(trait_path && G)
pick_block( G, TRUE, FALSE)
else
qdel(src)
return
. = ..()
// Only has the superpowers for loot tables and other rewards
/obj/item/dnainjector/set_trait/hulk
trait_path = /datum/trait/positive/superpower_hulk
/obj/item/dnainjector/set_trait/xray
trait_path = /datum/trait/positive/superpower_xray
/obj/item/dnainjector/set_trait/tk
trait_path = /datum/trait/positive/superpower_tk
/obj/item/dnainjector/set_trait/remotetalk
trait_path = /datum/trait/positive/superpower_remotetalk
/obj/item/dnainjector/set_trait/coldadapt
trait_path = /datum/trait/neutral/coldadapt
/obj/item/dnainjector/set_trait/hotadapt
trait_path = /datum/trait/neutral/hotadapt
/obj/item/dnainjector/set_trait/nobreathe
trait_path = /datum/trait/positive/superpower_nobreathe
/obj/item/dnainjector/set_trait/regenerate
trait_path = /datum/trait/positive/superpower_regenerate
/obj/item/dnainjector/set_trait/haste
trait_path = /datum/trait/positive/speed_fast
/obj/item/dnainjector/antihulk
name = "\improper DNA injector (Anti-Hulk)"
desc = "Cures green skin."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/dnainjector/set_trait/flashproof
trait_path = /datum/trait/positive/superpower_flashproof
/obj/item/dnainjector/antihulk/New()
block = HULKBLOCK
..()
/* Not a gene on virgo
/obj/item/dnainjector/set_trait/nonconduct
trait_path = /datum/trait/positive/nonconductive_plus
*/
/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
..()
/obj/item/dnainjector/set_trait/table_passer
trait_path = /datum/trait/positive/table_passer
@@ -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 4 flares."
starts_with = list(/obj/item/flashlight/flare = 4)
desc = "A box containing 14 flares."
starts_with = list(/obj/item/flashlight/flare = 14)
/obj/item/storage/box/trackimp
name = "boxed tracking implant kit"
@@ -156,3 +156,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()