SAY HELO TO DNA2, N3X15'S AWFUL FUCKING RECODE OF DNA

This commit is contained in:
Rob Nelson
2013-11-29 03:19:32 -08:00
parent 2a6807a447
commit 43144dbad0
13 changed files with 851 additions and 133 deletions

View File

@@ -153,7 +153,6 @@
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
#include "code\game\communications.dm"
#include "code\game\dna.dm"
#include "code\game\hud.dm"
#include "code\game\response_team.dm"
#include "code\game\shuttle_engines.dm"
@@ -165,6 +164,8 @@
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
#include "code\game\area\Space Station 13 areas.dm"
#include "code\game\dna\dna2.dm"
#include "code\game\dna\dna2_helpers.dm"
#include "code\game\dna\dna_modifier.dm"
#include "code\game\gamemodes\events.dm"
#include "code\game\gamemodes\factions.dm"

277
code/game/dna/dna2.dm Normal file
View File

@@ -0,0 +1,277 @@
/**
* DNA 2: The Spaghetti Strikes Back
*
* @author N3X15 <nexisentertainment@gmail.com>
*/
// What each index means:
#define DNA_OFF_LOWERBOUND 0
#define DNA_OFF_UPPERBOUND 1
#define DNA_ON_LOWERBOUND 2
#define DNA_ON_UPPERBOUND 3
// Defines which values mean "on" or "off".
// This is to make some of the more OP superpowers a larger PITA to activate,
// and to tell our new DNA datum which values to set in order to turn something
// on or off.
var/global/list/dna_activity_bounds[STRUCDNASIZE]
// Used to determine what each block means (admin hax, mostly)
var/global/list/assigned_blocks[STRUCDNASIZE]
// UI Indices (can change to mutblock style, if desired)
#define DNA_UI_HAIR_R 0
#define DNA_UI_HAIR_G 1
#define DNA_UI_HAIR_B 2
#define DNA_UI_BEARD_R 3
#define DNA_UI_BEARD_G 4
#define DNA_UI_BEARD_B 5
#define DNA_UI_SKIN_TONE 6
#define DNA_UI_EYES_R 7
#define DNA_UI_EYES_G 8
#define DNA_UI_EYES_B 9
#define DNA_UI_GENDER 10
#define DNA_UI_BEARD_STYLE 11
#define DNA_UI_HAIR_STYLE 12
#define DNA_UI_LENGTH 13 // Update this or you WILL break shit.
/proc/add_zero2(t, u)
var/temp1
while (length(t) < u)
t = "0[t]"
temp1 = t
if (length(t) > u)
temp1 = copytext(t,2,u+1)
return temp1
/datum/dna
// READ-ONLY, GETS OVERWRITTEN
// DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE
var/uni_identity="" // Encoded UI
var/struc_enzymes="" // Encoded SE
var/unique_enzymes="" // MD5 of player name
// Internal dirtiness checks
var/dirtyUI=0
var/dirtySE=0
// Okay to read, but you're an idiot if you do.
// BLOCK = VALUE
var/list/SE[STRUCDNASIZE]
var/list/UI[DNA_UI_LENGTH]
// From old dna.
var/b_type = "A+" // Should probably change to an integer => string map but I'm lazy.
var/mutantrace = null // The type of mutant race the player is, if applicable (i.e. potato-man)
var/real_name // Stores the real name of the person who originally got this dna datum. Used primarily for changelings,
///////////////////////////////////////
// UNIQUE IDENTITY
///////////////////////////////////////
/datum/dna/proc/ResetUIFrom(var/mob/living/carbon/human/character)
// INITIALIZE!
for(var/i=1,i<=DNA_UI_LENGTH,i++)
UI[i]=0
// Hair
// FIXME: Species-specific defaults pls
if(!character.h_style)
character.h_style = "Skinhead"
var/hair = hair_styles_list.Find(character.h_style)
// Facial Hair
if(!character.f_style)
character.f_style = "Shaved"
var/beard = facial_hair_styles_list.Find(character.f_style)
var/gender
if(character.gender == MALE)
gender = rand(1,(2050+BLOCKADD))
else
gender = rand((2051+BLOCKADD),4094)
SetUIValue(DNA_UI_HAIR_R, character.r_hair, 1)
SetUIValue(DNA_UI_HAIR_G, character.g_hair, 1)
SetUIValue(DNA_UI_HAIR_B, character.b_hair, 1)
SetUIValue(DNA_UI_BEARD_R, character.r_facial, 1)
SetUIValue(DNA_UI_BEARD_G, character.g_facial, 1)
SetUIValue(DNA_UI_BEARD_B, character.b_facial, 1)
SetUIValue(DNA_UI_SKIN_TONE,(character.s_tone + 220) * 16, 1)
SetUIValue(DNA_UI_BEARD_R, character.r_eyes, 1)
SetUIValue(DNA_UI_BEARD_G, character.g_eyes, 1)
SetUIValue(DNA_UI_BEARD_B, character.b_eyes, 1)
SetUIValue(DNA_UI_GENDER, gender, 1)
SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1)
SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len,1)
UpdateUI()
// Set a DNA UI block's raw value.
/datum/dna/proc/SetUIValue(var/block,var/value,var/defer=0)
ASSERT(value>0)
ASSERT(value<4095)
UI[block]=value
if(defer)
dirtyUI=1
else
UpdateUI()
// Get a DNA UI block's raw value.
/datum/dna/proc/GetUIValue(var/block)
return UI[block]
// Set a DNA UI block's value, given a value and a max possible value.
// Used in hair and facial styles (value being the index and maxvalue being the len of the hairstyle list)
/datum/dna/proc/SetUIValueRange(var/block,var/value,var/maxvalue)
ASSERT(maxvalue<4095)
var/range = round(4095 / maxvalue)
if(value)
SetUIValue(block,value * range - rand(1,range-1))
/datum/dna/proc/GetUIValueRange(var/block,var/maxvalue)
var/value = GetUIValue(block)
return round(1 +(value / 4096)*maxvalue)
/datum/dna/proc/GetUIState(var/block)
return UI[block] > 2050
/datum/dna/proc/SetUIState(var/block,var/on,var/defer=0)
var/val
if(on)
val=rand(2050,4095)
else
val=rand(1,2049)
SetUIValue(block,val,defer)
/datum/dna/proc/GetUIBlock(var/block)
return EncodeBlockValue(GetUIValue(block))
// Do not use this unless you absolutely have to.
/datum/dna/proc/SetUIBlock(var/block,var/value,var/defer=0)
return SetUIValue(block,hex2num(value),defer)
/datum/dna/proc/GetUISubBlock(var/block,var/subBlock)
return copytext(GetUIBlock(block),subBlock,subBlock+1)
/datum/dna/proc/SetUISubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0)
var/oldBlock=GetUIBlock(block)
var/newBlock=""
for(var/i=1, i<=length(oldBlock), i++)
if(i==subBlock)
newBlock+=newSubBlock
else
newBlock+=copytext(oldBlock,i,i+1)
SetUIBlock(block,newBlock,defer)
///////////////////////////////////////
// STRUCTURAL ENZYMES
///////////////////////////////////////
// Zeroes out all of the blocks.
/datum/dna/proc/ResetSE()
for(var/i = 1, i <= STRUCDNASIZE, i++)
SetSEValue(i,rand(1,1024),1)
UpdateSE()
// Set a DNA SE block's raw value.
/datum/dna/proc/SetSEValue(var/block,var/value,var/defer=0)
ASSERT(value>0)
ASSERT(value<4095)
SE[block]=value
if(defer)
dirtySE=1
else
UpdateSE()
// Get a DNA SE block's raw value.
/datum/dna/proc/GetSEValue(var/block)
return UI[block]
// Set a DNA SE block's value, given a value and a max possible value.
// Might be used for species?
/datum/dna/proc/SetSEValueRange(var/block,var/value,var/maxvalue)
ASSERT(maxvalue<4095)
var/range = round(4095 / maxvalue)
if(value)
SetSEValue(block, value * range - rand(1,range-1))
/datum/dna/proc/GetSEState(var/block)
var/list/BOUNDS=dna_activity_bounds[block]
var/value=GetSEValue(block)
return (value > BOUNDS[DNA_ON_LOWERBOUND])
/datum/dna/proc/SetSEState(var/block,var/on,var/defer=0)
var/list/BOUNDS=dna_activity_bounds[block]
var/val
if(on)
val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND])
else
val=rand(BOUNDS[DNA_OFF_LOWERBOUND],BOUNDS[DNA_OFF_UPPERBOUND])
SetSEValue(block,val,defer)
/datum/dna/proc/GetSEBlock(var/block)
return EncodeBlockValue(GetSEValue(block))
// Do not use this unless you absolutely have to.
/datum/dna/proc/SetSEBlock(var/block,var/value,var/defer=0)
return SetSEValue(block,hex2num(value),defer)
/datum/dna/proc/GetSESubBlock(var/block,var/subBlock)
return copytext(GetSEBlock(block),subBlock,subBlock+1)
/datum/dna/proc/SetSESubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0)
var/oldBlock=GetSEBlock(block)
var/newBlock=""
for(var/i=1, i<=length(oldBlock), i++)
if(i==subBlock)
newBlock+=newSubBlock
else
newBlock+=copytext(oldBlock,i,i+1)
SetSEBlock(block,newBlock,defer)
/datum/dna/proc/EncodeBlockValue(var/value)
return add_zero2(num2hex(value,1), 3)
/datum/dna/proc/UpdateUI()
src.unique_enzymes=""
for(var/block in UI)
unique_enzymes += EncodeBlockValue(block)
dirtyUI=0
/datum/dna/proc/UpdateSE()
struc_enzymes=""
for(var/block in SE)
struc_enzymes += EncodeBlockValue(block)
dirtySE=0
// BACK-COMPAT!
// Just checks our character has all the crap it needs.
/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character)
if(character)
if(UI.len != DNA_UI_LENGTH)
ResetUIFrom(character)
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
ResetSE()
if(length(unique_enzymes) != 32)
unique_enzymes = md5(character.real_name)
else
if(length(uni_identity) != 3*DNA_UI_LENGTH)
uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4"
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
// BACK-COMPAT!
// Initial DNA setup. I'm kind of wondering why the hell this doesn't just call the above.
/datum/dna/proc/ready_dna(mob/living/carbon/human/character)
ResetUIFrom(character)
ResetSE()
unique_enzymes = md5(character.real_name)
reg_dna[unique_enzymes] = character.real_name

