diff --git a/baystation12.dme b/baystation12.dme
index 9032f3da7e1..8d4b0ce236d 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1010,6 +1010,7 @@
#include "code\modules\mob\living\blob\blob.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_defines.dm"
+#include "code\modules\mob\living\carbon\give.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
#include "code\modules\mob\living\carbon\alien\login.dm"
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 1f99541544c..57cadffa6bd 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -343,7 +343,12 @@
if("tor_ban")
ToRban = 1
- if("automute_on") automute_on = 1 if("usealienwhitelist") usealienwhitelist = 1 else
+ if("automute_on")
+ automute_on = 1
+
+ if("usealienwhitelist")
+ usealienwhitelist = 1
+ else
diary << "Unknown setting in configuration: '[name]'"
else if(type == "game_options")
diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm
index c182249a242..26fdf31491b 100644
--- a/code/defines/procs/gamehelpers.dm
+++ b/code/defines/procs/gamehelpers.dm
@@ -274,3 +274,8 @@ proc/isInSight(var/atom/A, var/atom/B)
if(M.ckey == lowertext(key))
return M
return null
+
+proc/check_can_reach(atom/user, atom/target)
+ if(!in_range(user,target))
+ return 0
+ return CanReachThrough(get_turf(user), get_turf(target), target)
diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm
index 1f0463e3191..1f493857d09 100644
--- a/code/game/jobs/whitelist.dm
+++ b/code/game/jobs/whitelist.dm
@@ -26,7 +26,9 @@ proc/load_alienwhitelist()
/proc/is_alien_whitelisted(mob/M, var/species)
if(!alien_whitelist)
return 0
- if((M.client) && (M.client.holder) && (M.client.holder.level) && (M.client.holder.level >= 5)) return 1 if(M && species)
+ if((M.client) && (M.client.holder) && (M.client.holder.level) && (M.client.holder.level >= 5))
+ return 1
+ if(M && species)
for (var/s in alien_whitelist)
if(findtext(s,"[M.ckey] - [species]"))
return 1
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 6c9f58a5885..18baaefa237 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -1,380 +1,3 @@
-<<<<<<< HEAD
-//This could either be split into the proper DM files or placed somewhere else all together, but it'll do for now -Nodrak
-
-/*
-
-A list of items and costs is stored under the datum of every game mode, alongside the number of crystals, and the welcoming message.
-
-*/
-
-/obj/item/device/uplink
- var/welcome // Welcoming menu message
- var/items // List of items
- var/item_data // raw item text
- var/list/ItemList // Parsed list of items
- var/uses // Numbers of crystals
- // List of items not to shove in their hands.
- var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate)
-
-/obj/item/device/uplink/New()
- welcome = ticker.mode.uplink_welcome
- if(!item_data)
- items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items
- else
- items = dd_replacetext(item_data)
- ItemList = dd_text2list(src.items, ";") // Parsing the items text string
- uses = ticker.mode.uplink_uses
-
-//Let's build a menu!
-/obj/item/device/uplink/proc/generate_menu()
-
- var/dat = "[src.welcome]
"
- dat += "Tele-Crystals left: [src.uses]
"
- dat += "
"
- dat += "Request item:
"
- dat += "Each item costs a number of tele-crystals as indicated by the number following their name.
"
-
- var/cost
- var/item
- var/name
- var/path_obj
- var/path_text
- var/category_items = 1 //To prevent stupid :P
-
- for(var/D in ItemList)
- var/list/O = stringsplit(D, ":")
- if(O.len != 3) //If it is not an actual item, make a break in the menu.
- if(O.len == 1) //If there is one item, it's probably a title
- dat += "[O[1]]
"
- category_items = 0
- else //Else, it's a white space.
- if(category_items < 1) //If there were no itens in the last category...
- dat += "We apologize, as you could not afford anything from this category.
"
- dat += "
"
- continue
-
- path_text = O[1]
- cost = text2num(O[2])
-
- if(cost>uses)
- continue
-
- path_obj = text2path(path_text)
- item = new path_obj()
- name = O[3]
- del item
-
- dat += "[name] ([cost])
"
- category_items++
-
- dat += "Random Item (??)
"
- dat += "
"
- return dat
-
-//If 'random' was selected
-/obj/item/device/uplink/proc/chooseRandomItem()
- var/list/randomItems = list()
-
- //Sorry for all the ifs, but it makes it 1000 times easier for other people/servers to add or remove items from this list
- //Add only items the player can afford:
- if(uses > 19)
- randomItems.Add("/obj/item/weapon/circuitboard/teleporter") //Teleporter Circuit Board (costs 20, for nuke ops)
-
- if(uses > 9)
- randomItems.Add("/obj/item/toy/syndicateballoon")//Syndicate Balloon
- randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_uplink") //Uplink Implanter
- randomItems.Add("/obj/item/weapon/storage/box/syndicate") //Syndicate bundle
-
- //if(uses > 8) //Nothing... yet.
- //if(uses > 7) //Nothing... yet.
-
- if(uses > 6)
- randomItems.Add("/obj/item/weapon/aiModule/syndicate") //Hacked AI Upload Module
- randomItems.Add("/obj/item/device/radio/beacon/syndicate") //Singularity Beacon
-
- if(uses > 5)
- randomItems.Add("/obj/item/weapon/gun/projectile") //Revolver
-
- if(uses > 4)
- randomItems.Add("/obj/item/weapon/gun/energy/crossbow") //Energy Crossbow
- randomItems.Add("/obj/item/device/powersink") //Powersink
-
- if(uses > 3)
- randomItems.Add("/obj/item/weapon/melee/energy/sword") //Energy Sword
- randomItems.Add("/obj/item/clothing/mask/gas/voice") //Voice Changer
- randomItems.Add("/obj/item/device/chameleon") //Chameleon Projector
-
- if(uses > 2)
- randomItems.Add("/obj/item/weapon/storage/emp_kit") //EMP Grenades
- randomItems.Add("/obj/item/weapon/pen/paralysis") //Paralysis Pen
- randomItems.Add("/obj/item/weapon/cartridge/syndicate") //Detomatix Cartridge
- randomItems.Add("/obj/item/clothing/under/chameleon") //Chameleon Jumpsuit
- randomItems.Add("/obj/item/weapon/card/id/syndicate") //Agent ID Card
- randomItems.Add("/obj/item/weapon/card/emag") //Cryptographic Sequencer
- randomItems.Add("/obj/item/weapon/storage/syndie_kit/space") //Syndicate Space Suit
- randomItems.Add("/obj/item/device/encryptionkey/binary") //Binary Translator Key
- randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_freedom") //Freedom Implant
- randomItems.Add("/obj/item/clothing/glasses/thermal/syndi") //Thermal Imaging Goggles
-
- if(uses > 1)
-/*
- var/list/usrItems = usr.get_contents() //Checks to see if the user has a revolver before giving ammo
- var/hasRevolver = 0
- for(var/obj/I in usrItems) //Only add revolver ammo if the user has a gun that can shoot it
- if(istype(I,/obj/item/weapon/gun/projectile))
- hasRevolver = 1
-
- if(hasRevolver) randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo
-*/
- randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo
- randomItems.Add("/obj/item/clothing/shoes/syndigaloshes") //No-Slip Syndicate Shoes
- randomItems.Add("/obj/item/weapon/plastique") //C4
-
- if(uses > 0)
- randomItems.Add("/obj/item/weapon/soap/syndie") //Syndicate Soap
- randomItems.Add("/obj/item/weapon/storage/toolbox/syndicate") //Syndicate Toolbox
-
- if(!randomItems.len)
- del(randomItems)
- return 0
- else
- var/buyItem = pick(randomItems)
-
- switch(buyItem) //Ok, this gets a little messy, sorry.
- if("/obj/item/weapon/circuitboard/teleporter")
- uses -= 20
- if("/obj/item/toy/syndicateballoon" , "/obj/item/weapon/storage/syndie_kit/imp_uplink" , "/obj/item/weapon/storage/box/syndicate")
- uses -= 10
- if("/obj/item/weapon/aiModule/syndicate" , "/obj/item/device/radio/beacon/syndicate")
- uses -= 7
- if("/obj/item/weapon/gun/projectile")
- uses -= 6
- if("/obj/item/weapon/gun/energy/crossbow" , "/obj/item/device/powersink")
- uses -= 5
- if("/obj/item/weapon/melee/energy/sword" , "/obj/item/clothing/mask/gas/voice" , "/obj/item/device/chameleon")
- uses -= 4
- if("/obj/item/weapon/storage/emp_kit" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \
- "/obj/item/weapon/card/id/syndicate" , "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \
- "/obj/item/weapon/storage/syndie_kit/imp_freedom" , "/obj/item/clothing/glasses/thermal/syndi")
- uses -= 3
- if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique")
- uses -= 2
- if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate")
- uses -= 1
- del(randomItems)
- return buyItem
-
-/obj/item/device/uplink/proc/handleStatTracking(var/boughtItem)
-//For stat tracking, sorry for making it so ugly
- if(!boughtItem) return
-
- switch(boughtItem)
- if("/obj/item/weapon/circuitboard/teleporter")
- feedback_add_details("traitor_uplink_items_bought","TP")
- if("/obj/item/toy/syndicateballoon")
- feedback_add_details("traitor_uplink_items_bought","BS")
- if("/obj/item/weapon/storage/syndie_kit/imp_uplink")
- feedback_add_details("traitor_uplink_items_bought","UI")
- if("/obj/item/weapon/storage/box/syndicate")
- feedback_add_details("traitor_uplink_items_bought","BU")
- if("/obj/item/weapon/aiModule/syndicate")
- feedback_add_details("traitor_uplink_items_bought","AI")
- if("/obj/item/device/radio/beacon/syndicate")
- feedback_add_details("traitor_uplink_items_bought","SB")
- if("/obj/item/weapon/gun/projectile")
- feedback_add_details("traitor_uplink_items_bought","RE")
- if("/obj/item/weapon/gun/energy/crossbow")
- feedback_add_details("traitor_uplink_items_bought","XB")
- if("/obj/item/device/powersink")
- feedback_add_details("traitor_uplink_items_bought","PS")
- if("/obj/item/weapon/melee/energy/sword")
- feedback_add_details("traitor_uplink_items_bought","ES")
- if("/obj/item/clothing/mask/gas/voice")
- feedback_add_details("traitor_uplink_items_bought","VC")
- if("/obj/item/device/chameleon")
- feedback_add_details("traitor_uplink_items_bought","CP")
- if("/obj/item/weapon/storage/emp_kit")
- feedback_add_details("traitor_uplink_items_bought","EM")
- if("/obj/item/weapon/pen/paralysis")
- feedback_add_details("traitor_uplink_items_bought","PP")
- if("/obj/item/weapon/cartridge/syndicate")
- feedback_add_details("traitor_uplink_items_bought","DC")
- if("/obj/item/clothing/under/chameleon")
- feedback_add_details("traitor_uplink_items_bought","CJ")
- if("/obj/item/weapon/card/id/syndicate")
- feedback_add_details("traitor_uplink_items_bought","AC")
- if("/obj/item/weapon/card/emag")
- feedback_add_details("traitor_uplink_items_bought","EC")
- if("/obj/item/weapon/storage/syndie_kit/space")
- feedback_add_details("traitor_uplink_items_bought","SS")
- if("/obj/item/device/encryptionkey/binary")
- feedback_add_details("traitor_uplink_items_bought","BT")
- if("/obj/item/weapon/storage/syndie_kit/imp_freedom")
- feedback_add_details("traitor_uplink_items_bought","FI")
- if("/obj/item/clothing/glasses/thermal/syndi")
- feedback_add_details("traitor_uplink_items_bought","TM")
- if("/obj/item/ammo_magazine/a357")
- feedback_add_details("traitor_uplink_items_bought","RA")
- if("/obj/item/clothing/shoes/syndigaloshes")
- feedback_add_details("traitor_uplink_items_bought","SH")
- if("/obj/item/weapon/plastique")
- feedback_add_details("traitor_uplink_items_bought","C4")
- if("/obj/item/weapon/soap/syndie")
- feedback_add_details("traitor_uplink_items_bought","SP")
- if("/obj/item/weapon/storage/toolbox/syndicate")
- feedback_add_details("traitor_uplink_items_bought","ST")
-
-/obj/item/device/uplink/Topic(href, href_list)
-
- if (href_list["buy_item"])
- if(href_list["buy_item"] == "random")
- var/boughtItem = chooseRandomItem()
- if(boughtItem)
- href_list["buy_item"] = boughtItem
- feedback_add_details("traitor_uplink_items_bought","RN")
- return 1
- else
- return 0
-
- else
- if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item
- return 0
-
- //if(usr:mind && ticker.mode.traitors[usr:mind])
- //var/datum/traitorinfo/info = ticker.mode.traitors[usr:mind]
- //info.spawnlist += href_list["buy_item"]
-
- uses -= text2num(href_list["cost"])
- handleStatTracking(href_list["buy_item"]) //Note: chooseRandomItem handles it's own stat tracking. This proc is not meant for 'random'.
- return 1
-
-
-
-// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
-/* How to create an uplink in 3 easy steps!
-
- 1. All obj/item 's have a hidden_uplink var. By default it's null. Give the item one with "new(src)", it must be in it's contents. Feel free to add "uses".
-
- 2. Code in the triggers. Use check_trigger for this, I recommend closing the item's menu with "usr << browse(null, "window=windowname") if it returns true.
- The var/value is the value that will be compared with the var/target. If they are equal it will activate the menu.
-
- 3. If you want the menu to stay until the users locks his uplink, add an active_uplink_check(mob/user as mob) in your interact/attack_hand proc.
- Then check if it's true, if true return. This will stop the normal menu appearing and will instead show the uplink menu.
-*/
-
-/obj/item/device/uplink/hidden
- name = "Hidden Uplink."
- desc = "There is something wrong if you're examining this."
- var/active = 0
- var/list/purchase_log = list()
-
-// The hidden uplink MUST be inside an obj/item's contents.
-/obj/item/device/uplink/hidden/New()
- spawn(2)
- if(!istype(src.loc, /obj/item))
- del(src)
- ..()
-
-// Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated.
-/obj/item/device/uplink/hidden/proc/toggle()
- active = !active
-
-// Directly trigger the uplink. Turn on if it isn't already.
-/obj/item/device/uplink/hidden/proc/trigger(mob/user as mob)
- if(!active)
- toggle()
- interact(user)
-
-// Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset.
-// If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the
-// current item's menu.
-/obj/item/device/uplink/hidden/proc/check_trigger(mob/user as mob, var/value, var/target)
- if(value == target)
- trigger(user)
- return 1
- return 0
-
-// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button.
-/obj/item/device/uplink/hidden/proc/interact(mob/user as mob)
-
- var/dat = ""
- dat += src.generate_menu()
- dat += "Lock"
- dat += ""
- user << browse(dat, "window=hidden")
- onclose(user, "hidden")
- return
-
-// The purchasing code.
-/obj/item/device/uplink/hidden/Topic(href, href_list)
-
- if (usr.stat || usr.restrained())
- return
-
- if (!( istype(usr, /mob/living/carbon/human)))
- return 0
-
- if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf))))
- usr.machine = src
- if(href_list["lock"])
- toggle()
- usr << browse(null, "window=hidden")
- return 1
-
- if(..(href, href_list) == 1)
- var/path_obj = text2path(href_list["buy_item"])
- var/obj/I = new path_obj(get_turf(usr))
- if(ishuman(usr))
- var/mob/living/carbon/human/A = usr
- A.put_in_any_hand_if_possible(I)
- purchase_log += "[usr] ([usr.ckey]) bought [I]."
- interact(usr)
- return
-
-// I placed this here because of how relevant it is.
-// You place this in your uplinkable item to check if an uplink is active or not.
-// If it is, it will display the uplink menu and return 1, else it'll return false.
-// If it returns true, I recommend closing the item's normal menu with "user << browse(null, "window=name")"
-/obj/item/proc/active_uplink_check(mob/user as mob)
- // Activates the uplink if it's active
- if(src.hidden_uplink)
- if(src.hidden_uplink.active)
- src.hidden_uplink.trigger(user)
- return 1
- return 0
-
-// PRESET UPLINKS
-// A collection of preset uplinks.
-//
-// Includes normal radio uplink, multitool uplink,
-// implant uplink (not the implant tool) and a preset headset uplink.
-
-/obj/item/device/radio/uplink/New()
- hidden_uplink = new(src)
- icon_state = "radio"
-
-/obj/item/device/radio/uplink/attack_self(mob/user as mob)
- if(hidden_uplink)
- hidden_uplink.trigger(user)
-
-/obj/item/device/multitool/uplink/New()
- hidden_uplink = new(src)
-
-/obj/item/device/multitool/uplink/attack_self(mob/user as mob)
- if(hidden_uplink)
- hidden_uplink.trigger(user)
-
-/obj/item/device/radio/headset/uplink
- traitor_frequency = 1445
-
-/obj/item/device/radio/headset/uplink/New()
- ..()
- hidden_uplink = new(src)
- hidden_uplink.uses = 10
-
-
-
-=======
//This could either be split into the proper DM files or placed somewhere else all together, but it'll do for now -Nodrak
/*
@@ -747,7 +370,3 @@ A list of items and costs is stored under the datum of every game mode, alongsid
..()
hidden_uplink = new(src)
hidden_uplink.uses = 10
-
-
-
->>>>>>> remotes/git-svn
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index c6c3fd760e5..6fd9a86e498 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -44,7 +44,21 @@
for (var/client/C)
if(C.listen_ooc)
- if (src.client.holder && (!src.client.stealth || (C.holder && C.holder.level != 0))) if(!src.client.holder.fakekey || C.holder) if (src.client.holder.rank == "Admin Observer") C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]" else if (src.client.holder.level >= 5) C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]" else if (src.client.holder.rank == "Retired Admin") C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else if (src.client.holder.rank == "Moderator") C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]" else
- C << "OOC: [src.client.holder.fakekey ? src.client.holder.fakekey : src.key]: [msg]"
+ if (src.client.holder)
+ if(!src.client.holder.fakekey || C.holder)
+
+ if (src.client.holder.rank == "Admin Observer")
+ C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]"
+ else if (src.client.holder.level >= 5)
+ C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]"
+
+ else if (src.client.holder.rank == "Retired Admin")
+ C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]"
+ else if (src.client.holder.rank == "Moderator")
+ C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]"
+ else
+ C << "OOC: [src.key][src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]"
+ else
+ C << "OOC: [src.client.holder.fakekey ? "/([src.client.holder.fakekey])" : ""]: [msg]"
else
C << "OOC: [src.key]: [msg]"
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index e4cd1acd471..c3b9e40c66d 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -26,21 +26,11 @@ proc/get_all_admin_clients()
var/list/peeps = list()
for (var/client/C in client_list)
-<<<<<<< HEAD
- var/entry = ""
- if (C.stealth && !usr.client.holder)
- entry += "\t[C.fakekey]"
- else
- entry += "\t[C.key][C.stealth ? " (as [C.fakekey])" : ""]"
-
- if(usr.client.holder && (usr.client.holder.level != 0))
-=======
var/entry = "\t"
if(usr.client.holder)
entry += "[C.key]"
if(C.holder && C.holder.fakekey)
entry += " (as [C.holder.fakekey])"
->>>>>>> remotes/git-svn
var/mob/M = C.mob
entry += " - Playing as [M.real_name]"
switch(M.stat)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index e750b3e5f11..c9080f8872c 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -9,23 +9,12 @@ var/global/floorIsLava = 0
log_adminwarn(rendered)
for (var/client/C in admin_list)
if (C)
- if(C.holder.level)
- if(C.holder.level > -3 && C.holder.level != 0)
- var/msg = rendered
- if (admin_ref)
- msg = dd_replacetext(msg, "%admin_ref%", "\ref[C]")
- if (admin_holder_ref && C.holder)
- msg = dd_replacetext(msg, "%holder_ref%", "\ref[C.holder]")
- C << msg
-
-/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
- var/rendered = "ADMIN LOG: [text]"
- log_adminwarn(rendered)
- for (var/client/C in admin_list)
- if (C)
- if(!C.STFU_atklog)
- var/msg = rendered
- C << msg
+ var/msg = rendered
+ if (admin_ref)
+ msg = dd_replacetext(msg, "%admin_ref%", "\ref[C]")
+ if (admin_holder_ref && C.holder)
+ msg = dd_replacetext(msg, "%holder_ref%", "\ref[C.holder]")
+ C << msg
///////////////////////////////////////////////////////////////////////////////////////////////Panels
@@ -160,9 +149,6 @@ var/global/floorIsLava = 0
body += "Thunderdome 2 | "
body += "Thunderdome Admin | "
body += "Thunderdome Observer | "
- body += "Grant Tajaran (Temp) | "
- body += "Grant Soghun (Temp) | "
- body += "Grant Skrell (Temp) | "
body += "
"
body += "