mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
DNA2: New powers from Paradise's release of Goon's genetic code. Also added lisp disability.
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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)":""]!")
|
||||
|
||||
@@ -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")
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -136,7 +136,7 @@ var/global/floorIsLava = 0
|
||||
body += "<br><br>"
|
||||
body += "<b>DNA Blocks:</b><br><table border='0'><tr><th> </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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user