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()