View File

@@ -0,0 +1,450 @@
// Random Bad Mutation
/proc/randmutb(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
var/block = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK)
M.dna.SetSEState(block, 1)
// Random Good Mutation
/proc/randmutg(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,COLDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
M.dna.SetSEState(block, 1)
// Random Appearance Mutation
/proc/randmuti(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
M.dna.SetUIValue(rand(1,UNIDNASIZE),rand(1,4095))
// Scramble UI or SE.
/proc/scramble(var/UI, var/mob/M, var/prob)
if(!M) return
M.dna.check_integrity()
if(UI)
for(var/i = 1, i <= DNA_UI_LENGTH-1, i++)
if(prob(prob))
M.dna.SetUIValue(i,rand(1,4095),1)
M.dna.UpdateUI()
updateappearance(M, M.dna.uni_identity)
else
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
if(prob(prob))
M.dna.SetSEValue(i,rand(1,4095),1)
M.dna.UpdateSE()
domutcheck(M, null)
return
// I haven't yet figured out what the fuck this is supposed to do.
/proc/miniscramble(input,rs,rd)
var/output
output = null
if (input == "C" || input == "D" || input == "E" || input == "F")
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3")
if (input == "8" || input == "9" || input == "A" || input == "B")
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3")
if (input == "4" || input == "5" || input == "6" || input == "7")
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3")
if (input == "0" || input == "1" || input == "2" || input == "3")
output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F")
if (!output) output = "5"
return output
// HELLO I MAKE BELL CURVES AROUND YOUR DESIRED TARGET
// So a shitty way of replacing gaussian noise.
// input: YOUR TARGET
// rs: RAD STRENGTH
// rd: DURATION
/proc/miniscrambletarget(input,rs,rd)
var/output = null
switch(input)
if("0")
output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3")
if("1")
output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4")
if("2")
output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5")
if("3")
output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6")
if("4")
output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7")
if("5")
output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8")
if("6")
output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9")
if("7")
output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A")
if("8")
output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B")
if("9")
output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C")
if("10")//A
output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D")
if("11")//B
output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E")
if("12")//C
output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F")
if("13")//D
output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F")
if("14")//E
output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F")
if("15")//F
output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F")
if(!input || !output) //How did this happen?
output = "8"
return output
/proc/updateappearance(var/mob/M, var/datum/dna/dna)
if(istype(M, /mob/living/carbon/human))
M.dna.check_integrity()
var/mob/living/carbon/human/H = M
H.r_hair = dna.GetUIValue(DNA_UI_HAIR_R)
H.b_hair = dna.GetUIValue(DNA_UI_HAIR_B)
H.g_hair = dna.GetUIValue(DNA_UI_HAIR_G)
H.r_facial = dna.GetUIValue(DNA_UI_BEARD_R)
H.b_facial = dna.GetUIValue(DNA_UI_BEARD_B)
H.g_facial = dna.GetUIValue(DNA_UI_BEARD_G)
H.s_tone = round((dna.GetUIValue(DNA_UI_SKIN_TONE) / 16) - 220)
H.r_eyes = dna.GetUIValue(DNA_UI_EYES_R)
H.g_eyes = dna.GetUIValue(DNA_UI_EYES_G)
H.b_eyes = dna.GetUIValue(DNA_UI_EYES_B)
if (dna.GetUIState(DNA_UI_GENDER))
H.gender = FEMALE
else
H.gender = MALE
//Hair
var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
if((0 < hair) && (hair <= hair_styles_list.len))
H.h_style = hair_styles_list[hair]
//Facial Hair
var/beard = dna.GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len)
if((0 < beard) && (beard <= facial_hair_styles_list.len))
H.f_style = facial_hair_styles_list[beard]
H.update_body(0)
H.update_hair()
return 1
else
return 0
/proc/probinj(var/pr, var/inj)
return prob(pr+inj*pr)
/proc/domutcheck(mob/living/M as mob, connected, inj)
if (!M) return
M.dna.check_integrity()
M.disabilities = 0
M.sdisabilities = 0
var/old_mutations = M.mutations
M.mutations = list()
M.pass_flags = 0
// M.see_in_dark = 2
// M.see_invisible = 0
if(PLANT in old_mutations)
M.mutations.Add(PLANT)
if(SKELETON in old_mutations)
M.mutations.Add(SKELETON)
if(FAT in old_mutations)
M.mutations.Add(FAT)
if(HUSK in old_mutations)
M.mutations.Add(HUSK)
if(M.dna.GetSEState(NOBREATHBLOCK))
if(probinj(45,inj) || (mNobreath in old_mutations))
M << "\blue You feel no need to breathe."
M.mutations.Add(mNobreath)
if(M.dna.GetSEState(REMOTEVIEWBLOCK))
if(probinj(45,inj) || (mRemote in old_mutations))
M << "\blue Your mind expands"
M.mutations.Add(mRemote)
M.verbs += /mob/living/carbon/human/proc/remoteobserve
if(M.dna.GetSEState(REGENERATEBLOCK))
if(probinj(45,inj) || (mRegen in old_mutations))
M << "\blue You feel better"
M.mutations.Add(mRegen)
if(M.dna.GetSEState(INCREASERUNBLOCK))
if(probinj(45,inj) || (mRun in old_mutations))
M << "\blue Your leg muscles pulsate."
M.mutations.Add(mRun)
if(M.dna.GetSEState(REMOTETALKBLOCK))
if(probinj(45,inj) || (mRemotetalk in old_mutations))
M << "\blue You expand your mind outwards"
M.mutations.Add(mRemotetalk)
M.verbs += /mob/living/carbon/human/proc/remotesay
if(M.dna.GetSEState(MORPHBLOCK))
if(probinj(45,inj) || (mMorph in old_mutations))
M.mutations.Add(mMorph)
M << "\blue Your skin feels strange"
M.verbs += /mob/living/carbon/human/proc/morph
if(M.dna.GetSEState(COLDBLOCK))
if(!(COLD_RESISTANCE in old_mutations))
if(probinj(15,inj) || (mHeatres in old_mutations))
M.mutations.Add(mHeatres)
M << "\blue Your skin is icy to the touch"
else
if(probinj(5,inj) || (mHeatres in old_mutations))
M.mutations.Add(mHeatres)
M << "\blue Your skin is icy to the touch"
if(M.dna.GetSEState(HALLUCINATIONBLOCK))
if(probinj(45,inj) || (mHallucination in old_mutations))
M.mutations.Add(mHallucination)
M << "\red Your mind says 'Hello'"
if(M.dna.GetSEState(NOPRINTSBLOCK))
if(probinj(45,inj) || (mFingerprints in old_mutations))
M.mutations.Add(mFingerprints)
M << "\blue Your fingers feel numb"
if(M.dna.GetSEState(SHOCKIMMUNITYBLOCK))
if(probinj(45,inj) || (mShock in old_mutations))
M.mutations.Add(mShock)
M << "\blue Your skin feels strange"
if(M.dna.GetSEState(SMALLSIZEBLOCK))
if(probinj(45,inj) || (mSmallsize in old_mutations))
M << "\blue Your skin feels rubbery"
M.mutations.Add(mSmallsize)
M.pass_flags |= 1
if (M.dna.GetSEState(HULKBLOCK))
if(probinj(5,inj) || (HULK in old_mutations))
M << "\blue Your muscles hurt."
M.mutations.Add(HULK)
if (M.dna.GetSEState(HEADACHEBLOCK))
M.disabilities |= EPILEPSY
M << "\red You get a headache."
if (M.dna.GetSEState(FAKEBLOCK))
M << "\red You feel strange."
if (prob(95))
if(prob(50))
randmutb(M)
else
randmuti(M)
else
randmutg(M)
if (M.dna.GetSEState(COUGHBLOCK))
M.disabilities |= COUGHING
M << "\red You start coughing."
if (M.dna.GetSEState(CLUMSYBLOCK))
M << "\red You feel lightheaded."
M.mutations.Add(CLUMSY)
if (M.dna.GetSEState(TWITCHBLOCK))
M.disabilities |= TOURETTES
M << "\red You twitch."
if (M.dna.GetSEState(XRAYBLOCK))
if(probinj(30,inj) || (XRAY in old_mutations))
M << "\blue The walls suddenly disappear."
// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
// M.see_in_dark = 8
// M.see_invisible = 2
M.mutations.Add(XRAY)
if (M.dna.GetSEState(NERVOUSBLOCK))
M.disabilities |= NERVOUS
M << "\red You feel nervous."
if (M.dna.GetSEState(FIREBLOCK))
if(!(mHeatres in old_mutations))
if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations))
M << "\blue Your body feels warm."
M.mutations.Add(COLD_RESISTANCE)
else
if(probinj(5,inj) || (COLD_RESISTANCE in old_mutations))
M << "\blue Your body feels warm."
M.mutations.Add(COLD_RESISTANCE)
if (M.dna.GetSEState(BLINDBLOCK))
M.sdisabilities |= BLIND
M << "\red You can't seem to see anything."
if (M.dna.GetSEState(TELEBLOCK))
if(probinj(15,inj) || (TK in old_mutations))
M << "\blue You feel smarter."
M.mutations.Add(TK)
if (M.dna.GetSEState(DEAFBLOCK))
M.sdisabilities |= DEAF
M.ear_deaf = 1
M << "\red Its kinda quiet.."
if (M.dna.GetSEState(GLASSESBLOCK))
M.disabilities |= NEARSIGHTED
M << "Your eyes feel weird..."
/* If you want the new mutations to work, UNCOMMENT THIS.
if(istype(M, /mob/living/carbon))
for (var/datum/mutations/mut in global_mutations)
mut.check_mutation(M)
*/
//////////////////////////////////////////////////////////// Monkey Block
if (M.dna.GetSEState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
// human > monkey
var/mob/living/carbon/human/H = M
H.monkeyizing = 1
var/list/implants = list() //Try to preserve implants.
for(var/obj/item/weapon/implant/W in H)
implants += W
W.loc = null
if(!connected)
for(var/obj/item/W in (H.contents-implants))
if (W==H.w_uniform) // will be teared
continue
H.drop_from_inventory(W)
M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
var/atom/movable/overlay/animation = new( M.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("h2monkey", animation)
sleep(48)
del(animation)
var/mob/living/carbon/monkey/O = null
if(H.species.primitive)
O = new H.species.primitive(src)
else
H.gib() //Trying to change the species of a creature with no primitive var set is messy.
return
if(M)
if (M.dna)
O.dna = M.dna
M.dna = null
if (M.suiciding)
O.suiciding = M.suiciding
M.suiciding = null
for(var/datum/disease/D in M.viruses)
O.viruses += D
D.affected_mob = O
M.viruses -= D
for(var/obj/T in (M.contents-implants))
del(T)
O.loc = M.loc
if(M.mind)
M.mind.transfer_to(O) //transfer our mind to the cute little monkey
if (connected) //inside dna thing
var/obj/machinery/dna_scannernew/C = connected
O.loc = C
C.occupant = O
connected = null
O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6))
O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss())
O.adjustToxLoss(M.getToxLoss() + 20)
O.adjustOxyLoss(M.getOxyLoss())
O.stat = M.stat
O.a_intent = "hurt"
for (var/obj/item/weapon/implant/I in implants)
I.loc = O
I.implanted = O
// O.update_icon = 1 //queue a full icon update at next life() call
del(M)
return
if (!M.dna.GetSEState(MONKEYBLOCK) && !istype(M, /mob/living/carbon/human))
// monkey > human,
var/mob/living/carbon/monkey/Mo = M
Mo.monkeyizing = 1
var/list/implants = list() //Still preserving implants
for(var/obj/item/weapon/implant/W in Mo)
implants += W
W.loc = null
if(!connected)
for(var/obj/item/W in (Mo.contents-implants))
Mo.drop_from_inventory(W)
M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
var/atom/movable/overlay/animation = new( M.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("monkey2h", animation)
sleep(48)
del(animation)
var/mob/living/carbon/human/O = new( src )
if(Mo.greaterform)
O.set_species(Mo.greaterform)
if (M.dna.GetUIState(DNA_UI_GENDER))
O.gender = FEMALE
else
O.gender = MALE
if (M)
if (M.dna)
O.dna = M.dna
M.dna = null
if (M.suiciding)
O.suiciding = M.suiciding
M.suiciding = null
for(var/datum/disease/D in M.viruses)
O.viruses += D
D.affected_mob = O
M.viruses -= D
//for(var/obj/T in M)
// del(T)
O.loc = M.loc
if(M.mind)
M.mind.transfer_to(O) //transfer our mind to the human
if (connected) //inside dna thing
var/obj/machinery/dna_scannernew/C = connected
O.loc = C
C.occupant = O
connected = null
var/i
while (!i)
var/randomname
if (O.gender == MALE)
randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
else
randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
if (findname(randomname))
continue
else
O.real_name = randomname
i++
updateappearance(O,O.dna.uni_identity)
O.take_overall_damage(M.getBruteLoss(), M.getFireLoss())
O.adjustToxLoss(M.getToxLoss())
O.adjustOxyLoss(M.getOxyLoss())
O.stat = M.stat
for (var/obj/item/weapon/implant/I in implants)
I.loc = O
I.implanted = O
// O.update_icon = 1 //queue a full icon update at next life() call
del(M)
return
//////////////////////////////////////////////////////////// Monkey Block
if(M)
M.update_icon = 1 //queue a full icon update at next life() call
return null
/////////////////////////// DNA MISC-PROCS

View File

@@ -639,10 +639,7 @@
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["pulseUIRadiation"])
var/block
var/newblock
var/tstructure2
block = getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),src.selected_ui_subblock,1)
var/block = src.connected.occupant.dna.GetUISubBlock(src.selected_ui_block,src.selected_ui_subblock)
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
@@ -658,12 +655,7 @@
if (prob((80 + (src.radiation_duration / 2))))
block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration)
newblock = null
if (src.selected_ui_subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),2,1) + getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),3,1)
if (src.selected_ui_subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),1,1) + block + getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),3,1)
if (src.selected_ui_subblock == 3) newblock = getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),1,1) + getblock(getblock(src.connected.occupant.dna.uni_identity,src.selected_ui_block,DNA_BLOCK_SIZE),2,1) + block
tstructure2 = setblock(src.connected.occupant.dna.uni_identity, src.selected_ui_block, newblock,DNA_BLOCK_SIZE)
src.connected.occupant.dna.uni_identity = tstructure2
src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block)
updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity)
src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration)
else
@@ -704,11 +696,8 @@
if (href_list["pulseSERadiation"])
var/block
var/newblock
var/tstructure2
var/oldblock
block = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),src.selected_se_subblock,1)
block = src.connected.occupant.dna.GetSESubBlock(src.selected_se_block,src.selected_se_subblock)
irradiating = src.radiation_duration
var/lock_state = src.connected.locked
@@ -721,31 +710,22 @@
if(src.connected.occupant)
if (prob((80 + (src.radiation_duration / 2))))
// FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be.
if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20))
oldblock = src.selected_se_block
block = miniscramble(block, src.radiation_intensity, src.radiation_duration)
newblock = null
if (src.selected_se_block > 1 && src.selected_se_block < STRUCDNASIZE/2)
src.selected_se_block++
else if (src.selected_se_block > STRUCDNASIZE/2 && src.selected_se_block < STRUCDNASIZE)
src.selected_se_block--
if (src.selected_se_subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),2,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),3,1)
if (src.selected_se_subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),1,1) + block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),3,1)
if (src.selected_se_subblock == 3) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),1,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),2,1) + block
tstructure2 = setblock(src.connected.occupant.dna.struc_enzymes, src.selected_se_block, newblock,DNA_BLOCK_SIZE)
src.connected.occupant.dna.struc_enzymes = tstructure2
src.connected.occupant.dna.SetSESubBlock(src.selected_ui_block,src.selected_ui_subblock,block)
domutcheck(src.connected.occupant,src.connected)
src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration)
src.selected_se_block = oldblock
else
//
block = miniscramble(block, src.radiation_intensity, src.radiation_duration)
newblock = null
if (src.selected_se_subblock == 1) newblock = block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),2,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),3,1)
if (src.selected_se_subblock == 2) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),1,1) + block + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),3,1)
if (src.selected_se_subblock == 3) newblock = getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),1,1) + getblock(getblock(src.connected.occupant.dna.struc_enzymes,src.selected_se_block,DNA_BLOCK_SIZE),2,1) + block
tstructure2 = setblock(src.connected.occupant.dna.struc_enzymes, src.selected_se_block, newblock,DNA_BLOCK_SIZE)
src.connected.occupant.dna.struc_enzymes = tstructure2
src.connected.occupant.dna.SetSESubBlock(src.selected_ui_block,src.selected_ui_subblock,block)
domutcheck(src.connected.occupant,src.connected)
src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration)
else

View File

@@ -314,7 +314,7 @@
W.layer = initial(W.layer)
var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
if (isblockon(getblock(C.dna.uni_identity, 11,3),11))
if (C.dna.GetUIState(DNA_UI_GENDER))
O.gender = FEMALE
else
O.gender = MALE

View File

@@ -1,9 +1,10 @@
var/global/list/assigned_blocks[STRUCDNASIZE]
/proc/getAssignedBlock(var/name,var/list/blocksLeft)
/proc/getAssignedBlock(var/name,var/list/blocksLeft, var/activity_bounds=list(1,2049,2050,4095))
var/assigned = pick(blocksLeft)
blocksLeft.Remove(assigned)
assigned_blocks[assigned]=name
dna_activity_bounds[assigned]=activity_bounds
//Debug message_admins("[name] assigned to block #[assigned].")
testing("[name] assigned to block #[assigned].")
return assigned
@@ -14,45 +15,9 @@ var/global/list/assigned_blocks[STRUCDNASIZE]
BLOCKADD = rand(-300,300)
if (prob(75))
DIFFMUT = rand(0,20)
/*
var/list/avnums = new/list()
var/tempnum
avnums.Add(2)
avnums.Add(12)
avnums.Add(10)
avnums.Add(8)
avnums.Add(4)
avnums.Add(11)
avnums.Add(13)
avnums.Add(6)
tempnum = pick(avnums)
avnums.Remove(tempnum)
HULKBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
TELEBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
FIREBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
XRAYBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
CLUMSYBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
FAKEBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
DEAFBLOCK = tempnum
tempnum = pick(avnums)
avnums.Remove(tempnum)
BLINDBLOCK = tempnum
*/
//Thanks to nexis for the fancy code
// BITCH I AIN'T DONE YET
var/list/numsToAssign=new()
for(var/i=1;i<STRUCDNASIZE;i++)
numsToAssign += i

