diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index c7c5f812122..81b85632f65 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -39,13 +39,15 @@ //Save original dna for when the disease is cured. src.original_dna["name"] = affected_mob.real_name - src.original_dna["UI"] = affected_mob.dna.uni_identity - src.original_dna["SE"] = affected_mob.dna.struc_enzymes + src.original_dna["UI"] = affected_mob.dna.UI + src.original_dna["SE"] = affected_mob.dna.SE affected_mob << "\red You don't feel like yourself.." - affected_mob.dna.uni_identity = strain_data["UI"] - updateappearance(affected_mob, affected_mob.dna.uni_identity) - affected_mob.dna.struc_enzymes = strain_data["SE"] + affected_mob.dna.UI = strain_data["UI"] + affected_mob.dna.UpdateUI() + affected_mob.UpdateAppearance() + affected_mob.dna.SE = strain_data["SE"] + affected_mob.dna.UpdateSE() affected_mob.real_name = strain_data["name"] domutcheck(affected_mob) @@ -56,9 +58,11 @@ /datum/disease/dnaspread/Del() if ((original_dna["name"]) && (original_dna["UI"]) && (original_dna["SE"])) - affected_mob.dna.uni_identity = original_dna["UI"] - updateappearance(affected_mob, affected_mob.dna.uni_identity) - affected_mob.dna.struc_enzymes = original_dna["SE"] + affected_mob.dna.UI = original_dna["UI"] + affected_mob.dna.UpdateUI() + affected_mob.UpdateAppearance() + affected_mob.dna.SE = original_dna["SE"] + affected_mob.dna.UpdateSE() affected_mob.real_name = original_dna["name"] affected_mob << "\blue You feel more like yourself." diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c2c12ce8e7c..7f630c9bb26 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -764,7 +764,7 @@ datum/mind else current.dna = changeling.absorbed_dna[1] current.real_name = current.dna.real_name - updateappearance(current, current.dna.uni_identity) + current.UpdateAppearance() domutcheck(current, null) else if (href_list["vampire"]) diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index dd5d2a5edb4..3dd09fa8728 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -81,6 +81,7 @@ plant_type = 2 growthstages = 3 + /obj/item/seeds/grapeseed name = "pack of grape seeds" desc = "These seeds grow into grape vines." @@ -761,6 +762,43 @@ growthstages = 3 plant_type = 1 +/obj/item/seeds/moonflowerseed + name = "pack of moonflower seeds" + desc = "These seeds grow into moonflowers." + icon_state = "seed-moonflower" + mypath = "/obj/item/seeds/moonflowerseed" + species = "moonflower" + plantname = "Moonflowers" + productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/moonflower" + lifespan = 25 + endurance = 20 + maturation = 6 + production = 2 + yield = 2 + potency = 15 + oneharvest = 1 + growthstages = 3 + plant_type = 0 + +/obj/item/seeds/novaflowerseed + name = "pack of novaflower seeds" + desc = "These seeds grow into novaflowers." + icon_state = "seed-novaflower" + mypath = "/obj/item/seeds/novaflowerseed" + species = "novaflower" + plantname = "Novaflowers" + productname = "/obj/item/weapon/grown/novaflower" + lifespan = 25 + endurance = 20 + maturation = 6 + production = 2 + yield = 2 + potency = 20 + oneharvest = 1 + growthstages = 3 + plant_type = 0 + + /obj/item/seeds/brownmold name = "pack of brown mold" desc = "Eww.. moldy." diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 208f289f799..1b52ab4098c 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -77,10 +77,16 @@ var/global/list/assigned_blocks[STRUCDNASIZE] // UNIQUE IDENTITY /////////////////////////////////////// +// Create random UI. +/datum/dna/proc/ResetUI(var/defer=0) + for(var/i=1,i<=DNA_UI_LENGTH,i++) + UI[i]=rand(0,4095) + if(!defer) + UpdateUI() + /datum/dna/proc/ResetUIFrom(var/mob/living/carbon/human/character) // INITIALIZE! - for(var/i=1,i<=DNA_UI_LENGTH,i++) - UI[i]=1 + ResetUI(1) // Hair // FIXME: Species-specific defaults pls if(!character.h_style) @@ -224,7 +230,9 @@ var/global/list/assigned_blocks[STRUCDNASIZE] // 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) + var/nval=hex2num(value) + testing("SetSESBlock([block],[value],[defer]): [value] -> [nval]") + return SetSEValue(block,nval,defer) /datum/dna/proc/GetSESubBlock(var/block,var/subBlock) return copytext(GetSEBlock(block),subBlock,subBlock+1) @@ -250,9 +258,12 @@ var/global/list/assigned_blocks[STRUCDNASIZE] dirtyUI=0 /datum/dna/proc/UpdateSE() + var/oldse=struc_enzymes struc_enzymes="" for(var/block in SE) struc_enzymes += EncodeDNABlock(block) + testing("Old SE: [oldse]") + testing("New SE: [struc_enzymes]") dirtySE=0 // BACK-COMPAT! diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 4910a9cf011..dd7510ce95e 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -28,7 +28,7 @@ if(prob(prob)) M.dna.SetUIValue(i,rand(1,4095),1) M.dna.UpdateUI() - updateappearance(M, M.dna.uni_identity) + M.UpdateAppearance() else for(var/i = 1, i <= STRUCDNASIZE-1, i++) @@ -99,11 +99,17 @@ return output +// /proc/updateappearance has changed behavior, so it's been removed +// Use mob.UpdateAppearance() instead. -/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 +// Simpler. Don't specify UI in order for the mob to use its own. +/mob/proc/UpdateAppearance(var/list/UI=null) + if(istype(src, /mob/living/carbon/human)) + if(UI!=null) + src.dna.UI=UI + src.dna.UpdateUI() + dna.check_integrity() + var/mob/living/carbon/human/H = src 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) @@ -418,7 +424,7 @@ else O.real_name = randomname i++ - updateappearance(O,O.dna.uni_identity) + O.UpdateAppearance() O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) O.adjustToxLoss(M.getToxLoss()) O.adjustOxyLoss(M.getOxyLoss()) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 050544deee9..e49f243aabd 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -591,7 +591,7 @@ if (prob((80 + (src.radiation_duration / 2)))) block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration) 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.UpdateAppearance() src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) else if (prob(20+src.radiation_intensity)) @@ -599,7 +599,7 @@ domutcheck(src.connected.occupant,src.connected) else randmuti(src.connected.occupant) - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) + src.connected.occupant.UpdateAppearance() src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -630,9 +630,9 @@ return 1 // return 1 forces an update to all Nano uis attached to src if (href_list["pulseSERadiation"]) - var/block - var/oldblock - block = src.connected.occupant.dna.GetSESubBlock(src.selected_se_block,src.selected_se_subblock) + var/block = src.connected.occupant.dna.GetSESubBlock(src.selected_se_block,src.selected_se_subblock) + var/original_block=block + testing("Irradiating SE block [src.selected_se_block]:[src.selected_se_subblock] ([block])...") irradiating = src.radiation_duration var/lock_state = src.connected.locked @@ -646,30 +646,26 @@ 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) + //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20)) + 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) - src.selected_se_block++ + real_SE_block++ else if (src.selected_se_block > STRUCDNASIZE/2 && src.selected_se_block < STRUCDNASIZE) - src.selected_se_block-- - 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) - 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) + 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)":""]!") + 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 if (prob(80-src.radiation_duration)) randmutb(src.connected.occupant) domutcheck(src.connected.occupant,src.connected) else randmuti(src.connected.occupant) - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) + src.connected.occupant.UpdateAppearance() src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -786,7 +782,7 @@ src.connected.occupant.name = src.buffers[bufferId]["owner"] src.connected.occupant.dna.UI = src.buffers[bufferId]["data"] src.connected.occupant.dna.UpdateUI() - updateappearance(src.connected.occupant,src.connected.occupant.dna.uni_identity) + src.connected.occupant.UpdateAppearance() else if (src.buffers[bufferId]["type"] == "se") src.connected.occupant.dna.SE = src.buffers[bufferId]["data"] src.connected.occupant.dna.UpdateSE() diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 8e1640e9056..6a45fbc0119 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -191,7 +191,7 @@ src.dna = chosen_dna src.real_name = chosen_dna.real_name src.flavor_text = "" - updateappearance(src, src.dna.uni_identity) + src.UpdateAppearance() domutcheck(src, null) src.verbs -= /mob/proc/changeling_transform @@ -335,7 +335,7 @@ O.loc = C.loc - updateappearance(O,O.dna.uni_identity) + O.UpdateAppearance() domutcheck(O, null) O.setToxLoss(C.getToxLoss()) O.adjustBruteLoss(C.getBruteLoss()) @@ -733,7 +733,7 @@ var/list/datum/dna/hivemind_bank = list() T.visible_message("[T] transforms!") T.dna = chosen_dna T.real_name = chosen_dna.real_name - updateappearance(T, T.dna.uni_identity) + T.UpdateAppearance() domutcheck(T, null) feedback_add_details("changeling_powers","TS") return 1 diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 5934fabe807..091c7148fc5 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -116,7 +116,7 @@ //Clonepod //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace) +/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/list/ui, var/list/se, var/mindref, var/datum/species/mrace) if(mess || attempting) return 0 var/datum/mind/clonemind = locate(mindref) @@ -184,10 +184,10 @@ H.dna = new /datum/dna() H.dna.real_name = H.real_name if(ui) - H.dna.uni_identity = ui - updateappearance(H, ui) + H.UpdateAppearance(ui) if(se) - H.dna.struc_enzymes = se + H.dna.SE = se + H.dna.UpdateSE() randmutb(H) //Sometimes the clones come out wrong. H.f_style = "Shaved" @@ -274,6 +274,8 @@ src.locked = 0 src.go_out() return + +//Removing cloning pod biomass else if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat)) user << "\blue \The [src] processes \the [W]." biomass += 50 @@ -437,4 +439,4 @@ /* EMP grenade/spell effect if(istype(A, /obj/machinery/clonepod)) A:malfunction() -*/ \ No newline at end of file +*/ diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index 57826586435..304a84df5aa 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -937,6 +937,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) parent.update_tray() + /obj/machinery/hydroponics/proc/update_tray(mob/user = usr) harvest = 0 lastproduce = age diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 40407bd42a5..6dbdd346e79 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -56,32 +56,23 @@ if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed if (dnatype == "ui") if (!block) //isolated block? + M.UpdateAppearance(dna) if (ue) //unique enzymes? yes - 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.UI = dna - M.dna.UpdateUI() - updateappearance(M, M.dna.uni_identity) - uses-- + uses-- else M.dna.SetUIValue(block,src.GetValue()) - updateappearance(M, M.dna.uni_identity) + M.UpdateAppearance() uses-- if (dnatype == "se") if (!block) //isolated block? M.dna.SE = dna M.dna.UpdateSE() - domutcheck(M, null) - uses-- else - M.dna.SetUIValue(block,src.GetValue()) - domutcheck(M, null,1) - uses-- + M.dna.SetSEValue(block,src.GetValue()) + domutcheck(M, null, block!=null) + uses-- if(prob(5)) trigger_side_effect(M) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 7a69c72c8c6..abafd99b4da 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -325,9 +325,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if(record_found)//Pull up their name from database records if they did have a mind. new_character.dna = new()//Let's first give them a new DNA. new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity. - new_character.dna.struc_enzymes = record_found.fields["enzymes"]//This is the default of enzymes so I think it's safe to go with. - new_character.dna.uni_identity = record_found.fields["identity"]//DNA identity is carried over. - updateappearance(new_character,new_character.dna.uni_identity)//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch. + new_character.dna.SE = record_found.fields["enzymes"]//This is the default of enzymes so I think it's safe to go with. + new_character.dna.UpdateSE() + new_character.dna.UI = record_found.fields["identity"]//DNA identity is carried over. + new_character.dna.UpdateUI() + new_character.UpdateAppearance()//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch. else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile. new_character.dna.ready_dna(new_character) @@ -918,4 +920,4 @@ Traitors and the like can also be revived with the previous role mostly intact. config.allow_random_events = 0 usr << "Random events disabled" message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1) - feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file + feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 5d1c095e93c..e5432e7b7c3 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -47,8 +47,10 @@ gender = pick(MALE, FEMALE) dna = new /datum/dna( null ) dna.real_name = real_name - dna.uni_identity = "00600200A00E0110148FC01300B009" - dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" + dna.ResetSE() + dna.ResetUI() + //dna.uni_identity = "00600200A00E0110148FC01300B009" + //dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" dna.unique_enzymes = md5(name) //////////blah var/gendervar diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index dae005bbf8a..d2a1b269bf8 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -30,8 +30,11 @@ O = new species.primitive(loc) O.dna = dna - O.dna.uni_identity = "000000000000000000DC00000660004DA0A0E00" - O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8" + dna = null + //O.dna.uni_identity = "00600200A00E0110148FC01300B009" + //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8" + O.dna.SetSEState(MONKEYBLOCK,1) + O.loc = loc O.viruses = viruses O.a_intent = "harm" diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 14e1ab91511..15f496f8fdb 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1134,7 +1134,7 @@ datum else randmutg(M) domutcheck(M, null) - updateappearance(M,M.dna.uni_identity) + M.UpdateAppearance() return on_mob_life(var/mob/living/M as mob) if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.