diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 0ed98732455..208f289f799 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -10,6 +10,8 @@ #define DNA_ON_LOWERBOUND 2 #define DNA_ON_UPPERBOUND 3 +#define DNA_DEFAULT_BOUNDS list(1,2049,2050,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 @@ -20,19 +22,19 @@ var/global/list/dna_activity_bounds[STRUCDNASIZE] 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_HAIR_R 1 +#define DNA_UI_HAIR_G 2 +#define DNA_UI_HAIR_B 3 +#define DNA_UI_BEARD_R 4 +#define DNA_UI_BEARD_G 5 +#define DNA_UI_BEARD_B 6 +#define DNA_UI_SKIN_TONE 7 +#define DNA_UI_EYES_R 8 +#define DNA_UI_EYES_G 9 +#define DNA_UI_EYES_B 10 +#define DNA_UI_GENDER 11 +#define DNA_UI_BEARD_STYLE 12 +#define DNA_UI_HAIR_STYLE 13 #define DNA_UI_LENGTH 13 // Update this or you WILL break shit. /proc/add_zero2(t, u) @@ -44,6 +46,12 @@ var/global/list/assigned_blocks[STRUCDNASIZE] temp1 = copytext(t,2,u+1) return temp1 +/proc/GetDNABounds(var/block) + var/list/BOUNDS=dna_activity_bounds[block] + if(!istype(BOUNDS)) + return DNA_DEFAULT_BOUNDS + return BOUNDS + /datum/dna // READ-ONLY, GETS OVERWRITTEN // DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE @@ -72,7 +80,7 @@ var/global/list/assigned_blocks[STRUCDNASIZE] /datum/dna/proc/ResetUIFrom(var/mob/living/carbon/human/character) // INITIALIZE! for(var/i=1,i<=DNA_UI_LENGTH,i++) - UI[i]=0 + UI[i]=1 // Hair // FIXME: Species-specific defaults pls if(!character.h_style) @@ -109,8 +117,8 @@ var/global/list/assigned_blocks[STRUCDNASIZE] // 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) + ASSERT(value>=0) + ASSERT(value<=4095) UI[block]=value if(defer) dirtyUI=1 @@ -124,7 +132,7 @@ var/global/list/assigned_blocks[STRUCDNASIZE] // 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) + ASSERT(maxvalue<=4095) var/range = round(4095 / maxvalue) if(value) SetUIValue(block,value * range - rand(1,range-1)) @@ -145,7 +153,7 @@ var/global/list/assigned_blocks[STRUCDNASIZE] SetUIValue(block,val,defer) /datum/dna/proc/GetUIBlock(var/block) - return EncodeBlockValue(GetUIValue(block)) + return EncodeDNABlock(GetUIValue(block)) // Do not use this unless you absolutely have to. /datum/dna/proc/SetUIBlock(var/block,var/value,var/defer=0) @@ -177,8 +185,8 @@ var/global/list/assigned_blocks[STRUCDNASIZE] // 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) + ASSERT(value>=0) + ASSERT(value<=4095) SE[block]=value if(defer) dirtySE=1 @@ -187,23 +195,23 @@ var/global/list/assigned_blocks[STRUCDNASIZE] // Get a DNA SE block's raw value. /datum/dna/proc/GetSEValue(var/block) - return UI[block] + return SE[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) + 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/list/BOUNDS=GetDNABounds(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/list/BOUNDS=GetDNABounds(block) var/val if(on) val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND]) @@ -212,7 +220,7 @@ var/global/list/assigned_blocks[STRUCDNASIZE] SetSEValue(block,val,defer) /datum/dna/proc/GetSEBlock(var/block) - return EncodeBlockValue(GetSEValue(block)) + return EncodeDNABlock(GetSEValue(block)) // Do not use this unless you absolutely have to. /datum/dna/proc/SetSEBlock(var/block,var/value,var/defer=0) @@ -232,19 +240,19 @@ var/global/list/assigned_blocks[STRUCDNASIZE] SetSEBlock(block,newBlock,defer) -/datum/dna/proc/EncodeBlockValue(var/value) +/proc/EncodeDNABlock(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) + unique_enzymes += EncodeDNABlock(block) dirtyUI=0 /datum/dna/proc/UpdateSE() struc_enzymes="" for(var/block in SE) - struc_enzymes += EncodeBlockValue(block) + struc_enzymes += EncodeDNABlock(block) dirtySE=0 // BACK-COMPAT! diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index e76862a9fe0..050544deee9 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -309,19 +309,19 @@ return return -/obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(var/buffer) +/obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(var/list/buffer) var/list/arr = list() - for(var/i = 1, i <= length(buffer)/3, i++) - arr += "[i]:[copytext(buffer,i*3-2,i*3+1)]" + for(var/i = 1, i <= buffer.len, i++) + arr += "[i]:[EncodeDNABlock(buffer[i])]" return arr -/obj/machinery/computer/scan_consolenew/proc/setInjectorBlock(var/obj/item/weapon/dnainjector/I, var/blk, var/buffer) +/obj/machinery/computer/scan_consolenew/proc/setInjectorBlock(var/obj/item/weapon/dnainjector/I, var/blk, var/list/buffer) var/pos = findtext(blk,":") if(!pos) return 0 var/id = text2num(copytext(blk,1,pos)) if(!id) return 0 I.block = id - I.dna = copytext(buffer,id*3-2,id*3+1) + I.dna = list(buffer[id]) return 1 /obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob) @@ -721,7 +721,7 @@ if (bufferOption == "saveUI") if(src.connected.occupant && src.connected.occupant.dna) src.buffers[bufferId]["ue"] = 0 - src.buffers[bufferId]["data"] = src.connected.occupant.dna.uni_identity + src.buffers[bufferId]["data"] = src.connected.occupant.dna.UI if (!istype(src.connected.occupant,/mob/living/carbon/human)) src.buffers[bufferId]["owner"] = src.connected.occupant.name else @@ -732,7 +732,7 @@ if (bufferOption == "saveUIAndUE") if(src.connected.occupant && src.connected.occupant.dna) - src.buffers[bufferId]["data"] = src.connected.occupant.dna.uni_identity + src.buffers[bufferId]["data"] = src.connected.occupant.dna.UI if (!istype(src.connected.occupant,/mob/living/carbon/human)) src.buffers[bufferId]["owner"] = src.connected.occupant.name else @@ -745,7 +745,7 @@ if (bufferOption == "saveSE") if(src.connected.occupant && src.connected.occupant.dna) src.buffers[bufferId]["ue"] = 0 - src.buffers[bufferId]["data"] = src.connected.occupant.dna.struc_enzymes + src.buffers[bufferId]["data"] = src.connected.occupant.dna.SE if (!istype(src.connected.occupant,/mob/living/carbon/human)) src.buffers[bufferId]["owner"] = src.connected.occupant.name else @@ -784,10 +784,12 @@ if (src.buffers[bufferId]["ue"]) src.connected.occupant.real_name = src.buffers[bufferId]["owner"] src.connected.occupant.name = src.buffers[bufferId]["owner"] - src.connected.occupant.dna.uni_identity = src.buffers[bufferId]["data"] + src.connected.occupant.dna.UI = src.buffers[bufferId]["data"] + src.connected.occupant.dna.UpdateUI() updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) else if (src.buffers[bufferId]["type"] == "se") - src.connected.occupant.dna.struc_enzymes = src.buffers[bufferId]["data"] + src.connected.occupant.dna.SE = src.buffers[bufferId]["data"] + src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) src.connected.occupant.radiation += rand(20,50) return 1 diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index b591359b7c8..52d405bcb48 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -1,6 +1,6 @@ -/proc/getAssignedBlock(var/name,var/list/blocksLeft, var/activity_bounds=list(1,2049,2050,4095)) +/proc/getAssignedBlock(var/name,var/list/blocksLeft, var/activity_bounds=DNA_DEFAULT_BOUNDS) var/assigned = pick(blocksLeft) blocksLeft.Remove(assigned) assigned_blocks[assigned]=name diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index d48edb8850e..40407bd42a5 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -28,7 +28,7 @@ selblock=1 else real_block=selblock - var/list/BOUNDS = dna_activity_bounds[real_block] + var/list/BOUNDS = GetDNABounds(real_block) return dna[selblock] > BOUNDS[DNA_ON_LOWERBOUND] /obj/item/weapon/dnainjector/proc/SetState(var/on, var/selblock=0) @@ -38,7 +38,7 @@ selblock=1 else real_block=selblock - var/list/BOUNDS=dna_activity_bounds[real_block] + var/list/BOUNDS=GetDNABounds(real_block) var/val if(on) val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND])