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"