diff --git a/baystation12.dme b/baystation12.dme index 87626cca810..4edfcf4752a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1084,7 +1084,6 @@ #include "code\WorkInProgress\AI_Visibility.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" -#include "code\WorkInProgress\Cael_Aislinn\Tajara\examine.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\say.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\tajara_transformation.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm index 2334d6d0f83..eac51250c1c 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm @@ -479,7 +479,7 @@ // usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]." // continue - msg += print_flavor_text() + msg += "[print_flavor_text()]\n" msg += "\blue *---------*" usr << msg diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm index c1102ae0c8d..708561f06ab 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm @@ -8,8 +8,6 @@ canmove = 0 icon = null invisibility = 101 - for(var/name in organs) - del(organs[name]) var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" @@ -20,6 +18,13 @@ //animation = null var/mob/living/carbon/human/tajaran/O = new /mob/living/carbon/human/tajaran( loc ) del(animation) + del(O.organs) + O.organs = organs + for(var/name in O.organs) + var/datum/organ/external/organ = O[name] + organ.owner = O + for(var/obj/item/weapon/implant/implant in organ.implant) + implant.imp_in = O O.real_name = real_name O.name = name @@ -37,7 +42,9 @@ client.mob = O if(mind) mind.transfer_to(O) - + O.update_body() + O.update_face() + O.update_clothing() O << "You are now a Tajara." spawn(0)//To prevent the proc from returning null. del(src) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 30ff780a118..7640a263f1f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -312,7 +312,7 @@ datum/mind if(!def_value)//If it's a custom objective, it will be an empty string. def_value = "custom" - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate","decapitate", "debrain", "protect", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate","decapitate", "debrain", "protection", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") if (!new_obj_type) return var/datum/objective/new_objective = null @@ -367,7 +367,13 @@ datum/mind new_objective.owner = src if ("steal") - new_objective = pick(GenerateTheft(assigned_role,src)) + var/list/possibilities = typesof(/datum/objective/steal) - /datum/objective/steal + var/list/choices = list() + for(var/datum/objective/steal/name in possibilities) + choices[name.explanation_text] = name + var/new_target = input("Select target:", "Objective target") as null|anything in choices + if (!new_target) return + new_objective = new choices[new_target] new_objective.owner = src if("download","capture","absorb") diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index e819b6aeba8..972cd072cb0 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -782,10 +782,31 @@ Turf and target are seperate in case you want to teleport some distance from a t return ais[select] /proc/get_sorted_mobs() - var/new_list = list() - var/old_list = getmobs() + var/list/old_list = getmobs() + var/list/AI_list = list() + var/list/Dead_list = list() + var/list/keyclient_list = list() + var/list/key_list = list() + var/list/logged_list = list() for(var/named in old_list) - new_list += old_list[named] + var/mob/M = old_list[named] + if(issilicon(M)) + AI_list |= M + else if(isobserver(M) || M.stat == 2) + Dead_list |= M + else if(M.key && M.client) + keyclient_list |= M + else if(M.key) + key_list |= M + else + logged_list |= M + old_list.Remove(named) + var/list/new_list = list() + new_list += AI_list + new_list += keyclient_list + new_list += key_list + new_list += logged_list + new_list += Dead_list return new_list @@ -796,6 +817,9 @@ Turf and target are seperate in case you want to teleport some distance from a t var/list/creatures = list() var/list/namecounts = list() for(var/mob/M in mobs) + if(!M.name || !M.real_name) + var/turf/T = get_turf(M) + message_admins("Alert! The mob with the key [M.key ? M.key : "NO KEY"] at ([T.x], [T.y], [T.z]) has no name!") var/name = M.name if (name in names) namecounts[name]++ @@ -804,7 +828,7 @@ Turf and target are seperate in case you want to teleport some distance from a t names.Add(name) namecounts[name] = 1 if (M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" + name += " \[[M.original_name? M.original_name : M.real_name]\]" if (M.stat == 2) if(istype(M, /mob/dead/observer/)) name += " \[ghost\]" @@ -812,7 +836,7 @@ Turf and target are seperate in case you want to teleport some distance from a t name += " \[dead\]" creatures[name] = M - return sortList(creatures) + return creatures /proc/sortmobs() diff --git a/code/game/dna.dm b/code/game/dna.dm index e0e2eb4838d..cb0221b6c50 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -533,6 +533,13 @@ del(animation) var/mob/living/carbon/monkey/O = new(src) + del(O.organs) + O.organs = H.organs + for(var/name in O.organs) + var/datum/organ/external/organ = O[name] + organ.owner = O + for(var/obj/item/weapon/implant/implant in organ.implant) + implant.imp_in = O if(M) if (M.dna) @@ -567,11 +574,9 @@ O.adjustOxyLoss(M.getOxyLoss()) O.stat = M.stat O.a_intent = "hurt" - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O O.flavor_text = M.flavor_text O.warn_flavor_changed() + O.update_clothing() del(M) return @@ -606,6 +611,13 @@ O.gender = MALE O.dna = M.dna M.dna = null + del(O.organs) + O.organs = M.organs + for(var/name in O.organs) + var/datum/organ/external/organ = O[name] + organ.owner = O + for(var/obj/item/weapon/implant/implant in organ.implant) + implant.imp_in = O for(var/datum/disease/D in M.viruses) O.viruses += D @@ -643,9 +655,6 @@ 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.flavor_text = M.flavor_text O.warn_flavor_changed() O.update_clothing() diff --git a/code/game/events/EventProcs/space_ninja.dm b/code/game/events/EventProcs/space_ninja.dm index 166bbade813..28bd1088c42 100644 --- a/code/game/events/EventProcs/space_ninja.dm +++ b/code/game/events/EventProcs/space_ninja.dm @@ -242,7 +242,7 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob hostile_targets -= current_mind//Remove them from the list. if(2)//Steal var/list/datum/objective/theft = GenerateTheft(ninja_mind.assigned_role,ninja_mind) - var/datum/objective/steal/steal_objective = pick(theft) + var/datum/objective/steal/steal_objective = PickObjectiveFromList(theft) ninja_mind.objectives += steal_objective objective_list -= 2 diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 4c9414c3a08..99e5e01e5de 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -103,7 +103,7 @@ if(46 to 90) - var/list/datum/objective/theft = GenerateTheft(changeling.assigned_role,changeling) + var/list/datum/objective/theft = PickObjectiveFromList(GenerateTheft(changeling.assigned_role,changeling)) var/datum/objective/steal/steal_objective = pick(theft) steal_objective.owner = changeling changeling.objectives += steal_objective @@ -120,7 +120,7 @@ kill_objective.find_target() changeling.objectives += kill_objective - var/list/datum/objective/theft = GenerateTheft(changeling.assigned_role,changeling) + var/list/datum/objective/theft = PickObjectiveFromList(GenerateTheft(changeling.assigned_role,changeling)) var/datum/objective/steal/steal_objective = pick(theft) steal_objective.owner = changeling changeling.objectives += steal_objective diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 2827279e4ed..d5b62c10224 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -13,53 +13,43 @@ update() - if (src.imp) - src.icon_state = "implanter1" + if (imp) + icon_state = "implanter1" else - src.icon_state = "implanter0" + icon_state = "implanter0" return attack(mob/M as mob, mob/user as mob) if (!istype(M, /mob/living/carbon)) return - if (user && src.imp) - for (var/mob/O in viewers(M, null)) - if (M != user) - O.show_message(text("\red [] is trying to implant [] with [src.name]!", user, M), 1) - else - O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1) + if (user && imp) + if (M != user) + user.visible_message("\red You try to implant yourself with \the [src]!","\red [user] tries to implant [user.gender == MALE? "himself":"herself"] with \the [src]!") + else + user.visible_message("\red You try to implant [M] with \the [src]!","\red [user] tries to implant [M] with \the [src]!") if(!do_mob(user, M,60)) return - if(istype(M, /mob/living/carbon/human)) - var/picked = 0 - var/mob/living/carbon/human/T = M - var/list/datum/organ/external/E = T.GetOrgans() - while(picked == 0 && E.len > 0) - var/datum/organ/external/O = pick(E) - E -= O - if(!E.implant) - O.implant = src.imp - picked = 1 - if(picked == 0) - for (var/mob/O in viewers(M, null)) - O.show_message(text("[user.name] can't find anywhere to implant [M.name]"), 1) + if(hasorgans(M)) + var/datum/organ/external/target = M:get_organ(check_zone(user.zone_sel.selecting)) + if(target.destroyed) + user << "What [target.display_name]?" return - for (var/mob/O in viewers(M, null)) + target.implant += imp + imp.loc = target if (M != user) - O.show_message(text("\red [] implants [] with [src.name]!", user, M), 1) + user.visible_message("\red You implant your [target.display_name] with \the [src]!","\red [user] implants [user.gender == MALE? "his own ":"her own "][target.display_name] with \the [src]!") else - O.show_message("\red [user] implants themself with [src.name]!", 1) - M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.imp.name]) by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.imp.name]) to implant [M.name] ([M.ckey])") + user.visible_message("\red You implant [M]'s [target.display_name] with \the [src]!","\red [user] implants [M]'s [target.display_name] with \the [src]!") + M.attack_log += text("\[[time_stamp()]\] Implanted with [src] ([imp]) by [user] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src] ([imp]) to implant [M] ([M.ckey])") log_admin("ATTACK: [user] ([user.ckey]) implanted [M] ([M.ckey]) with [src].") message_admins("ATTACK: [user] ([user.ckey]) implanted [M] ([M.ckey]) with [src].") - src.imp.loc = M - src.imp.imp_in = M - src.imp.implanted = 1 - src.imp.implanted(M) - src.imp = null - src.icon_state = "implanter0" + imp.imp_in = M + imp.implanted = 1 + imp.implanted(M) + imp = null + icon_state = "implanter0" return @@ -68,7 +58,7 @@ name = "implanter-loyalty" New() - src.imp = new /obj/item/weapon/implant/loyalty( src ) + imp = new /obj/item/weapon/implant/loyalty( src ) ..() update() return @@ -79,7 +69,7 @@ name = "implanter-explosive" New() - src.imp = new /obj/item/weapon/implant/explosive( src ) + imp = new /obj/item/weapon/implant/explosive( src ) ..() update() return @@ -89,24 +79,24 @@ icon_state = "cimplanter0" New() - src.imp = new /obj/item/weapon/implant/compressed( src ) + imp = new /obj/item/weapon/implant/compressed( src ) ..() update() return update() - if (src.imp) - var/obj/item/weapon/implant/compressed/c = src.imp + if (imp) + var/obj/item/weapon/implant/compressed/c = imp if(!c.scanned) - src.icon_state = "cimplanter0" + icon_state = "cimplanter0" else - src.icon_state = "cimplanter1" + icon_state = "cimplanter1" else - src.icon_state = "cimplanter2" + icon_state = "cimplanter2" return attack(mob/M as mob, mob/user as mob) - var/obj/item/weapon/implant/compressed/c = src.imp + var/obj/item/weapon/implant/compressed/c = imp if (c.scanned == null) user << "Please scan an object with the implanter first." return @@ -114,7 +104,7 @@ afterattack(atom/A, mob/user as mob) if(istype(A,/obj/item)) - var/obj/item/weapon/implant/compressed/c = src.imp + var/obj/item/weapon/implant/compressed/c = imp c.scanned = A A.loc.contents.Remove(A) - src.update() \ No newline at end of file + update() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index d8665dd7978..21cb9f81f9e 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -8,7 +8,7 @@ New() - src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") src.uses = rand(1, 5) ..() return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 434ce5c79af..69986b0da07 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -898,8 +898,23 @@ /client/proc/CarbonCopy(atom/movable/O as mob|obj in world) set category = "Admin" - var/mob/NewObj = new O.type(usr.loc) + var/atom/movable/NewObj = new O.type(usr.loc) for(var/V in O.vars) if (issaved(O.vars[V])) - NewObj.vars[V] = O.vars[V] + if(V == "contents") + for(var/atom/movable/C in O.contents) + C.CarbonCopy2(NewObj) + else + NewObj.vars[V] = O.vars[V] return NewObj + +/atom/proc/CarbonCopy2(atom/movable/O as mob|obj in world) + var/atom/movable/NewObj = new type(O) + for(var/V in vars) + if (issaved(vars[V])) + if(V == "contents") + for(var/atom/movable/C in contents) + C.CarbonCopy2(NewObj) + else + NewObj.vars[V] = vars[V] + return NewObj \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5be108c5524..7d358a5eed4 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -13,6 +13,8 @@ loc = pick(latejoin) if(!istype(body,/mob)) return//This needs to be recoded sometime so it has loc as its first arg real_name = body.name + if(!body.original_name) + body.original_name = real_name original_name = body.original_name name = body.original_name if(!safety) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 1b57726d946..85dfe4901f9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -484,7 +484,7 @@ // usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]." // continue - msg += print_flavor_text() + msg += "[print_flavor_text()]\n" msg += "\blue *---------*" usr << msg diff --git a/code/modules/mob/living/carbon/metroid/examine.dm b/code/modules/mob/living/carbon/metroid/examine.dm index 1b3146d6da1..fee374c503a 100644 --- a/code/modules/mob/living/carbon/metroid/examine.dm +++ b/code/modules/mob/living/carbon/metroid/examine.dm @@ -26,6 +26,6 @@ if(10) usr << text("\blue [] seems to have extreme electrical activity inside it!", src.name) - usr << print_flavor_text() + usr << "[print_flavor_text()]\n" return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/monkey/examine.dm index 1945b9c0a3a..764c5057e54 100644 --- a/code/modules/mob/living/carbon/monkey/examine.dm +++ b/code/modules/mob/living/carbon/monkey/examine.dm @@ -239,7 +239,7 @@ msg += wound_flavor_text["right foot"] - msg += print_flavor_text() + msg += "[print_flavor_text()]\n" msg += "*---------*" diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index a6508979282..6f63897ae87 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -46,17 +46,17 @@ bandaged = 0 max_damage = 0 max_size = 0 - obj/item/weapon/implant/implant = null + tmp/list/obj/item/weapon/implant/implant = list() display_name - list/wounds = list() - bleeding = 0 - perma_injury = 0 - perma_dmg = 0 - broken = 0 - destroyed = 0 - destspawn = 0 //Has it spawned the broken limb? - gauzed = 0 //Has the missing limb been patched? + tmp/list/wounds = list() + tmp/bleeding = 0 + tmp/perma_injury = 0 + tmp/perma_dmg = 0 + tmp/broken = 0 + tmp/destroyed = 0 + tmp/destspawn = 0 //Has it spawned the broken limb? + tmp/gauzed = 0 //Has the missing limb been patched? min_broken_damage = 30 datum/organ/external/parent damage_msg = "\red You feel a intense pain" @@ -281,6 +281,9 @@ if(override) destroyed = 1 if(destroyed) + if(implant) + for(var/implants in implant) + del(implants) //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy") var/obj/item/weapon/organ/H @@ -301,7 +304,9 @@ H:transfer_identity(owner) H.pixel_x = -10 H.pixel_y = 6 - H.name = "[owner.name]'s head" + if(!owner.original_name) + owner.original_name = owner.real_name + H.name = "[owner.original_name]'s head" owner.update_face() owner.update_body() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c2762f85039..cb8f388b9a4 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -10,8 +10,6 @@ canmove = 0 icon = null invisibility = 101 - for(var/name in organs) - del(organs[name]) var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'mob.dmi' @@ -21,6 +19,13 @@ //animation = null var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc ) del(animation) + del(O.organs) + O.organs = organs + for(var/name in O.organs) + var/datum/organ/external/organ = O[name] + organ.owner = O + for(var/obj/item/weapon/implant/implant in organ.implant) + implant.imp_in = O O.name = "monkey" O.dna = dna diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8730851d0cb..e90fb1203f4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -15,16 +15,16 @@ var fire_sound = 'Gunshot.ogg' - obj/item/projectile/in_chamber = null + tmp/obj/item/projectile/in_chamber = null caliber = "" silenced = 0 recoil = 0 tmp/list/mob/living/target //List of who yer targeting. tmp/lock_time = -100 - mouthshoot = 0 ///To stop people from suiciding twice... >.> + tmp/mouthshoot = 0 ///To stop people from suiciding twice... >.> automatic = 0 //Used to determine if you can target multiple people. - mob/living/last_moved_mob //Used to fire faster at more than one person. - told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them. + tmp/mob/living/last_moved_mob //Used to fire faster at more than one person. + tmp/told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them. proc/load_into_chamber() return 0 diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 1284a73b06a..a53883d511d 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -3,7 +3,7 @@ name = "large parcel" icon = 'storage.dmi' icon_state = "deliverycrate" - var/obj/wrapped = null + var/tmp/obj/wrapped = null density = 1 var/sortTag = null flags = FPRINT @@ -99,7 +99,7 @@ name = "small parcel" icon = 'storage.dmi' icon_state = "deliverycrateSmall" - var/obj/item/wrapped = null + var/tmp/obj/item/wrapped = null var/sortTag = null flags = FPRINT var/examtext = null