From 3ca098fe98009fb476272c8db003ffc9c02eb3a8 Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 25 Jul 2020 00:22:24 +0100
Subject: [PATCH] bugfixes
---
code/_onclick/item_attack.dm | 15 ++++++------
code/datums/components/embedded.dm | 20 ++++++---------
code/datums/components/pellet_cloud.dm | 2 +-
code/datums/elements/embed.dm | 20 ++++++---------
code/game/objects/items/latexballoon.dm | 2 +-
code/game/objects/items/shrapnel.dm | 2 +-
code/modules/admin/verbs/randomverbs.dm | 4 +--
code/modules/mob/living/living_defense.dm | 4 +--
code/modules/projectiles/projectile.dm | 23 ------------------
.../modules/projectiles/projectile/bullets.dm | 2 +-
.../chemistry/reagents/medicine_reagents.dm | 5 ++--
.../reagents/reagent_containers/hypospray.dm | 7 ++++++
sound/weapons/shot.ogg | Bin 0 -> 10751 bytes
tgstation.dme | 1 +
14 files changed, 39 insertions(+), 68 deletions(-)
create mode 100644 sound/weapons/shot.ogg
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index be576333cf..838741108d 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -214,21 +214,20 @@
var/message_verb = "attacked"
if(length(I.attack_verb))
message_verb = "[pick(I.attack_verb)]"
- if(current_force < I.force * FEEBLE_ATTACK_MSG_THRESHOLD)
- message_verb = "[pick("feebly", "limply", "saplessly")] [message_verb]"
else if(!I.force)
return
var/message_hit_area = ""
if(hit_area)
message_hit_area = " in the [hit_area]"
- var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]."
+ var/attack_message = "[src] is [message_verb][message_hit_area] with [I]!"
+ var/attack_message_local = "You're [message_verb][message_hit_area] with [I]!"
if(user in viewers(src, null))
- attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
+ attack_message = "[user] [message_verb] [src][message_hit_area] with [I]!"
+ attack_message_local = "[user] [message_verb] you[message_hit_area] with [I]!"
+ if(user == src)
+ attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]"
visible_message("[attack_message]",\
- "[attack_message]", null, COMBAT_MESSAGE_RANGE)
- if(hit_area == BODY_ZONE_HEAD)
- if(prob(2))
- playsound(src, 'sound/weapons/dink.ogg', 30, 1)
+ "[attack_message_local]", null, COMBAT_MESSAGE_RANGE)
return 1
/// How much stamina this takes to swing this is not for realism purposes hecc off.
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
index c43df20a5c..da1d05d012 100644
--- a/code/datums/components/embedded.dm
+++ b/code/datums/components/embedded.dm
@@ -53,8 +53,6 @@
var/harmful
var/mutable_appearance/overlay
- var/damage = weapon.throwforce
-
/datum/component/embedded/Initialize(obj/item/I,
datum/thrownthing/throwingdatum,
obj/item/bodypart/part,
@@ -142,39 +140,35 @@
weapon.forceMove(victim)
RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/byeItemCarbon)
+ var/damage = weapon.throwforce
if(harmful)
victim.visible_message("[weapon] embeds itself in [victim]'s [limb.name]!",ignored_mobs=victim)
to_chat(victim, "[weapon] embeds itself in your [limb.name]!")
victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
playsound(victim,'sound/weapons/bladeslice.ogg', 40)
weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody!
- var/damage += weapon.w_class * impact_pain_mult
+ damage += weapon.w_class * impact_pain_mult
SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
else
victim.visible_message("[weapon] sticks itself to [victim]'s [limb.name]!",ignored_mobs=victim)
to_chat(victim, "[weapon] sticks itself to your [limb.name]!")
if(damage > 0)
- var/armor = victim.run_armor_check(limb.body_zone, "melee", "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",I.armour_penetration)
- limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, sharpness = I.get_sharpness())
+ var/armor = victim.run_armor_check(limb.body_zone, "melee", "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",weapon.armour_penetration)
+ limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, sharpness = weapon.get_sharpness())
/// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking.
/datum/component/embedded/proc/jostleCheck()
var/mob/living/carbon/victim = parent
-
- var/pain_chance_current = jostle_chance
+ var/chance = jostle_chance
if(victim.m_intent == MOVE_INTENT_WALK || !(victim.mobility_flags & MOBILITY_STAND))
- pain_chance_current *= 0.5
+ chance *= 0.5
- if(pain_stam_pct && victim.stam_paralyzed) //if it's a less-lethal embed, give them a break if they're already stamcritted
- pain_chance_current *= 0.2
- damage *= 0.5
- if(harmful && prob(pain_chance_current))
+ if(harmful && prob(chance))
var/damage = weapon.w_class * jostle_pain_mult
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
to_chat(victim, "[weapon] embedded in your [limb.name] jostles and stings!")
-
/// Called when then item randomly falls out of a carbon. This handles the damage and descriptors, then calls safe_remove()
/datum/component/embedded/proc/fallOutCarbon()
var/mob/living/carbon/victim = parent
diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm
index 3eb6d61561..6a1028cc65 100644
--- a/code/datums/components/pellet_cloud.dm
+++ b/code/datums/components/pellet_cloud.dm
@@ -196,7 +196,7 @@
break
///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets)
-/datum/component/pellet_cloud/proc/pellet_hit(obj/projectile/P, atom/movable/firer, atom/target, Angle, hit_zone)
+/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle, hit_zone)
pellets -= P
terminated++
hits++
diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm
index ac2ec1738e..876414330f 100644
--- a/code/datums/elements/embed.dm
+++ b/code/datums/elements/embed.dm
@@ -2,7 +2,7 @@
The presence of this element allows an item (or a projectile carrying an item) to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) with either
at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. Items meant to be used as shrapnel for projectiles should have ignore_throwspeed_threshold set to true.
- Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them.
+ Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/item/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them.
Items simply make their COMSIG_MOVABLE_IMPACT or COMSIG_MOVABLE_IMPACT_ZONE check (against a closed turf or a carbon, respectively), while projectiles check on COMSIG_PROJECTILE_SELF_ON_HIT.
Upon a projectile hitting a valid target, it spawns whatever type of payload it has defined, then has that try to embed itself in the target on its own.
@@ -169,7 +169,7 @@
* it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to.
*/
/datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone)
- if(!iscarbon(hit) && !isclosedturf(hit))
+ if(!iscarbon(hit))
Detach(P)
return // we don't care
@@ -178,16 +178,10 @@
payload.name = P.name
payload.embedding = P.embedding
payload.updateEmbedding()
- var/did_embed
- if(iscarbon(hit))
- var/mob/living/carbon/C = hit
- var/obj/item/bodypart/limb
- limb = C.get_bodypart(hit_zone)
- if(!limb)
- limb = C.get_bodypart()
- did_embed = payload.tryEmbed(limb)
- else
- did_embed = payload.tryEmbed(hit)
+ var/mob/living/carbon/C = hit
+ var/obj/item/bodypart/limb = C.get_bodypart(hit_zone)
+ if(!limb)
+ limb = C.get_bodypart()
payload.tryEmbed(limb)
Detach(P)
@@ -213,5 +207,5 @@
limb = target
hit_zone = limb.body_zone
C = limb.owner
- checkEmbed(I, C, hit_zone, forced=TRUE)
+ checkEmbedMob(I, C, hit_zone, forced=TRUE)
return TRUE
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index ef5b7b6cba..b2f8b4bee2 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -54,5 +54,5 @@
var/obj/item/tank/T = W
blow(T, user)
return
- if (W.get_sharpness() || W.get_temperature() || is_pointed(W))
+ if (W.get_sharpness() || W.get_temperature())
burst()
diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm
index 906c474aa8..5904cb6c0b 100644
--- a/code/game/objects/items/shrapnel.dm
+++ b/code/game/objects/items/shrapnel.dm
@@ -48,7 +48,7 @@
ricochets_max = 6
ricochet_chance = 130
ricochet_incidence_leeway = 0
- ricochet_delay_chance = 0.9
+ ricochet_decay_chance = 0.9
/obj/item/projectile/bullet/pellet/stingball
name = "stingball pellet"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 69f02c58c5..ed8f2e8f93 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1458,8 +1458,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/proc/firing_squad(mob/living/carbon/target, turf/source_turf, body_zone, wound_bonus, damage)
if(!target.get_bodypart(body_zone))
return
- playsound(target, 'sound/weapons/gun/revolver/shot.ogg', 100)
- var/obj/projectile/bullet/smite/divine_wrath = new(source_turf)
+ playsound(target, 'sound/weapons/shot.ogg', 100)
+ var/obj/item/projectile/bullet/smite/divine_wrath = new(source_turf)
divine_wrath.damage = damage
divine_wrath.wound_bonus = wound_bonus
divine_wrath.original = target
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index bc88a048ea..c69383924a 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -140,8 +140,8 @@
"You're hit by [I]!")
if(!I.throwforce)
return
- var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration)
- apply_damage(I.throwforce, dtype, zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND))
+ var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
+ apply_damage(I.throwforce, dtype, impacting_zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND))
else
return 1
else
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index cb9a758e3f..dbc4a4fedc 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -162,9 +162,6 @@
/// For telling whether we want to roll for bone breaking or lacerations if we're bothering with wounds
sharpness = SHARP_NONE
- ///If we have a shrapnel_type defined, these embedding stats will be passed to the spawned shrapnel type, which will roll for embedding on the target
- var/list/embedding
-
/obj/item/projectile/Initialize()
. = ..()
permutated = list()
@@ -829,26 +826,6 @@
/obj/item/projectile/experience_pressure_difference()
return
-///Like [/obj/item/proc/updateEmbedding] but for projectiles instead, call this when you want to add embedding or update the stats on the embedding element
-/obj/projectile/proc/updateEmbedding()
- if(!shrapnel_type || !LAZYLEN(embedding))
- return
-
- AddElement(/datum/element/embed,\
- embed_chance = (!isnull(embedding["embed_chance"]) ? embedding["embed_chance"] : EMBED_CHANCE),\
- fall_chance = (!isnull(embedding["fall_chance"]) ? embedding["fall_chance"] : EMBEDDED_ITEM_FALLOUT),\
- pain_chance = (!isnull(embedding["pain_chance"]) ? embedding["pain_chance"] : EMBEDDED_PAIN_CHANCE),\
- pain_mult = (!isnull(embedding["pain_mult"]) ? embedding["pain_mult"] : EMBEDDED_PAIN_MULTIPLIER),\
- remove_pain_mult = (!isnull(embedding["remove_pain_mult"]) ? embedding["remove_pain_mult"] : EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER),\
- rip_time = (!isnull(embedding["rip_time"]) ? embedding["rip_time"] : EMBEDDED_UNSAFE_REMOVAL_TIME),\
- ignore_throwspeed_threshold = (!isnull(embedding["ignore_throwspeed_threshold"]) ? embedding["ignore_throwspeed_threshold"] : FALSE),\
- impact_pain_mult = (!isnull(embedding["impact_pain_mult"]) ? embedding["impact_pain_mult"] : EMBEDDED_IMPACT_PAIN_MULTIPLIER),\
- jostle_chance = (!isnull(embedding["jostle_chance"]) ? embedding["jostle_chance"] : EMBEDDED_JOSTLE_CHANCE),\
- jostle_pain_mult = (!isnull(embedding["jostle_pain_mult"]) ? embedding["jostle_pain_mult"] : EMBEDDED_JOSTLE_PAIN_MULTIPLIER),\
- pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT),\
- projectile_payload = shrapnel_type)
- return TRUE
-
/////// MISC HELPERS ////////
/// Is this atom reflectable with ""standardized"" reflection methods like you know eshields and deswords and similar
/proc/is_energy_reflectable_projectile(atom/A)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 9fb7e83577..b408957aa7 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -14,6 +14,6 @@
wound_falloff_tile = -5
embed_falloff_tile = -5
-/obj/projectile/bullet/smite
+/obj/item/projectile/bullet/smite
name = "divine retribution"
damage = 10
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 60f86283c0..8bb34c0a82 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -472,7 +472,7 @@
else if(method in list(PATCH, TOUCH))
M.adjustBruteLoss(-1 * reac_volume)
M.adjustFireLoss(-1 * reac_volume)
- for(var/i in carbies.all_wounds)
+ for(var/i in C.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_synthflesh(reac_volume)
if(show_message)
@@ -1601,8 +1601,7 @@
reagent_state = LIQUID
color = "#bb2424"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
-
-overdose_threshold = 20
+ overdose_threshold = 20
/// How much base clotting we do per bleeding wound, multiplied by the below number for each bleeding wound
var/clot_rate = 0.25
/// If we have multiple bleeding wounds, we count the number of bleeding wounds, then multiply the clot rate by this^(n) before applying it to each cut, so more cuts = less clotting per cut (though still more total clotting)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index f37210ad1c..9bce478e04 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -140,6 +140,13 @@
amount_per_transfer_from_this = 15
list_reagents = list(/datum/reagent/medicine/epinephrine = 12, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/medicine/spaceacillin = 0.5)
+/obj/item/reagent_containers/hypospray/medipen/blood_loss
+ name = "hypovolemic-response autoinjector"
+ desc = "A medipen designed to stabilize and rapidly reverse severe bloodloss."
+ volume = 15
+ amount_per_transfer_from_this = 15
+ list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4)
+
/obj/item/reagent_containers/hypospray/medipen/stimulants
name = "illegal stimpack medipen"
desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained"
diff --git a/sound/weapons/shot.ogg b/sound/weapons/shot.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..6c574829732ec15055ee0337c409269373e0bd3c
GIT binary patch
literal 10751
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
literal 0
HcmV?d00001
diff --git a/tgstation.dme b/tgstation.dme
index 59fe18bdff..7188cce401 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -353,6 +353,7 @@
#include "code\datums\ai_laws.dm"
#include "code\datums\armor.dm"
#include "code\datums\beam.dm"
+#include "code\datums\beepsky_fashion.dm"
#include "code\datums\browser.dm"
#include "code\datums\callback.dm"
#include "code\datums\chatmessage.dm"