DNA2: New powers from Paradise's release of Goon's genetic code. Also added lisp disability.

This commit is contained in:
Rob Nelson
2014-01-19 19:13:37 -08:00
parent c8246e2a06
commit b523448a19
17 changed files with 198 additions and 45 deletions

View File

@@ -200,6 +200,8 @@
#include "code\game\dna\dna_modifier.dm"
#include "code\game\dna\genes\disabilities.dm"
#include "code\game\dna\genes\gene.dm"
#include "code\game\dna\genes\goon_disabilities.dm"
#include "code\game\dna\genes\goon_powers.dm"
#include "code\game\dna\genes\monkey.dm"
#include "code\game\dna\genes\powers.dm"
#include "code\game\gamemodes\events.dm"

View File

@@ -16,17 +16,6 @@
#define DNA_HARDER_BOUNDS list(1,3049,3050,4095)
#define DNA_HARD_BOUNDS list(1,3490,3500,4095)
// 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 and species stuff on /vg/, mostly)
var/global/list/assigned_blocks[STRUCDNASIZE]
var/global/list/datum/dna/gene/dna_genes[0]
// UI Indices (can change to mutblock style, if desired)
#define DNA_UI_HAIR_R 1
#define DNA_UI_HAIR_G 2
@@ -43,6 +32,19 @@ var/global/list/datum/dna/gene/dna_genes[0]
#define DNA_UI_HAIR_STYLE 13
#define DNA_UI_LENGTH 13 // Update this when you add something, or you WILL break shit.
#define DNA_SE_LENGTH 50 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
// 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[DNA_SE_LENGTH]
// Used to determine what each block means (admin hax and species stuff on /vg/, mostly)
var/global/list/assigned_blocks[DNA_SE_LENGTH]
var/global/list/datum/dna/gene/dna_genes[0]
/////////////////
// GENE DEFINES
/////////////////
@@ -64,7 +66,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
// Okay to read, but you're an idiot if you do.
// BLOCK = VALUE
var/list/SE[STRUCDNASIZE]
var/list/SE[DNA_SE_LENGTH]
var/list/UI[DNA_UI_LENGTH]
// From old dna.
@@ -84,7 +86,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
new_dna.mutantrace=mutantrace
new_dna.real_name=real_name
new_dna.species=species
for(var/b=1;b<=STRUCDNASIZE;b++)
for(var/b=1;b<=DNA_SE_LENGTH;b++)
new_dna.SE[b]=SE[b]
if(b<=DNA_UI_LENGTH)
new_dna.UI[b]=UI[b]
@@ -224,7 +226,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
// "Zeroes out" all of the blocks.
/datum/dna/proc/ResetSE()
for(var/i = 1, i <= STRUCDNASIZE, i++)
for(var/i = 1, i <= DNA_SE_LENGTH, i++)
SetSEValue(i,rand(1,1024),1)
UpdateSE()
@@ -335,7 +337,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
if(UI.len != DNA_UI_LENGTH)
ResetUIFrom(character)
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
if(length(struc_enzymes)!= 3*DNA_SE_LENGTH)
ResetSE()
if(length(unique_enzymes) != 32)
@@ -343,7 +345,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
else
if(length(uni_identity) != 3*DNA_UI_LENGTH)
uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4"
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
if(length(struc_enzymes)!= 3*DNA_SE_LENGTH)
struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
// BACK-COMPAT!
@@ -354,5 +356,4 @@ var/global/list/datum/dna/gene/dna_genes[0]
ResetSE()
unique_enzymes = md5(character.real_name)
reg_dna[unique_enzymes] = character.real_name
reg_dna[unique_enzymes] = character.real_name

View File

@@ -38,7 +38,7 @@
/proc/randmuti(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
M.dna.SetUIValue(rand(1,UNIDNASIZE),rand(1,4095))
M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095))
// Scramble UI or SE.
/proc/scramble(var/UI, var/mob/M, var/prob)
@@ -52,7 +52,7 @@
M.UpdateAppearance()
else
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
for(var/i = 1, i <= DNA_SE_LENGTH-1, i++)
if(prob(prob))
M.dna.SetSEValue(i,rand(1,4095),1)
M.dna.UpdateSE()

View File

