diff --git a/code/game/verbs/advanced_who.dm b/code/modules/client/verbs/advanced_who.dm
similarity index 100%
rename from code/game/verbs/advanced_who.dm
rename to code/modules/client/verbs/advanced_who.dm
diff --git a/code/game/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm
similarity index 100%
rename from code/game/verbs/character_directory.dm
rename to code/modules/client/verbs/character_directory.dm
diff --git a/code/game/verbs/ignore.dm b/code/modules/client/verbs/ignore.dm
similarity index 100%
rename from code/game/verbs/ignore.dm
rename to code/modules/client/verbs/ignore.dm
diff --git a/code/game/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
similarity index 97%
rename from code/game/verbs/ooc.dm
rename to code/modules/client/verbs/ooc.dm
index 1afb52566cf..7019d705282 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -1,193 +1,193 @@
-
-/client/verb/ooc(msg as text)
- set name = "OOC"
- set category = "OOC"
-
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, "Speech is currently admin-disabled.")
- return
-
- if(!mob) return
- if(IsGuestKey(key))
- to_chat(src, "Guests may not use OOC.")
- return
-
- msg = sanitize(msg)
- if(!msg) return
-
- if(!is_preference_enabled(/datum/client_preference/show_ooc))
- to_chat(src, "You have OOC muted.")
- return
-
- if(!holder)
- if(!config.ooc_allowed)
- to_chat(src, "OOC is globally muted.")
- return
- if(!config.dooc_allowed && (mob.stat == DEAD))
- to_chat(usr, "OOC for dead mobs has been turned off.")
- return
- if(prefs.muted & MUTE_OOC)
- to_chat(src, "You cannot use OOC (muted).")
- return
- if(findtext(msg, "byond://") && !config.allow_byond_links)
- to_chat(src, "Advertising other servers is not allowed.")
- log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
- message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
- return
- if(findtext(msg, "discord.gg") && !config.allow_discord_links)
- to_chat(src, "Advertising discords is not allowed.")
- log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
- message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
- return
- if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
- to_chat(src, "Posting external links is not allowed.")
- log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
- message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
- return
-
- log_ooc(msg, src)
-
- if(msg)
- handle_spam_prevention(MUTE_OOC)
-
- var/ooc_style = "everyone"
- if(holder && !holder.fakekey)
- ooc_style = "elevated"
- //VOREStation Block Edit Start
- if(holder.rights & R_EVENT) //Retired Admins
- ooc_style = "event_manager"
- if(holder.rights & R_ADMIN && !(holder.rights & R_BAN)) //Game Masters
- ooc_style = "moderator"
- if(holder.rights & R_SERVER && !(holder.rights & R_BAN)) //Developers
- ooc_style = "developer"
- if(holder.rights & R_ADMIN && holder.rights & R_BAN) //Admins
- ooc_style = "admin"
- //VOREStation Block Edit End
-
- for(var/client/target in GLOB.clients)
- if(target.is_preference_enabled(/datum/client_preference/show_ooc))
- if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
- continue
- var/display_name = src.key
- if(holder)
- if(holder.fakekey)
- if(target.holder)
- display_name = "[holder.fakekey]/([src.key])"
- else
- display_name = holder.fakekey
- if(holder && !holder.fakekey && (holder.rights & R_ADMIN|R_FUN|R_EVENT) && config.allow_admin_ooccolor && (src.prefs.ooccolor != initial(src.prefs.ooccolor))) // keeping this for the badmins
- to_chat(target, "" + create_text_tag("ooc", "OOC:", target) + " [display_name]: [msg]")
- else
- to_chat(target, "" + create_text_tag("ooc", "OOC:", target) + " [display_name]: [msg]")
-
-/client/verb/looc(msg as text)
- set name = "LOOC"
- set desc = "Local OOC, seen only by those in view."
- set category = "OOC"
-
- if(say_disabled) //This is here to try to identify lag problems
- to_chat(usr, "Speech is currently admin-disabled.")
- return
-
- if(!mob)
- return
-
- if(IsGuestKey(key))
- to_chat(src, "Guests may not use OOC.")
- return
-
- msg = sanitize(msg)
- if(!msg)
- return
-
- if(!is_preference_enabled(/datum/client_preference/show_looc))
- to_chat(src, "You have LOOC muted.")
- return
-
- if(!holder)
- if(!config.looc_allowed)
- to_chat(src, "LOOC is globally muted.")
- return
- if(!config.dooc_allowed && (mob.stat == DEAD))
- to_chat(usr, "OOC for dead mobs has been turned off.")
- return
- if(prefs.muted & MUTE_OOC)
- to_chat(src, "You cannot use OOC (muted).")
- return
- if(findtext(msg, "byond://") && !config.allow_byond_links)
- to_chat(src, "Advertising other servers is not allowed.")
- log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
- message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
- return
- if(findtext(msg, "discord.gg") && !config.allow_discord_links)
- to_chat(src, "Advertising discords is not allowed.")
- log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
- message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
- return
- if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
- to_chat(src, "Posting external links is not allowed.")
- log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
- message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
- return
-
- log_looc(msg,src)
-
- if(msg)
- handle_spam_prevention(MUTE_OOC)
-
- var/mob/source = mob.get_looc_source()
- var/turf/T = get_turf(source)
- if(!T) return
- var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
- var/list/m_viewers = in_range["mobs"]
-
- var/list/receivers = list() //Clients, not mobs.
- var/list/r_receivers = list()
-
- var/display_name = key
- if(holder && holder.fakekey)
- display_name = holder.fakekey
- if(mob.stat != DEAD)
- display_name = mob.name
- //VOREStation Add - Resleeving shenanigan prevention
- if(ishuman(mob))
- var/mob/living/carbon/human/H = mob
- if(H.original_player && H.original_player != H.ckey) //In a body not their own
- display_name = "[H.mind.name] (as [H.name])"
- //VOREStation Add End
-
- // Everyone in normal viewing range of the LOOC
- for(var/mob/viewer in m_viewers)
- if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc))
- receivers |= viewer.client
- else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
- var/mob/observer/eye/E = viewer
- if(E.owner && E.owner.client)
- receivers |= E.owner.client
-
- // Admins with RLOOC displayed who weren't already in
- for(var/client/admin in GLOB.admins)
- if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
- r_receivers |= admin
-
- // Send a message
- for(var/client/target in receivers)
- var/admin_stuff = ""
-
- if(target in GLOB.admins)
- admin_stuff += "/([key])"
-
- to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " [display_name][admin_stuff]: [msg]")
-
- for(var/client/target in r_receivers)
- var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
-
- to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " (R)[display_name][admin_stuff]: [msg]")
-
-/mob/proc/get_looc_source()
- return src
-
-/mob/living/silicon/ai/get_looc_source()
- if(eyeobj)
- return eyeobj
- return src
+
+/client/verb/ooc(msg as text)
+ set name = "OOC"
+ set category = "OOC"
+
+ if(say_disabled) //This is here to try to identify lag problems
+ to_chat(usr, "Speech is currently admin-disabled.")
+ return
+
+ if(!mob) return
+ if(IsGuestKey(key))
+ to_chat(src, "Guests may not use OOC.")
+ return
+
+ msg = sanitize(msg)
+ if(!msg) return
+
+ if(!is_preference_enabled(/datum/client_preference/show_ooc))
+ to_chat(src, "You have OOC muted.")
+ return
+
+ if(!holder)
+ if(!config.ooc_allowed)
+ to_chat(src, "OOC is globally muted.")
+ return
+ if(!config.dooc_allowed && (mob.stat == DEAD))
+ to_chat(usr, "OOC for dead mobs has been turned off.")
+ return
+ if(prefs.muted & MUTE_OOC)
+ to_chat(src, "You cannot use OOC (muted).")
+ return
+ if(findtext(msg, "byond://") && !config.allow_byond_links)
+ to_chat(src, "Advertising other servers is not allowed.")
+ log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
+ message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
+ return
+ if(findtext(msg, "discord.gg") && !config.allow_discord_links)
+ to_chat(src, "Advertising discords is not allowed.")
+ log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
+ message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
+ return
+ if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
+ to_chat(src, "Posting external links is not allowed.")
+ log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
+ message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
+ return
+
+ log_ooc(msg, src)
+
+ if(msg)
+ handle_spam_prevention(MUTE_OOC)
+
+ var/ooc_style = "everyone"
+ if(holder && !holder.fakekey)
+ ooc_style = "elevated"
+ //VOREStation Block Edit Start
+ if(holder.rights & R_EVENT) //Retired Admins
+ ooc_style = "event_manager"
+ if(holder.rights & R_ADMIN && !(holder.rights & R_BAN)) //Game Masters
+ ooc_style = "moderator"
+ if(holder.rights & R_SERVER && !(holder.rights & R_BAN)) //Developers
+ ooc_style = "developer"
+ if(holder.rights & R_ADMIN && holder.rights & R_BAN) //Admins
+ ooc_style = "admin"
+ //VOREStation Block Edit End
+
+ for(var/client/target in GLOB.clients)
+ if(target.is_preference_enabled(/datum/client_preference/show_ooc))
+ if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
+ continue
+ var/display_name = src.key
+ if(holder)
+ if(holder.fakekey)
+ if(target.holder)
+ display_name = "[holder.fakekey]/([src.key])"
+ else
+ display_name = holder.fakekey
+ if(holder && !holder.fakekey && (holder.rights & R_ADMIN|R_FUN|R_EVENT) && config.allow_admin_ooccolor && (src.prefs.ooccolor != initial(src.prefs.ooccolor))) // keeping this for the badmins
+ to_chat(target, "" + create_text_tag("ooc", "OOC:", target) + " [display_name]: [msg]")
+ else
+ to_chat(target, "" + create_text_tag("ooc", "OOC:", target) + " [display_name]: [msg]")
+
+/client/verb/looc(msg as text)
+ set name = "LOOC"
+ set desc = "Local OOC, seen only by those in view."
+ set category = "OOC"
+
+ if(say_disabled) //This is here to try to identify lag problems
+ to_chat(usr, "Speech is currently admin-disabled.")
+ return
+
+ if(!mob)
+ return
+
+ if(IsGuestKey(key))
+ to_chat(src, "Guests may not use OOC.")
+ return
+
+ msg = sanitize(msg)
+ if(!msg)
+ return
+
+ if(!is_preference_enabled(/datum/client_preference/show_looc))
+ to_chat(src, "You have LOOC muted.")
+ return
+
+ if(!holder)
+ if(!config.looc_allowed)
+ to_chat(src, "LOOC is globally muted.")
+ return
+ if(!config.dooc_allowed && (mob.stat == DEAD))
+ to_chat(usr, "OOC for dead mobs has been turned off.")
+ return
+ if(prefs.muted & MUTE_OOC)
+ to_chat(src, "You cannot use OOC (muted).")
+ return
+ if(findtext(msg, "byond://") && !config.allow_byond_links)
+ to_chat(src, "Advertising other servers is not allowed.")
+ log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
+ message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
+ return
+ if(findtext(msg, "discord.gg") && !config.allow_discord_links)
+ to_chat(src, "Advertising discords is not allowed.")
+ log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
+ message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
+ return
+ if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
+ to_chat(src, "Posting external links is not allowed.")
+ log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
+ message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
+ return
+
+ log_looc(msg,src)
+
+ if(msg)
+ handle_spam_prevention(MUTE_OOC)
+
+ var/mob/source = mob.get_looc_source()
+ var/turf/T = get_turf(source)
+ if(!T) return
+ var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
+ var/list/m_viewers = in_range["mobs"]
+
+ var/list/receivers = list() //Clients, not mobs.
+ var/list/r_receivers = list()
+
+ var/display_name = key
+ if(holder && holder.fakekey)
+ display_name = holder.fakekey
+ if(mob.stat != DEAD)
+ display_name = mob.name
+ //VOREStation Add - Resleeving shenanigan prevention
+ if(ishuman(mob))
+ var/mob/living/carbon/human/H = mob
+ if(H.original_player && H.original_player != H.ckey) //In a body not their own
+ display_name = "[H.mind.name] (as [H.name])"
+ //VOREStation Add End
+
+ // Everyone in normal viewing range of the LOOC
+ for(var/mob/viewer in m_viewers)
+ if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc))
+ receivers |= viewer.client
+ else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
+ var/mob/observer/eye/E = viewer
+ if(E.owner && E.owner.client)
+ receivers |= E.owner.client
+
+ // Admins with RLOOC displayed who weren't already in
+ for(var/client/admin in GLOB.admins)
+ if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
+ r_receivers |= admin
+
+ // Send a message
+ for(var/client/target in receivers)
+ var/admin_stuff = ""
+
+ if(target in GLOB.admins)
+ admin_stuff += "/([key])"
+
+ to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " [display_name][admin_stuff]: [msg]")
+
+ for(var/client/target in r_receivers)
+ var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
+
+ to_chat(target, "" + create_text_tag("looc", "LOOC:", target) + " (R)[display_name][admin_stuff]: [msg]")
+
+/mob/proc/get_looc_source()
+ return src
+
+/mob/living/silicon/ai/get_looc_source()
+ if(eyeobj)
+ return eyeobj
+ return src
diff --git a/code/game/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
similarity index 97%
rename from code/game/verbs/suicide.dm
rename to code/modules/client/verbs/suicide.dm
index ce0b82df9bb..314816c59fe 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -1,168 +1,168 @@
-/mob/var/suiciding = 0
-
-/mob/living/carbon/human/verb/suicide()
- set hidden = 1
-
- if (stat == DEAD)
- to_chat(src, "You're already dead!")
- return
-
- if (!ticker)
- to_chat(src, "You can't commit suicide before the game starts!")
- return
-
- if(!player_is_antag(mind))
- message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
- to_chat(src, "No. Adminhelp if there is a legitimate reason.")
- return
-
- if (suiciding)
- to_chat(src, "You're already committing suicide! Be patient!")
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
- to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
- return
- suiciding = 15
- does_not_breathe = 0 //Prevents ling-suicide zombies, or something
- var/obj/item/held_item = get_active_hand()
- if(held_item)
- var/damagetype = held_item.suicide_act(src)
- if(damagetype)
- log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
- var/damage_mod = 1
- switch(damagetype) //Sorry about the magic numbers.
- //brute = 1, burn = 2, tox = 4, oxy = 8
- if(15) //4 damage types
- damage_mod = 4
-
- if(6, 11, 13, 14) //3 damage types
- damage_mod = 3
-
- if(3, 5, 7, 9, 10, 12) //2 damage types
- damage_mod = 2
-
- if(1, 2, 4, 8) //1 damage type
- damage_mod = 1
-
- else //This should not happen, but if it does, everything should still work
- damage_mod = 1
-
- //Do 175 damage divided by the number of damage types applied.
- if(damagetype & BRUTELOSS)
- adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
- adjustOxyLoss(145/damage_mod)
-
- if(damagetype & FIRELOSS)
- adjustFireLoss(175/damage_mod)
-
- if(damagetype & TOXLOSS)
- adjustToxLoss(175/damage_mod)
-
- if(damagetype & OXYLOSS)
- adjustOxyLoss(175/damage_mod)
-
- //If something went wrong, just do normal oxyloss
- if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
-
- updatehealth()
- return
-
- log_and_message_admins("[key_name(src)] commited suicide")
-
- var/datum/gender/T = gender_datums[get_visible_gender()]
-
- var/suicidemsg
- suicidemsg = pick("[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.", \
- "[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.", \
- "[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.", \
- "[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.")
- if(isSynthetic())
- suicidemsg = "[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide."
- visible_message(suicidemsg)
-
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
-
-/mob/living/carbon/brain/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- to_chat(src, "You're already dead!")
- return
-
- if (!ticker)
- to_chat(src, "You can't commit suicide before the game starts!")
- return
-
- if (suiciding)
- to_chat(src, "You're already committing suicide! Be patient!")
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- to_chat(viewers(loc),"[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.")
- spawn(50)
- death(0)
- suiciding = 0
-
-/mob/living/silicon/ai/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- to_chat(src, "You're already dead!")
- return
-
- if (suiciding)
- to_chat(src, "You're already committing suicide! Be patient!")
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- to_chat(viewers(src),"[src] is powering down. It looks like they're trying to commit suicide.")
- //put em at -175
- adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
-
-/mob/living/silicon/robot/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- to_chat(src, "You're already dead!")
- return
-
- if (suiciding)
- to_chat(src, "You're already committing suicide! Be patient!")
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- to_chat(viewers(src),"[src] is powering down. It looks like they're trying to commit suicide.")
- //put em at -175
- adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
-
-/mob/living/silicon/pai/verb/suicide()
- set category = "pAI Commands"
- set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
- set name = "pAI Suicide"
- var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
- if(answer == "Yes")
- var/obj/item/device/paicard/card = loc
- card.removePersonality()
- var/turf/T = get_turf_or_move(card.loc)
- for (var/mob/M in viewers(T))
- M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2)
- death(0)
- else
- to_chat(src, "Aborting suicide attempt.")
+/mob/var/suiciding = 0
+
+/mob/living/carbon/human/verb/suicide()
+ set hidden = 1
+
+ if (stat == DEAD)
+ to_chat(src, "You're already dead!")
+ return
+
+ if (!ticker)
+ to_chat(src, "You can't commit suicide before the game starts!")
+ return
+
+ if(!player_is_antag(mind))
+ message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
+ to_chat(src, "No. Adminhelp if there is a legitimate reason.")
+ return
+
+ if (suiciding)
+ to_chat(src, "You're already committing suicide! Be patient!")
+ return
+
+ var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
+
+ if(confirm == "Yes")
+ if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
+ to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
+ return
+ suiciding = 15
+ does_not_breathe = 0 //Prevents ling-suicide zombies, or something
+ var/obj/item/held_item = get_active_hand()
+ if(held_item)
+ var/damagetype = held_item.suicide_act(src)
+ if(damagetype)
+ log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
+ var/damage_mod = 1
+ switch(damagetype) //Sorry about the magic numbers.
+ //brute = 1, burn = 2, tox = 4, oxy = 8
+ if(15) //4 damage types
+ damage_mod = 4
+
+ if(6, 11, 13, 14) //3 damage types
+ damage_mod = 3
+
+ if(3, 5, 7, 9, 10, 12) //2 damage types
+ damage_mod = 2
+
+ if(1, 2, 4, 8) //1 damage type
+ damage_mod = 1
+
+ else //This should not happen, but if it does, everything should still work
+ damage_mod = 1
+
+ //Do 175 damage divided by the number of damage types applied.
+ if(damagetype & BRUTELOSS)
+ adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
+ adjustOxyLoss(145/damage_mod)
+
+ if(damagetype & FIRELOSS)
+ adjustFireLoss(175/damage_mod)
+
+ if(damagetype & TOXLOSS)
+ adjustToxLoss(175/damage_mod)
+
+ if(damagetype & OXYLOSS)
+ adjustOxyLoss(175/damage_mod)
+
+ //If something went wrong, just do normal oxyloss
+ if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
+ adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
+
+ updatehealth()
+ return
+
+ log_and_message_admins("[key_name(src)] commited suicide")
+
+ var/datum/gender/T = gender_datums[get_visible_gender()]
+
+ var/suicidemsg
+ suicidemsg = pick("[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.", \
+ "[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.", \
+ "[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.", \
+ "[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.")
+ if(isSynthetic())
+ suicidemsg = "[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide."
+ visible_message(suicidemsg)
+
+ adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
+ updatehealth()
+
+/mob/living/carbon/brain/verb/suicide()
+ set hidden = 1
+
+ if (stat == 2)
+ to_chat(src, "You're already dead!")
+ return
+
+ if (!ticker)
+ to_chat(src, "You can't commit suicide before the game starts!")
+ return
+
+ if (suiciding)
+ to_chat(src, "You're already committing suicide! Be patient!")
+ return
+
+ var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
+
+ if(confirm == "Yes")
+ suiciding = 1
+ to_chat(viewers(loc),"[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.")
+ spawn(50)
+ death(0)
+ suiciding = 0
+
+/mob/living/silicon/ai/verb/suicide()
+ set hidden = 1
+
+ if (stat == 2)
+ to_chat(src, "You're already dead!")
+ return
+
+ if (suiciding)
+ to_chat(src, "You're already committing suicide! Be patient!")
+ return
+
+ var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
+
+ if(confirm == "Yes")
+ suiciding = 1
+ to_chat(viewers(src),"[src] is powering down. It looks like they're trying to commit suicide.")
+ //put em at -175
+ adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
+ updatehealth()
+
+/mob/living/silicon/robot/verb/suicide()
+ set hidden = 1
+
+ if (stat == 2)
+ to_chat(src, "You're already dead!")
+ return
+
+ if (suiciding)
+ to_chat(src, "You're already committing suicide! Be patient!")
+ return
+
+ var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
+
+ if(confirm == "Yes")
+ suiciding = 1
+ to_chat(viewers(src),"[src] is powering down. It looks like they're trying to commit suicide.")
+ //put em at -175
+ adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
+ updatehealth()
+
+/mob/living/silicon/pai/verb/suicide()
+ set category = "pAI Commands"
+ set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
+ set name = "pAI Suicide"
+ var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
+ if(answer == "Yes")
+ var/obj/item/device/paicard/card = loc
+ card.removePersonality()
+ var/turf/T = get_turf_or_move(card.loc)
+ for (var/mob/M in viewers(T))
+ M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2)
+ death(0)
+ else
+ to_chat(src, "Aborting suicide attempt.")
diff --git a/code/game/verbs/who.dm b/code/modules/client/verbs/who.dm
similarity index 96%
rename from code/game/verbs/who.dm
rename to code/modules/client/verbs/who.dm
index 385a3230200..ebcc5859eda 100644
--- a/code/game/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -1,208 +1,208 @@
-/client/verb/who()
- set name = "Who"
- set category = "OOC"
-
- var/msg = "Current Players:\n"
-
- var/list/Lines = list()
-
- if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights))
- for(var/client/C in GLOB.clients)
- var/entry = "\t[C.key]"
- if(C.holder && C.holder.fakekey)
- entry += " (as [C.holder.fakekey])"
- entry += " - Playing as [C.mob.real_name]"
- switch(C.mob.stat)
- if(UNCONSCIOUS)
- entry += " - Unconscious"
- if(DEAD)
- if(isobserver(C.mob))
- var/mob/observer/dead/O = C.mob
- if(O.started_as_observer)
- entry += " - Observing"
- else
- entry += " - DEAD"
- else
- entry += " - DEAD"
-
- var/age
- if(isnum(C.player_age))
- age = C.player_age
- else
- age = 0
-
- if(age <= 1)
- age = "[age]"
- else if(age < 10)
- age = "[age]"
-
- entry += " - [age]"
-
- if(is_special_character(C.mob))
- entry += " - Antagonist"
-
- if(C.is_afk())
- var/seconds = C.last_activity_seconds()
- entry += " (AFK - "
- entry += "[round(seconds / 60)] minutes, "
- entry += "[seconds % 60] seconds)"
-
- entry += " (?)"
- Lines += entry
- else
- for(var/client/C in GLOB.clients)
- if(C.holder && C.holder.fakekey)
- Lines += C.holder.fakekey
- else
- Lines += C.key
-
- for(var/line in sortList(Lines))
- msg += "[line]\n"
-
- msg += "Total Players: [length(Lines)]"
- to_chat(src,msg)
-
-/client/verb/staffwho()
- set category = "Admin"
- set name = "Staffwho"
-
- var/message = get_staffwho_message(holder)
- to_chat(src, message)
-
-// VOREStation Edit - This whole proc has various vorestation edits throughout. Practically every other line.
-/proc/get_staffwho_message(datum/admins/holder)
- var/msg = ""
- var/modmsg = ""
- var/devmsg = ""
- var/eventMmsg = ""
- var/num_mods_online = 0
- var/num_admins_online = 0
- var/num_devs_online = 0
- var/num_event_managers_online = 0
-
- if(holder)
- for(var/client/C in GLOB.admins)
- if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
-
- if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins
- continue
-
- msg += "\t[C] is a [C.holder.rank]"
-
- if(C.holder.fakekey)
- msg += " (as [C.holder.fakekey])"
-
- if(isobserver(C.mob))
- msg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
- msg += " - Lobby"
- else
- msg += " - Playing"
-
- if(C.is_afk())
- var/seconds = C.last_activity_seconds()
- msg += " (AFK - "
- msg += "[round(seconds / 60)] minutes, "
- msg += "[seconds % 60] seconds)"
- msg += "\n"
-
- num_admins_online++
- else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
- modmsg += "\t[C] is a [C.holder.rank]"
-
- if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
- continue
- if(C.holder.fakekey)
- msg += " (as [C.holder.fakekey])"
-
- if(isobserver(C.mob))
- modmsg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
- modmsg += " - Lobby"
- else
- modmsg += " - Playing"
-
- if(C.is_afk())
- var/seconds = C.last_activity_seconds()
- modmsg += " (AFK - "
- modmsg += "[round(seconds / 60)] minutes, "
- modmsg += "[seconds % 60] seconds)"
- modmsg += "\n"
- num_mods_online++
-
- else if(R_SERVER & C.holder.rights)
- if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
- continue
- devmsg += "\t[C] is a [C.holder.rank]"
- if(C.holder.fakekey)
- devmsg += " (as [C.holder.fakekey])"
- if(isobserver(C.mob))
- devmsg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
- devmsg += " - Lobby"
- else
- devmsg += " - Playing"
-
- if(C.is_afk())
- var/seconds = C.last_activity_seconds()
- devmsg += "(AFK - "
- devmsg += "[round(seconds / 60)] minutes, "
- devmsg += "[seconds % 60] seconds)"
- devmsg += "\n"
- num_devs_online++
-
- else
- if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
- continue
- eventMmsg += "\t[C] is a [C.holder.rank]"
- if(C.holder.fakekey)
- eventMmsg += " (as [C.holder.fakekey])"
- if(isobserver(C.mob))
- eventMmsg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
- eventMmsg += " - Lobby"
- else
- eventMmsg += " - Playing"
-
- if(C.is_afk())
- var/seconds = C.last_activity_seconds()
- eventMmsg += " (AFK - "
- eventMmsg += "[round(seconds / 60)] minutes, "
- eventMmsg += "[seconds % 60] seconds)"
- eventMmsg += "\n"
- num_event_managers_online++
-
- else
- for(var/client/C in GLOB.admins)
- if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
- if(!C.holder.fakekey)
- msg += "\t[C] is a [C.holder.rank]\n"
- num_admins_online++
- else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
- if(!C.holder.fakekey)
- modmsg += "\t[C] is a [C.holder.rank]\n"
- num_mods_online++
- else if(R_SERVER & C.holder.rights)
- if(!C.holder.fakekey)
- devmsg += "\t[C] is a [C.holder.rank]\n"
- num_devs_online++
- else
- if(!C.holder.fakekey)
- eventMmsg += "\t[C] is a [C.holder.rank]\n"
- num_event_managers_online++
-
- msg = "Current Admins ([num_admins_online]):\n" + msg
-
- if(config.show_mods)
- msg += "\n Current Game Masters ([num_mods_online]):\n" + modmsg
-
- if(config.show_devs)
- msg += "\n Current Developers ([num_devs_online]):\n" + devmsg
-
- if(config.show_event_managers)
- msg += "\n Current Miscellaneous ([num_event_managers_online]):\n" + eventMmsg
-
- msg += "\nAdminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond."
-
- return msg
-
+/client/verb/who()
+ set name = "Who"
+ set category = "OOC"
+
+ var/msg = "Current Players:\n"
+
+ var/list/Lines = list()
+
+ if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights))
+ for(var/client/C in GLOB.clients)
+ var/entry = "\t[C.key]"
+ if(C.holder && C.holder.fakekey)
+ entry += " (as [C.holder.fakekey])"
+ entry += " - Playing as [C.mob.real_name]"
+ switch(C.mob.stat)
+ if(UNCONSCIOUS)
+ entry += " - Unconscious"
+ if(DEAD)
+ if(isobserver(C.mob))
+ var/mob/observer/dead/O = C.mob
+ if(O.started_as_observer)
+ entry += " - Observing"
+ else
+ entry += " - DEAD"
+ else
+ entry += " - DEAD"
+
+ var/age
+ if(isnum(C.player_age))
+ age = C.player_age
+ else
+ age = 0
+
+ if(age <= 1)
+ age = "[age]"
+ else if(age < 10)
+ age = "[age]"
+
+ entry += " - [age]"
+
+ if(is_special_character(C.mob))
+ entry += " - Antagonist"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ entry += " (AFK - "
+ entry += "[round(seconds / 60)] minutes, "
+ entry += "[seconds % 60] seconds)"
+
+ entry += " (?)"
+ Lines += entry
+ else
+ for(var/client/C in GLOB.clients)
+ if(C.holder && C.holder.fakekey)
+ Lines += C.holder.fakekey
+ else
+ Lines += C.key
+
+ for(var/line in sortList(Lines))
+ msg += "[line]\n"
+
+ msg += "Total Players: [length(Lines)]"
+ to_chat(src,msg)
+
+/client/verb/staffwho()
+ set category = "Admin"
+ set name = "Staffwho"
+
+ var/message = get_staffwho_message(holder)
+ to_chat(src, message)
+
+// VOREStation Edit - This whole proc has various vorestation edits throughout. Practically every other line.
+/proc/get_staffwho_message(datum/admins/holder)
+ var/msg = ""
+ var/modmsg = ""
+ var/devmsg = ""
+ var/eventMmsg = ""
+ var/num_mods_online = 0
+ var/num_admins_online = 0
+ var/num_devs_online = 0
+ var/num_event_managers_online = 0
+
+ if(holder)
+ for(var/client/C in GLOB.admins)
+ if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
+
+ if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins
+ continue
+
+ msg += "\t[C] is a [C.holder.rank]"
+
+ if(C.holder.fakekey)
+ msg += " (as [C.holder.fakekey])"
+
+ if(isobserver(C.mob))
+ msg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ msg += " - Lobby"
+ else
+ msg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ msg += " (AFK - "
+ msg += "[round(seconds / 60)] minutes, "
+ msg += "[seconds % 60] seconds)"
+ msg += "\n"
+
+ num_admins_online++
+ else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
+ modmsg += "\t[C] is a [C.holder.rank]"
+
+ if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
+ continue
+ if(C.holder.fakekey)
+ msg += " (as [C.holder.fakekey])"
+
+ if(isobserver(C.mob))
+ modmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ modmsg += " - Lobby"
+ else
+ modmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ modmsg += " (AFK - "
+ modmsg += "[round(seconds / 60)] minutes, "
+ modmsg += "[seconds % 60] seconds)"
+ modmsg += "\n"
+ num_mods_online++
+
+ else if(R_SERVER & C.holder.rights)
+ if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
+ continue
+ devmsg += "\t[C] is a [C.holder.rank]"
+ if(C.holder.fakekey)
+ devmsg += " (as [C.holder.fakekey])"
+ if(isobserver(C.mob))
+ devmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ devmsg += " - Lobby"
+ else
+ devmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ devmsg += "(AFK - "
+ devmsg += "[round(seconds / 60)] minutes, "
+ devmsg += "[seconds % 60] seconds)"
+ devmsg += "\n"
+ num_devs_online++
+
+ else
+ if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
+ continue
+ eventMmsg += "\t[C] is a [C.holder.rank]"
+ if(C.holder.fakekey)
+ eventMmsg += " (as [C.holder.fakekey])"
+ if(isobserver(C.mob))
+ eventMmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ eventMmsg += " - Lobby"
+ else
+ eventMmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ eventMmsg += " (AFK - "
+ eventMmsg += "[round(seconds / 60)] minutes, "
+ eventMmsg += "[seconds % 60] seconds)"
+ eventMmsg += "\n"
+ num_event_managers_online++
+
+ else
+ for(var/client/C in GLOB.admins)
+ if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
+ if(!C.holder.fakekey)
+ msg += "\t[C] is a [C.holder.rank]\n"
+ num_admins_online++
+ else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
+ if(!C.holder.fakekey)
+ modmsg += "\t[C] is a [C.holder.rank]\n"
+ num_mods_online++
+ else if(R_SERVER & C.holder.rights)
+ if(!C.holder.fakekey)
+ devmsg += "\t[C] is a [C.holder.rank]\n"
+ num_devs_online++
+ else
+ if(!C.holder.fakekey)
+ eventMmsg += "\t[C] is a [C.holder.rank]\n"
+ num_event_managers_online++
+
+ msg = "Current Admins ([num_admins_online]):\n" + msg
+
+ if(config.show_mods)
+ msg += "\n Current Game Masters ([num_mods_online]):\n" + modmsg
+
+ if(config.show_devs)
+ msg += "\n Current Developers ([num_devs_online]):\n" + devmsg
+
+ if(config.show_event_managers)
+ msg += "\n Current Miscellaneous ([num_event_managers_online]):\n" + eventMmsg
+
+ msg += "\nAdminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond."
+
+ return msg
+
diff --git a/vorestation.dme b/vorestation.dme
index 6bb46869ec9..7397f343385 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1572,12 +1572,6 @@
#include "code\game\turfs\unsimulated\shuttle.dm"
#include "code\game\turfs\unsimulated\sky_vr.dm"
#include "code\game\turfs\unsimulated\walls.dm"
-#include "code\game\verbs\advanced_who.dm"
-#include "code\game\verbs\character_directory.dm"
-#include "code\game\verbs\ignore.dm"
-#include "code\game\verbs\ooc.dm"
-#include "code\game\verbs\suicide.dm"
-#include "code\game\verbs\who.dm"
#include "code\js\byjax.dm"
#include "code\js\menus.dm"
#include "code\modules\admin\admin.dm"
@@ -1856,6 +1850,13 @@
#include "code\modules\client\preference_setup\vore\07_traits.dm"
#include "code\modules\client\preference_setup\vore\08_nif.dm"
#include "code\modules\client\preference_setup\vore\09_misc.dm"
+#include "code\modules\client\verbs\advanced_who.dm"
+#include "code\modules\client\verbs\character_directory.dm"
+#include "code\modules\client\verbs\ignore.dm"
+#include "code\modules\client\verbs\ooc.dm"
+#include "code\modules\client\verbs\ping.dm"
+#include "code\modules\client\verbs\suicide.dm"
+#include "code\modules\client\verbs\who.dm"
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\clothing_accessories.dm"