mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-24 04:28:12 +01:00
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:
co-authored by
Kashargul
Willburd
parent
408b765def
commit
cdafe425a5
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user