@@ -707,7 +707,7 @@
if (href_list["selectSEBlock"] && href_list["selectSESubblock"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
var/select_block = text2num(href_list["selectSEBlock"])
var/select_subblock = text2num(href_list["selectSESubblock"])
if ((select_block <= STRUCDNASIZE) && (select_block >= 1))
if ((select_block <= DNA_SE_LENGTH) && (select_block >= 1))
src.selected_se_block = select_block
if ((select_subblock <= DNA_BLOCK_SIZE) && (select_subblock >= 1))
src.selected_se_subblock = select_subblock
@@ -735,9 +735,9 @@
var/real_SE_block=selected_se_block
block = miniscramble(block, src.radiation_intensity, src.radiation_duration)
if(prob(20))
if (src.selected_se_block > 1 && src.selected_se_block < STRUCDNASIZE/2)
if (src.selected_se_block > 1 && src.selected_se_block < DNA_SE_LENGTH/2)
real_SE_block++
else if (src.selected_se_block > STRUCDNASIZE/2 && src.selected_se_block < STRUCDNASIZE)
else if (src.selected_se_block > DNA_SE_LENGTH/2 && src.selected_se_block < DNA_SE_LENGTH)
real_SE_block--
//testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!")

View File

@@ -125,4 +125,18 @@
disability=NEARSIGHTED
New()
block=GLASSESBLOCK
block=GLASSESBLOCK
/datum/dna/gene/disability/lisp
name = "Lisp"
desc = "I wonder wath thith doeth."
activation_message = "Thomething doethn't feel right."
deactivation_message = "You now feel able to pronounce consonants."
New()
..()
block=LISPBLOCK
OnSay(var/mob/M, var/message)
return replacetext(replacetext(message,"S","TH"),"s","th")

View File

@@ -23,6 +23,12 @@
// Any of a number of GENE_ flags.
var/flags=0
/**
* Is the gene active in this mob's DNA?
*/
/datum/dna/gene/proc/is_active(var/mob/M)
return M.active_genes && type in M.active_genes
// Return 1 if we can activate.
// HANDLE MUTCHK_FORCED HERE!
/datum/dna/gene/proc/can_activate(var/mob/M, var/flags)
@@ -32,11 +38,43 @@
/datum/dna/gene/proc/activate(var/mob/M, var/connected, var/flags)
return
// Called when the gene deactivates. Undo your magic here.
// Only called when the block is deactivated.
/**
* Called when the gene deactivates. Undo your magic here.
* Only called when the block is deactivated.
*/
/datum/dna/gene/proc/deactivate(var/mob/M, var/connected, var/flags)
return
// This section inspired by goone's bioEffects.
/**
* Called in each life() tick.
*/
/datum/dna/gene/proc/OnMobLife(var/mob/M)
return
/**
* Called when the mob dies
*/
/datum/dna/gene/proc/OnMobDeath(var/mob/M)
return
/**
* Called when the mob says shit
*/
/datum/dna/gene/proc/OnSay(var/mob/M, var/message)
return message
/**
* Called after the mob runs update_icons.
*
* @params M The subject.
* @params g Gender (m or f)
* @params fat Fat? (0 or 1)
*/
/datum/dna/gene/proc/OnDrawUnderlays(var/mob/M, var/g, var/fat)
return 0
/////////////////////
// BASIC GENES

View File

@@ -78,6 +78,9 @@
if(probinj(_prob,(flags&MUTCHK_FORCED)))
return 1
OnDrawUnderlays(var/mob/M,var/g,var/fat)
return "cold[fat]_s"
/datum/dna/gene/basic/cold_resist
name="Cold Resistance"
activation_messages=list("Your body is filled with warmth.")
@@ -87,7 +90,6 @@
block=FIREBLOCK
can_activate(var/mob/M,var/flags)
// Probability check
var/_prob=30
if(mHeatres in M.mutations)
@@ -95,6 +97,9 @@
if(probinj(_prob,(flags&MUTCHK_FORCED)))
return 1
OnDrawUnderlays(var/mob/M,var/g,var/fat)
return "fire[fat]_s"
/datum/dna/gene/basic/noprints
name="No Prints"
activation_messages=list("Your fingers feel numb.")
@@ -143,6 +148,22 @@
return 0
return ..(M,flags)
OnDrawUnderlays(var/mob/M,var/g,var/fat)
if(fat)
return "hulk_[fat]_s"
else
return "hulk_[g]_s"
return 0
OnMobLife(var/mob/living/carbon/human/M)
if(!istype(M)) return
if(M.health <= 25)
M.mutations.Remove(HULK)
M.update_mutations() //update our mutation overlays
M << "\red You suddenly feel very weak."
M.Weaken(3)
M.emote("collapse")
/datum/dna/gene/basic/xray
name="X-Ray Vision"
activation_messages=list("The walls suddenly disappear.")
@@ -158,4 +179,7 @@
activation_prob=15
New()
block=TELEBLOCK
block=TELEBLOCK
OnDrawUnderlays(var/mob/M,var/g,var/fat)
return "telekinesishead[fat]_s"

View File

@@ -18,7 +18,7 @@
// SE blocks to assign.
var/list/numsToAssign=new()
for(var/i=1;i<STRUCDNASIZE;i++)
for(var/i=1;i<DNA_SE_LENGTH;i++)
numsToAssign += i
//testing("Assigning DNA blocks:")
@@ -52,8 +52,31 @@
SHOCKIMMUNITYBLOCK = getAssignedBlock("SHOCKIMMUNITY", numsToAssign)
SMALLSIZEBLOCK = getAssignedBlock("SMALLSIZE", numsToAssign, DNA_HARD_BOUNDS)
//
// Goon muts
/////////////////////////////////////////////
// Disabilities
LISPBLOCK = getAssignedBlock("LISP", numsToAssign)
MUTEBLOCK = getAssignedBlock("MUTE", numsToAssign)
RADBLOCK = getAssignedBlock("RAD", numsToAssign)
FATBLOCK = getAssignedBlock("FAT", numsToAssign)
STUTTERBLOCK = getAssignedBlock("STUTTER", numsToAssign)
CHAVBLOCK = getAssignedBlock("CHAV", numsToAssign)
SWEDEBLOCK = getAssignedBlock("SWEDE", numsToAssign)
SCRAMBLEBLOCK = getAssignedBlock("SCRAMBLE", numsToAssign)
TOXICFARTBLOCK = getAssignedBlock("TOXICFART", numsToAssign)
STRONGBLOCK = getAssignedBlock("STRONG", numsToAssign)
HORNSBLOCK = getAssignedBlock("HORNS", numsToAssign)
// Powers
SOBERBLOCK = getAssignedBlock("SOBER", numsToAssign)
PSYRESISTBLOCK = getAssignedBlock("PSYRESIST", numsToAssign, DNA_HARD_BOUNDS)
SHADOWBLOCK = getAssignedBlock("SHADOW", numsToAssign, DNA_HARDER_BOUNDS)
CHAMELEONBLOCK = getAssignedBlock("CHAMELEON", numsToAssign, DNA_HARDER_BOUNDS)
// And the genes that actually do the work. (domutcheck improvements)
var/list/blocks_assigned[STRUCDNASIZE]
var/list/blocks_assigned[DNA_SE_LENGTH]
for(var/gene_type in typesof(/datum/dna/gene))
var/datum/dna/gene/G = new gene_type
if(G.block)
@@ -76,7 +99,7 @@
if(species.default_block_names.len>0)
testing("Setting up genetics for [species.name] (needs [english_list(species.default_block_names)])")
species.default_blocks.Cut()
for(var/block=1;block<STRUCDNASIZE;block++)
for(var/block=1;block<DNA_SE_LENGTH;block++)
if(assigned_blocks[block] in species.default_block_names)
testing(" Found [assigned_blocks[block]] ([block])")
species.default_blocks.Add(block)

View File

@@ -76,7 +76,7 @@
Initialize()
buf.types=DNA2_BUF_SE
var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4)
for(var/i=new_SE.len;i<=STRUCDNASIZE;i++)
for(var/i=new_SE.len;i<=DNA_SE_LENGTH;i++)
new_SE += rand(1,1024)
buf.dna.SE=new_SE
buf.dna.SetSEValue(MONKEYBLOCK,0xFFF)

View File

@@ -154,6 +154,8 @@
//..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak
return
/obj/machinery/door/window/attack_ghost(mob/user as mob)
return
/obj/machinery/door/window/attack_ai(mob/user as mob)
src.add_hiddenprint(user)

View File

@@ -65,6 +65,28 @@ var/NOPRINTSBLOCK = 0
var/SHOCKIMMUNITYBLOCK = 0
var/SMALLSIZEBLOCK = 0
///////////////////////////////
// Goon Stuff
///////////////////////////////
// Disabilities
var/LISPBLOCK = 0
var/MUTEBLOCK = 0
var/RADBLOCK = 0
var/FATBLOCK = 0
var/STUTTERBLOCK = 0
var/CHAVBLOCK = 0
var/SWEDEBLOCK = 0
var/SCRAMBLEBLOCK = 0
var/TOXICFARTBLOCK = 0
var/STRONGBLOCK = 0
var/HORNSBLOCK = 0
// Powers
var/SOBERBLOCK = 0
var/PSYRESISTBLOCK = 0
var/SHADOWBLOCK = 0
var/CHAMELEONBLOCK = 0
var/skipupdate = 0
///////////////
var/eventchance = 10 //% per 5 mins

View File

@@ -136,7 +136,7 @@ var/global/floorIsLava = 0
body += "<br><br>"
body += "<b>DNA Blocks:</b><br><table border='0'><tr><th>&nbsp;</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th>"
var/bname
for(var/block=1;block<STRUCDNASIZE;block++)
for(var/block=1;block<DNA_SE_LENGTH;block++)
if(((block-1)%5)==0)
body += "</tr><tr><th>[block-1]</th>"
bname = assigned_blocks[block]

View File

@@ -253,12 +253,12 @@
if((mHeatres in mutations) || (prob(1)))
heal_organ_damage(0,1)
if ((HULK in mutations) && health <= 25)
mutations.Remove(HULK)
update_mutations() //update our mutation overlays
src << "\red You suddenly feel very weak."
Weaken(3)
emote("collapse")
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
continue
if(gene.is_active(src))
gene.OnMobLife(src)
if (radiation)
if (radiation > 100)
@@ -977,7 +977,10 @@
overeatduration++
else
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
if(M_OBESITY in mutations)
overeatduration -= 1 // Those with obesity gene take twice as long to unfat
else
overeatduration -= 2
if(species.flags & REQUIRE_LIGHT)
if(nutrition < 200)

View File

@@ -18,7 +18,15 @@
if (copytext(message, 1, 2) != "*")
return
/*if(dna)
if(dna)
if(length(message) >= 2)
if (copytext(message, 1, 2) != "*" && department_radio_keys[copytext(message, 1, 3)] != "changeling")
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
continue
if(gene.is_active(src))
message = gene.OnSay(src,message)
/*
if(dna.mutantrace == "lizard")
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))

View File

@@ -366,8 +366,17 @@ proc/get_damage_icon_part(damage_state, body_part)
var/add_image = 0
var/g = "m"
if(gender == FEMALE) g = "f"
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
continue
if(gene.is_active(src))
var/underlay=gene.OnDrawUnderlays(src,g,fat)
if(underlay)
standing.underlays += underlay
add_image = 1
for(var/mut in mutations)
switch(mut)
/*
if(HULK)
if(fat)
standing.underlays += "hulk_[fat]_s"
@@ -383,6 +392,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(TK)
standing.underlays += "telekinesishead[fat]_s"
add_image = 1
*/
if(LASER)
standing.overlays += "lasereyes_s"
add_image = 1

View File

@@ -308,9 +308,6 @@ var/MAX_EXPLOSION_RANGE = 14
// mob/var/list/mutations
#define STRUCDNASIZE 27
#define UNIDNASIZE 13
// Used in preferences.
#define DISABILITY_FLAG_NEARSIGHTED 1
#define DISABILITY_FLAG_FAT 2
@@ -359,6 +356,13 @@ var/MAX_EXPLOSION_RANGE = 14
#define mShock 109 // insulated hands
#define mSmallsize 110 // table climbing
// Goon muts
#define M_OBESITY 200
#define M_TOXIC_FARTS 201
#define M_STRONG 202
#define M_SOBER 203
#define M_PSY_RESIST 204
//disabilities
#define NEARSIGHTED 1
#define EPILEPSY 2

View File

@@ -76,10 +76,12 @@
<!-- Suggestion: Group changes not merged into master into a single [IN DEVELOPMENT] block, then change the date to today before merging. Makes the changes from the last release a bit easier to comprehend. -->
<div class="commit sansserif">
<h2 class="date">2014.01.17</h2>
<h2 class="date">In development</h2>
<h3 class="author">N3X15 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Ghosts can no longer interact with an object if it's blessed with holy water.</li>
<li class="rscadd">Humans now have two ears.</li>
<li class="rscadd">Genetics has a vast new array of powers and disabilities, and nearly twice as many blocks to contend with.</li>
<li class="bugfix">Magboots can be stored in Suit Storage Units.</li>
</ul>
</div>