diff --git a/code/__DEFINES.dm b/code/__DEFINES.dm
index 997dd321621..d2569112409 100644
--- a/code/__DEFINES.dm
+++ b/code/__DEFINES.dm
@@ -456,4 +456,13 @@ var/list/be_special_flags = list(
#define DNA_HAIR_STYLE_BLOCK 7
#define DNA_STRUC_ENZYMES_BLOCKS 14
-#define DNA_UNIQUE_ENZYMES_LEN 32
\ No newline at end of file
+#define DNA_UNIQUE_ENZYMES_LEN 32
+
+//Transformation proc stuff
+#define TR_KEEPITEMS 1
+#define TR_KEEPVIRUS 2
+#define TR_KEEPDAMAGE 4
+#define TR_HASHNAME 8 // hashing names (e.g. monkey(e34f)) (only in monkeyize)
+#define TR_KEEPIMPLANTS 16
+#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey
+#define TR_DEFAULTMSG 64
\ No newline at end of file
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index e403fb402e3..7950463b507 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -649,6 +649,20 @@ client
if("left") A.dir = turn(A.dir, 45)
href_list["datumrefresh"] = href_list["rotatedatum"]
+ else if(href_list["makehuman"])
+ if(!check_rights(0)) return
+
+ var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
+ if(!istype(Mo))
+ usr << "This can only be done to instances of type /mob/living/carbon/monkey"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!Mo)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("humanone"=href_list["makehuman"]))
+
else if(href_list["makemonkey"])
if(!check_rights(0)) return
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index cbd1d07eade..b44b945cf7b 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -793,21 +793,18 @@ datum/mind
else if (istype(M))
current.contract_disease(new /datum/disease/jungle_fever,1,0)
if("human")
- var/mob/living/carbon/monkey/M = current
- if (istype(M))
- for(var/datum/disease/D in M.viruses)
- if (istype(D,/datum/disease/jungle_fever))
- D.cure(0)
- sleep(0) //because deleting of virus is doing throught spawn(0)
- log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
- message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
- var/obj/item/weapon/dnainjector/m2h/m2h = new
- var/obj/item/weapon/implant/mobfinder = new(M) //hack because humanizing deletes mind --rastaf0
- src = null
- m2h.inject(M)
- src = mobfinder.loc:mind
- del(mobfinder)
- current.radiation -= 50
+ if (usr.client.holder.rights & R_ADMIN)
+ var/mob/living/carbon/human/H = current
+ var/mob/living/carbon/monkey/M = current
+ if (istype(M))
+ for(var/datum/disease/D in M.viruses)
+ if (istype(D,/datum/disease/jungle_fever))
+ D.cure(0)
+ sleep(0) //because deleting of virus is doing throught spawn(0)
+ log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
+ message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
+ H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
+ src = H.mind
else if (href_list["silicon"])
switch(href_list["silicon"])
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 623d209e155..663f3f6add9 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -41,7 +41,7 @@
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.f_color)
L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.s_tone), skin_tones.len)
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
-
+
for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++)
if(L[i]) . += L[i]
else . += random_string(DNA_BLOCK_SIZE,hex_characters)
@@ -72,30 +72,30 @@
return
if(!owner.dna)
owner.dna = new /datum/dna()
-
+
if(real_name)
owner.real_name = real_name
owner.dna.generate_unique_enzymes(owner)
-
+
if(blood_type)
owner.dna.b_type = blood_type
-
+
if(ui)
owner.dna.uni_identity = ui
updateappearance(owner)
-
+
var/update_mutantrace = (mutantrace != owner.dna.mutantrace)
owner.dna.mutantrace = mutantrace
if(update_mutantrace && istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
H.update_mutantrace()
-
+
if(se)
owner.dna.struc_enzymes = se
domutcheck(owner)
-
+
check_dna_integrity(owner)
-
+
/proc/check_dna_integrity(mob/living/carbon/character)
if(!istype(character))
return 0
@@ -103,9 +103,9 @@
if(ready_dna(character))
return 1
return 0
-
+
if(length(character.dna.uni_identity) != DNA_UNI_IDENTITY_BLOCKS*DNA_BLOCK_SIZE)
- character.dna.uni_identity = character.dna.generate_uni_identity(character)
+ character.dna.uni_identity = character.dna.generate_uni_identity(character)
if(length(character.dna.struc_enzymes)!= DNA_STRUC_ENZYMES_BLOCKS*DNA_BLOCK_SIZE)
character.dna.struc_enzymes = character.dna.generate_struc_enzymes()
if(!character.dna.real_name || length(character.dna.unique_enzymes) != DNA_UNIQUE_ENZYMES_LEN)
@@ -239,7 +239,7 @@
blocks[i] = (deconstruct_block(getblock(M.dna.struc_enzymes, i), GOOD_MUTATION_DIFFICULTY) == GOOD_MUTATION_DIFFICULTY)
for(var/i in op_se_blocks) //Overpowered mutations...extra difficult to obtain
blocks[i] = (deconstruct_block(getblock(M.dna.struc_enzymes, i), OP_MUTATION_DIFFICULTY) == OP_MUTATION_DIFFICULTY)
-
+
if(blocks[NEARSIGHTEDBLOCK])
M.disabilities |= NEARSIGHTED
M << "\red Your eyes feel strange."
@@ -301,136 +301,25 @@
//////////////////////////////////////////////////////////// Monkey Block
if(blocks[RACEBLOCK])
if(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 = new(src)
-
- 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
-
+ var/mob/living/carbon/monkey/O = M.monkeyize(TR_KEEPITEMS | TR_HASHNAME | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS)
+ O.take_overall_damage(40, 0)
+ O.adjustToxLoss(20)
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 = "harm"
- 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 1
else
if(istype(M, /mob/living/carbon/monkey)) // 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 )
- O.gender = (deconstruct_block(getblock(M.dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? MALE : FEMALE
-
- if(M)
- if(M.dna)
- O.dna = M.dna
- M.dna = null
-
- if(M.suiciding)
- O.suiciding = M.suiciding
- M.suiciding = null
-
- O.viruses = M.viruses.Copy()
- M.viruses.Cut()
- for(var/datum/disease/D in O.viruses)
- D.affected_mob = O
-
- O.loc = M.loc
-
- if(M.mind)
- M.mind.transfer_to(O) //transfer our mind to the human
-
+ var/mob/living/carbon/human/O = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS)
+ O.take_overall_damage(40, 0)
+ O.adjustToxLoss(20)
if(connected) //inside dna thing
var/obj/machinery/dna_scannernew/C = connected
O.loc = C
C.occupant = O
connected = null
-
- O.real_name = random_name(O.gender)
-
- updateappearance(O)
- 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 1
//////////////////////////////////////////////////////////// Monkey Block
if(M)
@@ -610,7 +499,7 @@
density = 1
var/radduration = 2
var/radstrength = 1
-
+
var/list/buffer[NUMBER_OF_BUFFERS]
var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
@@ -751,7 +640,7 @@
occupant_status = "Invalid DNA structure"
else
occupant_status = "No subject detected"
-
+
if(connected.locked)
scanner_status = "Locked"
else
@@ -760,7 +649,7 @@
occupant_status = "Error: Undefined"
scanner_status = "Error: No scanner detected"
var/status = "
Scanner Status: [scanner_status]
Subject Status: [occupant_status]
Emitter Array Output Level: [radstrength]
Emitter Array Pulse Duration: [radduration]
"
-
+
var/buttons = "Scan "
if(connected) buttons += "Toggle Bolts "
else buttons += "Toggle Bolts "
@@ -772,7 +661,7 @@
else buttons += "Buffers "
buttons += "
-- Emitter Array Output Level ++"
buttons += "
-- Emitter Array Pulse Duration ++"
-
+
switch(current_screen)
if("working")
temp_html += "System Busy
"
@@ -782,7 +671,7 @@
temp_html += "Buffer Menu
"
temp_html += status
temp_html += buttons
-
+
if(istype(buffer))
for(var/i=1, i<=buffer.len, i++)
temp_html += "
Slot [i]: "
@@ -841,14 +730,14 @@
temp_html += "Main Menu
"
temp_html += status
temp_html += buttons
-
+
temp_html += "Unique Enzymes :
"
if(viable_occupant)
temp_html += "[viable_occupant.dna.unique_enzymes]"
else
temp_html += " - "
temp_html += "
"
-
+
temp_html += "Unique Identifier:
"
var/max_line_len = DNA_BLOCK_SIZE * 10
if(viable_occupant)
@@ -862,7 +751,7 @@
else
temp_html += " - "
temp_html += "
"
-
+
temp_html += "Structural Enzymes:
"
if(viable_occupant)
var/len = length(viable_occupant.dna.struc_enzymes)
@@ -878,7 +767,7 @@
popup.set_content(temp_html)
popup.open()
-
+
/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
@@ -892,7 +781,7 @@
add_fingerprint(usr)
usr.set_machine(src)
-
+
var/mob/living/carbon/viable_occupant
if(connected)
viable_occupant = connected.occupant
@@ -1012,13 +901,13 @@
var/locked_state = connected.locked
connected.locked = 1
-
+
current_screen = "working"
ShowInterface(usr)
-
+
sleep(radduration*10)
current_screen = "mainmenu"
-
+
if(viable_occupant && connected && connected.occupant==viable_occupant)
viable_occupant.radiation += RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength
switch(href_list["task"])
@@ -1026,30 +915,30 @@
var/len = length(viable_occupant.dna.uni_identity)
num = Wrap(num, 1, len+1)
num = randomize_radiation_accuracy(num, radduration, len)
-
+
var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1)
hex = scramble(hex, radstrength, radduration)
-
+
viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0)
updateappearance(viable_occupant)
if("pulsese")
var/len = length(viable_occupant.dna.struc_enzymes)
num = Wrap(num, 1, len+1)
num = randomize_radiation_accuracy(num, radduration, len)
-
+
var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1)
hex = scramble(hex, radstrength, radduration)
-
+
viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0)
domutcheck(viable_occupant, connected)
else
current_screen = "mainmenu"
-
+
if(connected)
connected.locked = locked_state
ShowInterface(usr)
-
+
/////////////////////////// DNA MACHINES
#undef INJECTOR_TIMEOUT
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index b4901597126..89941ba97bb 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -3,7 +3,7 @@
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
if(!iscarbon(src)) return
-
+
verbs += /datum/changeling/proc/EvolutionMenu
var/lesser_form = !ishuman(src)
@@ -66,7 +66,7 @@
/mob/living/carbon/proc/changeling_absorb_dna()
set category = "Changeling"
set name = "Absorb DNA"
-
+
var/datum/changeling/changeling = changeling_power(0,0,100)
if(!changeling) return
@@ -205,47 +205,7 @@
changeling.geneticdamage = 30
src << "Our genes cry out!"
- //TODO replace with monkeyize proc
- var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/weapon/implant/W in src)
- implants += W
-
- monkeyizing = 1
- canmove = 0
- icon = null
- overlays.Cut()
- invisibility = 101
-
- var/atom/movable/overlay/animation = new /atom/movable/overlay( 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 = new /mob/living/carbon/monkey(src)
- O.dna = dna
- dna = null
-
- for(var/obj/item/W in src)
- drop_from_inventory(W)
- for(var/obj/T in src)
- del(T)
-
- O.loc = loc
- O.name = "monkey ([copytext(md5(real_name), 2, 6)])"
- O.setToxLoss(getToxLoss())
- O.adjustBruteLoss(getBruteLoss())
- O.setOxyLoss(getOxyLoss())
- O.adjustFireLoss(getFireLoss())
- O.stat = stat
- O.a_intent = "harm"
- for(var/obj/item/weapon/implant/I in implants)
- I.loc = O
- I.implanted = O
-
- mind.transfer_to(O)
+ var/mob/living/carbon/monkey/O = monkeyize(TR_KEEPITEMS | TR_HASHNAME | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSE)
O.make_changeling(1)
O.verbs += /mob/living/carbon/proc/changeling_lesser_transform
@@ -256,10 +216,12 @@
//Transform into a human
/mob/living/carbon/proc/changeling_lesser_transform()
+
set category = "Changeling"
set name = "Transform (1)"
var/datum/changeling/changeling = changeling_power(1,1,0)
+
if(!changeling) return
var/list/names = list()
@@ -278,57 +240,8 @@
visible_message("[src] transforms!")
dna = chosen_dna
- var/list/implants = list()
- for (var/obj/item/weapon/implant/I in src) //Still preserving implants
- implants += I
-
- monkeyizing = 1
- canmove = 0
- icon = null
- overlays.Cut()
- invisibility = 101
- var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
- flick("monkey2h", animation)
- sleep(48)
- del(animation)
-
- for(var/obj/item/W in src)
- u_equip(W)
- if (client)
- client.screen -= W
- if (W)
- W.loc = loc
- W.dropped(src)
- W.layer = initial(W.layer)
-
- var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
- O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? MALE : FEMALE
- O.dna = dna
- dna = null
- O.real_name = chosen_dna.real_name
-
- for(var/obj/T in src)
- del(T)
-
- O.loc = loc
-
- updateappearance(O)
- domutcheck(O, null)
- O.setToxLoss(getToxLoss())
- O.adjustBruteLoss(getBruteLoss())
- O.setOxyLoss(getOxyLoss())
- O.adjustFireLoss(getFireLoss())
- O.stat = stat
- for (var/obj/item/weapon/implant/I in implants)
- I.loc = O
- I.implanted = O
-
- mind.transfer_to(O)
+ var/mob/living/carbon/human/O = humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE),chosen_dna.real_name)
O.make_changeling()
-
feedback_add_details("changeling_powers","LFT")
del(src)
return 1
@@ -338,7 +251,7 @@
/mob/living/carbon/proc/changeling_fakedeath()
set category = "Changeling"
set name = "Regenerative Stasis (20)"
-
+
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
if(!changeling) return
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 18d6d47d8c6..e065c5fe354 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -78,6 +78,12 @@ var/global/floorIsLava = 0
body += "Transformation:"
body += "
"
+ //Human
+ if(ishuman(M))
+ body += "Human | "
+ else
+ body += "Humanize | "
+
//Monkey
if(ismonkey(M))
body += "Monkeyized | "
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 6d540d096ac..8874f028048 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1012,6 +1012,18 @@
message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1)
H.monkeyize()
+ else if(href_list["humanone"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/monkey/Mo = locate(href_list["humanone"])
+ if(!istype(Mo))
+ usr << "This can only be used on instances of type /mob/living/carbon/monkey"
+ return
+
+ log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)]")
+ message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]", 1)
+ Mo.humanize()
+
else if(href_list["corgione"])
if(!check_rights(R_SPAWN)) return
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index dc14043b5e9..52bf272dece 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -1,18 +1,26 @@
-/mob/living/carbon/human/proc/monkeyize()
+/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null)
if (monkeyizing)
return
- for(var/obj/item/W in src)
- if (W==w_uniform) // will be torn
- continue
- drop_from_inventory(W)
+ //Handle items on mob
+
+ //first implants
+ var/list/implants = list()
+ if (tr_flags & TR_KEEPIMPLANTS)
+ for(var/obj/item/weapon/implant/W in src)
+ implants += W
+
+ //now the rest
+ if (tr_flags & TR_KEEPITEMS)
+ for(var/obj/item/W in (src.contents-implants))
+ drop_from_inventory(W)
+
+ //Make mob invisible and spawn animation
regenerate_icons()
monkeyizing = 1
canmove = 0
stunned = 1
icon = null
invisibility = 101
- for(var/t in organs)
- del(t)
var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
@@ -23,24 +31,159 @@
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
del(animation)
- O.name = "monkey"
+ // hash the original name?
+ if (tr_flags & TR_HASHNAME)
+ O.name = "monkey ([copytext(md5(real_name), 2, 6)])"
+ O.real_name = "monkey ([copytext(md5(real_name), 2, 6)])"
+ if (newname) //if there's a name as an argument, always take that one over the current name
+ O.name = newname
+ O.real_name = newname
+
+ //handle DNA and other attributes
O.dna = dna
dna = null
- O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY))
+ if (!(tr_flags & TR_KEEPSE))
+ O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY))
+ if(suiciding)
+ O.suiciding = suiciding
O.loc = loc
- O.viruses = viruses
- viruses = list()
- for(var/datum/disease/D in O.viruses)
- D.affected_mob = O
+ O.a_intent = "harm"
+
+ //keep viruses?
+ if (tr_flags & TR_KEEPVIRUS)
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
+ //keep damage?
+ if (tr_flags & TR_KEEPDAMAGE)
+ O.setToxLoss(getToxLoss())
+ O.adjustBruteLoss(getBruteLoss())
+ O.setOxyLoss(getOxyLoss())
+ O.adjustFireLoss(getFireLoss())
+
+ //handle client key and mob so mind.transfer_to doesn't ghostize
+ if (client)
+ client.mob = O
+ if (key)
+ O.key = key
+
+ //re-add implants to new mob
+ for(var/obj/item/weapon/implant/I in implants)
+ I.loc = O
+ I.implanted = O
+
+ //transfer mind and delete old mob
+ if(mind)
+ mind.transfer_to(O)
+ if (tr_flags & TR_DEFAULTMSG)
+ O << "You are now a monkey."
+ spawn(0)//To prevent the proc from returning null.
+ del(src)
+ updateappearance(O)
+ return O
+
+
+
+
+////////////////////////// Humanize //////////////////////////////
+//Could probably be merged with monkeyize but other transformations got their own procs, too
+
+/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null)
+ if (monkeyizing)
+ return
+ //Handle items on mob
+
+ //first implants
+ var/list/implants = list()
+ if (tr_flags & TR_KEEPIMPLANTS)
+ for(var/obj/item/weapon/implant/W in src)
+ implants += W
+
+ //now the rest
+ if (tr_flags & TR_KEEPITEMS)
+ for(var/obj/item/W in (src.contents-implants))
+ u_equip(W)
+ if (client)
+ client.screen -= W
+ if (W)
+ W.loc = loc
+ W.dropped(src)
+ W.layer = initial(W.layer)
+
+ // for(var/obj/item/W in src)
+ // drop_from_inventory(W)
+
+ //Make mob invisible and spawn animation
+ regenerate_icons()
+ monkeyizing = 1
+ canmove = 0
+ stunned = 1
+ icon = null
+ invisibility = 101
+ var/atom/movable/overlay/animation = new( loc )
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = src
+ flick("monkey2h", animation)
+ sleep(48)
+ var/mob/living/carbon/human/O = new( loc )
+ del(animation)
+
+
+ O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? MALE : FEMALE
+ O.dna = dna
+ dna = null
+ if (newname) //if there's a name as an argument, always take that one over the current name
+ O.real_name = newname
+ else
+ if ( !(cmptext ("monkey",copytext(O.dna.real_name,1,7)) ) )
+ O.real_name = O.dna.real_name
+ else
+ O.real_name = random_name(O.gender)
+ O.name = O.real_name
+
+ if (!(tr_flags & TR_KEEPSE))
+ O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(1,BAD_MUTATION_DIFFICULTY))
+
+ if(suiciding)
+ O.suiciding = suiciding
+
+ O.loc = loc
+
+ //keep viruses?
+ if (tr_flags & TR_KEEPVIRUS)
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
+ //keep damage?
+ if (tr_flags & TR_KEEPDAMAGE)
+ O.setToxLoss(getToxLoss())
+ O.adjustBruteLoss(getBruteLoss())
+ O.setOxyLoss(getOxyLoss())
+ O.adjustFireLoss(getFireLoss())
if (client)
client.mob = O
+ if (key)
+ O.key = key
+
+ //re-add implants to new mob
+ for(var/obj/item/weapon/implant/I in implants)
+ I.loc = O
+ I.implanted = O
+
if(mind)
mind.transfer_to(O)
- O.a_intent = "harm"
- O << "You are now a monkey."
+ O.a_intent = "help"
+ if (tr_flags & TR_DEFAULTMSG)
+ O << "You are now a human."
spawn(0)//To prevent the proc from returning null.
del(src)
+ updateappearance(O)
return O
/mob/new_player/AIize()