View File

@@ -4,7 +4,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "dnainjector"
var/dnatype = null
var/dna = null
var/list/dna = null
var/block = null
var/owner = null
var/ue = null
@@ -21,6 +21,34 @@
return attack_hand(user)
/obj/item/weapon/dnainjector/proc/GetState(var/selblock=0)
var/real_block
if(!selblock)
real_block=block
selblock=1
else
real_block=selblock
var/list/BOUNDS = dna_activity_bounds[real_block]
return dna[selblock] > BOUNDS[DNA_ON_LOWERBOUND]
/obj/item/weapon/dnainjector/proc/SetState(var/on, var/selblock=0)
var/real_block
if(!selblock)
real_block=block
selblock=1
else
real_block=selblock
var/list/BOUNDS=dna_activity_bounds[real_block]
var/val
if(on)
val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND])
else
val=rand(BOUNDS[DNA_OFF_LOWERBOUND],BOUNDS[DNA_OFF_UPPERBOUND])
dna[selblock]=val
/obj/item/weapon/dnainjector/proc/GetValue(var/block=1)
return dna[block]
/obj/item/weapon/dnainjector/proc/inject(mob/M as mob, mob/user as mob)
if(istype(M,/mob/living))
M.radiation += rand(5,20)
@@ -29,26 +57,29 @@
if (dnatype == "ui")
if (!block) //isolated block?
if (ue) //unique enzymes? yes
M.dna.uni_identity = dna
M.dna.UI = dna
M.dna.UpdateUI()
updateappearance(M, M.dna.uni_identity)
M.real_name = ue
M.name = ue
uses--
else //unique enzymes? no
M.dna.uni_identity = dna
M.dna.UI = dna
M.dna.UpdateUI()
updateappearance(M, M.dna.uni_identity)
uses--
else
M.dna.uni_identity = setblock(M.dna.uni_identity,block,dna,3)
M.dna.SetUIValue(block,src.GetValue())
updateappearance(M, M.dna.uni_identity)
uses--
if (dnatype == "se")
if (!block) //isolated block?
M.dna.struc_enzymes = dna
M.dna.SE = dna
M.dna.UpdateSE()
domutcheck(M, null)
uses--
else
M.dna.struc_enzymes = setblock(M.dna.struc_enzymes,block,dna,3)
M.dna.SetUIValue(block,src.GetValue())
domutcheck(M, null,1)
uses--
if(prob(5))
@@ -86,7 +117,7 @@
M.requests += O
if (dnatype == "se")
if(!block)
if (isblockon(getblock(dna, 27,3),27) && istype(M, /mob/living/carbon/human) )
if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human) )
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
log_attack("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)")
log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
@@ -94,7 +125,7 @@
// message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]")
log_attack("[key_name(user)] injected [key_name(M)] with the [name]")
else // Isolated injector
if (isblockon(getblock(dna, 1, 3), 1) && block == 27&& istype(M, /mob/living/carbon/human) )
if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) )
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)")
log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)")
@@ -117,7 +148,7 @@
user << "\red Apparently it didn't work."
return
if (dnatype == "se")
if (isblockon(getblock(dna, 27,3),27) && istype(M, /mob/living/carbon/human))
if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)")
log_game("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)")
else
@@ -148,7 +179,7 @@
name = "DNA-Injector (Hulk)"
desc = "This will make you big and strong, but give you a bad skin condition."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -158,7 +189,7 @@
name = "DNA-Injector (Anti-Hulk)"
desc = "Cures green skin."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -168,7 +199,7 @@
name = "DNA-Injector (Xray)"
desc = "Finally you can see what the Captain does."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 8
New()
..()
@@ -178,7 +209,7 @@
name = "DNA-Injector (Anti-Xray)"
desc = "It will make you see harder."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 8
New()
..()
@@ -188,7 +219,7 @@
name = "DNA-Injector (Fire)"
desc = "Gives you fire."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 10
New()
..()
@@ -198,7 +229,7 @@
name = "DNA-Injector (Anti-Fire)"
desc = "Cures fire."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 10
New()
..()
@@ -208,7 +239,7 @@
name = "DNA-Injector (Tele.)"
desc = "Super brain man!"
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 12
New()
..()
@@ -218,7 +249,7 @@
name = "DNA-Injector (Anti-Tele.)"
desc = "Will make you not able to control your mind."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 12
New()
..()
@@ -228,7 +259,7 @@
name = "DNA-Injector (No Breath)"
desc = "Hold your breath and count to infinity."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -238,7 +269,7 @@
name = "DNA-Injector (Anti-No Breath)"
desc = "Hold your breath and count to 100."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -248,7 +279,7 @@
name = "DNA-Injector (Remote View)"
desc = "Stare into the distance for a reason."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -258,7 +289,7 @@
name = "DNA-Injector (Anti-Remote View)"
desc = "Cures green skin."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -268,7 +299,7 @@
name = "DNA-Injector (Regeneration)"
desc = "Healthy but hungry."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -278,7 +309,7 @@
name = "DNA-Injector (Anti-Regeneration)"
desc = "Sickly but sated."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -288,7 +319,7 @@
name = "DNA-Injector (Increase Run)"
desc = "Running Man."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -298,7 +329,7 @@
name = "DNA-Injector (Anti-Increase Run)"
desc = "Walking Man."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -308,7 +339,7 @@
name = "DNA-Injector (Morph)"
desc = "A total makeover."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -318,7 +349,7 @@
name = "DNA-Injector (Anti-Morph)"
desc = "Cures identity crisis."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -328,7 +359,7 @@
name = "DNA-Injector (Cold)"
desc = "Feels a bit chilly."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -338,7 +369,7 @@
name = "DNA-Injector (Anti-Cold)"
desc = "Feels room-temperature."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -348,7 +379,7 @@
name = "DNA-Injector (No Prints)"
desc = "Better than a pair of budget insulated gloves."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -358,7 +389,7 @@
name = "DNA-Injector (Anti-No Prints)"
desc = "Not quite as good as a pair of budget insulated gloves."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -368,7 +399,7 @@
name = "DNA-Injector (Shock Immunity)"
desc = "Better than a pair of real insulated gloves."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -378,7 +409,7 @@
name = "DNA-Injector (Anti-Shock Immunity)"
desc = "Not quite as good as a pair of real insulated gloves."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -388,7 +419,7 @@
name = "DNA-Injector (Small Size)"
desc = "Makes you shrink."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -398,7 +429,7 @@
name = "DNA-Injector (Anti-Small Size)"
desc = "Makes you grow. But not too much."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -409,7 +440,7 @@
name = "DNA-Injector (Anti-Glasses)"
desc = "Toss away those glasses!"
dnatype = "se"
dna = "708"
dna = list(1)
//block = 1
New()
..()
@@ -419,7 +450,7 @@
name = "DNA-Injector (Glasses)"
desc = "Will make you need dorkish glasses."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 1
New()
..()
@@ -429,7 +460,7 @@
name = "DNA-Injector (Epi.)"
desc = "Shake shake shake the room!"
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 3
New()
..()
@@ -439,7 +470,7 @@
name = "DNA-Injector (Anti-Epi.)"
desc = "Will fix you up from shaking the room."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 3
New()
..()
@@ -449,7 +480,7 @@
name = "DNA-Injector (Anti-Cough)"
desc = "Will stop that awful noise."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 5
New()
..()
@@ -459,7 +490,7 @@
name = "DNA-Injector (Cough)"
desc = "Will bring forth a sound of horror from your throat."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 5
New()
..()
@@ -469,7 +500,7 @@
name = "DNA-Injector (Clumsy)"
desc = "Makes clumsy minions."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 6
New()
..()
@@ -479,7 +510,7 @@
name = "DNA-Injector (Anti-Clumy)"
desc = "Cleans up confusion."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 6
New()
..()
@@ -489,7 +520,7 @@
name = "DNA-Injector (Anti-Tour.)"
desc = "Will cure tourrets."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 7
New()
..()
@@ -499,7 +530,7 @@
name = "DNA-Injector (Tour.)"
desc = "Gives you a nasty case off tourrets."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 7
New()
..()
@@ -509,7 +540,7 @@
name = "DNA-Injector (Stutt.)"
desc = "Makes you s-s-stuttterrr"
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 9
New()
..()
@@ -519,7 +550,7 @@
name = "DNA-Injector (Anti-Stutt.)"
desc = "Fixes that speaking impairment."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 9
New()
..()
@@ -529,7 +560,7 @@
name = "DNA-Injector (Blind)"
desc = "Makes you not see anything."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 11
New()
..()
@@ -539,7 +570,7 @@
name = "DNA-Injector (Anti-Blind)"
desc = "ITS A MIRACLE!!!"
dnatype = "se"
dna = "708"
dna = list(1)
//block = 11
New()
..()
@@ -549,7 +580,7 @@
name = "DNA-Injector (Deaf)"
desc = "Sorry, what did you say?"
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 13
New()
..()
@@ -559,7 +590,7 @@
name = "DNA-Injector (Anti-Deaf)"
desc = "Will make you hear once more."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 13
New()
..()
@@ -569,7 +600,7 @@
name = "DNA-Injector (Halluctination)"
desc = "What you see isn't always what you get."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 2
New()
..()
@@ -579,7 +610,7 @@
name = "DNA-Injector (Anti-Hallucination)"
desc = "What you see is what you get."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 2
New()
..()
@@ -589,7 +620,7 @@
name = "DNA-Injector (Human > Monkey)"
desc = "Will make you a flea bag."
dnatype = "se"
dna = "FED"
dna = list(4090)
//block = 14
New()
..()
@@ -599,7 +630,7 @@
name = "DNA-Injector (Monkey > Human)"
desc = "Will make you...less hairy."
dnatype = "se"
dna = "708"
dna = list(1)
//block = 14
New()
..()

