diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index cdca80eb3a..cb2150f29b 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -25,6 +25,7 @@
var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants.
var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/force = 0
+ var/can_cleave = FALSE // If true, a 'cleaving' attack will occur.
var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index a24c511fee..55e5febbd6 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -145,7 +145,6 @@
base_icon = "spearglass"
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
- description_info = "This weapon can strike from two tiles away, and over certain objects such as tables, or other people."
force = 10
w_class = ITEMSIZE_HUGE //CHOMP Edit
slot_flags = SLOT_BACK
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 8262367e28..51ef157f61 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -2,11 +2,12 @@
var/active = 0
var/active_force
var/active_throwforce
+ var/active_armourpen
var/active_w_class
var/active_embed_chance = 0 //In the off chance one of these is supposed to embed, you can just tweak this var
sharp = FALSE
edge = FALSE
- armor_penetration = 50
+ armor_penetration = 0
flags = NOCONDUCT | NOBLOODY
var/lrange = 2
var/lpower = 2
@@ -54,6 +55,7 @@
embed_chance = active_embed_chance
force = active_force
throwforce = active_throwforce
+ armor_penetration = active_armourpen
sharp = TRUE
edge = TRUE
w_class = active_w_class
@@ -70,6 +72,7 @@
embed_chance = initial(embed_chance)
force = initial(force)
throwforce = initial(throwforce)
+ armor_penetration = initial(armor_penetration)
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
@@ -192,7 +195,8 @@
/obj/item/weapon/melee/energy/examine(mob/user)
. = ..()
- . += "Alt-click to recolor it."
+ if(colorable)
+ . += "Alt-click to recolor it."
/*
* Energy Axe
@@ -206,11 +210,13 @@
lcolor = null
//active_force = 150 //holy...
active_force = 60
+ active_armourpen = 65
active_throwforce = 35
active_w_class = ITEMSIZE_HUGE
//force = 40
//throwforce = 25
force = 20
+ armor_penetration = 20
throwforce = 10
throw_speed = 1
throw_range = 5
@@ -236,6 +242,7 @@
desc = "An energised axe."
active_force = 35
active_throwforce = 20
+ active_armourpen = 30
force = 15
use_cell = TRUE
@@ -255,6 +262,7 @@
icon_state = "esword"
item_state = "esword"
active_force = 30
+ active_armourpen = 50
active_throwforce = 20
active_w_class = ITEMSIZE_HUGE //CHOMP Edit
force = 3
@@ -264,8 +272,6 @@
w_class = ITEMSIZE_SMALL
flags = NOBLOODY
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
- sharp = TRUE
- edge = TRUE
colorable = TRUE
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = 'sound/items/pickup/sword.ogg'
@@ -344,6 +350,7 @@
icon_state = "ionrapier"
item_state = "ionrapier"
active_force = 5
+ active_armourpen = 80
active_throwforce = 3
active_embed_chance = 0
sharp = TRUE
@@ -383,7 +390,7 @@
name = "zero-point lance"
desc = "Designed specifically for disrupting electronics at relatively close range, however it is still capable of dealing some damage to living beings."
active_force = 20
- armor_penetration = 15
+ active_armourpen = 15
reach = 2
/*
@@ -395,7 +402,7 @@
desc = "A small, handheld device which emits a high-energy 'blade'."
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
active_force = 25
- armor_penetration = 25
+ active_armourpen = 25
projectile_parry_chance = 40
colorable = TRUE
@@ -501,7 +508,7 @@
name = "energy spear"
desc = "Concentrated energy forming a sharp tip at the end of a long rod."
icon_state = "espear"
- armor_penetration = 75
+ armor_penetration = 0
sharp = TRUE
edge = TRUE
force = 5
@@ -511,6 +518,7 @@
reach = 2
w_class = ITEMSIZE_LARGE
active_force = 25
+ active_armourpen = 75
active_throwforce = 30
active_w_class = ITEMSIZE_HUGE
colorable = TRUE
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index cd0190c71e..cc9e2fa5c7 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -2,7 +2,6 @@
name = "weapon"
icon = 'icons/obj/weapons.dmi'
hitsound = "swing_hit"
- var/can_cleave = FALSE // If true, a 'cleaving' attack will occur.
var/cleaving = FALSE // Used to avoid infinite cleaving.
/obj/item/weapon/Bump(mob/M as mob)
diff --git a/code/modules/examine/descriptions/guns.dm b/code/modules/examine/descriptions/guns.dm
new file mode 100644
index 0000000000..ed03580d73
--- /dev/null
+++ b/code/modules/examine/descriptions/guns.dm
@@ -0,0 +1,152 @@
+/obj/item/weapon/gun/proc/describe_firepower()
+ var/obj/item/projectile/P
+ if(istype(src, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/energy_gun = src
+ P = new energy_gun.projectile_type()
+ else if(istype(src, /obj/item/weapon/gun/projectile/shotgun/pump))
+ var/obj/item/weapon/gun/projectile/shotgun/pump/projectile_gun = src
+ if(isnull(projectile_gun.chambered) || isnull(projectile_gun.chambered.BB))
+ return "no"
+ else
+ var/obj/item/ammo_casing/ammo = projectile_gun.chambered
+ P = ammo.BB
+ else if(istype(src, /obj/item/weapon/gun/projectile))
+ var/obj/item/weapon/gun/projectile/projectile_gun = src
+ var/obj/item/ammo_casing/ammo
+ if(projectile_gun.ammo_magazine)
+ ammo = projectile_gun.ammo_magazine.contents[1]
+ else
+ ammo = projectile_gun.contents[1]
+ P = ammo.BB
+ switch(P.damage)
+ if(0)
+ return "no"
+ if(1 to 5)
+ return "a very small amount of"
+ if(6 to 15)
+ return "a small amount of"
+ if(16 to 25)
+ return "a modest amount of"
+ if(26 to 40)
+ return "a respectable amount of"
+ if(41 to 60)
+ return "a serious amount of"
+ if(61 to 80)
+ return "a lot of"
+ if(81 to 2000)
+ return "a ruinous amount of"
+ qdel(P)
+
+/obj/item/weapon/gun/proc/describe_proj_penetration()
+ var/obj/item/projectile/P
+ if(istype(src, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/energy_gun = src
+ P = new energy_gun.projectile_type()
+ else if(istype(src, /obj/item/weapon/gun/projectile/shotgun/pump))
+ var/obj/item/weapon/gun/projectile/shotgun/pump/projectile_gun = src
+ if(isnull(projectile_gun.chambered) || isnull(projectile_gun.chambered.BB))
+ return "as it has no projectile loaded"
+ else
+ var/obj/item/ammo_casing/ammo = projectile_gun.chambered
+ P = ammo.BB
+ else if(istype(src, /obj/item/weapon/gun/projectile))
+ var/obj/item/weapon/gun/projectile/projectile_gun = src
+ var/obj/item/ammo_casing/ammo
+ if(projectile_gun.ammo_magazine)
+ ammo = projectile_gun.ammo_magazine.contents[1]
+ else
+ ammo = projectile_gun.contents[1]
+ P = ammo.BB
+ switch(P.armor_penetration)
+ if(0)
+ return "cannot pierce armor"
+ if(1 to 20)
+ return "barely pierces armor"
+ if(21 to 30)
+ return "slightly pierces armor"
+ if(31 to 40)
+ return "reliably pierces lighter armors"
+ if(41 to 50)
+ return "pierces standard-issue armor reliably"
+ if(51 to 60)
+ return "pierces most armor reliably"
+ if(61 to 70)
+ return "pierces a great deal of armor"
+ if(71 to 80)
+ return "pierces the vast majority of armor"
+ if(81 to 99)
+ return "almost completely pierces all armor"
+ if(100 to 1000)
+ return "completely and utterly pierces all armor"
+ qdel(P)
+
+/obj/item/weapon/gun/proc/describe_firerate()
+ switch(fire_delay)
+ if(0)
+ return "no delay"
+ if(1 to 4)
+ return "a very short delay"
+ if(5 to 8)
+ return "a short delay"
+ if(9 to 12)
+ return "a moderate delay"
+ if(13 to 15)
+ return "a noticeable delay"
+ if(16 to 20)
+ return "a distinct delay"
+ if(21 to 30)
+ return "a long delay"
+ if(31 to 50)
+ return "a very long delay"
+ if(51 to 100)
+ return "an extremely long delay"
+
+/obj/item/weapon/gun/get_description_info()
+ var/is_loaded
+ var/non_lethal
+ var/non_lethal_list = list(/obj/item/weapon/gun/energy/medigun,/obj/item/weapon/gun/energy/mouseray,/obj/item/weapon/gun/energy/temperature,/obj/item/weapon/gun/energy/sizegun,/obj/item/weapon/gun/projectile/shotgun/pump/toy,/obj/item/weapon/gun/projectile/revolver/toy,/obj/item/weapon/gun/projectile/pistol/toy,/obj/item/weapon/gun/projectile/automatic/toy)
+ var/less_lethal
+ var/less_lethal_list = list(/obj/item/weapon/gun/energy/taser,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/plasmastun,/obj/item/weapon/gun/energy/bfgtaser)
+ var/weapon_stats = description_info + "\
+
"
+ if(istype(src, /obj/item/weapon/gun/energy))
+ is_loaded = LAZYLEN(src.contents)
+ if(istype(src, /obj/item/weapon/gun/projectile/shotgun/pump))
+ var/obj/item/weapon/gun/projectile/shotgun/pump/shotgun = src
+ if(isnull(shotgun.chambered) || isnull(shotgun.chambered.BB))
+ is_loaded = null
+ else
+ is_loaded = shotgun.chambered
+ if(istype(src, /obj/item/weapon/gun/projectile))
+ var/obj/item/weapon/gun/projectile/projectile_gun = src
+ var/ammo
+ if(projectile_gun.ammo_magazine)
+ ammo = projectile_gun.ammo_magazine.contents
+ else
+ ammo = projectile_gun.contents
+ is_loaded = LAZYLEN(ammo)
+ for(var/llweapontype in less_lethal_list)
+ if(istype(src,llweapontype))
+ is_loaded = null
+ less_lethal = TRUE
+ for(var/nlweapontype in non_lethal_list)
+ if(istype(src,nlweapontype))
+ is_loaded = null
+ non_lethal = TRUE
+
+ if(is_loaded)
+ weapon_stats += "\nIf fired, it would deal [describe_firepower()] damage, [describe_proj_penetration()], and has [describe_firerate()] between shots."
+ else if(less_lethal)
+ weapon_stats += "\nIf fired, it would deal stunning damage to incapacitate targets, and has [describe_firerate()] between shots."
+ else if(non_lethal)
+ weapon_stats += "\nThis is an entirely non-lethal weapon, such as a mouseray, toy, or sizegun! Its effects cannot easily be quantified."
+ else
+ weapon_stats += "\nIt isn't loaded!"
+ if(force)
+ weapon_stats += "\nIf used in melee, it deals [describe_power()] [sharp ? "sharp" : "blunt"] damage, [describe_penetration()], and has [describe_speed()]."
+ if(can_cleave)
+ weapon_stats += "\nIt is capable of hitting multiple targets with a single swing."
+ if(reach > 1)
+ weapon_stats += "\nIt can attack targets up to [reach] tiles away, and can attack over certain objects."
+
+ return weapon_stats
\ No newline at end of file
diff --git a/code/modules/examine/descriptions/items.dm b/code/modules/examine/descriptions/items.dm
new file mode 100644
index 0000000000..148e62d699
--- /dev/null
+++ b/code/modules/examine/descriptions/items.dm
@@ -0,0 +1,91 @@
+/obj/item/proc/describe_power()
+ switch(force)
+ if(0)
+ return "a negligable amount of"
+ if(1 to 2)
+ return "a very small amount of"
+ if(3 to 5)
+ return "a small amount of"
+ if(6 to 10)
+ return "a modest amount of"
+ if(11 to 15)
+ return "a moderate amount of"
+ if(16 to 20)
+ return "a respectable amount of"
+ if(21 to 35)
+ return "a serious amount of"
+ if(36 to 50)
+ return "a very serious amount of"
+ if(51 to 100)
+ return "a very lethal amount of"
+ if(101 to 2000)
+ return "a truly ruinous amount of"
+
+/obj/item/proc/describe_throwpower()
+ switch(throwforce)
+ if(0)
+ return "a negligable amount of"
+ if(1 to 2)
+ return "a very small amount of"
+ if(3 to 5)
+ return "a small amount of"
+ if(6 to 10)
+ return "a modest amount of"
+ if(11 to 15)
+ return "a moderate amount of"
+ if(16 to 20)
+ return "a respectable amount of"
+ if(21 to 35)
+ return "a serious amount of"
+ if(36 to 50)
+ return "a very serious amount of"
+ if(51 to 100)
+ return "a very lethal amount of"
+ if(101 to 2000)
+ return "a truly ruinous amount of"
+
+/obj/item/proc/describe_penetration()
+ switch(armor_penetration)
+ if(0)
+ return "cannot pierce armor"
+ if(1 to 20)
+ return "barely pierces armor"
+ if(21 to 30)
+ return "slightly pierces armor"
+ if(31 to 40)
+ return "reliably pierces lighter armors"
+ if(41 to 50)
+ return "pierces standard-issue armor reliably"
+ if(51 to 60)
+ return "pierces most armor reliably"
+ if(61 to 70)
+ return "pierces a great deal of armor"
+ if(71 to 80)
+ return "pierces the vast majority of armor"
+ if(81 to 99)
+ return "almost completely pierces all armor"
+ if(100 to 1000)
+ return "completely and utterly pierces all armor"
+
+/obj/item/proc/describe_speed()
+ if(attackspeed > DEFAULT_ATTACK_COOLDOWN)
+ return "a slow attack speed"
+ else if(attackspeed < DEFAULT_ATTACK_COOLDOWN)
+ return "a high attack speed"
+ else
+ return "an average attack speed"
+
+/obj/item/get_description_info()
+ var/weapon_stats = description_info + "\
+
"
+
+ if(force)
+ weapon_stats += "\nIf used in melee, it deals [describe_power()] [sharp ? "sharp" : "blunt"] damage, [describe_penetration()], and has [describe_speed()]."
+ if(throwforce)
+ weapon_stats += "\nIf thrown, it would deal [describe_throwpower()] [sharp ? "sharp" : "blunt"] damage."
+ if(can_cleave)
+ weapon_stats += "\nIt is capable of hitting multiple targets with a single swing."
+ if(reach > 1)
+ weapon_stats += "\nIt can attack targets up to [reach] tiles away, and can attack over certain objects."
+
+ return weapon_stats
\ No newline at end of file
diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm
index 747fa0f75f..7016d84a9a 100644
--- a/code/modules/examine/descriptions/weapons.dm
+++ b/code/modules/examine/descriptions/weapons.dm
@@ -77,6 +77,30 @@
//*******
//*Melee*
//*******
+/*
+/obj/item/weapon/melee/baton/proc/describe_agonypower()
+ switch(agonyforce)
+ if(1 to 20)
+ return "a mild amount of"
+ if(21 to 40)
+ return "a modest amount of"
+ if(41 to 60)
+ return "a moderate amount of"
+ if(61 to 80)
+ return "a serious amount of"
+ if(81 to 100)
+ return "a significant amount of"
+
+/obj/item/weapon/melee/baton/get_description_info()
+ . = ..()
+ var/baton_stats = description_info + "\
+
"
+
+ if(agonyforce)
+ baton_stats += "\nIt also inflicts [describe_agonypower()] pain, if charged and active."
+
+ return baton_stats
+*/
/obj/item/weapon/melee/baton
description_info = "The baton needs to be turned on to apply the stunning effect. Use it in your hand to toggle it on or off. If your intent is \
diff --git a/code/modules/projectiles/guns/energy/gunsword_vr.dm b/code/modules/projectiles/guns/energy/gunsword_vr.dm
index cd28874afb..66efaabfc0 100644
--- a/code/modules/projectiles/guns/energy/gunsword_vr.dm
+++ b/code/modules/projectiles/guns/energy/gunsword_vr.dm
@@ -45,12 +45,13 @@
var/active = 0
var/active_force = 30
+ var/active_armourpen = 50
var/active_throwforce = 20
var/active_w_class = ITEMSIZE_LARGE
var/active_embed_chance = 0 //In the off chance one of these is supposed to embed, you can just tweak this var
sharp = FALSE
edge = FALSE
- armor_penetration = 50
+ armor_penetration = 0
flags = NOBLOODY
var/lrange = 2
var/lpower = 2
@@ -65,6 +66,7 @@
active = 1
embed_chance = active_embed_chance
force = active_force
+ armor_penetration = active_armourpen
throwforce = active_throwforce
sharp = TRUE
edge = TRUE
@@ -84,6 +86,7 @@
active = 0
embed_chance = initial(embed_chance)
force = initial(force)
+ armor_penetration = initial(armor_penetration)
throwforce = initial(throwforce)
sharp = initial(sharp)
edge = initial(edge)
diff --git a/vorestation.dme b/vorestation.dme
index 7b69ed1dbe..4309a17ca2 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2412,6 +2412,8 @@
#include "code\modules\examine\descriptions\containers_ch.dm"
#include "code\modules\examine\descriptions\devices.dm"
#include "code\modules\examine\descriptions\engineering.dm"
+#include "code\modules\examine\descriptions\guns.dm"
+#include "code\modules\examine\descriptions\items.dm"
#include "code\modules\examine\descriptions\machines.dm"
#include "code\modules\examine\descriptions\medical.dm"
#include "code\modules\examine\descriptions\mobs.dm"