diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 731a4b2c33f..f3fd55b6677 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -1217,6 +1217,10 @@
reagents.add_reagent("pacid", round(potency, 1))
force = round((5+potency/2.5), 1)
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is eating some of the [src]! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS|TOXLOSS)
+
// *************************************
// Pestkiller defines for hydroponics
// *************************************
@@ -1284,6 +1288,10 @@
var/toxicity = 4
var/WeedKillStr = 2
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is huffing the [src]! It looks like \he's trying to commit suicide."
+ return (TOXLOSS)
+
/obj/item/weapon/pestspray // -- Skie
desc = "It's some pest eliminator spray! Do not inhale!"
icon = 'icons/obj/hydroponics.dmi'
@@ -1299,6 +1307,10 @@
var/toxicity = 4
var/PestKillStr = 2
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is huffing the [src]! It looks like \he's trying to commit suicide."
+ return (TOXLOSS)
+
/obj/item/weapon/minihoe // -- Numbers
name = "mini hoe"
desc = "It's used for removing weeds or scratching your back."
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 86e0bd32652..55d530bd9ee 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -223,6 +223,10 @@
desc = "A trap used to catch bears and other legged creatures."
var/armed = 0
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is putting the [src] on \his head! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS)
+
/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob)
..()
if(ishuman(user) && !user.stat && !user.restrained())
@@ -304,6 +308,11 @@
g_amt = 3750
attack_verb = list("stabbed", "slashed", "sliced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << pick("/red [user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
+
/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
@@ -428,6 +437,9 @@
m_amt = 40
attack_verb = list("whipped", "lashed", "disciplined", "tickled")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is strangling \himself with the [src]! It looks like \he's trying to commit suicide."
+ return (OXYLOSS)
/obj/item/weapon/module
icon = 'icons/obj/module.dmi'
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8c2adf0fcdc..cccaee943e3 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -61,6 +61,16 @@
/obj/item/blob_act()
return
+//user: The mob that is suiciding
+//damagetype: The type of damage the item will inflict on the user
+//bruteloss = 1
+//fireloss = 2
+//toxloss = 4
+//oxyloss = 8
+//This proc will return an array. The first element of the list should always be the suicide message that players will see, next is the damagetype
+/obj/item/proc/suicide_act(mob/user)
+ return
+
/obj/item/verb/move_to_top()
set name = "Move To Top"
set category = "Object"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 7ed87a53c50..60d6b1bf221 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -193,7 +193,7 @@
* Toy crossbow
*/
- /obj/item/toy/crossbow
+/obj/item/toy/crossbow
name = "foam dart crossbow"
desc = "A weapon favored by many overactive children. Ages 8 and up."
icon = 'icons/obj/gun.dmi'
@@ -368,6 +368,10 @@
var/instant = 0
var/colourName = "red" //for updateIcon purposes
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is jaming the [src] up \his nose and into \his brain. It looks like \he's trying to commit suicide."
+ return (BRUTELOSS|OXYLOSS)
+
/*
* Snap pops
*/
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 7f8af111616..1233fa75174 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -81,6 +81,12 @@
force = 10.0
throwforce = 10.0
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his stomach open with the [src]! It looks like \he's trying to commit seppuku.")
+ return (BRUTELOSS)
+
/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
user << "\red You accidentally cut yourself with the [src]."
@@ -107,6 +113,12 @@
origin_tech = "materials=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his stomach open with the [src]! It looks like \he's trying to commit seppuku.")
+ return (BRUTELOSS)
+
/obj/item/weapon/kitchenknife/ritual
name = "ritual knife"
desc = "The unearthly energies that once powered this blade are now dormant."
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 3b277e1abce..a5f74e0344f 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -1,6 +1,11 @@
/obj/item/weapon/melee/energy
var/active = 0
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his stomach open with the [src]! It looks like \he's trying to commit seppuku.", \
+ "\red [user] is falling on the [src]! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS|FIRELOSS)
+
/obj/item/weapon/melee/energy/axe
name = "energy axe"
desc = "An energised battle axe."
@@ -14,6 +19,10 @@
origin_tech = "combat=3"
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] swings the [src] towards /his head! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS|FIRELOSS)
+
/obj/item/weapon/melee/energy/sword
color
name = "energy sword"
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index 2d09e6036b1..30ed99b4b77 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -9,4 +9,8 @@
throwforce = 7
w_class = 3
origin_tech = "combat=4"
- attack_verb = list("flogged", "whipped", "lashed", "disciplined")
\ No newline at end of file
+ attack_verb = list("flogged", "whipped", "lashed", "disciplined")
+
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is strangling \himself with the [src]! It looks like \he's trying to commit suicide."
+ return (OXYLOSS)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 3336e6c208c..7d4c50a01fe 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -21,6 +21,10 @@
var/construction_cost = list("metal"=750,"glass"=75)
var/construction_time=100
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is licking the electrodes of the [src]! It looks like \he's trying to commit suicide."
+ return (FIRELOSS)
+
/obj/item/weapon/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 39584aea535..d9c8d96f3a4 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -12,6 +12,9 @@
var/status = 0
origin_tech = "combat=2"
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is putting the live [src] in \his mouth! It looks like \he's trying to commit suicide."
+ return (FIRELOSS)
/obj/item/weapon/melee/baton/update_icon()
if(status)
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 4a28f6a29be..d8e0f1db995 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -294,7 +294,10 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
-
+ suicide_act(mob/user)
+ viewers(user) << pick("/red [user] is pressing the [src] to \his temple and activating it! It looks like \he's trying to commit suicide.", \
+ "/red [user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
/*
* Scalpel
*/
@@ -314,6 +317,12 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his stomach open with the [src]! It looks like \he's trying to commit seppuku.")
+ return (BRUTELOSS)
+
/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M))
return ..()
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 95bec1f9e22..520bc803718 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -48,6 +48,11 @@
m_amt = 75
attack_verb = list("stabbed")
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is stabbing the [src] into \his temple! It looks like \he's trying to commit suicide.", \
+ "\red [user] is stabbing the [src] into \his heart! It looks like \he's trying to commit suicide.")
+ return(BRUTELOSS)
+
/obj/item/weapon/screwdriver/New()
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
if ("red")
diff --git a/code/game/objects/items/weapons/trashbag.dm b/code/game/objects/items/weapons/trashbag.dm
index 0699132108e..de2a64d0018 100644
--- a/code/game/objects/items/weapons/trashbag.dm
+++ b/code/game/objects/items/weapons/trashbag.dm
@@ -10,6 +10,10 @@
var/mode = 1 //0 = pick one at a time, 1 = pick all on tile
var/capacity = 25 //the amount of trash it can carry.
+ suicide_act(mob/user)
+ viewers(user) << "/red [user] has put the [src] over \his head and is starting to hyperventilate! It looks like \he's trying to commit suicide."
+ return(OXYLOSS)
+
/obj/item/weapon/trashbag/update_icon()
if(contents.len == 0)
icon_state = "trashbag0"
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index f1bcd25aaac..229b7393856 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -11,6 +11,10 @@
throw_range = 15
attack_verb = list("banned")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is hitting \himself with the [src]! It looks like \he's trying to ban \himself from life."
+ return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS)
+
/obj/item/weapon/nullrod
name = "null rod"
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
@@ -24,6 +28,10 @@
throwforce = 10
w_class = 1
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is impaling \himself with the [src]! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS|FIRELOSS)
+
/obj/item/weapon/sord
name = "\improper SORD"
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
@@ -36,6 +44,10 @@
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is impaling \himself with the [src]! It looks like \he's trying to commit suicide."
+ return(BRUTELOSS)
+
/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
@@ -55,6 +67,10 @@
IsShield()
return 1
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is falling on the [src]! It looks like \he's trying to commit suicide."
+ return(BRUTELOSS)
+
/obj/item/weapon/claymore/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
@@ -71,6 +87,10 @@
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is slitting \his stomach open with the [src]! It looks like \he's trying to commit seppuku."
+ return(BRUTELOSS)
+
/obj/item/weapon/katana/IsShield()
return 1
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 38629d9d6cb..52fd93f0a41 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -22,8 +22,53 @@
src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
return
suiciding = 1
- //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
- viewers(src) << "\red [src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide."
+ var/obj/item/held_item = get_active_hand()
+ if(held_item)
+ var/damagetype = held_item.suicide_act(src)
+ if(damagetype)
+ 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(175/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
+
+
+ viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
+ "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \
+ "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \
+ "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.")
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index c2f6a904b69..33e2b5185b6 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -191,7 +191,7 @@
msg += "[t_He] [t_is] twitching ever so slightly.\n"
if(suiciding)
- msg += "[t_He] [t_has] bitten off [t_his] own tongue and [t_has] suffered major bloodloss!\n"
+ msg += "[t_He] appears to have commited suicide... there is no hope of recovery.\n"
if(stat == DEAD || (status_flags & FAKEDEATH))
if(brain_op_stage != 4)//Only perform these checks if there is no brain
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index c6c33b4a721..931c88587fd 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -106,6 +106,10 @@
walk(src,0)
..()
+/mob/living/simple_animal/parrot/Stat()
+ ..()
+ stat("Held Item", held_item)
+
/*
* Inventory
*/
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index fd99360fc0c..f44939e5ea7 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -172,6 +172,10 @@
item_state = "coil_red"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is strangling \himself with the [src]! It looks like \he's trying to commit suicide."
+ return(OXYLOSS)
+
/obj/item/weapon/cable_coil/New(loc, length = MAXCOIL, var/param_color = null)
..()
diff --git a/code/setup.dm b/code/setup.dm
index 44ece34e803..ed10df76b6d 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -409,6 +409,7 @@ var/list/global_mutations = list() // list of hidden mutation things
//Damage things //TODO: merge these down to reduce on defines
+//Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc...
#define BRUTE "brute"
#define BURN "fire"
#define TOX "tox"
@@ -424,6 +425,12 @@ var/list/global_mutations = list() // list of hidden mutation things
#define EYE_BLUR "eye_blur"
#define DROWSY "drowsy"
+//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches
+#define BRUTELOSS 1
+#define FIRELOSS 2
+#define TOXLOSS 4
+#define OXYLOSS 8
+
//Bitflags defining which status effects could be or are inflicted on a mob
#define CANSTUN 1
#define CANWEAKEN 2