View File

@@ -1357,9 +1357,14 @@ mob/living/carbon/human/yank_out_object()
else
see_invisible = SEE_INVISIBLE_LIVING
//testing("Mutations = "+english_list(mutations))
mutations+=species.default_mutations
//testing("SpeciesMut + Mutations = "+english_list(mutations))
if(species.default_mutations.len>0)
var/needs_update=0
for(var/mutation in species.default_mutations)
if(!(mutation in mutations))
mutations.Add(mutation)
needs_update=1
if(needs_update)
check_mutations=1 // Can't check here or shit will happen. Bad shit.
spawn(0)
update_icons()

View File

@@ -57,4 +57,6 @@
var/mob/remoteview_target = null
var/meatleft = 3 //For chef item
var/meatleft = 3 //For chef item
var/check_mutations=0 // Check mutations on next life tick

View File

@@ -65,6 +65,12 @@
var/obj/location_as_object = loc
location_as_object.handle_internal_lifeform(src, 0)
if(check_mutations)
testing("Updating [src.real_name]'s mutations: "+english_list(mutations))
domutcheck(src,null)
update_mutations()
check_mutations=0
//Updates the number of stored chemicals for powers
handle_changeling()

View File

@@ -38,7 +38,7 @@
// For grays
var/max_hurt_damage = 5 // Max melee damage dealt + 5 if hulk
var/default_mutations = list()
var/list/default_mutations = list()
var/flags = 0 // Various specific features.

