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"