View File

@@ -392,7 +392,7 @@ Round Duration: [round(hours)]h [round(mins)]m<br>"}
new_character.dna.b_type = client.prefs.b_type
if(client.prefs.disabilities & DISABILITY_FLAG_NEARSIGHTED)
new_character.dna.struc_enzymes = setblock(new_character.dna.struc_enzymes,GLASSESBLOCK,toggledblock(getblock(new_character.dna.struc_enzymes,GLASSESBLOCK,3)),3)
new_character.dna.SetSEState(GLASSESBLOCK,1,1)
new_character.disabilities |= NEARSIGHTED
if(client.prefs.disabilities & DISABILITY_FLAG_FAT)
@@ -400,13 +400,15 @@ Round Duration: [round(hours)]h [round(mins)]m<br>"}
new_character.overeatduration = 600 // Max overeat
if(client.prefs.disabilities & DISABILITY_FLAG_EPILEPTIC)
new_character.dna.struc_enzymes = setblock(new_character.dna.struc_enzymes,EPILEPSYBLOCK,toggledblock(getblock(new_character.dna.struc_enzymes,EPILEPSYBLOCK,3)),3)
new_character.dna.SetSEState(EPILEPSYBLOCK,1,1)
new_character.disabilities |= EPILEPSY
if(client.prefs.disabilities & DISABILITY_FLAG_DEAF)
new_character.dna.struc_enzymes = setblock(new_character.dna.struc_enzymes,DEAFBLOCK,toggledblock(getblock(new_character.dna.struc_enzymes,DEAFBLOCK,3)),3)
new_character.dna.SetSEState(DEAFBLOCK,1,1)
new_character.sdisabilities |= DEAF
new_character.dna.UpdateSE()
new_character.key = key //Manually transfer the key to log them in
return new_character

View File

@@ -218,8 +218,7 @@
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.dna.check_integrity()
var/newdna = setblock(mob.dna.struc_enzymes,REMOTETALKBLOCK,toggledblock(getblock(mob.dna.struc_enzymes,REMOTETALKBLOCK,3)),3)
mob.dna.struc_enzymes = newdna
mob.dna.SetSEState(REMOTETALKBLOCK,1)
domutcheck(mob, null)
/datum/disease2/effect/mind